Estoy intentando generar automáticamente algunas líneas sangradas usando el tabbing
entorno y un @for
bucle. 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). \@for
realiza 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 #1
está el elemento actual (o ##1
el que estás usando \ListLoop
dentro de una definición).