LaTeX Serienbriefe – GUI zur Adressbuch Generierung
Freitag, 24.07.2009 um 16:32 UhrMoin liebe Lesergemeinde,
da ich mich ja, wie ihr wisst, ausführlich mit LaTeX beschäftige, gibt es heute eine kleine GUI Anwendung, die das Leben mit LaTeX etwas vereinfachen soll.
Aber vorher noch zur Vorgeschichte:
Ich habe vor einiger Zeit ein Projekt begonnen, was das Schreiben von Briefen in LaTeX vereinfachen soll. Das heißt es gibt eine Oberfläche in der man sämtliche Adressdaten und den Briefinhalt eingeben kann. Beim Speichern der Angaben wird mit Hilfe eines Brief Templates das ganze in einen LaTeX Brief umgewandelt.
Das Ganze soll sich allerdings mehr an Firmen richten, denn jemand (Admin) muss sich die Arbeit machen und ein LaTeX Template im Corporate Design der jeweiligen Firma anfertigen. Dieses Template könnte (read only) im Netz liegen und von den Mitarbeitern mit Hilfe meiner Oberfläche genutzt werden. Das würde den Nutzern erlauben, wirklich nur den Brief mit den jeweiligen Daten zu verfassen, das ganze Layout wird automatisch im Hintergrund durch ein Template erzeugt. Es gibt zwar auch Vorlagen, die man in Word erstellen kann, aber da kann man doch schnell das Design verhunzen, wenn man keine Ahnung hat – außerdem sieht sogar ein Latex Brief deutlich besser aus, als ein Word Brief.
Das Projekt wird in Python mit Qt als GUI Framework geschrieben. Momentan habe ich das große Projekt (was ich eben beschrieben habe) allerdings ersteinmal hinten angestellt. Da ich gerade erst Python richtig lerne, versuche ich kleine Teilaufgaben zu programmieren. Die heute vorgestellte Software kann also als Teilprojekt angesehen werden.
Die Oberfläche für die Briefe soll später auch Serienbriefe unterstützen. Da LaTeX aber ein eigenes Adressbuchformat voraussetzt, muss man gängige Adressbücher aus Evolution, Outlook, Thunderbird, etc. erst in dieses Format bringen. Das wäre händisch sehr unschön zu lösen, pflegen lässt sich so ein Adressbuch eher auch schlecht, da es bisher dazu keine sinnvolle Oberfläche gibt.
Adressbuchformat von LaTeX abgespeichert in einem *.adr-Textfile:
\adrentry{Name}{Vorname}{Adresse}{Telefon}{F1}{F2}{Kommentar}{Kürzel}
Durch ein Python Skript von Frederik Elwert bin ich auf die Idee gekommen, eine GUI zum Mapping eines Adressbuches im CSV Format in das LaTeX kompatible Format zu schreiben. Das eigentliche Mapping führt das Skript von Frederik bereits aus, ich habe dieses um eine GUI erweitert. Vollständig konsolenbedienbar bleibt das Skript allerdings trotzdem.
Nun aber genug der Rede:
Wie man sieht, funktioniert das Programm mit Gnome, KDE und Windows. Mac OS kann ich nicht testen. Das Programm sollte mit jeder Standard-Installation von Python und PyQt4 laufen. Bei Kubuntu ist alles standardmäßig vorhanden, bei Ubuntu muss man schauen, ob PyQt4 bereits installiert ist und es notfalls nachinstallieren.
Bedienung:
GUI:
Das Adressbuch muss im CSV Format vorliegen. Jede mir bekannte Adressbuchverwaltung kann in ein CSV Format exportieren, was also kein Problem darstellen dürfte. Das Skript muss ausführbar sein (chmod +x LatexAddressbook.py). Wird das Skript ohne Parameter aufgerufen startet die GUI automatisch (./LatexAddressbook.py). Mit Klick auf die Schaltfläche “…” kann das CSV Adressbuch ausgewählt werden. Ist dies geschehen, sollten in der Liste am rechten Rand des Programms alle verfügbaren Spaltenüberschriften des Adressbuches erscheinen. Diese kann man nun per Drag and Drop in die Textfelder für die jeweiligen Adressbuchfelder des LaTeX Adressbuches ziehen.
Dabei können auch mehrere CSV-Felder in einem LaTeX Feld verbunden werden.
Beispiel: Die Adresse liegt im CSV Adressbuch in den einzelnen Spalten Adresse, PLZ, Ort vor. So kann man das Feld “Address” folgendermaßen gestalten: $Adresse\\$PLZ $Ort. \\ bedeutet in LaTeX einen Zeilenumbruch. Das heißt man hat nun die gesamte Adresse des Empfängers in einem Feld stehen.
In dieser Weise können auch alle anderen Adressbuchfelder ausgefüllt werden. Free 1 und Free 2 sind im LaTeX Adressbuch keiner Funktion zugeordnet und können so frei verwendet werden. Mit Klick auf OK wird man nach dem Speicherort für das LaTeX Adressbuch gefragt. Dieses wird mit der Erweiterung *.adr gespeichert.
Konsole:
Hier ist die Bedienung der vom Original Skript übernommen. Mit dem Befehl
./LatexAddressbook.py -h
wird die Hilfe angezeigt. Hier ist ein Beispielbefehl, wie er zur Umwandlung des Adressbuches genutzt werden kann.
./LatexAddressbook.py -m 'Name=$Nachname' -m 'Vorname=$Vorname' -m 'Adresse=$Strasse\\$PLZ $Ort' -m 'F1=$Geschlecht' -o 'adressen.adr' adressen.csv
So das wars auch schon zur Benutzung. Bei meinen Tests hat eigentlich alles funktioniert soweit. Bitte gebt mir Feedback, ob prinzipiell Interesse besteht eine GUI für Briefe in LaTeX zu benutzen und wenn ja, was alles an Features enthalten sein sollte. Gibt es eventuell Interessenten, die sich vorstellen könnten, sowas auch in der eigenen Firma einzusetzen? Bitte gebt mir Feedback, ob es sich überhaupt lohnt, soetwas zu programmieren.
Probleme:
Probleme gibt es, wenn es Spaltenüberschriften in der CSV Datei mit Sonderzeichen gibt. Die Überschriften werden im Skript als Schlüssel in einem Dictionary verwendet. Ich habe bisher nichts gefunden, was UTF-8 Schlüssel in Dictionaries in Python erlauben würde. Ich lasse mich aber gerne eines Besseren belehren.
Es fehlt auch noch eine Mehrsprachen-Unterstützung. Die ist allerdings schon vorgesehen. Allerdings würde ich sowas erst implementieren, wenn Interesse an Nutzung bestehen sollte.
Falls weitere Fehler auffallen oder es Verbesserungsvorschläge gibt, dann bitte ab damit in die Kommentare.
Aber nun, fast hätte ich es vergessen, hier der Download des Skripts. Sollte ich das ganze noch weiter entwickeln, würde ich das auch bei Launchpad hosten.
Download: latexAddressbook.zip




