Tutorial LaTeX-Serienbrief

Gespeichert von Erik Wegner am/um
Body

Dieser Tipp erklärt in Form eines Tutorial, wie Serienbriefe mit LaTeX und der KomaScript-Klasse scrlttr2 erstellt werden. Dabei kommt ein CSV-Mitgliderexport der Vereinsverwaltung CiviCRM zum Einsatz. Zur Aufbereitung der Datei wird noch ein Python-Skript benutzt.

Der Ablauf wird sich wie folgt gestalten:

  1. Erstellen eines leeren Briefs
  2. Auslagerung der Absenderdaten und Briefformatierungen in eine lco-Datei für die spätere Verwendung in anderen Briefen
  3. Umwandlung der CSV-Datei in eine LaTeX-Adressenliste
  4. Erstellung der Anschreiben

Erstellen der Briefvorlage

Die Briefvorlage wird mit dem Briefgenerator vorbereitet. Das Ergebnis sieht so aus:

\documentclass[
  footsepline,
  DIN,
  draft=false,
  paper=a4,
  fontsize=11pt,
  parskip=full, %Einzug (off) oder Abstand((full)|(half)[\+\*\-]?)
  fromphone=off, %Telefonnummer des Absenders setzen (true/false)
  fromfax=off, %Faxnummer des Absenders setzen (true/false)
  fromemail=off, %E-Mailadresse des Absenders setzen (true/false)
  fromurl=on, %Internetadresse des Absenders setzen (true/false)
  fromrule=off, %Linie bei Absender setzen (off/aftername/afteraddress)
  pdftex,
  pagenumber=false,
  footsepline=false]{scrlttr2}
