Me gustaría crear una 'lista' de nombres de archivos en puntos arbitrarios de un documento y usar esa lista en el apéndice para cargar estos archivos. Entiendo que existe un concepto generalizado de una lista en TeX para contener elementos que se van a diseñar, pero estoy buscando una forma sencilla de agregar de manera flexible a una lista de elementos y, en un momento posterior, iterar sobre estos elementos para interpretarlos como '\entrada{elemento}'.
Busqué en Google un poco pero no apareció nada que parezca coincidir. Entonces, si ya se respondió, estaré feliz de seguir un enlace.
EDITAR: al mirar las respuestas, me di cuenta de que podría ser útil mantener los elementos de la lista únicos, es decir, agregar el mismo nombre de archivo dos veces no cargaría el archivo dos veces. ¿Sería eso posible (con un nivel razonable de simplicidad)?
Respuesta1
Existe una gestión de listas estándar en el kernel de LaTeX, basada en \@for
:
\makeatletter
\newcommand{\addtofilelist}[1]{%
\ifx\files@to@input@later\@empty
\g@addto@macro\files@to@input@later{#1}%
\else
\g@addto@macro\files@to@input@later{,#1}%
\fi
}
\let\files@to@input@later\@empty % initialize
\newcommand{\inputthefiles}{%
\@for\next:=\files@to@input@later\do{\input{\next}}%
}
\makeatother
Así que tú dices
\addtofilelist{foo.tex}
\addtofilelist{bar.tex}
cuando quieras y al final puedes emitir
\inputthefiles
que actuará según sea necesario.
Una expl3
técnica basada:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\addtofilelist}{m}
{
\seq_gput_right:Nn \g_regnirpsj_file_list_seq { #1 }
}
\NewDocumentCommand{\inputthefiles}{}
{
\seq_map_inline:Nn \g_regnirpsj_file_list_seq { \input{ ##1 } }
}
\seq_new:N \g_regnirpsj_file_list_seq
\ExplSyntaxOff
El uso es el mismo. Si desea poder agregar una lista de archivos con un solo \addtofilelist
comando, cambie la primera definición a
\NewDocumentCommand{\addtofilelist}{m}
{
\clist_map_inline:nn { #1 }
{
\seq_gput_right:Nn \g_regnirpsj_file_list_seq { ##1 }
}
}
y podrás decir, en cualquier momento dado
\addtofilelist{foo.tex, bar.tex}
con cualquier número de nombres de archivos separados por comas. Esto también es posible con la solución basada en el kernel, pero tenga en cuenta que en ese caso no se permiten espacios, mientras que en la solución basada se ignoran alrededor de las comas xparse
.
Respuesta2
Esto se puede hacer, por ejemplo, con etoolbox
la lista de utilidades.
Úselo, por ejemplo, \listgadd{\myfilelist}{}
como inicializador de una lista.
Luego, en 'cualquier' posición use \listgadd{\myfilelist}{file1}
o para un montón de archivos \forcsvlist{\listgadd{\myfilelist}}{file2, file3,file4}
.
Para ingresar todos los archivos en el apéndice, es bueno tener un comando contenedor, que hace algo de trabajo antes y después de ingresar cada archivo, pero sería suficiente decir
\forlistloop{\input}{\myfilelist}
,
que itera a través de la lista.
El primer argumento de todas las macros de iteradores de lista de etoolbox
esperar una rutina de elemento, que obtiene el elemento de la lista actual como último argumento.
\documentclass[12pt]{article}
\usepackage{etoolbox}%
\usepackage{blindtext}%
\listgadd{\myfilelist}{}%
\newcommand{\inputallfiles}[1]{%
\input{#1}%
}%
\begin{document}
\blindtext
\listgadd{\myfilelist}{file1}%
\blindtext[10]
\forcsvlist{\listgadd{\myfilelist}}{file2,file3,file1}%
\appendix%
\section{First}
\forlistloop{\inputallfiles}{\myfilelist}%
\end{document}
archivo1.tex
\textit{Hello World}
archivo2.tex
\textbf{Hello World}
archivo3.tex
\textsc{Hello World}
Como el OP solicitó una adición única de elementos de la lista - versión alternativa
Usando un comando contenedor para agregar elementos de la lista, es posible verificar si un elemento 'nuevo' ya está almacenado en la lista, usando el ifinlist
comando de etoolbox. Si esta prueba resulta false
, se puede agregar; de lo contrario, se ignora.
Agregué un command
\addtofilelist
que también funciona para elementos individuales o listas de elementos separados por comas.
En la \inputallfiles
macro agregué la prueba \InputIfFileExists...
para mayor seguridad.
\documentclass[12pt]{article}
\usepackage{etoolbox}%
\usepackage{blindtext}%
\listgadd{\myfilelist}{}%
\newcommand{\uniqueaddtolist}[2]{%
\ifdef{#1}{%
\ifinlist{#2}{#1}{%
% Do nothing
}{%
\listgadd{#1}{#2}%
}
}{% No list so far, so just add one!
\listgadd{#1}{#2}%
}%
}%
\newcommand{\uniqueaddtofilelist}[1]{%
\uniqueaddtolist{\myfilelist}{#1}%
}%
\newcommand{\addtofilelist}[1]{%
\forcsvlist{\uniqueaddtofilelist}{#1}%
}%
\newcommand{\inputallfiles}[1]{%
\InputIfFileExists{#1}{}{}%
}%
\begin{document}
\blindtext
\addtofilelist{file1}%
\blindtext[10]
\addtofilelist{file2,file3,file1}%
\appendix%
\section{First}
\forlistloop{\inputallfiles}{\myfilelist}%
\end{document}