動手微調(diào)KaTeX,讓你的博客完美顯示數(shù)學公式(上)
為數(shù)學公式頭疼的攻城獅和理科生
對于理科生來說數(shù)學公式簡直是噩夢,看著麻煩、寫著麻煩,想在電腦上顯示更麻煩。因為公式和普通的文字以相同的大小按序排列不同,公式要以不同的位置表示從屬關(guān)系。比如右下角、右上角、符號上方,表示求和的Σ符號要比普通的字符大很多,求和符號上方下方還可以有符號。另外,仔細觀察可以發(fā)現(xiàn)數(shù)學公式的括號高度都是不同的。

更不要提可怕的矩陣、積分、方程組,需要橫向縱向排列。下面的圖可以感受一下上世紀鉛字排版時密密麻麻的鉛條是如何排列的。

標準是什么?能吃嗎?
理工科學生,寫報告、寫論文、參加數(shù)學建模比賽必然繞不開各式各樣的數(shù)學公式。那么在電腦上如何編輯、顯示公式呢?
制訂互聯(lián)網(wǎng)標準的國際組織 W3C,在很久之前設(shè)計了 MathML 標準,用于在網(wǎng)頁上顯示公式。MathML 標準用 XML 格式將公式中各個數(shù)字、字母、符號用 XML 表示各個從屬關(guān)系,得到一段非常長又復雜的代碼,通過瀏覽器渲染成人們可以識別的公式。然后…就沒有然后了。

1977年斯坦福大學的 Donald E. Knuth 大佬開發(fā)了一套排版系統(tǒng) TeX,之后?Leslie Lamport?在 TeX 的基礎(chǔ)上作了改進開發(fā)出現(xiàn)代最常用的排版系統(tǒng),LaTeX。LaTeX 使用各種指令代碼控制排版,描述數(shù)學公式,通過其引擎將文本文件轉(zhuǎn)成如 pdf 這樣的可以交付印刷的格式。但是 LaTeX 在使用時需要記住許多的命令、符號,因此學習難度比較大,大多數(shù)人還是更習慣使用 MathType、Office自帶公式編輯器這種可以點選符號的工具。
你們一定都用過的編輯器
MathType 的原理是把 MathType 繪制的矢量圖格式以圖片的形式嵌入在文檔中,如果需要編輯,雙擊公式,調(diào)用 MathType 程序進行修改。這樣繪制的公式放大后不會失真,公式的樣式符合標準,但是編輯起來麻煩,尤其是嵌入大量的公式需要一一雙擊修改,和文字混排時不易對齊,較長的公式無法換行,等等。
微軟的 Office 從 2010 版本開始提供了自帶的公式編輯器,可以編輯一些相對簡單的公式。與 MathType 相比,微軟自帶的公式編輯器可以換行、批量選中更改大小、字體,非常方便。

值得一提的是,Office 的公式編輯器兼容 MathML 標準,微軟還在原有標準的基礎(chǔ)上做了一些完善。所以如果你復制了一段 MathML 代碼,在 Word 中粘貼會直接得到公式。Word 2010 版本以上可以試試下面的代碼。
當然,更重要的是自帶公式編輯器還支持 LaTeX,有了 LaTeX 代碼可以直接轉(zhuǎn)成為 Word 公式,不需要再手動謄寫一遍。

LaTeX 常見問題,你一定遇到過
LaTeX 如今是數(shù)學公式編輯領(lǐng)域事實上的標準,所以下面來說一說使用 LaTeX 時最常見的幾個問題。
為啥我的大于等于號和書上的不一樣?
LaTeX 中用 \geq 或 \ge (greater?equal)表示大于等于,但無論在 LaTeX 還是 Word、MathType 中等于號都是以水平的形式出現(xiàn)的,和書上傾斜的等于號不一樣。這兩者并沒有什么區(qū)別,只是斜式在正式的出版物中更為常見,也更容易識別。但這兩種樣式在 Unicode 中是不同的編碼字符,LaTeX 指令也不同,水平式的用?\ge
?或?\geq
?表示大于等于,斜式用?\geqslant
?表示。

