对齐环境中的数组对齐

对齐环境中的数组对齐

array我正在尝试在环境中排版align,并与数组中的特定分隔符对齐。在下面的示例中,我想与数组中的“:”分隔符对齐。

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

\begin{document}
\begin{align*}
x^2 & = y^2 \\
z^2 &= a^2 \\
\begin{array}{l@{:}c}
a & b\\
c & d
\end{array}
\end{align*}
\end{document}

我应该alignat为此使用环境吗?这通常会导致一大堆多余的“&”四处飘荡……


主要编辑:

感谢所有回复的用户。我已经用提供的每个解决方案更新了我的 MWE,并随附了我的评论。基本上每个解决方案都解决了问题的一个方面。一个解决了对齐问题,另一个允许我在环境中添加array原始align环境中可能不存在的列。非常欢迎进一步的评论。

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

\makeatletter
\newcommand{\X}[1]{\ifmeasuring@ #1\else\fgnu@X{#1}\fi}
\newcommand{\Y}[1]{\ifmeasuring@ {}:#1\else\fgnu@Y{#1}\fi}
\def\fgnu@X#1{\hbox to \ifcase1\maxcolumn@widths\fi{$\displaystyle#1$\hfil}}
\def\fgnu@Y#1{\hbox to \ifcase2\maxcolumn@widths\fi{${}:{}$\hfil$\displaystyle#1$\hfil}}
\makeatother


\begin{document}
%================================================
% original problem
\begin{align*}
x^2 & = y^2 \\
z^2 &= a^2 \\
\begin{array}{l@{:}c}
a & b\\
c & d
\end{array}
\end{align*}

%================================================
% egreg's solution
%   Cannot extend to more columns in the array than
%   in the original align environment
\begin{align*}
x^2 & = y^2 \\
z^2 &= a^2 \\
\X{aaaa} & \Y{bbbbbggggggggg}\\
\X{cccccccc} & \Y{dd}
\end{align*}

%================================================
% David Carlisle's solution
%   This solution allows me to add more columns to 
%   the array, but, the "`:"' is not centred to the
%   "`="' in the align environment.
\begin{align*}
x^2 & = y^2 \\
z^2 &= a^2 \\
\begin{array}{ll@{:}}
a &a\\
c & c 
\end{array}
&
\begin{array}{@{}cc}
b&b\\
d&d
\end{array}\\
\end{align*}

%================================================
% Barbara Beeton's solution
%   Nice alignment solution, however, can I add more
%   columns to the array?
\begin{gather*}
\begin{aligned}
x^2 & = y^2 \\
z^2 &= a^2
\end{aligned}\\
\begin{array}{l@{:}c}
a & b\\
c & d
\end{array}
\end{gather*}

答案1

由于您实际上并没有使用数组,因此我建议采用另一种策略:

\documentclass{article}
\usepackage{amsmath, array}
\makeatletter
\newcommand{\X}[1]{\ifmeasuring@ #1\else\fgnu@X{#1}\fi}
\newcommand{\Y}[1]{\ifmeasuring@ {}:#1\else\fgnu@Y{#1}\fi}
\def\fgnu@X#1{\hbox to \ifcase1\maxcolumn@widths\fi{$\displaystyle#1$\hfil}}
\def\fgnu@Y#1{\hbox to \ifcase2\maxcolumn@widths\fi{${}:{}$\hfil$\displaystyle#1$\hfil}}
\makeatother

\begin{document}
\begin{align*}
x^2 & = y^2 \\
z^2 &= a^2 \\
\X{aaaa} & \Y{bbbbbggggggggg}\\
\X{cccccccc} & \Y{dd}
\end{align*}
\end{document}

左侧由 指定\X{...},右侧由指定\Y{...}

在此处输入图片描述

答案2

这不是绝对必要的,但最简单的方法是更改​​输入顺序并分别输入数组的两半。我将其设置为 4 列数组,以便更清晰一些:

在此处输入图片描述

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

\begin{document}
\begin{align*}
x^2 & = y^2 \\
z^2 &= a^2 \\
\begin{array}{ll@{:}}
a &a\\
c & c 
\end{array}
&
\begin{array}{@{}cc}
b&b\\
d&d
\end{array}\\
\end{align*}
\end{document}

答案3

因为您正在使用amsmath,所以您还有其他选择。如果我正确理解了你想要什么,gather*使用嵌入式alignedarray就可以做到。

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

\begin{document}
\begin{gather*}
\begin{aligned}
x^2 & = y^2 \\
z^2 &= a^2
\end{aligned}\\
\begin{array}{l@{:}c}
a & b\\
c & d
\end{array}
\end{gather*}
\end{document}

结果如下:

显示顶部对齐,底部水平居中

如果阵列上方和下方都有aligned材料,则让两个部分对齐在同一点可能会很棘手。(我没有尝试过。)

相关内容