Faltan saltos de línea en \author si procesa la salida de otro comando

Faltan saltos de línea en \author si procesa la salida de otro comando

Enesta publicación, encontré un buen truco para manejar listas. El siguiente código permite imprimir listas con un argumento separador opcional.

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\printlist}[2][,]{%
  \def\itemdelim{\def\itemdelim{#1}}% Item delimiter delayed by one cycle
  \renewcommand*{\do}[1]{\itemdelim##1}% How each item is processed
  \docsvlist{#2}}% Process CSV list
\begin{document}
$\printlist{1,2,3,4,5,6,7}$ \par
$\printlist[;]{a,b,c,d,e,f}$
\end{document}

Sin embargo, si lo uso \printlistdentro del \authorcomando, en combinación con una nueva línea \\, esto no funcionará correctamente: el salto de línea se establece solo para el primer elemento de la lista. Para todos los demás elementos, se ignora el salto de línea:

\documentclass{article}

\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\printlist}[2][;]{%
  \def\itemdelim{\def\itemdelim{#1}}% Item delimiter delayed by one cycle
  \renewcommand*{\do}[1]{\itemdelim##1}% How each item is processed
  \docsvlist{#2}}% Process CSV list

\title{Test}
\author{\printlist[,\\]{abc,def,ghi,jkl}}
\begin{document}
\maketitle
\end{document}

caso fallido

Si uso un separador sin salto de línea, por ejemplo ::, lo anterior funciona como se esperaba.

Prueba exitosa 1

Agregar saltos de línea adicionales \\en el \authorcomando también conduce al resultado esperado:

\author{\printlisti[::]{abc,def,ghi}\\123\\456\\789}

Prueba exitosa 2

Parece que la combinación de \printlistsaltos de línea \\está causando un problema. ¿Cómo?

Respuesta1

El argumento \authorse escribirá en un formato tabular. Cada celda forma su propio grupo, por lo que la definición interna \itemdelimy la definición de \dono sobrevivirán a la primera fila.

Básicamente, esto es lo que está sucediendo:

\begin{tabular}{c}
  \def\itemdelim{test} \\
  \itemdelim
\end{tabular}

y lo mismo para \do, aunque en la segunda fila tendrá la misma definición que fuera de tabulary no generará un mensaje de error.


Deberá hacer las definiciones de \itemdelim(para la entrada que no es la primera) y \doglobal:

\newcommand{\printlist}[2][;]{%
  \def\itemdelim{\gdef\itemdelim{#1}}%
  \gdef\do##1{\itemdelim##1}%
  \docsvlist{#2}}
\author{\printlist[,\\]{abc,def,ghi,jkl}}

Sin embargo, puedes aplicar el “truco” de \itemdelimdirectamente \doy omitirlo \itemdelimusando #1directamente:

\newcommand{\printlist}[2][;]{%
  \def\do##1{##1\gdef\do####1{#1####1}}%
  \docsvlist{#2}}
\author{\printlist[,\\]{abc,def,ghi,jkl}}

Con otra macro auxiliar como \defdopodemos evitar definir \doglobal (a costa de otra macro definida para todo el documento):

\newcommand*\defdo[1]{%
  \def\do##1{#1\defdo{#1}##1}}%
\newcommand{\printlist}[2][;]{%
  \def\do##1{##1\defdo{#1}}%
  \docsvlist{#2}}%
\author{\printlist[,\\]{abc,def,ghi,jkl}}

Esto introduce la definición de \dofila en fila detrás \\para que esté disponible en la siguiente fila.


Alternativamente, puede procesar previamente la lista y simplemente reenviarla a \author:

\newcommand{\savelist}[3][;]{%
  \renewcommand*\do[1]{%
    \newcommand*#3{##1}%
    \renewcommand*\do[1]{%
      \appto#3{#1####1}%
    }%
  }%
  \docsvlist{#2}}
\savelist[,\\]{abc,def,ghi,jkl}\authors
\author{\authors}

En este caso, la definición de \dotambién es "global" porque se define en el nivel superior del documento.

Definir \doglobal no debería crear un conflicto ya que cualquier otro código que lo utilice \dodebería haberlo definido él mismo sin asumir ninguna definición. Mezclar asignaciones/definiciones globales y localespodría ser desordenado, por lo que \savelistpodría ser preferible usarlo.


Mirando más allá etoolbox, el paquete de LaTeX3 l3clistproporciona \clist_use:Nnque no necesita ninguna definición para simplemente colocar algo ( #1= ,\\) entre las entradas de una lista:

\documentclass{article}
\ExplSyntaxOn
\DeclareDocumentCommand{\printlist}{ O{;} m}{
  \clist_set:Nn \l_tmpa_clist {#2}
  \clist_use:Nn \l_tmpa_clist {#1}
}
\ExplSyntaxOff
\author{\printlist[,\\]{abc,def,ghi,jkl}}
\title{Test}
\begin{document}
\maketitle
\end{document}

información relacionada