tabular

tabular

我正在尝试设置一个包含一些方程式的表格,但我希望多行上的方程式能够正确对齐。到目前为止,我已经

\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- alignedmath中时

然后在环境中使用宏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}

在此处输入图片描述

相关内容