siunitx 包中的 \newcolumntype 和 S 列的奇怪行为

siunitx 包中的 \newcolumntype 和 S 列的奇怪行为

编辑

我最初的问题包含两个问题。Ulrike Fischer(以及后来的 Joseph Wright)能够解决第一个问题,即有关与包的列\newcolumntype结合使用的问题。我建议进行编辑以专注于该特定问题。Ssiunitx

其他问题将在其自己的主题中讨论。

下面编辑的文本现在集中在如何定义新的列类型的问题上。


我想使用包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 编译,使用siunitxv2.8e,最后修订于 2021-04-17。

什么地方出了错?

有没有什么方法可以避免S[long lists of options and values]在表格环境的声明中写入麻烦,正如我打算使用三个新的列字母de一样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}

相关内容