← 返回首页目录
# 在LaTeX求和符号的下标中对齐等号与非等号
作者:吉祥法师
## 引言
在LaTeX数学排版中,求和符号(如`\sum`)的下标常需要放置多行表达式。`\substack`命令提供了一种便捷的方式来堆叠多行内容,但它有一个明显的局限性:**当下标包含等号(`=`)和不等号(`\neq`)时,这些符号不会自动对齐**。这种错位会削弱公式的数学美感和阅读体验。
具体来说,当用户编写「\sum_{\substack{n=1\\n\neq i}}^N」时,代码会产生上下两行下标,其中第一行的「=1」和第二行的「\neq i」中的符号并不能在垂直方向上对齐。这一问题在学术论文、技术文档中尤为突出,因为排版规范往往要求公式中的等号、不等号等关系符号保持视觉对齐。
## 核心问题分析
### 问题的本质
`\substack`命令本质上是将多个内容简单堆叠,它并不具备表格或数组的对齐功能。因此,当两行内容的长度不同、或者符号位置不居中时,就会出现视觉上的错位。
### 常见解决方案的缺陷
针对这一问题,社区通常提出两种方法:
1. **使用「\hphantom」添加不可见空位**:通过手动插入与第一行等宽的空位,强行让第二行的符号对齐。但这种方法需要预先知道各行的宽度,且当宽度发生变化时必须手动调整,**可维护性极差**。
2. **使用「aligned」环境**:虽然`aligned`能实现精确对齐,但它引入的行间距过大,会破坏下标整体的紧凑性,并可能导致求和符号的定位出现偏差。许多用户反馈,这种方法"ruins the spacing"(破坏了间距),且需要额外的手动修正。
因此,一个理想的对齐方案应满足以下要求:自动对齐关系符号、保持下标空间的紧凑性、不破坏公式的整体布局。
## 高级解决方案详解
### 方案一:自定义「\subalign」命令(推荐)
使用者在TeX Stack Exchange社区中提出了一个优雅的自定义解决方案——定义一个新的命令`\subalign`。该命令在`\substack`的基础上增加了对齐点,允许用户像使用表格一样指定各行内容的对齐位置。
#### 实现代码分析
```latex
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\subalign}[1]{%
\vcenter{%
\Let@
\restore@math@cr
\default@tag
\baselineskip\fontdimen10 \scriptfont\tw@
\advance\baselineskip\fontdimen12 \scriptfont\tw@
\lineskip\thr@@\fontdimen8 \scriptfont\thr@@
\lineskiplimit\lineskip
\ialign{\hfil$\m@th\scriptstyle##$&$\m@th\scriptstyle{}##$\hfil\crcr
#1\crcr
}%
}%
}
\makeatother
```
#### 代码逐步解析
1. **`\vcenter`**:这是关键的外层结构,用于将整个堆叠内容垂直居中。与`\vbox`不同,`\vcenter`会确保结果内容在当前行中垂直居中,这对于求和符号的下标位置至关重要。
2. **字体尺寸设定**:接下来的三行代码用于设定下标内容的行距。
- `\baselineskip\fontdimen10 \scriptfont\tw@`:将基础行距设置为二号脚本字体的第10个参数(通常为字体大小)。
- `\advance\baselineskip\fontdimen12 \scriptfont\tw@`:在此基础上增加二号脚本字体的第12个参数(通常为行距额外增量)。
- `\lineskip\thr@@\fontdimen8 \scriptfont\thr@@`和`\lineskiplimit\lineskip`:设定行间距的阈值,确保行与行之间不会过度压缩或膨胀。
3. **`\ialign`**:这是TeX底层的一个表格对齐宏,是`\halign`的一个变体(带有初始化功能)。它的结构为:
- 模板:`{\hfil$\m@th\scriptstyle##$&$\m@th\scriptstyle{}##$\hfil\crcr #1\crcr}`
- 这个模板定义了两列:第一列右对齐(`\hfil`在左边),第二列左对齐(`\hfil`在右边)。
- 第一列的内容被设置为脚本字体大小(`\scriptstyle`),且使用`$\m@th$`来确保数学模式且取消数学间距修正。
- 第二列在内容前添加了一个空符号`{}`,这是为了确保关系符号(如`=`)前后的间距正确。
4. **`&`符号的作用**:在`\subalign`命令内部,`&`符号用作对齐标记。用户在第一行的等号`=`前放置`&`,在第二行的不等号`\neq`前也放置`&`,这样`\ialign`就会自动将这些标记的位置垂直对齐。
#### 使用示例
```latex
\[
\sum_{\subalign{n&=1\\n&\neq i}}^N
\]
```
在这个示例中,第一行的`&`位于`n`和`=1`之间,第二行的`&`位于`n`和`\neq i`之间。由于`\ialign`的模板设定为第一列右对齐、第二列左对齐,因此两行的`=`和`\neq`符号将会完美对齐。
#### 高级用法与灵活性
`\subalign`命令还可以适应不同宽度的内容:
```latex
\[
\sum_{\subalign{uvw&=1\\n&\neq ijk}}^N
\]
```
在这个例子中,第一行的`uvw`比第二行的`n`长,第二行的`ijk`比第一行的`1`长。由于`\ialign`的动态对齐特性,所有行中的`=`和`\neq`都会自动对齐,无需任何手动调整。
### 方案二:使用「\mathmakebox」进行手动对齐(次选)
对于一些不希望定义新命令的用户,可以使用`mathtools`包提供的`\mathmakebox`命令。
#### 实现代码
```latex
\documentclass{article}
\usepackage{mathtools}
\usepackage{calc} % 用于\widthof
\begin{document}
\[
\sum_{\substack{xyz=1\\
\mathmakebox[\widthof{$xyz$}+2\fboxrule][r]{n} \neq 45}}^N
\]
\end{document}
```
#### 工作原理
1. `\mathmakebox`会创建一个指定宽度的不可见框。
2. `[\widthof{$xyz$}+2\fboxrule]`指定了框的宽度,其中`\widthof{$xyz$}`测量的是第一行等号左侧内容的宽度,`+2\fboxrule`用于补偿框边缘的微小间距。
3. `[r]`选项表示右对齐,这样`n`会紧贴在框的右侧,从而与第一行的`xyz`右对齐。
#### 局限性
**这种方法并不完美**。正如Mico在回复中指出的,当等号右侧的内容长度发生变化时(例如将`45`改为`4545`),`\mathmakebox`无法自动适应。这是因为框的宽度是硬编码的,仅依据等号左侧的内容确定,而无法考虑到等号右侧内容的变化。
### 方案三:自定义数组环境(可选)
另一种思路是创建一个专门的数组环境来替代`\substack`。
#### 实现代码
```latex
\newcolumntype{L}{>{\scriptstyle}l}
\newcolumntype{C}{>{\scriptstyle}c}
\newcolumntype{R}{>{\scriptstyle}r}
\newenvironment{mysubarray}{%
\scriptstyle
\setlength\arraycolsep{0pt}%
\setlength\extrarowheight{-1ex}
\renewcommand\arraystretch{0}
\begin{array}{RCL}}{\end{array}}
```
#### 使用示例
```latex
\[
\sum_{\begin{mysubarray}
xyz&=&1 \\
n&\neq&45
\end{mysubarray}}^N
\]
```
这种方法将下标内容放在一个三列的表格中:左列右对齐(`R`),中间列居中对齐(`C`),右列左对齐(`L`)。通过将等号和不等于号放在中间列,可以实现对齐。
#### 优化与调整
**问题**:数组环境默认的垂直间距过大。
**解决**:通过`\setlength\extrarowheight{-1ex}`和`\renewcommand\arraystretch{0}`来大幅压缩行距,使其接近`\substack`的紧凑感。
## 三种方案对比与总结
| 特性 | \subalign命令 | \mathmakebox | 自定义数组 |
|---|---|---|---|
| 自动对齐 | 完全自动 | 需手动计算宽度 | 自动对齐 |
| 间距自然性 | 最佳(基于\substack) | 良好 | 需调整 |
| 适应性 | 高(适应不同宽度) | 低(宽度硬编码) | 高 |
| 代码复杂度 | 中(需定义命令) | 低(直接使用) | 中(需定义环境) |
| 推荐度 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
### 最终建议
**首选方案**:**`\subalign`**。它不仅完全自动对齐关系符号,而且保持了`\substack`的紧凑间距。其底层的`\ialign`机制确保了最自然的字体尺寸和行距设定。
**使用时机**:对于几乎所有的求和下标多行对齐需求,`\subalign`都是最优解。当需要同时对齐多个关系符号时,它的`&`标记机制也提供了最大的灵活性。
在学术论文、技术文档的排版中,公式的美观性直接影响到文章的阅读体验和专业程度。通过使用`\subalign`命令,作者可以优雅地解决求和符号下标中对齐等号与非等号的问题,无需再依赖繁琐的手动调整或妥协于不完美的视觉效果。这一方案不仅提升了排版质量,也解放了作者的精力,使其能够专注于更有价值的学术内容创作。