Ich erhalte mit Python 2.5.4 unter Windows folgende Fehlermeldung, offenbar ist Python 2.6 nötig?
C:\Users\Mein Name\Desktop\LatexAddressbook.py:135: Warning: ‘as’ will become a reserved keyword in Python 2.6
File “C:\Users\Mein Name\Desktop\LatexAddressbook.py”, line 135
except IOError as ioerror:
^
SyntaxError: invalid syntax
Zu dem Encoding-Problem:
Warum müssen die Schlüssel UTF-8 sein?
Versuche die Dateien mit codecs.open(filename, ‘r’, ‘utf-8′) zu importieren, dann ist alles ausgelesene ein Unicode-Objekt und kann einfach verwendet werden.
Ja is mit Python 2.6 programmiert.
Da die Spaltenüberschriften der CSV als Keys in einem Dictionary und als Keys für das Templatesystem von Python verwendet werden. Der eigentlich Inhalt kann also auch Sonderzeichen enthalten, nur die Spaltenbezeichnung nicht.
An sich find ich das Programm von der Idee her echt gut. Aber über die Gestaltung der GUI würde kich mir nochmal Gedanken machen: Zum Einen würde ich die Liste auf der Rechten Seite nach links “verschieben” und zum Anderen würde ich die Buttons “OK” und “Cancel” nach unten verschieben, fände ich gewohnter. Ansonsten gefällt mir das schonmal, auch wenn ich es noch nicht testen konnte. Das werd ich aber schnellstmöglichst nachholen.
MfG Zaidira
Hallo,
wie “müme” schon sagte, sollte man innerhalb des Scriptes nur mit unicode-Objekten arbeiten. Dabei gilt die Regel: So früh wie möglich in Unicode wandeln (decodieren), so spät wie möglich in Byte-Strings zurückwandeln (encodieren).
Das Beispiel oben zeigt schon sehr gut, wie man das z.B. beim Laden einer Datei hinbekommt.
Hier mal ein nützlicher Link, um sich die Basics dazu anzulesen:
http://wiki.python.de/Von%20Umlauten%2C%20Unicode%20und%20Encodings
Bei Fragen kannste Dich auch gerne an mich wenden
So, ich habs mir mal angesehen und hätte folgendes an Verbesserungsvorschlägen:
- OptionParser kennt eine Methode error (o.ä.). Damit kann man explizit auf fehlende Argumente hinweisen.
- Versuche mal mehr auf PEP8 zu achten. Das hilft nicht nur externen Leuten wie mir, sondern auch Dir den Quelltext später leichter lesen zu können. Im Speziellen betrifft das auf den ersten Blick die Klassennamen, die Länge der Zeilen (speziell beim Optparse Teil), Zeilenabstände usw.
- Es gibt in der Python-Doku zum CSV-Modul ein Beispiel, wie man CSV beim Einlesen bereits in Unicode umwandelt. Das kannst Du so fast immer 1:1 in Deinen Quellcode übernehmen. Dann bekommst Du eben die Wandlung in und von Unicode hin.
- Wieso packst Du alles in eine Datei? Wenn Du fremden Quellcode benutzt, lass ihn doch in einer eigenen Datei und importe dann die benötigten Teile?
- ich würde den if __name__ == “__main__”-Hook kurz halten und innerhalb nur eine main()-Funktion aufrufen, in der dann der Rest steht.
- Doc-Strings benutzen statt simpler Kommentare über den Methoden / Funtkionen! Dazu dann ggf. die übergebenden Parameter genauer beschreiben – bei DuckTyping-Sprachen imho unerlässlich.
Ansonsten aber schön zu sehen, wie sich Leute mit Python befassen
Was mich persönlich interessiert ist, wo man das schöne Theme (braun/grün) von dem Screenshot herbekommt
@Yoshi
Ja das Theme finde ich auch cool. Das ganze heißt Shiki Theme und gibts in verschiedenen Farbvarianten.
http://linuxundich.de/de/2008/12/mein-gnome-desktop-shiki-bites-the-dust/
–> da gibts ne gute Anleitung zum Installieren des Themes
@Jazz
Ich danke dir, das werde ich nachher mal ausprobieren
Ich würde das liebend gerne benutzen, bekomme aber leider den Fehler
Import Error: No module named PyQt4
und weiß nicht, wie ich das behebe
Was sehr toll wäre, wäre was, was man ausführen kann, ohne irgendwas installieren zu müssen.
@Sonja: du musst das Paket python-qt4 unter Ubuntu installieren. Unter Windows funktioniert dies auch (auch dort die QT Bibliotheken für Python installieren).
Das mit dem nichts installieren ist so eine Sache. Ich habe nicht viel Zeit mehr daran weiter zu arbeiten und die kompletten Abhängigkeiten in ein Programm zu packen ist glaube ich recht aufwendig.