Nombre de la variable del bucle @for impreso en lugar del contenido en el entorno de tabulación

Nombre de la variable del bucle @for impreso en lugar del contenido en el entorno de tabulación

Estoy intentando generar automáticamente algunas líneas sangradas usando el tabbingentorno y un @forbucle. Por alguna razón, esto hace que el bucle for imprima el nombre de la variable de iteración una y otra vez en lugar del contenido. ¿Qué estoy haciendo mal?

MWE:

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

Respuesta1

Las celdas de la tabla crean grupos, por lo que cualquier asignación no global se pierde cuando TeX va a otra celda (aquí, cuando usas \>para ir a la siguiente columna o \\a la siguiente fila). \@forrealiza una asignación local a la variable de bucle, por lo que naturalmente se pierde cuando finaliza la celda de la tabla. Verá que se imprime el "nombre" de la variable de bucle porque eligió \ij, cuya definición estándar imprime el dígrafo holandés "ij". Si hubiera usado \ii(o cualquier cosa no definida), obtendría un error.

Si la variable de bucle es lo primero después de \>, puede hacer trampa y expandir la variable de bucle antes de que la celda de la tabla termine con \expandafter. Esto no funcionará (sin adaptación) si hay algo antes de la variable de bucle:

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

También puede asignar a una variable global antes de finalizar la celda de la tabla, luego puede hacer que la variable global aparezca en cualquier lugar.

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

Pero recomendaría usar una función de bucle que no utilice una variable de bucle. Por ejemplo, expl3's \clist_map_inline:nn(aquí renombrado 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}

El primer argumento es la lista a iterar, y el segundo es el código a ejecutar en cada iteración, en el cual #1está el elemento actual (o ##1el que estás usando \ListLoopdentro de una definición).

información relacionada