Wenn der Inhalt einer Tabelle bereits als externe Daten vorliegt, etwa als .csv-Datei, muss man nicht jede Zelle von Hand neu eingeben. LaTeX bietet mehrere Pakete, die CSV-Dateien lesen und daraus Tabellen setzen, sodass die Quelle bei Datenänderungen nicht umgeschrieben werden muss. Diese Seite stellt drei davon mit ihren Einsatzgebieten vor: das schnelle csvsimple, das formatierungsstarke pgfplotstable und das datenbankartige datatool. Zum Schluss geht es um die S-Spalte von siunitx, mit der Zahlen am Dezimalpunkt ausgerichtet werden (die S-Spalte wird vollständig auf der Seite „Einheiten (siunitx)“ behandelt).
Warum Tabellen aus Daten erzeugen
Experimentelle Ergebnisse und Übersichtstabellen kommen fast immer aus einer Tabellenkalkulation oder einem Messgerät als CSV (comma-separated values). Sie von Hand in tabular-Zellen zu kopieren ist mühsam und fehleranfällig: Jede zusätzliche Zeile und jede geänderte Ziffer bedeutet eine weitere Änderung am Manuskript.
Drehen Sie den Ansatz um: Lassen Sie die Daten in einer Datendatei und sagen Sie LaTeX nur, dass es sie lesen und setzen soll. Dann genügt es, die Daten zu aktualisieren und neu zu kompilieren, damit die Tabelle mitzieht. Mit einer einzigen CSV-Quelle können dieselben Zahlen im Haupttext, in Folien und im Anhang beliebig oft wiederverwendet werden, ohne Abschreibfehler. Diese Trennung von Daten und Darstellung passt genau zu LaTeXs Trennung von logischer Struktur und Erscheinungsbild.
Die Beispiele auf dieser Seite verwenden die kleine CSV-Datei unten. Ihre erste Zeile ist eine Kopfzeile mit den Spaltennamen product, price und weight; die übrigen Zeilen enthalten die Daten.
product,price,weight
Apple,380,182.5
Orange,120,95.0
Melon,1280,1450.2Schnell lesen — csvsimple
csvsimple ist ein leichtgewichtiges Paket, das CSV-Dateien liest und daraus Tabellen oder Schleifen erzeugt. Es wird mit \usepackage{csvsimple} geladen (die aktuelle Version wählt intern die LaTeX3-Implementierung csvsimple-l3). Der schnellste Einstieg ist \csvautotabular{data.csv}: Nur der Dateiname genügt, und die ganze CSV wird automatisch in ein tabular gesetzt, wobei die erste Zeile als Kopf mit Linien verwendet wird. Das passt, wenn man den Inhalt rasch als Tabelle sehen möchte.
\csvautotabular{data.csv}Diese eine Zeile erzeugt eine Tabelle mit drei Spalten und drei Datenzeilen, überschrieben mit product, price und weight. Das ist bequem, aber die Formatierungsmöglichkeiten sind begrenzt. Wenn Ausrichtung, Linien und die Auswahl der Spalten selbst festgelegt werden sollen, verwendet man \csvreader — das eigentliche Arbeitspferd von csvsimple.
\csvreader nimmt drei Argumente in der Form \csvreader[options]{data.csv}{assignments}{body}. Das zweite Argument ist die zu lesende Datei, das dritte bindet Spaltennamen an Makros, und das vierte gibt an, was für jede Zeile ausgegeben wird. Mit price=\price etwa steht der Wert der Spalte price im Rumpf als \price zur Verfügung. Der Tabellenrahmen wird über Optionen wie tabular= und table head= (Kopfzeile) angegeben.
\csvreader[
tabular = l r r,
table head = \hline Product & Price & Weight \\ \hline,
late after line = \\]
{data.csv}
{product=\product, price=\price, weight=\weight}
{\product & \price & \weight}Hier deklariert tabular = l r r drei Spalten („links, rechts, rechts“), table head setzt die Kopfzeile und eine obere Linie, und der Rumpf {\product & \price & \weight} entfaltet jede Datenzeile zu Zellen. late after line = \\ weist csvsimple an, nach jeder Zeile einen Zeilenabschluss \\ anzuhängen — die übliche Form, um Umbrüche nur zwischen Zeilen zu setzen und keinen überflüssigen Umbruch nach der letzten Zeile zu behalten. Wenn Kopfnamen Leerzeichen oder Symbole enthalten, können Spalten im dritten Argument auch per Nummer angesprochen werden: \csvcoli, \csvcolii, \csvcoliii, … stehen für den Inhalt der ersten, zweiten, dritten Spalte.
Standardmäßig wird die erste Zeile als Kopf behandelt und nicht zu den Daten gezählt. Für eine CSV ohne Kopfzeile liest die Sternform \csvreader* auch die erste Zeile als Daten. csvsimple bietet außerdem filter zum Auswählen von Zeilen nach Bedingungen sowie \csvstyle / \csvnames, um Zuordnungen wiederzuverwenden — Funktionen, die über Tabellen hinaus für allgemeine zeilenweise Verarbeitung nützlich sind.
Lesen und formatieren — pgfplotstable
Wenn auch das Aussehen der Zahlen gezielt gestaltet werden soll, ist pgfplotstable die stärkste Wahl. Es gehört zu pgfplots und wird mit \usepackage{pgfplotstable} geladen. Der zentrale Befehl ist \pgfplotstabletypeset[options]{data.csv}: Er liest die CSV, formatiert sie auf die gewünschte Genauigkeit und Zahlenform und baut intern ein tabular als Ausgabe. Für CSV-Dateien gibt man das Trennzeichen mit col sep=comma an.
Gesteuert wird alles über Schlüssel-Wert-Optionen. Die wichtigsten stehen hier.
| Option | Wirkung | |
|---|---|---|
col sep=comma | col sep=comma | Als CSV lesen (kommagetrennt); Vorgabe ist Trennung durch Leerraum |
header | header=has colnames / header=false | Zeile 1 als Spaltennamen behandeln / als ohne Kopf behandeln |
columns | columns={a,b,...} | Ausgabespalten und ihre Reihenfolge wählen |
columns/NAME/.style | columns/price/.style={...} | Formatierung auf eine benannte Spalte anwenden |
column name | column name=Überschrift | Gedruckte Überschrift dieser Spalte ersetzen |
fixed | fixed, fixed zerofill, precision=n | Festkomma, mit Nullen aufgefüllt, n Nachkommastellen |
sci | sci, sci zerofill | In wissenschaftlicher Schreibweise (Exponentialform) setzen |
string type | string type | Textspalte (keine Zahlenformatierung) |
dec sep align | dec sep align | Spalte am Dezimalpunkt ausrichten (benötigt array) |
\pgfplotstabletypeset[
col sep = comma,
header = has colnames,
columns = {product, price, weight},
columns/product/.style = {string type, column name = Product},
columns/price/.style = {column name = Price, fixed, precision = 0},
columns/weight/.style = {column name = Weight (g), fixed, fixed zerofill,
precision = 1, dec sep align},
]{data.csv}In diesem Beispiel wird die Spalte product als string type (Text) gesetzt, price als ganze Zahl (precision=0) und weight mit einer Nachkommastelle samt Nullenfüllung, über dec sep align am Dezimalpunkt ausgerichtet. Die Überschriften werden jeweils mit column name ersetzt. Dieselben Daten ändern ihre Stellenzahl allein durch eine andere precision — das Erscheinungsbild der Zahlen unabhängig von der CSV zu steuern, ist genau die Stärke von pgfplotstable.
pgfplotstable kann aus den eingelesenen Spalten außerdem berechnete Spalten ableiten: Mit create on use definiert man eine Spalte, die „bei Verwendung berechnet“ wird, oder man bearbeitet Werte in columns/.../.style nach (postproc cell content) — Tabellenkalkulationsarbeit vollständig in LaTeX. Linien lassen sich mit every head row/.style oder über booktabs-Integration steuern, etwa mit einer Einstellung, die \toprule / \midrule / \bottomrule automatisch einfügt. Diese Leistung macht die Syntax schwerer; als Faustregel gilt daher: pgfplotstable für ausgearbeitete Zahlentabellen, csvsimple für schlichtes CSV-zu-Tabelle.
Als Datenbank — datatool
Das dritte Paket, datatool, liest eine CSV als Datenbank und ist stark bei zeilenweiser Verarbeitung, etwa Serienbrief-artigen Aufgaben. Es wird mit \usepackage{datatool} geladen; anschließend lädt \DTLloaddb{name}{data.csv} eine CSV in eine benannte Datenbank. Standardmäßig ist die erste Zeile der Kopf, und ihre Spaltennamen werden zu den Schlüsseln der Werte. Für CSV-Dateien ohne Kopf benennt \DTLloaddb[noheader]{...}{...} die Spalten automatisch Column1, Column2, ….
Nach dem Laden durchläuft \DTLforeach{name}{assignments}{body} die Zeilen der Reihe nach. Zuordnungen werden als „Makro = Spaltenname“ geschrieben, etwa \DTLforeach{db}{\Product=product,\Price=price}{…}; im Rumpf expandieren \Product und \Price zu den Werten dieser Zeile. Für eine Tabelle lässt man \DTLforeach in einem tabular laufen und beendet den Rumpf mit dem Zeilenabschluss \\.
\DTLloaddb{goods}{data.csv}
\begin{tabular}{l r}
\hline
Product & Price \\
\hline
\DTLforeach{goods}{\Product=product, \Price=price}{%
\Product & \Price \\}
\hline
\end{tabular}Hier wird die CSV als goods geladen, und im tabular gibt \DTLforeach für jede Zeile „Produkt & Preis“ aus. Die eigentliche Stärke von datatool liegt weniger im Tabellensatz als in der Datenmanipulation: Summen und Mittelwerte, Sortieren und bedingtes Ausschließen von Zeilen lassen sich mit Makros erledigen; auch Bibliografien und Seriendokumente werden damit erzeugt. Wenn es nur darum geht, eine CSV in eine Tabelle zu verwandeln, ist csvsimple dagegen knapper.
Zahlen am Dezimalpunkt ausrichten — die S-Spalte von siunitx
Ob die Daten aus einer CSV stammen oder nicht: Eine Zahlenspalte hat immer dasselbe Problem, sie ist schwer lesbar, wenn die Stellen nicht ausgerichtet sind. Der Standardweg in einem von Hand geschriebenen tabular ist die S-Spalte von siunitx. Schreibt man in der Spaltendeklaration S statt r oder Ähnlichem, werden die Zahlen dieser Spalte am Dezimalpunkt ausgerichtet. Verfügbar ist das nach \usepackage{siunitx}.
\begin{tabular}{l S[table-format=4.1]}
\toprule
{Product} & {Weight / \unit{\gram}} \\
\midrule
Apple & 182.5 \\
Orange & 95.0 \\
Melon & 1450.2 \\
\bottomrule
\end{tabular}Hier ist die zweite Spalte S[table-format=4.1], also „4 Vorkommastellen, 1 Nachkommastelle“, und richtet 182.5, 95.0 und 1450.2 am Dezimalpunkt aus. Es gibt zwei Kernpunkte. Erstens: table-format=integer.decimal muss auf den größten Wert in der Spalte abgestimmt werden. Zweitens: Text wie eine Spaltenüberschrift wird mit {…} geschützt ({Weight / \unit{\gram}}). Ohne diesen Schutz versucht siunitx, die Überschrift als Zahl zu lesen, und die Ausrichtung bricht.
Die ausführlichere Verwendung der S-Spalte — table-format angeben, Text schützen, die Makroform \tablenum in \multicolumn nutzen und Werte mit Exponenten behandeln — steht auf der Seite „Einheiten (siunitx)“. Teilt man die Aufgaben auf, \qty für Größen im Fließtext und die S-Spalte für Zahlen in Tabellen, bleibt der Zahlenstil im ganzen Dokument einheitlich.
Was wann verwenden
Am besten wählt man nach Zweck. Eine grobe Orientierung:
- Schlichte CSV → Tabelle:
csvsimple.\csvautotabularfür eine Soforttabelle,\csvreaderfür Ausrichtung und Linien. - Stellenzahlen, Zahlenstile oder berechnete Spalten ausarbeiten:
pgfplotstable. Am stärksten, aber mit schwererer Syntax. - Datenmanipulation als Hauptziel — Summieren, Sortieren, bedingte Verarbeitung:
datatool. Auch gut für Seriendokumente. - Nur eine Zahlenspalte am Dezimalpunkt ausrichten: die
S-Spalte vonsiunitx. Sie passt direkt in ein von Hand geschriebenestabular.
Welche Methode auch gewählt wird: Die Grundlage ist dasselbe tabular-Vokabular — Spaltendeklaration, &, \\ und Linien. Beherrschen Sie zuerst die „tabular-Grundlagen“ und wählen Sie dann ein Werkzeug passend zur Datenmenge und zum gewünschten Format.