使用 siunitx 包的 table-column-width 选项作为解决长多列标题问题的方法

使用 siunitx 包的 table-column-width 选项作为解决长多列标题问题的方法

我正在使用booktabssiunitx用于在表格中排版科学数量的包。

众所周知,对于长列标题-- 使用multicolumn命令创建booktabs包——额外的列宽被分配给 的最后一列multicolumn。下表 1 显示了一个示例(显示垂直网格以强调列宽)。

我注意到siunitx包中有一个选项table-column-width可以设置固定列宽。我决定尝试使用此选项强制我的三个标记为的列的multicolumn宽度均为标题宽度的三分之一multicolumn

因此,在下面的 MWE 中,我使用\newlength\settowidthmulticolumn以 pt 为单位存储航向的长度myl。使用\the\myl表明multicolumn标题是128.6415pt。128.6415 除以 3 大约等于 42.88,因此在下面的表 2 中,我将每一列table-column-width设置为。42.88ptmulticolumn

表 2 看起来比表 1 好一些,但是为什么的总宽度multicolumn明显大于的视在宽度Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})

\documentclass{article}

\usepackage{amsmath,siunitx,booktabs}
\sisetup{%
  detect-family, detect-shape, detect-weight, detect-mode,
  product-units = power,
  list-final-separator = {, and },
  retain-explicit-plus,
  input-comparators = {<=>\approx\ge\geq\gg\le\leq\ll\sim\lesssim\gtrsim}
}

\begin{document}

% Table 1
\begin{table}[!h]
  \centering
  \begin{tabular}{l|
S[table-format=1.1,table-number-alignment=left]|
S[table-format=1.1,table-number-alignment=left]|
S[table-format=1.1,table-number-alignment=left]|}
    \toprule
    & \multicolumn{3}{c}{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})} \\
    \cmidrule(lr){2-4}
    & {$\alpha_1$} & {$\alpha_2$} & {$\alpha_3$} \\
    Trial A & 1.1 & 2.2 & 3.3 \\
    \bottomrule
  \end{tabular}\caption{Problem (MWE)}
\end{table}

% Store the length of the multicolumn header in \myl
\newlength{\myl}
\settowidth{\myl}{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})}
\the\myl

% Table 2
\begin{table}[!h]
  \centering
  \begin{tabular}{l|
S[table-format=1.1,table-number-alignment=left,table-column-width=42.88pt]|
S[table-format=1.1,table-number-alignment=left,table-column-width=42.88pt]|
S[table-format=1.1,table-number-alignment=left,table-column-width=42.88pt]|}
    \toprule
    & \multicolumn{3}{c}{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})} \\
    \cmidrule(lr){2-4}
    & {$\alpha_1$} & {$\alpha_2$} & {$\alpha_3$} \\
    Trial A & 1.1 & 2.2 & 3.3 \\
    \bottomrule
  \end{tabular}\caption{Attempt at solution}
\end{table}

\end{document}

输出

答案1

像这样?

在此处输入图片描述

最后三列应具有相等且足够长的宽度。您可以考虑X列类型(在tabularxtabularray包中定义),然后相应地设置表格宽度(通过试验)。对于后一种选择,MWE 为:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularray}
\UseTblrLibrary{booktabs, siunitx, varwidth}

\begin{document}
    \begin{table}[ht]
    \centering
\sisetup{table-format=1.1, table-number-alignment=left}
\begin{tblr}{width=0.6\linewidth,
             vlines,
             colspec = {l *{3}{X[c, si]} },
              row{2} = {mode=math},
             measure = vbox
             }
    \toprule
    & \SetCell[c=3]{c}    {{{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})}}}
                            &                   &                   \\
    \cmidrule{2-4}
        & {{{\alpha_1}}}    & {{{\alpha_2}}}    & {{{\alpha_3}}}    \\
    \midrule
Trial A & 1.1               & 2.2               & 3.3               \\
    \bottomrule
  \end{tblr}
\caption{Problem (MWE)}
    \end{table}
\end{document}

编辑: 或者通过多列单元格的宽度计算列宽在这种情况下您需要定义新的长度,例如\colwidth

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularray}
\UseTblrLibrary{booktabs, siunitx, varwidth}
\newlength{\colwidth}

\begin{document}
    \begin{table}[ht]
    \centering
\sisetup{table-format=1.1, table-number-alignment=left}
\settowidth\colwidth{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})}
\begin{tblr}{vlines,
             colspec = {l *{3}{Q[c, si, wd=\colwidth/3]} },
              row{2} = {mode=math},
             measure = vbox
             }
    \toprule
    & \SetCell[c=3]{c}    {{{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})}}}
                            &                   &                   \\
    \cmidrule{2-4}
        & {{{\alpha_1}}}    & {{{\alpha_2}}}    & {{{\alpha_3}}}    \\
    \midrule
Trial A & 1.1               & 2.2               & 3.3               \\
    \bottomrule
  \end{tblr}
\caption{Problem (MWE)}
    \end{table}
\end{document}

在此处输入图片描述

顺便说一句,带数字的单元格格式有点不寻常。人们更喜欢将数字和列标题居中:

在此处输入图片描述

如果您喜欢这个,请table-number-alignment=left从中删除选项\sisetup

编辑(2): 最后使用标准表格并定义 S列宽来解决。以下是设置的顺序:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tabularx}
\usepackage{makecell, siunitx}

\newlength{\colwidth}

\begin{document}
    \begin{table}[ht]
    \centering
\renewcommand\arraystretch{1.2}
\settowidth\colwidth{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})}
\sisetup{table-format=1.1,
         table-column-width=\colwidth/3}
\begin{tabular}{ | l  |*{3}{S|} }
    \Xhline{1pt}
    & \multicolumn{3}{c|}{Long parameter, $\alpha$ (\si{\kilo\newton\per\kilo\gram})}
                                                    \\
    \Xcline{2-4}{0.5pt}
    & {$\alpha_1$}  & {$\alpha_2$}  & {$\alpha_3$}  \\
    \Xhline{0.5pt}
Trial A & 1.1       & 2.2           & 3.3           \\
    \Xhline{1pt}
  \end{tabular}
\caption{Problem (MWE)}
    \end{table}
\end{document}

结果和以前一样。

相关内容