如何编写具有多种锚点类型的对齐环境?

如何编写具有多种锚点类型的对齐环境?

1. 期望结果

我经常发现自己试图将方程块的某些部分与其他部分独立对齐。例如,这是一个左对齐的方程块,其中一些方程跨越多行,并且它们的项与其他方程独立对齐。我在这里使用单词作为占位符,但这些实际上是数学表达式:

   lorem + ipsum
= (dolor       +sit        +amet
   consectetur -adipiscing -elit)
= (sed     -do
   siusmod +tempor)

2. 单对齐环境

这样做aligned会添加不必要的额外空白,因为它会在所有三个方程之间共享列。例如,第二项直到第一个方程的末尾才开始。类似地,第三个方程中的第二项被推到右边,以上面方程中较长的第二项开头:

\begin{gather}
\begin{aligned}
   &\text{lorem} + \text{ipsum} \\
= (&\text{dolor}       &&+\text{sit}        &&+\text{amet} \\
   &\text{consectetur} &&-\text{adipiscing} &&-\text{elit}) \\
= (&\text{sed}     &&-\text{do} \\
   &\text{siusmod} &&+\text{tempor}).
\end{aligned}
\end{gather}

共享对齐附加空格

3. 嵌套对齐环境

我也尝试过嵌套aligned环境。但这并不能给出正确的结果,因为内部环境的= (和外部是垂直居中的,而它们应该分别位于顶部和底部:)aligned

\begin{gather}
\begin{aligned}
   &\text{lorem} + \text{ipsum} \\
= (&\begin{aligned}
    &\text{dolor}       &&+\text{sit}        &&+\text{amet} \\
    &\text{consectetur} &&-\text{adipiscing} &&-\text{elit}
\end{aligned}) \\
= (&\begin{aligned}
    &\text{sed}     &&-\text{do} \\
    &\text{siusmod} &&+\text{tempor}
\end{aligned}).
\end{aligned}
\end{gather}

嵌套对齐,括号未对齐

4. 内部前缀和后缀

=(将“和”移动)到内部align环境内会破坏对齐所有五行的第一列。通常,前缀和后缀对于所有方程式来说宽度都不一样,因此我无法通过简单地将第一个方程式缩进更多来解决这个问题:

\begin{gather}
\begin{aligned}
   & \text{lorem} + \text{ipsum} \\
&\begin{aligned}
 =( & \text{dolor}       &&+\text{sit}        &&+\text{amet} \\
    & \text{consectetur} &&-\text{adipiscing} &&-\text{elit})
\end{aligned} \\
&\begin{aligned}
 = (& \text{sed}     &&-\text{do} \\
    & \text{siusmod} &&+\text{tempor}).
\end{aligned}
\end{aligned}
\end{gather}

嵌套对齐包括前缀和后缀

5. 解决方案的想法

理想情况下,我可以使用多组锚点。例如,&1对于左对齐所有行的第一列、&2对于第二个方程中的两个附加列以及&3对于第三个方程中的一列附加列:

\begin{gather}
\begin{multi_anchor_aligned}  % Does not exist.
   &1 \text{lorem} + \text{ipsum} \\
= (&1 \text{dolor}       &2&2+\text{sit}        &2&2+\text{amet} \\
   &1 \text{consectetur} &2&2-\text{adipiscing} &2&2-\text{elit}) \\
= (&1 \text{sed}     &3&3-\text{do} \\
   &1 \text{siusmod} &3&3+\text{tempor}).
\end{multi_anchor_aligned}
\end{gather}

我有两个问题:

  • 有没有更好的方法来实现这一点,使用现有的功能amsmath或其他常用包?我发布了一个类似问题针对先前更具体的情况,但它并不推广到这里的例子。
  • 我怎样才能实现一个支持上述多种锚点类型的环境?我认为我必须解析&\\分隔符以迭代中间的术语并将它们放入多个数组中。

答案1

你想要的就是这样的东西吗?我曾经alignedat完全控制列间距,并且可以选择[t]放置左括号,并在最后一行的末尾添加闭括号:

\documentclass{article}
\usepackage{amsmath, amssymb}

\begin{document}

\begin{gather}
\begin{aligned}
   &\text{lorem} + \text{ipsum} \\
= (&\begin{alignedat}[t]{3}
    &\text{dolor} &&+\text{sit} &&+\text{amet} \\
    &\text{consectetur} &&-\text{adipiscing} &&-\text{elit})
\end{alignedat} \\
= (&\begin{alignedat}[t]{2}
    &\text{sed} &&-\text{do} \\
    &\text{siusmod} &&+\text{tempor}).
\end{alignedat}
\end{aligned}
\end{gather}

\end{document} 

在此处输入图片描述

答案2

这是一个数组解决方案,以及一个包含方程编号的表格*解决方案。

请注意,\extracolsep不适用于第一列之前或最后一列之后。

\documentclass{article}
\usepackage{amsmath}
\usepackage{array}

\newcommand{\mytag}{\refstepcounter{equation}\llap{(\theequation)}}

\begin{document}

\begin{equation}
\begin{array}{rlll}
   & \text{lorem} + \text{ipsum} \\
 = (& \text{dolor}       &+\text{sit}        &+\text{amet} \\
   & \text{consectetur} &-\text{adipiscing} &-\text{elit}) \\
= (& \text{sed}     &-\text{do} \\
   & \text{siusmod} &+\text{tempor}).
\end{array}
\end{equation}

\noindent\begin{tabular*}{\textwidth}{@{}l% left margin, leave empty
  @{\extracolsep{\fill}}>{$\displaystyle}r<{$}
  @{\extracolsep{0pt}\hspace{2\tabcolsep}}>{$\displaystyle}l<{$}
  >{$\displaystyle}l<{$}
  >{$\displaystyle}l<{$}
  @{\extracolsep{\fill}}r@{}}
 &   & \text{lorem} + \text{ipsum} \\
 &= (& \text{dolor}       &+\text{sit}        &+\text{amet} \\
 &   & \text{consectetur} &-\text{adipiscing} &-\text{elit}) &\mytag \\
 &= (& \text{sed}     &-\text{do} \\
 &   & \text{siusmod} &+\text{tempor}). &&\mytag 
\end{tabular*}

\end{document}

相关内容