\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
。如果我将列规范更改lll
为SSS
,则会出现许多神秘的错误。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}