考虑以下代码(取自这个答案由 egreg 撰写):
\documentclass{article}
\usepackage{xparse,siunitx,booktabs}
\ExplSyntaxOn
\cs_new_eq:NN \calc \fp_eval:n
\DeclareExpandableDocumentCommand{\dage}{m}
{
\fp_eval:n { 540 * ( #1 - 1 ) }
}
\DeclareExpandableDocumentCommand{\diastase}{m}
{
\fp_eval:n { 20 / 2^( #1 - 1 ) }
}
\NewDocumentCommand{\printtable}{smmmm}
{% * = transpose
% #2 = number of iterations
% #3 = column/row headers
% #4 = table preamble
% #5 = entry specs
\svend_preparetable:nnn { #2 } { #3 } { #5 }
\IfBooleanTF{#1}
{ \__svend_make_table_rows:nn { #3 } { #4 } }
{ \__svend_make_table_columns:nn { #3 } { #4 } }
}
\tl_new:N \l_svend_tablebody_tl
\prop_new:N \l_svend_entries_prop
\int_new:N \l_svend_rows_int
\int_new:N \l_svend_columns_int
\cs_new:Npn \svend_prop_item:Nnn #1 #2 #3
{
\prop_item:Nn #1 { #2, #3 }
}
\cs_generate_variant:Nn \svend_prop_item:Nnn { Nnf , Nfn }
\cs_new_protected:Npn \svend_preparetable:nnn #1 #2 #3
{% #1=iterations; #2=column/row headers; #3=specs
\int_set:Nn \l_svend_columns_int { \clist_count:n { #2 } }
\int_set:Nn \l_svend_rows_int { #1 }
\prop_clear:N \l_svend_entries_prop
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_rows_int }
{
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_columns_int }
{
\prop_put:Nnf \l_svend_entries_prop { ##1,####1 }
{
\clist_item:nn { #3 } { ####1 }
}
}
}
}
\cs_generate_variant:Nn \prop_put:Nnn { Nnf }
\cs_new_protected:Npn \__svend_make_table_columns:nn #1 #2
{
% start making the table body
\tl_set:Nn \l_svend_tablebody_tl
{
\begin{tabular}{ #2 }\toprule
}
% the header row
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_columns_int }
{
\tl_put_right:Nx \l_svend_tablebody_tl
{
\int_compare:nF { ##1 == 1 } { & }
{ \clist_item:nn { #1 } { ##1 } }
}
}
\tl_put_right:Nn \l_svend_tablebody_tl { \\ \midrule } % finish the row
% the table body proper
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_rows_int }
{
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_columns_int }
{
\tl_put_right:Nx \l_svend_tablebody_tl
{
\int_compare:nF { ####1 == 1 } { & }
\svend_prop_item:Nnn \l_svend_entries_prop { ##1 } { ####1 }
}
}
\tl_put_right:Nn \l_svend_tablebody_tl { \\ }
}
% finish up the table body
\tl_put_right:Nn \l_svend_tablebody_tl { \bottomrule \end{tabular} }
% produce the table
\tl_use:N \l_svend_tablebody_tl
}
\cs_new_protected:Npn \__svend_make_table_rows:nn #1 #2
{
% start building the table body
\tl_set:Nn \l_svend_tablebody_tl
{
\begin{tabular}{ #2 }\toprule
}
% the table body proper
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_columns_int }
{
\tl_put_right:Nx \l_svend_tablebody_tl
{
\clist_item:nn { #1 } { ##1 } &
}
\int_step_inline:nnnn { 1 } { 1 } { \l_svend_rows_int }
{
\tl_put_right:Nx \l_svend_tablebody_tl
{
\int_compare:nF { ####1 == 1 } { & }
\svend_prop_item:Nnn \l_svend_entries_prop { ####1 } { ##1 }
}
}
\tl_put_right:Nn \l_svend_tablebody_tl { \\ }
}
% finish up the table body
\tl_put_right:Nn \l_svend_tablebody_tl { \bottomrule \end{tabular} }
% produce the table
\tl_use:N \l_svend_tablebody_tl
}
\cs_generate_variant:Nn \prop_item:Nn { Nx }
\ExplSyntaxOff
\sisetup{
output-decimal-marker = {,}
}
\begin{document}
\begin{table}
\printtable*
{5}
{Antal d{\o}gn \hspace*{0.5em},
Diastasetal}
{l *{5}{c}}
{\dage{#1}, \diastase{#1}}
\end{table}
\end{document}
为什么小数部分的数字用一个圆点而不是逗号作为小数分隔符?(我按照 egreg 在评论中的建议添加了
\sisetup{
output-decimal-marker = {,}
}
但这确实有帮助。)
答案1
您需要使用siunitx
表列的特征:
\begin{table}
\printtable*
{5}
{Antal d{\o}gn \hspace*{0.5em},
Diastasetal}
{l *{5}{S[table-parse-only]}}
{\dage{#1}, \diastase{#1}}
\end{table}
将打印
siunitx
有关列类型的其他选项,请参阅手册S
。