arquivo1.tex

arquivo1.tex

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 expl3té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 \addtofilelistcomando, 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 xparsesolução baseada.

Responder2

Isto pode ser feito, por exemplo, com etoolboxutilitá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 etoolboxrotina 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}

insira a descrição da imagem aqui

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 ifinlistcomando do etoolbox. Se este teste resultar false, ele pode ser adicionado, caso contrário, será ignorado.

Eu adicionei um command \addtofilelistque funciona para elementos únicos ou também para listas de elementos separados por vírgula.

Na \inputallfilesmacro 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}

informação relacionada