標籤:

如何在LaTeX數學模式中更好地使用粗體?


那句話怎麼說來著?不問是不是而先問為什麼都是耍流氓。LaTeX 當然不會把數學模式中的黑體全搞成 poor man"s bold,只不過你自己(在不清楚的情況下)用了專門生成 poor man"s bold 的命令,然後回頭來問為什麼這個命令會產生它應該產生的功能。對吧?

回到問題本身。真正應該問的,應該是「如何正確地在 LaTeX 數學公式中使用粗體」。當然,這還是一個字體選擇的問題。下面只考慮相對傳統的數學字體,也就是不使用 unicode-math 的情形,後者用法比較特別,僅用於 XeTeX 和 LuaTeX 的引擎,你可以自己讀它的手冊。

一、基本機制

在 LaTeX 中,選擇字體通常都是通過 NFSS 機制完成的,數學字體也不例外。基本的切換為數學粗體的命令是 oldmath,它通常被定義為 mathversion{bold},意思是全局地把當前的數學字體設置為粗體,並且它應該在數學環境外面使用。(與之相對的恢復正常粗細是 unboldmath 即 mathversion{normal}。)因此我們有:

documentclass{article}
egin{document}
oldmath $a^2 + b^2 = c^2$
end{document}

出現多次複製的 poor man"s bold 了嗎?並沒有。

和普通的公式對比就能看出,這裡不僅字母和數字被加粗了,加號和等號也都加粗了。這當然是最好的情況——數學符號使用的實際字體確實有加粗和不加粗兩種格式。

但也有一些時候,字體是不完整的,如果你所用的數學字體包並沒有為一個符號設計粗細兩種格式,你當然不可能通過簡單的命令選擇到這個符號。比如說積分號,默認的 CM 數學字體就沒有對應的粗體形式的符號,你直接使用 oldmath $int$ 得到的就是不加粗的積分號。

對於字體不完整的情況,最好的辦法就是換一個完整的字體。比如說使用 txfonts 或者說修正了的 newtxmath 字體包,就會得到正確的加粗積分號,如下圖:

