Ich habe Dateien deren Namen aus zwei Bestandteilen bestehen, sagen wir mal, 2001ParabelHaupttermin.tex, 2001ParabelNachtermin.tex, 2001GeometrielHaupttermin.tex usw.

Mit einer inputiffileexists kann man ja abfragen, ob bestimmte Dateien existieren, und dann entscheiden, was zu tun ist.
Was ich jetzt bräuchte, wäre ein Platzhalter, den ich benutzen kann, um alle Dateien einzulesen, die vom Haupttermin sind. Im Dateimanager würde ich mit *Haupttermin danach suchen. Gibt es in Latex eine Entsprechung zu diesem Sternchen?

Open in Online-Editor
\newcounter{ct}\setcounter{ct}{2000}
\whiledo{\value{ct} < 2016}{\stepcounter{ct}\InputIfFileExists{\arabic{ct}*Haupptermin}{\arabic{ct}*Haupttermin}{}}

gefragt 30 Sep '15, 09:23

Astrina's gravatar image

Astrina
336719
Akzeptiert: 93%

LaTeX hat keine Dateisystemoperationen. Entweder erstellst Du die Liste extern und verarbeitest sie dann beispielsweise mit datatool oder Du verwendest dafür lualatex, weil dessen Lua-Seite die lfs-Erweiterungen enthält, die beispielsweise lsf.dir, das man zur Abfrage der Dateinamen in einem Verzeichnis benötigt, oder Du delegierst via \write18 die Dateisystemabfrage an das OS, was dann aber zunächst einmal nicht mehr portabel ist.

(30 Sep '15, 10:07) saputello

LaTeX hat selbst keine Dateisystemoperationen. Man muss also Umwege gehen, um die Dateien eines Verzeichnisses zu ermitteln. Hier einmal ein Beispiel, wie das unter Linux mit Hilfe von shellesc aussehen kann.

Open in Online-Editor
\documentclass{article}
\usepackage{ifthen}
\usepackage{shellesc}
\newcounter{ct}% den brauchen wir später auf jeden Fall

% Aber, erst einmal generiere ich ein paar Dateien lediglich zu Demozwecken.
% Der Teil wird natürlich nur benötigt, wenn man wie ich noch keine Dateien zum Testen hat.
\setcounter{ct}{2010}
\makeatletter
\whiledo{\value{ct}<2016}{%
  \@for \dummyfilename:=A,B,C,Doof\do{%
    \immediate\openout\@mainaux \arabic{ct}\dummyfilename Haupttermin.tex
    \immediate\write\@mainaux{Das ist Datei \arabic{ct}\dummyfilename
      Haupttermin.tex.}%
    \immediate\closeout\@mainaux
  }%
  \stepcounter{ct}%
}
\makeatother

% Ab hier braucht man es auch, wenn man bereits echte Testdateien hat.
% Jetzt löschen und initialisieren wir mal eben die temporäre Datei für die Dateiliste.
\makeatletter
\immediate\openout\@mainaux \jobname-files.dat
\immediate\write\@mainaux{Filename}
\immediate\closeout\@mainaux
\makeatother

% Jetzt verwenden wir \write18, um UNTER LINUX die Dateiliste zu erzeugen
\setcounter{ct}{2000}
\whiledo{\value{ct} < 2015}{%
  \ShellEscape{ls -1 \arabic{ct}*Haupttermin.tex>>\jobname-files.dat}% Linux spezifisch
  %\ShellEscape{dir /b \arabic{ct}*Haupttermin.tex >>\jobname-files.dat}% Windows spezifisch
  \stepcounter{ct}%
}

\usepackage{datatool}
\DTLloaddb{Filenames}{\jobname-files.dat}

\begin{document}
% Jetzt verwenden wir datatool um alle Dateien einzulesen.
\DTLforeach{Filenames}{\filename=Filename}{\InputIfFileExists{\filename}{\par}{}}
\end{document}

Ergibt dann:

Ausgabe

Dabei wird \ShellEscape verwendet, um mit ls -1 eine Datei zu erzeugen, in der zeilenweise die gefundenen Dateinamen stehen. Diese Datei wird dann mit Hilfe von datatool verarbeitet und für jeden Eintrag \InputIfFileExists aufgerufen. Natürlich kann man in der Schleife auch ganz andere Dinge mit den Dateinamen anfangen.

Damit das ganze funktioniert, müssen shell escapes aktiviert sein. Dazu muss man pdflatex mit Option -shell-escape aufrufen, also ggf. im Editor den Aufruf von pdflatex entsprechend um diese Option erweitern.

Für Windows muss man natürlich die mit »Linux spezifisch« markierte Zeile auskommentieren, indem man ein % an den Anfang der Zeile stellt, und die mit »Windows spezifisch« markierte, auskommentierte Zeile aktivieren, indem man das % am Anfang entfernt.

Achja: \@mainaux wird verwendet, um ein write handle zu sparen. In der Dokumentpräambel hat LaTeX zwar \@mainaux bereit per \newwrite angefordert, aber noch nicht verwendet. Also kann ich es einfach mal zweckentfremden, solange ich die damit angelegten und geschriebenen Dateien bis \begin{document} auch wieder schließe. Ab \begin{document} darf ich es natürlich nicht mehr verwenden, um in eigene Dateien etwas zu schreiben.

Permanenter link

beantwortet 30 Sep '15, 10:45

saputello's gravatar image

saputello
18.4k22352

bearbeitet 07 Jun, 10:23

1

@saputello Bei mir hat das mit der Windowszeile funktioniert.

(07 Jun, 10:18) esdd

@esdd: Danke fürs Testen.

(07 Jun, 10:23) saputello
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×15
×3
×1

Frage gestellt: 30 Sep '15, 09:23

Frage wurde angeschaut: 4,127 Mal

Zuletzt aktualisiert: 07 Jun, 10:23