Einen schönen Flyer setzen Sie ohne Probleme in LaTeX – und profitieren so von dessen Automatismen, wenn sich die Rohdaten häufiger ändern.
Entwerfen und Gestalten gehört zur Domäne der DTP-Programme. Stammt der Inhalt des Druckwerks aber aus einer Datenquelle, dann lohnt es sich, einen Blick auf die etablierten Linux-Werkzeuge zu werfen, um sich die Arbeit einfacher zu gestalten. Das zeigt ein Beispiel für eine dynamisch generierte Weinkarte, deren Layout ebenfalls ein Genuss sein soll.
Der Vorteil des alternativen Ansatzes offenbart sich vor allem, wenn die Datenquelle sich regelmäßig ändert: Dann verursacht jede Korrektur mit einem DTP-Programm einen hohen Aufwand. In einem solchen Fall erweist sich LaTeX als praktische Alternative, da hier das Umwandeln und Erstellen nach einer Anlaufphase in der Regel mehr oder weniger automatisch erfolgt.
Flyer oder Leporello
Als Beispiel dient uns im Folgenden eine kleine Weinkarte in Form eines Faltblatts. Der Flyer hat sechs kleine Seiten. Klappen Sie die Außenseiten jeweils in die Mitte um, dann nennt sich das Wickelfalz. Verwenden Sie stattdessen einen Zickzack-Falz, lautet der Fachausdruck dafür Leporello.
Damit das Erstellen des Flyers (Abbildung 1) automatisiert funktioniert, kommt ein Build-Skript mit Apache-Ant [1] und der Ant-Worker-Erweiterung [2] zum Einsatz. Apache Ant installieren Sie unter Ubuntu beispielsweise mit sudo apt-get install ant. Das Build-Skript umfasst mehrere Schritte. Im ersten davon steht das Umwandeln der in LibreOffice Calc als Tabelle geführten Wein-Datei (Abbildung 2) nach CSV an. Das erlaubt es, die Daten mit LaTeX automatisiert weiter zu verarbeiten.

