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

# Hvordan kompilerer Overleaf prosjektet mitt?

## Automatisering av LaTeX-kompilering

For å støtte funksjoner som innholdsfortegnelse, figurlister, kryssreferanser, glossarer, indeksering og bibliografiske siteringer, bruker LaTeX en typesettingsprosess med flere gjennomganger: data som produseres i én gjennomgang (kompilering) skrives ut til fil(er) og brukes som inndata for eventuelle påfølgende gjennomganger som måtte være nødvendige. Den følgende videoen viser hva som skjer hver gang du klikker på «Rekompiler»-knappen i Overleaf-prosjektet ditt:

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

Når man utfører manuell kompilering, er det vanligvis tydelig hvis en ny LaTeX-kjøring (gjennomgang) er nødvendig, men automatisering av LaTeX-kompilering medfører en rekke vanskeligheter. En nøkkelutfordring for automatiserte løsninger er å bestemme *hvor mange* LaTeX-gjennomganger (kompileringer) som trengs for å løse eventuelle datavhengigheter, og dermed sikre at det ferdige typesatte dokumentet er oppdatert og komplett. En annen kompleksitet er å identifisere korrekt de eksterne programmene som må kjøres for å forbehandle deler av dokumentinnholdet—slik som å kjøre BibTeX/BibLaTeX for å produsere referanselister eller å kjøre mer spesialiserte grafikkapplikasjoner som [MetaPost](https://tug.org/metapost.html) eller [Asymptote](https://asymptote.sourceforge.io/).

## Introduksjon til latexmk

En veletablert pakke for å automatisere kompilering er [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), et stort Perl-skript som følger med i TeX Live og som brukes av Overleaf til å kompilere LaTeX-prosjektene dine. `latexmk` utløser automatisk det nødvendige antallet LaTeX-kjøringer og kjører de eksterne (hjelpe-)programmene som kreves for å behandle deler av dokumentinnholdet ditt.

### Tilpasning av latexmk

Selv om `latexmk` er ekstremt allsidig, gjør ulike LaTeX-kompileringsmiljøer og det enorme spekteret av dokumenttyper det upraktisk for `latexmk` å forsøke å levere automatiserte løsninger som fullt ut støtter behovene til hvert tenkelig LaTeX-dokument. I stedet kan oppførselen til `latexmk` tilpasses via konfigurasjonsfiler *implementert i **Perl***:

* en konfigurasjonsfil på «systemnivå» som ivaretar det spesifikke datamiljøet/plattformen, og
* en konfigurasjonsfil på brukernivå som håndterer dokumentspesifikke krav

Den [`latexmk-manualen`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) gir flere detaljer om installasjon og bruk av konfigurasjonsfiler.

## Overleafs LatexMk-fil

Overleafs konfigurasjonsfil på «systemnivå» følger `latexmk` konvensjonene (for Linux): den heter `**LatexMk**` og ligger i mappen `/usr/local/share/latexmk/`. **Merk**: den filen leses *før* før eventuelle konfigurasjonsfiler på brukernivå.

Konfigurasjonsfiler på brukernivå må ha navnet `latexmkrc` og legges til Overleaf-prosjektet ditt for å gi egne regler som adresserer de spesifikke kravene til Overleaf LaTeX-prosjektet/-dokumentet ditt.

Overleafs `LatexMk` fil inneholder kode for Overleaf-spesifikk behandling pluss regler for glossarer, nomenklatur og andre ofte brukte pakker. Overleafs `LatexMk` fil kan vise noe variasjon mellom utgivelser av TeX Live for å tilpasse endringer og oppdateringer som er gjort i pakker og programvareverktøy i selve TeX Live.

### Endring av LaTeXs kompileringsmodus

Som standard instruerer Overleaf latexmk til å bruke en kompileringsmodus som vi (Overleaf) omtaler som **Prøv å kompilere til tross for feil**. I denne kompileringsmodusen stopper ikke LaTeX-kompilatoren, til tross for at den støter på [LaTeX-kompileringsfeil](/latex/no/grunnleggende-latex/05-errors.md); en PDF kan bli produsert, selv om den inneholder feilaktig utdata. Ofte kan kompileringsfeil være for alvorlige, eller for mange, til at LaTeX-kompilatoren klarer å rette dem, så den kan fortsatt «avbryte» uten å produsere en PDF.

Du kan endre kompileringsmodusen for LaTeX slik at kompileringen stopper umiddelbart når den første feilen oppstår: se hjelpeartikkelen [Bruke kompileringsmodusen Stopp ved første feil](/latex/no/kunnskapsbase/149-using-the-stop-on-first-error-compilation-mode.md) for mer informasjon.

### Hvordan få tilgang til en kopi av Overleafs LatexMk-fil

Følgende lenke åpner et prosjekt for å typesette Overleaf `LatexMk` filen som brukes med prosjektets LaTeX-kompilator og TeX Live-versjon, og gjør den også tilgjengelig for nedlasting:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Om dette prosjektet}
Dette prosjektet gir tilgang til systemets \texttt{LatexMk}-initialiseringsfil (konfigurasjonsfil) som brukes av Overleaf.  \texttt{LatexMk} er et Perl-skript som kan variere litt avhengig av \TeX{} Live-versjonen og kompilatoren som er valgt for prosjektet. Hvis du vil være 100\% sikker på hvilken \texttt{LatexMk} som brukes, kan du legge til kode fra dette prosjektet i prosjektet ditt og kompilere for å typesette en liste over \texttt{LatexMk} og gjøre den tilgjengelig for nedlasting som en av utdatafilene.
\section*{Listing av \texttt{LatexMk}-filen}
\verbatiminput{./LatexMk}
\end{document}
```

[Åpne denne koden 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)

Etter å ha kompilert prosjektet ovenfor, kan `LatexMk` filen lastes ned via **Logg og utdatafiler** -knappen, som vist i følgende korte videoklipp:

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

### Andre merknader og råd

Hvis du vil angi, eller kontrollere, hvilken TeX Live-versjon som brukes til å kompilere prosjektet ditt, se denne [Overleaf-blogginnlegget](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) eller den følgende illustrasjonen:

![Velge Overleaf TeX Live-versjon](/files/96c38dd0d073f347e94b23306b9df0ddce8a63fb)

Hvis du vil bygge Overleaf-prosjektet ditt frakoblet ved hjelp av latexmk, kan det være lurt å bruke en kopi av Overleafs LatexMk-fil for å sikre at den bruker Overleafs byggeprosess—merk at Overleafs jobbn navn er satt til output.

Overleaf kompilerer prosjekter ved hjelp av latexmks `-cd` kommandolinjeflagg, og kompileringen kjøres alltid fra prosjektets rotkatalog. Merk at noen `latexmk` alternativer er ikke kompatible med Overleaf—særlig hvis du setter `$preview_continuous_mode` eller `$output_dir` alternativene, kan det ødelegge forhåndsvisningen i Overleaf.

For mer informasjon om `latexmkrc` filer, les artikkelen [Slik bruker du latexmkrc med Overleaf](/latex/no/dybdeartikler/28-how-to-use-latexmkrc-with-overleaf.md) som har nyttige tips og triks fra våre vennlige Overleaf TeXperter.

## En listing av Overleafs LatexMk-fil (2023)

For enkelhets skyld viser den følgende listen Overleafs `LatexMk` fil slik den brukes med TeX Live 2023—bruk lenken ovenfor for å få tilgang til den nyeste versjonen.

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

# Løsning som tillater pstricks-transparens (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Etterbehandling av pdf-fil #
###############################

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

# tilsvarer -gt-alternativet. Brukes for å hindre at latexmk hopper over rekompilering
# av output.log og output.pdf
$go_mode = 3;

# tilsvarer -bibtex-alternativet. Kjør bibtex ubetinget når bbl-filer er
# utdatert.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # hent alder på eksisterende pdf hvis den finnes
    $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;

    # Se etter en knitr-concordance-fil
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        Patcher synctex-filen for knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Gå tilbake tidlig hvis pdf-filen ikke finnes eller ikke ble oppdatert
    my $NEW_PDF_AGE = -M $output_file;
    returner hvis ikke definert($NEW_PDF_AGE);
    returner hvis definert($ORIG_PDF_AGE) && $NEW_PDF_AGE == $ORIG_PDF_AGE;

    # Finn ut hvor qpdf er
    $qpdf //= "/usr/bin/qpdf";
    $qpdf = $ENV{QPDF} if defined($ENV{QPDF}) && -x $ENV{QPDF};
    returner hvis ! -x $qpdf;
    $qpdf_opts //= "--linearize --newline-before-endstream";
    $qpdf_opts = $ENV{QPDF_OPTS} if defined($ENV{QPDF_OPTS});

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

    # Erstatt utdatafilen hvis qpdf var vellykket
    # qpdf returnerer 0 ved suksess, 3 ved advarsler (utdata-pdf ble fortsatt opprettet)
    returner hvis ikke($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Gir nytt navn til optimalisert fil til $output_file\n";
    rename($optimised_file, $output_file);

    print "Henter ut xref-tabell 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 avslutningskode=$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;

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

    if ($file =~ /\.tex$/) {
        # bytt katalog for et begrenset område
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # kjør chktex på hovedfilen
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # gå tilbake til den opprinnelige katalogen
        chdir($orig_dir);

        # i VALIDATE-modus avslutter vi alltid etter å ha kjørt chktex
        # ellers avslutter vi hvis EXIT_ON_ERROR er satt

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex lar oss ikke få tilgang til feilinformasjonen via avslutningsstatus
            # så vi ser gjennom utdataene
            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/no/kunnskapsbase/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.
