如何将 siunitx 和 tabularx 一起使用?

如何将 siunitx 和 tabularx 一起使用?

我正在使用 siunitx 的表格功能(就其价值而言:因为我使用的是 TexLive 2009,所以版本是 v1.3)来对齐表格中的数字,例如。

\begin{tabular}{ p{1.5cm} S S S }
bla & 1.23 & 4.5 & 67.89 \tabularnewline
\end{tabular}

并且一切运行良好。

现在我想让这个表格跨越特定的宽度,或者让几个表格具有相同的宽度。为此,我通常会使用 tabularx

\begin{tabularx}{\textwidth}{ p{1.5cm} X X X }
bla & 1.23 & 4.5 & 67.89 \tabularnewline
\end{tabular}

现在,有没有办法将两者结合起来?在自动调整大小的表格中使用 siunitx 的数字格式和对齐功能?

答案1

X然后将中的列tabularx转换p{<width>}宽度是自动计算的。您可以通过重新定义\tabularxcolumn宏来更改这一点,如包手册中所述:

\renewcommand{\tabularxcolumn}[1]{<column definition where #1 is the width>}

列在内部S使用列c。要将其替换为,p{<width>}您必须手动将的内部列定义放入S\tabularxcolumn以下代码在我的测试中有效。

\documentclass{article}

\usepackage{array}
\usepackage{tabularx}
\usepackage{siunitx}


\begingroup
% Allow `_` and `:` in macro names (LaTeX3 style)
\catcode`\_=11
\catcode`\:=11
% Internal code of `S`
\gdef\tabularxcolumn#1{%
    >{\__siunitx_table_collect_begin:Nn S{} }%
    p{#1}%  <- this is different (is `c` in normal `S`)
    <{\__siunitx_table_print:}%
}
\endgroup

\begin{document}

\begin{tabularx}{\textwidth}{p{1.5cm} XXX}
     bla & 1.23 & 4.5  & 67.89 \\
     bla & 1.2  & 4.50 &  7.89 \\
     bla &  .2  &  .50 & 67.8 \\
\end{tabularx}
\end{document}

答案2

采用 Martin 的解决方案并重新编码为siunitx,你可以这样做

\documentclass{article}

\usepackage{siunitx,tabularx}

\makeatletter
\def\tabularxcolumn#1{%
    >{\si@tab@begin@S[]}%
    p{#1}%  <- this is different (is `c` in normal `S`)
    <{\si@tab@end@S}%
}
\makeatother

\begin{document}

\begin{tabularx}{\textwidth}{p{1.5cm} XXX}
     bla & 1.23 & 4.5  & 67.89 \\
     bla & 1.2  & 4.50 &  7.89 \\
     bla &  .2  &  .50 & 67.8 \\
\end{tabularx}
\end{document}

答案3

相当新禁忌包似乎非常令人鼓舞。其手册的第 1.5 节明确介绍了如何嵌入的示例希尼奇's »S« 列在 »X« 列中。关于表格,这个包似乎是全能的。

答案4

不再需要复杂的黑客攻击,使用tabularray包!

tabularry可以拥有同时具有X类型(选项co=<n>n是可扩展列的系数,通常为 1,但您可以使用 2 来获得双倍宽度的列等)和S类型(选项si=<settings>)的列。

您甚至不必担心S列中存在非数字字段,只需在需要时使用选项guard即可。

在以下示例中,我创建了一个新的列类型A,它既是X,又S具有table-format作为参数。不过,您也可以Q直接使用列,并指定所有参数。

\documentclass[draft]{article}

\usepackage{tabularray}
\UseTblrLibrary{siunitx}
\sisetup{group-digits=false}
\NewColumnType{A}[1][2.2]{Q[si={table-format=#1},c,co=1]}

\usepackage{caption}

\begin{document}
With \texttt{tabularry} you can have columns that are at the same time \texttt{X} type (option \texttt{co=<n>}, where \texttt{n} is the coefficient for the extendable column, usually 1, but you can use 2 to have a column with double width, etc.) and \texttt{S} type (option \texttt{si=<settings>}).

You don't even have to worry about having non-numeric fields in the \texttt{S} columns, using option \texttt{guard} where needed.

\begin{table}[h]
\caption{A table with columns that are X and \texttt
{siunitx} at the same time}
\begin{tblr}{
    colspec={Q[1.5cm]Q[si={table-format=1.2},c,co=1]A[1.1]A},
    row{1}={guard}
    }
    Head 1 & Head 2 & Head 3 & Head 4\\
    bla & 1.23 & 4.5 & 67.89\\
    bla & 1.23 & 4.5 & 67.89\\
    bla & 1.23 & 4.5 & 67.89\\
\end{tblr}
\end{table}
\begin{table}[h]
\caption{A table with vertical lines to show the dimension of the columns}
\begin{tblr}{
    colspec={Q[1.5cm]*2{A[1.2]}A},
    row{1}={guard},
    vlines
    }
    Head 1 & Head 2 & Head 3 & Head 4\\
    bla & 1.23 & 4.5  & 67.89 \\
    bla & 1.2  & 4.50 &  7.89 \\
    bla &  .2  &  .50 & 67.8 \\
\end{tblr}
\end{table}
\end{document}

在此处输入图片描述

相关内容