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, 15:23

Astrina's gravatar image

Astrina
37181925
Akzeptiert-Rate: 50%

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, 16:07) saputello
(07 Feb '20, 13:58) cis

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 oder Windows und vermutlich auch MacOS mit Hilfe von shellesc aussehen kann.

\documentclass{article}
\usepackage{ifplatform}
\usepackage{ifthen}
\usepackage{shellesc}% Wird eigentlich schon von ifplatform geladen.
\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}{%
  \ifwindows
    \ShellEscape{dir /b \arabic{ct}*Haupttermin.tex >>\jobname-files.dat}% wird unter Windows verwendet
  \else
    \ShellEscape{ls -1 \arabic{ct}*Haupttermin.tex>>\jobname-files.dat}% wird auf anderen System verwendet
  \fi
  \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.

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, 16:45

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 07 Feb '20, 12:38

1

@saputello Bei mir hat das mit der Windowszeile funktioniert.

(07 Jun '16, 16:18) esdd

@esdd: Danke fürs Testen.

(07 Jun '16, 16:23) saputello

@saputello Ich habe mit der Windows-Version leider keine Daten einbinden können. Es gibt aber auch keine Fehlermeldung. Ich weiß gar nicht was los ist :D Ich benutze den Editor TexWorks und habe natürlich zum pdflatex den shellesc hinzugefügt, hat aber anscheinend nicht gereicht. Ich kann auch keine temporäre Datei sehen, sollte sowas überhaupt zu sehen sein

Auch das ganze dokument im Test sagt irgendwann "sorry, didnt work"

Any help?

(07 Feb '20, 11:45) Dave

@Dave Wenn du nicht einmal die 20 Dateien »201*Haupttermin.tex«, eine log-Datei und eines aux-Datei hast, dann hast Du etwas sehr grundsätzliches falsch gemacht. Was das ist, kann ich mit den wenigen Infos aber nicht sagen. Probier es auf der Konsole, statt im Editor aus. Probier aus, ob ein normales TeX-Dokument vom Editor korrekt in ein PDF umgewandelt werden kann. Liefere mehr Informationen.

Ich habe den Kommentar aber mal zum Anlass genommen, das Beispiel so zu ändern, dass es ohne Änderung sowohl unter Linux als auch Windows (und vermutlich auch MacOSX) funktioniert.

(07 Feb '20, 12:24) saputello

@saputello Datatool selbst kann die Liste \jobname-files.dat nicht erstellen, richtig?

(07 Feb '20, 13:56) cis

@cis: Hast Du in der datatool-Anleitung irgend etwas von Dateisystemoperationen gelesen? Ich nicht. Da datatool ein LaTeX-Paket ist, würden dafür übrigens dieselben Bedingungen gelten, die ich bereits genannt habe.

(07 Feb '20, 14:33) saputello

@saputello habs hinbekommen, der -clean beim pdflatex befehl musste natürlich noch raus, damit die Datein entstehen können :D sau cool, dass nach 4 Jahren trotzdem direkt ne Antwort kommt!

@cis doch ;)

(07 Feb '20, 15:56) Dave
Ergebnis 5 von 7 show 2 more comments
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:

×21
×9
×2

gestellte Frage: 30 Sep '15, 15:23

Frage wurde gesehen: 11,706 Mal

zuletzt geändert: 07 Feb '20, 15:57