align* 环境提供了方程的两列布局,类似于 eqnarray* 环境。
\begin{align*}
[left side of the first column] &= [first line of the first column]
& [left side of the second column] &= [first line of the second column] \\
&= [second line of the first column] & &= [second line of the second column] \\
&= [third line of the first column] & &= [third line of the second column] \\
% .... and so on
\end{align*}
这种用法不仅麻烦,而且容易造成混淆,因为你需要在一个 tex 行中连续写入第一列和第二列的行。
因此,我尝试编写一个宏来简化此过程,方法是首先逐列读取行。然后按照上面给出的繁琐方案替换值。
我对宏观的想法如下:
help1{...[reading in the lines of the first column]...}
help2{...[reading in the lines of the second column]...}
macro{...[substituting the values from the helpmacro's help1 and help2]...}
我遇到了两个问题:
- 每列的行数是可变的。如何读入可变数量的字符串?(在我的情况下是等式的右侧);
- 字符串需要系统地存储在某种寄存器中。我认为需要分配这些寄存器,因为每列的行数是在运行时确定的。
由于我是 TeX 编程的初学者,所以想请教一些建议。例如我的方法实用吗?上面列出的两个问题有什么解决方案?
欢迎提出建议。
最小工作示例:
\documentclass[10pt]{article}
\usepackage{amsmath}
\newcommand{\ov}{\overline}
\begin{document}
\begin{align*}
\frac{ |\phi^+(x) - \phi^+(y)| }{ |x-y| } &= \frac{ |(ax+b) - (ay+b)| }{ |x-y| }
& \frac{ |\phi^-(x) - \phi^-(y)| }{ |x-y| } &= \frac{ |(a\ov x+b) - (a\ov y+b)| }{ |x-y| } \\
&= \frac{ |a(x-y)| }{ |x-y| }
& &= \frac{ |(a(x-y)| }{ |x-y| } \\
&= |a| \frac{ |x-y| }{ |x-y| } \\
&= |a|
\end{align*}
\end{document}
这编译成了这个pdf:
答案1
堆栈是一种替代方案。但是,它有一个缺点:如果左侧和右侧的方程高度不相等,则左侧和右侧行的垂直位置将不匹配。
在您展示的示例中,它应该可以正常工作。此外,如果您选择使用 stacks 而不是 TABstacks,则可以使用\usepackage[usestackEOL]{stackengine}
而不是\usepackage{tabstackengine}
。
编辑以澄清 OP 的一些问题。默认情况下,stackengine 将堆叠文本,而不是数学。要设置模式以使其堆叠数学,而不必将所有内容括在$
分隔符中,只需调用。请注意,除非调用(或),否则\stackMath
堆叠的数学将位于 中。要返回堆叠文本,请调用。\textstyle
\displaystyle
\dfrac
\stackText
宏\mathrel{}
是 LaTeX 的一项功能,它将其参数(在本例中为堆栈)标识为数学关系。这样一来,它将在其周围创建“适当”的空间量(如果没有它,符号=
将挤在等号左侧的材料上)。
有两个关键点\Shortunderstack
:
1) 包中定义了“短”堆栈,用于指定堆叠行之间的固定间隙距离,而“长”堆栈则提供相邻行基线之间的固定距离(有关stackengine
此内容的详细说明,请参阅包文档)。如果您的堆栈高度可变(数学表达式通常如此),则必须使用短堆栈以避免行重叠,或者如果行间基线跳跃设置得足够大以容纳最高元素,则可以使用长堆栈。在此包中,短堆栈间隙(默认 3pt)用 重置\setstackgap{S}{length}
,长堆栈间隙(默认\baselineskip
)用 重置\setstackgap{L}{length}
。
2) “底叠”是指将顶部元素放在基线上,然后从基线上向下构建后续行。这与“堆叠”相反,在“堆叠”中,最后一行位于基线上,然后从基线上向上构建前面的元素。
\documentclass[10pt]{article}
\usepackage{amsmath}
\usepackage{tabstackengine}
\stackMath
\newcommand{\ov}{\overline}
\begin{document}
ALIGN*
\begin{align*}
\frac{ |\phi^+(x) - \phi^+(y)| }{ |x-y| } &= \frac{ |(ax+b) - (ay+b)| }{ |x-y| }
& \frac{ |\phi^-(x) - \phi^-(y)| }{ |x-y| } &= \frac{ |(a\ov x+b) - (a\ov y+b)| }{ |x-y| } \\
&= \frac{ |a(x-y)| }{ |x-y| }
& &= \frac{ |(a(x-y)| }{ |x-y| } \\
&= |a| \frac{ |x-y| }{ |x-y| } \\
&= |a|
\end{align*}
STACK:
\[
\frac{ |\phi^+(x) - \phi^+(y)| }{ |x-y| } \mathrel{\Shortunderstack[l]{
= \dfrac{ |(ax+b) - (ay+b)| }{ |x-y| }\\
= \dfrac{ |a(x-y)| }{ |x-y| }\\
= |a| \dfrac{ |x-y| }{ |x-y| } \\
= |a|
}}
\quad
\frac{ |\phi^-(x) - \phi^-(y)| }{ |x-y| } \mathrel{\Shortunderstack[l]{
= \dfrac{ |(a\ov x+b) - (a\ov y+b)| }{ |x-y| }\\
= \dfrac{ |(a(x-y)| }{ |x-y| }
}}
\]
\end{document}
\documentclass{article}
\usepackage{amsmath}
\usepackage{tabstackengine}
\stackMath
\begin{document}
Using align*
\begin{align*}
[lft side of the first col] &= [first line of the first col]
& [lft side of the second col] &= [first line of the second col] \\
&= [second line of the first col] & &= [second line of the second col] \\
&= [third line of the first col] & &= [third line of the second col] \\
% .... and so on
\end{align*}
Using a 2 stacks
\[
[lft side of the first col]\mathrel{\Shortunderstack[l]{%
= [first line of the first col] \\
= [second line of the first col] \\
= [third line of the first col]%
}}
\quad
[lft side of the second col]\mathrel{\Shortunderstack[l]{%
= [first line of the second col]\\
= [second line of the second col]\\
= [third line of the second col]%
}}
\]
Using TABstack
\[
\alignShortstack{
[lft side of the first col] =& [first line of the first col] \\
=& [second line of the first col] \\
=& [third line of the first col]
}
\quad
\alignShortstack{
[lft side of the second col] =& [first line of the second col] \\
=& [second line of the second col] \\
=& [third line of the second col]
}
\]
\end{document}
答案2
您可以使用aligned
:
\documentclass[10pt]{article}
\usepackage{geometry}% larger text width
\usepackage{amsmath}
\begin{document}
\begin{flalign*}
\frac{|\phi^+(x) - \phi^+(y)|}{|x-y|}
\!\begin{aligned}[t]
&= \frac{|(ax+b) - (ay+b)|}{|x-y|} \\
&= \frac{|a(x-y)|}{|x-y|} \\
&= |a| \frac{|x-y|}{|x-y|} \\
&= |a|
\end{aligned}
&&
\frac{|\phi^-(x) - \phi^-(y)|}{|x-y| }
\!\begin{aligned}[t]
&= \frac{|(a\bar{x}+b) - (a\bar{y}+b)|}{|x-y|} \\
&= \frac{|a(x-y)|}{|x-y|}
\end{aligned}
\end{flalign*}
\end{document}
如果各部分的高度不一样,则需要使用幻影来保持它们对齐。
由于历史原因,aligned
(如gathered
)会增加一个细空格,我们用 将其删除\!
。