如果希尔伯特生活在 TeX 时代,他可能会这样说:
没有人可以把我们从AMS创造的天堂中驱逐出去。
eqnarray
而这个天堂的一个方面就是利用壮丽的align
环境(及其兄弟姐妹)摆脱暴政。
该环境的一个特点align
是,它只需要一对齐字符,例如,
\begin{align*}
x &= y + z \\
a &= b + c
\end{align*}
所有的空间都是正好。
只是偶尔我想将事物与关系符号的另一侧对齐。但自动间距不起作用:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\[
x = y + z
\]
\begin{align*}
x &= y + z
\end{align*}
\begin{align*}
x =& y + z
\end{align*}
\end{document}
显然,我只需添加适量的空间即可。但同样明显的是,需要添加的空间量也应该适量。它是什么?
答案1
为了理解为什么缺少空格,我们需要了解 TeX 如何处理公式以及它在对象之间插入什么间距。
首先,TeX 将公式分解为一系列数学原子,可分为十三种类型
Ord Op Bin Rel 打开 关闭 Punct Inner
上方 下方 Acc Rad Vcent
第二行中的原子实际上被认为是奥德原子间距。例如,$a+b=c$
变为序列
秩序 宾秩序 相关秩序
然后 TeX 根据下表插入空格,其中行和列用数字索引:0 =奥德, 1 =操作, 2 =垃圾桶, 3 =相对, 4 =打开, 5 =关闭, 6 =点,我=内
(该表格取自我的论文“TeX 和 LaTeX 中的数学符号”,ArsTeXnica 8(2009),第 7-24 页;这是 TeXbook 中类似表格的完整版本)。你在行中找到左边的原子,在列中找到右边的原子;然后你找到的数字被解释为
0
= 没有空格1
= 稀薄空间 (\thinmuskip
)2
= 中等空间 (\medmuskip
)3
= 粗空格 (\thickmuskip
)*
= 不可能的组合
如果数字在括号中,则仅当公式(或子公式)最终以显示或文本样式排版时才会插入空格,而不会以下标/上标样式排版。
另一个例子:公式$(a+b)\cdot c=ac+bc$
变成
打开订单 仓位订单 关闭订单 仓位订单 相对订单 订单 仓位订单 订单
子公式是括号内的任何内容;它最终被视为奥德原子。
如何align
猜测正确的间距?当你输入
\begin{align*}
a &= b+c
\end{align*}
LaTeX 基本上使用以下模板将其转换为对齐:
\hfil $\displaystyle #$ & $\displaystyle {}#$ \hfil
其中#
表示单元格的实际内容。因此,第一列右对齐,第二列左对齐,但是空子公式总是添加在实际内容之前。因此,右列中排版的公式是$\displaystyle {}=b+c$
读作
Ord Rel Ord Bin Ord
并且间距刚刚好。
同样的情况也会发生
\begin{align*}
a ={}& b+c \\
a=\mskip\thickmuskip & b+c
\end{align*}
注意明确的间距命令(或规则)不会出现在原子列表中,而是与自动提供的间距一起插入。
\mskip\thinmuskip
、\mskip\medmuskip
和的缩写分别\mskip\thickmuskip
是\,
\:
\;
;\!
是 fo 的缩写\mskip-\thinmuskip
(可以方便地删除自动添加的细空格)。
可以强制将单个符号或子公式视为上述原子类型之一,方法是将其作为参数提供给
\mathord \mathop \mathbin \mathrel \mathopen \mathclose \mathpunct \mathinner
通过添加一个空的子公式,您可以让 TeX 完成它该做的工作,而不需要记住该表。好吧,当我们最终挠头,问那个该死的空间从哪里来或没有出现时,该表在某些棘手的情况下会派上用场。