alignedat
有一个强制性论点。但赫伯特(在他的mathmode.pdf
)中写道:
我进行了反复试验,发现可以传递的最大数字是 1073741823,并且没有发生失败。
\documentclass[twocolumn]{article}
\usepackage[a4paper,margin=1cm]{geometry}
\usepackage{amsmath}
\begin{document}
\begin{enumerate}
\item The degree of (C) is 3.
\item The degree of (A) is 1.
\item%
$\!
\begin{alignedat}[t]{1073741823}
-3x(x+1)&-2x(x-1)\\
&+4(x^2-3x-1)
&&=\rlap{$-3x^2-3x-2x^2+2x+v$} \\
& &&\hphantom{{}={}}{+}4x^2&&-12x-4\\
& &&=-3x^2 &&-3x-2x^2+2x+v \\
& && &&+4x^2-12x-4 \\
& &&=\rlap{$-x^2-13x-4$}
\end{alignedat}
$
\end{enumerate}
\end{document}
我的问题:这个论点是为了什么?如果没有必要,为什么它是强制性的?我认为这应该是一个可选论点。
答案1
“对齐”环境的定义是
\newenvironment{alignat}
{\start@align\z@\st@rredfalse}
{\endalign}
\newenvironment{xalignat}
{\start@align\@ne\st@rredfalse}
{\endalign}
\newenvironment{xxalignat}
{\start@align\tw@\st@rredtrue}
{\endalign}
\newenvironment{align}
{\start@align\@ne\st@rredfalse\m@ne}
{...}
\newenvironment{flalign}
{\start@align\tw@\st@rredfalse\m@ne}
{\endalign}
的第一个参数\start@align
(有三个)是一个数字,表示需要哪种类型的对齐方式,与列间距有关;第二个参数声明\ifst@rred
应该是什么意思(* 变体当然有\st@rredtrue
),第三个参数是列组的数量,-1
对于align
和flalign
没有预定义数量的列组,它是。在的情况下alignat
,第三个参数是(明显的)参数(对于和也是\begin{alignat}
一样)。xalignat
xxalignat
列数(如果设置的话)对于以后容纳方程式编号的测量很重要。
有人可能会说参数 to\begin{alignat}
并不是真正必要的,但由于人们使用环境来明确说明(两组)列之间的间距,因此数字对于让用户确定他们在哪里以及是否忘记了非常有用\\
。也许该参数可以设为可选的,但它amsmath
是 AMS-TeX 的直接后代,其中不使用可选参数;因此语法被保留了下来,我认为它有很好的用途。
因为是它alignedat
的“内部”版本alignat
必须具有相同的语法。并且对其实用性的考虑也相同。
答案2
嗯,我找到了一个理由不是使用较大的数字作为强制参数,而不是指定确切地精确的数字:这样如果意外忘记了\\
行尾的尾标,就会发出错误消息。使用较大的数字不会导致错误消息:
笔记:
现在我重新阅读了这些评论,我认为这是沃纳和休斯在他们的评论中,但直到我刚才真正遇到这个问题时我才明白这一点。
下面的例子使用了
alignat*
,但alignedat
表现出了类似的问题。
代码:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\noindent
This will flag an error \verb|Package amsmath Error: Extra & on this line| if the double backslash is missing:
\begin{alignat*}{3}
v_5 &= v_4 - v_3 +1 &&= 1 - 3 +1 &&= 1, \\
v_6 &= v_5 - v_4 +1 &&= 1 - 1 +1 &&= 0,
\end{alignat*}
But if a large number is used \LaTeX will happily typeset it without warning:
\begin{alignat*}{999}
v_5 &= v_4 - v_3 +1 &&= 1 - 3 +1 &&= 1,
v_6 &= v_5 - v_4 +1 &&= 1 - 1 +1 &&= 0,
\end{alignat*}
\end{document}
答案3
简短回答:参数必须是-1
。(但大家应该对我的回答持保留态度,因为“用户”的文档完全缺失,“开发人员”的文档与代码不匹配,而且代码难以理解。)
长答案:首先,有一种align
具有微型防呆功能的变体:
- 环境
xalignat
采用必需的参数; - 当是时
-1
,该环境等同于align
; - 当它为正数时,会检查方程组的数量 — — 如果
&
在一行中输入太多 's 则会发出警告。
注1:我无法想象这会在什么情况下有用——除非参数是1
(我推测最常见的使用情况是align
:有 1 个方程组有 2 个水平部分:第一个向右对齐,第二个向左对齐)。
笔记2:在代码中,我可以看到这个论点-1
可能有一些其他的副作用(预设alignsep@
——但后来不会被覆盖吗?)我并不完全理解。
第二,返回alignat
。这是xalignat
;只有当方程组的数量大于 1 时,它才会有所不同(因此上述检查毫无意义),但它没有将参数设置为 的快捷方式-1
。现在,这引出了上面的“简短答案”。
答案很长:首先应该思考的是预期目的这个环境。我的猜测是,它实现了一个非常重要的功能,这是许多人都想实现的,但任何其他意思是;然而,由于没有记录,这个功能已经被完全遗忘了。
例如:制作一个类似物align
,但使用对齐的 + 和 =
a + b = ccc + ddd + y (23.11)
x + aaa + bbb = c + d (23.12)
↑ ⇑
简而言之,我们应该
- 对齐 +(用箭头标记)和 =,而
- 向右冲洗标记加号左侧的内容,以及
- 向左冲洗标记加号右侧的内容。
笔记:为了获得最佳效果,最好还允许“箭头上方的符号”不同(例如,× vs ·);然后需要中心箭头上方的符号。但是,据我所知,这是无法实现的(仅支持向左/向右刷新)。
至少如果我读开发者文档amsmath.dtx
正确,这正是aligneat{-1}
允许人们做的事情!不幸的是,我看不出文档与代码的匹配程度,因此不能绝对确定。
实验表明,这是有效的:
\begin{alignat}{-1}
a & + {}&& b && = {}& ccc & + ddd + y \\
x + aaa & + {}&& bbb && = {}& c & + d
\end{alignat}
下面,我附加了1 +
一些+
's 和=
' 来表明这个“列”是向左冲:
\begin{alignat}{-1}
a & + {}&& b && = 1 + {}& ccc & + ddd + y \\
x + aaa & + 1 + {}&& bbb && = {}& c & + d
\end{alignat}
它会将奇数列(以 分隔&
)向右刷新,将偶数列向左刷新;因此我们需要插入空列来转换所需的格式
R c L c R c L
1 + 2 = 2 + 1
(带有+
和=
符号c
)到可能的一
R Ł r L r Ł R L
1 + 2 = 2 +1
这Ł
是我们向左对齐的地方,最好是居中,并且r
代表空的列(一对之间的一个&&
)。(请注意,需要{}
在二元运算符后插入右端。这样{}
会自动插入到左对齐列的左端,这会导致上述代码不对称。)
笔记:在我看来,align
类似 的环境组试图解决太多任务,而没有适当的正交性。例如,如果 的克隆允许某些“列”居中,并且某些列可扩展(作为 的“列”之后的间隙),alignat
那么 可能是一个杀手级环境。align
例如,如果alignRCL
要对齐模式中的列RCLRCLRCL…
,那么可以gather
将内容放在第二列中,也可以将alignat
内容放在第 1、3、4、6、7、9 列中……。此外,还可以使用额外的宏\nogap
来允许在L
-columns 后留出可扩展的间隙(如align
),该宏会抑制这些间隙。这样,就可以将和align
的所有效果组合到一个灵活的环境中……——而且,我怀疑,这很可能是对少数 LoC 的编辑!alignat
gather
为什么?想象一组等式,每行有几个等式,排列在网格中(如图所示align
);但有些列需要gather
编辑,有些需要多点对齐(如我上面的例子),有些只是简单的align
内容。
还想要更多的蟑螂吗? 我上面讨论的是 的一种味道align
;但最初的问题是关于 的一种味道aligned
——而我的答案是错误的alignedat
!在alignedat{-1}
(而不是alignat{-1}
)论点中-1
有上面提到的副作用——因此它的行为类似于aligned
。
结论:使用 时alignedat
,应该使用一些毫无意义的长参数(如999
)而不是-1
。但是,请注意,与使用格式alignedat
相比, 几乎没有什么优势:它用零和支柱对 中的每个单元格进行排版,这可能是它所做的 99%……matrix
rlrlrlrlrlrlrl
displaystyle
mathsurround
\strut@
\setboxz@h{\@lign$\m@th\displaystyle{##}$}%
附加问题:有人知道split
里面有什么吗align
(或gather
)是什么吗应该实现?