LaTeX-Wörterbuch: Serienbrief mit externen Daten

Aus Wikibooks

Dieses Dokument beschäftigt sich mit dem Einlesen von Adressdaten für Serienbriefe aus einer externen Datenquelle. Zur Gestaltung von Briefen im Allgemeinen siehe: Brief.

Beschreibung[Bearbeiten]

Öffnen und Schließen der Datei[Bearbeiten]

Um einen Serienbrief mittels einer externen Datenquelle zu erstellen, muss diese eingelesen werden.

Dazu wird die Datenquelle zunächst geöffnet:

 \newread\quelle
 \openin\quelle=Daten.csv

Dabei wird mittels newread eine neue Variable, hier quelle angelegt. Mittels openin wird dann die Datei Daten.csv in die Variable eingelesen.

Nach Abschluss des Einlesens wird die Datei mittels closein dann wieder geschlossen:

  \closein\quelle

Zeilenweises einlesen[Bearbeiten]

Da wir in der Regel nicht wissen, wie groß unsere Adressdatei sein wird, brauchen wir eine Schleife, die die Datei bis zum Ende einliest. Im Kopf des Dokuments definieren wir dazu ein newif names more:

 \newif\ifmore \moretrue

Wir beginnen die Schleife mit loop und lesen dann eine Zeile aus der Datei mittels read in die Variable zeile.

Jetzt müssen wir unterscheiden, ob wir bereits das Ende der Adressdatei erreicht haben, oder noch nicht. Dazu fragen wir mit ifeof ab, ob das Dateiende EOF von quelle erreicht wurde und setzen ggf. unsere Variable auf false. Andernfalls können wir unseren Brief verfassen.

 \ifeof\quelle
  \global\morefalse
 \else
  ...
 \fi

Am Ende muss noch entschieden werden, ob die Schleife wiederholt wird. Das hängt natürlich davon ab, ob unser if wahr ist.

  \ifmore\repeat

Auswertung der Zeile[Bearbeiten]

Wir gehen davon aus, dass unsere Adressdatei eine gewöhnliche Textdatei ist, in der je Zeile die Adressdaten einer Person stehen. Diese sind durch Semikolon getrennt:

Hans;Wurst
Klaus;Meier
Maria;Musterfrau

Um nun die einzelnen Felder sinnvoll ansprechen zu können definieren wir im Kopf einen chopline-Befehl:

 \def\chopline#1;#2 \\{
  \def\vorname{#1}
  \def\name{#2}
 }

Dabei sind #1 usf. die Einträge, die durch Semikolen getrennt werden. LaTeX kann nur maximal 9 Felder verarbeiten. Das Leerzeichen nach dem letzten Feld und vor dem Zeilenumbruch ist nötig, da beim Einlesen einer Datei standardmäßig ein Leerzeichen am Ende der Zeile gelesen wird. Dieses soll jedoch nicht im Adressfeld erhalten bleiben. Dann werden die Befehle vorname und name definiert, die uns das bessere Ansprechen der einzelnen Felder erlauben.

In unserem Brief können nun diese verwendet werden, wenn wir die zeile mittels expandafter zerlegen:

 \expandafter\chopline\zeile\\
 \begin{letter}{\vorname \name\\usw.\\usf.}
 ...
 \end{letter}

Beispielcode[Bearbeiten]

Das eigentliche Dokument:

 \documentclass[12pt]{letter} 
 
 \date{\today}
 \signature{Unterschrift}
 \address{Adresse\\des\\Absenders}
 
 \def\chopline#1;#2 \\{
  \def\vorname{#1}
  \def\name{#2}
 }
 
 \newif\ifmore \moretrue
 
 \begin{document}
 
 \newread\quelle
 \openin\quelle=Daten.csv
 
 \loop
  \read\quelle to \zeile
  \ifeof\quelle
   \global\morefalse
  \else
   \expandafter\chopline\zeile\\
   \begin{letter}{\vorname \name\\usw.\\usf.}
   \opening{Hallo \name, \vorname!}
   .\\
   \closing{Hochachtungsvoll,\\ Absender}
   \end{letter}  
  \fi
 \ifmore\repeat
 
 \closein\quelle
 
 \end{document}

Die Datei Daten.csv

Haus;Wurst
Klaus;Meier
Maria;Musterfrau

Siehe auch[Bearbeiten]

Weblinks[Bearbeiten]

  • serienbrief, ein Perl-Script zum Erstellen von LaTeX-Serienbriefen