动手微调KaTeX,让你的博客完美显示数学公式(上)
为数学公式头疼的攻城狮和理科生
对于理科生来说数学公式简直是噩梦,看着麻烦、写着麻烦,想在电脑上显示更麻烦。因为公式和普通的文字以相同的大小按序排列不同,公式要以不同的位置表示从属关系。比如右下角、右上角、符号上方,表示求和的Σ符号要比普通的字符大很多,求和符号上方下方还可以有符号。另外,仔细观察可以发现数学公式的括号高度都是不同的。

更不要提可怕的矩阵、积分、方程组,需要横向纵向排列。下面的图可以感受一下上世纪铅字排版时密密麻麻的铅条是如何排列的。

标准是什么?能吃吗?
理工科学生,写报告、写论文、参加数学建模比赛必然绕不开各式各样的数学公式。那么在电脑上如何编辑、显示公式呢?
制订互联网标准的国际组织 W3C,在很久之前设计了 MathML 标准,用于在网页上显示公式。MathML 标准用 XML 格式将公式中各个数字、字母、符号用 XML 表示各个从属关系,得到一段非常长又复杂的代码,通过浏览器渲染成人们可以识别的公式。然后…就没有然后了。

1977年斯坦福大学的 Donald E. Knuth 大佬开发了一套排版系统 TeX,之后 Leslie Lamport 在 TeX 的基础上作了改进开发出现代最常用的排版系统,LaTeX。LaTeX 使用各种指令代码控制排版,描述数学公式,通过其引擎将文本文件转成如 pdf 这样的可以交付印刷的格式。但是 LaTeX 在使用时需要记住许多的命令、符号,因此学习难度比较大,大多数人还是更习惯使用 MathType、Office自带公式编辑器这种可以点选符号的工具。
你们一定都用过的编辑器
MathType 的原理是把 MathType 绘制的矢量图格式以图片的形式嵌入在文档中,如果需要编辑,双击公式,调用 MathType 程序进行修改。这样绘制的公式放大后不会失真,公式的样式符合标准,但是编辑起来麻烦,尤其是嵌入大量的公式需要一一双击修改,和文字混排时不易对齐,较长的公式无法换行,等等。
微软的 Office 从 2010 版本开始提供了自带的公式编辑器,可以编辑一些相对简单的公式。与 MathType 相比,微软自带的公式编辑器可以换行、批量选中更改大小、字体,非常方便。

值得一提的是,Office 的公式编辑器兼容 MathML 标准,微软还在原有标准的基础上做了一些完善。所以如果你复制了一段 MathML 代码,在 Word 中粘贴会直接得到公式。Word 2010 版本以上可以试试下面的代码。
当然,更重要的是自带公式编辑器还支持 LaTeX,有了 LaTeX 代码可以直接转成为 Word 公式,不需要再手动誊写一遍。

LaTeX 常见问题,你一定遇到过
LaTeX 如今是数学公式编辑领域事实上的标准,所以下面来说一说使用 LaTeX 时最常见的几个问题。
为啥我的大于等于号和书上的不一样?
LaTeX 中用 \geq 或 \ge (greater equal)表示大于等于,但无论在 LaTeX 还是 Word、MathType 中等于号都是以水平的形式出现的,和书上倾斜的等于号不一样。这两者并没有什么区别,只是斜式在正式的出版物中更为常见,也更容易识别。但这两种样式在 Unicode 中是不同的编码字符,LaTeX 指令也不同,水平式的用 \ge
或 \geq
表示大于等于,斜式用 \geqslant
表示。

如果你更青睐于倾斜的风格,就要用 \geqslant、\leqslant 指令。
为啥我的分式扁扁的…
LaTeX 中,表示分式用 \frac{a}{b} 指令,a是分子,b是分母。用 \frac 指令有时候可能会看到这样的公式

这是因为数学公式有两种排版方式,就像 Word 中“环绕”、“四周”、“浮于文字”一样。一种是“显示”(Display),表示的是公式单独占一行;另一种是“内嵌”(Inline),表示的是公式与其它文字混排。上图就是“内嵌”型,LaTeX 为了分式不影响正文行的高度,强行把分式压扁。如果不需要 LaTeX 做这样的调整,需要用 \cfrac{}{} 指令代替 \frac{}{}。

为啥我的方程组、换行等号不对齐呢
在 LaTeX 中,换行用两个斜线 \\ 表示,前后用 \begin{aligned} {公式} \end{aligned} 包裹起来可以让换行后的公式自动对齐。但是仔细看下图,第一行和第二行的等号并没有完全对齐。

这种情况可以用 & 符号锚定要对齐的位置。比如,按等号对齐,就在 = 前加 &,这样 LaTeX 就知道这两行的公式要在等号处对齐。

这样的技巧同样适用于 Word 自带公式编辑器。在 Word 中插入一个分段函数的公式。

可以看到这个公式在 n 为偶数或奇数的条件那里并没有对齐。

在“n偶数”前有一道灰色的竖线,其实就是 & 符号的效果,表示的是“对齐”。但是只有这一行有竖线,所以我们需要保持对齐,那么在“n奇数”前插入一个 &,&不会显示出来,而是出现灰色竖线,表示两行对齐。


MathJax?KaTeX?哪个更好用
目前来说,在网页上显示数学公式最常用的方案是引入 JavaScript 对 LaTeX 代码渲染,如维基百科、segmentfault 都是采用这样的方案,其中使用最多的库是 MathJax 和 KaTeX。

用哪个好呢?
KaTeX 与 MathJax 相比最大的优点就是整个库体积小巧,同步加载,公式绘制的速度非常快,同样也支持简单的化学反应式的编辑,因此如果不是使用特别复杂、罕见的公式,建议使用 KaTeX。
MathJax 提供了很多数学字体,有 Asana Math,Gyre Pagella,Latin Modern,Neo Euler,STIX Web 等等。而 KaTeX 并不能指定字体,只有默认的 Latin Modern Math。但是不要担心,本文将在下篇给出替换字体的方法。
我想要教科书那种数学字体怎么办?
国内的图书排版大多用的是方正全家桶,排版公式的字体也是方正独有的,因此想要和教科书上完全一致的字体是不可能的。不过我们可以选择一些风格接近的字体。比如,在写论文时,编辑部大多要求英文、数字字体是 Times New Roman,这其实就和教科书的字体风格接近,但是 Times New Roman 是为英文设计的字体,数学的特殊符号是无法正常显示的。
STIX 字体是专门为数学公式设计的一款 Times 风格字体,由 STIX 衍生的 XITS 字体增加了更多特殊符号的支持,XITS Math 是可以在Word公式编辑器中使用的字体。
Word 默认的数学字体是微软设计的 Cambria Math;而 LaTeX,包括 KaTeX、MathJax 默认的字体是 Latin Modern Math。个人比较喜欢 Times 风格字体,严肃、干净,字体的装饰较少,在显示器这种分辨率较低的设备上看着比较清晰。

几类常见的数学字体样式对比