下面的代码生成下图:
我遇到的问题是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
或放在方括号内。r
lr
答案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 节点)。