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

# Hvordan kompilerer Overleaf mit projekt?

## Automatisering af LaTeX-kompilering

For at understøtte funktioner som indholdsfortegnelse, figurlister, krydsreferencer, ordlister, indeksering og bibliografiske henvisninger bruger LaTeX en flerpasset satsningsproces: data, der produceres i én gennemkørsel (kompilering), skrives til fil(er) og bruges som input til eventuelle efterfølgende gennemkørsel(er), der måtte være nødvendige. Følgende video viser, hvad der sker, hver gang du klikker på knappen “Recompile” i dit Overleaf-projekt:

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

Når man udfører manuel kompilering, er det som regel tydeligt, om endnu en LaTeX-kørsel (gennemgang) er nødvendig, men automatisering af LaTeX-kompilering indebærer en række vanskeligheder. En central udfordring for automatiserede løsninger er at afgøre *hvor mange* LaTeX-gennemkørsler (kompileringer) der er nødvendige for at løse eventuelle dataafhængigheder og dermed sikre, at det endelige satsede dokument er opdateret og fuldstændigt. En anden kompleksitet er korrekt at identificere de eksterne programmer, som skal eksekveres for at forbehandle dele af dokumentindholdet — såsom at køre BibTeX/BibLaTeX for at producere referencelister eller at udføre mere specialiserede grafikprogrammer som [MetaPost](https://tug.org/metapost.html) eller [Asymptote](https://asymptote.sourceforge.io/).

## Introduktion til latexmk

Et veletableret værktøj til automatisering af kompilering er [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), et stort Perl-script, der er inkluderet i TeX Live og bruges af Overleaf til at kompilere dine LaTeX-projekter. `latexmk` udløser automatisk det nødvendige antal LaTeX-kørsler og eksekverer de eksterne (hjælpe)programmer, der kræves for at behandle dele af dit dokuments indhold.

### Tilpasning af latexmk

Selvom `latexmk` er ekstremt alsidigt, gør forskellige LaTeX-kompileringsmiljøer og det enorme udvalg af dokumenttyper det upraktisk for `latexmk` at forsøge at levere automatiserede løsninger, som fuldt ud understøtter behovene i ethvert tænkeligt LaTeX-dokument. I stedet kan adfærden for `latexmk` kan tilpasses via konfigurationsfiler *implementeret i **Perl***:

* en “systemomfattende” konfigurationsfil, som tager højde for det specifikke computer-/platformsmiljø, og
* en konfigurationsfil på brugerniveau, som håndterer documentspecifikke krav

Den [`latexmk-manualen`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) giver flere detaljer om installation og brug af konfigurationsfiler.

## Overleafs LatexMk-fil

Overleafs “systemomfattende” konfigurationsfil følger `latexmk` konventionerne (for Linux): den hedder `**LatexMk**` og er placeret i mappen `/usr/local/share/latexmk/`. **Bemærk**: den fil læses *før* før eventuelle konfigurationsfiler på brugerniveau.

Konfigurationsfiler på brugerniveau skal hedde `latexmkrc` og tilføjes til dit Overleaf-projekt for at levere brugerdefinerede regler, der opfylder de specifikke krav til dit Overleaf LaTeX-projekt/-dokument.

Overleafs `LatexMk` fil indeholder kode til Overleaf-specifik behandling plus regler for glossarer, nomenklatur og andre ofte anvendte pakker. Overleafs `LatexMk` fil kan variere en smule mellem udgivelser af TeX Live for at afspejle ændringer og opdateringer i pakker og softwareværktøjer i selve TeX Live.

### Ændring af LaTeX-kompileringstilstand

Som standard instruerer Overleaf latexmk i at bruge en kompileringstilstand, som vi (Overleaf) omtaler som **Forsøg at kompilere på trods af fejl**. I den kompileringstilstand stopper LaTeX-kompileren ikke, selvom den støder på [LaTeX-kompileringsfejl](/latex/da/latex-grundlaeggende/05-errors.md); der kan blive produceret en PDF, selv hvis den indeholder forkert output. Ofte kan kompilationsfejl være for alvorlige eller talrige til, at LaTeX-kompileren kan rette dem, så den kan stadig “trække sig” uden at producere en PDF.

Du kan ændre LaTeX-kompileringstilstanden, så kompileringen stopper med det samme ved den første fejl: se hjælpeartiklen [Brug af kompileringstilstanden Stop ved første fejl](/latex/da/vidensbase/149-using-the-stop-on-first-error-compilation-mode.md) for yderligere information.

### Sådan får du adgang til en kopi af Overleafs LatexMk-fil

Følgende link åbner et projekt til typografisk opsætning af Overleafs `LatexMk` fil, der bruges sammen med dit projekts LaTeX-kompiler og TeX Live-version, og gør den også tilgængelig til download:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Om dette projekt}
Dette projekt giver adgang til systemets \texttt{LatexMk}-initialiseringsfil (konfigurationsfil), som bruges af Overleaf.  \texttt{LatexMk} er et Perl-script, som kan variere en smule afhængigt af den \TeX{} Live-version og den kompilator, der er valgt til projektet. Hvis du vil være 100\% sikker på, hvilken  \texttt{LatexMk} der bruges, kan du tilføje kode fra dette projekt til dit eget projekt og kompilere for at sætte en oplistning af \texttt{LatexMk} i sats og gøre den tilgængelig til download som en af outputfilerne.
\section*{Oplistning af \texttt{LatexMk}-filen}
\verbatiminput{./LatexMk}
\end{document}
```

[Åbn denne kode i 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)

Efter kompilering af projektet ovenfor kan `LatexMk` filen downloades via **Log- og outputfiler** knappen som vist i følgende korte videoklip:

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

### Andre noter og råd

Hvis du ønsker at indstille eller kontrollere den TeX Live-version, der bruges til at kompilere dit projekt, henvises du til dette [Overleaf-blogindlæg](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) eller følgende grafik:

![Valg af Overleafs TeX Live-version](/files/4e8ff922ae72ed6e5b9476879cd6b7d6e0315c5d)

Hvis du vil bygge dit Overleaf-projekt offline ved hjælp af latexmk, kan du overveje at bruge en kopi af Overleafs LatexMk-fil for at sikre, at den anvender Overleafs byggeproces — bemærk, at Overleafs jobnavn er sat til output.

Overleaf kompilerer projekter ved hjælp af latexmks `-cd` kommandolinjeflag, og kompileringen køres altid fra projektets rodmappe. Bemærk, at nogle `latexmk` indstillinger ikke er kompatible med Overleaf — især hvis du angiver `$preview_continuous_mode` eller `$output_dir` indstillingerne, kan det ødelægge forhåndsvisningen på Overleaf.

For mere information om `latexmkrc` filer, læs artiklen [Sådan bruger du latexmkrc med Overleaf](/latex/da/dybtgaende-artikler/28-how-to-use-latexmkrc-with-overleaf.md) som indeholder nyttige tips og tricks fra vores venlige Overleaf TeXperts.

## En oplistning af Overleafs LatexMk-fil (2023)

For nemheds skyld viser følgende oplistning Overleafs `LatexMk` fil, som den bruges med TeX Live 2023 — brug linket ovenfor for at få adgang til den nyeste version.

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

# Omgåelse for at tillade pstricks-gennemsigtighed (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Efterbehandling af PDF-fil #
###############################

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

# svarer til -gt-indstillingen. Bruges til at forhindre latexmk i at springe genkompilering over
# af output.log og output.pdf
$go_mode = 3;

# svarer til -bibtex-indstillingen. Kør bibtex ubetinget, når bbl-filerne er
# forældede.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # få alderen på den eksisterende PDF, hvis den findes
    $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;

    # Kig efter en knitr-konkordansfil
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        Retter synctex-filen til knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Returnér tidligt, hvis PDF-filen ikke findes eller ikke blev opdateret
    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;

    # Find ud af, hvor qpdf er
    $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});

    # Kør qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "qpdf-slutkode=$qpdf_exit_code\n";

    # Erstat outputfilen, hvis qpdf lykkedes
    # qpdf returnerer 0 ved succes, 3 ved advarsler (output-PDF'en oprettes stadig)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Omdøber den optimerede fil til $output_file\n";
    rename($optimised_file, $output_file);

    print "Udtrækker xref-tabellen for $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-slutkode=$qpdf_xref_exit_code\n";
}

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

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

################
# nomenklatur #
################
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: Could not find figure file (.*); continuing.$');
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  #  # fra 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;

    # identificér hovedfilen
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # skift bibliotek i et begrænset omfang
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # kør chktex på hovedfilen
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # gå tilbage til det oprindelige bibliotek
        chdir($orig_dir);

        # i VALIDATE-tilstand afslutter vi altid efter at have kørt chktex
        # ellers afslutter vi, hvis EXIT_ON_ERROR er sat

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex giver os ikke adgang til fejlinformationen via afslutningskoden
            # så gennemse outputtet
            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/da/vidensbase/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.
