> 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/kennisbank/064-how-does-overleaf-compile-my-project.md).

# Hoe compileert Overleaf mijn project?

## LaTeX-compilatie automatiseren

Om functies zoals inhoudsopgave, lijsten van figuren, kruisverwijzingen, glossaria, indexering en bibliografische citaten te ondersteunen, gebruikt LaTeX een meerfasig zetproces: gegevens die in een fase (compilatie) worden geproduceerd, worden weggeschreven naar bestand(en) en gebruikt als invoer voor eventuele daaropvolgende fase(n) die nodig kunnen zijn. De volgende video laat zien wat er gebeurt telkens wanneer je op de knop “Opnieuw compileren” in je Overleaf-project klikt:

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/Uo3I2FXEI8H6aFPBZq171/e2139f9575a4db6955dc2278dc08283c/latexmk-ol.mp4>" %}

Wanneer je handmatig compileert, is het meestal duidelijk of er nog een extra LaTeX-uitvoering (fase) nodig is, maar het automatiseren van LaTeX-compilatie brengt een aantal moeilijkheden met zich mee. Een belangrijke uitdaging voor geautomatiseerde oplossingen is te bepalen *hoeveel* LaTeX-fasen (compilaties) nodig zijn om eventuele gegevenafhankelijkheden op te lossen, zodat het uiteindelijke opgemaakte document actueel en volledig is. Een andere complicatie is het correct identificeren van de externe programma’s die moeten worden uitgevoerd om delen van de documentinhoud voor te bewerken—zoals het uitvoeren van BibTeX/BibLaTeX om referentielijsten te maken of het uitvoeren van meer gespecialiseerde grafische toepassingen zoals [MetaPost](https://tug.org/metapost.html) of [Asymptote](https://asymptote.sourceforge.io/).

## Introductie van latexmk

Een goed ingeburgerd pakket voor het automatiseren van compilatie is [`latexmk`](https://ctan.org/pkg/latexmk?lang=en)een groot Perl-script dat is opgenomen in TeX Live en door Overleaf wordt gebruikt om je LaTeX-projecten te compileren. `latexmk` start automatisch het vereiste aantal LaTeX-uitvoeringen en voert de externe (hulp)programma’s uit die nodig zijn om onderdelen van de inhoud van je document te verwerken.

### latexmk aanpassen

Hoewel `latexmk` extreem veelzijdig is, maken verschillende LaTeX-compilatieomgevingen en de enorme verscheidenheid aan documenttypen het onpraktisch voor `latexmk` om te proberen geautomatiseerde oplossingen te bieden die volledig voldoen aan de behoeften van elk denkbaar LaTeX-document. In plaats daarvan kan het gedrag van `latexmk` worden aangepast via configuratiebestanden *geïmplementeerd in **Perl***:

* een configuratiebestand op “systeemniveau” dat voorziet in de specifieke computeromgeving/-platform, en
* een configuratiebestand op gebruikersniveau dat document-specifieke vereisten afhandelt

De [`latexmk-handleiding`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) geeft meer details over het installeren en gebruiken van configuratiebestanden.

## Overleafs LatexMk-bestand

Overleafs configuratiebestand op “systeemniveau” volgt `latexmk` conventies (voor Linux): het heet `**LatexMk**` en bevindt zich in de map `/usr/local/share/latexmk/`. **Opmerking**: dat bestand wordt eerst gelezen *voordat* configuratiebestanden op gebruikersniveau.

Configuratiebestanden op gebruikersniveau moeten worden genoemd `latexmkrc` en aan je Overleaf-project worden toegevoegd om aangepaste regels te bieden die inspelen op de specifieke vereisten van je Overleaf LaTeX-project/document.

Overleafs `LatexMk` bestand bevat code voor Overleaf-specifieke verwerking plus regels voor glossaria, nomenclatuur en andere veelgebruikte pakketten. Overleafs `LatexMk` bestand kan per release van TeX Live enigszins verschillen om rekening te houden met wijzigingen en updates in pakketten en softwaretools binnen TeX Live zelf.

### De compilatiemodus van LaTeX wijzigen

Standaard instrueert Overleaf latexmk om een compilatiemodus te gebruiken die wij (Overleaf) aanduiden als **Probeer te compileren ondanks fouten**. In die compilatiemodus stopt de LaTeX-compiler niet, zelfs niet wanneer hij [LaTeX-compilatiefouten](/latex/nl/latex-basis/05-errors.md)tegenkomt; er kan een pdf worden gemaakt, zelfs als die onjuiste uitvoer bevat. Vaak kunnen compilatiefouten te ernstig of te talrijk zijn voor de LaTeX-compiler om ze op te lossen, dus kan hij nog steeds “afbreken” zonder een pdf te produceren.

Je kunt de LaTeX-compilatiemodus wijzigen zodat de compilatie onmiddellijk stopt zodra de eerste fout wordt aangetroffen: zie het helpartikel [De compilatiemodus Stop bij eerste fout gebruiken](/latex/nl/kennisbank/149-using-the-stop-on-first-error-compilation-mode.md) voor meer informatie.

### Hoe je een kopie van Overleafs LatexMk-bestand kunt openen

De volgende link opent een project om het Overleaf `LatexMk` bestand dat wordt gebruikt met de LaTeX-compiler en TeX Live-versie van je project en maakt het ook beschikbaar om te downloaden:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Over dit project}
Dit project geeft toegang tot het systeem \texttt{LatexMk}-initialisatie(configuratie)bestand dat door Overleaf wordt gebruikt.  \texttt{LatexMk} is een Perl-script dat licht kan variëren afhankelijk van de \TeX{} Live-versie en de compiler die voor het project is gekozen. Als je 100\% zeker wilt weten welke  \texttt{LatexMk} wordt gebruikt, voeg dan code uit dit project toe aan je project en compileer om een listing van \texttt{LatexMk} op te maken en deze beschikbaar te maken als een van de uitvoerbestanden.
\section*{Listing van het \texttt{LatexMk}-bestand}
\verbatiminput{./LatexMk}
\end{document}
```

[Open deze code in Overleaf.](https://www.overleaf.com/docs?engine=\&snip_name=Display+Overleaf+latexmkrc+file\&snip=%5Cdocumentclass%5Ba4paper%5D%7Barticle%7D%0A%5Cusepackage%5Bmargin%3D1cm%5D%7Bgeometry%7D%0A%5Cusepackage%7Bverbatim%2Cshellesc%7D%0A%5CShellEscape%7Bcp+%2Fusr%2Flocal%2Fshare%2Flatexmk%2FLatexMk+.%2FLatexMk%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csection%2A%7BAbout+this+project%7D%0AThis+project+provides+access+to+the+system+%5Ctexttt%7BLatexMk%7D+initialization+%28configuration%29+file+used+by+Overleaf.++%5Ctexttt%7BLatexMk%7D+is+a+Perl+script+which+may+vary+slightly+according+to+the+%5CTeX%7B%7D+Live+version+and+compiler+chosen+for+the+project.+If+you+need+to+be+100%5C%25+certain+which++%5Ctexttt%7BLatexMk%7D+is+being+used%2C+add+code+from+this+project+to+your+project+and+compile+to+typeset+a+listing+of+%5Ctexttt%7BLatexMk%7D+and+make+it+available+for+download+as+one+of+the+output+files.%0A%5Csection%2A%7BListing+the+%5Ctexttt%7BLatexMk%7D+file%7D%0A%5Cverbatiminput%7B.%2FLatexMk%7D%0A%5Cend%7Bdocument%7D)

Na het compileren van het bovenstaande project kan het `LatexMk` bestand worden gedownload via de **Logboeken en uitvoerbestanden** knop, zoals getoond in het volgende korte videofragment:

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/1re6AeMUF2EQnlZ8Cse5ke/ae6ee91fa7e2b2efa8ffb27ad8bab1a0/latexmkrc.mp4>" %}

### Andere opmerkingen en advies

Als je de TeX Live-versie wilt instellen of controleren die wordt gebruikt om je project te compileren, raadpleeg dan deze [Overleaf-blogbericht](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) of de volgende afbeelding:

![De TeX Live-versie van Overleaf kiezen](/files/2b69d64d1ca4eda3f0e157beec5a40a358a12b9e)

Als je je Overleaf-project offline met latexmk wilt bouwen, kun je een kopie van Overleafs LatexMk-bestand gebruiken om ervoor te zorgen dat het Overleafs bouwproces toepast—let op: de jobnaam van Overleaf staat ingesteld op output.

Overleaf compileert projecten met latexmk's `-cd` opdrachtregeloptie, en de compilatie wordt altijd uitgevoerd vanuit de hoofdmap van het project. Let op dat sommige `latexmk` opties niet compatibel zijn met Overleaf—met name als je de `$preview_continuous_mode` of `$output_dir` opties instelt, kan dat de preview op Overleaf verstoren.

Voor meer informatie over `latexmkrc` bestanden lees je het artikel [Hoe je latexmkrc gebruikt met Overleaf](/latex/nl/diepgaande-artikelen/28-how-to-use-latexmkrc-with-overleaf.md) met handige tips en trucs van onze vriendelijke Overleaf TeXperts.

## Een listing van Overleafs LatexMk-bestand (2023)

Ter wille van het gemak toont de volgende listing Overleafs `LatexMk` bestand zoals gebruikt met TeX Live 2023—gebruik de bovenstaande link om toegang te krijgen tot de meest recente versie.

```perl
# Instellingen
$xdvipdfmx = "xdvipdfmx -z 6 -i dvipdfmx-unsafe.cfg -o %D %O %S";

# Oplossing om pstricks-transparantie toe te staan (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Nabewerking van pdf-bestand #
###############################

$compiling_cmd = "internal overleaf_pre_process %T %D";
$success_cmd = "internal overleaf_post_process %T %D";
$failure_cmd = $success_cmd;

# gelijk aan de -gt-optie. Wordt gebruikt om te voorkomen dat latexmk hercompilatie overslaat
# van output.log en output.pdf
$go_mode = 3;

# gelijk aan de -bibtex-optie. Voer bibtex onvoorwaardelijk uit wanneer bbl-bestanden
# verouderd zijn.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

sub overleaf_pre_process {
    my $source_file = $_[0];
    my $output_file = $_[1];

    # bepaal de leeftijd van de bestaande pdf indien aanwezig
    $ORIG_PDF_AGE = -M $output_file
}

sub overleaf_post_process {
    my $source_file = $_[0];
    my $output_file = $_[1];
    my $source_without_ext = $source_file =~ s/\.tex$//r;
    my $output_without_ext = $output_file =~ s/\.pdf$//r;

    # Zoek naar een knitr-concordancebestand
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Synctex-bestand patchen voor knitr...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Geef vroegtijdig terug als het pdf-bestand niet bestaat of niet is bijgewerkt
    my $NEW_PDF_AGE = -M $output_file;
    return if !defined($NEW_PDF_AGE);
    return if defined($ORIG_PDF_AGE) && $NEW_PDF_AGE == $ORIG_PDF_AGE;

    # Bepaal waar qpdf staat
    $qpdf //= "/usr/bin/qpdf";
    $qpdf = $ENV{QPDF} if defined($ENV{QPDF}) && -x $ENV{QPDF};
    return if ! -x $qpdf;
    $qpdf_opts //= "--linearize --newline-before-endstream";
    $qpdf_opts = $ENV{QPDF_OPTS} if defined($ENV{QPDF_OPTS});

    # Voer qpdf uit
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "qpdf exit code=$qpdf_exit_code\n";

    # Vervang het uitvoerbestand als qpdf succesvol was
    # qpdf geeft 0 terug bij succes, 3 bij waarschuwingen (uitvoer-pdf wordt nog steeds aangemaakt)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Geoptimaliseerd bestand hernoemen naar $output_file\n";
    rename($optimised_file, $output_file);

    print "xref-tabel extraheren voor $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "qpdf --show-xref exit code=$qpdf_xref_exit_code\n";
}

##############
# Woordenlijsten #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # van Overleaf v1
sub glo2gls {
    system("makeglossaries $_[0]");
}

#############
# makeindex #
#############
@ist = glob("*.ist");
if (scalar(@ist) > 0) {
    $makeindex = "makeindex -s $ist[0] %O -o %D %S";
}

################
# nomenclatuur #
################
add_cus_dep("nlo", "nls", 0, "nlo2nls");
sub nlo2nls {
        system("makeindex $_[0].nlo -s nomencl.ist -o $_[0].nls -t $_[0].nlg");
}

#########
# Knitr #
#########
add_cus_dep( 'Rtex', 'tex', 0, 'do_knitr');
add_cus_dep( 'Rnw', 'tex', 0, 'do_knitr');
sub do_knitr {
    Run_subst(qq{Rscript -e '
        library("knitr");
        opts_knit\$set(concordance=T);
        knitr::knit(%S, output=%D);
        '}
    );
}

##########
# feynmf #
##########
push(@file_not_found, '^feynmf: Files .* and (.*) not found:$');
add_cus_dep("mf", "tfm", 0, "mf_to_tfm");
sub mf_to_tfm { system("mf '\\mode:=laserjet; input $_[0]'"); }

push(@file_not_found, '^feynmf: Label file (.*) not found:$');
add_cus_dep("mf", "t1", 0, "mf_to_label1");
sub mf_to_label1 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t1"); }
add_cus_dep("mf", "t2", 0, "mf_to_label2");
sub mf_to_label2 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t2"); }
add_cus_dep("mf", "t3", 0, "mf_to_label3");
sub mf_to_label3 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t3"); }
add_cus_dep("mf", "t4", 0, "mf_to_label4");
sub mf_to_label4 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t4"); }
add_cus_dep("mf", "t5", 0, "mf_to_label5");
sub mf_to_label5 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t5"); }
add_cus_dep("mf", "t6", 0, "mf_to_label6");
sub mf_to_label6 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t6"); }
add_cus_dep("mf", "t7", 0, "mf_to_label7");
sub mf_to_label7 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t7"); }
add_cus_dep("mf", "t8", 0, "mf_to_label8");
sub mf_to_label8 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t8"); }
add_cus_dep("mf", "t9", 0, "mf_to_label9");
sub mf_to_label9 { system("mf '\\mode:=laserjet; input $_[0]' && touch $_[0].t9"); }

##########
# feynmp #
##########
push(@file_not_found, '^dvipdf: Kon figuurbestand (.*) niet vinden; doorgaan.$');
add_cus_dep("mp", "1", 0, "mp_to_eps");
sub mp_to_eps {
    system("mpost $_[0]");
    return 0;
}

#############
# asymptote #
#############

sub asy {return system("asy \"$_[0]\"");}
add_cus_dep("asy","eps",0,"asy");
add_cus_dep("asy","pdf",0,"asy");
add_cus_dep("asy","tex",0,"asy");

#############
# metapost  #  # van Overleaf v1
#############
add_cus_dep('mp', '1', 0, 'mpost');
sub mpost {
    my $file = $_[0];
    my ($name, $path) = fileparse($file);
    pushd($path);
    my $return = system "mpost $name";
    popd();
    return $return;
}

##########
# chktex #
##########
unlink 'output.chktex' if -f 'output.chktex';
if (defined $ENV{'CHKTEX_OPTIONS'}) {
    use File::Basename;
    use Cwd;

    # identificeer het hoofdbestand
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # wijzig de map voor een beperkte scope
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # voer chktex uit op het hoofdbestand
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # ga terug naar de oorspronkelijke map
        chdir($orig_dir);

        # in VALIDATE-modus sluiten we altijd af na het uitvoeren van chktex
        # anders sluiten we af als EXIT_ON_ERROR is ingesteld

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex laat ons geen toegang krijgen tot foutinformatie via de exitstatus
            # dus kijk door de uitvoer
            open(my $fh, "<", "output.chktex");
            my $errors = 0;
            {
                local $/ = "\n";
                while(<$fh>) {
                    if (/^\S+:\d+:\d+: Error:/) {
                        $errors++;
                        print;
                    }
                }
            }
            close($fh);
            exit(1) if $errors > 0;
            exit(0) if $ENV{'CHKTEX_VALIDATE'};
        }
    }
}
```


---

# 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/kennisbank/064-how-does-overleaf-compile-my-project.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.
