Inhaltsverzeichnis

Wie funktionieren Gleitobjekte und wie kann man ihre Positionierung beeinflussen?

Achtung lang!

Der folgende tiefgründige Text ist von Frank Mittelbach, der ihn auf TeX.sx veröffentlicht hat, er wurde von Clemens auf TeXwelt.de ins Deutsche übersetzt. Er hat einige (sehr wenige) Sätze weggelassen und auch den letzten Abschnitt über die Dokumentation des Algorithmus' ausgelassen.

Terminologie

Klassen von Gleitumgebungen

Jede von LaTeX's Gleitumgebungen gehört einer Klasse an. Der LaTeX-Kernel kennt von sich aus erst einmal zwei: figure und table. Dokumentenklassen oder Pakete können weitere definieren. Die Klasse einer Gleitumgebung beeinflusst Eigenschaften wie zum Beispiel die voreingestellte Platzierungsoption.

LaTeX wird nie die Reihenfolge von Gleitumgebungen einer Klasse änderen. Hat man etwa figure1, table1, figure2 in einem Dokument, dann wird figure2 auf jeden Fall nach figure1 platziert werden. table1 gehört einer anderen Klasse an und wird daher unabhängig davon platziert.

Gleitumgebungsbereiche

In einer Kolumne kennt LaTeX zwei Bereiche, in denen es Gleitumgebungen platzieren kann: den top-Bereich und den bottom-Bereich. In einem zweispaltigen Layout gibt es außerdem einen top-Bereich, der beide Spalten umfasst. Einen entsprechenden bottom-Bereich gibt es nicht.

Außerdem kann LaTeX Gleitkolumnen oder -seiten machen, also Kolumnen oder Seiten, die nur Gleitumgebungen enthalten.

Zu guter letzt kann LaTeX Gleitumgebungen „inline“ in den Text platzieren.

Platzierungsparameter

Um eine Gleitumgebung in einen der genannten Bereiche zu platzieren, benötigt eine Gleitumgebung Platzierungsparameter als optionales Argument. Ohne Argument werden die Voreinstellungen verwendet. Das optionale Argument kann die folgenden Zeichen in beliebiger Reihenfolge enthalten:

Die Reihenfolge, in der diese Zeichen verwendet werden, beeinflussen nicht, wie der Algorithmus bestimmt, wo die Gleitumgebung platziert wird. Beispielsweise machen [ht] und [th] keinerlei Unterschied! Das ist eines der häufigsten Missverständnisse über Gleitumgebungen.

Wenn jedoch ein Zeichen nicht verwendet wird, dann wird die entsprechende Option überhaupt nicht beachtet!

Parameter des Algorithmus

Es gibt ca. zwanzig Parameter, die die Platzierung einer Gleitumgebung beeinflussen. Sie bestimmen grundsätzlich

Referenzpunkt einer Gleitumgebung

Die Stelle, an die eine Gleitumgebung im Quelltext geschrieben wird, beeinflusst die Platzierung der Gleitumgebung im Output, da dadurch festgelegt ist, wann LaTeX die Gleitumgebung zum ersten Mal sieht. Wenn eine Gleitumgebung mitten in einem Absatz platziert wurde, dann ist der Referenzpunkt der nächste Zeilenumbruch oder Seitenumbruch in dem Absatz, in dem die Gleitumgebung geschrieben wurde.

Grundlegende Regeln des Gleitmechanismus

Mit dem jetzigen Wissen können wir in das Verhalten des Algorithmus etwas eintauchen.

Zunächst muss man verstehen, dass alle von LaTeXs Algorithmen dergestalt konzipiert wurden, dass Rückverfolgung vermieden wird. Das bedeutet, LaTeX liest den Quelltext, formatiert, was es findet, und setzt es mehr oder weniger sofort. Diese Designentscheidung wurde getroffen, um einerseits die (dennoch recht hohe) Komplexität niedrig zu halten und andererseits eine vernünftige Geschwindigkeit zu erhalten. (Man denke daran, dass das aus den frühen Achtzigern stammt).

Der Algorithmus für Gleitumgebungen ist gierig, d.h., wenn er eine Gleitumgebung findet, wird er versuchen, sie sofort zu platzieren. Wenn er erfolgreich war, wird er diese Entscheidung niemals rückgängig machen. Das bedeutet, er könnte eine Lösung wählen, die eigentlich unterlegen ist, wenn man später erhaltene Daten berücksichtigte.

