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

# Jak Overleaf kompiluje můj projekt?

## Automatizace kompilace LaTeXu

K podpoře funkcí, jako je obsah, seznamy obrázků, křížové odkazy, glosáře, rejstříky a bibliografické citace, používá LaTeX vícepřechodový sazební proces: data vytvořená v jednom průchodu (kompilaci) se zapíší do souboru (souborů) a použijí se jako vstup pro jakýkoli následný průchod (průchody), který může být vyžadován. Následující video ukazuje, co se stane pokaždé, když v projektu na Overleafu kliknete na tlačítko „Rekompilovat“:

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

Při ruční kompilaci je obvykle zřejmé, zda je potřeba další běh (průchod) LaTeXu, ale automatizace kompilace LaTeXu přináší řadu obtíží. Klíčovou výzvou pro automatizovaná řešení je určit *kolik* průchodů LaTeXu (kompilací) je potřeba k vyřešení všech datových závislostí, a tím zajistit, aby výsledný vysázený dokument byl aktuální a kompletní. Další složitostí je správně identifikovat externí programy, které je nutné spustit pro předzpracování částí obsahu dokumentu — například spuštění BibTeXu/BibLaTeXu pro vytvoření seznamů referencí nebo spuštění specializovanějších grafických aplikací, jako jsou [MetaPost](https://tug.org/metapost.html) nebo [Asymptote](https://asymptote.sourceforge.io/).

## Představení latexmk

Jedním osvědčeným balíčkem pro automatizaci kompilace je [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), velký skript v Perlu zahrnutý v TeX Live a používaný službou Overleaf ke kompilaci vašich projektů v LaTeXu. `latexmk` automaticky spustí požadovaný počet běhů LaTeXu a vykoná externí (pomocné) programy potřebné ke zpracování částí obsahu vašeho dokumentu.

### Přizpůsobení latexmk

Ačkoli `latexmk` je mimořádně všestranný, různé prostředí pro kompilaci LaTeXu a obrovský rozsah typů dokumentů činí nepraktickým pro `latexmk` pokoušet se poskytovat automatizovaná řešení, která plně podporují potřeby každého myslitelného dokumentu v LaTeXu. Místo toho lze chování `latexmk` lze přizpůsobit prostřednictvím konfiguračních souborů *implementovaných v **Perlu***:

* konfigurační soubor „pro celý systém“, který pokrývá konkrétní výpočetní prostředí/platformu, a
* konfigurační soubor na úrovni uživatele, který řeší požadavky specifické pro daný dokument

Ta [`manuál latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) poskytuje podrobnější informace o instalaci a použití konfiguračních souborů.

## Soubor LatexMk služby Overleaf

Konfigurační soubor služby Overleaf „pro celý systém“ se řídí `latexmk` konvencemi (pro Linux): je pojmenován `**LatexMk**` a nachází se ve složce `/usr/local/share/latexmk/`. **Poznámka**: tento soubor se načítá *dříve, než* před jakýmikoli konfiguračními soubory na úrovni uživatele.

Konfigurační soubory na úrovni uživatele musí být pojmenovány `latexmkrc` a přidány do vašeho projektu na Overleafu, aby poskytly vlastní pravidla řešící specifické požadavky vašeho projektu/dokumentu v LaTeXu.

Overleafův `LatexMk` soubor obsahuje kód pro zpracování specifické pro Overleaf plus pravidla pro glosáře, nomenklaturu a další běžně používané balíčky. Overleafův `LatexMk` soubor se může mezi vydáními TeX Live mírně lišit, aby zohlednil změny a aktualizace provedené v samotném TeX Live v balíčcích a softwarových nástrojích.

### Změna režimu kompilace LaTeXu

Ve výchozím nastavení Overleaf instruuje latexmk, aby používal režim kompilace, který my (Overleaf) označujeme jako **Zkusit kompilovat navzdory chybám**. V tomto režimu kompilace se překladač LaTeXu nezastaví, přestože narazí na [chyby kompilace LaTeXu](/latex/cs/zaklady-latexu/05-errors.md); může být vytvořen PDF soubor, i když obsahuje nesprávný výstup. Často mohou být chyby kompilace příliš závažné nebo početné na to, aby je překladač LaTeXu opravil, takže může stále „vycouvat“ bez vytvoření PDF.

Režim kompilace LaTeXu můžete změnit tak, aby se kompilace zastavila okamžitě při narazení na první chybu: viz článek nápovědy [Použití režimu kompilace Zastavit při první chybě](/latex/cs/znalostni-baze/149-using-the-stop-on-first-error-compilation-mode.md) pro další informace.

### Jak získat kopii souboru LatexMk služby Overleaf

Následující odkaz otevře projekt pro vysázení souboru Overleaf `LatexMk` používaného s překladačem LaTeXu vašeho projektu a verzí TeX Live a zároveň jej zpřístupní ke stažení:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{O tomto projektu}
Tento projekt poskytuje přístup k systémovému inicializačnímu (konfiguračnímu) souboru \texttt{LatexMk} používanému službou Overleaf.  \texttt{LatexMk} je skript v Perlu, který se může mírně lišit podle verze \TeX{} Live a překladače zvoleného pro projekt. Pokud si potřebujete být na 100\% jisti, který  \texttt{LatexMk} se používá, přidejte kód z tohoto projektu do svého projektu a zkompilujte jej, aby se vysázel výpis \texttt{LatexMk} a byl dostupný ke stažení jako jeden z výstupních souborů.
\section*{Výpis souboru \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Otevřete tento kód v Overleafu.](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)

Po zkompilování výše uvedeného projektu lze `LatexMk` soubor stáhnout pomocí **Protokoly a výstupní soubory** tlačítka, jak ukazuje následující krátký videoklip:

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

### Další poznámky a rady

Pokud si přejete nastavit nebo zkontrolovat verzi TeX Live použitou ke kompilaci vašeho projektu, podívejte se na tento [příspěvek na blogu Overleafu](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) nebo na následující grafiku:

![Výběr verze TeX Live v Overleafu](/files/a9a29f45404340541ffa8dfb2931e66cc24c1dd7)

Pokud chcete sestavit svůj projekt na Overleafu offline pomocí latexmk, můžete chtít použít kopii souboru LatexMk služby Overleaf, aby se zajistilo, že použije sestavovací proces Overleafu — poznamenejte, že název úlohy Overleafu je nastaven na output.

Overleaf kompiluje projekty pomocí přepínače latexmk `-cd` příkazové řádky a kompilace vždy probíhá z kořenového adresáře projektu. Všimněte si, že některé `latexmk` možnosti nejsou s Overleafem kompatibilní — zejména pokud nastavíte `$preview_continuous_mode` nebo `$output_dir` možnosti, může to narušit náhled v Overleafu.

Další informace o `latexmkrc` souborech najdete v článku [Jak používat latexmkrc s Overleafem](/latex/cs/clanky-do-hloubky/28-how-to-use-latexmkrc-with-overleaf.md) který obsahuje užitečné tipy a triky od našich přátelských TeXpertů z Overleafu.

## Výpis souboru LatexMk služby Overleaf (2023)

Pro pohodlí následující výpis ukazuje soubor Overleafu `LatexMk` používaný s TeX Live 2023 — k nejnovější verzi se dostanete pomocí odkazu výše.

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

# Obejít problém umožňující průhlednost pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Následné zpracování souboru PDF #
###############################

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

# ekvivalent volby -gt. Slouží k tomu, aby latexmk nevynechal rekompilaci
# souborů output.log a output.pdf
$go_mode = 3;

# ekvivalent volby -bibtex. Spouští bibtex bezpodmínečně, když jsou soubory bbl
# zastaralé.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # zjistit stáří existujícího PDF, pokud je přítomno
    $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;

    # Hledat soubor concordance pro knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        Opravuji soubor synctex pro knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Vrátit se dříve, pokud PDF soubor neexistuje nebo nebyl aktualizován
    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;

    # Zjistit, kde je qpdf
    $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});

    # Spustit qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "Kód ukončení qpdf=$qpdf_exit_code\n";

    # Nahradit výstupní soubor, pokud byl qpdf úspěšný
    # qpdf vrací 0 při úspěchu, 3 při upozorněních (výstupní PDF je stále vytvořeno)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Přejmenovávám optimalizovaný soubor na $output_file\n";
    rename($optimised_file, $output_file);

    print "Extrahuji xref tabulku pro $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "Kód ukončení qpdf --show-xref=$qpdf_xref_exit_code\n";
}

##############
# Glosáře #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # z Overleaf v1
sub glo2gls {
    system("makeglossaries $_[0]");
}

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

################
# nomenklatura #
################
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  #  # z 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;

    # identifikovat hlavní soubor
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # změnit adresář v omezeném rozsahu
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # spustit chktex na hlavním souboru
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # vrátit se do původního adresáře
        chdir($orig_dir);

        # v režimu VALIDATE vždy ukončíme po spuštění chktex
        # jinak skončíme, pokud je nastaveno EXIT_ON_ERROR

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex nám neumožňuje přístup k informacím o chybách prostřednictvím návratového kódu
            # proto projdeme výstup
            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/cs/znalostni-baze/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.
