Spalten sind keine Frage des Hausstils, sondern eine Lesehilfe. Eine Textzeile in einem 10-Punkt-article ist 345pt breit, englisch etwa 78 Zeichen; der Typograf Robert Bringhurst nennt 45 bis 75 Zeichen die bequeme Spanne und die Zeile mit 66 Zeichen ideal. Teilt man diese Seite in zwei Spalten, landet jede Zeile wieder in diesem Bereich. Deshalb sind Fachzeitschriften, Tagungsbände und Zeitungen mehrspaltig gesetzt, und LaTeX bietet dafür zwei Werkzeuge von recht verschiedenem Charakter: die Klassenoption twocolumn und die Umgebung multicols aus dem Paket multicol. Sie wirken austauschbar, sind es aber nicht. Diese Seite verfolgt die Unterschiede, die wirklich weh tun: wie viele Spalten möglich sind, ob die letzte Seite ausgeglichen wird, und die zwei ganz verschiedenen Arten, auf die eine Abbildung stillschweigend verschwindet.
twocolumn oder multicol — welches wofür
twocolumn passt, wenn das gesamte Dokument zweispaltig ist und Abbildungen enthält; multicol passt, wenn nur ein Teil in Spalten stehen soll, wenn drei oder mehr Spalten nötig sind oder wenn die letzte Seite gleichmäßig enden muss. Die Trennlinie verläuft bei den Floats. twocolumn lässt LaTeXs Float-Mechanismus unangetastet: Ein figure gleitet weiterhin innerhalb seiner Spalte, figure* überspannt die Seite. multicol dagegen ersetzt die Ausgaberoutine vollständig und gibt im Tausch gegen den Spaltenausgleich die Floats innerhalb der Spalten vollständig auf. Fast jedes Argument auf dieser Seite folgt aus diesem einen Handel.
| Form | Spalten | Wirkung |
|---|---|---|
twocolumn | 2 | Klassenoption; der gesamte Text wird zweispaltig, die letzte Seite bleibt ungleich |
\twocolumn[⟨text⟩] | 2 | Im Text verwendet; erzwingt einen Seitenumbruch und setzt ⟨text⟩ über volle Breite über die Spalten |
\onecolumn | 1 | Im Text verwendet; erzwingt einen Seitenumbruch und kehrt zu einer Spalte zurück |
multicols | 2 bis 10 | Umgebung; beginnt und endet mitten auf der Seite und gleicht die letzten Spalten aus |
multicols* | 2 bis 10 | Dasselbe, aber die letzten Spalten werden von links gefüllt und bleiben ungleich |
Das ganze Dokument zweispaltig setzen — die Option twocolumn
Es genügt, den Klassenoptionen twocolumn hinzuzufügen: \documentclass[twocolumn]{article} setzt den gesamten Text zweispaltig (voreingestellt ist onecolumn). Viele Fachklassen sind intern um diese Option herum entworfen. Für einen Wechsel mitten im Dokument dienen \twocolumn und \onecolumn im Text — mit zwei Haken. Beide Befehle beginnen eine neue Seite, die Spaltenzahl ändert sich also nie mitten auf der Seite. Und \twocolumn erzeugt immer genau zwei Spalten. Sobald eine dritte gebraucht wird, ist dieses Werkzeug am Ende.
\documentclass[twocolumn]{article}Dieses \twocolumn nimmt ein optionales Argument, und meist ist es das, was einem Aufsatz sein Gesicht gibt. \twocolumn[⟨seitenbreites Material⟩] setzt allein dieses Material einspaltig über die volle Satzbreite über den zweispaltigen Text. Titel, Autoren, Zugehörigkeit und Abstract über die ganze Seite, darunter der Haupttext in zwei Spalten — das Layout, das jede Konferenzarbeit trägt, steckt in dieser einen Zeile.
\documentclass[twocolumn]{article}
\begin{document}
\twocolumn[%
\begin{center}
{\LARGE A Study of Narrow Measures}\\[4pt]
A. Author \quad Institute of Typography
\end{center}
\vspace{1em}
]
The body starts here and is set in two columns.
\end{document}Der Abstand zwischen den Spalten ist die Länge \columnsep, die Stärke einer Linie darin \columnseprule. In den Standardklassen ist \columnsep mit 10pt und \columnseprule mit 0pt vorbelegt, also ohne Linie. Mit Zahlen wird das Eingangsargument konkret: Ein 10-Punkt-article hat eine \textwidth von 345pt, eine Spalte misst also (345 − 10) ÷ 2 = 167.5pt und fasst etwa 38 englische Zeichen. Das liegt knapp unter dem Band von 40 bis 50 Zeichen, das Bringhurst für mehrspaltigen Satz empfiehlt — jeder Punkt mehr für \columnsep wird also einer Zeilenlänge entnommen, die nichts abzugeben hat. Eine Linie ist oft der bessere Handel: Sie trennt die Spalten optisch, sodass der Zwischenraum schmal bleiben darf.
\setlength{\columnsep}{20pt} % wider gap between the columns
\setlength{\columnseprule}{0.4pt} % thin vertical rule inside the gapEine Abbildung über beide Spalten ziehen — figure* und table*
Dafür dienen die Sternumgebungen. \begin{figure*} und \begin{table*} erzeugen einen Float, der beide Spalten über die volle Satzbreite überspannt. Eine Unterscheidung darin verhindert die meisten Unfälle: \columnwidth ist die Breite einer Spalte, \textwidth die des gesamten Textblocks — beide Spalten plus Zwischenraum. Eine Grafik für eine Spalte bekommt width=\columnwidth, eine seitenbreite width=\textwidth. Vertauscht ergibt das entweder eine überfüllte Box oder ein merkwürdig klein gesetztes Bild.
\documentclass[twocolumn]{article}
\usepackage{graphicx}
\begin{document}
% one column wide: an ordinary float
\begin{figure}
\centering
\includegraphics[width=\columnwidth]{plot}
\caption{Fits inside a single column.}
\end{figure}
% spans both columns: starred float, default placement is [tp]
\begin{figure*}[t]
\centering
\includegraphics[width=\textwidth]{wide-plot}
\caption{Spans the full text width.}
\end{figure*}
\end{document}Die Klage, ein figure* erscheine „nicht dort, wo ich es geschrieben habe“ oder sei „drei Seiten weitergesprungen“, wird verständlich, sobald man die Voreinstellung kennt. Die Quellen des LaTeX-Kerns halten ausdrücklich fest, dass alle zweispaltigen Floats die Standardplatzierung tp haben. \begin{figure*} wird also stillschweigend als [tp] behandelt — Seitenanfang oder eigene Float-Seite — und nie als htbp. Zudem ist, wie das LaTeX2e-Referenzhandbuch anmerkt, b für seitenbreite Floats im Zweispaltensatz nicht erlaubt. Ist der Kopf der nächsten Seite bereits belegt, rutscht der Float weiter nach hinten. Soll er unbedingt an den Fuß einer Seite, macht das Laden von stfloats oder dblfloatfix b verfügbar.
In dieser Warteschlange steckte ein langlebiger und durchaus reizvoller Fehler. Vor dem Release von 2015 führte LaTeX zurückgestellte Floats in zwei getrennten Listen — einer für einspaltige und einer für zweispaltige Floats. Zwei Schlangen bedeuten Überholen: Eine einspaltige Abbildung 3 konnte eine früher geschriebene seitenbreite Abbildung 2 überholen und vor ihr gedruckt werden. Die Korrektur erschien zunächst als Paket fixltx2e, das die beiden Listen zu einer zusammenführte. 2015 wanderten sämtliche Korrekturen aus fixltx2e in den Kern selbst, sodass in jeder aktuellen TeX-Installation nichts mehr zu laden ist. Wer auf einen alten Beitrag über vertauschte Abbildungsnummern stößt, prüfe zuerst das Datum.
Drei und mehr Spalten, die auch gleich enden — das Paket multicol
Man lädt \usepackage{multicol}, umschließt den Bereich mit einer multicols-Umgebung und übergibt die Spaltenzahl als Argument. Damit stehen 2 bis 10 Spalten zur Verfügung (die Obergrenze von zehn gilt seit Version 1.5); die Umgebung beginnt und endet mitten auf der Seite und gleicht am Ende die Spaltenhöhen von selbst aus. multicols-Umgebungen lassen sich sogar verschachteln. Da nichts einen Seitenumbruch erzwingt, fügt sich ein dreispaltiges Glossar oder Register mitten in einspaltigen Text ganz natürlich ein.
\usepackage{multicol}
% ... later, in the body
\begin{multicols}{3}
This text is broken into three balanced columns.
\end{multicols}multicol verdankt seine Existenz einem Register. 1989, beim Schreiben der Makros für das Paket doc, wollte Frank Mittelbach Register und Literaturverzeichnis einer Dokumentationsdatei auf einer Seite unterbringen. Der Standard-Zweispaltensatz kann das nicht: \twocolumn beginnt stets eine neue Seite, und die letzte endet mit einer halbleeren rechten Spalte. In der Paketdokumentation hält er fest, dass ihn die erste Fassung ein ganzes Wochenende gekostet hat und dass er vom Algorithmus auf Seite 417 des TeXbook ausging — mit dem Zusatz, diese Bemerkung stamme aus der Erstveröffentlichung und seither seien mehrere hundert weitere Stunden in den Code geflossen. Der Spaltenausgleich war also nicht als Kosmetik gedacht, sondern als Mittel, Papier zu sparen.
multicols nimmt nach der Spaltenzahl zwei optionale Argumente. Das erste, [⟨Vorspanntext⟩], ist eine Überschrift oder Einleitung, die unmittelbar über den Spalten über die volle Breite gesetzt wird. Das zweite, [⟨Länge⟩], ist der Mindestfreiraum am Seitenfuß, damit die Spalten dort überhaupt beginnen; es überschreibt für diesen einen Fall die Voreinstellung \premulticols (50pt). Bleibt weniger übrig, beginnt die Umgebung auf einer neuen Seite. Fehlt es nach einem langen Vorspann, kann das Paket mit dem Fehler Error saving partial page abbrechen, gefolgt von Some text may be lost! — und der Aufforderung, \premulticols zu vergrößern.
\begin{multicols}{3}
[\section{Glossary}
This heading and this sentence run the full text width.]
[6cm]
Everything after the optional arguments is split into three columns.
\end{multicols}Warum die letzte Seite eines twocolumn-Dokuments nicht ausgeglichen wird
Weil LaTeX jede Spalte fertigstellt, bevor es weiß, dass es eine nächste gibt. Im Zweispaltensatz läuft die Ausgaberoutine \@outputdblcol einmal pro Spalte: Ist die linke Spalte voll, wandert ihr Inhalt in eine Box namens \@leftcolumn, und der Satz geht weiter; erst wenn die rechte Spalte voll ist, wird die Seite zusammengebaut und ausgegeben. Es gibt also keinen Moment, in dem LaTeX den Resttext in Händen hält und entscheiden dürfte, wie er zu halbieren wäre. Was bei \end{document} übrig ist, fließt daher schlicht in die linke Spalte und hört dort auf, während die rechte kurz bleibt. Das ist kein Fehler, sondern die zwangsläufige Folge eines sequenziellen Seitenaufbaus.
multicol kehrt diese Reihenfolge um, und darin liegt der ganze Trick. Die Dokumentation beschreibt zwei Schritte: erst das Material der Umgebung sammeln, dann am Ende ausgleichen. Weil das Sammeln vorangeht, kann das Paket die entstandene Box mit \vsplit zerteilen und verschiedene Höhen durchprobieren, bis die Spalten nahezu gleich hoch sind. Version 1.5 ergänzte eine Qualitätsprüfung: Jede Lösung wird auf TeXs Badness-Skala gemessen (0 ist ideal, 10000 unendlich schlecht), und Lösungen schlechter als der Zähler columnbadness — Standard 10000 — werden verworfen. Ein zweiter Zähler, finalcolumnbadness mit Standard 9999, entscheidet, dass eine dünn gefüllte letzte Spalte lieber kurz bleibt, als zu etwas Hässlichem gedehnt zu werden.
\raggedcolumns— die Spaltenfüße nicht ausrichten; Standard ist\flushcolumns, das ausrichtet- Zähler
unbalance— alle Spalten außer der letzten um N Zeilen verlängern; wird am Ende jeder Umgebung zurückgesetzt - Zähler
minrows(Standard 1) — Mindestzeilenzahl in der ersten Spalte, gegen einzeilige Spalten - Zähler
columnbadness(Standard 10000) — Lösungen mit größerer Badness werden verworfen - Zähler
finalcolumnbadness(Standard 9999) — oberhalb dieses Werts bleibt eine kurze Schlussspalte kurz, statt gedehnt zu werden \maxbalancingoverflow(Standard 12pt) — überschreiten die ausgeglichenen Spalten den Raum um mehr als diesen Wert, wird der Ausgleich abgebrochen und eine normale Seite gesetzt
Praktisch bleiben drei Wege. Wer bei twocolumn bleiben und nur die Schlussseite ausgleichen will, findet in den Paketen balance und flushend Patches für die Ausgaberoutine. Die TeX FAQ warnt jedoch, dass beide bei vorhandenen Floats leicht durcheinandergeraten und dann eine Handanpassung der Abbildungen nötig werden kann. Robuster ist es, nur den Schluss des Dokuments in eine multicols-Umgebung zu fassen oder eine kurze rechte Spalte hinzunehmen — die meisten Zeitschriftenstile tun genau das.
Den Spaltenumbruch selbst bestimmen — \columnbreak und die Trennlinie
\columnbreak beendet die laufende Spalte genau an der gesetzten Stelle und schiebt den Rest in die nächste; eingeführt wurde es mit Version 1.5u. Seit 1.9 nimmt es ein optionales Argument in der Form von \pagebreak, von \columnbreak[0] (leichte Präferenz) bis \columnbreak[4] (erzwungen). Dieselbe Version 1.9 brachte \newcolumn, das umbricht und die Spalte kurz auslaufen lässt. Warum \pagebreak hier nicht taugt, ist ebenso klar: Innerhalb von multicols würde es die Sammelphase selbst beenden und damit alle Spalten dieser Seite auf einmal schließen.
\setlength{\columnsep}{1.5em} % gap between columns
\setlength{\columnseprule}{0.4pt} % show a rule in the gap
\renewcommand{\columnseprulecolor}{\color{gray}}
\begin{multicols}{2}
Text of the left column.
\columnbreak % push the rest into the next column
Text of the right column.
\end{multicols}Zwischenraum und Linie steuern dieselben \columnsep und \columnseprule wie bei twocolumn; multicol ergänzt \columnseprulecolor (Standard \normalcolor, also die Textfarbe). Diese Werte gehören vor die Umgebung. Eine Einstellung ändert das Paket zudem stillschweigend: die Toleranz beim Zeilenumbruch. LaTeXs übliche \tolerance beträgt 200, der Wert hinter \fussy, und das ist für eine Zeile von 38 Zeichen viel zu streng. Innerhalb der Umgebung schaltet multicol daher auf \multicoltolerance (Standard 9999) — einen Schritt unterhalb der 10000, die „alles erlaubt“ bedeuten, ein pragmatischer Kompromiss für schmale Spalten. Klaffen die Wortabstände im Blocksatz dennoch, helfen \raggedright innerhalb der Umgebung oder bessere Trennmuster für die verwendete Sprache.
Warum eine Abbildung in multicols verschwindet
Weil gewöhnliche Floats dort nicht implementiert sind und alles Hineingesetzte verworfen wird. Steht eine figure- oder table-Umgebung — oder ein \marginpar — innerhalb von multicols, erscheint im Protokoll die Warnung Floats and marginpars not allowed inside 'multicols' environment!. Die Paketdokumentation benennt die Folge unumwunden: Solche Floats verschwinden. Sie nennt auch den Grund. Floats zu implementieren hieße, LaTeXs Ausgaberoutine vollständig neu zu schreiben, und das lag weit jenseits des Wochenendes, das die erste Fassung gekostet hat. Da es sich um eine Warnung und nicht um einen Fehler handelt, übersetzt das Dokument trotzdem. Fehlt eine Abbildung und sieht sonst nichts im Protokoll verdächtig aus, ist diese Zeile die erste Suchadresse.
| Konstrukt | im twocolumn-Modus | in multicols |
|---|---|---|
figure / table | gleitet normal innerhalb seiner Spalte | nicht erlaubt; es erscheint nur eine Warnung, der Float ist weg |
figure* / table* | über die volle Seitenbreite; Standard [tp], b steht nicht zur Verfügung | funktioniert; t, b und p greifen, nie jedoch auf der Seite, auf der er steht |
\marginpar | funktioniert | nicht erlaubt; verschwindet mit derselben Warnung |
\columnbreak | nicht vorhanden; nur der Seitenumbruch bleibt | beendet die Spalte an dieser Stelle (seit 1.5u) |
\pagebreak | schließt die Seite | beendet die Sammelphase, sodass alle Spalten der Seite gleichzeitig schließen |
\columnseprule | senkrechte Linie im Zwischenraum; Standard 0pt | dasselbe, zusätzlich \columnseprulecolor für die Farbe |
Stern-Floats funktionieren innerhalb von multicols durchaus, aber anders als unter twocolumn. Laut Dokumentation wird ein figure* dort weitgehend wie ein gewöhnlicher Float auf einer einspaltigen Seite behandelt: t, b und p greifen alle, und maßgeblich ist \topfraction, nicht \dbltopfraction. Eine Einschränkung ist jedoch absolut — er erscheint nie auf der Seite, auf der er steht. Der früheste Platz ist der Kopf der nächsten Seite, womit h sinnlos wird. Daher rührt die eigentümliche Umkehrung: Unter twocolumn ist b nicht verfügbar, innerhalb von multicols schon.
Wie also kommt ein kleines Bild in eine Spalte? Die Antwort lautet: nicht als Float. Ein \includegraphics direkt in eine center-Umgebung gesetzt bleibt genau dort, wo es geschrieben wurde (innerhalb der Umgebung entspricht \linewidth der Spaltenbreite, width=\linewidth ist also die naheliegende Angabe). Braucht es eine nummerierte Bildunterschrift, liefert \captionof{figure}{…} aus dem Paket caption sie, samt korrekter Zählung und Querverweise. Soll der Text darum herumfließen, bleibt wrapfig. Sobald sich jedoch zeigt, dass Floats innerhalb der Spalten im ganzen Dokument gebraucht werden, ist das das Signal, twocolumn statt multicol zu wählen.
\usepackage{multicol}
\usepackage{graphicx}
\usepackage{caption} % provides \captionof
% ... in the body
\begin{multicols}{2}
Text before the picture.
\begin{center}
\includegraphics[width=\linewidth]{plot}
\captionof{figure}{Not a float, so it stays where it is written.}
\end{center}
Text after the picture.
\end{multicols}