Wenn eine figure beispielsweise in den top-Bereich platziert werden darf, entscheidet LaTeX vielleicht, sie dort zu platzieren. Wenn diese Abbildung von zwei tables gefolgt wird, die nur in den top-Bereich platziert werden dürfen, passen sie vielleicht nicht mehr hinein. Eine Lösung, die möglicherweise funktioniert hätte aber nicht ausprobiert wurde, wäre gewesen, die Abbildung in den bottom-Bereich zu platzieren, und beide Tabellen in den top-Bereich.

Die grundlegende Reihenfolge

Der Algorthmus durchläuft folgende Schritte:

Regeln, nach denen eine gefundene Gleitumgebung platziert wird

Immer, wenn LaTeX eine Gleitumgebung im Quelltext findet, schaut es zunächst in die Warteschlange, um zu sehen, ob schon eine weitere Umgebung derselben Klasse in der Schlange steht. Wenn das der Fall ist, wird die Gleitumgebung der Warteschlange sofort hinzugefügt.

Wenn nicht, dann schaut LaTeX nach den Platzierungsparametern für diese Gleitumgebung, entweder die des optionalen Arguments oder die der Voreinstellung der entsprechenden Klasse.

Damit ist der Prozess beendet, der durchlaufen wird, wenn eine Gleitumgebung im Dokument gefunden wird.

Leeren der Warteschlange bei einem Seitenubruch

Nachdem eine Seite fertiggestellt ist, begutachtet LaTeX die Warteschlange, und versucht, sie so gut wie möglich zu leeren. Dafür wird es zuerst versuchen, Gleitseiten zu erzeugen.

Alle Gleitumgebungen, die an einer Gleitseite (oder -kolumne) teilnehmen, müssen ein p als Parameter angegeben haben. Fehlt es, darf die Umgebung nicht auf eine Gleitseite gesetzt werden. Obendrein verhindert es, dass irgendeine andere Umgebung der gleichen Klasse auf die Gleitseite gesetzt wird!

Darf eine Gleitumgebung auf eine Gleitseite platziert werden, wird sie für die Seite vorgemerkt. Der Algorithmus kann aber immer noch abrechen, wenn die Gleitseite nicht „voll genug“ würde. (Das hängt von den Parametereinstellungen für Gleitseiten ab.) Erst ganz am Ende des Dokuments oder wenn ein \clearpage gefunden wird, werden diese Beschränkungen aufgehoben, und eine Gleitumgebungen wird auf eine Gleitseite gesetzt, auch wenn sie kein p habt und die einzige Gleitumgebung der Seite ist.

Das Erstellen von Gleitseiten geht so lange weiter, bis der Lagorithmus entweder keine weiteren Gleitumgebungen zum platzieren übrig hat, oder er scheitert, eine Gleitseite zu erstellen. Im letzten Fall werden alle Gleitumgebungen, die bis dahin noch nicht platziert wurden, als Kandidaten für die top- und bottom-Bereiche der nächsten Seite (oder Kolumne) behandelt.

Das Vorgehen dann ist dasselbe, wie oben beschrieben mit der Ausnahme, dass

Jede Gleitumgebung, die bis hierhin noch nicht platziert werden konnte, wird wieder auf die Warteschlange gesetzt. Wenn LaTeX also wieder soweit ist, weiteres Textmaterial aus dem Quelltext aufzunehmen, kann die Warteschlange also bereits Gleitumgebungen enthalten. Eine Konsequenz daraus ist, dass dann eine Gleitumgebung, die im Dokument gefunden wird, zurückgehalten wird, nur weil eine frühere Gleitumgebung schon auf der Wartebank sitzt.

Details zu den Parameter, die die Platzierung beeinflussen

Es gibt vier Zähler, die kontrollieren, wie viele Gleitumgebungen in de verschiedenen Bereiche gesetzt werden dürfen:

Die Größe der einzelnen Bereiche, wird durch Parameter kontrolliert, die den maximalen oder minimalen Anteil eines Bereichs als Bruchteil der Seitenhöhe angeben. Sie können mit \renewcommand geändert werden.

Der Weißraum, der die Gleitumgebungen innerhalb eines Bereichs voneinander trennt, wird durch die folgenden Parameter bestimmt. Sie alle sind Gummilängen, dürfen also stauch- oder dehnbare Anteile enthalten. Ihre Voreinstellung hängt von der Schriftgröße des Dokuments ab und ändert sich, wenn Klassenoptionen wie 11pt oder 12pt verwendet werden. Hier sind die Voreinstellungen für 10pt:

Gleitumgebungen, die „here“ platziert werden, wird der Abstand zum umgebenden Text durch folgende Länge vorgegeben:

