3. 矩阵及类似环境
amsmath 包中定义了若干用于排版矩阵类结构的环境。它们在语法和布局上都类似于标准 LaTeX 的 array 环境。一般来说,各种二维数学结构和表格布局都可以用数组来描述。
三种环境 — cases、matrix 和 pmatrix — 替代了标准 LaTeX 的相应命令。标准命令使用不同的记法,因而不能与这里介绍的环境形式混用。若使用旧的命令,amsmath 包会产生错误信息。相反,如果在未加载该包的情况下尝试使用 amsmath 环境形式,最常见的错误信息是:"Misplaced alignment tab character &"。
3.1. cases 环境
cases 环境用于处理单个方程有多个变体的情形,这类构造在数学中非常常见。它生成一个两列的数组,且两列左对齐。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3\begin{equation}
4P_{r - j} = \begin{cases}
5 0 & \text{if $r - j$ is odd,} \\
6r! \, (-1)^{(r - j)/2} & \text{if $r - j$ is even.}
7\end{cases}
8\end{equation}
请注意 \text 命令的使用以及文字串中的“嵌入数学模式”。
3.2. 矩阵环境
矩阵环境与 LaTeX 的 array 不同,它们不接受指定列格式的参数,而是提供默认格式:最多 10 列居中对齐。其间距也略有不同于 array 的默认设置。下面的示例演示了 matrix、pmatrix、bmatrix、Bmatrix、vmatrix 和 Vmatrix 环境。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3\begin{gather*}
4\begin{matrix} 0 & 1 \\ 1 & 0 \end{matrix} \quad \begin{pmatrix} 0 & -i \\ i & 0 \end{pmatrix} \\
5\begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} \quad \begin{Bmatrix} 1 & 0 \\ 0 & -1 \end{Bmatrix} \\
6\begin{vmatrix} a & b \\ c & d \end{vmatrix} \quad \begin{Vmatrix} i & 0 \\ 0 & -i \end{Vmatrix}
7\end{gather*}
MaxMatrixCols 计数器决定矩阵环境中列的最大数量。可以使用 LaTeX 的标准计数器命令进行修改。\arraycolsep 长度参数的值决定列之间的间距。和普通数组一样,数组两侧不会额外添加间距。更多列会增加 LaTeX 的工作负担并占用更多资源。不过,将 MaxMatrixCols 设置为 20 或更高是可行的,且对现代 TeX 实现来说几乎没有性能影响。
1\usepackage{amsmath}
2\setcounter{MaxMatrixCols}{20}
3% -------------------------------------------------------------------------------
4\[
5\begin{Vmatrix}
6\,a&b&c&d&e&f&g&h&i&j &\cdots\,{} \\
7&a&b&c&d&e&f&g&h&i &\cdots\,{} \\
8& &a&b&c&d&e&f&g&h &\cdots\,{} \\
9& & &a&b&c&d&e&f&g &\cdots\,{} \\
10& & & &\ddots&\ddots&\hdotsfor[2]{5}\,{}
11\end{Vmatrix} \]
在本例中使用 \hdotsfor 命令生成跨越若干列的点阵行。可选参数(此处为 2)用于指定默认间距(3 个数学单位)之间的倍数。行末的细间距 \,{} 与大括号组仅用于美化布局;它们一起产生约 6mu(或 1/3 em)的细间距。
若要在文本中使用小型行内矩阵,可使用 smallmatrix 环境。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3To show the effect of the matrix on surrounding lines inside a paragraph, we put it here:
4$ \left( \begin{smallmatrix}
51 & 0 \\ 0 & -1
6\end{smallmatrix} \right) $
7and follow it with enough text to ensure that there is at least one full line below the matrix.
请注意,尽管小矩阵所在行前的文字包含下沉字符,文本行仍保持原样,没有被拉开。
3.3. 在下标和上标中堆叠
有时需要在下标或上标中排版多行。可以使用带有 \\ 换行的 \substack 命令。
subarray 环境稍微更通用,允许将行左对齐或右对齐,而不是居中。
1\usepackage{amsmath}
2% -------------------------------------------------------------------------------
3\begin{gather}
4\sum_{\substack{0 \le i \le m \\ 0 < j < n}} P(i, j) \\
5\sum_{\begin{subarray}{l}
6i \in \Lambda \\
70 \le i \le m \\
80 < j < n
9\end{subarray}} P(i, j)
10\end{gather}
注意:这两个环境在作为下标或上标出现时必须用大括号包裹。
3.4. 交换图(Commutative diagrams)
amscd 包提供了一些用于基于数组生成简易交换图的命令。它提供了若干简写形式来指定装饰箭头及其他连线。但该包有局限性——例如,只能绘制水平或垂直的连线。
在 CD 环境中,记号 @>>>、@<<<、@VVV、@AAA 分别生成向右、向左、向下和向上的箭头。下面的示例还演示了 \DeclareMathOperator 命令的使用。
1\usepackage{amsmath,amscd}
2\DeclareMathOperator\add{add}
3\DeclareMathOperator\cf {cf}
4\DeclareMathOperator\cov{cov}
5\DeclareMathOperator\non{non}
6% -------------------------------------------------------------------------------
7\[ \begin{CD}
8\cov (L) @>>> \non (K) @>>> \cf (K) \\
9@VVV @AAA @AAA \\
10\add (L) @>>> \add (K) @>>> \cov (K) \\
11\end{CD} \]
下面说明如何指定装饰。对于水平箭头,第一次和第二次 >(或 <)之间的内容会被排成上标,第二次和第三次之间的内容会被排成下标。类似地,垂直箭头中第一次和第二次、第二次和第三次 A(或 V)之间的内容会被排成左/右侧标(side‑script)。下例将展示这种格式的实际使用。
记号 @= 与 @| 分别产生水平和垂直的双线。
如果不想显示实际的箭头,可以使用 “空箭头” @. 来填充需要的数组位置。
1\usepackage{amsmath, amscd}
2\DeclareMathOperator{\End}{End}
3% -------------------------------------------------------------------------------
4\[ \begin{CD}
5S^{W_\Lambda}\otimes T @>j>> T \\
6@VVV @VV{\End P}V \\
7(S \otimes T)/I @= (Z\otimes T)/J
8\end{CD} \]
相同的布局也可以用标准 LaTeX 实现,但效果不佳。
1\[\begin{array}{ccc}
2S^{\mathcal{W}_\Lambda}\otimes T & \stackrel{j}{\longrightarrow} & T \\
3\Big\downarrow & & \Big\downarrow\vcenter{\rlap{$\scriptstyle{\mathrm{End}}\,P$}} \\
4(S\otimes T)/I & = & (Z\otimes T)/J
5\end{array}\]
本例清楚地说明了 amscd 包能够产生更好结果的原因:语法更简洁,水平箭头更长,元素间距也有显著提升。更专业的宏包还能帮助你实现更精美的排版。
3.5. 用 delarray 包为数组加定界符
本节介绍 array 包的一个实用扩展——delarray。使用该扩展,用户可以为数学 array 环境指定可伸缩的左、右定界符。下面给出一个示例:
1\usepackage{delarray}
2% -------------------------------------------------------------------------------
3\[ \mathcal{Q} =
4\begin{array}[t] ( {cc} ) X & Y \end{array}
5\begin{array}[t] [ {cc} ] A & B \\ C & D \end{array}
6\begin{array}[b] \lgroup{cc}\rgroup L \\ M \end{array}
7\]
注意:
delarray包独立于amsmath,但若有需要会自动加载array包。
定界符位于 {cc} 两侧。
该示例还展示了 delarray 包最有用的功能之一:[t] 与 [b] 可选参数,这在 amsmath 的矩阵环境中是不被允许的。这表明 delarray 的语法并不等同于在 array 环境外使用 \left 与 \right,因为定界符会随数组本身一起提升。