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

# Wie kompiliert Overleaf mein Projekt?

## Automatisierung der LaTeX-Kompilierung

Zur Unterstützung von Funktionen wie Inhaltsverzeichnissen, Abbildungsverzeichnissen, Querverweisen, Glossaren, Indizes und bibliografischen Zitaten verwendet LaTeX einen mehrstufigen Satzprozess: Daten, die in einem Durchlauf (Kompilierung) erzeugt werden, werden in Datei(en) geschrieben und als Eingabe für alle nachfolgenden Durchläufe verwendet, die erforderlich sein können. Das folgende Video zeigt, was jedes Mal passiert, wenn Sie in Ihrem Overleaf-Projekt auf die Schaltfläche „Neu kompilieren“ klicken:

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

Beim manuellen Kompilieren ist es normalerweise offensichtlich, wenn ein weiterer LaTeX-Durchlauf (Pass) erforderlich ist, aber die Automatisierung der LaTeX-Kompilierung bringt eine Reihe von Schwierigkeiten mit sich. Eine zentrale Herausforderung für automatisierte Lösungen besteht darin zu bestimmen *wie viele* LaTeX-Durchläufe (Kompilierungen) erforderlich sind, um alle Datenabhängigkeiten aufzulösen und so sicherzustellen, dass das endgültig gesetzte Dokument aktuell und vollständig ist. Eine weitere Komplexität besteht darin, die externen Programme korrekt zu identifizieren, die ausgeführt werden müssen, um Teile des Dokumentinhalts vorzubehandeln – etwa durch das Ausführen von BibTeX/BibLaTeX, um Literaturverzeichnisse zu erzeugen, oder durch das Ausführen spezialisierterer Grafikprogramme wie [MetaPost](https://tug.org/metapost.html) oder [Asymptote](https://asymptote.sourceforge.io/).

## Einführung in latexmk

Ein gut etabliertes Paket zur Automatisierung der Kompilierung ist [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), ein großes Perl-Skript, das in TeX Live enthalten ist und von Overleaf verwendet wird, um Ihre LaTeX-Projekte zu kompilieren. `latexmk` löst automatisch die erforderliche Anzahl von LaTeX-Durchläufen aus und führt die externen (Hilfs-)Programme aus, die erforderlich sind, um Teile des Inhalts Ihres Dokuments zu verarbeiten.

### latexmk anpassen

Obwohl `latexmk` äußerst vielseitig ist, machen unterschiedliche LaTeX-Kompilierumgebungen und die enorme Bandbreite an Dokumenttypen es für `latexmk` es unpraktikabel, automatisierte Lösungen bereitzustellen, die die Anforderungen jedes denkbaren LaTeX-Dokuments vollständig unterstützen. Stattdessen kann das Verhalten von `latexmk` über Konfigurationsdateien angepasst werden *implementiert in **Perl***:

* eine „systemweite“ Konfigurationsdatei, die die spezifische Rechenumgebung/Plattform berücksichtigt, und
* eine Konfigurationsdatei auf Benutzerebene, die dokumentenspezifische Anforderungen behandelt

Die [`latexmk-Handbuch`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) enthält weitere Einzelheiten zur Installation und Verwendung von Konfigurationsdateien.

## Overleafs LatexMk-Datei

Overleafs „systemweite“ Konfigurationsdatei folgt `latexmk` Konventionen (für Linux): Sie heißt `**LatexMk**` und befindet sich im Ordner `/usr/local/share/latexmk/`. **Hinweis**: Diese Datei wird gelesen *bevor* vor allen Konfigurationsdateien auf Benutzerebene.

Konfigurationsdateien auf Benutzerebene müssen benannt werden `latexmkrc` und zu Ihrem Overleaf-Projekt hinzugefügt werden, um benutzerdefinierte Regeln bereitzustellen, die die spezifischen Anforderungen Ihres Overleaf-LaTeX-Projekts/-Dokuments erfüllen.

Overleafs `LatexMk` Datei enthält Code für Overleaf-spezifische Verarbeitung sowie Regeln für Glossare, Nomenklatur und andere häufig verwendete Pakete. Overleafs `LatexMk` Datei kann zwischen Releases von TeX Live leicht variieren, um Änderungen und Aktualisierungen an Paketen und Softwarewerkzeugen innerhalb von TeX Live selbst Rechnung zu tragen.

### LaTeX-Kompilierungsmodus ändern

Standardmäßig weist Overleaf latexmk an, einen Kompilierungsmodus zu verwenden, den wir (Overleaf) als **Trotz Fehlern versuchen zu kompilieren**Nonstop-Modus [LaTeX-Kompilierfehler](/latex/de/latex-grundlagen/05-errors.md)bezeichnen. In diesem Kompilierungsmodus stoppt der LaTeX-Compiler nicht, obwohl

Sie können den LaTeX-Kompilierungsmodus so ändern, dass die Kompilierung sofort beim Auftreten des ersten Fehlers stoppt: siehe den Hilfeartikel [Den Kompilierungsmodus „Beim ersten Fehler stoppen“ verwenden](/latex/de/wissensdatenbank/149-using-the-stop-on-first-error-compilation-mode.md) für weitere Informationen.

### So greifen Sie auf eine Kopie von Overleafs LatexMk-Datei zu

Der folgende Link öffnet ein Projekt, um die Overleaf `LatexMk` Datei, die mit dem LaTeX-Compiler und der TeX-Live-Version Ihres Projekts verwendet wird, und macht sie außerdem zum Download verfügbar:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
Über dieses Projekt
Dieses Projekt bietet Zugriff auf die systemweite \texttt{LatexMk}-Initialisierungs-(Konfigurations-)datei, die von Overleaf verwendet wird.  \texttt{LatexMk} ist ein Perl-Skript, das je nach \TeX{} Live-Version und für das Projekt gewähltem Compiler leicht variieren kann. Wenn Sie zu 100\% sicher sein müssen, welches  \texttt{LatexMk} verwendet wird, fügen Sie den Code aus diesem Projekt zu Ihrem Projekt hinzu und kompilieren Sie, um ein Listing von \texttt{LatexMk} zu setzen und es als eine der Ausgabedateien zum Download verfügbar zu machen.
\section*{Auflistung der \texttt{LatexMk}-Datei}
\verbatiminput{./LatexMk}
\end{document}
```

[Öffnen Sie diesen 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)

Nach dem Kompilieren des obigen Projekts kann die `LatexMk` Datei über die **Protokolle und Ausgabedateien** Schaltfläche wie im folgenden kurzen Videoclip heruntergeladen werden:

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

### Weitere Hinweise und Ratschläge

Wenn Sie die zum Kompilieren Ihres Projekts verwendete TeX-Live-Version festlegen oder überprüfen möchten, lesen Sie bitte diesen [Overleaf-Blogbeitrag](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) oder die folgende Grafik:

![Wahl der Overleaf-TeX-Live-Version](/files/7410da99b776a0829109a489d4239d97df841b12)

Wenn Sie Ihr Overleaf-Projekt offline mit latexmk erstellen möchten, sollten Sie möglicherweise eine Kopie von Overleafs LatexMk-Datei verwenden, um sicherzustellen, dass der Build-Prozess von Overleaf angewendet wird — beachten Sie, dass der Jobname von Overleaf auf output gesetzt ist.

Overleaf kompiliert Projekte mit latexmks `-cd` Befehlszeilenflag, und die Kompilierung wird immer vom Stammverzeichnis des Projekts aus ausgeführt. Beachten Sie, dass einige `latexmk` Optionen mit Overleaf nicht kompatibel sind – insbesondere, wenn Sie die `$preview_continuous_mode` oder `$output_dir` Optionen festlegen, kann dies die Vorschau in Overleaf beeinträchtigen.

Für weitere Informationen zu `latexmkrc` Dateien lesen Sie den Artikel [Wie man latexmkrc mit Overleaf verwendet](/latex/de/ausfuhrliche-artikel/28-how-to-use-latexmkrc-with-overleaf.md) der nützliche Tipps und Tricks unserer freundlichen Overleaf-TeXpert:innen enthält.

## Eine Auflistung von Overleafs LatexMk-Datei (2023)

Der Einfachheit halber zeigt die folgende Auflistung Overleafs `LatexMk` Datei, wie sie mit TeX Live 2023 verwendet wird — verwenden Sie den obigen Link, um auf die neueste Version zuzugreifen.

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

# Umgehungslösung, um pstricks-Transparenz zu ermöglichen (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Nachbearbeitung der PDF-Datei #
###############################

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

# entspricht der Option -gt. Wird verwendet, um latexmk daran zu hindern, das erneute Kompilieren zu überspringen
# von output.log und output.pdf
$go_mode = 3;

# entspricht der Option -bibtex. Führe bibtex bedingungslos aus, wenn bbl-Dateien
# veraltet sind.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # Alter des vorhandenen PDFs abrufen, falls vorhanden
    $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;

    # Nach einer knitr-Konkordanzdatei suchen
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Synctex-Datei für knitr wird gepatcht...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Früher zurückkehren, wenn die PDF-Datei nicht existiert oder nicht aktualisiert wurde
    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;

    # Herausfinden, wo qpdf ist
    $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});

    # qpdf ausführen
    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";

    # Die Ausgabedatei ersetzen, wenn qpdf erfolgreich war
    # qpdf gibt 0 für Erfolg, 3 für Warnungen zurück (Ausgabe-PDF wird dennoch erstellt)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Optimierte Datei wird in $output_file umbenannt\n";
    rename($optimised_file, $output_file);

    print "xref-Tabelle für $output_file wird extrahiert\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";
}

##############
# Glossare #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # aus 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  #  # aus 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;

    # die Hauptdatei identifizieren
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # das Verzeichnis in einem begrenzten Geltungsbereich wechseln
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # chktex auf der Hauptdatei ausführen
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # zum ursprünglichen Verzeichnis zurückkehren
        chdir($orig_dir);

        # im VALIDATE-Modus beenden wir immer nach dem Ausführen von chktex
        # andernfalls beenden wir uns, wenn EXIT_ON_ERROR gesetzt ist

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex erlaubt uns nicht, die Fehlerinformationen über den Exit-Status abzurufen
            # also schauen wir uns die Ausgabe an
            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/de/wissensdatenbank/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.
