我经历了一次(恐怕不是那么原始的)“错位的 noalign”,例如以下示例。
\documentclass{article}
\usepackage{booktabs}
\usepackage{datatool}
\begin{document}
\DTLnewdb{mydb}
\DTLnewrow{mydb}
\DTLnewdbentry{mydb}{column}{entry}
\begin{tabular}{l}
top\\
\DTLforeach*{mydb}{}{3\\}
\bottomrule
\end{tabular}
\end{document}
得出的结果为:
Misplaced \noalign.
\bottomrule ->\noalign
{\ifnum 0=`}\fi \@aboverulesep =\aboverulesep \global...
l.25 \bottomrule
并且可能还有更多看似没有意义的错误(Missing \cr inserted
...)。
如果注释掉 DTL 行或者将其替换为其应该生成的内容(即3\\
),则错误消失。
我观察到,将\\
第一个放在最后一个位置可以解决这个问题。但这通常需要一个条件,使用\DTLiffirstrow
,因为 for each 循环的结果通常不应以 开头(例如,在典型的紧跟命令\\
的情况下),并且会使代码稍微模糊一些。\DTLforeach
\toprule
我还期望在环境中构建表格tabular
(遵循常见的 建议) 也能解决问题,但代价是使代码的可读性大大降低。
我想知道我是否做错了什么,或者我的本地安装是否有问题,因为这个问题似乎很少发生观察到的并且数据工具手册建议可以使用和 booktabs 一起(我见过一些类似的错误信息与使用 booktabs 相关,但我怀疑我的问题不同,因为我不使用该\input
命令。)
在我看来,这两种方法更像是在解决问题,而不是解决问题。因此,我的问题是:有没有更优雅的解决方案来解决这个问题?(例如,通过在序言中修补一些 booktabs 或 DTL 命令。)
答案1
你隐藏了 DTLforeach 中的最后一个 \,这会将其与 \bottomrule 分开。这不起作用。
在表格外构建行:
\documentclass{article}
\usepackage{booktabs}
\usepackage{datatool,etoolbox}
\begin{document}
\DTLnewdb{mydb}
\DTLnewrow{mydb}
\DTLnewdbentry{mydb}{column}{entry}
\newcommand\tabrows{}
\DTLforeach*{mydb}{}{\appto\tabrows{3\\}}
\begin{tabular}{l}
top\\
\tabrows
\bottomrule
\end{tabular}
\end{document}