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:

  • ! manche Einschränkungen sollen ignoriert werden (siehe später)
  • h die Gleitumgebung darf inline (here) platziert werden
  • t die Gleitumgebung darf in den top-Bereich platziert werden
  • b die Gleitumgebung darf in den bottom-Bereich platziert werden
  • p die Gleitumgebung darf auf einer Gleitkolumne oder Gleitseite platziert werden

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

  • wie viele Gleitumgebungen in einen bestimmten Bereich platziert werden dürfen.
  • wie groß ein Bereich werden darf.
  • wie viel Text auf einer Seite sein muss oder anders gesagt wieviel Platz top- und bottom-Bereich einnehmen dürfen.
  • wie viel Weißraum eingefügt wird
    • zwischen aufeinander folgenden Gleitumgebungen
    • zwischen Gleitbereich und dem Text darüber oder darunter

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:

  • Wenn eine Gleitumgebung gefunden wird, versucht LaTeX, sie nach seinen Regeln (die noch besprochen werden) sofort zu platzieren.
    • Wenn das klappt, wird die Gleitumgebung platziert und die Entscheidung nie mehr rückgängig gemacht.
    • Wenn es nicht klappt, wird die Gleitumgebung in eine Warteschlange gestellt, damit sie beim nächsten Seitenumbruch (nicht früher) wieder berücksichtigt werden kann.
  • Wenn eine Seite vollständig ist, begutachtet LaTeX seine Warteschlange und versucht, sie so gut wie möglich zu leeren. Dafür wird es zunächst so viele Gleitseiten wie möglich erzeugen, in der Hoffnung, dass sich die Warteschlange dadurch leert. Wenn diese Möglichkeit erschöpft ist, wird als nächstes versucht, die übrigen Gleitumgebungen auf die top- und bottom-Bereiche zu verteilen. Alle verbleibenden Gleitumgebungen werden begutachtet und entweder platziert oder für die nächste Seite wieder in die Warteschlange gestellt.
  • Danach wird das Material für die aktuelle Seite verarbeitet. Dabei können weitere Gleitumgebungen entdeckt werden.
  • Wenn das Ende des Dokuments oder ein \clearpage erreicht wird, startet LaTeX eine neue Seite, lockert LaTeX alle einschränkenden Regeln und gibt alle Gleitumgebungen der Warteschlange aus, indem es sie auf Gleitseiten setzt.

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.

  • Wenn die Parameter ein ! enthalten, wird der Algotithmus alle Einschränkungen bezüglich der Anzahl der Umgebungen, die in einen Bereich platziert werden dürfen, oder der maximalen Größe, die ein Bereich einnehmen darf. Andere Einschränkungen werden angewandt.
  • Als nächstes wird geschaut, ob h angegeben wurde.
    • Wenn ja, dann wird versucht, die Umgebung genau da auszugeben, wo sie im Quelltext eingegeben wurde. Wenn das klappt, wenn also genügend Platz da ist, wird die Umgebung platziert, und der Prozess ist beendet.
    • Wenn nicht, dann wird als nächstes nach einem t geschaut. Ist es da, wird versucht, die Umgebung in den top-Bereich zu platzieren. Wenn es keine Einschränkungen gibt, die das verhindern, wird die Gleitumgebung ausgegeben und der Algorithmus stoppt.
    • Ist es auch nicht da, wird schießlich nach einem b geschaut und, wenn es gefunden wird, versucht, die Umgebung in den bottom-Bereich zu platzieren, natürlich unter Beachtung eventueller Einschränkungen.
  • Wenn das nicht funktioniert hat oder wegen fehlender Parameter nicht erlaubt war, wird die Gleitumgebung der Warteschlange hinzugefügt.
  • Ein eventuell vohandenes p wird in diesem Prozess nicht berücksichtigt. Es wird beim nächsten Seitenumbruch beachtet.

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

  • das Zeichen h keine Bedeutung mehr hat (an dieser Stelle sind wir weit vom ursprünglichen „here“ entfernt) und daher ignoriert wird,
  • die Gleitumgebungen an dieser Stelle nicht mehr vom Quelltext stammen, sondern eine nach der anderen von der Warteschlange.

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:

  • totalnumber (Voreinstellung 3), die maximale Anzahl von Gleitumgebungen auf einer Textseite (nicht Gleitseite!)
  • topnumber (Voreinstellung 2), die maximale Anzahl von Gleitumbegungen, die in einen top-Bereich platziert werden dürfen
  • bottomnumber (Voreinstellung 1), die maximale Anzahl von Gleitumbegungen, die in einen bottom-Bereich platziert werden dürfen
  • dbltopnumber (Voreinstellung 2), die maximale Anzahl von Gleitumbegungen, die in einen ganzseitigen top-Bereich in einem zweispaltigen Dokument platziert 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.

  • \topfraction (Voreinstellung 0.7), maximale Größe des top-Bereichs.
  • \bottomfraction (Voreinstellung 0.3), maximale Größe des bottom-Bereichs.
  • \dbltopfraction (Voreinstellung 0.7), maximale Größe des ganzseitigen top-Bereichs in einem zweispaltigen Dokument.
  • \textfraction (Voreinstellung 0.2), minimale Größe des Textbereichs, also des Teils, der nicht von Gleitumgebungen belegt werden darf.

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:

  • \floatsep (Voreinstellung 12pt plus 2pt minus 2pt), der Abstand zwischen Gleitumgebungen in den top- oder bottom-Bereichen.
  • \dblfloatsep (Voreinstellung 12pt plus 2pt minus 2pt) der Abstand zwischen Gleitumgebungen im ganzseitigen top-Bereich eines zweispaltigen Dokuments.
  • \textfloatsep (Voreinstellung 20pt plus 2pt minus 4pt) der Abstand zwischen top- oder bottom-Bereich und Textbereich
  • \dbltextfloatsep (Voreinstellung 20pt plus 2pt minus 4pt) der Abstand zwischen ganzseitigem top-Bereich eines zweispaltigen Dokuments und Textbereich.

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

  • \intextsep (Voreinstellung 12pt plus 2pt minus 2pt)

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:

  • \floatpagefraction (Voreinstellung 0.5), minimaler Anteil einer Seite oder Kolumne, der durch Gleitumgebungen besetzt werden muss, bevor eine Gleitseite oder Gleitkolumne gebildet werden darf.

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.

This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Creative Commons Lizenzvertrag Diese Seite bearbeiten Ältere Versionen Übersicht Links hierher RSS feed Impressum