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