数学模式中的英文字母默认是数学斜体,但许多领域会需要特定的 数学字母表:集合论中的黑板粗体 ℝ、函子名称常用的花体字母、Lie 代数中的装饰性 Fraktur。本文整理 \mathbf、\mathbb 等数学字母表命令、各自需要的包,以及给向量和符号加粗时 \boldsymbol 与 \bm 的区别。最后介绍 unicode-math,也就是在 XeLaTeX 和 LuaLaTeX 中使用 OpenType 数学字体的现代方式。
什么是数学字母表
数学模式中的字母会被视为变量,并以 数学斜体 排版;这就是默认的数学字母表。若用 \mathbf{v} 这样的命令包住一段内容,就只把这段切换到另一种书体。LaTeX 用 \math… 形式提供这些切换命令,对应文本模式中的 \textbf、\textsf 等。
需要注意的是,数学字母表命令会 把参数重新排成逐个数学符号的序列,而不是当作文本处理。因此 \mathbf{fit} 不是单词 “fit”,而是三个粗体符号 f、i、t 的乘积。若想在公式中放入一个真正的直立单词,应使用 \text{…}(来自 amsmath)。
七个基本命令不需要任何包即可使用。下表先列出 LaTeX 内置的命令(\mathnormal 只是显式指定默认的数学斜体)。
| 命令 | 外观 | 备注 |
|---|---|---|
\mathnormal | 默认数学斜体 | 内置;变量的默认外观 |
\mathrm | 直立罗马体 | 内置;用于直立常数和缩写 |
\mathbf | 直立粗体 | 内置;因是直立体,不适合变量(见下文) |
\mathsf | 无衬线体 | 内置;用于张量、范畴名称等 |
\mathtt | 等宽(打字机体) | 内置;例如数学中的代码式记号 |
\mathit | 文本斜体 | 内置;用于多字母词的斜体(字距按单词) |
\mathcal | 花体;仅大写 | 内置;用于集合族、范畴等 |
\mathit 和 \mathnormal 容易混淆,补充一句:\mathnormal(默认)把每个字母作为变量排版,变量之间的间距较宽;\mathit 是文本斜体,适合像 \mathit{diff} 这样把 多字母词作为一个整体的斜体。
黑板粗体、花体、Fraktur 与 script
下面四种是数学中尤其常用的书体,但除了内置的 \mathcal 之外,每一种都 需要载入包。它们的外观、典型用途和所需包各不相同。
\mathbb(黑板粗体,blackboard bold) 是一种笔画带双线的独特粗体,来源于在黑板上通过重复描线来表示粗体的写法。它需要 amssymb(或 amsfonts),并且 只支持大写字母。用途几乎固定:表示数集,如实数 ℝ、复数 ℂ、整数 ℤ、有理数 ℚ、自然数 ℕ。写 \mathbb{R} 会得到竖笔画为双线的“黑板粗体 R”。
\mathcal(花体,calligraphic) 给出流畅的装饰性大写字母;它 内置可用且仅支持大写。常用于集合族 𝒜、傅里叶变换 ℱ、范畴和层的名称等。\mathcal{F} 会得到一个“带装饰的 F”。
\mathscr(script 体) 比 \mathcal 更像手写体,也更流丽。常用来源是 mathrsfs 包(载入 Ralph Smith 的 Formal Script);euscript 包(Euler Script)也提供另一种 script。当你需要与 \mathcal 区分、同时使用两种装饰性字母时很有用(实际使用上也主要面向大写)。
\mathfrak(Fraktur) 是源自德国旧活字的棱角分明的装饰字体,用于 Lie 代数 𝔤、理想 𝔭、𝔮 等名称。它需要 amssymb(或 amsfonts,内部载入 eufrak),并且不同于 \mathbb 和 \mathcal,同时支持大写和小写。
\usepackage{amssymb} % \mathbb と \mathfrak
\usepackage{mathrsfs} % \mathscr
% ...
\[
\mathbb{R} \subset \mathbb{C}, \qquad
\mathcal{F}(f) = \hat{f}, \qquad
\mathscr{L}(f) = F, \qquad
\mathfrak{g} = \operatorname{Lie}(G).
\]在这个例子中,\mathbb{R} 和 \mathbb{C} 是黑板粗体,\mathcal{F} 是花体,\mathscr{L} 是更流丽的 script,\mathfrak{g} 是棱角分明的 Fraktur 小写。下表汇总各书体所需的包和字母覆盖范围。
| 命令 | 所需包 | 覆盖范围与典型用途 |
|---|---|---|
\mathbb | amssymb(或 amsfonts) | 仅大写;数集 ℝ ℂ ℤ ℚ ℕ |
\mathcal | 内置(无需) | 仅大写;集合族、范畴、变换名 |
\mathscr | mathrsfs(或 euscript) | 实际主要用于大写;更流丽的 script |
\mathfrak | amssymb / amsfonts(eufrak) | 大写和小写;Lie 代数、理想 |
它们共有一个重要限制:这些装饰字母表 收录的字符有限。\mathbb 和 \mathcal 基本以大写 A–Z 为主;标准字体通常不提供数字、希腊字母和小写。像“用 \mathbb{2} 得到黑板粗体 2”这样的需求,标准方式无法满足,需要其他字体包(如 mathalpha/mathalfa、bbm、dsfont 等)或下文介绍的 unicode-math。
让数学符号变粗
很多时候需要把数学内容加粗,例如用粗体表示向量和矩阵,但这里有一个陷阱。前面提到的 \mathbf 是“直立粗体”,本来用于应该直立的粗体 常数或缩写。用它排向量 \mathbf{v} 时,虽然会变粗,但会变成 直立体,违背变量应为斜体的约定。更麻烦的是,\mathbf 对符号和希腊字母无效(\mathbf{\alpha} 不会把 α 变粗)。
若想在保持斜体的同时加粗,第一选择是 \boldsymbol。它由 amsmath(内部的 amsbsy)提供,不仅能加粗变量,也能 加粗希腊字母和符号,同时保持原有字形(斜体等)。\boldsymbol{\beta} 会得到“粗斜体 β”。
而现在最推荐、最稳健的方法,是 bm 包提供的 \bm。bm 属于 LaTeX 必需工具集(latex-tools),标准 TeX 发行版都会自带,无需额外安装。\bm{…} 的设计目标是“只给参数 增加字重,保持斜体等其他外观不变”,因此变量、希腊字母、符号,甚至复杂输入,几乎都可以自然加粗。它对字距的处理也比 \boldsymbol 更细致;CTAN 的说明也说“\bm 做事比 \boldsymbol 更仔细”。bm 会把 \boldsymbol 重新定义为 \bm 的别名,并提供极粗用的 \hm(\heavysymbol)。
\usepackage{amsmath} % \boldsymbol
\usepackage{bm} % \bm(推奨)
% ...
\[
\mathbf{v} \neq \bm{v}, \qquad
\bm{\beta} = (\beta_1, \dots, \beta_n), \qquad
\nabla \bm{F} = \bm{0}.
\]在这个例子中,\mathbf{v} 是 直立粗体 v,而 \bm{v} 是 仍保持斜体的粗体 v,两者的差别很明显。\bm{\beta} 是粗斜体 β,\bm{0} 是粗体零(零向量)。原则上,变量、向量和符号的粗体用 \bm,直立即可的常数和缩写用 \mathbf,这样最安全。
\mathbf— 直立粗体;内置,但不适合应为斜体的变量,也不会影响符号或希腊字母。\boldsymbol— 来自 amsmath(amsbsy);保持斜体,并能加粗希腊字母和符号。\bm— 来自 bm 包;推荐。只增加字重,保持字形和间距;最稳健,适用范围最广。
unicode-math(XeLaTeX 与 LuaLaTeX)
到目前为止,我们介绍的是为每种书体逐个添加专用包的传统做法。在较新的 XeLaTeX 和 LuaLaTeX 引擎中,使用 unicode-math 包可以把整个数学内容统一用 一个 OpenType 数学字体 排版。切换数学字体就像切换文本字体一样,并取代了逐个添加 \mathbb 等命令的传统方式(两种方式不能在同一文档中混用)。
核心用法是 \setmathfont{…}。先载入 amsmath,再在其他字体相关包之后载入 unicode-math,然后用 \setmathfont 指定 OpenType 数学字体。常见字体包括 Latin Modern Math(Computer Modern 系谱)、STIX Two Math、TeX Gyre 系列(Termes/Pagella/Bonum/Schola Math)等。如果在 \begin{document} 之前没有指定数学字体,默认会载入 Latin Modern Math。
% コンパイルは xelatex または lualatex
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{STIX Two Math} % OpenType 数式フォント
% ...
\[
\symbb{R} \subset \symbb{C}, \qquad
\symcal{F}, \quad \symscr{L}, \quad \symfrak{g}, \qquad
\symbf{v} = \symbf{0}.
\]手册建议用 \sym… 命令 代替传统的 \math… 命令。对应关系很直接:\symbf(粗体)、\symbb(黑板粗体)、\symcal(花体)、\symscr(script)、\symfrak(Fraktur)、\symup(直立)、\symit(斜体)、\symsf(无衬线)等。它们会映射到 Unicode 中相应的数学字母数字字符,因此从输出 PDF 复制字形时也能保留语义。旧名称如 \mathbb 仍为向后兼容保留,但新文档推荐使用 \sym…。
当一个数学字体不能覆盖所有字符时,\setmathfont 的 range= 选项 可以让你只从其他字体中取数学字母表的 一部分。range= 可以接受 Unicode 范围(如 "1D538-"1D56B" 这样的形式)、单个符号如 range=\int,也可以接受 字母样式 如 range=\symbb(或 range=bb)。因此可以只把黑板粗体字母,或只把希腊小写和大写,换成其他字体。注意,使用 range= 之前必须照常先载入主数学字体。
\usepackage{amsmath}
\usepackage{unicode-math}
\setmathfont{Latin Modern Math} % 主たる数式フォント
\setmathfont{STIX Two Math}[range=\symbb] % 黒板太字だけ別フォント
\setmathfont{TeX Gyre Termes Math}[range=bfit/{greek,Greek}] % 太字斜体のギリシャだけ这个例子中,数学主体由 Latin Modern Math 排版,只有黑板粗体字母(\symbb)来自 STIX Two Math,只有粗斜体希腊字母来自 TeX Gyre Termes Math。为了效率,unicode-math 对 range= 指定的字体只载入所需范围。总的来说,如果使用 XeLaTeX 或 LuaLaTeX,今天的标准做法是 unicode-math + \setmathfont,而不是为每种书体逐个添加包。