我使用 制作了下表\multicolumn
。一切看起来都很好。不幸的是,当我用一些较长的文本替换 A、B 或 C 时,下面三列之间的间距不相等。有人能解释一下为什么吗?
\begin{table}[h!]
\centering
\begin{tabular}{|ccc|ccc|ccc|c|}
\toprule
\multicolumn{3}{|c}{Longer text} & \multicolumn{3}{|c}{B} & \multicolumn{3}{|c}{C} &\multicolumn{1}{|c|}{D} \\
\midrule
a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{4}\\
a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{}\\
\cline{1-9}
\multicolumn{3}{|c|}{A} & \multicolumn{3}{c|}{B} & \multicolumn{3}{c|}{C} & \multicolumn{1}{c|}{} \\
\cline{1-9}
a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{}\\
a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{}\\
\bottomrule
\end{tabular}
\end{table}
答案1
一些建议:删除垂直线并使用C{0.3cm}
等列类型与重复代码结合*{3}C{}
,以简化此类列兽的使用:
\documentclass{article}
\usepackage{array}
\usepackage{booktabs}
\newcolumntype{C}[1]{>{\centering}p{#1}}
\newlength{\stdcolumnwidth}
\setlength{\stdcolumnwidth}{0.3cm}
\begin{document}
\begin{table}[h!]
\centering
\begin{tabular}{*{3}{C{\stdcolumnwidth}}*{3}{C{\stdcolumnwidth}}*{3}{C{\stdcolumnwidth}}c}
\toprule
\multicolumn{3}{c}{Longer text} & \multicolumn{3}{c}{B} & \multicolumn{3}{c}{C} &D \\
\midrule
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & 4\\
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \\
\midrule
\multicolumn{3}{c}{A} & \multicolumn{3}{c}{B} & \multicolumn{3}{c}{C} & \\
\midrule
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \\
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案2
当单元格中的文本宽度multicolumn
大于所属列的最长文本的总和时,就会出现问题(见下图)。在这种情况下,前两列具有自然宽度,但第三列将其宽度调整为multicolum
单元格请求的宽度。
这个问题可以用不同的方法解决,其中以下两种方法相对简单,但都需要手动调整列宽。在这两个表中,列都被分成几组(正如 Christian Hupfer 在他的回答中所建议的那样)。这样你就可以在列中设置列宽,这就是问题所在。建议的解决方案是:
你调整出现问题的组中列的宽度,以确保所有所属列的宽度相等
通过将单元格中的文本分成
multicolumn
更多行使其更窄,以便能够适合multicolum
单元格的可用宽度。当然,上述两种方法可以结合起来,寻找一种折衷方案,让表格看起来更好
该问题和前两个提到的解决方案说明了下面的 MWE:
\documentclass{article}
\usepackage{array,booktabs,makecell}
\usepackage{stackengine}
\renewcommand\theadset{\normalsize\renewcommand\arraystretch{.85}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\begin{document}
\centering
demonstrate the problem\\
\begin{tabular}{|*{3}{C{4mm}|}*{3}{C{4mm}|}*{3}{C{4mm}|}c|}
\toprule
\multicolumn{3}{|c|}{Longer text}
& \multicolumn{3}{c|}{BBBB BBB BB BBBBB}
& \multicolumn{3}{c|}{C}
& D \\
\midrule
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & 4 \\
\bottomrule
\end{tabular}
\medskip
first possible solution\\
\begin{tabular}{|*{3}{C{4mm}|}*{3}{C{10mm}|}*{3}{C{4mm}|}c|}
\toprule
\multicolumn{3}{|c|}{Longer text}
& \multicolumn{3}{c|}{BBBB BBB BB BBBBB}
& \multicolumn{3}{c|}{C}
& D \\
\midrule
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & 4 \\
\bottomrule
\end{tabular}
\medskip
second possible solution\\
\begin{tabular}{|*{3}{C{4mm}|}*{3}{C{4mm}|}*{3}{C{4mm}|}c|}
\toprule
\multicolumn{3}{|c|}{Longer text}
& \multicolumn{3}{c|}{\thead[b]{BBBB BBB\\ BB BBBBB}}
& \multicolumn{3}{c|}{C}
& D \\
\midrule
a & b & c & a & b & c & a & b & c & \\
1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & 4 \\
\bottomrule
\end{tabular}
\end{document}
makecell
为第二个解决方案添加了包,其中使用了thead
该包中的宏。为了说明,我仅考虑了表中的前三行。