简化两列方程的 align* 环境的宏

简化两列方程的 align* 环境的宏

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)会增加一个细空格,我们用 将其删除\!

相关内容