我想对齐多行方程,使其基本上看起来像这样:
a = (b + c
+ d + e)
f = g
此对齐的要求是:
- 等号应该对齐。
- “b”的开头应该与“d”的开头对齐。
- 行间不应引入空白。为满足对齐要求,整行应水平移动。
我不知道如何实现这一点。使用环境时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
这是我的建议。我用过
为了回答这个问题,我还使用了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}
输出:
代码
\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
一起使用,但每种可能性都有一些缺点;见下文。这就是为什么我定义一个新环境(基于)的原因,该环境将行左对齐堆叠在里面。alignat
aligned
array
stacked
gathered
\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
每个解决方案都产生与上面相同的输出:aligned
array
\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
。