gostaria de criar uma 'lista' de nomes de arquivos em pontos arbitrários de um documento e usar essa lista no apêndice para carregar esses arquivos. eu entendo que existe um conceito generalizado de lista no TeX para conter itens a serem dispostos, mas estou procurando uma maneira simples de adicionar de forma flexível a uma lista de itens e, posteriormente, iterar sobre esses itens para interpretá-los como '\input{item}'.
pesquisei um pouco no Google, mas não apareceu nada que parecesse corresponder. então, se isso já foi respondido, ficarei feliz em seguir um link.
EDIT: olhando as respostas acabei de perceber que pode ser útil manter os itens da lista exclusivos, ou seja, adicionar o mesmo nome de arquivo duas vezes não carregaria o arquivo duas vezes. isso seria possível (com um nível razoável de simplicidade)?
Responder1
Existe um gerenciamento de lista padrão no kernel LaTeX, baseado em \@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
Então você diz
\addtofilelist{foo.tex}
\addtofilelist{bar.tex}
quando quiser e no final você pode emitir
\inputthefiles
que agirá conforme necessário.
Uma expl3
técnica baseada:
\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
O uso é o mesmo. Se você quiser adicionar uma lista de arquivos com um único \addtofilelist
comando, altere a primeira definição para
\NewDocumentCommand{\addtofilelist}{m}
{
\clist_map_inline:nn { #1 }
{
\seq_gput_right:Nn \g_regnirpsj_file_list_seq { ##1 }
}
}
e você poderá dizer, a qualquer momento
\addtofilelist{foo.tex, bar.tex}
com qualquer número de nomes de arquivos separados por vírgulas. Isso também é possível com a solução baseada em kernel, mas tome cuidado, pois espaços não são permitidos nesse caso, embora sejam ignorados entre vírgulas na xparse
solução baseada.
Responder2
Isto pode ser feito, por exemplo, com etoolbox
utilitários de lista.
Use, por exemplo, \listgadd{\myfilelist}{}
como inicializador de uma lista.
Depois, em 'qualquer' posição use \listgadd{\myfilelist}{file1}
or para vários arquivos \forcsvlist{\listgadd{\myfilelist}}{file2, file3,file4}
.
Para inserir todos os arquivos no apêndice, é bom ter um comando wrapper, que faz algum trabalho antes e depois da entrada de cada arquivo, mas bastaria dizer
\forlistloop{\input}{\myfilelist}
,
que itera pela lista.
O primeiro argumento para todas as macros iteradoras de lista da etoolbox
rotina expect an element, que obtém o elemento da lista atual 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}
arquivo1.tex
\textit{Hello World}
arquivo2.tex
\textbf{Hello World}
arquivo3.tex
\textsc{Hello World}
Como o OP solicitou uma adição única de elementos da lista – versão alternativa
Utilizando um comando wrapper para adição de elementos da lista, é possível verificar se um 'novo' elemento já está armazenado na lista, utilizando o ifinlist
comando do etoolbox. Se este teste resultar false
, ele pode ser adicionado, caso contrário, será ignorado.
Eu adicionei um command
\addtofilelist
que funciona para elementos únicos ou também para listas de elementos separados por vírgula.
Na \inputallfiles
macro adicionei o teste \InputIfFileExists...
para mais segurança.
\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}