datei1.tex

datei1.tex

ich möchte an beliebigen Stellen in einem Dokument eine „Liste“ mit Dateinamen erstellen und diese Liste im Anhang verwenden, um diese Dateien zu laden. Ich verstehe, dass es in TeX ein allgemeines Listenkonzept zum Aufbewahren von Elementen gibt, die angeordnet werden sollen, aber ich suche nach einer einfachen Möglichkeit, eine Liste mit Elementen flexibel zu erweitern und diese Elemente zu einem späteren Zeitpunkt zu durchlaufen, um sie als „\input{item}“ zu interpretieren.

ich habe ein bisschen gegoogelt, aber nichts Passendes gefunden. Wenn das also bereits beantwortet wurde, folge ich gerne einfach einem Link.

BEARBEITEN: Beim Durchsehen der Antworten ist mir gerade aufgefallen, dass es sinnvoll sein könnte, die Listenelemente eindeutig zu halten, d. h. wenn derselbe Dateiname zweimal hinzugefügt wird, wird die Datei nicht zweimal geladen. Wäre das (mit einem angemessenen Maß an Einfachheit) möglich?

Antwort1

Es gibt eine Standardlistenverwaltung im LaTeX-Kernel, basierend auf \@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

Also sagst du

\addtofilelist{foo.tex}

\addtofilelist{bar.tex}

wann immer Sie wollen und am Ende können Sie

\inputthefiles

das wie erforderlich handelt.


Eine expl3fundierte Technik:

\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

Die Verwendung ist die gleiche. Wenn Sie eine Liste von Dateien mit einem einzigen Befehl hinzufügen möchten \addtofilelist, ändern Sie die erste Definition in

\NewDocumentCommand{\addtofilelist}{m}
 {
  \clist_map_inline:nn { #1 }
   {
    \seq_gput_right:Nn \g_regnirpsj_file_list_seq { ##1 }
   }
 }

und Sie können jederzeit sagen:

\addtofilelist{foo.tex, bar.tex}

mit einer beliebigen Anzahl von Dateinamen, die durch Kommas getrennt sind. Dies ist auch mit der kernelbasierten Lösung möglich, aber beachten Sie, dass in diesem Fall keine Leerzeichen zulässig sind, während sie in der xparsekernelbasierten Lösung um Kommas herum ignoriert werden.

Antwort2

etoolboxDies kann beispielsweise mit List-Utilities erfolgen .

Verwenden Sie es beispielsweise \listgadd{\myfilelist}{}als Initialisierer für eine Liste.

Anschließend können Sie an „jeder beliebigen“ Stelle \listgadd{\myfilelist}{file1}oder für eine Reihe von Dateien verwenden \forcsvlist{\listgadd{\myfilelist}}{file2, file3,file4}.

Um alle Dateien im Anhang einzugeben, ist es gut, einen Wrapper-Befehl zu haben, der vor und nach der Eingabe jeder Datei einige Arbeiten erledigt, aber es würde ausreichen zu sagen

\forlistloop{\input}{\myfilelist},

das die Liste durchläuft.

Das erste Argument aller Listeniteratormakros etoolboxerwartet eine Elementroutine, die das aktuelle Listenelement als letztes Argument erhält.

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

datei1.tex

\textit{Hello World}

file2.tex

\textbf{Hello World}

file3.tex

\textsc{Hello World}

Bildbeschreibung hier eingeben

Da der OP eine einmalige Hinzufügung von Listenelementen verlangte - alternative Version

Mit einem Wrapper-Befehl zum Hinzufügen von Listenelementen kann mit dem ifinlistBefehl von etoolbox überprüft werden, ob bereits ein „neues“ Element in der Liste gespeichert ist. Wenn dieser Test ein Ergebnis liefert false, kann es hinzugefügt werden, andernfalls wird es ignoriert.

Ich habe eins hinzugefügt command \addtofilelist, das auch für einzelne Elemente oder durch Kommas getrennte Listen von Elementen funktioniert.

Im Makro habe ich für mehr Sicherheit \inputallfilesden Test eingebaut .\InputIfFileExists...

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

verwandte Informationen