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

# Hur kompilerar Overleaf mitt projekt?

## Automatisering av LaTeX-kompilering

För att stödja funktioner som innehållsförteckning, figurlistor, korsreferenser, ordlistor, index och bibliografiska hänvisningar använder LaTeX en flerstegs sättningsprocess: data som produceras i ett steg (kompilering) skrivs ut till fil(er) och används som indata för eventuella efterföljande steg som kan krävas. Följande video visar vad som händer varje gång du klickar på knappen “Recompile” i ditt Overleaf-projekt:

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

När man gör manuell kompilering är det vanligtvis tydligt om ytterligare en LaTeX-körning (steg) krävs, men automatisering av LaTeX-kompilering innebär en rad svårigheter. En viktig utmaning för automatiserade lösningar är att avgöra *hur många* LaTeX-steg (kompileringar) som behövs för att lösa eventuella datadependenser och därigenom säkerställa att det slutliga satta dokumentet är uppdaterat och komplett. En annan svårighet är att korrekt identifiera de externa program som måste köras för att förbehandla delar av dokumentets innehåll—till exempel att köra BibTeX/BibLaTeX för att skapa referenslistor eller att köra mer specialiserade grafikprogram såsom [MetaPost](https://tug.org/metapost.html) eller [Asymptote](https://asymptote.sourceforge.io/).

## Introduktion till latexmk

Ett väletablerat paket för att automatisera kompilering är [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), ett stort Perl-skript som ingår i TeX Live och används av Overleaf för att kompilera dina LaTeX-projekt. `latexmk` triggar automatiskt det antal LaTeX-körningar som krävs och kör de externa (hjälp-)program som behövs för att bearbeta delar av ditt dokuments innehåll.

### Anpassa latexmk

Även om `latexmk` är extremt mångsidigt, gör olika LaTeX-kompileringsmiljöer och det enorma spektrumet av dokumenttyper det opraktiskt för `latexmk` att försöka tillhandahålla automatiserade lösningar som fullt ut stöder behoven hos varje tänkbart LaTeX-dokument. I stället kan beteendet hos `latexmk` anpassas via konfigurationsfiler *implementerade i **Perl***:

* en konfigurationsfil för “hela systemet” som tar hänsyn till den specifika datormiljön/plattformen, och
* en konfigurationsfil på användarnivå som hanterar dokumentspecifika krav

Den [`latexmk-manualen`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) innehåller mer information om installation och användning av konfigurationsfiler.

## Overleafs LatexMk-fil

Overleafs konfigurationsfil för “hela systemet” följer `latexmk` konventionerna (för Linux): den heter `**LatexMk**` och finns i mappen `/usr/local/share/latexmk/`. **Obs**: den filen läses *innan* före några konfigurationsfiler på användarnivå.

Konfigurationsfiler på användarnivå måste ha namnet `latexmkrc` och läggas till i ditt Overleaf-projekt för att tillhandahålla anpassade regler som hanterar de specifika kraven för ditt Overleaf LaTeX-projekt/dokument.

Overleafs `LatexMk` fil innehåller kod för Overleaf-specifik bearbetning plus regler för ordlistor, nomenklatur och andra vanligt förekommande paket. Overleafs `LatexMk` fil kan visa vissa variationer mellan utgåvor av TeX Live för att anpassa sig till ändringar och uppdateringar som görs i paket och programvaruverktyg inom själva TeX Live.

### Ändra LaTeX:s kompileringsläge

Som standard instruerar Overleaf latexmk att använda ett kompileringsläge som vi (Overleaf) kallar **Försök att kompilera trots fel**. I det kompileringsläget stannar inte LaTeX-kompilatorn, trots att den stöter på [LaTeX-kompileringsfel](/latex/sv/latex-grunder/05-errors.md); en PDF kan produceras, även om den innehåller felaktig utdata. Ofta kan kompileringsfel vara för allvarliga, eller för många, för att LaTeX-kompilatorn ska kunna rätta dem, så den kan ändå “avbryta” utan att producera en PDF.

Du kan ändra LaTeX:s kompileringsläge så att kompileringen stannar omedelbart när det första felet påträffas: se hjälpartikeln [Använd kompileringsläget Stop on First Error](/latex/sv/kunskapsbas/149-using-the-stop-on-first-error-compilation-mode.md) för mer information.

### Hur man får tillgång till en kopia av Overleafs LatexMk-fil

Följande länk öppnar ett projekt för att sätta Overleafs `LatexMk` fil som används med ditt projekts LaTeX-kompilator och TeX Live-version och gör den också tillgänglig för nedladdning:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Om detta projekt}
Det här projektet ger tillgång till systemets initieringsfil (konfigurationsfil) \texttt{LatexMk} som används av Overleaf.  \texttt{LatexMk} är ett Perl-skript som kan variera något beroende på \TeX{} Live-versionen och den kompilator som valts för projektet. Om du behöver vara 100\% säker på vilken \texttt{LatexMk} som används, lägg till kod från det här projektet i ditt projekt och kompilera för att sätta en listning av \texttt{LatexMk} och göra den tillgänglig för nedladdning som en av utdatafilerna.
\section*{Listning av filen \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Öppna den här 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)

