使用带有 keyval 宏扩展条目的 siunitx S 列

使用带有 keyval 宏扩展条目的 siunitx S 列

我有下表,可以使用常规“c”列进行编译,但不能使用 S 列。有没有办法使用 siunitx 包中的对齐功能来格式化下表?

\documentclass{article}

\usepackage{xkeyval}
\usepackage{siunitx}

\makeatletter
\define@key{results}{a}{\gdef\a{#1}}
\define@key{results}{b}{\gdef\b{#1}}
\define@key{results}{c}{\gdef\c{#1}}

\newcommand{\row}[1]{\setkeys{results}{#1}\a & \b & \c}

\begin{document}

\begin{center}
\begin{tabular}{ccc}%     % doesn't work as an S column
\row{a=1.112,b=4.5,c=5.6}\\
\row{a=3.2,b=6.134,c=-5.6}\\
\end{tabular}
\end{center}

\end{document}

我已经调查过希尼奇文档(特别是第 7.2 节(“扩展表格内容”)),但在实施他们的任何建议方面都没有取得很大成功。

似乎我应该希望\row{...}命令能够扩展与 S 列对齐,但我甚至不确定这是否是正确的问题

另外,我想使用 keyval 参数主要是因为我希望能够将超过 9 个参数传递给“row”命令。我可能不会使用所有输入值,但希望能够灵活地选择使用哪些值以及如何使用它们。此外,我喜欢使用命名宏\a & \b & \c而不是 格式化数据的想法#1 & #2 & #3,因为这似乎可以减少创建表条目时出错的可能性。

答案1

我不会用xkeyval这个,但是expl3

主要问题在于第一列:如果您想设置键,则不能设置第一列S;一个技巧是使用“幻影”列。

我添加了一个\rowformat命令来设置按键的顺序。图中第二个表与第一个表相同。

\documentclass{article}
\usepackage{xparse,siunitx}

\ExplSyntaxOn
\NewDocumentCommand{\rowformat}{m}
 {
  \seq_clear:N \l__donna_table_rowformat_seq
  \clist_map_inline:nn { #1 }
   {
    \seq_put_right:Nn \l__donna_table_rowformat_seq
     { \prop_item:Nn \l__donna_table_row_prop { ##1 } }
   }
  \cs_set_protected:Nx \__donna_row:
   {
    \exp_not:n { \tl_set:Nx \l__donna_table_row_tl }
     { & \seq_use:Nn \l__donna_table_rowformat_seq { & } }
   }
 }
\NewDocumentCommand{\row}{m}
 {
  \prop_clear:N \l__donna_table_row_prop
  \keys_set:nn { donna/table } { #1 }
  \__donna_row:
  \tl_use:N \l__donna_table_row_tl
 }
\prop_new:N \l__donna_table_row_prop
\seq_new:N \l__donna_table_rowformat_seq
\tl_new:N \g__donna_table_row_tl

\keys_define:nn { donna/table }
 {
  unknown .code:n = \prop_put:NVn \l__donna_table_row_prop \l_keys_key_tl { #1 },
 }
\cs_generate_variant:Nn \prop_put:Nnn { NV }
\ExplSyntaxOff

\begin{document}

\rowformat{a,b,c}

\begin{tabular}{
  c@{} % the phantom column
  S[table-format=1.3]
  S[table-format=1.3]
  S[table-format=-1.1]
}
\row{a=1.112,b=4.5,c=5.6}\\
\row{a=3.2,b=6.134,c=-5.6}\\
\end{tabular}

\begin{tabular}{
  S[table-format=1.3]
  S[table-format=1.3]
  S[table-format=-1.1]
}
1.112 & 4.5 & 5.6 \\
3.2 & 6.134 & -5.6\\
\end{tabular}

\rowformat{a,c,b}
\begin{tabular}{
  c@{}
  S[table-format=1.3]
  S[table-format=-1.1]
  S[table-format=1.3]
}
\row{a=1.112,b=4.5,c=5.6}\\
\row{a=3.2,b=6.134,c=-5.6}\\
\end{tabular}

\end{document}

在此处输入图片描述

相关内容