OpenOffice-Anwender erstellen mit der Textverarbeitung in wenigen Schritten Serienbriefe, und auch in anderen Textprogrammen ist diese Funktion selbstverständlich – doch das Textsatzsystem LaTeX [1] kennt kein solches Feature. Dabei gibt es hübsche LaTeX-Klassen für die private oder geschäftliche Korrespondenz, aber sie dienen stets nur dem Verfassen einzelner Schreiben.
Liegen Adress- oder andere Daten als Tabelle in einer der Datenbanken MySQL und Postgresql vor, hilft das in Python geschriebene Tool LaTeXDB [2] weiter: Es integriert SQL-Abfragen in ganz normale LaTeX-Dokumente und verhilft damit auch LaTeX-Freunden zur Serienbrieffunktion.
Bei LaTeXDB handelt es sich nicht um eine echte Erweiterung von LaTeX, sondern um ein Wrapper-Skript: Es sucht in einer LaTeX-Datei nach Datenbankabfragen, leitet diese an die Datenbank weiter und trägt die Ergebnisse in die LaTeX-Datei ein.
Der Aufbau eines LaTeX-Dokuments mit SQL-Aufrufen wird am schnellsten anhand des kleinen Beispiels in Listing 1 deutlich. Bei den fett gedruckten Bereichen des Listings handelt es sich um LaTeXDB-Befehle:
\texdbconnection definiert eine Verbindung mit der SQL-Datenbank. Das erste Argument gibt den Datenbanktyp an (MySQL oder PostgreSQL), danach folgen Server, Benutzername, Passwort und Name der Datenbank.\texdbdef tragen Sie eine SQL-Abfrage ein (in der üblichen SQL-Syntax, also select Spalten
from Tabelle
) und geben Metavariablen (hier: ##Vorname und ##Nachname) an, die später im LaTeX-Code den Zugriff auf die Werte ermöglichen.\texdbfor eingeleitet wird: Für alle Ergebnisse der SQL-Abfrage ("result set") fügt LaTeXDB das zweite Argument in das LaTeX-Dokument ein. Dabei ersetzt es die Metavariablen durch die aktuellen Werte aus der Datenbankabfrage.Der Beispiel-LaTeX-Code holt aus einer simplen User-Tabelle Vor- und Nachnamen. Für jeden Treffer erzeugt LaTeXDB dann einen Block, der mit dem Briefkopf beginnt, dann den Adressaten persönlich anspricht und nach dem Brief-Footer einen Seitenvorschub auslöst: So entsteht ein einfacher Serienbrief.
Listing 1
\documentclass{…}\texdbconnection{MySQL,localhost,user,passwort,texdb}\texdbdef{##Users}{select Vorname,Nachname from Users}{##Vorname,##Nachname}
\begin{document}\texdbfor{##Users}{
\briefheader
Hallo, ##Vorname ##Nachname, \\
anbei schicken wir Ihnen eine aktuelle Preisliste.
\brieffooter
\newpage}
\end{document}
TIPP
Beachten Sie bei eigenen LaTeXDB-Experimenten, dass die Metavariablen (die mit ## beginnen), "präfixfrei" sein müssen – es darf also kein Variablenname das Anfangsstück eines anderen Variablennamen sein: ##vorn und ##vorname dürfen nicht gleichzeitig in einem LaTeXDB-Dokument auftauchen.
LaTeXDB lässt sich schnell installieren: Nach dem Auspacken des Archivs latexdb-0.3.tar.gz liegt im neu erstellten Verzeichnis eine ausführbare Datei install, die Sie mit Root-Rechten aufrufen – das Skript kopiert ein paar Programmdateien und die Manpage in die /usr/local-Hierarchie. Danach können Sie das Programm direkt starten:
$ latexdb -v /usr/local/bin/latexdb version 0.3 (2006/04/24). Relased under the GPL.
Klappt das nicht, ist vielleicht der Pfad falsch eingestellt – /usr/local/bin muss in der Variable $PATH auftauchen.
Eine Tabelle, wahlweise in MySQL oder PostgreSQL, stellt die Mindestvoraussetzung dar, um LaTeXDB zu nutzen. Wer noch keine solche Tabelle angelegt hat, kann die Beispieldateien aus dem LaTeXDB-Paket verwenden oder anpassen: Im Verzeichnis latexdb-0.3/examples/ liegen drei Unterverzeichnisse trivial, advanced und nested.
Um das einfachste Beispiel auszuprobieren, wechseln Sie in das Verzeichnis trivial und führen die dortige SQL-Datei aus – unter MySQL erledigt das zum Beispiel der Befehl
mysql -u user -p < example.sql
Dabei ersetzen Sie user durch den User-Namen, mit dem Sie sich an der Datenbank anmelden. Die SQL-Dateien in den übrigen Beispielverzeichnissen setzen voraus, dass die Datenbank mit dem Namen texdb schon existiert – darum sollten Sie dieses TBeispiel in jedem Fall als erstes testen. Wollen Sie die Tabelle lieber von Hand erzeugen, finden Sie im Kasten "Beispiel-Datenbank anlegen" Hinweise dazu.
Beispiel-Datenbank anlegen
Um manuell mit MySQL eine Datenbank anzulegen, starten Sie zunächst den MySQL-Client – ersetzen Sie im folgenden Aufruf user durch den richtigen User-Namen.
# mysql -u user §§ -p Enter password: Welcome to the MySQL monitor.
Mit create database erzeugen Sie eine neue Datenbank; ein anschließender use-Aufruf macht diese zur aktiven Datenbank für die aktuelle MySQL-Sitzung.
mysql> create database texdb; Query OK, 1 row affected (0.00 sec) mysql> use texdb Database changed
Der Befehl create table legt eine neue, leere Tabelle an; insert into fügt einige Beispieleinträge ein.
mysql> create table Users ( id INT PRIMARY KEY, Vorname VARCHAR(40), Nachname VARCHAR(40) ); Query OK, 0 rows affected (0.00 sec) mysql> insert into Users values (1,"Stefan","Mustermann"); Query OK, 1 row affected (0.00 sec) mysql> insert into Users values (2,"Sabine","Sauer"); Query OK, 1 row affected (0.01 sec)
Prüfen Sie mit einem select-Befehl, ob das geklappt hat:
mysql> select * from Users; +—-+————+————+ | id | Vorname | Nachname | +—-+————+————+ | 0 | Stefan | Mustermann | | 1 | Sabine | Sauer | +—-+————+————+ 2 rows in set (0.00 sec)
Sie können den Mysql-Client dann verlassen.
Haben Sie die Beispieltabelle angelegt, bearbeiten Sie die zugehörige Tex-Datei (hier: example.tex) – im \texdbconnection-Kommando stehen noch nicht die richtigen Zugangsdaten zur Datenbank. Nachdem Sie diese Zeile angepasst haben, rufen Sie LaTeXDB genau wie LaTeX auf, wahlweise mit DVI- oder PDF-Ausgabe:
latexdb example.tex pdflatexdb example.tex
Der erste Aufruf erzeugt example.dvi, der zweite example.pdf. Die Ausgabe im Terminalfenster ist im Wesentlichen identisch mit der eines normalen LaTeX- bzw. PDFLaTeX-Aufrufs; die Anwesenheit von LaTeXDB bemerken Sie nur an der ersten Ausgabezeile:
Pre-Compiling example.tex (loop 1)
Abbildung 1 zeigt die auf diese Weise erzeugte, einfache DVI-Datei.
LaTeXDB erzeugt eine Reihe von Zwischendateien, die Sie später entsorgen können; zu example.tex entstehen unter anderem example.tex.i
, example.tex.pre.i
und example.tex.texdb.i
, wobei i ein Zähler ist und meist nur den Wert 1 annimmt.
SQL-Abfragen können Sie auch schachteln, indem Sie innerhalb einer For-Schleife eine neue Abfrage definieren und darüber wieder eine For-Schleife laufen lassen. Das Quelltextarchiv enthält im Verzeichnis examples/nested/ ein Beispiel für derart geschachtelte Abfragen. Über Schachtelungen nutzen Sie beliebig komplexe Datenstrukturen für Ihr LaTeX-Dokument.
Der Beispiel-Code (Abbildung 2) gibt, basierend auf den Datensätzen einer fiktiven Kunden- und Auftragsdatenbank, sämtliche Aufträge aus und zeigt zusätzlich zu jedem Auftrag an, welche weiteren Bestellungen dieser Kunde getätigt hat.
Bei verschachtelten SQL-Anfragen löst LaTeXDB diese von außen nach innen mit jeweils einem separaten Durchgang auf:
$ latexdb nested.tex Pre-Compiling nested.tex (loop 1) Pre-Compiling nested.tex (loop 2) This is e-TeX, Version 3.14159-2.1 (Web2C 7.4.5) […]
Dabei entstehen zusätzliche Dateien; die Nummer der aktuellen Verschachtelungstiefe (loop 1, loop 2, …) taucht als Dateinamensendung im Arbeitsverzeichnis auf.
Die LaTeXDB-eigenen Befehle integrieren sich gut in die normale LaTeX-Syntax; wer LaTeX und SQL bereits gut kennt, kann damit ohne größeren Einarbeitungsaufwand Serienbriefe, Datenbank-Reports und ähnliche Dokumente erstellen.
Glossar
SQL
Structured Query Language. Eine Standard-Abfragesprache, welche die meisten relationalen Datenbanken verstehen (siehe Artikel S. 38).
LaTeX
Profi-Textsatzsystem, das auf TeX (einer Entwicklung des Informatik-Professors Donald E. Knuth) beruht.
Infos
[1] LaTeX: http://www.latex-project.org/
[2] LaTeXDB: http://privat.hgesser.com/software/latexdb/