IBA Verklaart latex

De naam latex werd oorspronkelijk alleen gebruikt voor een stroperige substantie uit de rubberboom of andere planten, zoals de paardenbloem. De plant maakt de latex aan als bescherming tegen insecten en is dus niet het plantensap of het hars van de plant. Deze latex uit de rubberboom werd al voor de komst van de Europeanen in Zuid-Amerika om kleding waterdicht te maken. Charles Marie de La Condamine bracht in de achttiende eeuw rubber, gemaakt van geconcentreerd latex, van Amerika naar Europa. In de achttiende eeuw was het een exotisch materiaal dat, hoewel het heel interessante eigenschappen had, weinig nuttige toepassingen had1. In de negentiende eeuw werd rubber gebruikt als ballon of om kieren te dichten. Pas aan het einde van de negentiende eeuw werd er op grotere schaal rubber geproduceerd in India, Congo en Brazilië en werden er ook banden van rubber gemaakt. Op plantages werd (en wordt nog steeds, hetzij voor een heel klein percentage van de rubberproductie) een gat in de bast van de rubberbomen gemaakt om de latex af te tappen. Het negentiende-eeuwse rubber bestond uit geconcentreerd latex en was ook veel zachter en van slechtere kwaliteit dan het rubber dat tegenwoordig geproduceerd wordt.

Omdat rubber vroeger van deze latex uit planten werd gemaakt, wordt ongevulkaniseerd rubber ook latex genoemd. Dit ongevulkaniseerde rubber is een stuk zachter dan het gevulkaniseerde rubber dat gebruikt wordt in autobanden, daarom kan ongevulkaniseerd ook gebruikt worden voor handschoenen: de latex handschoenen. In de tweede wereldoorlog werd er in de Verenigde Staten en Duitsland wegens tekorten door de oorlog onderzoek gedaan naar de verbetering van synthetisch rubber dat op dat moment nog van slechtere kwaliteit was dan natuurrubber. Tot in de jaren ’60 werd op grote schaal natuurrubber gebruikt, maar de kwaliteit van synthetisch rubber was al snel vergelijkbaar en zelfs beter dan natuurrubber, maar dan eens stuk goedkoper. Tegenwoordig wordt ook het rubber voor latexhandschoenen gesysnthesiteerd en komt er dus geen latex meer te pas bij het produceren van latex en wordt latex als synoniem voor ongevulkaniseerd rubber gebruikt.2

1 Het rubber kon wel als gum gebruikt worden, vandaar het woord rubber.
2 Dit stukje is ook niet geschreven met LaTeX.

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

LaTeX-cursus Deel 5 in de praktijk: een eigen inleveropgaveklasse

\LaTeX kan veel beter overweg met formules dan Word of LibreOffice. Desalniettemin kan het veel werk zijn om lange uitwerkingen van inleveropgaven te \TeX-en. Het loont daarom om een eigen klasse te schrijven met daarin jouw meest gebruikte commando’s.

Om een eigen klasse te maken maak je een nieuw document met de extensie .cls. Bovenaan zet je welke versie van \LaTeX wordt gebruikt wordt. Dit doe je met \NeedsTeXFormat{LaTeX2e}, omdat je waarschijnlijk geen versie van voor 1994 wilt gebruiken. Om de computer te vertellen welke klasse je eigenlijk aan het maken bent, zet je daaronder ProvidesClass{opgave}. Deze twee commando’s zijn al genoeg voor een \LaTeX-klasse, maar we hebben er nog niet zoveel aan. Dit kunnen we verbeteren door de functionaliteit van een andere klasse te importeren. Sommige inleveropgaven zijn zo lang, dat het lijkt alsof ik een heel artikel moet schrijven, dus laten we de \article-klasse laden met \LoadClass[a4paper, 11pt]{article}. We zijn nu klaar om onze eigen inleveropgaveklasse te hekken.

In de mathmode maakt \LaTeX alle letters cursief en haalt alle spaties weg. Dit is meestal wat je wilt, maar dit betekent ook dat de ‘d’ in een differentiaal ($\text{d}x$) wat hulp nodig heeft om een mooie rechte ‘d’ te worden. Dit kan vervelend zijn met een tekst met veel integralen. Dit kan sneller met een eenvoudig nieuw commando: \newcommand{\dd}{\textbackslash,\text{d}}. Iedere keer als er \dd in een wiskundeomgeving staat, wordt er een korte spatie geplaatst: \, en en rechte ‘d’: \text{d}.