Im Fall von Gleitseiten oder Gleitkolumnen (also einer Seite oder Spalte, die nur Gleitumgebungen enthält), gelten die Parameter nicht. Sie werden durch diesen Parameter kontrolliert:

Konsequenzen des Algorithmus

Eine Gleitumgebung kann früher im Dokument erscheinen als im Quelltext

Die Platzierung einer Gleitumgebung im Quelltext bestimmt den frühesten Punkt, and dem eine Gleitumgebung erscheinen darf. Sie kann im Dokument zu ienem bestimmten Grad rückwärts wandern, da sie in den top-Bereich der aktuellen Seite platziert werden könnte. Sie kann aber nicht auf einer früheren Seite als der umgebende Text erscheinen, da LaTeX keine Rückverfolgung macht und die früheren Seiten bereits gesetzt sind.

Daher wird eine Gleitumgebung normalerweise in der Nähe seiner ersten Erwähnung (Text wie „siehe Tabelle~3“) platziert, weil man dadurch sicherstellt, dass die Gleitumgebung entweder auf der gleichen Seite wie der Text oder eine Seite später erscheint. In machnen Fällen möchte man die Gleitumgebung vielleicht auf der vorhergehenden Seite platzieren (wenn die Seite von der Erwähnung aus immer noch sichtbar ist). Das kann man nur erreichen, in dem man den Quelltext an eine frühere Stelle schiebt.

Ganzseitige Gleitumgebungen in zweispaltigen Dokumenten werden immer erst zurückgehalten

Wenn LaTeX eine ganzseitige Gleitumgebung (also figure* oder table*) im zweispaltigen Satz findet, wird sie sofort auf die Warteschlange geschoben. Das liegt wieder am „gierigen“ Verhalten des Algorithmus': wenn LaTeX gerade die zweite Spalte einer Seite sammelt, ist die erste Spalte bereits eingesammelt und für den Satz gespeichert. Da LaTeX nicht zurückschaut, gibt es keine Möglichkeit, die Umgebung auf die aktuelle Seite zu setzen. Um den Algorithmus einfach zu halten, geschieht das gleiche sogar, wenn die erste Spalte bearbeitet wird.

Um also eine Gleitumgebung auf die aktuelle Seite zu setzen, muss man sie manuell an eine andere Stelle in der Quelle verschieben – vor den Anfang der aktuellen Seite. Offensichtlich kann jede weitere Veränderung am Dokument diese Anpassung obsolet machen. Wenn man solche Anpassungen also überhaupt vornimmt, dann am besten in der allerletzten Phase der Dokumenterstellung – wenn alles Material geschrieben ist und man sich auf Feineinstellungen des optischen Erscheinungsbilds konzentrieren kann.

Es gibt keinen bottom-Bereich für ganzseitige Gleitumgebungen

Eigentlich ist das keine Konsequenz aus dem Algorithmus sondern eine Tatsache über ihn. Die einzigen Bereiche für zweispaltige Gleitumgebungen sind der top-Bereich und eine Gleitseite. Wenn man also ein h oder b als Parameter hinzufügt, werden sie einfach ignoriert. {figure*}[b] impliziert, dass die Gleitumgebung bis zum Ende das Dokuments oder dem nächsten \clearpage zurückgehalten wird.

Alle Parameter schränken (normalerweise) die Platzierungsmöglichkeiten ein

Das mag offensichtlich erscheinen, ist es aber Wert, wiederholt zu werden: jeder Parameter beschränkt LaTeXs Möglichkeiten, Gleitumgebungen zu platzieren. es gibt immer eine Möglichkeit, einen Parameter so einzustellen, dass er die Platzierung nicht mehr beeinflusst. Leider lädt man damit zu eher schlecht aussehenden Platzierungen ein.

LaTeXs Voreinstellungen sind ziemlich großzügig. Damit beispielsweise eine Gleitseite akzeptiert wird, muss/müssen die Gleitumgebung(en) mindestens eine halbe Seite einnehmen. Anders gesagt ist es erlabt, dass eine solche Seite zur Hälfte leer ist, was in den meisten Fällen sicherlich nicht die bestmögliche Lösung ist.

