加载 amsmath 并开始排版数学后,很快会遇到一些差一点够不着的需求::= 中的冒号略微偏低,跨一行的长箭头想在上下都放标签,绝对值的竖线想随内容高度自动伸缩。mathtools 正是处理这些问题的宏包。它是一个加载 amsmath 并在其上增强的扩展包,因此一行 \usepackage{mathtools} 也会同时加载 amsmath。本页依次介绍最常用的新增功能:正确的 :=、可伸缩箭头 \xrightarrow、直角的 \overbracket、自动调整的 \DeclarePairedDelimiter、零宽度的 \mathclap、前置上下标 \prescript,以及通过 matrix* 实现列对齐的矩阵。
mathtools 是什么
按照官方手册的说法,mathtools 是“amsmath 的扩展宏包”。它以 amsmath 作为数学排版事实标准为前提,修补 amsmath 仍然存在的一些不足和问题,并添加日常排版中很实用的工具。关键点是 mathtools 内部需要 amsmath,并会自动加载它。因此不必另写 amsmath,导言区这一行就够了。
\usepackage{mathtools}如果想把选项传给 amsmath,mathtools 会原样转发。正如手册所示,\usepackage[fleqn,tbtags]{mathtools} 等价于先写 \usepackage[fleqn,tbtags]{amsmath},再写 \usepackage{mathtools}。也就是说,加载 mathtools 时给出的选项也会传到下面的 amsmath。
mathtools 的功能范围很广,本页无法全部涵盖。这里聚焦于使用频率高的新增功能,也就是奥村《LaTeX2e 美文書作成入門》这类参考书也会提到的内容。它还有扩展分段情况(dcases)、控制公式编号(showonlyrefs)、在对齐环境中插入箭头(\ArrowBetweenLines)等功能;但对齐相关细节留给“陈列、对齐与编号公式”页面。
另外,mathtools 内部还依赖一个名为 mhsetup 的小型辅助宏包,它支撑 \DeclarePairedDelimiter 的成对定界符机制等功能。TeX Live 等主要发行版都随附它,因此通常无需特别在意。当前维护由 Lars Madsen 接手,最新版发布在 CTAN 上。
漂亮的定义号 — \coloneqq 系列
在数学模式中直接输入定义用的“:=”,结果会比预想更笨拙。: 会被当作标点,而不是关系符,因此前后间距不对,而且冒号会比 = 的中心线稍低。mathtools 的 \coloneqq 会把冒号相对于等号居中到正确高度,并以关系符的正确间距排出“:=”。反向的“=:”使用 \eqqcolon。
\[
f(x) \coloneqq x^2 + 1, \qquad y \eqqcolon g(x)
\]这个例子中,左式排出表示“把 f(x) 定义为 x²+1”的 :=,右式排出表示“把 g(x) 写作 y”的 =:,二者的冒号都整齐居中。此外还有双冒号 \dblcolon(::),以及把冒号与近似或相似组合的 \colonapprox、\colonsim 等。
有一点需要注意。在 2022 年的更新中,mathtools 规范了这些冒号符号的正式名称,以便与其他宏包保持一致。熟悉的 \coloneqq、\eqqcolon 等旧名称仍为兼容而可用,但在新体系中 \coloneq 等才是正式形式。旧名称被保留,是为了让已有文档继续编译。
可伸缩箭头 — \xrightarrow 与 \xleftarrow
普通的 \rightarrow(→)和 \Rightarrow(⇒)长度固定;如果上方标签比箭头更宽,就会很难看。amsmath 只提供两个会随标签横向伸长的箭头:\xrightarrow 和 \xleftarrow。语法是 \xrightarrow[下方标签]{上方标签},其中花括号 { } 的内容放在箭头上方,方括号 [ ] 的内容放在箭头下方(方括号可省略)。箭头会自动伸到标签宽度。
\[
A \xrightarrow{f} B \xrightarrow[\sim]{g} C,
\qquad
X \xleftarrow[n \to \infty]{\varphi_n} Y
\]在这个例子中,从 A 到 B 是上方带 f 的向右伸缩箭头;从 B 到 C 是上方带 g、下方带 ∼ 的箭头,二者都会随标签宽度伸长。右侧是向左箭头,上方是映射 φ_n,下方是极限条件 n→∞。
amsmath 只提供这两个可伸缩箭头,但 mathtools 按照同一命名规则大幅扩展了这个家族:双线的 \xRightarrow、\xLeftarrow、\xLeftrightarrow,双向的 \xleftrightarrow,带钩的 \xhookrightarrow、\xhookleftarrow,映射箭头 \xmapsto,以及 harpoon(半边箭头)和更长的 \xlongrightarrow 等。它们都使用相同的 [下]{上} 写法。
直角括线 — \overbracket 与 \underbracket
标准 LaTeX(以及 amsmath)提供 \overbrace 和 \underbrace,用于在表达式上方或下方绘制花括号形括线。mathtools 又添加了 \overbracket 和 \underbracket,绘制的是直角括线:不是圆润的花括号形状,而是两端以直角折下或折上的“⌜ ⌟”式括线。在标示图式或结构范围时,这种形状有时更清晰。
\overbracket 有两个可选参数:第一个是线条粗细,第二个是括线高度,顺序为 \overbracket[线条粗细][高度]{内容}。默认情况下,线条粗细与 \overbrace 相同(约 5/18 ex),高度约为 0.7 ex,这些数值适合各种字号。只有需要改变粗细或高度时才写方括号。上方说明与花括号形式一样用 ^{ } 添加,下方则用 _{ }。
\[
\underbracket{a + b + c}_{\text{3 terms}}
\quad\text{vs}\quad
\underbrace{a + b + c}_{\text{3 terms}}
\]这里同一个“a+b+c”在左侧用 \underbracket 得到直角括线,在右侧用 \underbrace 得到花括号形括线,二者下方都附有“3 terms”注记。并排比较时,直角括线和圆润括线的差别很明显。
自动调整的定界符 — \DeclarePairedDelimiter
排版绝对值 |x| 或范数 ‖x‖ 时,如果内容是分数这类较高结构,固定大小的竖线会低于内容高度,显得笨拙。amsmath 手册建议自定义 \newcommand*\abs[1]{\lvert#1\rvert},这虽然能得到正确的水平间距,但当内容像 \abs{\frac{a}{b}} 那样较高时,竖线不会伸长,外观就会失衡。mathtools 的 \DeclarePairedDelimiter 能一次定义这样一对左右定界符,并包含自动伸缩功能。在导言区这样写。
\DeclarePairedDelimiter\abs{\lvert}{\rvert}
\DeclarePairedDelimiter\norm{\lVert}{\rVert}这样定义后,\abs 和 \norm 都有三种用法。第一,普通 \abs{x} 使用固定大小竖线(内容较低时足够)。第二,带星号的 \abs*{x} 用 \left … \right 包住内容,按内容高度自动伸缩。第三,可选参数形式 \abs[\big]{x} 手动指定定界符大小,可从 \big、\Big、\bigg、\Bigg 四档中选择。
\[
\abs{x} = \abs{-x}, \qquad
\abs*{\frac{a}{b}} = \frac{\abs{a}}{\abs{b}}, \qquad
\norm[\big]{v}
\]在这个例子中,\abs{x} 和 \abs{-x} 是普通大小的竖线,\abs*{\frac{a}{b}} 是伸到分数高度的竖线,\norm[\big]{v} 是放大一个 \big 档位的双竖线。定界符机制本身也可参见“定界符(\left \right)”页面。
零宽居中与前置上下标
再合并看三个常用工具。第一个是 \mathclap。当放在求和或乘积下方的条件比算子本身更宽时,这个宽度会让整个公式两侧产生额外空白。\mathclap{…} 会把内容放入零宽度盒子并左右对称居中,因此条件仍可见,而公式宽度保持为算子本体的宽度。还有左对齐和右对齐版本 \mathllap、\mathrlap,以及文本模式的 \clap。
\[
\sum_{\mathclap{1 \le i \le j \le n}} a_{ij}
\]在这个例子中,求和符号下方有“1 ≤ i ≤ j ≤ n”这个很宽的条件;由于用 \mathclap 包住,条件会居中叠在求和符号下,公式左右不会留下多余空白。去掉 \mathclap 后,求和符号前后会按长条件的宽度被拉开。
第二个是 \prescript,它会在符号前方(左侧)放置上标和下标。它有三个参数,顺序为 \prescript{前置上标}{前置下标}{主体}。这对化学同位素记法和使用左指标的数学记法很方便。例如铀 238 会把质量数 238 写成前置上标,把原子序数 92 写成前置下标。
\[
\prescript{238}{92}{\mathbf{U}}, \qquad
\prescript{n}{}{C}_{k}
\]在这个例子中,左边是铀的同位素记法:238 位于元素符号 U 的左上,92 位于左下;右边则把 n 放在 C 的左上,同时像通常一样在右下加 k。不需要前置下标时,第二个参数留空为 {}。
第三个是 \shortintertext。amsmath 的 \intertext 可以在保持对齐的同时把文字插入行间,但上下空白有时略显过宽。\shortintertext{…} 是它的紧凑版本,适合在行间加入短注释。\intertext 和 \shortintertext 都也可以在 gather 环境中使用。
列对齐矩阵 — matrix* 系列
amsmath 的矩阵环境(matrix、pmatrix、bmatrix 等)会把每一列始终居中。当有负号和没有负号的元素混在一起时,居中会让数字列对不齐,读起来不舒服。mathtools 提供对应的带星号环境 matrix*、pmatrix*、bmatrix*、Bmatrix*、vmatrix*、Vmatrix*,并允许使用可选参数选择列对齐方式。写成 \begin{pmatrix*}[r],给出与 array 环境相同的列说明符(r、l、c);默认是 c。
\[
\begin{pmatrix*}[r]
-1 & 3 \\
2 & -4
\end{pmatrix*}
\]在这个例子中,圆括号矩阵的每一列都右对齐,因此 -1 与 2、3 与 -4 的数字右端对齐,负号自然向左伸出。若使用标准 pmatrix,各元素会居中,数字看起来会因负号宽度而错位。矩阵本身的基础请参见“矩阵与数组”页面。
设置选项 — \mathtoolsset
mathtools 的许多行为都可以通过开关(true/false 等)调整。集中完成这些设置的命令是 \mathtoolsset{…},通常写在导言区,让设置作用于整个文档。键用逗号分隔,可以写成 key=value,也可以在值显而易见时只写裸键 key。
\mathtoolsset{
showonlyrefs = true,
centercolon
}常用键包括:showonlyrefs=true 只给正文中被引用的公式编号,隐藏未引用公式的编号(不过引用必须使用 \eqref,而不是 \ref)。centercolon 启用把 : 作为关系符放在中心高度的行为。此外还有许多细节键,例如控制小型矩阵变体默认对齐的 smallmatrix-align,以及改变 \prescript 指标字体的 prescript-sub-format / prescript-sup-format。
| 功能 | 命令/环境 | 作用 |
|---|---|---|
coloneqq | \coloneqq / \eqqcolon | 冒号居中的 := / =: |
xrightarrow | \xrightarrow[下]{上} | 随标签伸缩的箭头 |
overbracket | \overbracket / \underbracket | 直角括线(可调粗细/高度) |
DeclarePairedDelimiter | \DeclarePairedDelimiter | 定义自动伸缩的 \abs、\norm |
mathclap | \mathclap / \clap | 零宽度居中(整理下标) |
prescript | \prescript{上}{下}{主体} | 在符号前放置上下标 |
matrix* | matrix* / pmatrix* 等 | 可选择列对齐的矩阵环境 |