如何(如果有的话)可以在 siunitx 表中使用 datatool 的 \DTLforeachkeyinrow?

如何(如果有的话)可以在 siunitx 表中使用 datatool 的 \DTLforeachkeyinrow?
\documentclass{article}

\usepackage{etoolbox}
\usepackage{siunitx}
\usepackage{datatool}

\DTLnewdb{data}
\DTLnewrow{data}
\DTLnewdbentry{data}{x}{1}
\DTLnewdbentry{data}{y}{2}
\DTLnewdbentry{data}{z}{3}
\DTLnewrow{data}
\DTLnewdbentry{data}{x}{4}
\DTLnewdbentry{data}{y}{5}
\DTLnewdbentry{data}{z}{6}

%\robustify\DTLforeachkeyinrow

\begin{document}

%\begin{tabular}{SSS}
\begin{tabular}{lll}
    %\robustify\DTLforeachkeyinrow
    {x} & {y} & {z} \\
    \DTLforeach{data}{}{%
        %\robustify\DTLforeachkeyinrow%
        \DTLforeachkeyinrow{\dataValue}{%
            \ifnumgreater{\dtlcol}{1}{&}{}%
            \dataValue%
        }\\
    }
\end{tabular}

\end{document}
This is pdfTeX, Version 3.14159265-2.6-1.40.21 (TeX Live 2020/NixOS.org) (preloaded format=pdflatex 2021.2.2)  22 FEB 2021 12:13
[...]
LaTeX2e <2020-10-01>
L3 programming layer <2020-10-05> xparse <2020-03-03>

使用列lll,这可以正常工作,生成一个包含 的所有数据的表格datatool。如果我将列规范更改lllSSS,则会出现许多神秘的错误。siunitx手册 §7.2 建议\robustify执行该datatool命令,但尝试\robustify\DTLforeachkeyinrow在代码中的不同位置散布该命令似乎没有帮助。

我可以\DTLforeachkeyinrow和一起使用吗siunitx假设数据库中有足够多的列,以至于在第二个参数中列出它们全部\DTLforeach会很烦人。


我想我可以通过先扩展表体来实现这一点,比如-

\ExplSyntaxOn
\exp_last_unbraced:Ne \begin {
    \exp_not:n {
        {tabular}{SSS}
            {x} & {y} & {z} \\
    }
    \DTLforeach{data}{}{
        \DTLforeachkeyinrow{\dataValue}{
            \int_compare:nNnT {\dtlcol} > {1} {\exp_not:N &}
            \dataValue
        }
        \exp_not:N \\
    }
    \exp_not:N \end{tabular}
}

-但这给出了另一个我不明白的错误,

! Incomplete \iffalse; all text was ignored after line 34.

答案1

搜索我尝试时收到的“不完整的 \iffalse”错误消息expl3,我看到这个答案由 egreg 提醒我尝试在它外面构建表的主体,在一个不那么繁琐的上下文中。这有效:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{siunitx}
\usepackage{datatool}

\DTLnewdb{data}
\DTLnewrow{data}
\DTLnewdbentry{data}{x}{1.1}
\DTLnewdbentry{data}{y}{2.2}
\DTLnewdbentry{data}{z}{3.3}
\DTLnewrow{data}
\DTLnewdbentry{data}{x}{4.4}
\DTLnewdbentry{data}{y}{5.5}
\DTLnewdbentry{data}{z}{6.6}

\begin{document}

\ExplSyntaxOn

% I know it's customary to use the question-asker's username as the L3 macro
% name prefix, but `user570286' isn't valid in a TeX macro name....
\tl_new:N \l__SIDataTab_body_tl

\DTLforeach {data} {} {
    \DTLforeachkeyinrow \g__SIDataTab_val_tl {
        \tl_put_right:Nx \l__SIDataTab_body_tl {
            \int_compare:nNnT {\dtlcol} > {1} {&}
            \exp_not:V \g__SIDataTab_val_tl
        }
    }
    \tl_put_right:Nn \l__SIDataTab_body_tl {\\}
}

\begin{tabular}{SSS}
    {x} & {y} & {z} \\
    \l__SIDataTab_body_tl
\end{tabular}

\end{document}

相关内容