我正在使用 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
答案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}