我正在尝试设置一个包含一些方程式的表格,但我希望多行上的方程式能够正确对齐。到目前为止,我已经
\begin{tabular}{cc}
\hline \multicolumn{1}{l}{Header 1} \\
\hline $a = \sum_j b(c)$ & $c = d$ \\
\hline \multicolumn{1}{l}{Header 2} \\
\hline $\begin{aligned}
e&=fghij(y) \\
klm(x)&=nop
\end{aligned}$ &
$\begin{aligned}
qr&=vwxyzstu \\
abcde&=fghij
\end{aligned}$
\end{tabular}
看起来像
请注意,顶行中的等号与底部两行中相应的等号不对齐。
所以我的问题是;有没有办法跨不同的行对齐,或者我是否完全以错误的方式进行操作?
答案1
tabular
平衡水平空间
由于正在输入列,因此等号未对齐c
。
的水平中心a = \sum_j b(c)
不是在等号处,而是在 附近的某个地方\sum
。正如您的第二个环境的等号aligned
可能在 附近的某个地方一样v
。
我引入了两个宏,在一点帮助下可以解决这个问题:
\leftlap[<opt>]{<widest part>}{<actual output>}
:<widest part>
将被\phantom
编辑并设置为此(方程式)列将使用的最宽的输入。<opt>
:环境前有一些水平空间aligned
。根据经验,我发现该空间等于 的数量\,
,因此会自动插入。如果这种情况不应该发生,请将可选参数设置为无(即类型[]
)。
\rightlap{<widest part>}{<actual output>}
\newcommand*\leftlap[3][\,]{#1\hphantom{#2}\mathllap{#3}}
\newcommand*\rightlap[2]{\mathrlap{#2}\hphantom{#1}}
当最长的部分出现在 sans- aligned
math中时
然后在环境中使用宏aligned
:
\begin{tabular}{c}
$ vwxyzstu^{long} = x $ \\
$ \begin{aligned} \leftlap[\!]{vwxyzstu^{long}}{a} & = \rightlap{x}{b} \\
c & = d \end{aligned}$
\end{tabular}
注意\!
可选参数中的。这将删除环境引入的上述水平空间aligned
。(\!
扩展到与负数相同的水平空间\,
。)
输出
很容易看出,两tabular
行之间的间距小于两aligned
行之间的间距。这可能是以下解决方案(标题为“额外列”)更受欢迎且更易于维护的原因之一。
代码
\documentclass{article}
\usepackage{mathtools}
\usepackage{xcolor} % used only to show the phantomed stuff
\renewcommand\hphantom[1]{{\color[gray]{.6}#1}} % comment out!
\setlength\fboxsep{0pt} \setlength\fboxrule{.2pt} % for the \fboxes
\newcommand*\leftlap[3][\,]{#1\hphantom{#2}\mathllap{#3}}
\newcommand*\rightlap[2]{\mathrlap{#2}\hphantom{#1}}
\begin{document}
\begin{tabular}{cc} \hline
\multicolumn{2}{l}{Header 1} \\ \hline
\fbox{$\leftlap{klm(x)}{a} = \rightlap{fghij(y)}{\sum_j b(c)} $} & $\leftlap{abcde}{c} = \rightlap{vwxyzstu}{d} $ \\ \hline
\multicolumn{2}{l}{Header 2} \\ \hline
\fbox{$\begin{aligned} e & = fghij(y) \\
klm(x) & = nop \end{aligned}$} & $ \begin{aligned} qr & = vwxyzstu \\
abcde & = fghij \end{aligned}$
\end{tabular}
\end{document}
输出
额外的列
如果你不想将等号作为默认值,你可以使用
\newcolumntype{M}{R@{$\;$}L}
而是。这在等式左侧和=
符号之间引入了右空格。然后等式的右侧部分可以像往常一样开始,例如& = \sum_j
。
代码
\documentclass{article}
\usepackage{amsmath,array}
\newcolumntype{R}{>{$}r<{$}}
\newcolumntype{L}{>{$}l<{$}}
\newcolumntype{M}{R@{${}={}$}L}
\begin{document}
\begin{tabular}{MM}\hline
\multicolumn{4}{l}{Header 1} \\ \hline
a & \sum_j b(c) & c & d \\ \hline
\multicolumn{4}{l}{Header 2} \\ \hline
e & fghij(y) & qr & vwxyzstu \\
klm(x) & nop & abcde & fghij \\
\end{tabular}
\end{document}
输出
alignat
另一种方法是直接使用其中一个amsmath
环境*align*
。
下一步(如果\hline
需要的话)将是 TikZ\matrix
解决方案,但我想这有点太过分了。
代码
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{alignat*}{2}
\rlap{Header 1} \hphantom{klm(x)} & & & \\
a & = \textstyle \sum_j b(c) & c & = d \\
\rlap{Header 2} \hphantom{klm(x)} & & & \\
e & = fghij(y) & qr & = vwxyzstu \\
klm(x) & = nop & \hspace{\columnsep}abcde & = fghij \\
\end{alignat*}
\end{document}
输出
答案2
这与 Qrrbrbirlbel 提出的“额外列”类似,但更易于管理。
\documentclass{article}
\usepackage{booktabs,array}
\newcolumntype{A}{ >{$} r <{$} @{} >{${}} l <{$} } % A for "align"
%% (1) "r" column in math mode: >{$} r <{$}
%% (2) no space: @{}
%% (3) "l" column in math mode, with
%% an empty subformula at the start: >{${}} l <{$}
\begin{document}
\begin{tabular}{AA}
\toprule
\multicolumn{4}{l}{Header 1} \\
\midrule
a &= \sum_j b(c) & c &= d \\
\midrule
\multicolumn{4}{l}{Header 2} \\
\midrule
e &= fghij(y) & qr &= vwxyzstu \\
klm(x) &= nop & abcde &< fghij \\
\bottomrule
\end{tabular}
\end{document}
列A
类型模拟一对列align
,因此对于每一列,语法是
<left> &= <right>
使用这个更好,因为它不会在列类型中硬连接等号,因为可以在最后一点看到不等式只是作为示例被排版。
tabular*
经过更多的工作,这也可以适应。
\documentclass{article}
\usepackage{booktabs,array}
\newcolumntype{A}{
>{$}r<{$}
@{\extracolsep{0pt}}
>{${}} l <{$}
@{\extracolsep{\fill}}
} % A for "align"
%% (1) "r" column in math mode: >{$} r <{$}
%% (2) no space: @{}
%% (3) "l" column in math mode, with
%% an empty subformula at the start: >{${}} l <{$}
\begin{document}
\noindent
\begin{tabular*}{\textwidth}{
@{\hspace{\tabcolsep}\extracolsep{\fill}}
AAA
@{\hspace{\tabcolsep}}
}
\toprule
\multicolumn{4}{l}{Header 1} \\
\midrule
a &= \sum_j b(c) & c &= d & aaa &= bbb\\
\midrule
\multicolumn{4}{l}{Header 2} \\
\midrule
e &= fghij(y) & qr &= vwxyzstu & a &= b\\
klm(x) &= nop & abcde &< fghij & x &= 0\\
\bottomrule
\end{tabular*}
\end{document}