Definir una variable de lista

Definir una variable de lista

Estoy usando etoolboxpara 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, \forcsvlistno 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 \forcsvlistpueda interpretar.

Respuesta1

El problema al utilizar la forma variable fue su expansión anterior, que luego tomaría el todo a,b,ccomo 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.

\expandafterprimitivo 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 \expandafternuevamente se salta \doformepor un tiempo y luego se expande \authors. \authorsactualmente {{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 etoolboxdefine 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 laetoolboxdocumentació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}

información relacionada