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, 04:33

Hirshy's gravatar image

Hirshy
441520
Akzeptiert: 87%

bearbeitet 12 Nov, 04: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, 05: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, 05: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, 05:51

Ijon%20Tichy's gravatar image

Ijon Tichy
5.8k1919

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

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:

×14

Frage gestellt: 12 Nov, 04:33

Frage wurde angeschaut: 128 Mal

Zuletzt aktualisiert: 12 Nov, 05:51