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