如何在常规和多行单元格中对齐表格中的数学运算?

如何在常规和多行单元格中对齐表格中的数学运算?

我正在尝试创建一个包含数学的表格,该表格可以水平对齐,但也可以跨多行居中。我尝试了两种不同的方法(一种使用来自这个答案) 都会导致轻微的对齐误差,如图所示。

MWE 的输出

我以前尝试过使用aligned如下环境这个例子但据我所知,没有办法在多个这样的环境中对齐数学或将数学插入cmidrule到一个环境中。

有没有办法修改这些解决方案以修复显示的错误?以这种方式对齐数学的最佳解决方案是什么?

\documentclass{report}
\usepackage{amsmath,array,booktabs,multirow}

% From https://tex.stackexchange.com/questions/78788/align-equations-over-multiple-tabular-rows/78839#78839
\newcolumntype{A}{ >{$} r <{$} @{} >{${}} l <{$} } % A for "align"

\begin{document}

%   FIXED COLUMN DIVIDER
\begin{table}[ht]
    \centering
    \caption{Fixed column divider}
    \begin{tabular}{ l r@{ = } l r@{ $\leftarrow$ } l }
        \toprule
        \textbf{Name}
        &   \multicolumn{2}{l}{\textbf{Math}}   
        &   \multicolumn{2}{l}{\textbf{More Math}}      \\
        \midrule
        \multirow{2}{*}{Foo}
        &   $A$
        &   $x^2 + y^3$
        &   $x$
        &   $x(1 - \alpha)$                         \\
        &   $BC$
        &   $x^3 - y^2$         
        &   $y$
        &   $y(1 + \beta)$                          \\
        \cmidrule{4-5}
        \multirow{2}{*}{Bar}
        &   $D$
        &   $xy + w_z$
        &   \multirow{2}{*}{$w_z$}
        &   \multirow{2}{*}{$w_z(1 + q)$}           \\  
        &   \multicolumn{2}{l}{Note: if $A > D \text{ then } D \leftarrow AB + C$}
        &   \multicolumn{2}{l}{}                    \\
        \bottomrule
    \end{tabular}   
\end{table}

%   NEW COLUMN TYPE
\begin{table}[ht]
    \centering
    \caption{New column type}
    \begin{tabular}{ l A A }
        \toprule
        \textbf{Name}
        &   \multicolumn{2}{l}{\textbf{Math}}   
        &   \multicolumn{2}{l}{\textbf{More Math}}      \\
        \midrule
        \multirow{2}{*}{Foo}
        &   A   &= x^2 + y^3
        &   x   &\leftarrow x(1 - \alpha)           \\
        &   BC  &= x^3 - y^2            
        &   y   &\leftarrow y(1 + \beta)            \\
        \cmidrule{4-5}
        \multirow{2}{*}{Bar}
        &   D   &= xy + w_z
        &   \multirow{2}{*}{$w_z$}
        &   \multirow{2}{*}{$\leftarrow w_z(1 + q)$}\\  
        &   \multicolumn{2}{l}{Note: if $A > D \text{ then } D \leftarrow AB + C$}
        &   \multicolumn{2}{l}{}                    \\
        \bottomrule
    \end{tabular}   
\end{table}

\end{document}

答案1

你可以将每个方程的 LHS 放在一个可测量的框内,然后调整它,使第二 [第三] 列中的所有方程具有相同宽度的 LHS。这种方法很容易使用eqparbox它使用类似\label-\ref的方法来存储最大框宽度(第一次或任何后续更改都需要进行两次编译)。

\eqmathbox类似于\eqparbox,保留数学上下文。语法根据指定的首选语法与 对齐\eqmathbox[<tag>][<align>]{<stuff>}。这最终是通过放置在所有具有相同的最大宽度框内来完成的。<stuff><tag><align><stuff><stuff><tag>

在此处输入图片描述

\documentclass{article}

\usepackage{amsmath,eqparbox,booktabs,xparse}

