我在表格列与 \multicolumn 结合使用时遇到了一个问题。我找到了一个不太优雅的解决方案。也许有人知道更好的解决方案?

我在表格列与 \multicolumn 结合使用时遇到了一个问题。我找到了一个不太优雅的解决方案。也许有人知道更好的解决方案?

考虑一个包含多列的表格。三个连续的列很细。这三个细列\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

结合使用您的示例(与siunitx包裹) 和贡萨洛的回答

\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

包含 X(tabularx)和 S(siunitx)列的表

对于每一列,您需要通过键值指定其将保存的(最大)位数table-figures-integer。此外,由于所有列都带有整数,table-figures-decimal=0因此table-alignment=center通过 为表全局设置\sisetup

相关内容