Estoy usando etoolbox
para el procesamiento de listas, específicamente \forcsvlist
.
Al pasar la lista separada por comas directamente a \forcsvlist
, puede analizar cada elemento de la lista. Sin embargo, si defino la variable de lista en otro lugar, \forcsvlist
no puedo distinguir entre cada elemento de la lista y lo toma como un argumento completo.
P.ej:
\newcommand\doforme[1]{#1 \\}
\forcsvlist\doforme{a,b,c}
El código anterior funciona perfectamente agregando una nueva línea al final de cada elemento. Pero el siguiente código no funciona
\newcommand\doforme[1]{#1 \\}
\def\@authors{a,b,c}
\forcsvlist\doforme{\@authors}
Esto me hace pensar que debe haber alguna otra forma de definir la lista que \forcsvlist
pueda interpretar.
Respuesta1
El problema al utilizar la forma variable fue su expansión anterior, que luego tomaría el todo a,b,c
como una sola entidad. Por entidad me refiero al único elemento de la lista.
Para resolver este problema, primero que nada necesitamos usar corchetes dobles aquí. Así {a,b,c}
es {{a,b,c}}
, cuya razón quedará clara al final de esta respuesta.
\expandafter
primitivo expande el argumento que se le da después del siguiente. Por ejemplo, si hay \def\foo{A}, \def\bar{B}
y \expandafter\foo\bar
, primero se convertirá en \foo B
, y luego eventualmente se convertirá en AB
.
De manera similar, puedo resolver el problema anterior en la pregunta de esta manera:
noindent\expandafter\forcsvlist\expandafter\doforme\authors
Si echamos un vistazo a la expresión recursiva anterior, el primer expandafter va a su primer argumento (\forcsvlist), lo omite por un momento e intenta expandir el argumento junto a él, que en este caso es nuevamente \expandafter
. Entonces, el segundo \expandafter
nuevamente se salta \doforme
por un tiempo y luego se expande \authors.
\authors
actualmente {{a,b,c}}
. Después de la expansión se convierte en {a,b,c}
. Entonces la expresión final ahora se convierte en
\noident\forcsvlist\doforme{a,b,c}
lo que equivale a pasar el argumento como el primer caso de la pregunta y, por tanto, producir los mismos resultados.
Respuesta2
El paquete etoolbox
define un comando especial para manejar listas internas: \forlistloop
. Estas listas utilizan un carácter especial como separador interno de listas. Por lo tanto, debe usar \listadd
(o comandos similares; consulte laetoolbox
documentación) para agregar un elemento a dicha lista.
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\newcommand\doforme[1]{#1 \\}
\forcsvlist{\listadd\authors}{a,b,c}
\noindent\forlistloop\doforme{\authors}
\end{document}