考虑以下示例。
\documentclass{article}
\usepackage[locale = DE]{siunitx}
\usepackage{booktabs}
\begin{document}
\def\accuracy{2}
\begin{table}
\centering
\begin{tabular}{
S[table-format = 1]
S[table-format = 1.\accuracy]
S[table-format = 2.\accuracy]
}
\toprule
{Time, $x$}
& {Erosion per year, $g(x)$}
& {Erosion in total, $h(x)$} \\[0.75ex]
{Year}
& {\unit{\m}}
& {\unit{\m}} \\
\midrule
1 & 2.25 & 2.25 \\
2 & 3.14 & 5.39 \\
3 & 4.98 & 10.37 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}
当我使用中定义的值\accuracy
作为第二列和第三列对齐的小数位数指标时,对齐相当于小数点后 1 位而不是 2 位。我做错了什么,该如何解决?
当我\accuracy
以-column2
格式替换时S
,一切都正常。
PS 我在其他地方使用相同数量的小数;这就是我将值存储在中的原因\accuracy
。
答案1
虽然我不认为这是一个彻头彻尾的错误,但显然它并不理想:在其他地方,表格单元格在检查数字之前就被展开了。因此,我将进行调整table-format
以对此进行排序。目前,您可以添加
\ExplSyntaxOn
\makeatletter
\keys_define:nn { siunitx }
{
table-format .code:n =
{
\group_begin:
\protected@edef \l__siunitx_table_tmp_tl {#1}
\exp_args:NNV \group_end:
\__siunitx_table_split:nNNN \l__siunitx_table_tmp_tl
\l__siunitx_table_before_model_tl
\l__siunitx_table_model_tl
\l__siunitx_table_after_model_tl
\exp_args:NV \__siunitx_table_generate_model:n \l__siunitx_table_model_tl
\tl_set:Nn \l__siunitx_table_align_mode_tl { format }
}
}
\makeatother
\ExplSyntaxOff
到您的来源。
更新
代码已添加到siunitx
自版本 3.0.14 起的软件包;请参阅https://www.ctan.org/ctan-ann/id/[电子邮件保护]。
答案2
问题在于扩张。siunitx
table-format
在解析时不会完全展开 的值。您可以在将其传递给 之前对其进行展开,然后一切正常(您必须注意,在 的参数中,通过或siunitx
保护表读取其前导码之前不应展开的任何内容):\noexpand
\unexpanded{<things>}
\expanded
\documentclass{article}
\usepackage[locale = DE]{siunitx}
\usepackage{booktabs}
\begin{document}
\def\accuracy{2}
\begin{table}
\centering
\expanded{\noexpand\begin{tabular}{
S[table-format = 1]
S[table-format = 1.\accuracy]
S[table-format = 2.\accuracy]
}}
\toprule
{Time, $x$}
& {Erosion per year, $g(x)$}
& {Erosion in total, $h(x)$} \\[0.75ex]
{Year}
& {\unit{\m}}
& {\unit{\m}} \\
\midrule
1 & 2.25 & 2.25 \\
2 & 3.14 & 5.39 \\
3 & 4.98 & 10.37 \\
\bottomrule
\end{tabular}
\end{table}
\end{document}