amsmath / AMSFonts

如果要排严肃的数学内容,首先应加载的包就是 amsmath。这是美国数学会(AMS)的数学排版包,也是事实上的标准,从对齐的陈列公式到精细的间距控制,都显著增强了 LaTeX 内建的数学功能。本页不讲对齐环境本身的用法(它们有单独页面),而是说明 为什么要加载 amsmath,以及跨环境通用的命令:\text\operatorname\DeclareMathOperator\intertext\substack\numberwithin。同时也介绍 amsmath 的伙伴:提供黑板粗体、Fraktur 和数百个额外符号的 amssymb / AMSFonts,以及用于定理环境的 amsthm

amsmath 是什么

amsmath 是 American Mathematical Society (AMS) 为排版自己的期刊而发展出的数学包。LaTeX 内建的数学功能很基础,不能充分处理多行公式对齐、公式编号的细致控制或函数名的正确排版。amsmath 一次性补上这些缺口,如今在数学和物理文档中被认为 几乎必不可少。加载它只需在导言区写一行。

latex
\usepackage{amsmath}

amsmath 与其说是单一包,不如说是一组小包的集合。正如官方 User’s Guide 明确说明的,amsmath incorporates amstext(数学中的文本命令 \text)、amsopn(用于定义算子的 \DeclareMathOperator 等)和 amsbsy(通过 \boldsymbol 得到数学粗体)。因此,一行 \usepackage{amsmath} 会把这些功能一起带进来。amsmath 被归类为 LaTeX 的 required 包,2016 年以后维护从 AMS 转交给 LaTeX Project(当前版本为 2.17z,2025 年 7 月发布)。

amsmath 最醒目的功能是 用于对齐多行公式的环境,包括 aligngathermultlinesplitalignat,以及分段情况环境 cases 等。这些内容足够多,已在单独页面“Displayed, aligned & numbered equations”中讲解;这里仅点名它们,本页重点放在 可在任何环境中使用的横向命令

amssymb 和 AMSFonts

与 amsmath 搭配的是提供符号和字体的 amssymb(AMSFonts 的一部分)。二者职责不同:amsmath 增加 排版机制(对齐、间距、编号),amssymb 则扩展可书写的 符号和数学字母表。在导言区这样加载 amssymb。

latex
\usepackage{amssymb}

amssymb 定义了 AMS 符号字体 msammsbm 中的所有符号,从而提供标准 LaTeX 中没有的 数百个额外符号,例如 \leqslant\geqslant(倾斜不等号)、\nleq\subsetneq(否定与真子集关系)、\therefore\because\square\blacksquare,以及 \varnothing(空集的另一种字形)。由于 amssymb 内部会加载 amsfonts,不需要另行写 amsfonts

amssymb(更准确地说是 AMSFonts)还增加了两套数学字母表:通过 \mathbb{...} 使用的 blackboard bold,以及通过 \mathfrak{...} 使用的 Fraktur (Gothic)\mathbb{R}\mathbb{C}\mathbb{Z} 分别给出表示实数、复数和整数的空心粗体 R、C、Z。不过要注意,blackboard bold 只有大写字母,没有小写字母或数字。Fraktur 则有大小写两套,因此可以用 \mathfrak{g} 表示李代数 g,用 \mathfrak{p} 表示素理想 p。

latex
\[
  \mathbb{R} \subset \mathbb{C}, \qquad
  \mathfrak{g} = \operatorname{Lie}(G)
\]

这个例子用空心粗体表示实数 R 包含于复数 C,然后把李群 G 的李代数写成 Fraktur 的 g。由于 \mathbb\mathfrak 是 AMSFonts 功能,如果只需要字体而不需要符号,\usepackage{amsfonts} 就足够;但通常也会用到符号,因此加载 amssymb 更稳妥。

数学中的文本 — \text

在数学模式中,每个字母都会被当作变量,因此输入 area 会得到四个变量的乘积。若要在公式中放入 普通词语,并以直立体和正确字距排版,使用 amsmath(准确说是其包含的 amstext)提供的 \text{...}。括号内的字符串会按正文相同的字体和间距排版。

\text 的优点是 会感知大小。较旧的 \mbox{...} 也能把直立文本放入数学中,但即使在下标或上标里仍保持正文大小,与周围较小的字符不协调。\text 会按上下文缩小:在下标中变成脚本大小,在二级脚本中更小。它的名字也直接说明了用途。

latex
\[
  f(x) = x^2 \quad \text{for all } x \in \mathbb{R},
  \qquad v_{\text{max}} = 3.
\]

这里,公式右侧的 \text{for all } 以直立体和正文大小排版(末尾空格会生效),而 v 的下标 \text{max} 则以直立体 缩小到脚本大小。如果用 \mbox,后者会相对周围显得过大。注意,在 \text{...} 内再写 $...$,那一部分会切回数学模式。

命名算子 — \operatorname\DeclareMathOperator

\sin\log\lim 这样的函数名在标准 LaTeX 中已预定义,会以直立体和适当间距排版。但不在列表中的算子,如 rankHomess sup 等,需要自己定义。amsmath(其包含的 amsopn)中的两个命令负责处理这件事。

如果只是临时排一次直立算子,使用 \operatorname{...}。例如写 \operatorname{rank} Arank 会以直立体排版,并在后面带有正确的算子间距,不会与随后的 A 过近或过远。如果同一个算子会反复使用,更整洁的做法是在导言区用 \DeclareMathOperator{\rank}{rank} 定义一次,正文中写 \rank\DeclareMathOperator 只能用于导言区,不能在正文中使用。