而如果不更換字體還一定要加粗,就可能需要使用後面提及的偽粗體(poor man"s bold)技術了。

二、加粗個別符號的機制

更多的時候我們只希望加粗個別符號。這當然還是一個字體選擇的問題。LaTeX 並不允許在數學公式內部直接設置 mathversion,即在公式內使用 oldmath 是無效的。為此,amsmath 宏包(更確切地說是子包 amsbsy)提供了 oldsymbol 命令,使用 oldsymbol{符號} 的效果大約就是臨時切換到文本模式,設置 oldmath,然后里面嵌套一個小數學公式,輸出加粗符號。(除此以外宏包也用一些代碼處理了數學間距和大小的變化情況。)最後用起來的效果就是只加粗了參數裡面的符號。如

documentclass{article}
usepackage{amsmath}
egin{document}
[
a+b imes c
e oldsymbol{a+b imes c}
]
end{document}

那麼如果沒有粗體形式呢?amsmath 還提供了 pmb 命令來提供偽粗體(poor man"s bold)的符號。偽粗體的表現形式就是連續輸出三個的相同符號,三個符號相互重疊而略有錯位,形式偽粗體的效果。如圖所示:

在有可用的粗體字體時(比如上圖中的字母 k),偽粗體是應該盡量避免的;而對於缺少粗體形式的符號(如上圖的積分號),如果沒有可用的字體,那麼也不失為一種備用選擇。

三、推薦的宏包——bm

與 amsbsy 功能類似,更為強大的,是專門處理數學粗體的 bm 宏包。

bm 宏包提供的主要命令是 m,它和 amsmath 的 oldsymbol 一樣,把參數中的數學符號用粗體輸出。不同的是,在符號有粗體形式的字體可用時,它的功能與 oldsymbol 大致相同,會選擇對應的粗體輸出;而在符號沒有粗體形式的字體可用時,它的功能又與 pmb 一樣,會採用偽粗體輸出。除此而外,bm 宏包也在參數嵌套、數學字母字體切換等方面相比 amsbsy 處理得更為細緻。例如下例中,數學字母是正常粗體,積分號是偽粗體:

documentclass{article}
usepackage{bm}
egin{document}
[
int k,mathrm{d}x
e
m{int k,mathrm{d}x}
]
end{document}

四、選用高質量的字體

在高質量的排版輸出中,應該避免使用偽粗體。而要避免偽粗體,沒有其他路子可走,就是選用字重齊全的高質量數學字體。TeX 系統自帶的 CM 字體缺少部分粗體符號,但可以使用符號更為齊全的 newtxmath(Times 風格,配合 newtxtext 使用,前身是 txfonts)、stix(Times 風格,STIX 系列字體以大而全著稱)、pxfonts(Palatino 風格)、mathdesign(本身只包含符號,有不同選項用來配合 Utopia、Garamond、Charter 字體)、MnSymbol(只包含符號)、fdsymbol(只包含符號)、lucidabr(Lucida Bright 商業字體)等字體包。一些專業的商業字體,如 MathTime Pro 的兩個版本,甚至有 normal、bold、heavy 三種粗細可以使用(bm 宏包為最後一種粗細提供了 hm 命令)。在排版時可以優先選擇這類字體。下面是 newtxmath 的效果:

documentclass{article}
usepackage{newtxtext,newtxmath}
usepackage{bm}
egin{document}
[
sum int (koplus j) ,mathrm{d}x
e
m{sum int (koplus j) ,mathrm{d}x}
]
end{document}

當然,即使不使用這類擁有全套粗體形式的數學字體(畢竟加粗的求和、積分號並不常用),也應該盡量選擇支持較多符號的數學字體(考慮拉丁字母、希臘字母、常用運算符、AMS 運算符等)。

五、如何達到題目中說的「LaTeX 數學模式中的黑體都是多次複製」的糟糕效果?

最後我們舉一個符號較少、質量較差的數學字體作為反例來完結這段討論。PSNFSS 下屬的 mathptmx 字體包,是一個在各種文檔模板中十分常見的數學字體包。事實上,mathptmx 包並沒有自己對應的任何實際字體,所有數學字母和符號分別來自 Times Roman 的正文字母、rsfs 包的花體字母、Adobe Symbol 字體中的數學符號,剩下的數學符號由默認的 CM 補全。更糟糕的是,mathptmx 根本沒有任何粗體形式的符號。在 mathptmx 包中,oldmath 命令被直接重定義為發出一個缺字體的警告:

defoldmath{%
PackageWarning%
{mathptmx}%
{There are no bold math fonts}%
globalletoldmath=
elax
}

因此,如果你使用了 mathptmx 這樣不包含任何粗體形式的低質量的字體包,而又採用 bm 包的 m 命令來產生粗體,那麼很自然,所有加粗的字元就都被作為偽粗體輸出了。仍沿用前面 newtxmath 字體包的例子:

documentclass{article}
usepackage{mathptmx}
usepackage{bm}
egin{document}
[
sum int (koplus pi) ,mathrm{d}x
e
m{sum int (koplus pi) ,mathrm{d}x}
]
end{document}

效果非常之嚇人:


給劉海洋的回答補充一點:

XeLaTeX可以用TrueType/OpenType數學字體,因此微軟/Ascender的Cambria Math就可以用了。

此外,開源的TrueType/OpenType數學字體還有Asana Math (用的是URW Paladio)和另外幾個基於URW開源字體製作的數學字體,以及Computer Modern本身的otf化,以及STIX。


補充一下,newtxtext有時候會有問題,我也不知道具體咋回事。干可以用garamondx搭配newtxmath

usepackage{garamondx}

usepackage[garamondx,cmbraces]{newtxmath}

usepackage{bm}

新手需要注意的是,garamondx不是默認安裝。使用tex live平台的朋友,必須用getnonfreefonts工具(getnonfreefonts)在線安裝非默認字體。 據說garamondx 已經被包括在Mitex ,我沒有去確認。


推薦閱讀:

手機上怎麼使用LaTeX編輯呢?
LaTex怎麼下載?該下什麼版本
MathType 如何做出 LaTeX 的公式效果?
有了 MathType,為什麼還要用 LaTeX ?
使用 LaTeX 有什麼比較好的編寫技巧或習慣?

TAG:LaTeX |