我平常用Atom来写markdown,而Atom的markdown-preview-enhanced插件用来实时预览最后显示的情况。这是个特别棒的插件,支持KaTeXMathJax渲染,插件的中文文档在这里

markdown-preview-enhanced中文文档

Markdown Preview Enhanced 使用 KaTeX 或者 MathJax 来渲染数学表达式。
KaTeX 拥有比 MathJax 更快的性能,但是它却少了很多 MathJax 拥有的特性。你可以查看 KaTeX supported functions/symbols 来了解 KaTeX 支持那些符号和函数。

Hexo也支持KaTeXMathJax,为了使插件和博客二者同步,你最好将他们的渲染引擎改成同一个。在Hexo中,使用不同的渲染引擎,要安装或者卸载不同的插件,具体请参考主题的配置文件。

markdown-preview-enhanced的设置里,选择渲染引擎的选项是Math Rendering Option

MathJax添加扩展

在使用的过程中,我首先遇到的问题是,命令\Omicron的显示在KaTeX引擎下的渲染是正常的,而在MathJax的引擎下渲染是有问题的。我们来看一下MathJax官网的描述

While MathJax includes nearly all of the Plain TeX math macros, and many of the LaTeX macros and environments, not everything is implemented in the core TeX input processor. Some less-used commands are defined in extensions to the TeX processor. MathJax will load some extensions automatically when you first use the commands they implement (for example, the \def and \newcommand macros are implemented in the newcommand.js extension, but MathJax loads this extension itself when you use those macros). Not all extensions are set up to load automatically, however, so you may need to request some extensions explicitly yourself.

大意是说MathJax包含了很多数学公式,但是有些不常用的数学公式是需要通过扩展来显示的,而\Omicron命令正好在mediawiki-texvc扩展之中。

那么如何添加这些扩展呢?一个最简单的方式,是在这个公式之后添加\require{extension}

例如,\Omicron \require{mediawiki-texvc}即可正常显示。

这种方式是"非标准"的,但是它可以防止你必须将扩展加载到所有页面中,即使它们未被使用。

标准的方式是在MathJax的设置中添加扩展。

markdown-preview-enhanced中添加MathJax扩展

ctrl+shift+p打开toogle命令面板,搜索并点击markdown-preview-enhanced:Open Mathjax Config,这会打开一个.js文件,只需修改其中的extensions项,添加你需要的扩展即可。

1
2
3
TeX: {
extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js']
},

下面的操作添加了mediawiki-texvc扩展

1
2
3
TeX: {
extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js','mediawiki-texvc.js']
},

Hexo的Next主题中添加MathJax扩展

\themes\next\layout\_third-party\math\文件夹下,有个mathjax.swig文件,请找到如下代码

1
2
3
4
5
6
7
8
TeX: {
{% if theme.math.mathjax.mhchem %}
extensions: ['[mhchem]/mhchem.js'],
{% endif %}
equationNumbers: {
autoNumber: 'AMS'
}
}

如果想添加mediawiki-texvc扩展,我们只需在其中加入一行代码即可,将其改为:

1
2
3
4
5
6
7
8
9
TeX: {
{% if theme.math.mathjax.mhchem %}
extensions: ['[mhchem]/mhchem.js'],
{% endif %}
extensions: ["mediawiki-texvc.js"],
equationNumbers: {
autoNumber: 'AMS'
}
}

如果想添加更多扩展,请参考MathJax官网的说明。

而如果你使用的是KaTeX引擎,则不需要像MathJax一样添加扩展。这可能也是KaTeX速度更快的原因。实际上,在我使用的过程中,插件使用MathJax引擎渲染实时预览的速度会明显变慢。

使用KaTeX进行渲染时的注意事项

如果你使用KaTeX进行渲染,那么在你的文档中,$ $之间不能出现中文字符,甚至出现一个中文的标点符号hexo都会报警告。比如,下面一句话

对任意xRx \in \mathbb{R}

如果你的代码是这样

1
$对任意x \in \mathbb{R}$

那么很抱歉,会报三个warning,提示你的公式中出现了“对”、“任”、“意”"的unicode字符。因此你需要把中文字符放在外面:

1
对任意$x \in \mathbb{R}$

以下是我汇总的常用命令及显示,使用KaTeX语法。

希腊字母

