Nome da variável do loop @for impresso em vez do conteúdo no ambiente de tabulação

Nome da variável do loop @for impresso em vez do conteúdo no ambiente de tabulação

Estou tentando gerar automaticamente algumas linhas recuadas usando o tabbingambiente e um @forloop. Por alguma razão, isso resulta no loop for imprimindo o nome da variável de iteração repetidamente, em vez do conteúdo. O que estou fazendo de errado?

MWE:

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

Responder1

As células da tabela criam grupos, portanto, qualquer atribuição não global é perdida quando o TeX vai para outra célula (aqui, quando você usa \>para ir para a próxima coluna ou \\para a próxima linha). \@forfaz uma atribuição local à variável do loop, portanto ela é naturalmente perdida quando a célula da tabela termina. Você vê o "nome" da variável de loop sendo impresso porque escolheu \ij, cuja definição padrão imprime o dígrafo holandês "ij". Se você tivesse usado \ii(ou algo não definido), receberia um erro.

Se a variável de loop for a primeira coisa depois de \>, você poderá trapacear e expandir a variável de loop antes que a célula da tabela termine com \expandafter. Isso não funcionará (sem adaptação) se houver algo antes da variável do loop:

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

Você também pode atribuir a uma variável global antes de finalizar a célula da tabela e, então, fazer com que a variável global apareça em qualquer lugar.

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

Mas eu recomendo usar uma função de loop que não use uma variável de loop. Por exemplo, expl3's \clist_map_inline:nn(aqui renomeado como \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}

O primeiro argumento é a lista a ser iterada, e o segundo é o código a ser executado a cada iteração, no qual #1está o item atual (ou ##1o que você está usando \ListLoopdentro de uma definição).

informação relacionada