Abbildung 1: Das fertige Faltblatt enthält alle notwendigen Informationen, um den passenden Wein auszuwählen.
Anschließend erzeugt das Skript ein sechseitiges PDF mit Text, Bildern und Tabellen, die Auskunft über die Weinsorten geben. Zuletzt arrangiert es die Seiten zum Faltblatt.
Das Build-Skript
Das Build-Skript (Listing 1) lädt zuerst die Erweiterungen (Zeile 4 bis 7) und definiert die Verzeichnisse für Quelle und Ziel. Der Task init dient dazu, das Zielverzeichnis zu erstellen, clean löscht alle erzeugten Dateien wieder.
Listing 1
<?xml version="1.0" encoding="UTF-8"?>
<project name="Weinliste" basedir="." default="weinliste">
<path id="worker.classpath">
<pathelement location="lib/ant-worker.jar" />
</path>
<taskdef resource="de/nm/ant/antlib.xml" classpathref="worker.classpath" />
<property name="target.dir" value="target" />
<property name="src.dir" value="${basedir}" />
<target name="init">
<mkdir dir="target" />
</target>
<target name="clean" description="Remove the target directory">
<delete dir="${target.dir}" failonerror="false" />
</target>
<target name="csv" depends="init">
<ifnewer srcdir="${src.dir}" destdir="${target.dir}" srcextname=".*\.ods$" destextname="csv">
<calc2csv csvoption="44,34,UTF8,1,1/1/2/1/3/1/4/1/5/1/6/1/7/1/8/1/9/1/10/1/11/1/12/1/13/1/14/1" ooopath="/usr/lib/libreoffice/program" />
</ifnewer>
<terminateooo />
</target>
<target name="weinliste" depends="csv">
<ifnewer srcdir="${src.dir}" destdir="${target.dir}" srcextname="weinliste.tex" destextname="pdf">
<dependsfileset dir="${target.dir}">
<include name="*.csv" />
</dependsfileset>
<lualatex times="2" texinputs="${src.dir}" osfontdir="${src.dir}" />
<removeother othernames="pdf" />
</ifnewer>
<ifnewer srcdir="${src.dir}" destdir="${target.dir}" srcextname="flyer.tex" destextname="pdf">
<dependsfileset dir="${target.dir}">
<include name="weinliste.pdf" />
</dependsfileset>
<lualatex times="2" />
<removeother othernames="pdf" />
</ifnewer>
</target>
</project>
Das Umwandeln der Tabellendaten erfolgt im Task csv (Zeile 20 bis 27), der jede ODS-Datei mit dem Task calc2csv in eine CSV-Datei umwandelt, falls Letztere nicht aktuell sein sollte. Die Parameter bei csvoption legen die Markierung für Zeichenketten ("), den Spaltentrenner (,), das Encoding (UTF8), die Nummer der ersten Zeile und das Format der einzelnen Spalten fest [3].
Der Task weinliste erstellt mithilfe von Lualatex die PDF-Datei, sofern diese nicht aktuell ist, und löscht mit removeother alle nicht mehr notwendigen Dateien. Für die zusätzlichen Fonts geben Sie bei osfontdir das Verzeichnis an, damit Lualatex diese findet. Wichtig für die Tabellen: Der LaTeX-Lauf erfolgt zwei Mal, um die Breiten richtig zu berechnen. Anschließend generiert das Skript den Flyer.
Ein Aufruf von ant ruft dann hintereinander init, csv und weinliste auf – vorausgesetzt, LaTeX ist installiert, beispielsweise in Form von TeX Live [6].
Die LaTeX-Datei
Listing 2 zeigt die LaTeX-Datei für das erste PDF. Als Dokumentenklasse kommt hier scrartcl aus dem KOMA-Paket zum Einsatz, kombiniert mit der deutschen Sprachunterstützung. Die Größe der Seite und der Ränder legen Sie mit dem Paket geometry fest.
Listing 2
\documentclass[ngerman,10pt]{scrartcl}
% Seitenmaße
\usepackage{babel,geometry}
\geometry{verbose,paperheight=210mm,paperwidth=99mm,
top=5mm,bottom=5mm,left=5mm,right=5mm,
marginparsep=0cm,marginparwidth=0mm,
bindingoffset=0mm,nofoot,nohead}
\pagestyle{empty}
\setlength\parindent{0pt}
\setlength\emergencystretch{1em}
%\usepackage[a4,cam,center]{crop}
% Farbe
\usepackage[cmyk]{xcolor}
\newcommand\UEB[2]{{\sffamily\fontsize{5mm}{6mm}\selectfont\textcolor{red}{#1}#2}}
% Tabellen
\usepackage{ltablex,dcolumn,ragged2e,datatool,calc,ifthen}
\makeatletter
\keepXColumns
\newcolumntype{Y}{>{\RaggedRight\arraybackslash}X}
\newcolumntype{d}[1]{>{\DC@{,}{,}{#1}}l<{\DC@end}}
\let\COLWIDTH=\TX@col@width
\newlength\breite
\newcommand\TEMPI{}
\newcommand\TEMPII{}
\newcommand\TEMPIII{}
\makeatother
% Font
\usepackage{unicode-math}% lädt fontspec nach
\setmainfont[BoldFont=LinMed.otf]{LinLig.otf}
\setmathfont[BoldFont=LinMed.otf]{LinLig.otf}
\setsansfont[Scale=1.8]{SF_Piezolectric_Condensed.ttf}
% Text direkt positionieren
\usepackage[absolute,overlay]{textpos}
\textblockorigin{0mm}{0mm}
\setlength{\TPHorizModule}{1mm}
\setlength{\TPVertModule}{\TPHorizModule}
\begin{document}
\begin{center}
\vspace*{1cm}
\sffamily\fontsize{15mm}{18mm}\selectfont
\textcolor{red}{W}einliste\\[5mm]
\sffamily\fontsize{10mm}{15mm}\selectfont
2014-01
\vfill
\includegraphics[width=\linewidth]{bild01}
\vfill
\end{center}
\newpage
\DTLloaddb{ListeRotwein}{Weinliste_rotwein.csv}
\def\WEINHEAD{\UEB{R}{otweine\strut}}
\def\WEINLISTE{ListeRotwein}
\input{wein.tex}
\begin{textblock}{100}(1,50)
\rotatebox{90}{\textsc{Aus dem Schloßberg}}
\end{textblock}
% ...
TIPP
Um die Dokumentation zu einem Paket bei TeX Live zu erhalten, geben Sie auf der Konsole texdoc paketname ein, also etwa texdoc geometry.
Eine DIN-A4-Seite hat eine Breite von 210 und eine Höhe von 297 Millimetern. Für den Flyer verwenden Sie das Papier im Querformat, was bedeutet, dass die Höhe der kleinen Seite 210 mm und die Breite 297 mm geteilt durch drei, also 99 Millimetern entspricht.
Bei den Rändern probieren Sie am besten den für Ihre Zwecke idealen Wert aus. Da weder ein zusätzlicher Seitenrand noch Kopf- oder Fußzeilen zum Tragen kommen, setzen Sie die entsprechenden Werte auf 0 oder schalten die Optionen ab. Zum Testen der Seitengröße der “kleinen” Seiten empfiehlt es sich, über das Paket crop Schnittmarken einzubauen und das Resultat zentriert auf einer A4-Seite auszugeben.
Das Paket xcolor bringt Farbe ins Dokument. Dabei gilt es, zu beachten, dass die meisten Druckereien als Farbsystem CMYK benötigen. Sie geben die Farbwerte über vordefinierte Namen an (siehe Kasten “Farben”) oder direkt als Zahlenfolge:
\definecolor{MeinOrange}{cmyk}{0,0.5,1,0}
Farben
Die Namen der Standardfarben im Paket xcolor lauten: black, blue, brown, cyan, darkgray, gray, green,lightgray, lime, magenta, olive, orange, pink, purple, red, teal, violet, white und yellow. Mit der Paketoption svgnames greifen Sie auf die SVG-Farbnamen zu. Eigene Farben definieren Sie mit \definecolor.
Um nicht für jede Überschrift Farbe und Größe eingeben zu müssen, nutzen Sie das Makro \UEB mit zwei Parametern: Der erste setzt den Text in der Farbe Rot, der zweite in Schwarz. Zusätzlich setzt das Makro die Größe der Schrift auf fünf Millimeter (Listing 2, Zeile 14 bis 16).
Für die Tabellen gelten folgende Bedingungen: Sie reichen über die gesamte Breite der kleinen Seite, die Spalte mit der Beschreibung sollte die maximale Breite aufweisen, und die Preise sowie die sonstigen Angaben richten sich am Komma aus. Dazu benötigen Sie folgende Pakete: ltablex für eine Tabelle, dcolumn für das Ausrichten am Komma und ragged2e für einen optimalen Umbruch in der Spalte. Zusätzlich brauchen Sie datatool zum Einbinden der CSV-Datei, calc zum Rechnen und für Bedingungen das Paket ifthen.
Nach dem Einbinden der Pakete kommen die nächsten Einstellungen in \makeatletter und \makeatother, da LaTeX sonst den Klammeraffen (das Zeichen @) im Namen eines Makros nicht wie gewünscht interpretiert. Dies ist sonst nur in der Definition von Paketen erlaubt. Mit \keepXColumns schalten Sie den erweiterten X-Spaltenparameter ein.
Für die benötigten Spalten definieren Sie den Typ Y neu: Er basiert auf dem Typ X, verwendet aber keinen Blocksatz, sondern richtet den Text linksbündig aus. Für den Preis kommt der Typ d zum Einsatz, der die Spalte am Komma ausrichtet. Beachten Sie, dass die Spalte im Mathematik-Modus gesetzt wird. Das setzt voraus, dass Sie den Font Lindau für Berechnungen (\setmathfont) laden.
Die LaTeX-Standard-Fonts eignen sich im Wesentlichen nur für längere Texte. Optisch ausgefallenere Schriften finden Sie eher selten. Mit Lualatex besteht aber eine relativ einfache Möglichkeit, frei Truetype- oder Opentype-Fonts zu verwenden [4].
Die Definition der Tabelle lagern Sie in eine eigene LaTeX-Datei aus. Das erlaubt es, für jede Weinsorte die entsprechende CSV-Datei mit DTLloaddb zu laden und die Überschriften zu definieren (Listing 2, Zeile 58). Das Makro \WEINHEAD legt dabei die Überschrift fest; mit \WEINLISTE geben Sie an, welche CSV-Daten Sie in der Tabelle verwenden möchten.
Die Information zur Lage des Weins platzieren Sie mit dem Paket textpos und der Umgebung textblock. Im unserem Beispiel steht sie am Rand (Listing 2, Zeile 63 bis 65). Der erste Parameter definiert die Breite der Box, die beiden weiteren die Position, bezogen auf den Ursprung. Mit \rotatebox drehen Sie den Text, hier um 90 Grad.
Die Tabelle
Listing 3 zeigt den LaTeX-Code für die eigentlich Tabelle. Die Zeilen 1 bis 5 definieren die Tabelle samt der Überschrift. Mit \DTLforeach durchläuft der Compiler in einer Schleife jede Zeile der CSV-Datei (Zeile 7) und ordnet jede Spalte dabei einem Makro zu (Zeile 8 bis 11).
Danach prüft der LaTeX-Code mit \ifthenelse, ob die einzelnen Spalten der Tabelle verwendet werden und wie breit sie ausfallen. Nach diesen Werten setzen sich dann die Zeilen für den jeweiligen Eintrag zusammen.
Listing 3
\begin{tabularx}{\linewidth}{@{}lYd{2}@{}}
\makebox[0pt][l]{\WEINHEAD}\\[.4em]
\endfirsthead
\makebox[0pt][l]{\WEINHEAD}\\[0.8em]
\endhead
% Einlesen der Werte und Spaltenzuweisung
\DTLforeach{\WEINLISTE}{%
\TNummer=Nummer,\TJahrgang=Jahrgang,\TName=Name,\TNzusatz=Nzusatz,\TArt=Art,%
\TAuszeichnung=Auszeichnung,\TBeschreibung=Beschreibung,%
\TRz=R,\TS=S,\TA=A,\TPreis=Preis,\TFuellmenge=Füllmenge,%
\TEinheit=Einheit,\TZusatz=Zusatz,\TNeu=Neu}{%
% Zusatz überprüfen
\ifthenelse{\equal{\TNzusatz}{}}{% Kein Zusatz
\settowidth\breite{\textbf{\TName} \TArt}%
\ifdim\breite<\COLWIDTH% Platz vorhanden
\gdef\TEMPI{\textbf{\TName}\hfill\TArt}%
\gdef\TEMPII{}%
\else% zwei Zeilen verwenden
\gdef\TEMPI{\textbf{\TName}}%
\gdef\TEMPII{~\hfill\textit{\TArt}}%
\fi%
}{% Zusatz
\gdef\TEMPI{\textbf{\TName}}%
\gdef\TEMPII{\textbf{\TNzusatz}\hfill\TArt}%
}%
%
\gdef\TEMPIII{\ifthenelse{\equal{\TEMPII}{}}{}{\TEMPII\newline}%
% zweite Zeile leer
{\small% Einträge vorhanden ? ja, dann verwenden
\ifthenelse{\equal{\TBeschreibung}{}}{}{\TBeschreibung\newline}%
\ifthenelse{\equal{\TAuszeichnung}{}}{}{\TAuszeichnung\newline}%
\ifthenelse{\equal{\TRz}{}}{}{R.\,\TRz\,g/l \hfill }%
\ifthenelse{\equal{\TS}{}}{}{S.\,\TS\,g/l \hfill }%
\ifthenelse{\equal{\TA}{}}{}{A.\,\TA\,\%Vol}%
\ifthenelse{\equal{\TZusatz}{}}{}{\newline\TZusatz}}}%
% Zeile 1 erstellen
\textbf{\strut\TNummer} & \TEMPI & \TPreis\,\textnormal{¤}\\%
\nopagebreak%
% Zeile 2 erstellen
\textbf{\strut}\ifthenelse{\equal{\TNeu}{}}{\TJahrgang\ifthenelse{\equal{\TJahrgang}{}}{}{er}}{} &
\TEMPIII & \TFuellmenge\,\textnormal{\TEinheit}\\
\vspace{-3.5mm}\\% Abstandskorrektur
}
\end{tabularx}
Aufbau und Abstände
Experimentieren Sie beim Aufbau der Tabellen ruhig, gerade wenn es um Abstände oder ähnliche Parameter geht. Erweist sich ein Abstand als zu klein oder zu groß, verwenden Sie \hspace{...} oder \vspace{...} für horizontale und vertikale Abstandhalter. Ein positiver Wert schiebt nach rechts beziehungsweise unten, ein negativer Wert nach links beziehungsweise oben.
Typographisch gilt dieses Vorgehen nicht eben als die feine Art, aber im Alltag führt die Methode meist viel schneller zu einem brauchbaren Ergebnis, als bei jeder LaTeX-Umgebung und jedem Makro die Abstände entsprechend zu definieren und anzupassen. Meldungen von Overfull \hbox im Log brauchen Sie bei korrekter Darstellung nicht zu beachten.
Seiten positionieren
Die einzelnen Seiten arrangieren Sie mit dem Paket pdfpages und dem Makro \includepdf (Listing 4). Mittels pages legen Sie fest, welche Seiten Sie laden möchten – und somit, ob Sie einen Flyer oder ein Leporello erzeugen. Hier bedeutet nup=3x1, dass der Compiler die drei Seiten nebeneinander platziert, wobei er jeweils 15 Millimeter Abstand hält. Fällt die Liste der Weine länger aus, erstellen Sie 12 Mini-Seiten auf zwei Blättern [5].
Listing 4
\documentclass[a4paper,10pt]{article}
\usepackage{geometry,pdfpages}
\geometry{verbose,a4paper,landscape,
top=2mm,bottom=2mm,
left=2mm,right=2mm,
marginparsep=0mm,marginparwidth=0mm,
nofoot,nohead}
\pagestyle{empty}
\begin{document}
\includepdf[pages={2,3,4},nup=3x1,delta=15 0]{weinliste.pdf}
\includepdf[pages={5,6,1},nup=3x1,delta=15 0]{weinliste.pdf}
\end{document}
Fazit
Mit LaTeX und diversen Paketen erstellen Sie schnell und fast vollautomatisch aus drögen Office-Tabellen einen schicken Flyer. Häufige Änderungen verursachen also keinen großen Aufwand. Nur bei Abständen und Umbrüchen ist unter Umständen noch eine kleine Korrektur von Hand notwendig.
Glossar
-
CMYK
-
Dieses subtraktive Farbmodell bildet die technische Grundlage für den Vierfarbdruck. Das Kürzel steht für die Farbbestandteile Cyan, Magenta, Yellow und den Schwarzanteil Key (von der schwarz druckenden “key plate” abgeleitet).
Infos
[1] Apache-ANT: https://ant.apache.org
[2] ANT-Worker: http://sourceforge.net/projects/antworker/
[3] CSV-Filter-Optionen: https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
[4] Fonts: http://www.schriftarten-fonts.de/, http://www.myfont.de/, http://www.designerinaction.de/
[5] Wein-Flyer: http://www.weingut-hower.de/weinliste.pdf
[6] TeX Live: https://www.tug.org/texlive/






