IBA verklaart: plaatsing van figuren in LaTeX

De plaatsing van figuren in LaTeX en in tekstverwerkers in het algemeen is soms lastig te doorgronden. In MS Word kunnen afbeeldingen verspringen naar schijnbaar willekeurige plaatsen in de tekst. LaTeX gooit nog wel eens alle afbeeldingen achter elkaar aan het einde van het document. Hoe bepaalt LaTeX wat de beste positie is van afbeeldingen in de tekst en hoe kun je daar handig gebruik van maken?

LaTeX kan zelf de plaatsing van een afbeelding of tabel bepalen, als deze in een float omgeving is geplaatst. De floatomgeving voor afbeeldingen wordt aangeroepen met \begin{figure}. Zoals de naam suggereert, kunnen de floats nu drijven in de lettersoep.

Voordat ik het over het zetten van afbeeldingen zal hebben, is het wellicht handig om te kijken wat LaTeX doet bij het compileren van de code. Zodra de LaTeX-code wordt gecompileerd, doet LaTeX het zetwerk vanaf het begin van de tekst naar het einde van de tekst. Als LaTeX vindt dat een pagina goed is, beschouwt hij die pagina als `af’ en wordt er niet meer naar gekeken. Voor gewone tekst maakt dat niet uit, maar voor floats heeft dit tot praktisch gevolg dat een float alleen op dezelfde pagina of op een pagina na de aanroep kan worden gezet. Dus, als LaTeX een afbeelding in een floatomgeving vindt, terwijl hij net met pagina n bezig is, zal de afbeelding op pagina p ≥ n komen. Het kan dus gebeuren dat de afbeelding een paar pagina’s verder wordt geplaatst, terwijl de pagina voor de aanroep een betere plaats zou kunnen zijn, omdat dit idee simpelweg niet bij LaTeX opkomt.

Op welke plaats op de pagina zet LaTeX de afbeelding neer? Als optionele parameter in de aanroep van de floatomgeving (d.w.z: Na het commando: \begin{figure}{[<optionele parameters>]} kan de gebruiker aan de floatomgeving aangeven waar op de pagina de float mag staan:

  • t: bovenaan de pagina.
  • h: midden in de tekst
  • b: onderaan de pagina
  • p: op een pagina met alleen afbeeldingen

Omdat dit aangeeft waar de float mag staan, zal een float met [tb] overal op de pagina mogen worden gezet. Deze optionele parameters commuteren met elkaar, dus [tb] is hetzelfde als [bt].

Figuur 1: Zowel Tux als Windows passen samen bovenin de pagina.

\begin{figure}[t]
\includegraphics{tux}
\end{figure}
\begin{figure}[t]
\includegraphics{windows}
\end{figure}

Figuur 2: Omdat Tux vrij groot is, heeft Apple niet genoeg ruimte. Daarom wordt Apple doorgeschoven naar de volgende pagina.

\begin{figure}[t]
\includegraphics{tux}
\end{figure}
\begin{figure}[t]
\includegraphics{apple}
\end{figure}

Figuur 3: Tux wil graag onderaan de pagina staan, omdat zijn floatomgeving wordt aangeroepen met \begin{figure}[b]. Omdat Tux langer is dan 30% van de paginahoogte, kan Tux alleen op een `afbeeldingpagina’. Omdat plaatjes in de PDF altijd in dezelfde volgorde staan waarin ze ook in het LaTeX-document staan, neemt Tux Windows en Apple mee naar beneden, terwijl er ruimte genoeg is voor Windows en Apple op eerdere pagina’s.

Wat is boven en wat is beneden? LaTeX beschouwt de bovenste 70% van de pagina als boven en de onderste 30% als beneden. (Deze waarden kunnen worden aangepast met \renewcommand{\topfraction}{<waarde>} en \renewcommand{\bottomfraction}{<waarde>} voor \begin{document}. Het is meestal niet nodig deze waarden aan te passen.) Dit betekent dat een plaatje, als het hoger is dan 30% van de paginahoogte, niet onderaan de pagina geplaatst kan worden. In het voorbeeld hiernaast is te zien hoe dit in zijn werk gaat. In Figuur 1 en 2 is te zien hoe LaTeX in normale omstandigheden werkt. Het plaatsen gaat echter mis in Figuur 3, omdat LaTeX Tux niet onderaan de pagina kan zetten. De plaatjes staan in dezelfde volgorde in de PDF, zoals LaTeX ze heeft aangetroffen in het LaTeX-bestand, dus Windows en Apple zullen pas na Tux gezet worden. Omdat geen van de afbeeldingen een [p] heeft meegekregen, kan er geen ‘afbeeldingpagina’ gemaakt worden tussen pagina  1 en pagina 2. Tux en alle afbeeldingen die hij heeft meegesleept, worden onderaan het document geplaatst.

