In einem Unterverzeichnis habe ich über 70 tex-Dateien. Wie kann ich diese möglichst einfach, z.B. über eine Schleife, in ein LaTeX-Hauptdokument per input-Befehl einlesen? Ergänzung bzw. Konkretisierung: Die Anzahl der Dateien ist variabel; die Namen folgen leider keinem Schema (sie sind Namen von Personen).

gefragt 20 Sep '14, 20:35

Mossbrucker's gravatar image

Mossbrucker
74128
Akzeptiert-Rate: 0%

bearbeitet 21 Sep '14, 16:54

cis's gravatar image

cis
9.5k93459491

multido, pgffor, was dir beliebt. Wichtig ist aber, dass die Dateien so benannt sind, dass sich das automatisieren lässt.

(20 Sep '14, 20:42) Johannes

Die Namen der Dateien sind leider Namen von Personen, also lässt sich das wohl über die Dateinamen nicht automatisieren.

(20 Sep '14, 20:48) Mossbrucker

Hab es nicht probiert, aber eine foreach-Schleife könnte gehen. Die Mühe, die Dateinamen einzutippen, wird man sich in allen Fällen machen müssen (sofern diese nicht sequentiell simpel sind).

(20 Sep '14, 20:52) cis

Hier mal eine klassische Handwerkslösung mit datatool:

0) Erstmal habe ich mir einen Ordner angelegt, mit Hilfsdateien alpha.tex, beta.tex, gamma.tex; sie sehen inhaltlich schlicht so aus:

Open in writeLaTeX
Das ist die Datei alpha.tex

1) Als erstes brauchen wir eine Liste Files.csv, welche die genannten Dateien auflistet.

1a) Mit dem Windows-Befehl

Open in writeLaTeX
dir /s /p *.tex

erhalten wir folgende Übersicht über unsere einzubindenden Dateien:

Open in writeLaTeX
 Datenträger in Laufwerk C: ist Boot
 Volumeseriennummer: 8A59-DE79

 Verzeichnis von C:\Test

20.09.2014  23:13                27 alpha.tex
20.09.2014  23:13                26 beta.tex
20.09.2014  23:13                29 gamma.tex
20.09.2014  23:49               682 main.tex
               4 Datei(en),            764 Bytes

     Anzahl der angezeigten Dateien:
               4 Datei(en),            764 Bytes
               0 Verzeichnis(se), 121.686.958.080 Bytes frei

1b) Für unsere Zwecke passen wir den DIR-Befehl noch an:

Open in writeLaTeX
dir /b *.tex >Files.csv

was ohne Weiteres die Liste (Files.csv)

Open in writeLaTeX
alpha.tex
beta.tex
gamma.tex
main.tex

liefert.

Hierzu eine Anmerkung:

  • Die evtl. vorhandene Hauptdatei main.tex wird mitgefunden; wir werden sie später in der datatool-Schleife ausschließen.

2) So, und jetzt können wir folgende Hauptdatei (main.tex) übersetzen:

Open in writeLaTeX
\documentclass{article}

\usepackage{datatool}

%\DTLsetseparator{ }
\DTLloaddb[
  noheader,
  keys={name}
  ]{myfiles}{Files.csv}

\begin{document}
\section*{Einbindung der Dateien:}

\DTLforeach*[\not\DTLiseq{\Name}{main.tex}] 
{myfiles}{\Name=name}{%% 
    \section{\Name}
    \input{\Name}
 }%%
\end{document}

alt text







Zusatz: Wir könnten auch auf die Idee kommen, die o.g. Schritte automatisch in einem Zug, und zwar dokumentintern, auszuführen.

Dazu können wir arara (Weiteres: hier) und die arara-Regel console.yaml von @Clemens verwenden.

Mit arara kompilieren wir dann das gleiche Dokument, mit ergänztem arara-Dokumentkopf:

Open in writeLaTeX
% arara: console: { command: 'cmd /c dir /b *.tex >Files.csv' }
% arara: pdflatex

\documentclass{article}

\usepackage{datatool}

%\DTLsetseparator{ }
\DTLloaddb[
  noheader,
  keys={name}
  ]{myfiles}{Files.csv}

\begin{document}
\section*{Einbindung der Dateien:}

\DTLforeach*[\not\DTLiseq{\Name}{main2.tex}] 
{myfiles}{\Name=name}{%% 
    \section{\Name}
    \input{\Name}
 }%%
\end{document}

Was die selbe Ausgabe wie in 2) liefert.

Permanenter link

beantwortet 21 Sep '14, 00:09

cis's gravatar image

cis
9.5k93459491
Akzeptiert-Rate: 29%

bearbeitet 21 Sep '14, 12:40

So, AW überarbeitet - egtl. sehr simple alles - man sollte eben die richtige Liste erstellen ;)

