编辑
我最初的问题包含两个问题。Ulrike Fischer(以及后来的 Joseph Wright)能够解决第一个问题,即有关与包的列\newcolumntype
结合使用的问题。我建议进行编辑以专注于该特定问题。S
siunitx
这其他问题将在其自己的主题中讨论。
下面编辑的文本现在集中在如何定义新的列类型的问题上。
我想使用包siunitx
及其S
列在表格环境中显示数字。
我原本的计划是使用 来\newcolumntype
定义一个新列d
并赋予它两个参数,以获得更大的灵活性。但我失败了,LaTeX 甚至无法编译,而是因超出 TeX 容量而中止。
这是具有三种相同表格风格的 MWE。第一个和第二个示例确实可以编译,请参见下图中的结果。
第三次迭代根本无法编译:-(因此,我添加了注释,使其成为在职的例如。如果你想和我一起受苦,就把它们除去。
\documentclass[11pt,final]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{siunitx}
\usepackage{xcolor}
\usepackage{booktabs}
%% For headings
\newcolumntype{H}{>{\scriptsize}c}
%% New column types, using the S column of package siunitx
%% d-column: #1 ist the number of integers, #2 is the number of decimals
\newcolumntype{d}[2]{S[table-figure-integer=#1, table-figure-decimal=#2]}
%% f-column: #1 is the number of integers, the decimals are 2 digits fixed.
\newcolumntype{f}[1]{S[table-figure-integer=#1, table-fiugre-decimal=2]}
%% e-column, same as above, but with automated rounding.
\newcolumntype{f}[1]{S[table-figure-integer=#1, table-fiugre-decimal=2, table-auto-round]}
\begin{document}
%% This works.
\begin{tabular}{%
@{}
lr
S[table-format=4.5]
S[table-format=4.2]
S[table-format=4.2, table-auto-round=true]
@{}}
\toprule
\multicolumn{5}{@{}H@{}}{Columntype} \\
\multicolumn{2}{@{}H}{normal}
& \multicolumn{3}{H@{}}{siunitx} \\
\multicolumn{1}{H@{}}{l} & \multicolumn{1}{H}{r}
& \multicolumn{1}{H}{d\{4\}\{5\}} & \multicolumn{1}{H}{e\{2\}}
& \multicolumn{1}{H@{}}{f\{2\}} \\
\cmidrule(r){1-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4} \cmidrule(l){5-5}
1.2345 & 1.2345 & 1,2345 & 1,2345 & 1,2345 \\
123.45 & 123.45 & 123,45 & 123,45 & 123,45 \\
.12345 & .12345 & ,12345 & ,12345 & ,12345 \\
1234 & 1234 & 1234 & 1234 & 1234 \\
-123 & -123 & -123 & -123 & -123 \\
\bottomrule
\end{tabular}
%% This works kind of! The second S column is wider than above. The
%% last column is not rounded to 2 decimal places :-(
\begin{tabular}{%
@{}
lr
S[table-figures-integer=4, table-figures-decimal=5]
S[table-figures-integer=4, table-figures-decimal=2]
S[table-figures-integer=4, table-figures-decimal=2, table-auto-round=true]
@{}}
\toprule
\multicolumn{5}{@{}H@{}}{Columntype} \\
\multicolumn{2}{@{}H}{normal}
& \multicolumn{3}{H@{}}{siunitx} \\
\multicolumn{1}{H@{}}{l} & \multicolumn{1}{H}{r}
& \multicolumn{1}{H}{d\{4\}\{5\}} & \multicolumn{1}{H}{e\{2\}}
& \multicolumn{1}{H@{}}{f\{2\}} \\
\cmidrule(r){1-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4} \cmidrule(l){5-5}
1.2345 & 1.2345 & 1,2345 & 1,2345 & 1,2345 \\
123.45 & 123.45 & 123,45 & 123,45 & 123,45 \\
.12345 & .12345 & ,12345 & ,12345 & ,12345 \\
1234 & 1234 & 1234 & 1234 & 1234 \\
-123 & -123 & -123 & -123 & -123 \\
\bottomrule
\end{tabular}
%% Now, lets try the new defined d, e and f column.
%% This does not even compile! TeX capacity exceeded!
% \begin{tabular}{%
% @{}
% lr
% d{4}{5}
% e{4}
% f{4}
% @{}}
% \toprule
% \multicolumn{5}{@{}H@{}}{Columntype} \\
% \multicolumn{2}{@{}H}{normal}
% & \multicolumn{3}{H@{}}{siunitx} \\
% \multicolumn{1}{H@{}}{l} & \multicolumn{1}{H}{r}
% & \multicolumn{1}{H}{d\{4\}\{5\}} & \multicolumn{1}{H}{e\{2\}}
% & \multicolumn{1}{H@{}}{f\{2\}} \\
% \cmidrule(r){1-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4} \cmidrule(l){5-5}
% 1.2345 & 1.2345 & 1,2345 & 1,2345 & 1,2345 \\
% 123.45 & 123.45 & 123,45 & 123,45 & 123,45 \\
% .12345 & .12345 & ,12345 & ,12345 & ,12345 \\
% 1234 & 1234 & 1234 & 1234 & 1234 \\
% -123 & -123 & -123 & -123 & -123 \\
% \bottomrule
% \end{tabular}
\end{document}
该文件由 TeXLive 2021 编译,使用siunitx
v2.8e,最后修订于 2021-04-17。
什么地方出了错?
有没有什么方法可以避免S[long lists of options and values]
在表格环境的声明中写入麻烦,正如我打算使用三个新的列字母d
和e
一样f
?
答案1
上一个示例的主要问题是,您定义的列类型使用了字符,而这些字符又出现在内部列描述中。这意味着:这里的 x 列没有问题,但 o 会中断,因为“格式”包含 o。
\documentclass[]{article}
\usepackage{siunitx}
\newcolumntype {x}{S[table-format=2.4]} %works
\newcolumntype {o}{S[table-format=2.4]}%breaks if used
\begin{document}
\begin{tabular}{x}
1.2345
\end{tabular}
\end{document}
我通常更喜欢对列类型使用命令标记:
\documentclass[]{article}
\usepackage{siunitx}
\newcolumntype\intdec[2]{S[table-format=#1.#2]}
\begin{document}
\begin{tabular}{\intdec{2}{4}}
1.2345
\end{tabular}
\end{document}
答案2
S[...]
使用 v3,您可以使用文档化的界面来创建新的列类型。这避免了与标准语法有些混乱的事实array
,标准语法会因使用键中的字母的选项而产生混淆:
\documentclass[11pt,final]{scrartcl}
\usepackage{array}
\usepackage{siunitx}
\usepackage{booktabs}
%% For headings
\newcolumntype{H}{>{\scriptsize}c}
\ExplSyntaxOn
\cs_new_protected:Npn \jan_newcolumntype:nnn #1#2#3
{
\newcolumntype {#1} [#2]
{
> { \keys_set:nn { siunitx } {#3} \siunitx_cell_begin:w }
c
< { \siunitx_cell_end: }
}
}
%% New column types, using the S column of package siunitx
%% d-column: #1 ist the number of integers, #2 is the number of decimals
\jan_newcolumntype:nnn { d } { 2 }
{ table-format = #1.#2 }
%% f-column: #1 is the number of integers, the decimals are 2 digits fixed.
\jan_newcolumntype:nnn { f } { 1 }
{ table-format = #1.2 ] }
%% e-column, same as above, but with automated rounding.
\jan_newcolumntype:nnn { e } { 1 }
{ table-format = #1.2 , table-auto-round }
\ExplSyntaxOff
\begin{document}
%% Now, lets try the new defined d, e and f column.
%% This does not even compile! TeX capacity exceeded!
\begin{tabular}{%
@{}
lr
d{4}{5}
e{4}
f{4}
@{}}
\toprule
\multicolumn{5}{@{}H@{}}{Columntype} \\
\multicolumn{2}{@{}H}{normal}
& \multicolumn{3}{H@{}}{siunitx} \\
\multicolumn{1}{H@{}}{l} & \multicolumn{1}{H}{r}
& \multicolumn{1}{H}{d\{4\}\{5\}} & \multicolumn{1}{H}{e\{2\}}
& \multicolumn{1}{H@{}}{f\{2\}} \\
\cmidrule(r){1-2} \cmidrule(lr){3-3} \cmidrule(lr){4-4} \cmidrule(l){5-5}
1.2345 & 1.2345 & 1,2345 & 1,2345 & 1,2345 \\
123.45 & 123.45 & 123,45 & 123,45 & 123,45 \\
.12345 & .12345 & ,12345 & ,12345 & ,12345 \\
1234 & 1234 & 1234 & 1234 & 1234 \\
-123 & -123 & -123 & -123 & -123 \\
\bottomrule
\end{tabular}
\end{document}