![使用带有 keyval 宏扩展条目的 siunitx S 列](https://linux22.com/image/339459/%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%20keyval%20%E5%AE%8F%E6%89%A9%E5%B1%95%E6%9D%A1%E7%9B%AE%E7%9A%84%20siunitx%20S%20%E5%88%97.png)
我有下表,可以使用常规“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}