@for 循环在制表环境中打印变量名称而不是内容

@for 循环在制表环境中打印变量名称而不是内容

tabbing我正在尝试使用环境和循环自动生成一些缩进行@for。出于某种原因,这导致 for 循环反复打印迭代变量的名称而不是内容。我做错了什么?

梅威瑟:

\documentclass{article}
\begin{document}
\begin{tabbing}
a \= b\\
\> c\\
\makeatletter
\@for\ij:=abc,def\do{\>\ij{}\\}
\makeatother
\end{tabbing}
\end{document}

答案1

表格单元格会创建组,因此当 TeX 转到另一个单元格时(此处,当您使用\>转到下一列或\\下一行时),任何非全局分配都会丢失。 \@for对循环变量进行本地分配,因此当表格单元格结束时,它自然会丢失。您会看到打印循环变量的“名称”,因为您选择了\ij,其标准定义打印荷兰二合字母“ij”。如果您使用了\ii(或任何未定义的),您将收到错误。

如果循环变量是 之后的第一个变量\>,则可以采取一种欺骗手段,在表格单元格以 结束之前扩展循环变量\expandafter。如果循环变量之前有任何内容,则此方法将不起作用(无需调整):

\@for\ii:=abc,def\do{\expandafter\>\ii{}\\}

您还可以在结束表格单元格之前分配给全局变量,然后就可以让全局变量出现在任何地方。

\@for\ii:=abc,def\do{\global\let\jj=\ii  \> something \jj{}\\}

但我建议使用不使用循环变量的循环函数。例如expl3's \clist_map_inline:nn(此处重命名为\ListLoop):

\documentclass{article}
\ExplSyntaxOn
\cs_new_eq:NN \ListLoop \clist_map_inline:nn
\ExplSyntaxOff
\begin{document}
\begin{tabbing}
a \= b\\
\> c\\
\ListLoop{abc,def}{\>#1\\}
\end{tabbing}
\end{document}

第一个参数是需要迭代的列表,第二个参数是在每次迭代时执行的代码,其中#1是当前项(或者您在定义中##1使用)。\ListLoop

相关内容