Aufbauend auf dieser Frage:

Öffne in Overleaf
\documentclass[12pt,parskip=true]{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
Name,Vorname,Matrikelnummer
Mustermann,Max,12345
Musterfrau,Margit,23456
\end{filecontents*}

\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{,}
\DTLloaddb{namelist}{test.csv}

\begin{document}

\DTLforeach*{namelist}{
\Name=Name,%
\Vorname=Vorname,%
\Matrikelnummer=Matrikelnummer%
}{
\begin{center}
\Large\bfseries\Matrikelnummer \par
\bigskip
\Name, \Vorname
\end{center}
\clearpage
}

\end{document}

Ist es möglich, statt eines großen Dokuments jeden Durchlauf als eigenes PDF zu erhalten? Das würde den Druck deutlich erleichtern. Und wäre es dann auch möglich, für jeden Durchlauf eine tex-Datei zu bekommen?

gefragt 12 Nov '17, 10:33

Hirshy's gravatar image

Hirshy
73133645
Akzeptiert-Rate: 0%

bearbeitet 12 Nov '17, 10:59

TeX kann bei jedem TeX-Lauf nur eine Ausgabedatei erzeugen. Um also mehrere PDF-Dateien zu erzeugen, braucht man zwingend mehrere LaTeX-Läufe. Natürlich könntest Du bei jedem Durchlauf statt die Daten direkt zu setzen, eine neue TeX-Datei erzeugen und per shell escape dafür dann einen eigenen LaTeX-Lauf durchführen. Schneller dürfte aber sein, nur eine neue Seite zu beginnen und parallel eine Skriptdatei zu erzeugen, die anschließend die Gesamt-PDF-Datei beispielsweise mit pdftk zerlegt.

(12 Nov '17, 11:05) saputello

Ok, also erzeugt man mit Datatool ein großes PDF und kann es anschließend zerlegen. Für die andere Sache mit den tex-Files erstelle ich dann besser eine neue Frage, das war ein Einfall der mir eben spontan gekommen ist und eigentlich auf etwas anderes abzielt.

(12 Nov '17, 11:41) Hirshy

Das parallele Schreiben einer Skriptdatei zum nachträglichen Zerlegen des Gesamt-PDFs, das saputello in seinem Kommentar skizziert, könnte für das Beispiel aus der Frage so aussehen:

Öffne in Overleaf
\documentclass[12pt,parskip=true]{scrartcl}
\usepackage{filecontents}
\begin{filecontents*}{test.csv}
Name,Vorname,Matrikelnummer
Mustermann,Max,12345
Musterfrau,Margit,23456
\end{filecontents*}

\newwrite\scriptfile
\makeatletter
\AtBeginDocument{%
  \immediate\openout\scriptfile \jobname.sh % oder \jobname.bat
  \protected@write\scriptfile{}{\string#!/bin/sh}% bei \jobname.bat weglassen!
  \stepcounter{abspage}
}
\AfterReadingMainAux{%
  \immediate\closeout\scriptfile
}
\newcounter{abspage}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{,}
\DTLloaddb{namelist}{test.csv}

\begin{document}

\DTLforeach*{namelist}{
\Name=Name,%
\Vorname=Vorname,%
\Matrikelnummer=Matrikelnummer%
}{
  \clearpage
  \setcounter{page}{1}%
  \begin{center}
    \Large\bfseries\Matrikelnummer \par
    \bigskip
    \Name, \Vorname
  \end{center}
  \csname protected@write\endcsname\scriptfile{}{pdftk \jobname.pdf cat
    \theabspage-\the\numexpr\value{abspage}+\value{page}-1\relax\space output
    \jobname-\Matrikelnummer.pdf verbose}
  \addtocounter{abspage}{\value{page}}%
  \clearpage
}

\end{document}

Nach dem pdflatex-Lauf erhält man dabei auch ein Shellskript. Das macht man zunächst ausführbar (chmod u+x foo.sh) und führt es dann aus (./foo.sh). Anschließend erhält man für jeden Eintrag ein eigenes PDF, dessen Name sich aus dem Basisnamen der TeX-Datei (foo) gefolgt von einem Minus (-) und der Matrikelnummer (z. B. 23456) und natürlich der Endung .pdf zusammensetzt.

Windows-Anwender, die lieber eine batch-Datei haben wollen, lassen die Erstellung der Zeile #!/bin/sh (also die \protected@write-Anweisung in \AtBeginDocument) weg und verwenden als Endung .bat statt .sh. Dafür müssen sie die erzeugte Batch-Datei in der Regel auch nicht ausführbar machen. Mit PowerShell-Skripten kenne ich mich nicht aus.

Permanenter link

beantwortet 12 Nov '17, 11:51

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

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:

×17

gestellte Frage: 12 Nov '17, 10:33

Frage wurde gesehen: 5,566 Mal

zuletzt geändert: 12 Nov '17, 11:51