名称 大写 命令 小写 命令 斜体 命令
alpha AA A α\alpha \alpha
beta BB B β\beta \beta
gamma Γ\Gamma \Gamma γ\gamma \gamma Γ\varGamma \varGamma
delta Δ\Delta \delta δ\delta \delta Δ\varDelta \varDelta
epsilon EE E ϵ\epsilon \epsilon
zeta ZZ Z ζ\zeta \zeta
eta HH H η\eta \eta
theta Θ\Theta \Theta θ\theta \theta Θ\varTheta \varTheta
iota ii I ι\iota \iota
kappa KK K κ\kappa \kappa
lambda Λ\Lambda \Lambda λ\lambda \lambda Λ\varLambda \varLambda
mu MM M μ\mu \mu
nu NN N ν\nu \nu
xi Ξ\Xi \Xi ξ\xi \xi Ξ\varXi \varXi
omicron O\Omicron \Omicron ο\omicron \omicron
pi Π\Pi \Pi π\pi \pi Π\varPi \varPi
rho P\Rho \rho ρ\rho \rho
sigma Σ\Sigma \sigma σ\sigma \sigma Σ\varSigma \varSigma
tau TT T τ\tau \tau
upsilon Υ\Upsilon \Upsilon υ\upsilon \upsilon Υ\varUpsilon \varUpsilon
phi Φ\Phi \Phi ϕ\phi \phi Φ\varPhi \varPhi
chi XX X χ\chi \chi
psi Ψ\Psi \Psi ψ\psi \psi Ψ\varPsi \varPsi
omega Ω\Omega \Omega ω\omega \omega Ω\varOmega \varOmega

上下标

上标与下标分别使用^_,默认情况下,上下标符号仅对下一个字符起作用。如果你想表示ex2e^{x^2},正确的写法不是e^x^2,你需要将x^2用大括号{}包裹起来,即e^{x^2}

如果需要将下标放在正下方,需要借助\underset,如Ω\underset{\tiny \Omega}{\iiint}

多行公式等号对齐

1
2
3
4
5
6
7
8
$$
\begin{aligned}
\sqrt{37} & = \sqrt{\frac{73^2-1}{12^2}} \\
& = \sqrt{\frac{73^2}{12^2} \cdot \frac{73^2-1}{73^2}} \\
& = \frac{73}{12} \sqrt{1 - \frac{1}{73^2}} \\
& \approx \frac{73}{12} \left( 1 - \frac{1}{2 \cdot 73^2} \right)
\end{aligned}
$$

37=7321122=7321227321732=7312117327312(112732)\begin{aligned} \sqrt{37} & = \sqrt{\frac{73^2-1}{12^2}} \\ & = \sqrt{\frac{73^2}{12^2} \cdot \frac{73^2-1}{73^2}} \\ & = \frac{73}{12} \sqrt{1 - \frac{1}{73^2}} \\ & \approx \frac{73}{12} \left( 1 - \frac{1}{2 \cdot 73^2} \right) \end{aligned}

求和与积分

有些命令,行内公式显示的效果和整行显示的效果稍有不同,例如
i=0n\sum_{i=0}^n

i=0n\sum_{i=0}^n

前一个是行内公式,后一个是整行显示。

命令 显示
\sum_{i=0}^n i=0n\sum_{i=0}^n
\prod_i^n P_i inPi\prod_i^n P_i
\int_{-\infty}^{+\infty} +\int_{-\infty}^{+\infty}
\underset{\tiny D_{xy}}{\iint} Dxy\underset{\tiny D_{xy}}{\iint}
\underset{\tiny \Omega}{\iiint} Ω\underset{\tiny \Omega}{\iiint}
\underset{\tiny L}{\oint} L\underset{\tiny L}{\oint}
\underset{\tiny \sigma}{\oiint} σ\underset{\tiny \sigma}{\oiint}

括号

命令 显示
(a) (a)(a)
[a] [a][a]
\{a+b\} {a+b}\{a+b\}
\lbrace a+b \rbrace {a+b}\lbrace a+b \rbrace
\langle x \rangle x\langle x \rangle
\lceil x \rceil x\lceil x \rceil
\lfloor x \rfloor x\lfloor x \rfloor

使用\left \lbrace\right \rbrace来自适应的调整括号大小

{i=0ni2=(n2+n)(2n+2)6}\left \lbrace \sum_{i=0}^n i^2 = \frac{(n^2 + n)(2n + 2)}{6} \right \rbrace

导数

矩阵

markdown支持的矩阵,格式如下

1
2
3
4
\begin{bmatrix}
...\\
...
\end{bmatrix}

行之间用\\分隔

例如,下面的语句

1
2
3
4
5
\begin{bmatrix}
a_{11} & a_{12} & a_{13} \\
a_{21} & a_{22} & a_{23} \\
a_{31} & a_{32} & a_{33}
\end{bmatrix}

将显示为

[a11a12a13a21a22a23a31a32a33]\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}

公式编号

KaTeX\KaTeX公式的编号命令如下:

1
e^{\pi i} + 1 = 0 \tag{1}

eπi+1=0(1)e^{\pi i} + 1 = 0 \tag{1}

(未完待续)