考虑一个包含多列的表格。三个连续的列很细。这三个细列\multicolumn{c}{3}{??}
上方有一个长标题。如果没有指定这些列的间距,则默认行为是将前两列尽可能地细以容纳前两列的内容,并将最后一列调整为与标题末尾对齐所需的大小。
一种解决方案是使用手动在列之间添加空间@{}
,或者使用手动指定列的宽度p{??}
或S[table-column-width=??]
(在包的情况下siunitx
)。
我希望有某种自动化解决方案,或者这可能是一个可能的开发项目。我突然想到,在更一般的情况下,如果\multicolumn
不同的行上可能有多个重叠的命令,那么这可能从尴尬到不可能。
以下是一些代码,用于生成包含问题(第一个)的表格以及我实现的略显笨拙的问题解决方案(第二个)。我使用该siunitx
包来实现列,因为我更喜欢布局,它为我提供了更多选项。
\documentclass{article}
\usepackage{siunitx}
\usepackage{booktabs}
\begin{document}
\begin{table}
\centering
% \sisetup{table-alignment=center,table-column-width=2.8cm}
\sisetup{table-alignment=center}
\begin{tabular}{ S S S S }
\toprule
\multicolumn{3}{c}{k-points in lattice vector and here's some more words} & \\
$\mathbf{a}$ & $\mathbf{b}$ & $\mathbf{c}$ & {total k-points}\\
\midrule
1 & 1 & 1 & 1 \\
2 & 1 & 2 & 4 \\
3 & 2 & 3 & 18 \\
4 & 2 & 4 & 32 \\
5 & 3 & 5 & 75 \\
5 & 4 & 5 & 100 \\
6 & 4 & 6 & 144 \\
7 & 5 & 7 & 245 \\
8 & 6 & 8 & 384 \\
10 & 6 & 10 & 600 \\
10 & 8 & 10 & 800 \\
\bottomrule
\end{tabular}
\end{table}
\begin{table}
% try to determine correct column spacing for 3 thin columns under a long heading.
\def\tempHeading{k-points in lattice vector and here's some more words} % this is the heading
\newlength{\tempHeadingLen} % a length is a type of object and must be defined
\settowidth{\tempHeadingLen}{\tempHeading} % get length of heading
\addtolength{\tempHeadingLen}{-4\tabcolsep} % 2x2\tabcolsep betweeen columns
\setlength{\tempHeadingLen}{0.33333\tempHeadingLen} % divide by three. nice if this could be automated.
%
\centering
\sisetup{table-alignment=center}
\begin{tabular}{ S[table-column-width=\tempHeadingLen]
S[table-column-width=\tempHeadingLen]
S[table-column-width=\tempHeadingLen]
S }
\toprule
\multicolumn{3}{c}{\tempHeading} & \\
$\mathbf{a}$ & $\mathbf{b}$ & $\mathbf{c}$ & {total k-points}\\
\midrule
1 & 1 & 1 & 1 \\
2 & 1 & 2 & 4 \\
3 & 2 & 3 & 18 \\
4 & 2 & 4 & 32 \\
5 & 3 & 5 & 75 \\
5 & 4 & 5 & 100 \\
6 & 4 & 6 & 144 \\
7 & 5 & 7 & 245 \\
8 & 6 & 8 & 384 \\
10 & 6 & 10 & 600 \\
10 & 8 & 10 & 800 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案1
\documentclass{article}
\usepackage{siunitx}% http://ctan.org/pkg/siunitx
\usepackage{tabularx}% http://ctan.org/pkg/tabularx
\usepackage{booktabs}% http://ctan.org/pkg/booktabs
\newcolumntype{L}{>{\centering}X}% Centered fully stretched column
\begin{document}
\begin{table}
\centering
\sisetup{table-alignment=center,table-figures-decimal=0}
\begin{tabularx}{\linewidth}{%
S[table-figures-integer=2]%
S[table-figures-integer=1]%
S[table-figures-integer=2]%
S[table-figures-integer=3]%
}
\toprule
\multicolumn{3}{c}{$k$-points in lattice vector and here's some more words} & \\
\multicolumn{1}{L}{$\mathbf{a}$} & \multicolumn{1}{L}{$\mathbf{b}$} &
\multicolumn{1}{L}{$\mathbf{c}$} & \multicolumn{1}{L}{total $k$-points}\\
\midrule
1 & 1 & 1 & 1 \\
2 & 1 & 2 & 4 \\
3 & 2 & 3 & 18 \\
4 & 2 & 4 & 32 \\
5 & 3 & 5 & 75 \\
5 & 4 & 5 & 100 \\
6 & 4 & 6 & 144 \\
7 & 5 & 7 & 245 \\
8 & 6 & 8 & 384 \\
10 & 6 & 10 & 600 \\
10 & 8 & 10 & 800 \\
\bottomrule
\end{tabularx}
\end{table}
\end{document}
表头中的使用\multicolumn{1}{X}{...}
允许最后一列也拉伸为类型列X
,但仍然保持S
列对齐siunitx
。
对于每一列,您需要通过键值指定其将保存的(最大)位数table-figures-integer
。此外,由于所有列都带有整数,table-figures-decimal=0
因此table-alignment=center
通过 为表全局设置\sisetup
。