我为我的好奇构造MWE...
in amsmath
docs:align
环境介绍如下:
The align environment is used for two or more equations when vertical alignment is desired;
alignat
环境介绍如下:
A variant environment alignat allows the horizontal space between equations to be explicitly specified. This environment takes one argument, the number of “equation columns” (the number of pairs of right-left aligned columns; the argument is the number of pairs): count the maximum number of &s in any row, add 1 and divide by 2.
群友提供了一个问题:
\documentclass{ctexart}
\usepackage{amsmath}
\begin{document}
使用\verb|align|环境(单锚点对齐需求)
\begin{align}
2&x_1+4&x_2&=2\\
4&x_1+11&x_2&=1
\end{align}
一种解决办法是使用\verb|alignat|环境(多锚点对齐需求)
\begin{alignat}{2}
2&x_1+4&x_2&=2\\
4&x_1+11&x_2&=1
\end{alignat}
我更想知道的是,在"所有"设计对齐的公式排版需求中, \verb|align|和\verb|alignat|适用范围的差别?
例如下例中, 雾月使用\verb|alignat|实现的, 使用\verb|align|能否可以(简便地)实现同样的效果。
\[
\left\{\begin{alignedat}{3}
% 这里的 {} 是为了保持+的间距,并不优雅
3\lambda &x_{1} +{}&(2\lambda +1) &x_{2} +{}&(\lambda+1) x_{3} &=\lambda\\
(2\lambda+1) &x_{1} +{}&(2\lambda +1) &x_{2} +{}&(\lambda-2) x_{3} &=\lambda+1\\
(4\lambda-1) &x_{1} +{}& 3\lambda &x_{2} +{}& 2\lambda x_{3} &=1
\end{alignedat}\right.
\]
另外一个比较复杂的需求是, 需要同步对齐变量, 如下效果. 使用哪一种方法可以\textbf{尽量减少}输入\verb|&|作为锚点的\textbf{次数}。
\begin{equation}
\left\{
\begin{alignedat}{10}
0.1&\pi_1 +{}& 0.3&\pi_2 +{} 0.1&\pi_3 & & & &{}= \pi_1 \\
0.1&\pi_1 +{}& 0.2&\pi_2 +{} 0.2&\pi_3 &{}+ 0.1&\pi_4 +{} 0.1&\pi_5 &{}= \pi_2 \\
0.3&\pi_1 +{}& 0.2&\pi_2 +{} 0.4&\pi_3 &{}+ 0.2&\pi_4 +{} 0.1&\pi_5 &{}= \pi_3 \\
0.5&\pi_1 +{}& 0.2&\pi_2 +{} 0.2&\pi_3 &{}+ 0.4&\pi_4 +{} 0.4&\pi_5 &{}= \pi_4 \\
& & 0.1&\pi_2 +{} 0.1&\pi_3 &{}+ 0.1&\pi_4 +{} 0.4&\pi_5 &{}= \pi_5
\end{alignedat}
\right.
\end{equation}
\end{document}
雾月大佬的一个回答采用了这种alignat
的多锚点对齐方式,是否可以用align
实现之。
align
和它的不带标号的版本 align*
可以排列多列对齐的公式,列与列之间用 &
分隔,而且在 &
左右的公式分别按照右对齐、左对齐的方式排列,所以很多人在用多个 &
时就从观感上容易产生很大的间距,相信这点你已经知道。在使用时,&
一般会放 =
的前面:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
x &= t & x &= \cos t & x &= t^2 \\
y &= 2t & y &= \sin(t+1) & y &= e^t
\end{align*}
\end{document}
当然有时也可以放在二元运算符前面,只不过这时我通常会这么用(lshort-zh-cn
中也有类似的用法)
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align*}
(a+b)^2 ={}& a^2 + b^2\\
& + 2ab
\end{align*}
\end{document}
alignat
及不带标号的 alignat*
则不在列与列之间产生间距,但可以手工增加间距。alignat
环境有一个参数,表示每行要对齐的公式个数,每两列一组,如下面把列间距设定为一个 \quad
的距离
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{alignat*}{2}
x &= \sin t & \quad & t \ge 0 \\
y &= \cos t & & t < 0
\end{alignat*}
\end{document}
看第2行第3列我没用 \quad
,但是间距依然保留下来,这是因为上一行的 \quad
位置必须在每一行都有所体现。它的这种特性就非常适合排版线性方程组
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{alignat*}{6}
& x_1 & & + x_2 & & +x_3 & &+ x_4 & &+ x_5 & &=1 \\
& x_1 & & & & +x_3 & & & & + x_5 & &=2 \\
& & & \mathbin{\phantom{+}}x_2 & & & & +x_4 & & & &=3
\end{alignat*}
\end{document}
关于 \mathbin
,可以参考 tex.stackexchange.com 的解释。\phantom
则是产生一个幻影。
谢谢! 多锚点间隔的出现是由于 在
&
左右的公式分别按照右对齐、左对齐的方式排列关于
alignat
和align
的关系,@Srik Wang指出:没有portable
的方法使用align
方法实现alignat
的效果,但理论上只要能魔改align
可以实现任何alignat
的功能。特别感谢 OsbertWang 和 SrikWang 的慷慨指导。