% https://tex.stackexchange.com/a/34412/5764
\makeatletter
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
  \IfValueTF{#1}
    {\def\eqmathbox@##1##2{\eqmakebox[#1][#2]{$##1##2$}}}
    {\def\eqmathbox@##1##2{\eqmakebox{$##1##2$}}}
  \mathpalette\eqmathbox@{#3}
}
\begin{document}

\begin{tabular}{ *{3}{l} }
  \toprule
  \textbf{Name} & \textbf{Math} & \textbf{More Math} \\
  \midrule
  \raisebox{-.5\normalbaselineskip}[0pt][0pt]{Foo} &
    $\eqmathbox[L][r]{A} = x^2 + y^3$ &
    $\eqmathbox[R][r]{x} \leftarrow x (1 - \alpha)$ \\
  &
    $\eqmathbox[L][r]{BC} = x^3 - y^2$ &
    $ \eqmathbox[R][r]{y} \leftarrow y (1 + \beta)$ \\
  \cmidrule{3-3}
  \raisebox{-.5\normalbaselineskip}[0pt][0pt]{Bar} &
    $ \eqmathbox[L][r]{D} = x y + w_z$ &
    \raisebox{-.5\normalbaselineskip}[0pt][0pt]{%
      $\eqmathbox[R][r]{w_z} \leftarrow w_z (1 + q)$%
    } \\
  & Note: if $A > D$ then $D \leftarrow AB + C$ \\
  \bottomrule
\end{tabular}

\end{document}

上面我使用了\raisebox{<len>}[0pt][0pt]{<stuff>}代替,\multirow因为它实际上不是问题的一部分,也不需要。

答案2

我不确定它是否会起作用,但你可以把它放入(就像)\multirow里面并让它计算偏移量。\multicolumn\raisebox

注意最后一行中的幻像条目(包括幻像\leftarrow)用于设置对齐。两个单元格都是任何行中最宽的,因此版本的放置\multicolumn很简单。

\documentclass{report}
\usepackage{amsmath,array,booktabs,multirow}

\begin{document}

%   FIXED COLUMN DIVIDER
\begin{table}[ht]
    \centering
    \caption{Fixed column divider}
    \begin{tabular}{ l r@{ = } l r@{ $\leftarrow$ } l }
        \toprule
        \textbf{Name}
        &   \multicolumn{2}{l}{\textbf{Math}}   
        &   \multicolumn{2}{l}{\textbf{More Math}}      \\
        \midrule
        \multirow{2}{*}{Foo}
        &   $A$
        &   $x^2 + y^3$
        &   $x$
        &   $x(1 - \alpha)$                         \\
        &   $BC$
        &   $x^3 - y^2$         
        &   $y$
        &   $y(1 + \beta)$                          \\
        \cmidrule{4-5}
        \multirow{2}{*}{Bar}
        &   $D$
        &   $xy + w_z$
        &   \multicolumn{2}{c}{\multirow{2}{*}{$w_z \leftarrow w_z(1 + q)$}}\\
        &   \multicolumn{2}{l}{Note: if $A > D \text{ then } D \leftarrow AB + C$}
        &   \multicolumn{1}{r@{ \phantom{$\leftarrow$} }}{\phantom{$w_z$}}% remove \leftarrowy
        &   \phantom{$w_z(1 + q)$}\\

        \bottomrule
    \end{tabular}   
\end{table}

\end{document}

演示

答案3

在此处输入图片描述

最好直接使用数学环境,而不是调整列属性。您可能已经注意到,在对齐环境中,条目之间的间距对于表格来说很大。在这种情况下,您可以使用\\[-1.5mm]just 来减少间距。您可以将 1.5 替换为您想要的任何数字,但您必须始终确保不要与\\分开[-1.5mm]

>{\hsize=scale\hsize}环境中的规范可tabularx用于指定列宽,这是另一个非常理想的功能。例如,在上面的表格中,第二行设置为比第三行大 70%。以下是上面显示的表格的源代码:

\documentclass{report}
\usepackage{amsmath,array,booktabs,multirow}
\usepackage{ragged2e}
\usepackage{tabularx}
\usepackage{makecell}

\newcolumntype{C}{ >{ \arraybackslash \Centering } X }
\renewcommand \tabularxcolumn [1] { >{ \centering } m{#1} }
\newcommand {\scalelinespace} [1] {\rule{0pt}{#1\normalbaselineskip}}

\begin{document}


\begin{table*}[h]


    \centering
    \begin{tabularx}{1\textwidth}{>{\hsize=0.5\hsize}C| >{\hsize=1.45\hsize}C| >{\hsize=1.05\hsize}C}

        \toprule

        \textbf{Name} & \textbf{Math} & \textbf{More Math} \\

        \midrule

        Foo
        & 
            $\begin{aligned}
                A &= x^{2} + y^{3} \\[-1.5mm]
                BC &= x^{3} - y^{2}
            \end{aligned}$
        &
            $\begin{aligned}
            x &\leftarrow x \thinspace (1 - \alpha)  \\[-1.5mm]
            y &\leftarrow y \thinspace (1 + \beta) 
            \end{aligned}$
        \\
        \Xcline{3-3}{0.2mm}
        \scalelinespace{1}
        Bar
        & 
        \scalelinespace{1}
            \hspace{4.1mm} $D = x y + w_{z}$
            \text{Note if } $A>D \text{ then } D \leftarrow AB+C$
        &
        \scalelinespace{1}
            $w_{z} \leftarrow w_{z} \thinspace (1 + q)$
        \\ 
        \bottomrule

    \end{tabularx}

\end{table*}




\end{document}

相关内容