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 cis |
Hier mal eine klassische Handwerkslösung mit 0) Erstmal habe ich mir einen Ordner angelegt, mit Hilfsdateien Open in writeLaTeX
Das ist die Datei alpha.tex 1) Als erstes brauchen wir eine Liste 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 ( Open in writeLaTeX
alpha.tex beta.tex gamma.tex main.tex liefert. Hierzu eine Anmerkung:
2) So, und jetzt können wir folgende Hauptdatei ( 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} 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 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. beantwortet 21 Sep '14, 00:09 cis 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 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 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 Es sei noch darauf hingewiesen, dass im angegebenen Verzeichnis beantwortet 22 Sep '14, 10:18 gast3 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 beantwortet 20 Sep '14, 23:32 ctansearch 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
(21 Sep '14, 15:27)
Johannes
Ich habe auch nur > verwendet.
(21 Sep '14, 16:10)
Mossbrucker
|
multido
,pgffor
, was dir beliebt. Wichtig ist aber, dass die Dateien so benannt sind, dass sich das automatisieren lässt.Die Namen der Dateien sind leider Namen von Personen, also lässt sich das wohl über die Dateinamen nicht automatisieren.
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).