> 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/pl/baza-wiedzy/064-how-does-overleaf-compile-my-project.md).

# Jak Overleaf kompiluje mój projekt?

## Automatyzacja kompilacji LaTeX-a

Aby obsłużyć takie funkcje jak spis treści, listy rysunków, odwołania krzyżowe, glosariusze, indeksowanie i cytowania bibliograficzne, LaTeX używa wieloetapowego procesu składu: dane wytworzone w jednym przebiegu (kompilacji) są zapisywane do pliku(ów) i używane jako dane wejściowe dla każdego kolejnego przebiegu(ów), które mogą być wymagane. Poniższy film pokazuje, co dzieje się za każdym razem, gdy klikniesz przycisk „Rekompiluj” w swoim projekcie Overleaf:

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

Podczas ręcznej kompilacji zwykle widać, czy potrzebny jest kolejny przebieg (pass) LaTeX-a, ale automatyzacja kompilacji LaTeX-a wiąże się z wieloma trudnościami. Kluczowym wyzwaniem dla rozwiązań automatycznych jest określenie *ile* przebiegów LaTeX-a (kompilacji) jest potrzebnych do rozwiązania wszelkich zależności danych, zapewniając tym samym, że końcowy składany dokument jest aktualny i kompletny. Inną złożonością jest poprawne zidentyfikowanie programów zewnętrznych, które muszą zostać uruchomione, aby wstępnie przetworzyć części zawartości dokumentu — na przykład uruchomienie BibTeX/BibLaTeX w celu wygenerowania list bibliograficznych lub wykonanie bardziej specjalistycznych aplikacji graficznych, takich jak [MetaPost](https://tug.org/metapost.html) lub [Asymptote](https://asymptote.sourceforge.io/).

## Wprowadzenie do latexmk

Jednym dobrze ugruntowanym pakietem do automatyzacji kompilacji jest [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), duży skrypt Perl dołączony do TeX Live i używany przez Overleaf do kompilowania Twoich projektów LaTeX. `latexmk` automatycznie uruchamia wymaganą liczbę przebiegów LaTeX-a oraz wykonuje zewnętrzne (pomocnicze) programy potrzebne do przetwarzania części zawartości Twojego dokumentu.

### Dostosowywanie latexmk

Chociaż `latexmk` jest niezwykle wszechstronny, różne środowiska kompilacji LaTeX-a oraz ogromna różnorodność typów dokumentów sprawiają, że nie jest praktyczne, aby `latexmk` próbował dostarczać rozwiązań automatycznych w pełni obsługujących potrzeby każdego możliwego dokumentu LaTeX. Zamiast tego zachowanie `latexmk` można dostosować za pomocą plików konfiguracyjnych *zaimplementowanych w **Perlu***:

* pliku konfiguracyjnym „ogólnosystemowym”, który uwzględnia specyficzne środowisko/platformę obliczeniową, oraz
* pliku konfiguracyjnym na poziomie użytkownika, który obsługuje wymagania specyficzne dla dokumentu

Ta [`podręcznik latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) zawiera więcej szczegółów dotyczących instalacji i używania plików konfiguracyjnych.

## Plik LatexMk Overleaf

Plik konfiguracyjny „ogólnosystemowy” Overleaf jest zgodny z `latexmk` konwencjami (dla Linuxa): nazywa się `**LatexMk**` i znajduje się w folderze `/usr/local/share/latexmk/`. **Uwaga**: ten plik jest odczytywany *zanim* przed jakimikolwiek plikami konfiguracyjnymi na poziomie użytkownika.

Pliki konfiguracyjne na poziomie użytkownika muszą mieć nazwę `latexmkrc` i zostać dodane do Twojego projektu Overleaf, aby zapewnić niestandardowe reguły odpowiadające konkretnym wymaganiom Twojego projektu/dokumentu LaTeX w Overleaf.

Plik `LatexMk` Overleaf zawiera kod do przetwarzania specyficznego dla Overleaf, a także reguły dla glosariuszy, nomenklatury i innych powszechnie używanych pakietów. Plik Overleaf `LatexMk` może wykazywać pewne różnice między wydaniami TeX Live, aby uwzględnić zmiany i aktualizacje wprowadzone w samym TeX Live do pakietów i narzędzi programowych.

### Zmiana trybu kompilacji LaTeX-a

Domyślnie Overleaf poleca latexmk używanie trybu kompilacji, który my (Overleaf) określamy jako **Próbuj kompilować mimo błędów**Zatrzymaj przy pierwszym błędzie [błędy kompilacji LaTeX](/latex/pl/podstawy-latex-a/05-errors.md). W tym trybie kompilacji kompilator LaTeX nie zatrzymuje się mimo napotkania

; plik PDF może zostać wygenerowany, nawet jeśli zawiera niepoprawne wyniki. Często błędy kompilacji mogą być zbyt poważne lub zbyt liczne, aby kompilator LaTeX mógł je naprawić, więc może on nadal „wycofać się” bez wygenerowania pliku PDF. [Możesz zmienić tryb kompilacji LaTeX-a tak, aby kompilacja zatrzymywała się natychmiast po napotkaniu pierwszego błędu: zobacz artykuł pomocy](/latex/pl/baza-wiedzy/149-using-the-stop-on-first-error-compilation-mode.md) w celu uzyskania dalszych informacji.

### Jak uzyskać kopię pliku LatexMk Overleaf

Poniższy link otwiera projekt do składu pliku Overleaf `LatexMk` używanego z kompilatorem LaTeX i wersją TeX Live Twojego projektu, a także udostępnia go do pobrania:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Informacje o tym projekcie}
Ten projekt zapewnia dostęp do systemowego pliku inicjalizacyjnego (konfiguracyjnego) \texttt{LatexMk} używanego przez Overleaf.  \texttt{LatexMk} to skrypt Perl, który może się nieco różnić w zależności od wersji \TeX{} Live i kompilatora wybranego dla projektu. Jeśli chcesz mieć 100\% pewność, który \texttt{LatexMk} jest używany, dodaj kod z tego projektu do swojego projektu i skompiluj go, aby wygenerować listę \texttt{LatexMk} i udostępnić ją do pobrania jako jeden z plików wyjściowych.
\section*{Wyświetlanie pliku \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Otwórz ten kod w 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)

Po skompilowaniu powyższego projektu, `LatexMk` plik można pobrać za pomocą **Dzienniki i pliki wyjściowe** przycisku, jak pokazano na poniższym krótkim klipie wideo:

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

### Inne uwagi i porady

Jeśli chcesz ustawić lub sprawdzić wersję TeX Live używaną do kompilacji projektu, zapoznaj się z tym [wpisem na blogu Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) lub z poniższą grafiką:

![Wybieranie wersji TeX Live w Overleaf](/files/df6006963a09e898bdf329a6e89752b9c7703445)

Jeśli chcesz budować swój projekt Overleaf offline za pomocą latexmk, możesz użyć kopii pliku LatexMk Overleaf, aby upewnić się, że stosuje on proces budowania Overleaf — zwróć uwagę, że nazwa zadania Overleaf jest ustawiona na output.

Overleaf kompiluje projekty za pomocą opcji latexmk `-cd` w wierszu poleceń, a kompilacja jest zawsze uruchamiana z głównego katalogu projektu. Należy zauważyć, że niektóre `latexmk` opcje nie są zgodne z Overleaf — w szczególności, jeśli ustawisz `$preview_continuous_mode` lub `$output_dir` opcje, może to zepsuć podgląd w Overleaf.

Więcej informacji o `latexmkrc` plikach przeczytaj w artykule [Jak używać latexmkrc z Overleaf](/latex/pl/artykuly-szczegolowe/28-how-to-use-latexmkrc-with-overleaf.md) który zawiera przydatne wskazówki i triki od naszych przyjaznych ekspertów Overleaf TeXperts.

## Wykaz pliku LatexMk Overleaf (2023)

Dla wygody poniższy wykaz pokazuje plik Overleaf `LatexMk` używany z TeX Live 2023 — użyj linku powyżej, aby uzyskać dostęp do najnowszej wersji.

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

# Obejście umożliwiające przezroczystość pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Postprocessing pliku pdf #
###############################

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

# odpowiednik opcji -gt. Używane, aby zapobiec pomijaniu przez latexmk rekompilacji
# output.log i output.pdf
$go_mode = 3;

# odpowiednik opcji -bibtex. Uruchamiaj bibtex bezwarunkowo, gdy pliki bbl są
# nieaktualne.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # pobierz wiek istniejącego pliku pdf, jeśli jest obecny
    $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;

    # Szukaj pliku concordance dla knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Łatanie pliku synctex dla knitr...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Zwróć wcześniej, jeśli plik pdf nie istnieje lub nie został zaktualizowany
    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;

    # Ustal, gdzie jest 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});

    # Uruchom qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "kod zakończenia qpdf=$qpdf_exit_code\n";

    # Zastąp plik wyjściowy, jeśli qpdf zakończył się powodzeniem
    # qpdf zwraca 0 dla sukcesu, 3 dla ostrzeżeń (plik pdf nadal został utworzony)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Zmiana nazwy zoptymalizowanego pliku na $output_file\n";
    rename($optimised_file, $output_file);

    print "Wyodrębnianie tabeli xref dla $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "kod zakończenia qpdf --show-xref=$qpdf_xref_exit_code\n";
}

##############
# Glosariusze #
##############
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: Nie można znaleźć pliku rysunku (.*); kontynuowanie.$');
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;

    # zidentyfikuj główny plik
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # zmień katalog na ograniczony zakres
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # uruchom chktex na głównym pliku
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # wróć do oryginalnego katalogu
        chdir($orig_dir);

        # w trybie VALIDATE zawsze kończymy po uruchomieniu chktex
        # w przeciwnym razie kończymy, jeśli ustawiono EXIT_ON_ERROR

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex nie pozwala nam uzyskać informacji o błędzie przez kod zakończenia
            # więc przeszukaj wynik
            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/pl/baza-wiedzy/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.
