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*
使用嵌入式aligned
和array
就可以做到。
\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
材料,则让两个部分对齐在同一点可能会很棘手。(我没有尝试过。)