PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dateinamen und Wildcards



pi-c
09-12-2015, 15:20
Hallo!

Bei größeren Projekten gehe ich so vor, dass ich in einer Datei die Präambel habe und von dort aus weitere Dateien mit Textteil, Anhang, Abbildungen etc. lade. In der Datei für den Textteil stehen dann Input- bzw. Include-Befehle für die Dateien mit den einzelnen Textkapiteln. Bisher habe ich diese Datei von der Bash aus gefüllt:


ls [0-9]*tex | sort | sed -e 's/^\(.\+\)$/\\include{\1}/' > text-input.tex

Lässt sich das vielleicht auch so gestalten, dass direkt von LaTeX aus die Dateien dynamisch geladen werden? Gesetzt den Fall, ich weiß, dass das Dokument einmal 10 Kapitel haben soll, die aber noch nicht alle vorliegen. Nehmen wir an, vorhanden seien die Kapitel 1, 2, 3, 6, 8. Die könnte ich nach obiger Methode laden; sie erscheinen dann in der richtigen Reihenfolge, aber wenn ich das Dokument compiliere, erhalte ich statt der Kapitelnummern 1, 2, 3, 6, 8 alle Kapitel fortlaufend nummeriert, also 1, 2, 3, 4, 5.

Ich würde jetzt gerne direkt in LaTeX eine Lösung haben, wo eine Schleife von 1 bis 10 läuft, in der geschaut wird, ob es eine Datei gibt, deren Name mit dem aktuellen Zählerwert beginnt und auf ".tex" endet. Wenn die Datei vorhanden ist, soll sie geladen werden, ansonsten soll der Wert für den Counter "chapter" um 1 erhöht werden. Damit hätte das Dokument, das ich bearbeite, dann zwar Lücken im Inhaltsverzeichnis, aber die Kapitelnummern wären schon so, wie sie in der Endversion sein sollen.

Mit dem Paket forloop kann ich die Schleife realisieren, und mit \IfFileExists kann man wohl feststellen, ob eine Datei existiert. Aber anscheinend kann man dabei nicht nach Wildcards suchen, oder? Das hier funktioniert jedenfalls nicht:


\newcounter{loop}
\forloop[1]{loop}{1}{\value{loop} < 10}{%
\IfFileExists{\arabic{loop}-*.tex}
{\noindent\arabic{loop}: File found\newline}
{\noindent\arabic{loop}: File not found\newline}%
}

Als Output erhalte ich dabei nur "File not found". Weiß vielleicht jemand, was da verkehrt läuft?

Falls ich \IfExistsFile dazu bewegen könnte, die Dateien zu finden, hätte ich aber immer noch das Problem, dass ich den genauen Dateinamen nicht kenne -- ich wüsste dann nur, dass es eine Datei, deren Name dem Muster entspricht, gibt. Wie kann ich an den Dateinamen kommen, damit ich die Datei dann auch per \include laden kann?

Beste Grüße

Andreas

G.Hanisch
09-12-2015, 17:22
Lieber Andreas,
eine triviale - bei weitem nicht so elegante - Lösung ist die, dass ich Dummy-Files, die nur die Überschrift enthalten, verwende.

MhG

Günter

rais
11-12-2015, 21:30
Mit dem Paket forloop kann ich die Schleife realisieren, und mit \IfFileExists kann man wohl feststellen, ob eine Datei existiert. Aber anscheinend kann man dabei nicht nach Wildcards suchen, oder?

das würde IMHO den Gebrauch von \IfFileExists ad absurdum führen, der ja gerade schauen soll, ob eine bestimmte Datei vorhanden ist, AFAIR.


Falls ich \IfExistsFile dazu bewegen könnte, die Dateien zu finden, hätte ich aber immer noch das Problem, dass ich den genauen Dateinamen nicht kenne
Warum nicht?
Wenn ich auch nur eine .tex in einem Dokument laden will, dann weiß ich vorm Laden schon, wie das Teil heißt...


-- ich wüsste dann nur, dass es eine Datei, deren Name dem Muster entspricht, gibt. Wie kann ich an den Dateinamen kommen, damit ich die Datei dann auch per \include laden kann?

etwa so (erfordert -shell-escape):


\documentclass{article}
\newread\myread
\newif\ifmylsendnotseen
\newif\ifmylsfirstrun
\newcommand*\myreadline{}% eingelesene Zeile
\newcommand*\mylslist{}% die zu erzeugende Dateiliste
\newcommand*\myls{%
\edef\myreadline{}% falls da schon was drinstand...
\openin\myread=|"ls -1 [1-9]-*.tex"\relax
\ifeof\myread
\typeout{Keine passenden .tex-Dateien gefunden.}%
\typeout{Oder `ls' liess sich nicht aufrufen...}%
\typeout{Piping erlaubt? (-shell-escape)}%
\else
\mylsendnotseentrue% p.d. noch nicht am Ende
\mylsfirstruntrue% p.d. erster Treffer zu erwarten
\loop\ifmylsendnotseen\relax
\read\myread to \myreadline %Zeile einlesen
\if\par\myreadline\relax %Test auf Ende
\mylsendnotseenfalse
\else
\ifmylsfirstrun %erster Treffer überschreibt Liste:
\edef\mylslist{\myreadline}%
\mylsfirstrunfalse
\else % alle anderen Treffer werden an Liste angehängt:
\edef\mylslist{\mylslist,\myreadline}%
\fi
\fi
\repeat % nächsten Treffer suchen
\fi
\closein\myread % Handle schließen
}%
\makeatletter
\newcommand*\listmylslist{%
\@for\i:=\mylslist\do{%
\i\par
}%
}
\makeatother

\begin{document}
\myls
\listmylslist
\end{document}

wobei, wenn Du den `ls -1' durch `kpsewhich' ersetzt, wär's sogar auf anderen Architekturen (die kein `ls' verstehen) übersetzbar; OTOH würden damit aber auch Dateien entlang von kpathsea gefunden werden, die dem Suchpattern entsprechen, vgl.`texdoc kpathsea'.
Das ist bei mir derzeit zwar nicht der Fall, aber nach einem etwaigem Update mag das anders aussehen.

VG