Naar welk van de parameters tussen blokhaken kijkt LaTeX het eerst? Als LaTeX een float wil plaatsen, kijkt het dus naar de parameters [tbhp]. Eerst kijkt LaTeX of er een h in het rijtje staat, want de snelste methode om een afbeelding te plaatsen is natuurlijk om het plaatje meteen tussen de tekst in te zetten. De afbeelding zal niet meer verplaatsen, omdat LaTeX al geplaatste tekst of afbeeldingen niet meer verandert. Mocht het niet kunnen om het plaatje meteen te plaatsten, zal er daarna gekeken worden of er ook een t is aangegeven, omdat LaTeX het liefst plaatjes bovenaan de pagina heeft. Als het niet mogelijk is om een plaatje bovenaan de pagina te zetten (de floats die bovenaan staan, nemen niet meer dan 70% van de ruimte in en het aantal bovenin geplaatste afbeeldingen is niet hoger dan 2), zal gekeken worden of er beneden nog ruimte is. Als nergens aan voldaan kan worden, of alleen de optie p is aangegeven, zal LaTeX het plaatje in de wachtrij zetten. Zodra er een nieuwe pagina wordt gemaakt, zal de compiler weer kijken of het plaatje past. Dit zal in de meeste gevallen werken, omdat LaTeX nu de hele pagina ter beschikking heeft (dit gebeurt in Figuur 3). Als er meerdere floats in de wachtrij staan, zal LaTeX bij een nieuwe pagina proberen in één keer de rij te legen door een `afbeeldingpagina’ te maken. Voor zo een pagina gelden geen restricties meer over of een afbeelding boven of onder geplaatst moet worden of het aantal afbeeldingen dat maximaal geplaatst kan worden.

Tot slot nog wat praktische tips:

Bij het maken van een float kunnen de restricties wat betreft het aantal afbeeldingen per pagina worden uitgezet door een ! tussen de blokhaken te zetten. Om een plaatje op dezelfde plaats in de PDF te krijgen als in het TeX-bestand is [h!] mee te geven aan \begin{figure}. Er kan ook grover geschut in worden gezet: [H] zet altijd de float op de plaats neer als aangegeven en maakt zo nodig een nieuwe pagina aan. Hiervoor is de float package nodig.

Om te voorkomen dat floats ergens heen drijven naar plaatsen waar ze niet horen, kan de placeins package gebruikt worden. Deze package geeft het commando \FloatBarrier. Zoals de naam al suggereert, kunnen floats niet voorbij dit commando en zullen de altijd ervoor geplaatst worden. Dit is handig om te voorkomen dat verdwaalde floats van vorige hoofdstukken nog ronddrijven verderop in het document.

De voorgaande tekst ging alleen over de plaatsing van afbeeldingen die de hele breedte van het document in beslag nemen. Als de afbeelding klein is vergeleken met de paginabreedte, kun je ook de wrapfig-package gebruiken. De wrapfig-package geeft een wrapfigure-omgeving waarmee door tekst omringde afbeeldingen gemaakt kunnen worden. Natuurlijk zal LaTeX dit plaatje dicht bij de aanroep plaatsen.

Wellicht ten overvloedde: de manier van plaatsten zorgt ervoor dat afbeeldingen pas gezet worden, nadat ze zijn aangeroepen in de code. Ook worden alle floats geplaatst op volgorde waarin ze in de code voorkomen. Wees dus niet te restrictief: een float met alleen [b], zal niet altijd op een goede manier geplaatst kunnen worden en kan hierdoor andere floats wegduwen.

Dit artikel is eerder verschenen in de Vakidioot 1617-3 Figuur

Geef een reactie