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 \printlist
dentro del \author
comando, 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}
Si uso un separador sin salto de línea, por ejemplo ::
, lo anterior funciona como se esperaba.
Agregar saltos de línea adicionales \\
en el \author
comando también conduce al resultado esperado:
\author{\printlisti[::]{abc,def,ghi}\\123\\456\\789}
Parece que la combinación de \printlist
saltos de línea \\
está causando un problema. ¿Cómo?
Respuesta1
El argumento \author
se escribirá en un formato tabular
. Cada celda forma su propio grupo, por lo que la definición interna \itemdelim
y la definición de \do
no 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 tabular
y no generará un mensaje de error.
Deberá hacer las definiciones de \itemdelim
(para la entrada que no es la primera) y \do
global:
\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 \itemdelim
directamente \do
y omitirlo \itemdelim
usando #1
directamente:
\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 \defdo
podemos evitar definir \do
global (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 \do
fila 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 \do
también es "global" porque se define en el nivel superior del documento.
Definir \do
global no debería crear un conflicto ya que cualquier otro código que lo utilice \do
debería haberlo definido él mismo sin asumir ninguna definición. Mezclar asignaciones/definiciones globales y localespodría ser desordenado, por lo que \savelist
podría ser preferible usarlo.
Mirando más allá etoolbox
, el paquete de LaTeX3 l3clist
proporciona \clist_use:Nn
que 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}