Estou tentando gerar automaticamente algumas linhas recuadas usando o tabbing
ambiente e um @for
loop. 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). \@for
faz 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 #1
está o item atual (ou ##1
o que você está usando \ListLoop
dentro de uma definição).