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.
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.
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.
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 werdent
die Gleitumgebung darf in den top-Bereich platziert werdenb
die Gleitumgebung darf in den bottom-Bereich platziert werdenp
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!
Es gibt ca. zwanzig Parameter, die die Platzierung einer Gleitumgebung beeinflussen. Sie bestimmen grundsätzlich
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.
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 table
s 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.
Der Algorthmus durchläuft folgende Schritte:
\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.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.
!
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.h
angegeben wurde.
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.b
geschaut und, wenn
es gefunden wird, versucht, die Umgebung in den bottom-Bereich zu
platzieren, natürlich unter Beachtung eventueller Einschränkungen.
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.
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
h
keine Bedeutung mehr hat (an dieser Stelle sind wir weit
vom ursprünglichen „here“ entfernt) und daher ignoriert wird,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.
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ürfenbottomnumber
(Voreinstellung 1
), die maximale Anzahl von
Gleitumbegungen, die in einen bottom-Bereich platziert werden dürfendbltopnumber
(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.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.
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.
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.
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.
… 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.)
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]
.
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.