7. 布局的预尺寸调整
通常,LaTeX 能很好地排版数学公式。但有时需要对位置进行更细致的调整。本文讨论了一些微调布局的技巧,以使数学公式看起来更好一些。
7.1. 自动尺寸与间距
当数学符号和字母出现在分式、下标或上标中时,它们通常会变小(并且间距更紧)。数学公式可以使用八种 TeX 数学样式进行排版:
| D, D' | \displaystyle | 单独一行显示 |
| T, T' | \textstyle | 嵌入正文 |
| S, S' | \scriptstyle | 在上标或下标中 |
| SS, SS' | \scriptscriptstyle | 在所有更高层级的上标或下标中 |
文本样式(T)用于在行文(\( … \) 或 \( 与 \) 之间)中的公式顶层,而显示样式用于显示公式的顶层($ … $ 或 \[ … \] 之间)。对于子公式,样式可以从下表确定:
| D | S | S' | T | T' |
| D' | S' | S' | T' | T' |
| T | S | S' | S | S' |
| T' | S' | S' | S' | S' |
| S, SS | SS | SS' | SS | SS' |
| S’, SS' | SS' | SS' | SS' | SS' |
以下示例演示了各种样式:
1\normalsize %% Style:
2\[ b %% D
3 ^0 %% S
4 + %% D
5 \frac{(k + p) %% T
6 _{j'} %% S'
7 % \displaystyle
8 \pm %% T [D]
9 \frac{(f + q) %% S [T]
10 ^{(pk) %% SS [S]
11 ^y %% SS
12 _{j'}}} %% SS'
13 {(h + y)}} %% S' [T']
14 {(l + q) %% T'
15 ^{(pk)}} %% S'
16\]
您可以删除 \displaystyle 前的注释字符(%),观察括号中的样式如何改变:

它展示了如何显式指定每一部分使用的样式。
7.2. 子公式
在正文中,一对大括号表示一个组或作用域,其中的声明有效。在数学公式中,它们额外界定了一个子公式,子公式始终作为独立实体排版并加入外层公式。因此,子公式始终以自然宽度排版,TeX 在尝试将公式放入一行时不会在水平上拉伸或收缩它们。我们已经展示过,来自简单大括号组的子公式会被当作单个符号处理。这意味着空组会产生一个不可见的符号,从而改变间距。
下标/上标的内容以及许多(但不是全部)命令的参数,如 \frac 和 \mathrel,也是子公式。因此,它们会得到同样的特殊处理。例如,\bm 的参数并不一定作为子公式排版,这是一个重要的例外。在数学公式中,如果您只想限制声明的作用范围,请使用 \begingroup 和 \endgroup 定义一个组。请记住,专门的数学声明(如样式更改)会一直作用到当前子公式结束,无论是否还有其他组存在。
7.3. 大分隔符
LaTeX 定义了四个命令 — \big, \Big, \bigg, \Bigg — 用于直接控制可伸缩分隔符的大小。它们接受一个可伸缩分隔符作为唯一参数,并生成从 1.2 到 3 倍基准大小的更大版本。
每个命令还有三种变体,分别对应四种 左符号(\bigl, \Bigl, \biggl, \Biggl)、四种 关系符号(\bigm, \Bigm, \biggm, \Biggm)以及四种 右符号(\bigr, \Bigr, \biggr, \Biggr)。所有 16 种命令只能与能跟在 \left, \right 或(使用 eTeX 时)\middle 之后的符号一起使用(见此
table)。
在标准 LaTeX 中,这些分隔符的大小是固定的。然而,使用 amsmath 包时,大小会根据周围材料的字体大小和数学样式自动适应。下面的例子展示了这一点。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3\[ \biggl( \mathbf{E}_{y} \int_0^{t_\varepsilon}
4 L_{x, y^x(s)} \varphi(x)\, ds \biggr) \]
5\Large
6\[ \biggl( \mathbf{E}_{y} \int_0^{t_\varepsilon}
7 L_{x, y^x(s)} \varphi(x)\, ds \biggr) \]
7.4. 调整根号指数的位置
在标准 LaTeX 中,根号符号上的指数位置并不总是很好。不过,您可以使用 amsmath 包中定义的 \leftroot 和 \uproot 命令来调整该指数的位置。正整数参数会分别将指数向左和向上移动,负数参数则向右和向下移动。这些参数的单位是数学单位(非常小),因此这些命令非常适合用于细微调节。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3\[
4 \sqrt[\beta]{k} \qquad
5 \sqrt[\leftroot{2}\uproot{4} \beta]{k} \qquad
6 \sqrt[\leftroot{1}\uproot{3} \beta]{k}
7\]
7.5. 使用 strut 和 phantom 进行微调
每当您想要“完美”地排版数学间距和对齐时,通常最好利用 TeX 原始的独特且高级的功能。这些功能通过一系列与 \phantom 和 \smash 相关的命令提供。它们既可以在数学公式中使用,也可以在正文中使用。
下面来看一个示例:
1\usepackage{amsmath}
2\newcommand\relphantom[1]{\mathrel{\phantom{#1}}}
3\newcommand\ve{\varepsilon} \newcommand\tve{t_{\varepsilon}}
4\newcommand\vf{\varphi} \newcommand\yvf{y_{\varphi}}
5\newcommand\bfE{\mathbf{E}}
6% -------------------------------------------------------------------------------
7\begin{equation} \begin{split}
8 f_{h, \ve}(x, y)
9 &= \ve \bfE_{x, y} \int_0^{\tve} L_{x, \yvf(\ve u)} \vf(x) \,du \\
10 &= h \int L_{x, z} \vf(x) \rho_x(dz) \\
11 &\relphantom{=} {} + h \biggl[
12 \frac{1}{\tve}
13 \biggl( \bfE_{y} \int_0^{\tve} L_{x, y^x(s)} \vf(x) \,ds
14 - \tve \int L_{x, z} \vf(x) \rho_x(dz) \biggr) + \\
15 &\relphantom{=} \phantom{{} + h \biggl[ }
16 \frac{1}{\tve}
17 \biggl( \bfE_{y} \int_0^{\tve} L_{x, y^x(s)} \vf(x) \,ds
18 - \bfE_{x, y} \int_0^{\tve} L_{x, \yvf(\ve s)}
19 \vf(x) \,ds \biggr) \biggr]
20\end{split} \end{equation}
这里,\phantom 命令用于调整水平定位。在导言区,它被用来定义一个宽度等于其参数(这里为 =)的不可见关系符号。在数学环境中,它用于通过在行首放置一个“幽灵”或不可见的子公式来对齐特定行。空的大括号 {} 等同于 \mathord{},会生成一个不可见的零宽度符号,用于让 + h 前的间距正确(如果没有 {},加号会被解释为一元加号,前面的间距会不合适)。
与 \phantom 相对,\smash 命令会把内容(放在 LR‑box 中)排版,但随后忽略它们的高度和宽度,好像它们的高度和宽度都是零。\hphantom 是标准 LaTeX 中的一个组合命令,相当于 \smash{\phantom{some phantom contents}},即生成一个高度为零、宽度为 phantom 内容宽度的不可见框。
\vphantom 类似,但它保持整体高度加深度不变,只把宽度设为零。\mathstrut 被定义为 \vphantom(,产生一个高度和深度与左括号相同、宽度为零的框。
使用 amsmath 包时,\smash 命令可以接受可选参数,使得 \smash[t]{...} 只忽略高度而保留深度,\smash[b]{...} 只忽略深度而保留高度。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3$\sqrt{x} + \sqrt{y} + \sqrt{z}$ \\
4$\sqrt{x} + \sqrt{\mathstrut y} + \sqrt{z}$ \\
5$\sqrt{x} + \sqrt{\smash{y}} + \sqrt{z}$ \\
6$\sqrt{x} + \sqrt{\smash[b]{y}} + \sqrt{z}$
看起来给 y 加一点额外的高度(使用 strut)会让根号看起来更相似。但实际上,它只会让它们看起来更不一致,整体更丑。事实证明,压扁 y 的底部是最好的办法。
下面的例子展示了一个非常常见的使用场景:\smash 命令被用来对周围分隔符的高度进行细致控制。它也说明了当真实行高必须已知时,\smash 可能会导致问题,这时可以使用 \vphantom 来修复。\Hmjd 是这样定义的复合符号:
1\newcommand\Hmjd{\widetilde{\mathcal{H}^2}_{MJD}(\chi)}为显示产生的垂直空间,我们添加了规则:
| Appearance | Code | Comment |
|---|---|---|
![]() | \left( {\Hmjd } \right) | 外部括号太大 |
![]() | \left( \smash{\Hmjd } \right) | 外部括号太小且规则太近 |
![]() | \left( \smash[t]{\Hmjd } \right) \vphantom{\Hmjd} | 刚好合适! |
![]() | \left( \smash[t]{\Hmjd } \right) | 需要同时使用 \vphantom 和部分压扁 |
在少数情况下,低层次的 TeX 处理可能会在细节排版上出现错误。尤其是在以下布局中会出现: (a) 子公式(分式的分子/分母或上下标)恰好是唯一的 LR‑box,或类似构造的数学盒子;以及 (b) 该盒子并未拥有其自然尺寸,例如更复杂的
\makebox、压扁和某些 phantom。
为了看到这一点,我们来看下面的例子:
1\[
2\sqrt{ \frac{a+b}{x_j} } \quad
3\sqrt{ \frac{a+b}{\smash{x_j}} } \quad
4\sqrt{ \frac{a+b}{{}\smash{x_j}} } \quad
5\sqrt{ \frac{a+b}{\smash{x_j+b}} }
6\]
为了降低根号的深度,在第二个根号里加入了 \smash,但没有效果。第三个根号使用了空的大括号组后起效。但在第四个根号中根本不需要空的大括号组。总之,当 \smash 无效时,尝试在孤立的盒子前加一个空的数学子公式({}),以促使正确处理。
7.6. 水平间距
更细致且更困难的调节需要使用下表所示的显式间距命令:

这些命令的全称和简写形式都很稳健,且可以在数学公式之外的普通文本中使用。它们与上世纪中叶用于排版数学的机器上可用的细、中、粗空间有关。
三个 TeX 参数 \thinmuskip、\medmuskip 和 \thickmuskip 的当前值决定了这些 \..space 命令所添加的空间量。它们在使用 amsmath 时的默认值列在表中。这些低层参数的取值必须使用数学单位(mu)给出,不能通过 \setlength 或类似方式设置。此外,通常不应修改它们的取值,因为 TeX 的数学排版内部会使用它们(见下表)。

表中,0 表示“无间距”,1 表示
\thinmuspace,2 表示\medmuskip,3 表示\thickmuskip,* 表示“不可实现”。加粗的条目表示对应的间距在数学脚本样式中不会被添加。
一个数学单位(1mu)等于当前数学字体尺寸的 1/18 个 em。因此,mu 的绝对值会随数学样式而变化,从而在不同样式下保持一致的间距。



