kramdown 语法

使用 kramdown 中遇到的问题--公式和代码

Posted by liumh on December 29, 2019     view:

kramdown 语法


以下所有内容均基于 jekyll 中的 kramdown 做的测试。

1 公式

按照官方文档,kramdown 中 display 公式用双美元符 $$ 表示,并且前后需留空行(文档中有三种方案,这里只以空行作为例子)。若不是前后均为空行,则为inline公式,另外若前后均有空行但想要解析为inline公式,则可以对第一个美元符号转义:

\$$...$$

若不想解析为公式,则对前两个美元符号转义:

\$\$...$$

下面我们来一个个尝试:

1.1 math block


$$y=ax+b$$

表现为:

1.2 inline math


\$$y=ax+b$$

表现为:

这个公式
$$y=ax+b$$
是行内吧!

表现为:
这个公式 是行内吧!

1.3 no math


\$\$y=ax+b$$

表现为:

$$y=ax+b$$

仍然是math block!

注意:

  1. kramdown 对于单个美元符号仍会解析为inline code

1.4 math with color

由于 markdown 不支持字体颜色,所以修改字体颜色要通过 html 直接修改,但带颜色的公式也会出问题。

如:

<font color="blue">文字变为蓝色了。</font>  
正常公式:$$y=ax+b$$  
蓝色公式:<font color="blue">$$y=ax+b$$</font>  
蓝色公式:<font color="blue">\$$y=ax+b$$</font>  
文字变为蓝色了。

正常公式:
蓝色公式:$$y=ax+b$$ 蓝色公式:\$$y=ax+b$$

所以为公式修改颜色会使 inline math 变为 math code 。

解决办法是不要使用双 $,使用单 $

蓝色公式:<font color="blue">$y=ax+b$</font>  

蓝色公式:$y=ax+b$

所以 kramdown 其实支持单 $,但某些时候单 $公式会有问题,如面对}_... _{的时候:

${a}_1-a_{2}$   

${a}1-a{2}$

甚至不在一个公式域中也可以影响到:

${a}_1$ and $a_{2}$

${a}1$ and $a{2}$

原因在于在 kramdown 中,__的解析优先级要比$高,所以会先解析__

综上,平时使用双 $,公式带颜色时使用单 $

写上面这行话又发现了 inline code 带颜色的坑。

如:

<font color="blue">综上,平时使用双 `$`,公式带颜色时使用单 `$`</font>  

变为了

综上,平时使用双 `$`,公式带颜色时使用单 `$`。

2 代码

markdown 中使用 ```实现代码块,`实现行内代码。而 kramdown 中的代码块使用 ~~~, 行内代码仍使用 `。指定代码类型方式相同,仍是在第一行的~~~后面加上类型。

如:

~~~cpp
int a = 1;
int b = a;
~~~

以上代码显示为:

int a = 1;
int b = a;
这里有`inline`代码。

以上显示为:
这里有inline代码。

注意:

  1. ```一般也能正确解析,但是不推荐,下面代码即通过```生成。
    int a = 1;
    int b = a;
    

3 代码中包含公式

挑战来了!

code block 中包含公式是没有问题的,如第一节所示。而 inline code 中包含公式会有各种问题。

3.1 单 $ 符号

如何在 inline code 中实现以下效果呢?

$y=ax+b$

首先尝试

`$y=ax+b$`

效果为:
$y=ax+b$

公式被解析了!

再尝试

`\$y=ax+b$`

效果为:
\$y=ax+b$

仍然被解析!

当然,如果前后都转义呢?

`\$y=ax+b\$`

效果为:
\$y=ax+b\$

失败了!

3.2 双 $ 符号

如何在 inline code 中实现以下效果呢?

$$y=ax+b$$

一次性展示:

`$$y=ax+b$$`   
`\$$y=ax+b$$`   
`\$\$y=ax+b$$`   

$$y=ax+b$$
\$$y=ax+b$$
\$\$y=ax+b$$

都没用!

最后看来,最接近的方式还是分开写:

`$$``y=ax+b``$$`

$$y=ax+b$$