LaTeX 当然不会把数学模式中的黑体全搞成 poor man's bold,只不过你自己(在不清楚的情况下)用了专门生成 poor man's bold 的命令,然后回头来问为什么这个命令会产生它应该产生的功能。对吧? 回到问题本身。真正应该问的,应该是「如何正确地在 LaTeX 数学公式中使用粗体」。当然,这还是一个字体选择的问题。下面只考虑相对传统的数学字体,也就是不使用 unicode-math 的情形,后者用法比较特别,仅用于 XeTeX 和 LuaTeX 的引擎,你可以自己读它的手册。
一、基本机制
在 LaTeX 中,选择字体通常都是通过 NFSS 机制完成的,数学字体也不例外。基本的切换为数学粗体的命令是 \boldmath,它通常被定义为 \mathversion{bold},意思是全局地把当前的数学字体设置为粗体,并且它应该在数学环境外面使用。(与之相对的恢复正常粗细是 \unboldmath 即 \mathversion{normal}。)因此我们有:\documentclass{article} \begin{document} \boldmath $a^2 + b^2 = c^2$ \end{document}


二、加粗个别符号的机制
更多的时候我们只希望加粗个别符号。这当然还是一个字体选择的问题。LaTeX 并不允许在数学公式内部直接设置 \mathversion,即在公式内使用 \boldmath 是无效的。为此,amsmath 宏包(更确切地说是子包 amsbsy)提供了 \boldsymbol 命令,使用 \boldsymbol{符号} 的效果大约就是临时切换到文本模式,设置 \boldmath,然后里面嵌套一个小数学公式,输出加粗符号。(除此以外宏包也用一些代码处理了数学间距和大小的变化情况。)最后用起来的效果就是只加粗了参数里面的符号。如\documentclass{article} \usepackage{amsmath} \begin{document} \[ a+b\times c \ne \boldsymbol{a+b \times c} \] \end{document}


在有可用的粗体字体时(比如上图中的字母 k),伪粗体是应该尽量避免的;而对于缺少粗体形式的符号(如上图的积分号),如果没有可用的字体,那么也不失为一种备用选择。
三、推荐的宏包——bm
与 amsbsy 功能类似,更为强大的,是专门处理数学粗体的 bm 宏包。 bm 宏包提供的主要命令是 \bm,它和 amsmath 的 \boldsymbol 一样,把参数中的数学符号用粗体输出。不同的是,在符号有粗体形式的字体可用时,它的功能与 \boldsymbol 大致相同,会选择对应的粗体输出;而在符号没有粗体形式的字体可用时,它的功能又与 \pmb 一样,会采用伪粗体输出。除此而外,bm 宏包也在参数嵌套、数学字母字体切换等方面相比 amsbsy 处理得更为细致。例如下例中,数学字母是正常粗体,积分号是伪粗体:\documentclass{article} \usepackage{bm} \begin{document} \[ \int k\,\mathrm{d}x \ne \bm{\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} \begin{document} \[ \sum \int (k\oplus j) \,\mathrm{d}x \ne \bm{\sum \int (k\oplus j) \,\mathrm{d}x} \] \end{document}

五、如何达到题目中说的「LaTeX 数学模式中的黑体都是多次复制」的糟糕效果?
最后我们举一个符号较少、质量较差的数学字体作为反例来完结这段讨论。PSNFSS 下属的 mathptmx 字体包,是一个在各种文档模板中十分常见的数学字体包。事实上,mathptmx 包并没有自己对应的任何实际字体,所有数学字母和符号分别来自 Times Roman 的正文字母、rsfs 包的花体字母、Adobe Symbol 字体中的数学符号,剩下的数学符号由默认的 CM 补全。更糟糕的是,mathptmx 根本没有任何粗体形式的符号。在 mathptmx 包中,\boldmath 命令被直接重定义为发出一个缺字体的警告:\def\boldmath{% \PackageWarning% {mathptmx}% {There are no bold math fonts}% \global\let\boldmath=\relax }因此,如果你使用了 mathptmx 这样不包含任何粗体形式的低质量的字体包,而又采用 bm 包的 \bm 命令来产生粗体,那么很自然,所有加粗的字符就都被作为伪粗体输出了。仍沿用前面 newtxmath 字体包的例子:
\documentclass{article} \usepackage{mathptmx} \usepackage{bm} \begin{document} \[ \sum\int(k\oplus\pi)\,\mathrm{d}x \ne \bm{\sum\int(k\oplus\pi)\,\mathrm{d}x} \] \end{document}效果非常之吓人:

发表评论 取消回复