以下代码片段
\RequirePackage{xparse}
\documentclass{article}
\usepackage{tabu}
\ExplSyntaxOn
\NewDocumentCommand\trop{}{
\int_step_inline:nnnn{0}{1}{3}{
a & b & c & d\\
}
\hline
}
\ExplSyntaxOff
\begin{document}
\begin{tabu}{|*{4}{X[c]|}}
\trop
\end{tabu}
\end{document}
失败
! Misplaced \noalign.
\hline ->\noalign
{\ifnum 0=`}\fi {\CT@arc@ \hrule height\arrayrulewidth }\f...
l.18 \end{tabu}
! Misplaced \noalign.
\hline ->\noalign
{\ifnum 0=`}\fi {\CT@arc@ \hrule height\arrayrulewidth }\f...
l.18 \end{tabu}
! Misplaced \noalign.
\hline ->\noalign
{\ifnum 0=`}\fi {\CT@arc@ \hrule height\arrayrulewidth }\f...
l.18 \end{tabu}
就像在最后一个\\
和之间插入了一些东西\hline
,但我不知道它是什么。这可能是tabu
和 Expl 语法之间的不良交互吗?我尝试将\ExplSyntaxOn
/Off
直接放入其中tabu
,但它们似乎没有任何效果。
答案1
事实并非如此tabu
,标准也存在同样的问题tabular
。
当\int_step_inline:nnnn
结束其工作时,新的一行已经开始,您可以通过排版表格来看到\hline
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\trop{}{
\int_step_inline:nnnn{0}{1}{3}{
a & b & c & d\\
}
% \hline
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{|c|c|c|c|}
\trop
\end{tabular}
\end{document}
从某种意义上说,你的分析是正确的:就好像最后有一些无法扩展的东西,导致开始新的一行。
如果您的目的是提供多个相同的行,则可以使用\prg_replicate:nn
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\trop{}
{
\prg_replicate:nn { 4 } { a & b & c & d \\ }
\hline
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{|c|c|c|c|}
\trop
\end{tabular}
\end{document}
如果行具有根据当前步骤而变化的数据,则可以构建令牌列表并传递它。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\trop{}
{
\tl_clear:N \l_tmpa_tl
\int_step_inline:nnnn { 0 } { 1 } { 3 }
{ \tl_put_right:Nn \l_tmpa_tl { ##1 & b & c & d \\ } }
\tl_use:N \l_tmpa_tl
\hline
}
\ExplSyntaxOff
\begin{document}
\begin{tabular}{|c|c|c|c|}
\trop
\end{tabular}
\end{document}
xparse
顺便说一下,之前无需加载\documentclass
。