这两个命令都有 带星号形式,会改变脚本的位置。不带星号的 \operatorname / \DeclareMathOperator 会把下标放在算子的 右下方(与 \log 相同)。带星号的 \operatorname* / \DeclareMathOperator* 在 display style 中把下标放在算子 正下方,即与 \lim\sup\max 相同的“limits”位置。带下方指标的 argmaxargmin 等应使用带星号形式定义。

latex
% プリアンブル / in the preamble
\DeclareMathOperator{\rank}{rank}
\DeclareMathOperator*{\argmax}{arg\,max}

% 本文 / in the body
\[
  \rank A \le n, \qquad
  \hat{x} = \argmax_{x \in S} f(x)
\]

这里在导言区定义了两个算子。正文中的 \rank A 会把 rank 直立排版;而 \argmax 位于陈列公式中,因此 x ∈ S 会放在 arg max 正下方(因为它用带星号形式定义)。定义中的 \,argmax 之间的细空格,使 arg max 看起来像两个词。

对齐中的文本与堆叠下标

下面两个命令常与对齐环境和大型算子配合使用。首先,\intertext{...} 可以在 align 这样的多行陈列公式 中间插入一行文本,同时保持对齐。如果直接关闭环境、写文本、再重新打开,前后的对齐位置就会错开。使用 \intertext,即使插入文本,上下两行的 & 列仍会保持对齐。

latex
\begin{align}
  A &= B + C \\
  \intertext{ここで $C$ を展開すると / expanding $C$ gives}
  A &= B + D + E
\end{align}

这个例子在两个等式之间插入一行说明“expanding C gives”,但 A &= 中的 = 在上下仍保持对齐。\intertext 只在 align 等对齐环境内部有意义(这些环境本身的细节见单独页面)。

另一个命令 \substack{...} 用于在求和、乘积等 大型算子下方堆叠多行条件,各行用 \\ 分隔。例如,要在求和号下方分两行放置“0 ≤ i ≤ m”和“0 < j < n”时使用它。subarray 环境功能类似,并且还可接受 l(左对齐)等对齐指定。

latex
\[
  \sum_{\substack{0 \le i \le m \\ 0 < j < n}} a_{ij}
\]

这里,两个条件分两行堆叠在求和号下方,表示在该范围内对 a_{ij} 求和。\substack 内部仍是数学模式,因此 \le 等关系符号照常可用。

分数、二项系数与编号控制

分数命令 \frac 本身属于标准 LaTeX,但 amsmath 增加了 固定样式变体\dfrac{...}{...} 无论上下文如何都以 display style(大分数)排版,\tfrac{...}{...} 则始终以 text style(小分数)排版。想让正文中的分数变大时用 \dfrac,想在陈列公式中把某一部分缩小时用 \tfrac 很方便。连分数可用 \cfrac{...}{...},无论嵌套多深,每一层都保持易读大小。

二项系数可用 \binom{n}{k},它会把 n 和 k 竖直排列在圆括号中,排成组合数符号。它也有固定样式形式:\dbinom(始终 display style)和 \tbinom(始终 text style)。

latex
\[
  \binom{n}{k} = \dfrac{n!}{k!\,(n-k)!}
\]

这里左边是二项系数(圆括号中 n 在 k 上方),右边是用 \dfrac 放大的分数 n!/(k!(n−k)!)。分母中的 \, 是阶乘符号和括号之间的细空格。

在编号方面,\numberwithin{equation}{section} 很方便。把它写在导言区会 把公式编号绑定到节编号,每进入新节就重置公式计数器。例如第 2 节的第一个公式会编号为“(2.1)”。这是避免长文档中的公式编号增长到三位、四位的常用设置。

除此之外,amsmath 还提供许多功能:矩阵环境(pmatrixbmatrix 等)、自动调整大小的定界符、陈列公式的对齐环境,以及通过 \boldsymbol 实现的数学粗体。矩阵见“Matrices & arrays”,对齐环境见“Displayed, aligned & numbered equations”,求和与大型算子见“Sums, integrals & big operators”。

导言区应写什么

实际使用中,任何包含数学内容的文档通常都会把下面三行一起放在导言区:amsmath(排版机制)、amssymb(符号以及 blackboard bold 和 Fraktur),以及用于定理和证明环境的 amsthm。加载顺序大体自由,只需注意 amsthm 应放在 amsmath 之后。

document.tex
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\begin{document}
\[
  \zeta(s) = \sum_{n=1}^{\infty} \frac{1}{n^{s}}, \qquad s \in \mathbb{C}
\]
\end{document}

这个最小示例加载三个包,然后把黎曼 zeta 函数的定义排成陈列公式:求和号下方有 n=1,上方有 \mathbb{C} 会把复数域 C 渲染为空心粗体。amsthm 提供的 theoremproof 等定理环境是独立主题,在“Theorems & proofs (amsthm)”页面中介绍。

作用主要提供内容
amsmath数学排版机制对齐环境、\text\operatorname\dfrac\binom
amssymb符号和数学字母表数百个 msam/msbm 符号、\mathbb\mathfrak(内部加载 amsfonts)
amsfonts仅字体\mathbb\mathfrak(不含额外符号)
amsthm定理和证明环境\newtheoremproof 环境、\theoremstyle