这是对先前的问题,因为我很难理解问题和答案。示例文件有一个很多继续,我认为如果我们使用一个更简单的例子,答案会更容易理解。
假设我有一个文件,table.csv
如下所示:
FirstName,LastName,Job
Bob,Builder,construction worker
Steve,Wumbo,Politician
Greembo,Flutes,Comedian
和一个 tex 文件,main.tex
如下所示:
\documentclass{article}
\usepackage{tabularray}
\usepackage{datatool}
\DTLloaddb{table}{table.csv}
\begin{document}
\begin{tblr}{}
First name & Last name & Occupation \\
\DTLforeach{table}{%
\firstname=FirstName,\lastname=LastName,\occupation=Job}{%
\firstname & \lastname & \occupation \\}
\end{tblr}
\end{document}
当我尝试编译这个时,lualatex 失败了,并给出了错误
! Misplaced alignment tab character &.
<argument> ...ow\romannumeral \dtlforeachlevel }}\firstname &
\lastname & \occupation \...
l.15 \end
{tblr}
结果吐出了一张很难看的表格。
为什么会发生这种情况?我该如何解决?
如果答案不仅仅是一段代码,而且还包括对工作代码的解释,我将不胜感激。
答案1
错误的原因在于\DTLforeach
没有在正确的时间展开。包手册中对此进行了解释tabularray
:“与传统的 tabular 环境相比,tabularray 环境需要查看每个&
and \\
”。
正如问题中提到的,这个问题和解决方案与如何在 tabularray 表中使用 DTLforeach(数据工具)?。
\DTLforeach
解决方案是首先在宏中收集的结果。此宏用 初始化\tl_new:N \tblrbody
。
在 中\DTLforeach
,内容用 收集\tl_build_put_right:Ne
。这里,\exp_not:V
使用 来恢复 的内容\firstname
,\lastname
并\occupation
防止扩展。对于提供的数据,这是不必要的,但如果数据包含 ,则这是必要的\emph{text}
。
此过程以 开始\tl_build_begin:N
并以 结束\tl_build_end:N
。此后,选项expand=\tblrbody
被赋予放置 的tblr
环境。\tblrbody
\documentclass[border=6pt]{standalone}
\usepackage{tabularray}
\usepackage{datatool}
\DTLloaddb{table}{table.csv}
\begin{document}
\ExplSyntaxOn
\tl_new:N \tblrbody
\tl_build_begin:N \tblrbody
\DTLforeach{table}{
\firstname=FirstName,
\lastname=LastName,
\occupation=Job
}{
\tl_build_put_right:Ne \tblrbody { \exp_not:V \firstname & \exp_not:V \lastname & \exp_not:V \occupation \\ }
}
\tl_build_end:N \tblrbody
\ExplSyntaxOff
\begin{tblr}[expand=\tblrbody]{}
First name & Last name & Occupation\\
\tblrbody
\end{tblr}
\end{document}