Met \newcommand kunnen ook parameters worden toegevoegd. Om snel een gemiddelde of een verwachtingswaarde in de tekst te zetten kun je het volgende definiëren:

\newcommand{\mean}[1]{\ensuremath{\left< #1 \right>}}

Hierin geeft [1] het aantal inputvelden van het nieuwe commando aan. Dat wil zeggen het aantal keer dat we iets achter het commando tussen accolades kunnen zetten. #1 is de parameter van het eerste inputveld. Dat is in dit geval makkelijk, want er is er maar één. Zo wordt \mean{x}: ⟨x⟩. Als je een commando definieert, weet je niet zeker of de gebruiker in mathmode is. Daarom is \ensuremath handig voor het maken van eigen commando’s, omdat \ensuremath een wiskundeomgeving start vanuit een tekstomgeving en in de wiskundeomgeving blijft als het wordt aangeroepen vanuit een wiskundeomgeving.

Een voorbeeld van wat ik vaak in \LaTeX schrijf, zijn afgeleiden. Het vervelende aan afgeleiden is dat er steeds breuken moeten worden geschreven en superscripten voor de hogere afgeleiden. Ik wil een commando \afg maken, waarmee ik:

  • De differentiatieoperator $\tfrac{\partial}{\partial t}$ krijg, als ik één parameter invul: \afg{t}
  • De afgeleide $\tfrac{\partial f}{\partial x}$ krijg als ik twee parameters invul: \afg{f}{x}
  • De ne afgeleide kan instellen met een optionele parameter tussen blokhaken: \afg{f}{x}[2]

Dit commando is makkelijker te maken met \NewDocumentCommand dan met \newcommand, omdat ik mijn commando wil ‘overloaden’. Dat wil zeggen dat ik andere dingen wil doen afhankelijk van het aantal opgegeven parameters. \NewDocumentCommand is onderdeel van de xparse-package. De xparse-package maakt het mogelijk om commando’s te maken met \LaTeX\ 3 in \LaTeX\ 2. Packages in een .cls-bestand laad je met \RequirePackage. Op deze manier kun je ook de preamble een stuk korter maken door je standaardpackages op deze manier in te laden, omdat je deze packages ook kunt gebruiken in jouw inleveropgave. \NewDocumentCommand ziet er als volgt uit:

\NewDocumentCommand{\mijnCommando}{opties voor parameters}{body}

De body werkt net zoals in \newcommand, maar voor de parameters zijn andere opties dan in \newcommand. Met de laatste kan men alleen tussen blokhaken het aantal parameters aangeven dat in het nieuwe commando gebruikt wordt, maar in \NewDocumentCommand is het een verplicht veld. Hierin wordt op volgorde van parameters #1 t/m #n met een letter aangegeven of het een optionele of verplichte parameter is[1]:

  • m van ‘mandatory’: geeft een verplicht veld aan, dus tussen accolades.
  • o van ‘optional’: geeft een optioneel veld aan, dus tussen blokhaken.
  • g van ‘overloaded’: geeft een optioneel veld aan, maar tussen accolades.

Het gebruik van g maakt het de gebruiker duidelijker dat de output van het commando anders kan reageren op het gebruiken van dit commando. Je ziet bij mijn eisenlijst dat de betekenis van het eerste inputveld verandert bij het toevoegen van een tweede parameter. Eerst staat de eerste parameter #1 onder de deelstreep en na het toevoegen van een tweede parameter staat #1 boven de deelstreep:
\afg{t} wordt:   \tfrac{\partial}{\partial t}
en   \afg{f}{x} wordt:   \tfrac{\partial f}{\partial x}
Het definiëren van afg ziet er als volgt uit:

\NewDocumentCommand{\afg}{mgo}{body}

Het aanroepen wordt dan:

\afg{#1 mandatory}{#2 overloaded}[#3 optional]

Ik mis nu slechts nog één detail: \LaTeX weet nog niet wat te doen met al onze mooie parameters. In de body kunnen we gebruik maken van IfValueTF. Wat dit doet is eenvoudig:

\IfValueTF{#n}{voer uit als #n bestaat}{voer uit als #n niet bestaat}

Dit kunnen we gebruiken voor zowel onze ‘overloaded’ als voor onze optionele parameter gebruiken. Voor de liefhebbers staat hieronder het commando voor de partiële afgeleide.

\NewDocumentCommand{\afg}{mgo}{
    \ensuremath{
        \IfValueTF{#3}{
            \IfValueTF{#2}{
                \frac{\partial^{#3} #1}{\partial #2^{#3}}
                }
                {
                \frac{\partial^{#3}}{\partial #1^{#3}}
                }
        }
        {
            \IfValueTF{#2}{
                \frac{\partial #1}{\partial #2}
            }
            {
                \frac{\partial}{\partial #1}
            }
        }
    }
}

Met de hierboven beschreven methoden kun je al ver komen met een eigen klasse, maar het zou leuk zijn, als je de nieuwe klasse ook met parameters kunt aanroepen. Dit kun je doen met DeclareOption:

\DeclareOption{parameter}{voer uit als 'parameter' is gegeven}

Je kunt op deze manier ook booleans uit of aan zetten, zodat je in het hele document deze parameter kunt gebruiken. Een voorbeeld waarmee je dit misschien wil doen, is de taal van het document. Als deze klasse wordt aangeroepen met \documentclass[english]{opgave} wil je de optie ‘english’ meegeven aan babel, maar ook, als je een kop- of voettekst hebt gedefinieerd, ‘Aantal pagina’s’ veranderen in ‘Number of pages’. Booleans kun je maken met het ietwat vreemde \newif[2]. Een voorbeeld van \newif is:

\newif\ifengels\engelsfalse

\DeclareOption{english}{\engelstrue}

Dit maakt een boolean \ifengels aan. Door daarna \engelsfalse te gebruiken wordt deze op ‘false’ gezet. \newif\ifengels maakt namelijk zelf \engelsfalse en \engelstrue aan. \DeclareOption{\engelstrue} zet \ifengels alleen op ‘true’, als deze klasse wordt aangeroepen met \documentclass}[english]{opgave}. Deze boolean kunnen we vervolgens gebruiken in een if-blok dat de taaloptie in babel stopt. Dit if-blok wordt afgesloten met \fi.

\ifengels\RequirePackage[english]{babel}
\else\RequirePackage[dutch]{babel}
\fi

Om te controleren of alle pagina’s compleet zijn, kan het handig zijn om op de eerste pagina te zetten hoeveel pagina’s er in totaal zijn. Dit kan met de packages fancyhdr en lastpage. Omdat we dit ook af en toe niet willen, is het handig dit alleen te doen, als er een optie ‘totpag’ in de klassenaanroep is meegegeven. Voor een tweede optie in documentclass gaat dit op dezelfde manier als in het vorige voorbeeld:

\newif\iftotpag\totpagfalse
\DeclareOption{totpag}{\totpagtrue}

Als iftotpag ‘true’ is, wordt de header weergegeven. Dit kan misschien het beste door de ‘fancypagestyle‘ van \maketitle aan te passen. Als \maketitle wordt aangeroepen, gebruikt de titelpagina de \fancypagestyle{plain}. Door deze aan te passen, kunnen we een header krijgen rechtsboven op de titelpagina.

\iftotpag
\fancypagestyle{plain}{
    \ifengels
    \fancyhead[R]{Number of pages: \pageref{LastPage}}
    \else
    \fancyhead[R]{Aantal pagina's: \pageref{LastPage}} 
    \fi
}
\fi

Tot slot wil ik nog code geven om de overgebleven opties van de klassenaanroep aan de article}-klasse te geven:

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions

Dit zet je voor \LoadClass[a4paper,11pt]{article}.

Veel plezier met \TeX-en en een gezegend 2016.

\end{document}

[1]  Er zijn veel meer opties dan deze drie. Zie de documentatie van xparse op CTAN.
[2]  Meer TeX-commando’s, die ook worden gebruikt in de A–Eskwadraat-packages kun je vinden op https://en.wikibooks.org/wiki/LaTeX/Plain\_TeX