编辑:

编辑:

我想对齐多行方程,使其基本上看起来像这样:

a = (b + c
   + d + e)
f = g

此对齐的要求是:

  1. 等号应该对齐。
  2. “b”的开头应该与“d”的开头对齐。
  3. 行间不应引入空白。为满足对齐要求,整行应水平移动。

我不知道如何实现这一点。使用环境时alignat,即使&在“(”和“b”之间放置对齐符号 ( )(以尝试对齐“b”和“d”的开头)也会在它们之间引入空格,这是不允许的。

这能做到吗?

(注意:字母只是任何数学表达式的变量。确保您的解决方案不依赖于“a”和“f”的宽度相同。)

编辑:

正如我的注释所说,字母只是任何数学表达式给出 MWE 的变量。我实际上对设置感兴趣d = \left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right]。Qrrbrbirlbel 的当前解决方案使用字母有效,但在进行d上述设置后无效:

在此处输入图片描述

如您所见, 的开头d与 的开头匹配b,但是 的[开头比 的开头更靠右b

在此示例中,' s[应该对齐:

在此处输入图片描述

上面两张图片的来源是:

\documentclass{article}

\usepackage{mathtools} % amsmath is loaded by mathtools
\usepackage{xcolor}
\newcommand*{\gphantom}[1]{{\color[gray]{.75}#1}}

\begin{document}
\begin{align*}
    a & = (b + c \\
      & \hphantom{{}={} (}\mathllap{{}+{}}d + e) \\
      & \hphantom{{}={} (}\mathllap{{}+{}}\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right] + e) \\
    f & = g
\end{align*}

\begin{align*}
    a & = (\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right] + c \\
      & \hphantom{{}={} (}\mathllap{{}+{}}\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right] + e) \\
    f & = g
\end{align*}
\end{document}

解决方案

为了清晰、简单和进一步理解,我在此发布了(当前最佳)解决方案。这是 Qrrbrbirlbel 的解决方案基于他自己的评论而稍作修改的结果。

在此处输入图片描述

\documentclass{article}
\usepackage{mathtools} % amsmath is loaded by mathtools
\begin{document}
\begin{align*}
    a & = (\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right] + c \\
      & \hphantom{{}={} (}\mathllap{{}+{}}{\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right]} + e) \\
    f & = g
\end{align*}
\end{document}

答案1

可能有几种方法可以实现这一点。


这是我的建议。我用过

  • amsmath(由 加载mathtools)对于alignsplit
  • mathtools对于\mathllap
  • \hphantom用于水平白色间距。

为了回答这个问题,我还使用了xcolor和我自己的宏\gphantom

\mathllap将其参数与当前水平位置的左侧重叠。

+我添加了一些进一步的解决方案,因为我对第一个解决方案由于区域重叠而有点不满意=;但这只是我的看法。

+希望最后一位能够展示如何选择二进制周围的间距。

自定义宏?

您可能会考虑使用自己的宏来简化这一重复任务,也许类似于:

\newcommand*{\bettername}[2][{}={} (]{% #1 = hide, #2 = show instead
    \hphantom{#1}
    \mathllap{#2}
}

+和之间没有空格d

\begin{align}
    \begin{split}
    a & = ( b + c \\
      & \bettername{+}d + e)
    \end{split} \\
    f & = g
\end{align}

输出:
+ 和 d 之间没有空格

代码

\documentclass{article}
\usepackage{mathtools} % amsmath is loaded by mathtools
\usepackage{xcolor}
\newcommand*{\gphantom}[1]{{\color[gray]{.75}#1}}
%\renewcommand*{\gphantom}[1]{\hphantom{#1}} % comment out to see \hphantom'ed stuff
\begin{document}
\begin{align}
    \begin{split}
    a & = ( b + c \\
      & \gphantom{{}={} (}\mathllap{{}+{}}d + e)
    \end{split} \\
    f & = g
\end{align}
\begin{align}
\begin{split}
    a & = \gphantom{+\:}\mathllap{(} b + c \\
      &  \gphantom{{}={}} {+\:} d + e)
    \end{split} \\
    f & = g
\end{align}
\begin{align}
    \begin{split}
    a & = \gphantom{{}+{}}\mathllap{(} b + c \\
      &  \gphantom{{}={}} {{}+{}} d + e)
    \end{split} \\
    f & = g
\end{align}
\begin{gather}
    = x + y \\
    = x{\: +\:}y \\
    = x{+}y \\
    %
    = {+\:}y \\
    = {} + y \\
\end{gather}
\end{document}

输出

输出

smallmatrix

代码

\documentclass{article}
\usepackage{mathtools}
\usepackage{xcolor}

\newcommand*{\gphantom}[1]{{\smash{\color[gray]{.75}#1}}}
\renewcommand*\gphantom[1]{\hphantom{#1}}

\newcommand*{\mathindent}[2][{}={} (]{% #1 = hide, #2 = show instead
    \gphantom{#1}
    \mathllap{#2}
}

\def\bmatr{\ensuremath{\begin{bsmallmatrix} 1 \\ 0 \end{bsmallmatrix}}} % mathtools
\def\matr{\ensuremath{\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right]}}
\begin{document}
\begin{align}
    a & = ( \matr + c                 \\
      & \mathindent{{}+{}}\matr + c   \\
      & \mathindent{{}+{}}{\matr} + c \\
      & \mathindent{{}+{}}\bmatr + c  \\
      & \mathindent{} \gphantom{\matr} + c_2) \\
    f & = g
\end{align}
\end{document}

输出

小矩阵问题?

答案2

要使用该alignat环境,您需要牢记会alignat产生成对的r/l对齐的方程式,因此您需要使用双精度&&数跳过r右对齐的列,以便您在l左对齐事物:

在此处输入图片描述

此外,如果您还想对齐标志,+您可以使用另一个&&来执行此操作,如第二个示例所示:

在此处输入图片描述

评论中指出,在开口右侧添加的额外间距(是不可接受的。我在开口右侧添加了额外的间距(,以便右侧的空间(不会像上面第三个示例所示那样被拉伸。

+正如 Gonzalo Medina 所评论的,符号前的间距d不正确。唯一的补救方法是,在保持问题中给出的其他对齐要求的同时,引入额外的水平间距,或将 + 号移至上方的行:

在此处输入图片描述

根据 Hendrik Vogt 的建议,我\mathrlap在 周围添加了g(因为g比 宽(

代码:

\documentclass{article}
\usepackage{mathtools}

\begin{document}
\begin{minipage}{0.2\linewidth}
\begin{alignat*}{4}
a &=     ( &&b + c \\
  &\quad + &&d + e) \\
f & = g
\end{alignat*}
\end{minipage}
%
\begin{minipage}{0.2\linewidth}
\begin{alignat*}{4}
a &=     ( &&b &&+ c \\
  &\quad + &&d &&+ e) \\
f & = g
\end{alignat*}
\end{minipage}
%
\begin{minipage}{0.2\linewidth}
\begin{alignat*}{4}
a &=\\
( &&b &&+ c \\
  &\quad + &&d &&+ e) \\
f & = g
\end{alignat*}
\end{minipage}
\end{document}

代码: 正确的\mathbin间距:

\documentclass{article}
\usepackage{mathtools}

\begin{document}
\begin{minipage}{0.3\linewidth}
    \begin{alignat*}{4}
        a &=     ( &&b &&+ c \\
          &\quad +{} &&d &&+ e) \\
        f & = g
    \end{alignat*}
\end{minipage}
%
\begin{minipage}{0.3\linewidth}
    \begin{alignat*}{4}
        a &= ( &&b &&+ c +{}\\
          &    &&d &&+ e) \\
        f & = \mathrlap{g}
    \end{alignat*}
\end{minipage}
\end{document}

答案3

\leftplus您可以使用如下定义的命令:

\newcommand*{\leftplus}{\mathllap{{}+{}}\mathopen{}}

\mathllap加号放在左侧(周围留有适当的间距),并\mathopen{}注意不在右侧添加额外的空格。 (\mathopen{}生成一个空的“打开原子”,并且 TeX 永远不会在打开原子后添加水平空格。)

现在您可以将、或\leftplus一起使用,但每种可能性都有一些缺点;见下文。这就是为什么我定义一个新环境(基于)的原因,该环境将行左对齐堆叠在里面。alignatalignedarraystackedgathered

输出

\documentclass{article}
\usepackage{mathtools} % amsmath is loaded by mathtools
\makeatletter
\newenvironment{stacked}[1][c]{%
    \RIfM@\else
        \nonmatherr@{\begin{stacked}}%
    \fi
    \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup
        \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
        \spread@equation
        \ialign\bgroup
            \strut@$\m@th\displaystyle##$\hfil
            \crcr
}{%
  \endaligned
}
\makeatother
\newcommand*{\myvector}{\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right]}
\newcommand*{\leftplus}{\mathllap{{}+{}}\mathopen{}}
\begin{document}
\begin{align*}
    a &= ( \begin{stacked}[t]
                     \myvector + c \\
           \leftplus \myvector + e)
           \end{stacked} \\
    f &= g
\end{align*}
\end{document}

stacked和之间的唯一区别是gathered:后者\,在左侧添加了这里不需要的水平空间,并且使线条居中。


以下是 和 的可能解决方案,alignat每个解决方案都产生与上面相同的输出:alignedarray

\documentclass{article}
\usepackage{mathtools} % amsmath is loaded by mathtools
\newcommand*{\myvector}{\left[\begin{smallmatrix} 1 \\ 0 \end{smallmatrix}\right]}
\newcommand*{\leftplus}{\mathllap{{}+{}}\mathopen{}}
\begin{document}
\begin{alignat*}{2}
    a &= (&&\mathopen{} \myvector + c \\
      &   &&\leftplus   \myvector + e) \\
    f &= \mathrlap{g}
\end{alignat*}
\begin{align*}
    a &= \!\begin{aligned}[t]
         ( & \mathopen{} \myvector + c \\
           & \leftplus   \myvector + e)
         \end{aligned} \\
    f &= g
\end{align*}
\begin{align*}
    a &= ( \begin{array}[t]{@{}l@{}}
                     \myvector + c \\[\jot]
           \leftplus \myvector + e)
           \end{array} \\
    f &= g
\end{align*}
\end{document}

alignat和中,aligned我需要\mathopen{}在第一行进行修改,否则向量前会有一些额外的水平空间。对于 ,aligned我需要\!补偿\,发出的一些空间aligned。在array解决方案中,@{}避免了额外的水平空间,并且需要指定\\[\jot]以获得与 相同的垂直间距aligned

相关内容