如果你更青睞于傾斜的風格,就要用?\geqslant、\leqslant?指令。
為啥我的分式扁扁的…
LaTeX 中,表示分式用 \frac{a} 指令,a是分子,b是分母。用 \frac 指令有時候可能會看到這樣的公式

這是因為數(shù)學公式有兩種排版方式,就像 Word 中“環(huán)繞”、“四周”、“浮于文字”一樣。一種是“顯示”(Display),表示的是公式單獨占一行;另一種是“內(nèi)嵌”(Inline),表示的是公式與其它文字混排。上圖就是“內(nèi)嵌”型,LaTeX 為了分式不影響正文行的高度,強行把分式壓扁。如果不需要 LaTeX 做這樣的調(diào)整,需要用 \cfrac{}{} 指令代替 \frac{}{}。

為啥我的方程組、換行等號不對齊呢
在 LaTeX 中,換行用兩個斜線 \\ 表示,前后用 \begin{aligned}? {公式}?\end{aligned} 包裹起來可以讓換行后的公式自動對齊。但是仔細看下圖,第一行和第二行的等號并沒有完全對齊。

這種情況可以用 & 符號錨定要對齊的位置。比如,按等號對齊,就在 = 前加 &,這樣 LaTeX 就知道這兩行的公式要在等號處對齊。

這樣的技巧同樣適用于 Word 自帶公式編輯器。在 Word 中插入一個分段函數(shù)的公式。

可以看到這個公式在 n 為偶數(shù)或奇數(shù)的條件那里并沒有對齊。

在“n偶數(shù)”前有一道灰色的豎線,其實就是 & 符號的效果,表示的是“對齊”。但是只有這一行有豎線,所以我們需要保持對齊,那么在“n奇數(shù)”前插入一個 &,&不會顯示出來,而是出現(xiàn)灰色豎線,表示兩行對齊。


MathJax?KaTeX?哪個更好用
目前來說,在網(wǎng)頁上顯示數(shù)學公式最常用的方案是引入 JavaScript 對 LaTeX 代碼渲染,如維基百科、segmentfault 都是采用這樣的方案,其中使用最多的庫是 MathJax 和 KaTeX。

用哪個好呢?
KaTeX 與 MathJax 相比最大的優(yōu)點就是整個庫體積小巧,同步加載,公式繪制的速度非??欤瑯右仓С趾唵蔚幕瘜W反應式的編輯,因此如果不是使用特別復雜、罕見的公式,建議使用 KaTeX。
MathJax 提供了很多數(shù)學字體,有 Asana Math,Gyre Pagella,Latin Modern,Neo Euler,STIX Web 等等。而 KaTeX 并不能指定字體,只有默認的 Latin Modern Math。但是不要擔心,本文將在下篇給出替換字體的方法。
我想要教科書那種數(shù)學字體怎么辦?
國內(nèi)的圖書排版大多用的是方正全家桶,排版公式的字體也是方正獨有的,因此想要和教科書上完全一致的字體是不可能的。不過我們可以選擇一些風格接近的字體。比如,在寫論文時,編輯部大多要求英文、數(shù)字字體是?Times New Roman,這其實就和教科書的字體風格接近,但是 Times New Roman 是為英文設(shè)計的字體,數(shù)學的特殊符號是無法正常顯示的。
STIX?字體是專門為數(shù)學公式設(shè)計的一款 Times 風格字體,由 STIX 衍生的?XITS?字體增加了更多特殊符號的支持,XITS Math?是可以在Word公式編輯器中使用的字體。
Word 默認的數(shù)學字體是微軟設(shè)計的?Cambria Math;而?LaTeX,包括 KaTeX、MathJax 默認的字體是 Latin Modern Math。個人比較喜歡 Times 風格字體,嚴肅、干凈,字體的裝飾較少,在顯示器這種分辨率較低的設(shè)備上看著比較清晰。

幾類常見的數(shù)學字體樣式對比