使用 cmidrule 和多行多列正确居中

使用 cmidrule 和多行多列正确居中

下面的代码生成下图:

在此处输入图片描述

我遇到的问题是Sample没有垂直对齐,如果\cmidrule(l){2-3} \cmidrule(l){4-5}将其删除,我就能获得正确的对齐。

如何在保持两条水平线的同时获得正确的对齐?

\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}

\begin{table}[h]\centering
\begin{tabular}{lcccc}
\toprule 
\multirow{2}{*}{Sample} & \multicolumn{2}{c}{I} & \multicolumn{2}{c}{II} \\
\cmidrule(l){2-3} \cmidrule(l){4-5}
 & A & B & C & D \\
\midrule
S1 & 5 & 8 & 12 & 2 \\
S2 & 6 & 9 & 2 & 6 \\
S3 & 7 & 9 & 5 & 8 \\
S4 & 8 & 9 & 8 & 2 \\
\bottomrule
\end{tabular}
\end{table}

\end{document}

答案1

使用可选参数\multirow

替代

\multirow{2}{*}{Sample}

\multirow{2}[3]{*}{Sample}

做你想做的事。

梅威瑟:

\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}

\begin{table}[h]\centering
\begin{tabular}{lcccc}
\toprule
\multirow{2}[3]{*}{Sample} & \multicolumn{2}{c}{I} & \multicolumn{2}{c}{II} \\
\cmidrule(lr){2-3} \cmidrule(lr){4-5}
 & A & B & C & D \\
\midrule
S1 & 5 & 8 & 12 & 2 \\
S2 & 6 & 9 & 2 & 6 \\
S3 & 7 & 9 & 5 & 8 \\
S4 & 8 & 9 & 8 & 2 \\
\bottomrule
\end{tabular}
\end{table}

\end{document} 

输出:

在此处输入图片描述

请注意,我还按照 Manuel 在评论中的建议,将\cmidrule(l)其改为\cmidrule(lr)更好看的表格。

答案2

我遇到了同样的问题,并且不满足于猜测的参数bigstruts\multirow所以我想到了这个:

\documentclass{article}
\usepackage{booktabs}
\usepackage{multirow}
\begin{document}

\begin{table}[h]\centering
  \begin{tabular}{lcccc}
    \toprule
    \multirow{2}{*}[-0.5\dimexpr \aboverulesep + \belowrulesep + \cmidrulewidth]{Sample}
    & \multicolumn{2}{c}{I} & \multicolumn{2}{c}{II} \\
    \cmidrule(l){2-3} \cmidrule(l){4-5}
    & A & B & C & D \\
    \midrule
    S1 & 5 & 8 & 12 & 2 \\
    S2 & 6 & 9 & 2 & 6 \\
    S3 & 7 & 9 & 5 & 8 \\
    S4 & 8 & 9 & 8 & 2 \\
    \bottomrule
  \end{tabular}
\end{table}

\end{document}

上述代码的输出

我认为这是正确的,因为 multirow 已经尝试垂直居中两行的高度,但您必须考虑 增加的额外空间\cmidrule,这会增加\aboverulesep + \cmidrulewidth + \belowrulesep垂直空间。为了实现这一点,我们告诉\multirow将框垂直向下调整该\cmidrule空间的一半。

如果它看起来有点偏离中心,我思考那只是一种错觉,因为\aboverulesep小于\belowrulesep。我认为它是“居中”的,除非有人证明我错了,但你可以尝试-0.5\dimexpr 2\aboverulesep + \cmidrulewidth一下,看看你是否更喜欢那个样子。

虽然上述解决方案只是将框向下移动,但另一种方法可能是设置\bigstrutjot\dimexpr \aboverulesep + \belowrulesep + \cmidrulewidth,然后使用\multirow{2}[1]{*}{Sample}。如果我理解多行的文档,这实际上会使框更高(两行加上增加的空间\cmidrule),而不仅仅是将框向下移动。然而,在我的测试中,它产生了与上述完全相同的结果,而且似乎不太可读。(请注意,可读性是相对的。)

答案3

booktabs环境的替代解决方案tabularray包裹:

\documentclass{article}

\usepackage{tabularray}
\UseTblrLibrary{booktabs}

\begin{document}

\begin{table}[h]\centering
\begin{booktabs}{
  colspec = {lcccc},
  cell{1}{1} = {r=2}{m}, % multirow
  cell{1}{2,4} = {c=2}{c}, % multicolumn
}
\toprule 
  Sample & I &   & II &   \\
\cmidrule[l]{2-3} \cmidrule[l]{4-5}
         & A & B & C  & D \\
\midrule
      S1 & 5 & 8 & 12 & 2 \\
      S2 & 6 & 9 &  2 & 6 \\
      S3 & 7 & 9 &  5 & 8 \\
      S4 & 8 & 9 &  8 & 2 \\
\bottomrule
\end{booktabs}
\end{table}

\end{document}

请注意,您需要将修剪选项l或放在方括号内。rlr

在此处输入图片描述

答案4

在 环境中{NiceTabular}nicematrix您可以水平和垂直合并单元格。垂直合并时,您可以指定逻辑行数,而不是像 中那样指定物理行数\multirow。因此,新(合并)单元格的内容在数学上处于中心位置。

\documentclass{article}

\usepackage{nicematrix,booktabs}

\begin{document}

\begin{table}[h]\centering
\begin{NiceTabular}{lcccc}
\toprule 
\Block{2-1}{Sample} & \Block{1-2}{I} & & \Block{1-2}{II} \\
\cmidrule(l){2-3} \cmidrule(l){4-5}
         & A & B & C  & D \\
\midrule
      S1 & 5 & 8 & 12 & 2 \\
      S2 & 6 & 9 &  2 & 6 \\
      S3 & 7 & 9 &  5 & 8 \\
      S4 & 8 & 9 &  8 & 2 \\
\bottomrule
\end{NiceTabular}
\end{table}

\end{document}

您需要多次编译(因为nicematrix在后台使用 PGF/Tikz 节点)。

上述代码的输出

相关内容