\usepackage[utf8]{inputenc} % Encoding der TeX-Dateien: utf8
\usepackage[T1]{fontenc} % Aktiviert EC-Schriftarten
\usepackage{ae} % Schöne Schriften für PDF-Dateien
\usepackage{textcomp} % Text-Companion-Symbols (z. B. \texteuro)
\usepackage{ngerman} % Deutsche Einstellungen
\usepackage{libertine}
\typearea[current]{last}
\usepackage{marvosym} % Symbole und das Euro-Zeichen \EUR
\usepackage{eurosym} % Euro-Zeichen nach offz. Vorgaben, Geld durch \EUR{100,00}
\usepackage{microtype} % Mikrotypographische Anpassungen für pdflatex
\usepackage{fixltx2e} % korrigiert LaTeX-Fehler
\LoadLetterOption{DIN}
\begin{document}
  \setkomavar*{enclseparator}{Anlagen}
  \setkomavar{fromname}{Vereinsname}
  \setkomavar{fromaddress}{Straße~Hausnummer\\ %
    PLZ~Ort}
  \setkomavar{fromurl}{http://www.example.net/}
  \setkomavar{subject}{Rechnung für den Mitgliedsbeitrag 2011}

  \setkomavar{place}{Bernburg}
  \setkomavar{date}{01.01.2011}
  \renewcommand*{\raggedsignature}{} % Unterschrift wird nicht eingezogen

  \begin{letter}{Vorname~Nachname\\ %
    Straße~Hausnummer\\ %
    PLZ~Ort}

    \opening{Sehr geehrte Damen und Herren,}
    Brieftext
    \closing{Mit freundlichen Grüßen}

  \end{letter}
\end{document}

Erstellen einer lco-Datei

Die lco-Datei vereinfacht das Erstellen weiterer Briefe, da die immer wieder verwendeten Absenderangaben und Formatierungsanweisungen in einer zentralen Datei gesammelt sind. Sie enthält prinzipiell alle LaTeX-Befehle, die Einfluss auf die Briefgestaltung nehmen und kann so aussehen:

\ProvidesFile{verein.lco}[2010/12/31 lco (Vereinsname)]
\KOMAoptions{foldmarks=true,foldmarks=blmtP,fromlogo,subject=titled}
\setkomavar{fromname}{Vereinsname, c/o Vorsitzender}
\setkomavar{signature}{%
\begin{minipage}{3cm}Vorname Name\newline{}Vorstand\end{minipage}%
\begin{minipage}{3cm}Vorname Name\newline{}Schatzmeister\end{minipage}%
}
\renewcommand*{\raggedsignature}{\raggedright}
\setkomavar{fromaddress}{Straße~Hausnummer\\ %
PLZ~Ort}
\setkomavar{fromphone}{0\,12\,34~56\,78}
\setkomavar{fromemail}{Peter@Musterfrau.invalid}
\setkomavar{fromlogo}{\includegraphics[scale=0.333]{../../hv.png}}
\setkomavar{fromurl}{http://www.example.net/}
\setkomavar{place}{Bernburg}
\setkomavar*{enclseparator}{Anlagen}
%Logo
\usepackage{eso-pic}
\AddToShipoutPicture{%
\begingroup
\setlength{\@tempdimb}{\paperwidth-4.5cm}%
\setlength{\@tempdimc}{\paperheight-3.5cm}%
\put(\LenToUnit{\@tempdimb},\LenToUnit{\@tempdimc}){\usekomavar{fromlogo}}%
\endgroup
}
% Kopfzeile
\firsthead{%
\textsf{\large%
Vereinigung der Dackelzüchter e.\,V.}%
}
% Fußzeile
\firstfoot{%
\scriptsize%
\hrulefill\\[1ex]%
\parbox{\textwidth}{\centering Vereinigung der Dackelzüchter e.\,V.}\\[0.5ex]%
\begin{minipage}{0.22\linewidth}
Zeile 1\newline
Zeile 2\newline
Zeile 3\newline
Zeile 4
\end{minipage}\hfill%
\begin{minipage}{0.22\linewidth}
Zeile 1\newline
Zeile 2\newline
Zeile 3\newline
Zeile 4
\end{minipage}\hfill%
\begin{minipage}{0.22\linewidth}
Zeile 1\newline
Zeile 2\newline
Zeile 3\newline
Zeile 4
\end{minipage}\hfill%
\begin{minipage}{0.22\linewidth}
Zeile 1\newline
Zeile 2\newline
Zeile 3\newline
Zeile 4
\end{minipage}%
}
\@addtoplength{firstfootvpos}{-2\baselineskip}

Verarbeitung der CSV-Datei

Der Export der Mitgliederanschriften erfolgte als CSV-Datei. Als Textkennzeichnung kommen doppelte Anführungszeichen zum Einsatz, die Datenfelder sind mit Komma getrennt. Das Skript liest die Datensätze ein und erstellt eine Liste von LaTeX-Befehlen, die den Brief erzeugen werden:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

fieldindex = {}

def filter(row):    
    return row[f("Status")] == "Current" or row[f("Status")] == "Grace"


def f(fieldname):
    return fieldindex[fieldname]

def readfieldindex(row):
    i = 0
    for field in row:
        fieldindex[field] = i
        i = i + 1

import csv
addrreader = csv.reader(open('mitgliederliste2010.csv', 'rb'), delimiter=',', quotechar='"')

firstline = True

for row in addrreader:
    if firstline:
        readfieldindex(row)
        firstline = False
    else:
        if filter(row):
            print "\Serienbrief{%s\\\\%s\\\\%s %s}" % (row[f("Name des Kontakts")], row[f("Straße")], row[f("PLZ")], row[f("Stadt")])

Erstellung der Anschreiben

Am Ende wird der Brief erstellt, indem die lco-Datei und die Datei mit den Serienbriefkommandos gelanden werden. In der Hauptdatei existiert ein Kommando, dass den Brief mit den übergegebenen Parametern erstellt:

\documentclass[
  footsepline,
  DIN,
  draft=false,
  paper=a4,
  fontsize=11pt,
  parskip=full, %Einzug (off) oder Abstand((full)|(half)[\+\*\-]?)
  fromphone=off, %Telefonnummer des Absenders setzen (true/false)
  fromfax=off, %Faxnummer des Absenders setzen (true/false)
  fromemail=off, %E-Mailadresse des Absenders setzen (true/false)
  fromurl=on, %Internetadresse des Absenders setzen (true/false)
  fromrule=off, %Linie bei Absender setzen (off/aftername/afteraddress)
  pdftex,
  pagenumber=false,
  footsepline=false]{scrlttr2}
\usepackage[utf8]{inputenc} % Encoding der TeX-Dateien: utf8
\usepackage[T1]{fontenc} % Aktiviert EC-Schriftarten
\usepackage{ae} % Schöne Schriften für PDF-Dateien
\usepackage{textcomp} % Text-Companion-Symbols (z. B. \texteuro)
\usepackage{ngerman} % Deutsche Einstellungen
\usepackage{libertine}
\typearea[current]{last}
\usepackage{marvosym} % Symbole und das Euro-Zeichen \EUR
\usepackage{eurosym} % Euro-Zeichen nach offz. Vorgaben, Geld durch \EUR{100,00}
\usepackage{microtype} % Mikrotypographische Anpassungen für pdflatex
\usepackage{fixltx2e} % korrigiert LaTeX-Fehler
\LoadLetterOption{DIN}
\LoadLetterOption{verein} % nicht per documentclass-Optionen geladen, damit UTF-8-Kodierung benutzt wird
\begin{document}
  \setkomavar{subject}{Rechnung für den Mitgliedsbeitrag 2011}

% Geschäftszeile
  \setkomavar{date}{01.01.2011}


  %\setkomavar{title}{}
  \renewcommand*{\raggedsignature}{} % Unterschrift wird nicht eingezogen
 
  \newcommand{\Serienbrief}[1]{%
\begin{letter}{#1}
\opening{Liebe Vereinsmitglieder,}
Brieftext
\closing{Petri Heil,}
\end{letter}
}
\input{mitglieder.adr}

\end{document}
Dateien
Anhang Größe
vereinsbeispiel.lco_.txt 1.21 KB
csv2ltr.py_.txt 645 Bytes
serienbrief.tex_.txt 2.88 KB