> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/nl/diepgaande-artikelen/06-an-introduction-to-kpathsea-and-how-tex-engines-search-for-files.md).

# Een introductie tot Kpathsea en hoe TeX-engines naar bestanden zoeken

## Inleiding

Dit artikel biedt een inleiding in hoe TeX-engines de bestanden vinden die nodig zijn om je document op te maken—met LaTeX of een ander macropakket. Hoewel Overleaf gebruikers ontlast van de uitdagingen van het beheren van een TeX-installatie ([TeX Live](https://www.tug.org/texlive/)), zullen de basisprincipes van hoe TeX-engines naar bestanden zoeken nuttig/interessant zijn als je een mappenstructuur wilt maken om je Overleaf-project beter te beheren.

Waarom zou dat waar kunnen zijn? Als je sommige van je Overleaf-projectbestanden in mappen opslaat, dan kan LaTeX die bestanden misschien niet vinden omdat de TeX-engine (compiler) standaard die bestanden mogelijk niet *weten* dat hij in die mappen moet zoeken—en de bestanden daarin dus niet zal vinden. Om dit te voorkomen kun je een configuratiebestand maken en aan je project toevoegen met de naam een [latexmkrc-bestand](https://mg.readthedocs.io/latexmk.html#configuration-files) dat kan worden gebruikt om een TeX-engine te vertellen dat je mappen bestaan en dat hij daarin moet zoeken.

Als je meteen een voorbeeld wilt zien met een latexmkrc-bestand, kun je dit helpartikel lezen: [Hoe gebruik je latexmkrc met Overleaf: voorbeelden en technieken](/latex/nl/diepgaande-artikelen/28-how-to-use-latexmkrc-with-overleaf.md). Het is misschien niet meteen duidelijk hoe, of waarom, dat latexmkrc-bestand eigenlijk werkt. Als je wilt weten waarom en misschien een beter begrip wilt ontwikkelen voor gebruik met verdere configuratiemogelijkheden voor je project, lees dan verder... Aan het einde van dit artikel werken we een [praktisch voorbeeld](#kpathsea-and-texinputs-latexmkrc-file-to-the-rescue)—met onze kennis van hoe TeX naar bestanden zoekt—om een latexmkrc-bestand te maken waarmee geneste mappen met je grafische bestanden worden beheerd.

## TeX en platformonafhankelijkheid

Toen Knuth TeX creëerde, was platformonafhankelijkheid een centraal principe dat het ontwerp en de implementatie stuurde, en die filosofie klinkt door in de interne werking van TeX (bijv. het gebruik van integer-rekenkunde, zelfgemaakte tekenreeksverwerking, geheugenbeheer, enz.). Zelfs vandaag nog roept de platformonafhankelijkheid van moderne TeX-gebaseerde engines vragen en discussie op openbare fora op; zie bijvoorbeeld deze discussie op tex.stackexchange: [Zijn XeTeX en LuaTeX platformafhankelijk?](https://tex.stackexchange.com/questions/94297/are-xetex-and-luatex-platform-dependent) waarin opmerkingen en observaties staan van een aantal bekende TeX-experts.

Voor nu laten we de fijnere details echter even terzijde en merken op dat TeX-engines nog steeds zeer portabel moeten zijn—in staat om op meerdere besturingssystemen te werken en “identieke” resultaten te produceren. Een belangrijk aspect van portabiliteit is het zoeken naar bestanden op een platformonafhankelijke manier.

## TeX-engines zoeken toch niet naar bestanden… echt niet!?

Nee, TeX-engines *rechtstreeks* zoeken niet naar bestanden *zelf*. Bij het verwerken van een `.tex` bestand kan een TeX-engine vaststellen dat er een bepaald bestand geopend moet worden, maar hij *delegeert* de taak om het te vinden aan een ander stukje software genaamd [*Kpathsea*](https://tug.org/kpathsea/): een externe softwarebibliotheek die geen deel uitmaakt van de *kern* van de broncode van TeX-engines. Wat Kpathsea in feite biedt, is een API ([Application Programming Interface](https://en.wikipedia.org/wiki/Application_programming_interface)) die TeX-engines (plus BibTeX, MetaPost en andere toepassingen) kunnen aanroepen telkens wanneer ze een bepaald bestand moeten openen: Kpathsea doet het daadwerkelijke werk van het lokaliseren van dat bestand.

Toen Knuth de oorspronkelijke TeX-engine schreef—waarvan uiteindelijk alle andere TeX-engines afstammen—was het probleem van bestanden vinden/openen een grote uitdaging, deels door het sterk uiteenlopende technologische ecosysteem van die tijd. In de broncode van TeX verwijst Knuth zelfs naar bestandsinvoer/-uitvoer als de “vloek van portabiliteit” (zie pagina 12, sectie 25 van [TeX: Het programma](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)).

De TeX-gemeenschap erkende de noodzaak om het zoeken naar bestanden voor TeX te harmoniseren (standaardiseren)—*en TeX-gerelateerde software*—en besloot TeX de tools te geven om dat te doen. Om het zeer lastige probleem van een platformonafhankelijke methode voor het vinden van bestanden aan te pakken, schreef Karl Berry, een vooraanstaand lid van de TeX-gemeenschap, de software om het *pad*-zoekprobleem op te lossen: een oplossing die hij noemde [**Kpathsea**](http://tug.org/texinfohtml/kpathsea.html)—wat is afgeleid van **K**arl’s **Path** **Sea**rching (zie dit [interview met Karl Berry](http://www.tug.org/interviews/berry.html)).

We kunnen opmerken dat het K**pad**sea heet en niet K**bestand**sea omdat, zoals de [documentatie](http://tug.org/texinfohtml/kpathsea.html) opmerkt, het een \*pad\*-zoekbibliotheek is. Het is belangrijk te beseffen dat Kpathsea niet alleen door TeX-engines wordt gebruikt; verschillende TeX-gerelateerde programma’s, waaronder BibTeX en MetaPost, gebruiken Kpathsea ook om naar invoerbestanden te zoeken.

Globaal genomen: wanneer TeX/LaTeX-macro’s een bepaald bestand moeten openen, worden de commando’s waaruit die macro’s zijn opgebouwd uiteindelijk omgezet in laag-niveau TeX-instructies (TeX-primitieven) die TeX-engines daadwerkelijk uitvoeren. Als die instructies het openen van een bestand vereisen, roept de TeX-engine Kpathsea aan met in feite: “zoek dit bestand alstublieft”; als die Kpathsea-zoekactie slaagt, wordt het bestand geopend. Als Kpathsea het bestand echter niet kan lokaliseren, dan wordt de TeX-engine daarvan op de hoogte gebracht en stopt de uitvoering om de beruchte fout te geven ``! Ik kan bestand `...` niet vinden`` De waarheid is dat Kpathsea het niet kan vinden.

### Opmerkingen over LuaTeX

Strikt genomen zouden we deze sectie moeten nuanceren door op te merken dat LuaTeX wel een mechanisme biedt waarmee de gebruiker eigen code voor het zoeken naar bestanden kan leveren via het gebruik van *callbacks*. LuaTeX stelt gebruikers in staat functies te schrijven in de Lua-scripttaal en deze bij LuaTeX te registreren, zodat LuaTeX die door de gebruiker gedefinieerde functie op bepaalde momenten tijdens de uitvoering van LuaTeX aanroept—vandaar de term *callbacks*callbacks. Het is een zeer krachtige techniek en de geïnteresseerde lezer kan meer informatie vinden in sectie 9 van [De LuaTeX-referentiehandleiding](http://www.pragma-ade.com/general/manuals/luatex.pdf) (op het moment van schrijven is die link voor LuaTeX 1.09).

### Het Kpathsea-configuratiebestand: texmf.cnf

Elke TeX-installatie bevat een tekstbestand genaamd `texmf.cnf` dat een configuratiebestand is dat door Kpathsea wordt gebruikt: het bevat talrijke “configuratievariabelen” die de paden definiëren die Kpathsea zal gebruiken om te zoeken naar verschillende soorten bestanden die TeX-engines (of BibTeX, MetaPost enz.) nodig kunnen hebben. Zoals we hieronder zullen zien, definiëren die “configuratievariabelen” zoekpaden die zijn opgebouwd uit zogenoemde *padelementen*: waarbij diverse constructies, variabelen en parameters worden gebruikt om elk padelement te definiëren als een “sjabloon” die Kpathsea verwerkt om de daadwerkelijke, fysieke mappen te genereren waarin gezocht moet worden.

Om een concreet voorbeeld te geven, hier is zo’n configuratievariabele die de zoekpaden voor OpenType-lettertypen definieert—maak je voorlopig geen zorgen over de betekenis van de opbouw van dit pad:

```
OPENTYPEFONTS = .;$TEXMF/fonts/{opentype,truetype}//;$OSFONTDIR//
```

Alles wat hier belangrijk is, is dat het bestand `texmf.cnf` (gelezen door Kpathsea) een configuratievariabele definieert met de naam `OPENTYPEFONTS` die wordt gebruikt om het/de pad(en) te definiëren die Kpathsea zal gebruiken om naar OpenType-lettertypen te zoeken. De rechterkant van het “=” ziet er niet uit als een pad dat je op een typisch apparaat ziet, omdat het is opgebouwd met diverse variabelen en parameters om elk pad te definiëren als een “sjabloon” of “blauwdruk” die Kpathsea zal gebruiken om echte mappen te genereren waarin gezocht moet worden.

### Kpathsea’s concept van een “pad”

Misschien is het centrale concept om te begrijpen Kpathsea’s notie van een “pad”: de basisconstructie die Kpathsea gebruikt om uit te zoeken waar een bepaald bestand zich bevindt. Zoals we zagen in het `OPENTYPEFONTS` voorbeeld hierboven, ziet Kpathsea’s notie van een pad er heel anders uit dan de paden die we gewend zijn te gebruiken op onze desktop- of draagbare apparaten.

Om Kpathsea zelf te citeren: [documentatie](http://tug.org/texinfohtml/kpathsea.html#Searching-overview):

> ... een *zoekpad* is een door dubbele punten gescheiden lijst van *padelementen*, die mapnamen zijn met een paar “extra snufjes”.

—maar let op dat ook een puntkomma (`;`) wordt gebruikt om *padelementen*. Later zullen we kort de aard van enkele van die “extra snufjes” aangeven.

In ons `OPENTYPEFONTS` voorbeeld zijn er drie padelementen, elk gescheiden met een puntkomma (`;`):

![Afbeelding die de padelementen toont die in een Kpathsea-paddefinitie zijn opgenomen](/files/b3297bd8d9533a766d537efab199463c10a96ec3)

1. `.` (wat de huidige map betekent)
2. `$TEXMF/fonts/{opentype,truetype}//`
3. `$OSFONTDIR//`

Let op dat een dubbele schuine streep (`//`) in een padelement betekent: zoek submappen (recursief).

Een typisch `texmf.cnf` bestand zal talrijke “configuratievariabelen” bevatten om zoekpaden te definiëren voor de bestandstypen waarvoor Kpathsea kan zoeken.

## Kpathsea: een zeer kort overzicht

Kpathsea is een geavanceerde bibliotheek—met veel fijne details en nuances—en zelfs een korte blik op zijn [documentatie](http://tug.org/texinfohtml/kpathsea.html) maakt duidelijk dat we niet in alle details kunnen duiken. We kunnen echter proberen een overzicht te geven van wat het doet—om je denken te oriënteren en een startpunt voor verdere lectuur te bieden.

### Kpathsea’s kerndoel

Zoals in de documentatie staat, is Kpathsea’s fundamentele doel “een bestandsnaam terug te geven uit een lijst van door de gebruiker opgegeven mappen” en dat die mappen (zoekpaden) worden opgegeven met “een paar extra snufjes”.

### Die “extra snufjes”

De hierboven genoemde “paar extra snufjes” omvatten diverse parameters en variabelen die Kpathsea gebruikt om zijn zoekpaden (of “padsjablonen”) samen te stellen, zodat het paden op een meer algemene manier kan definiëren. Wanneer een TeX-engine daadwerkelijk draait (uitvoert), kan Kpathsea de huidige waarde van die parameters/variabelen gebruiken om de daadwerkelijke paden te bepalen door die variabelen te vervangen door hun werkelijke waarden (tijdens runtime). Je kunt die variabelen (binnen padelementen) gemakkelijk herkennen omdat ze beginnen met een `$` teken.

Dus zeggen we dat Kpathsea *expandeert* een padelement, wat betekent dat het die parameters en variabelen omzet: een pad-“sjabloon” transformeren naar de daadwerkelijke naam/namen van een of meer fysieke mappen waarin naar een bestand gezocht moet worden. Dit biedt veel flexibiliteit en betekent dat Kpathsea een lijst van mappen kan samenstellen die overeenkomt met één enkel padelement—bijvoorbeeld als het wordt opgedragen submappen te doorzoeken.

### Ons OpenType-voorbeeld opnieuw bekeken

We zullen de verschillende draden samenbrengen en `OPENTYPEFONTS` wat nader bekijken:

```
OPENTYPEFONTS = .;$TEXMF/fonts/{opentype,truetype}//;$OSFONTDIR//
```

Laten we de twee padelementen bekijken `$TEXMF/fonts/{opentype,truetype}//` en `$OSFONTDIR//`. Hier merkt Kpathsea het gebruik van accolades op `{...}` en behandelt `$TEXMF/fonts/{opentype,truetype}` als representatie van *twee* padelementen:

1. `$TEXMF/fonts/opentype//`
2. `$TEXMF/fonts/truetype//`

en dat de *submappen* van beide padelementen ook doorzocht moeten worden (aangeduid door de afsluitende `//`).

**Opmerking**: Zie de Kpathsea-documentatie over [expansie van submappen](http://tug.org/texinfohtml/kpathsea.html#Subdirectory-expansion) voor een belangrijke kanttekening over de volgorde waarin submappen op elk niveau worden doorzocht (die is niet gespecificeerd).

We zullen een paar opmerkingen maken over `$TEXMF` hieronder bekijken.

#### $OSFONTDIR//

`$OSFONTDIR` is een variabele waarvan de waarde moet worden gedefinieerd als een omgevingsvariabele die de locatie bevat waar lettertypen zijn opgeslagen: de exacte waarde hangt uiteraard af van het besturingssysteem dat wordt gebruikt om TeX uit te voeren. Let op: hier geeft de afsluitende `//` Kpathsea opdracht om submappen te doorzoeken bij het zoeken naar OpenType-lettertypen.

De standaarddefinitie van `OSFONTDIR` binnen `texmf.cnf` is:

```
OSFONTDIR = /please/set/osfontdir/in/the/environment
```

Dus het is zeker iets dat je moet instellen als je het wilt gebruiken—je omgevingsvariabele zal deze “plaatshouder”-definitie in `texmf.cnf`.

Als je de omgevingsvariabele `OSFONTDIR` dan instelt, zal Kpathsea tijdens runtime, overal waar het `$OSFONTDIR` ziet als onderdeel van een padelement (in `texmf.cnf`) de variabele `$OSFONTDIR` vervangen door de werkelijke waarde die is opgeslagen in de omgevingsvariabele `OSFONTDIR`. Onthoud dat wanneer je het binnen `texmf.cnf` padelementen gebruikt, we de variabele `$OSFONTDIR`—met een voorloop `$`—opgeven om Kpathsea te vertellen dat dit een variabele is waarvan het *waarde* moet gebruiken.

#### Korte opmerkingen over $TEXMF

`TEXMF` is een andere configuratievariabele die is gedefinieerd in `texmf.cnf`; in de hoofdversie van TeX Live zou je bijvoorbeeld zien:

```
TEXMF = {$TEXMFAUXTREES$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFLOCAL,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFDIST}
```

Je hoeft je niet bezig te houden met de details van deze definitie van `TEXMF`—we zullen niet alle details verkennen, maar merken alleen op dat de `$TEXMF` variabele binnen padelementen wordt gebruikt omdat deze een reeks mapniveaus definieert (ook wel “texmf trees” genoemd) van waaruit je met het zoeken naar bestanden kunt beginnen.

`TEXMF` is uiterst nuttig als je een TeX-installatie wilt, of moet, opsplitsen over meerdere mappen (of map-“trees”). Bijvoorbeeld: een hoofd- of mastercollectie van TeX/LaTeX-pakketten (bijv. TeX Live) en een andere verzameling bestanden en mappen die worden gebruikt om lokale LaTeX-pakketten op te slaan—of misschien om lokale configuratiebestanden of aangepaste versies van standaardpakketten op te slaan. Door de TeX-installatie op deze manier op te splitsen, kan het eenvoudiger worden om het upgraden van de hoofd-/mastercollectie (distributie) van TeX/LaTeX-pakketten te beheren, omdat je lokale collectie gescheiden is van de masterbestanden die worden bijgewerkt wanneer je je TeX Live-distributie/-installatie upgradet.

Voor verdere details over het beheren van complexere TeX-installaties wordt de geïnteresseerde lezer verwezen naar deze twee artikelen:

* [Meerdere TDS-trees beheren](http://tug.org/TUGboat/Articles/tb22-3/tb72downes.pdf) door Michael J Downes;
* [Jongleren met texmf-trees](http://www.ntg.nl/maps/27/17.pdf) door Siep Kroonenberg.

#### TeX Directory Structure

Iedereen die een TeX-installatie heeft beheerd weet dat moderne TeX-systemen, zoals TeX Live, tienduizenden bestanden bevatten met een enorme verscheidenheid aan bestandstypen. De TeX Directory Structure (TDS) is ontworpen als een best-practice “blauwdruk” voor het organiseren van de enorme verzameling bestanden in een werkende TeX-installatie en wordt sterk aanbevolen voor gebruik met Kpathsea.

Voor verdere informatie wordt de lezer verwezen naar de TDS-specificatie: [A Directory Structure for TeX Files](https://www.tug.org/tds/tds.pdf).

## Kpathsea-bestandstypen

De reeks toepassingen die Kpathsea gebruiken, moet toegang hebben tot een breed scala aan bestandstypen, dus Kpathsea gebruikt een “configuratievariabele” om het/de pad(en) voor elk type bestand (of groep bestanden) dat het ondersteunt te identificeren. De online documentatie heeft een volledige lijst (zie ook onze [samenvattingstabel hieronder](#table-listing-kpathsea-config-variables)) maar hier zijn de “configuratievariabelen” voor de meest voorkomende bestandstypen:

|                           |                                                  |
| ------------------------- | ------------------------------------------------ |
| **Configuratievariabele** | **Voorbeelden van bestandstypen**                |
| TEXINPUTS                 | TeX-bronbestanden en figuur-/grafische bestanden |
| BIBINPUTS, BSTINPUTS      | Bronbestanden voor BibTeX-bibliografieën         |
| TTFONTS                   | TrueType-outline-lettertypen                     |
| OPENTYPEFONTS             | OpenType-outline-lettertypen                     |

`TEXINPUTS` is een bijzonder belangrijke configuratievariabele omdat deze aangeeft waar een TeX-engine zijn invoerbronbestanden vandaan haalt. Merk op dat afbeeldingsbestanden worden beschouwd als invoerbestanden en ook kunnen worden gezocht met het pad gedefinieerd door `TEXINPUTS`.

### Enkele Kpathsea-finesses

Zoals opgemerkt heeft Kpathsea veel nuances die we hier niet in detail kunnen verkennen. Hier zijn echter functies die sommige lezers misschien willen onderzoeken:

* **bestandsnaamdatabase:** Om schijfdoorzoekingen te minimaliseren kan Kpathsea gebruikmaken van een “extern opgebouwde [bestandsnaamdatabase met de naam ls-R](http://tug.org/texinfohtml/kpathsea.html#Filename-database) die bestanden aan mappen koppelt”. TeX Live levert er een en de hulpmiddelen om die bij te werken als er nieuwe bestanden worden toegevoegd.
* **omgevingsvariabelen**: Naast “configuratievariabelen” (zoals `OPENTYPEFONTS`) maakt Kpathsea ook slim gebruik van [omgevingsvariabelen](https://en.wikipedia.org/wiki/Environment_variable)omgevingsvariabelen; bijvoorbeeld: de runtime-waarde van omgevingsvariabelen kan worden gebruikt om padelementen in het `texmf.cnf` bestand te definiëren (mogelijk om variabelen met dezelfde naam te overschrijven die zijn gedefinieerd in `texmf.cnf`).
* **programmanaam:** Een subtiel maar essentieel aspect van Kpathsea’s gedrag is dat het gebruik kan maken van de naam van het uitvoerbare programma (bijv. de TeX-engine) om programspecifieke zoekpadconstructies samen te stellen. Dat geeft aanzienlijke flexibiliteit omdat het zoeken naar paden kan worden gericht op bestanden voor een specifieke TeX-engine. Bijvoorbeeld voor LuaTeX/LuaLaTeX:

  ```
  TEXINPUTS.lualatex = .;$TEXMF/tex/{lualatex,latex,luatex,generic,}//
  TEXINPUTS.luatex = .;$TEXMF/tex/{luatex,plain,generic,}//
  ```
* **vinden `texmf.cnf`**: Een vraag die je je misschien stelt is hoe Kpathsea weet waar `texmf.cnf` is opgeslagen? Het antwoord is een omgevingsvariabele genaamd `TEXMFCNF`. Deze moet worden ingesteld (op het apparaat/platform waarop TeX draait) op het pad waar `texmf.cnf` is opgeslagen.

#### Kpathsea-problemen debuggen

Gebruikers van Overleaf hebben deze faciliteiten waarschijnlijk niet nodig, maar we vermelden ze voor de volledigheid:

* **kpsewhich**: Een zelfstandig programma (meegeleverd met TeX Live) dat kan worden gebruikt om je instellingen te testen: de waarde van variabelen bepalen en bestanden vinden. Geïnteresseerde lezers worden verwezen naar de [online documentatie](http://tug.org/texinfohtml/kpathsea.html#Invoking-kpsewhich) voor meer informatie.
* **omgevingsvariabelen**: Kpathsea ondersteunt een omgevingsvariabele genaamd [`KPATHSEA_DEBUG`](http://www.tug.org/texinfohtml/kpathsea.html#Debugging) om te helpen bij het debuggen van zijn gedrag. Je kunt `KPATHSEA_DEBUG` op verschillende waarden instellen, afhankelijk van hoeveel debug-informatie je nodig hebt. Instellen van `KPATHSEA_DEBUG=-1` zal een *aanzienlijke* hoeveelheid gegevens genereren.

## En ten slotte: mappen, figuurbestanden en latexmkrc

Dus, hoe verhoudt het bovenstaande zich tot latexmkrc? Als je dit artikel leest [Hoe gebruik je latexmkrc met Overleaf: voorbeelden en technieken](/latex/nl/diepgaande-artikelen/28-how-to-use-latexmkrc-with-overleaf.md) kun je zien dat de (Perl-)code in het latexmkrc-voorbeeld de waarde van een omgevingsvariabele instelt `TEXINPUTS`:

```
$ENV{'TEXINPUTS'}='./tex//:' . $ENV{'TEXINPUTS'};
```

Merk op dat de dubbele punt (:) die hier wordt gebruikt (`./tex//**:**`) *extreem* belangrijk is. Als je die dubbele punt weglaat, kan TeX/LaTeX mogelijk essentiële systeembestanden, zoals LaTeX-pakketten, niet vinden!

Wat dit latexmkrc-bestand in feite doet, is een pad naar een topmap (`./tex` in het bovenstaande voorbeeld) toevoegen aan de door het systeem gedefinieerde `TEXINPUTS` omgevingsvariabele zodat wanneer Kpathsea de variabele gebruikt `$TEXINPUTS` het dan weet dat de map `/tex//` moet worden doorzocht om invoerbestanden te vinden. Als je goed kijkt, zie je dat het daadwerkelijke gebruikte pad `./tex//:` het `//` zegt Kpathsea om de tex-map recursief te doorzoeken—d.w\.z. kijk in alle submappen die in de `tex` map zitten. Zoals opgemerkt hebben we ook het belangrijke dubbelepuntteken toegevoegd.

We kunnen exact dezelfde techniek gebruiken voor figuurbestanden.

### Een terzijde over BibTeX

Zoals opgemerkt gebruikt het BibTeX-programma ook Kpathsea om naar zijn invoerbestanden te zoeken; in het bijzonder:

* het `BSTINPUTS` configuratievariabele (zoekpad) wordt gebruikt om te zoeken naar `.bst` bestanden;
* en de `BIBINPUTS` configuratievariabele (zoekpad) zal worden gebruikt om te zoeken naar `.bib` bestanden.

Als je nieuwe `.bst` of `.bib` bestanden toevoegt aan je Overleaf-project kun je de onderstaande techniek gebruiken om BibTeX te laten weten waar deze bestanden te vinden zijn—je moet `TEXINPUTS` meestal `BSTINPUTS` en/of `BIBINPUTS`.

### TEXINPUTS en het gebruik van geneste mappen voor grafische bestanden

Als je project veel grafische bestanden heeft, kan het handig zijn om een reeks mappen te maken waarin je ze opslaat en beheert. De volgende schermafbeelding toont bijvoorbeeld een deel van een Overleaf-project dat een topmap gebruikt met de naam **`graphics`**:

![Afbeelding van geneste mappen in een Overleaf-project](/files/96ddd8ac7ddd1bb96dddaa218bf413b2de67a00e)

Er zijn talloze (geneste) submappen met grafische bestanden voor verschillende delen van ons document.

Stel dat we de bovenstaande mappenstructuur hebben en de `graphicx` pakket (`\usepackage{graphicx}`) en dat we proberen dat zo te doen:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% best practice is om de bestandsextensie niet te gebruiken
\end{document}
```

Het zal niet werken en je krijgt een fout zoals deze:

```
! LaTeX-fout: Bestand `endlinechar' niet gevonden.
l.4 \includegraphics{endlinechar}
Ik kon het bestand met geen van deze extensies lokaliseren:
.pdf,.PDF,.ai,.AI,.png,.PNG,.jpg,.JPG,.jpeg,.JPEG,.jp2,.JP2,.jpf,.JPF,.bmp,.BMP,
,.ps,.PS,.eps,.EPS,.mps,.MPS,.pz,.eps.Z,.ps.Z,.ps.gz,.eps.gz
```

Die fout ontstaat omdat ons grafische bestand is opgeslagen op een locatie die TeX/LaTeX (en Kpathsea) niet kent, en het dus niet kan vinden—het pad naar het grafische bestand is:

```
./graphics/Introduction/Chapter1/Section1/Subsection3/endlinechar.png
```

**Opmerking**: Het wordt algemeen als best practice beschouwd om ***spaties in de mapnamen te vermijden***. Hoewel het zeker mogelijk is om spaties in mapnamen te hebben, zelfs met de hieronder besproken technieken, raden we dit af vanwege de portabiliteit van het document buiten het Overleaf-platform.

Zoals uitgelegd in dit [Overleaf-helpartikel](/latex/nl/meer-onderwerpen/27-inserting-images.md) kun je natuurlijk mappen gebruiken om je grafische bestanden op te slaan, maar je moet LaTeX wel vertellen waar ze zijn opgeslagen. Hier bekijken we twee oplossingen:

* De opdracht \graphicspath gebruiken;
* Onze kennis van Kpathsea gebruiken en `TEXINPUTS`.

### \graphicspath gebruiken

De `graphicx` pakket biedt de `\graphicspath` opdracht die je kunt gebruiken om paden te declareren waar je grafische bestanden zich bevinden; dus we kunnen zoiets doen als dit:

```latex
\graphicspath{{./graphics/Introduction/Chapter1/Section1/Subsection3/}}
```

en LaTeX zal nu alle grafische bestanden vinden die onder dat pad zijn opgeslagen.

**Opmerking**: Als je *moeten* spaties in mapnamen hebt, moet je de paden tussen dubbele aanhalingstekens zetten (`"..."`):

```latex
\graphicspath{{"./graphics/Introduction/Chapter 1/Section 1/Subsection 3/"}}
```

**Opmerking**: Je kunt meerdere paden als volgt declareren:

```latex
\graphicspath{{pad1}{pad2}{pad3}...{padN}}
```

waar `...` betekent extra paden tussen accolades.

**Opmerking**: We beginnen het pad met `./graphics` en niet alleen met `/graphics`. De punt (.) vertelt het besturingssysteem dat het pad relatief is ten opzichte van de huidige werkmap.

De `\graphicspath` opdracht werkt goed, maar als je veel mappen hebt, kan het behoorlijk omslachtig worden om elk pad toe te voegen; bovendien zouden paden die via `\graphicspath` zijn gedefinieerd niet meer werken als je de mappen een andere naam geeft of ze opnieuw structureert. Is er een eenvoudigere manier? Ja, je kunt een latexmkrc-bestand gebruiken!

#### \graphicspath en recursie (submappen)

Merk op dat er online discussies/debatten zijn over de vraag of sommige systemen `\graphicspath` ondersteunen om submappen recursief te doorzoeken als je `//` aan het einde van het pad toevoegt: zie bijvoorbeeld deze discussies op tex.stackexchange:

* [LaTeX \graphicspath recursief zoeken](https://tex.stackexchange.com/questions/25443/latex-graphicspath-recursive-search);
* [Graphicspath voor MikTeX](https://tex.stackexchange.com/questions/3131/graphicspath-for-miktex).

Voor de grootste compatibiliteit moet je aannemen dat `\graphicspath` geen recursief doorzoeken van mappen ondersteunt.

### Kpathsea en TEXINPUTS (latexmkrc-bestand als redding)

**LET OP:** Merk op dat de volgende techniek goed werkt op Overleaf en op passend geconfigureerde lokale TeX-installaties; **maar** als je een latexmkrc-bestand gebruikt, kan je project incompatibel worden met andere TeX-installaties, zoals die gebruikt door uitgevers en online indieningssystemen voor tijdschriften. Externe TeX-installaties ondersteunen of staan het gebruik van latexmkrc mogelijk wel of niet toe. Als je je Overleaf-project ergens anders voor wilt exporteren, of het wilt indienen bij een tijdschrift, moet je alle spaties uit de padnamen verwijderen en, voor betere compatibiliteit, een `\graphicspath` opdracht toevoegen die alle paden definieert:

```latex
\graphicspath{{pad1}{pad2}{pad3}...{padN}}
```

waar `...` betekent extra paden tussen accolades.

De hieronder besproken techniek (met `TEXINPUTS`) is met succes getest op Overleaf met de engines pdfTeX, XeTeX en LuaTeX (d.w\.z. de compileropties pdfLaTeX, XeLaTeX en LuaLaTeX in het Overleaf-menu):

![Afbeelding van hoe je de LaTeX-compiler op Overleaf kiest](/files/b20c6421a09c2588181ae5bfacd671146fc035cc)

Terug naar ons voorbeeld: we willen deze code gebruiken (met diep geneste mappen) en we gebruiken een latexmkrc-bestand om dat te bereiken:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% best practice is om de bestandsextensie niet te gebruiken
\end{document}
```

Hier is een screenshot waarop bovenstaande code zonder problemen werkt: LaTeX heeft ons grafische bestand gevonden (`endlinechar.png`) ook al zit het in een diep geneste mappenstructuur (zonder spaties in de mapnamen).

![Afbeelding van een project met geneste mappen dat compileert op Overleaf](/files/9c9a73fddd8ce1e4bc0a723bd3e97eb61a743f7f)

Dus, hoe hebben we dit gedaan? Alles wat je hoeft te doen is:

* maak een nieuw bestand, zonder extensie, en noem het latexmkrc;
* voeg de volgende regel toe aan dat bestand:

  ```
  $ENV{'TEXINPUTS'}='./graphics//:'.$ENV{'TEXINPUTS'};
  ```

Kpathsea weet nu van de mappen die zich onder `**graphics**` bevinden en vanwege de `//` het zal ook in de submappen kijken.

Let er nogmaals op dat de dubbele punt in `./graphics//:` is eigenlijk *extreem* belangrijk is. Als je die dubbele punt weglaat, kan TeX/LaTeX mogelijk essentiële systeembestanden, zoals LaTeX-pakketten, niet vinden!

Met het eenvoudige projectvoorbeeld hierboven kun je het nu compileren en voilà! LaTeX vindt je grafisch bestand — en je kunt de mappen onder /graphics hernoemen of opnieuw ordenen zonder dat dit LaTeX ervan weerhoudt ze te vinden.

## Tabel met Kpathsea “configuratievariabelen”

De volgende tabel is een samenvatting afgeleid van [de gegevens vermeld in de Kpathsea-documentatie](http://tug.org/texinfohtml/kpathsea.html#Supported-file-formats).

|                                                     |                                                                              |                                |
| --------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------ |
| **Kpathsea-configuratievariabele**                  | **Beschrijving van het bestandstype**                                        | **Bestandsextensie**           |
| AFMFONTS                                            | Adobe-lettertype-metriek                                                     | .afm                           |
| MFBASES, TEXMFINI                                   | Geheugendump van Metafont                                                    | .base                          |
| BIBINPUTS, TEXBIB                                   | BibTeX-bron voor bibliografie                                                | .bib                           |
| BLTXMLINPUTS                                        | BibLaTeXML-bibliografiebestanden voor Biber                                  | .bltxml                        |
| BSTINPUTS                                           | BibTeX-stijl                                                                 | .bst                           |
| CLUAINPUTS                                          | dynamische bibliotheken voor Lua                                             | .dll en .so                    |
| CMAPFONTS                                           | karakterkaartbestanden                                                       | .cmap                          |
| TEXMFCNF                                            | Configuratiebestanden tijdens uitvoering                                     | .cnf                           |
| CWEBINPUTS                                          | CWEB-invoerbestanden                                                         | .w, .web, .ch                  |
| TEXCONFIG                                           | Dvips-'config.\*'-bestanden, zoals config.ps                                 |                                |
| ENCFONTS                                            | coderingsvectoren                                                            | .enc                           |
| TEXFORMATS, TEXMFINI                                | Geheugendump van TeX                                                         | .fmt                           |
| FONTCIDMAPS                                         | CJK-mapping                                                                  | .cid                           |
| FONTFEATURES                                        | voornamelijk voor OpenType-lettertypefuncties                                | .fea                           |
| FONTS, GFFONTS, GLYPHFONTS, TEXFONTS                | generieke lettertypebitmap                                                   | .gf                            |
| TEXPICTS, TEXINPUTS                                 | Ingesloten PostScript-figuren                                                | .eps, .epsi                    |
| TEXINDEXSTYLE, INDEXSTYLE                           | stijlbestanden voor makeindex                                                | .ist                           |
| LIGFONTS                                            | ligatuurdefinitiebestanden                                                   | .lig                           |
| TEXMFDBS                                            | Bestandsnaardatabases                                                        |                                |
| TEXFONTMAPS                                         | Fontmaps                                                                     | .map                           |
| MPMEMS, TEXMFINI                                    | Geheugendump van MetaPost                                                    | .mem                           |
| MPSUPPORT                                           | MetaPost-ondersteuningsbestanden, gebruikt door DMP                          |                                |
| MFINPUTS                                            | Metafont-bron                                                                | .mf                            |
| MFPOOL, TEXMFINI                                    | Programmastrings van Metafont                                                | .pool                          |
| MFTINPUTS                                           | MFT-stijlbestand                                                             | .mft                           |
| MISCFONTS                                           | lettertypegerelateerde bestanden die niet in de andere categorieën passen    |                                |
| MLBIBINPUTS, BIBINPUTS, TEXBIB                      | MlBibTeX-bibliografiebron                                                    | .mlbib, .mlbib                 |
| MLBSTINPUTS, BSTINPUTS                              | MlBibTeX-stijl                                                               | .mlbst, .bst                   |
| MPINPUTS                                            | MetaPost-bron                                                                | .mp                            |
| MPPOOL, TEXMFINI                                    | Programmastrings van MetaPost                                                | .pool                          |
| OCPINPUTS                                           | Gecompileerde procesbestanden van Omega                                      | .ocp                           |
| OFMFONTS, TEXFONTS                                  | Omega-lettertype-metriek                                                     | .ofm, .tfm                     |
| OPENTYPEFONTS                                       | OpenType-lettertypen                                                         |                                |
| OPLFONTS, TEXFONTS                                  | Omega-eigenschapslijsten                                                     | .opl                           |
| OTPINPUTS                                           | Procesbestanden voor Omega-vertaling                                         | .otp                           |
| OVFFONTS, TEXFONTS                                  | Virtuele Omega-lettertypen                                                   | .ovf                           |
| OVPFONTS, TEXFONTS                                  | Virtuele Omega-eigenschapslijsten                                            | .ovp                           |
| PDFTEXCONFIG                                        | PDFTeX-specifieke configuratiebestanden                                      |                                |
| PROGRAMFONTS, PKFONTS, TEXPKS, GLYPHFONTS, TEXFONTS | samengepakte bitmap-lettertypen                                              | .pk                            |
| TEXPSHEADERS, PSHEADERS                             | downloadbare PostScript                                                      | .pro                           |
| RISINPUTS                                           | RIS-bibliografiebestanden, voornamelijk voor Bibe                            | .ris                           |
| SFDFONTS                                            | subfontdefinitiebestanden                                                    | .sfd                           |
| TEXINPUTS                                           | TeX-bron                                                                     | .tex                           |
| TEXDOCS                                             | Documentatiebestanden voor het TeX-systeem                                   |                                |
| TEXSOURCES                                          | Bronbestanden voor het TeX-systeem                                           |                                |
| TEXMFSCRIPTS                                        | Architectuuronafhankelijke uitvoerbare bestanden verspreid in de texmf-bomen |                                |
| TEXPOOL, TEXMFINI                                   | Programmastrings van TeX                                                     | .pool                          |
| TFMFONTS, TEXFONTS                                  | TeX-lettertype-metriek                                                       | .tfm                           |
| TRFONTS                                             | Troff-lettertypen                                                            |                                |
| TTFONTS                                             | TrueType-outline-lettertypen                                                 | .ttf, ,TTF, .ttc, .TTC, .dfont |
| T1FONTS, T1INPUTS, TEXPSHEADERS, DVIPSHEADERS       | Type 1 PostScript-contourlettertypen                                         | .pfa, .pfb                     |
| T42FONTS                                            | Type 42 PostScript-contourlettertypen                                        |                                |
| VFFONTS, TEXFONTS                                   | virtuele lettertypen                                                         | .vf                            |
| WEBINPUTS                                           | WEB-invoerbestanden                                                          | .web, .ch                      |
| WEB2C                                               | bestanden specifiek voor de web2c-implementatie                              |                                |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/nl/diepgaande-artikelen/06-an-introduction-to-kpathsea-and-how-tex-engines-search-for-files.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