Oft geschieht es, dass Anwernder versuchen, solche Einstellungen zu verbessern, und dann überrascht sind, wenn sich plötzlich alle Gleitumgebungen am Ende des Dokuments aufstapeln. Um bei dem eispiel zu bleiben: wenn man \floatpagefraction auf, sagen wir, 0.8 einstellt, heißt das, das eine Gleitumgebung, die 0.75 einer Seite einnehmen würde, keine Gleitseite bilden darf. Wenn es also keine zweite Gleitumgebung gibt, die hinzugefügt werden kann, wird die Umgebung zurückgehalten, zusammen mit allen weiteren Umgebungen der gleichen Klasse. Es ist noch schlimmer: diese spezielle Umgebung ist zu groß, um auf die nächste Seite im top-Bereich platziert zu werden, da die maximal erlaubte Größe in der Voreinstellung 0.7 beträgt. Als Konsequenz wird die Umgebung bis zum nächsten \clearpage zurückgehalten.

Aus diesem Grund ist es am besten, nicht an den Parametern zu fummeln, während man ein Dokument schreibt. Oder wenigstens nicht so, dass man es dem Algorithmus schwerer macht, die Gleitumgebung in der nähe der Erwähnung zu platzieren. Zum Korrekturlesen ist es wesentlich wichtiger, dass die Gleitumgebung in der Nähe ihrer Erwähnung ist, als halbleere Seiten zu vermeiden.

Einen weiteren Schluss, den man hier ziehen kann, ist, dass es Abhängigkeiten zwischen einigen der Parameter gibt. Es ist wichtig, dass man sie berücksichtigt, wenn man die Werte ändert.

„Hier“ bedeutet eigentlich „hier, wenn es passt“

… und oft passt es nicht. Für viele Leute ist es etwas überraschend, aber durch die Art und Weise, wie der Algorithmus konzipiert wurde, ist h kein unbedingter Befehl. Wenn ein unbedingter Befehl benötigt wird, bieten Erweiterungen zum Beispiel den H Parameter, der wirklich bedeutet „hier und starte eine neue Seite, wenn nötig“. (In einem solchen Fall kann man sich auch überlegen, ob man wirklich eine Gleitumgebung braucht.)

Gleit-Optionen legen keine bevorzugte Reihenfolge fest

Wie bereits erwähnt, versucht der Algorithmus, die Gleitumgebungen in einer vorgegebenen Reihenfolge in den verfügbaren Bereichen zu platzieren. Die Reihenfolge ist festprogrammiert: „here“, „top“, „bottom“ und – bei Seitenumbrüchen – zuerst „page“ und, nur falls das nicht möglich ist, „top“ gefolgt von „bottom“ auf der folgenden Seite.

Wenn man also [bt] angibt, heißt das nicht, dass zuerst „bottom“ und erst danach „top“ ausprobiert wird. Es bedeutet lediglich, dass diese Gleitumgebung nur in den top- und bottom-Bereich gehen darf, genau wie bei [tb].

Zusammenhang zwischen Gleitumgebungen und Fußnoten

Dieser Punkt ist nicht wirklich eine Konsequenz des Algorithmus' sonderen eher eine seiner Implementierung: jedes mal, wenn LaTeX sich zu entscheiden versucht, wo eine Gleitumgebung (oder ein \marginpar) platziert werden soll, löst es die Output routine (OR) aus. Als Teil dieses Prozesses werden alle Fußnoten von ihrem aktuellen Platz auf der „Druckfahne“ entfernt und zusammen in die \footins-Box gesammelt. Nachdem die Gleitumgebung platziert oder auf die Warteschlange gesetzt wurde, kehrt LaTeX zur Druckfahne zurück. Wegen der OR wurde diese aber geändert: LaTeX muss die Fußnoten nun irgendwo aber alle gemeinsam platzieren. Also fügt es die Fußnoten (genauer: den Fußnotentext) am Ende der Fahne ein.

Wenn jetzt aber die Seite schlußendlich an einer anderen Stelle gebildet wird, kann es passieren, dass die Fußnoten auf der falschen Seite oder in der falschen Spalte erscheinen. Das ist zwar ein ziemlich unwahrscheinliches Szenario, aber falls es passiert, sollte man überprüfen, ob in der Nähe des Seitenumbruchs eine Gleitumgebung ist. Dann kann man entweder die Gleitumgebung an eine andere Stelle schieben oder einen expliziten Seitenumbruch einfügen.

Ein spezieller Fall ist es Wert, hervorgehoben zu werden: platziere keine Gleitumgebung direkt nach einer Überschrift, ausßer es ist eine Überschrift, die immer am Anfang einer Seite steht. Überschriften sind normalerweise recht große Objekte, verhinderen aber einen Seitenumbruch nach sich. Eine Gleitumgebung hier mittenrein zu setzen, bedeutet, die OR auszulösen, bevor sich LaTeX entscheiden kann, wo es umbrechen soll, wodurch Fußnoten an die falsche Stelle geschoben werden.