Die Abbildung erscheint nicht dort, wo \begin{figure} steht. LaTeX löst sie aus dem Textfluss, hält sie in einer Warteschlange von Boxen und setzt sie erst ab, wenn der Seitenumbruch es zulässt. Das ist ein Float, und die vier Buchstaben von [htbp] sind nichts weiter als eine Erlaubnis, wo LaTeX ihn absetzen darf. Wer das nicht weiß und immer [h] schreibt, treibt die Abbildung eher weiter fort als näher heran. Diese Seite behandelt, warum Floats wandern, was jeder Buchstabe von [htbp] wirklich bedeutet, den entscheidenden Unterschied zwischen [H] und [h!], wie \FloatBarrier und \clearpage den Fluss sperren, die Platzierungsparameter und die tatsächlichen Bedingungen hinter ! LaTeX Error: Too many unprocessed floats.
Warum die Abbildung nicht dort steht, wo sie geschrieben wurde
Eine Abbildung, die ein Seitenumbruch entzweischneidet, ist unlesbar: Man kann nicht die obere Hälfte hier und die untere auf der nächsten Seite zeigen. LaTeX behandelt deshalb jede Abbildung und jede Tabelle als eine einzige unteilbare Box und wählt, sobald ein Stück Text gesetzt ist, wohin diese Box fällt – oben auf eine Seite, unten, oder auf eine ganz den Floats überlassene Seite. Das ist ein Float; die beiden Standardumgebungen heißen figure und table. Statt die Position von Hand festzulegen, löst LaTeX die Platzierung als Optimierungsproblem, genau wie den Zeilenumbruch. Darin zeigt sich die Grundidee von TeX im Kleinen.
Der Entwurf hat zwei Seiten. Die eine: Eine Abbildung wird nie zerteilt, und ihre Nummer („Abbildung 1“, „Tabelle 2“) sowie jeder Querverweis über \caption, \label und \ref stimmen ohne Zutun überein. Die andere: Schreibstelle und Druckstelle fallen auseinander. Das ist kein Mangel, sondern Voraussetzung. Da der Text „siehe Abbildung 1“ über die Nummer sagen kann, muss die Abbildung nicht neben dem Satz stehen – daher die Regel: über die Nummer verweisen, nie über die Position. LaTeX verarbeitet Floats zudem in Quelltextreihenfolge, sodass eine spätere Abbildung eine frühere überholen kann. Genau deshalb ist „die Abbildung oben“ im Fließtext riskant.
Was h, t, b und p in [htbp] wirklich bedeuten
Die Umgebungen figure und table nehmen als optionales Argument eine Platzierungsangabe entgegen – die eckigen Klammern in \begin{figure}[htbp] –, die LaTeX eine Menge von Erlaubnissen übergibt: Diese Positionen sind zulässig. Ohne Angabe greift bei Klassen wie article und book der Standard tbp, in dem h nicht vorkommt. Eine Abbildung ohne Angabe hatte „hier“ also nie unter ihren Kandidaten.
| Angabe | Bedeutung | Tatsächliches Verhalten |
|---|---|---|
h | here | Nie allein zulässig; LaTeX ergänzt t und meldet LaTeX Warning: 'h' float specifier changed to 'ht'. |
t | top | Oben auf einer Textseite; standardmäßig höchstens zwei Floats und 70 % der Texthöhe |
b | bottom | Unten auf einer Textseite; standardmäßig ein Float und 30 % der Texthöhe |
p | page | Eine reine Float-Seite ohne Text; entsteht nur, wenn Floats mindestens 50 % füllen |
! | override | Nur für diesen Float die Grenzen für Anzahl und Höhe ignorieren; neue Positionen entstehen nicht |
H | nur float-Paket | Macht daraus gar keinen Float; ohne das Paket erscheint ! LaTeX Error: Unknown float option 'H'. |
Die meisten Darstellungen sagen, [h] werde „ignoriert“; tatsächlich warnt LaTeX und schreibt die Angabe um. Bei \begin{figure}[h] steht im Protokoll LaTeX Warning: 'h' float specifier changed to 'ht'., und die Angabe gilt als ht. [h!] verhält sich genauso und ergibt LaTeX Warning: '!h' float specifier changed to '!ht'. Wer diese Warnung liest, weiß sofort, warum die Abbildung nach oben gesprungen ist. Das zweite Missverständnis betrifft die Buchstabenfolge: [bt] und [tb] sind gleichwertig. Die Angabe ist eine Menge erlaubter Positionen, keine Reihenfolge; LaTeX probiert intern in fester Ordnung. Praktisch folgt daraus, nicht zu stark einzuschränken – je großzügiger, [tbp] oder [htbp], desto näher landet die Abbildung; je enger, besonders ein einzelnes [h], desto weiter wandert sie.
\begin{figure}[htbp]
\centering
\includegraphics[width=0.6\textwidth]{plot}
\caption{Measured values against the model}
\label{fig:result}
\end{figure}
% refer by number, not by position; ~ keeps word and number on one line
See Figure~\ref{fig:result} for the result.[H] gegen [h!]: eines davon ist gar kein Float
[H] ist kein „noch stärkeres here als [h!]“. Es durchläuft die Float-Mechanik überhaupt nicht. Das Paket float ersetzt LaTeX-intern \@xfloat und verzweigt in anderen Code, sobald am Anfang einer Angabe ein H steht. H wird also nie als Platzierungsbuchstabe ausgewertet; Abbildung oder Tabelle werden schlicht als große Box an Ort und Stelle gesetzt. Deshalb bricht [H] ohne geladenes float mit ! LaTeX Error: Unknown float option 'H'. ab. [h!] bleibt demgegenüber durchweg ein Float und ignoriert nur die internen Grenzen; passt es nicht, wandert es wie gewohnt weiter.
Übersetzt man beides, zeigt sich der Unterschied sofort. Man setze an derselben Stelle eine Abbildung von halber Texthöhe, einmal mit [H], einmal mit [!h]: Die [H]-Abbildung rührt sich nicht, und passt sie nicht mehr, wandert der umgebende Text mit ihr auf die nächste Seite. Die [!h]-Abbildung gibt ihre Warnung aus und segelt dann am folgenden Text vorbei an den Kopf der nächsten Seite. [H] sagt also „unbedingt hier, notfalls breche ich die Seite“, [!h] sagt „hier, wenn es geht, sonst rücke ich weiter“. [H] passt zu kleinen Abbildungen, die an die Satzfolge gebunden sind – ein Ablaufschema, eine Algorithmusskizze –, leert bei großen Abbildungen aber leicht die gesamte untere Hälfte der Vorseite. Mit \floatplacement{figure}{H} lässt es sich dokumentweit voreinstellen; der Preis ist fast immer viel Weißraum.
\usepackage{float}
% ...
\begin{figure}[H] % not a float any more: pinned, page breaks around it
\centering
\includegraphics[width=0.6\textwidth]{diagram}
\caption{Processing pipeline}
\end{figure}Floats stauen: \FloatBarrier und \clearpage
Am ärgerlichsten ist eine Abbildung, die nicht in ihren eigenen Abschnitt passt und in den nächsten überläuft. Taucht Abbildung 3 aus Abschnitt 2 mitten in Abschnitt 3 auf, verlieren Lesende die Orientierung. Abhilfe schafft \FloatBarrier aus dem Paket placeins, geschrieben von Donald Arseneau und als Public Domain veröffentlicht. Für abschnittsweise Zäune setzt man den Befehl vor jedes \section oder lädt \usepackage[section]{placeins}, das ihn selbst an den Anfang jedes \section stellt.
Eine verbreitete Ansicht gehört hier korrigiert: „\FloatBarrier bricht die Seite nicht um.“ Das ist falsch. Im Quelltext von placeins zeigt sich, dass \FloatBarrier ein \newpage auslöst und sich selbst erneut aufruft, solange Floats ausstehen, und auf \clearpage zurückfällt, wenn sie sich weiterhin nicht abtragen lassen. In einem echten Lauf setzt eine Barriere, die bei einer ausstehenden großen [b]-Abbildung überschritten wird, die Abbildung auf die nächste Seite und den Text erst auf die übernächste – zwei Seitenumbrüche. Nur wenn gar nichts aussteht, bleibt die Seite unberührt. Der wirkliche Unterschied lautet also nicht „bricht um oder nicht“, sondern „bricht bedingungslos um (\clearpage) gegenüber bricht nur bei Bedarf um (\FloatBarrier)“.
\usepackage{placeins} % or [section] to barrier every \section
\usepackage{afterpage}
% ...
\section{Experiment}
% ... figures and tables ...
\FloatBarrier % nothing may cross this line
\section{Discussion}
% flush pending floats at the END of the current page, not right here
\afterpage{\clearpage}Wenn die Wirkung von \clearpage gebraucht wird, ein Seitenumbruch genau hier aber nicht infrage kommt, liefert das Paket afterpage den Befehl \afterpage{\clearpage}. Er führt das \clearpage aus, sobald die gerade entstehende Seite natürlich endet, sodass mitten im Text kein Loch klafft. Örtlicher wirkt \suppressfloats[t]: „oben auf dieser Seite keine Floats mehr“ – genau das benutzt die Option [section] von placeins intern direkt nach einer Überschrift. Nebenbei: [section] ist standardmäßig recht streng und verbietet einem Float sogar, über den Beginn seines Abschnitts zu steigen. Die Optionen [above] und [below] lockern das.
Die Float-Parameter: warum LaTeX sagt, es passe nicht
Die Antwort auf „oben müsste es doch passen“ liegt meist bei den Platzierungsparametern. LaTeX führt Bruchteile und Anzahlen darüber, wie viel einer Seite es Floats überlässt; in der Klasse article sind das \topfraction = 0,7, \bottomfraction = 0,3, \textfraction = 0,2, \floatpagefraction = 0,5 sowie topnumber = 2, bottomnumber = 1 und totalnumber = 3. Eine Abbildung, die höher als 70 % der Texthöhe ist, kann also auf keinem Weg nach oben. Steht in ihrer Angabe nur [t], hat sie kein Ziel und wird endlos weitergeschoben.
| Parameter | Standard in article | Wirkung |
|---|---|---|
\topfraction | 0.7 | Größter Anteil des Seitenkopfs, den Floats einnehmen dürfen |
\bottomfraction | 0.3 | Größter Anteil des Seitenfußes, den Floats einnehmen dürfen |
\textfraction | 0.2 | Kleinster Anteil einer Textseite, der Text bleiben muss |
\floatpagefraction | 0.5 | Mindestfüllung, bevor eine reine Float-Seite entsteht |
topnumber | 2 | Höchstzahl der Floats oben auf einer Seite |
bottomnumber | 1 | Höchstzahl der Floats unten auf einer Seite |
totalnumber | 3 | Höchstzahl der Floats auf einer Seite insgesamt |
\dbltopfraction | 0.7 | Anteil des Seitenkopfs für ein zweispaltiges figure* |
Bruchteile ändert man mit \renewcommand{\topfraction}{0.85}, ganze Zahlen mit \setcounter{totalnumber}{5}. Ein höheres \topfraction bei kleinerem \textfraction lässt mehr Floats oben stehen und verringert das „passt nicht, also weiter nach hinten“. Das ! in [htbp] ist praktisch die einmalige örtliche Fassung dieser Abstimmung. Für zweispaltigen Satz gelten eigene Werte; figure* folgt \dbltopfraction. Wichtiger als die Zahlen ist hier eine Tatsache: Ein zweispaltiges figure* kann nur nach t oder p. LaTeX führt für spaltenübergreifende Floats gar keine Liste für den Seitenfuß, und ihre Standardangabe lautet tp. \begin{figure*}[hb] erzeugt nicht einmal eine Warnung – es landet still oben auf einer Seite.
Too many unprocessed floats: die Grenze liegt bei 52, nicht 18
Läuft die Warteschlange über, erscheint ! LaTeX Error: Too many unprocessed floats. Die vielzitierte Zahl „höchstens 18 Floats“ ist veraltet. latex.ltx legt zwar achtzehn Boxen an, \bx@A bis \bx@R, ergänzt aber dort, wo e-TeX verfügbar ist – und das ist heute jede Engine –, noch \bx@S bis \bx@Z sowie \bx@AA bis \bx@ZZ, zusammen 52. Die Erweiterung kam mit dem LaTeX-Release vom 2015/10/01. Reiht man Floats auf, die sich tatsächlich nirgends platzieren lassen, erscheint der Fehler genau beim dreiundfünfzigsten.
Der Fehler bedeutet nicht, dass Abbildungen entfernt werden müssen. \extrafloats{n}, aus derselben Zeit, weist im Vorspann weitere Boxen zu; im Test verstummte ein bei 52 überlaufendes Dokument, sobald \extrafloats{40} ergänzt war. Ein Mangel an Boxen ist allerdings meist ein Symptom, keine Ursache. Ein überlaufendes Dokument hortet in der Regel unplatzierbare Floats: eine Abbildung höher als 70 % der Texthöhe, deren Angabe nur [t] lautet, oder eine Folge von Floats mit so wenig Text dazwischen, dass nie ein Seitenumbruch entsteht. Die Angabe auf [htbp] zu erweitern und hier und da ein \clearpage zum Leeren der Schlange zu setzen, führt schneller zu einer echten Lösung. Verwandt damit ist LaTeX Warning: Float too large for page by ...pt: „passt nicht auf eine Seite, also kommt sie auf eine eigene“ – ein Hinweis, die Abbildung zu verkleinern oder das Papierformat zu ändern.
% loosen the layout rules for the whole document
\renewcommand{\topfraction}{0.85}
\renewcommand{\textfraction}{0.1}
\renewcommand{\floatpagefraction}{0.75}
\setcounter{totalnumber}{5}
% allocate 40 more float boxes on top of the built-in 52
\extrafloats{40}Zwei Abbildungen nebeneinander setzen
Ein Float ist gleichgültig gegenüber seinem Inhalt; zwei Abbildungen nebeneinander heißt daher nur, zwei Boxen in ein figure zu setzen. In reinem LaTeX ist das minipage, eine Umgebung, die eine „kleine Seite“ gewählter Breite erzeugt. Stellt man zwei davon mit \hfill – einem dehnbaren waagerechten Abstand – dazwischen, wird der Überschuss nach außen gedrückt und beide rücken an die Ränder. Jede etwas schmaler als die halbe Textbreite anlegen; 0.48\textwidth ist der übliche Wert. Übersteigt die Summe \textwidth, erscheint Overfull \hbox und die zweite Box rutscht nach unten.
\begin{figure}[htbp]
\centering
\begin{minipage}{0.48\textwidth}
\centering
\includegraphics[width=\linewidth]{left}
\caption{Left panel} % its own number
\label{fig:left}
\end{minipage}
\hfill
\begin{minipage}{0.48\textwidth}
\centering
\includegraphics[width=\linewidth]{right}
\caption{Right panel} % a second, separate number
\label{fig:right}
\end{minipage}
\end{figure}Innerhalb jeder minipage bezeichnet \linewidth deren Breite, sodass \includegraphics[width=\linewidth] die Box genau ausfüllt. Da jede minipage hier eine eigene \caption trägt, werden daraus „Abbildung 1“ und „Abbildung 2“ mit getrennten Nummern. Sollen sie zu (a) und (b) einer einzigen Abbildung werden, braucht es das Paket subcaption, das die Schwesterseite behandelt. Und wenn im Zweispaltensatz eine Abbildung über die volle Seitenbreite laufen soll, dient figure* beziehungsweise table* – wobei es, wie oben, nur oben auf einer Seite oder auf einer Float-Seite landen kann.
Text um eine Abbildung fließen lassen: wrapfig
Für das Zeitschriftenlayout, bei dem Text neben einer kleinen Abbildung herläuft, dient die Umgebung wrapfigure (für Tabellen wraptable) aus dem Paket wrapfig – ebenfalls von Donald Arseneau, dem Autor von placeins. Sie nimmt vier Argumente, zwei davon verpflichtend: {r} bestimmt die Seite, das abschließende {0.4\textwidth} die Breite der Abbildung. Das optionale [12] ist die Zeilenzahl des Umflusses, das optionale [34pt] der Überhang, also wie weit die Abbildung über den Satzspiegel hinausragt. Die Platzierungsbuchstaben treten paarweise auf: Kleinbuchstaben fixieren, Großbuchstaben erlauben Floating.
\usepackage{wrapfig}
% [lines]{side}[overhang]{width}
\begin{wrapfigure}[12]{r}[34pt]{0.4\textwidth}
\centering
\includegraphics[width=0.38\textwidth]{portrait}
\caption{Portrait}
\end{wrapfigure}| Buchstabe | Seite | Hinweise |
|---|---|---|
r / R | rechts | kleines r fixiert hier, großes R erlaubt Floating |
l / L | links | kleines l fixiert hier, großes L erlaubt Floating |
i / I | innen (Bundsteg) | wechselt in twoside-Dokumenten zwischen linken und rechten Seiten |
o / O | außen (Vorderschnitt) | wechselt in twoside-Dokumenten zwischen linken und rechten Seiten |
Im Beispiel steht eine 0.4\textwidth breite Abbildung rechts vom Text, die folgenden 12 Zeilen fließen links daran vorbei, und [34pt] lässt sie in den rechten Rand ragen. Ohne Zeilenzahl schätzt wrapfig sie aus der Höhe der Abbildung; liegt die Schätzung daneben, wird der Umfluss unruhig, und eine ausdrückliche Angabe ist die schnelle Abhilfe. wrapfig ist allerdings eigenwillig, und sein Handbuch grenzt den Einsatzbereich selbst ein.
- Nicht in einer Liste oder unmittelbar davor oder danach verwenden. In oder neben
itemize,enumerate,descriptiongeht es kaputt. - Nicht über einen Seitenumbruch laufen lassen. So platzieren, dass der Umfluss nicht auf zwei Seiten zerfällt; Seitengrenzen meiden.
- Keine Überschriften und keine abgesetzten Formeln umfließen lassen. Nur gewöhnlicher Fließtext sollte darum herumlaufen.
- An einer Absatzgrenze beginnen, nicht mitten im Absatz. In einer
minipageoderparboxmuss der Umfluss vor dem Ende der Gruppe abgeschlossen sein.
Wenn der Umfluss aus dem Ruder läuft, hilft meist eines von dreien: die Abbildung etwas schmaler machen, die Zeilenzahl ausschreiben oder den Beginn um einen Absatz verschieben. Bleibt es unruhig, führt der Verzicht auf wrapfig zugunsten eines gewöhnlichen Floats ([htbp], über oder unter dem Text) am Ende oft zu einer besser lesbaren Seite. Steht der Ort der Abbildung fest, geht es als Nächstes um Nummer und Beschreibung.