数学字体

数学模式中的英文字母默认是数学斜体,但许多领域会需要特定的 数学字母表:集合论中的黑板粗体 ℝ、函子名称常用的花体字母、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同时支持大写和小写

document.tex
\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 小写。下表汇总各书体所需的包和字母覆盖范围。

命令所需包覆盖范围与典型用途
\mathbbamssymb(或 amsfonts)仅大写;数集 ℝ ℂ ℤ ℚ ℕ
\mathcal内置(无需)仅大写;集合族、范畴、变换名
\mathscrmathrsfs(或 euscript)实际主要用于大写;更流丽的 script
\mathfrakamssymb / amsfonts(eufrak)大写和小写;Lie 代数、理想

它们共有一个重要限制:这些装饰字母表 收录的字符有限\mathbb\mathcal 基本以大写 A–Z 为主;标准字体通常不提供数字、希腊字母和小写。像“用 \mathbb{2} 得到黑板粗体 2”这样的需求,标准方式无法满足,需要其他字体包(如 mathalpha/mathalfabbmdsfont 等)或下文介绍的 unicode-math

让数学符号变粗

很多时候需要把数学内容加粗,例如用粗体表示向量和矩阵,但这里有一个陷阱。前面提到的 \mathbf 是“直立粗体”,本来用于应该直立的粗体 常数或缩写。用它排向量 \mathbf{v} 时,虽然会变粗,但会变成 直立体,违背变量应为斜体的约定。更麻烦的是,\mathbf 对符号和希腊字母无效(\mathbf{\alpha} 不会把 α 变粗)。

若想在保持斜体的同时加粗,第一选择是 \boldsymbol。它由 amsmath(内部的 amsbsy)提供,不仅能加粗变量,也能 加粗希腊字母和符号,同时保持原有字形(斜体等)。\boldsymbol{\beta} 会得到“粗斜体 β”。

而现在最推荐、最稳健的方法,是 bm提供的 \bmbm 属于 LaTeX 必需工具集(latex-tools),标准 TeX 发行版都会自带,无需额外安装。\bm{…} 的设计目标是“只给参数 增加字重,保持斜体等其他外观不变”,因此变量、希腊字母、符号,甚至复杂输入,几乎都可以自然加粗。它对字距的处理也比 \boldsymbol 更细致;CTAN 的说明也说“\bm 做事比 \boldsymbol 更仔细”。bm 会把 \boldsymbol 重新定义为 \bm 的别名,并提供极粗用的 \hm\heavysymbol)。

document.tex
\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

document.tex
% コンパイルは 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…

当一个数学字体不能覆盖所有字符时,\setmathfontrange= 选项 可以让你只从其他字体中取数学字母表的 一部分range= 可以接受 Unicode 范围(如 "1D538-"1D56B" 这样的形式)、单个符号如 range=\int,也可以接受 字母样式range=\symbb(或 range=bb)。因此可以只把黑板粗体字母,或只把希腊小写和大写,换成其他字体。注意,使用 range= 之前必须照常先载入主数学字体。

document.tex
\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-mathrange= 指定的字体只载入所需范围。总的来说,如果使用 XeLaTeX 或 LuaLaTeX,今天的标准做法是 unicode-math + \setmathfont,而不是为每种书体逐个添加包。