考虑以下代码块:
\begin{tabular}{| c | c | c | c | c | c | c | }
\cline{2-7}
\multicolumn{1}{c}{} & \multicolumn{3}{|c|}{Fantastical aardvarks}
& \multicolumn{3}{c|}{Spelunking elephants}\\
\hline
Foo bar & A & B & C & A & B & C\\
\hline
5 & 87 & 5 & 2 & 82 & 18 & 48\\
6 & 5 & 43 & 4 & 7 & 47 & 4\\
7 & 7 & 18 & 63 & 2 & 9 & 99\\
\hline
\end{tabular}
有没有办法让“奇妙的土豚”和“洞穴探险大象”下的三列宽度均匀分布?
我特别感兴趣的是自动化这样做,而不需要直接指定列宽。
答案1
您可以使用tabularx
环境而不是tabular
环境。tabularx
环境可通过加载tabularx 包,提供了一种称为“X”的列类型,它应该可以满足您声称的拥有多个等宽列的需求。下面 MWE 中的第一个表格解释了如何做到这一点。
然而,有一项决定是作者必须make,即不能完全自动化:有多宽整个表格应该是多少?通常,只需将此宽度设置为\textwidth
(当前文本块的宽度),然后tabularx
确定各个类型的列的宽度X
。对于这个 MWE(使用 LaTeX 使用的默认文本字体),经过反复试验,我发现可以将表格的整体宽度指定为大约0.75\textwidth
。对于您的实际文档,您需要尝试各种表格宽度设置,以根据经验确定最窄的表格宽度。
还请注意MWE 中列类型\centering\arraybackslash
前的说明符的使用。我插入了这个说明符,因为看起来您希望列的内容是X
居中(默认情况下,列的内容X
设置为“完全对齐”。)
尽管如此,我还强烈建议您考虑 (i) 删除表格中的所有垂直线,以及 (ii) 使用booktabs 包来获取表格中各个规则上方和下方的间距。此包提供了命令\toprule
、、和;如何使用它们将在下面的 MWE 第二部分中解释。请注意,可以左修剪和/或右修剪\bottomrule
-这是使用 无法实现的。比较表格的两种形式,我敢说绝大多数读者会发现第二种形式看起来更令人愉悦\midrule
\cmidrule
\cmidrule
\cline
和更容易理解。:-)
\documentclass{article}
\usepackage{tabularx,booktabs}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\begin{document}
\noindent
\begin{minipage}{0.75\linewidth}
First version: Many vertical lines,
widths of horizontal lines all equal,
spacing above\slash below horizontal
lines cramped
\smallskip
\begin{tabularx}{\textwidth}{ |c| *{6}{Y|} }
\cline{2-7}
\multicolumn{1}{c|}{}
& \multicolumn{3}{c|}{Fantastical aardvarks}
& \multicolumn{3}{c|}{Spelunking elephants}\\
\hline
Foo bar & A & B & C & A & B & C\\
\hline
5 & 87 & 5 & 2 & 82 & 18 & 48\\
6 & 5 & 43 & 4 & 7 & 47 & 4\\
7 & 7 & 18 & 63 & 2 & 9 & 99\\
\hline
\end{tabularx}
\bigskip
Second version: No vertical lines,
widths of horizontal lines differ,
spacing above/below horizontal lines
satisfactory
\smallskip
\begin{tabularx}{\textwidth}{c *{6}{Y}}
\toprule
Foo bar
& \multicolumn{3}{c}{Fantastical aardvarks}
& \multicolumn{3}{c}{Spelunking elephants}\\
\cmidrule(lr){2-4} \cmidrule(l){5-7}
& A & B & C & A & B & C\\
\midrule
5 & 87 & 5 & 2 & 82 & 18 & 48\\
6 & 5 & 43 & 4 & 7 & 47 & 4\\
7 & 7 & 18 & 63 & 2 & 9 & 99\\
\bottomrule
\end{tabularx}
\end{minipage}
\end{document}
答案2
\documentclass{article}
\usepackage{tabularx,ragged2e}
\usepackage{booktabs}
\begin{document}
{\tabcolsep=0pt\def\arraystretch{1.3}
\begin{tabularx}{250pt}{c *6{>{\Centering}X}}\toprule
& \multicolumn{3}{c}{Fantastical aardvarks} & \multicolumn{3}{c}{Spelunking elephants}
\tabularnewline \cmidrule(lr){2-4}\cmidrule(l){5-7}
Foo bar & A & B & C & A & B & C \tabularnewline \midrule
5 & 87 & 5 & 2 & 82 & 18 & 48 \tabularnewline
6 & 5 & 43 & 4 & 7 & 47 & 4 \tabularnewline
7 & 7 & 18 & 63 & 2 & 9 & 99 \tabularnewline\bottomrule
\end{tabularx}}
\end{document}
答案3
虽然迟到了,但我也遇到了同样的问题,因为表格太大了,tabularx
无论我做什么,表格都会超出页面边界。所以我不能使用tabularx
,而是找到了一个便宜的肮脏技巧:\hspace*{}
只需将其放置\hspace*{}
在要放大的列中即可。由于您想要居中列,因此必须将其放置在顶行文本的前后:
\begin{tabular}{| c | c | c | c | c | c | c | }
\cline{2-7}
\multicolumn{1}{c}{} & \multicolumn{3}{|c|}{Fantastical aardvarks}
& \multicolumn{3}{c|}{Spelunking elephants}\\
\hline
Foo bar &\hspace*{1.5mm} A \hspace*{1.5mm} & \hspace*{1.5mm} B \hspace*{1.5mm} & C & A & B & C\\
\hline
5 & 87 & 5 & 2 & 82 & 18 & 48\\
6 & 5 & 43 & 4 & 7 & 47 & 4\\
7 & 7 & 18 & 63 & 2 & 9 & 99\\
\hline
\end{tabular}
您需要稍微玩一下才能获得正确的精度,但有时您就必须玩点卑鄙的把戏。
答案4
tblr
有了新的 LaTeX3 包环境,一切都变得轻而易举tabularray
:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{tblr}{
hline{1} = {2-7}{solid},
hline{2,3,6} = {solid},
vline{1} = {2-5}{solid},
vline{2-Z} = {solid}, % Z stands for the last
cells = {c},
cell{1}{2,5} = {c=3}{c}, % multicolumn
hspan = even, % evenly distributing column widths
}
& Fantastical aardvarks & & & Spelunking elephants & & \\
Foo bar & A & B & C & A & B & C \\
5 & 87 & 5 & 2 & 82 & 18 & 48 \\
6 & 5 & 43 & 4 & 7 & 47 & 4 \\
7 & 7 & 18 & 63 & 2 & 9 & 99 \\
\end{tblr}
\end{document}