(21 Sep '14, 11:55) cis

Perfekt für meine Bedürfnisse - Danke.

(21 Sep '14, 13:04) Mossbrucker

Es muß halt arara vorhanden sein, für die vollautomatische Lösung. Ich frage mal @PauloCereda, ob er die Konsolen-Regel in die neue arara-Version aufnehmen will.

(21 Sep '14, 13:07) cis

Bei Verwendung von lualatex kann man unabhängig vom Betriebssystem die darin enthaltene lfs-Erweiterung nutzen, um sämtliche Dateien eines Verzeichnisses zu ermitteln:

Open in writeLaTeX
\documentclass{article}

\usepackage{luacode}

\begin{document}
\section*{Einbindung der Dateien:}

\begin{luacode}
  fileend=".tex"
  searchdir="dir" -- Hier statt dir das gewünschte Verzeichnis angeben.
  for file in lfs.dir( searchdir ) do
    -- file ist jetzt die aktuelle Datei, von der wir noch testen müssen
    -- ob sie die Endung .tex hat
    if string.sub( file, #file-3 ) == fileend then
      print ( "Lese: " .. file )
      tex.print( "\\section*{" .. file .. "}\\input{".. searchdir .. "/" .. file .. "}" )
    end
  end
\end{luacode}
\end{document}

Dafür benötigt man nicht einmal --shell-escape. Wenn die LaTeX-Aktion, die man für die gefundene Datei anwenden möchte, etwas aufwendiger ist, lohnt es sich, ein Makro dafür zu definieren:

Open in writeLaTeX
\documentclass{article}

\usepackage{luacode}

\newcommand*{\doforfileindir}[2]{%
  \typeout{Lese Datei: `#1' in Verzeichnis `#2'}
  \section*{#1}
  \input{#2/#1}
}

\begin{document}
\section*{Einbindung der Dateien:}

\begin{luacode}
  local fileend=".tex"
  local searchdir="dir" -- Hier statt dir das gewünschte Verzeichnis angeben.
  for file in lfs.dir( searchdir ) do
    -- file ist jetzt die aktuelle Datei, von der wir noch testen müssen
    -- ob sie die Endung .tex hat
    if string.sub( file, #file-3 ) == fileend then
      tex.print( "\\doforfileindir{" .. file .."}{".. searchdir .. "}" )
    end
  end
\end{luacode}
\end{document}

Und natürlich kann man auch gleich ein Makro für das ganze definieren:

Open in writeLaTeX
\documentclass{article}

\usepackage{luacode}

\newcommand*{\doforfileindir}[2]{%
  \typeout{Lese Datei: `#1' in Verzeichnis `#2'}
  \section*{#1}
  \input{#2/#1}
}

\newcommand*{\inputalltexfilesin}[1]{%
  \luaexec{
    local fileend=".tex"
    local searchdir="#1"
    for file in lfs.dir( searchdir ) do
      % file ist jetzt die aktuelle Datei, von der wir noch testen müssen
      % ob sie die Endung .tex hat
      if string.sub( file, \#file-3 ) == fileend then
        tex.print( "\\doforfileindir{".. file.. "}{".. searchdir .. "}" )
      end
    end
  }
}

\begin{document}
\section*{Einbindung der Dateien:}
\inputalltexfilesin{dir}% Das Argument ist das Verzeichnis, das durchsucht wird.

\end{document}

Näheres zur Syntax von luacode und \luadirect ist der Anleitung zum Paket luacode zu entnehmen. Daraus erklärt sich dann auch, warum ich einmal Lua-Kommentare und einmal TeX-Kommentare verwende. Näheres zu Lua selbst findet man in der Lua-Dokumentation und zu LuaTeX in der Referenz-Anleitung.

Es sei noch darauf hingewiesen, dass im angegebenen Verzeichnis dir wie bei TeX üblich auch unter Windows / an Stelle von \\ zur Trennung zwischen Unterverzeichnisnamen zu verwenden ist.

Permanenter link

beantwortet 22 Sep '14, 10:18

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 22 Sep '14, 11:51

Sehr schöne Lösung. Gerade habe ich nur noch ein Problem mit "ß" in den Namen, die Umlaute kommen richtig, aber das "Problem" werde ich später angehen, wenn ich ein wenig mehr Zeit habe.

(23 Sep '14, 18:58) Mossbrucker

Unter Linux: cat *.tex>sammel.tex

Unter Windows vermutlich mit type,echo oder copy anstatt cat.

Einfach ausprobieren.

Dann input sammel.tex

Permanenter link

beantwortet 20 Sep '14, 23:32

ctansearch's gravatar image

ctansearch
(ausgesetzt)
Akzeptiert-Rate: 18%

bearbeitet 21 Sep '14, 21:43

Danke, das funktioniert. Da sich die Anzahl und Inhalte der einzelnen tex-Dateien regelmässig ändern (es sind Abwesenheitsblätter), wäre eine Lösung direkt im Hauptdokument - so ähnlich wie in der ersten Antwort - "schöner". Aber die Lösung über type ist auf jeden Fall sehr viel besser als alles von Hand eintippen.

(21 Sep '14, 00:05) Mossbrucker

>> schreibt hinten dran, die Einträge würden sich vervielfachen. Wäre nicht > besser?

(21 Sep '14, 15:27) Johannes

Ich habe auch nur > verwendet.

(21 Sep '14, 16:10) Mossbrucker
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×30
×12
×3
×2

gestellte Frage: 20 Sep '14, 20:35

Frage wurde gesehen: 15,144 Mal

zuletzt geändert: 23 Sep '14, 18:58