Efter att ha kompilerat projektet ovan kan `LatexMk` filen laddas ner via **Loggar och utdatafiler** knappen som visas i följande korta videoklipp:

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

### Övriga noter och råd

Om du vill ställa in, eller kontrollera, den TeX Live-version som används för att kompilera ditt projekt, se detta [Overleaf-blogginlägg](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) eller följande grafik:

![Välja Overleafs TeX Live-version](/files/7ff222f45f1e7e23cac464a291d3b2b2992dd288)

Om du vill bygga ditt Overleaf-projekt offline med latexmk, kan du vilja använda en kopia av Overleafs LatexMk-fil för att säkerställa att den tillämpar Overleafs byggprocess—observera att Overleafs jobbnamn är satt till output.

Overleaf kompilerar projekt med latexmks `-cd` kommandoradsflagga, och kompileringen körs alltid från projektets rotkatalog. Observera att vissa `latexmk` alternativ inte är kompatibla med Overleaf—i synnerhet om du sätter `$preview_continuous_mode` eller `$output_dir` alternativen kan det förstöra förhandsvisningen i Overleaf.

För mer information om `latexmkrc` filer som läses, läs artikeln [Hur man använder latexmkrc med Overleaf](/latex/sv/fordjupade-artiklar/28-how-to-use-latexmkrc-with-overleaf.md) som har användbara tips och tricks från våra vänliga Overleaf TeXpert-experter.

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

För enkelhets skull visar följande listning Overleafs `LatexMk` fil som används med TeX Live 2023—använd länken ovan för att komma åt den senaste versionen.

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

# Lösning för att tillåta pstricks-transparens (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Efterbehandling av pdf-fil #
###############################

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

# motsvarar -gt-alternativet. Används för att hindra latexmk från att hoppa över omkompilering
# av output.log och output.pdf
$go_mode = 3;

# motsvarar -bibtex-alternativet. Kör bibtex ovillkorligen när bbl-filer
# är inaktuella.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # hämta åldern på befintlig pdf om den finns
    $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;

    # Leta efter en concordance-fil från knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        Patcherar synctex-filen för knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Avsluta tidigt om pdf-filen inte finns eller inte uppdaterades
    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;

    # Ta reda på var qpdf finns
    $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 avslutningskod=$qpdf_exit_code\n";

    # Ersätt utdatafilen om qpdf lyckades
    # qpdf returnerar 0 för lyckat resultat, 3 för varningar (utdata-PDF skapades ändå)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Byter namn på optimerad fil till $output_file\n";
    rename($optimised_file, $output_file);

    print "Extraherar xref-tabell för $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 avslutningskod=$qpdf_xref_exit_code\n";
}

##############
# Ordlistor #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # från 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  #  # från 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;

    # identifiera huvudfilen
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # ändra katalog inom ett begränsat omfång
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # kör chktex på huvudfilen
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # gå tillbaka till den ursprungliga katalogen
        chdir($orig_dir);

        # i läget VALIDATE avslutar vi alltid efter att ha kört chktex
        # annars avslutar vi om EXIT_ON_ERROR är satt

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex låter oss inte komma åt felinformationen via avslutningskoden
            # så vi letar igenom utdata
            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/sv/kunskapsbas/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.
