archivo1.tex

archivo1.tex

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 expl3té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 \addtofilelistcomando, 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 etoolboxla 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 etoolboxesperar 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}

ingrese la descripción de la imagen aquí

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 ifinlistcomando de etoolbox. Si esta prueba resulta false, se puede agregar; de lo contrario, se ignora.

Agregué un command \addtofilelistque también funciona para elementos individuales o listas de elementos separados por comas.

En la \inputallfilesmacro 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}

información relacionada