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

# Як Overleaf компілює мій проєкт?

## Автоматизація компіляції LaTeX

Щоб підтримувати такі можливості, як зміст, списки рисунків, перехресні посилання, глосарії, індексація та бібліографічні цитування, LaTeX використовує багатопрохідний процес верстки: дані, згенеровані за один прохід (компіляцію), записуються у файл(и) і використовуються як вхідні дані для будь-яких наступних проходів, які можуть знадобитися. Наступне відео показує, що відбувається щоразу, коли ви натискаєте кнопку «Recompile» у своєму проєкті Overleaf:

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

Під час ручної компіляції зазвичай очевидно, чи потрібен ще один запуск LaTeX (прохід), але автоматизація компіляції LaTeX створює низку труднощів. Ключове завдання для автоматизованих рішень — визначити *скільки* проходів LaTeX (компіляцій) потрібно, щоб розв’язати будь-які залежності даних і таким чином гарантувати, що остаточний зверстаний документ є актуальним і повним. Ще одна складність — правильно визначити зовнішні програми, які потрібно виконати для попередньої обробки частин вмісту документа — наприклад, запуск BibTeX/BibLaTeX для створення списків посилань або виконання більш спеціалізованих графічних застосунків, таких [MetaPost](https://tug.org/metapost.html) або [Asymptote](https://asymptote.sourceforge.io/).

## Знайомство з latexmk

Одним добре відомим пакетом для автоматизації компіляції є [`latexmk`](https://ctan.org/pkg/latexmk?lang=en)— великий скрипт Perl, що входить до складу TeX Live і використовується Overleaf для компіляції ваших проєктів LaTeX. `latexmk` автоматично запускає потрібну кількість проходів LaTeX і виконує зовнішні (допоміжні) програми, необхідні для обробки частин вмісту вашого документа.

### Налаштування latexmk

Хоча `latexmk` він надзвичайно універсальний, різні середовища компіляції LaTeX та величезний діапазон типів документів роблять недоцільним для `latexmk` намагатися створювати автоматизовані рішення, які повністю підтримують потреби кожного можливого документа LaTeX. Натомість поведінку `latexmk` можна налаштувати за допомогою файлів конфігурації *реалізованих у **Perl***:

* файл конфігурації «для всієї системи», який враховує конкретне обчислювальне середовище/платформу, та
* файл конфігурації рівня користувача, який обробляє вимоги, специфічні для документа

Функція [`посібник latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) містить більше відомостей про встановлення та використання файлів конфігурації.

## Файл LatexMk від Overleaf

Системний файл конфігурації Overleaf відповідає `latexmk` конвенціям (для Linux): він називається `**LatexMk**` і розташований у теці `/usr/local/share/latexmk/`. **Примітка**: цей файл зчитується *до того, як* перед будь-якими файлами конфігурації рівня користувача.

Файли конфігурації рівня користувача мають називатися `latexmkrc` і додаватися до вашого проєкту Overleaf, щоб забезпечити власні правила, які відповідають конкретним вимогам вашого проєкту/документа Overleaf LaTeX.

Файл Overleaf’а `LatexMk` містить код для обробки, специфічної для Overleaf, а також правила для глосаріїв, номенклатури та інших часто використовуваних пакетів. Файл Overleaf’а `LatexMk` може дещо відрізнятися між випусками TeX Live, щоб враховувати зміни та оновлення, внесені до пакетів і програмних інструментів у самому TeX Live.

### Зміна режиму компіляції LaTeX

За замовчуванням Overleaf наказує latexmk використовувати режим компіляції, який ми (Overleaf) називаємо **Намагатися компілювати попри помилки**. У цьому режимі компіляції компілятор LaTeX не зупиняється, навіть якщо зустрічає [помилки компіляції LaTeX](/latex/uk/osnovi-latex/05-errors.md); може бути згенеровано PDF, навіть якщо він містить неправильний результат. Часто помилки компіляції можуть бути надто серйозними або численними, щоб компілятор LaTeX міг їх виправити, тож він усе одно може «вийти з ладу» без створення PDF.

Ви можете змінити режим компіляції LaTeX так, щоб компіляція зупинялася одразу після першої помилки: див. довідкову статтю [Використання режиму компіляції Stop on First Error](/latex/uk/baza-znan/149-using-the-stop-on-first-error-compilation-mode.md) для додаткової інформації.

### Як отримати доступ до копії файла LatexMk від Overleaf

Наведене нижче посилання відкриває проєкт для верстки файла Overleaf `LatexMk` файл, що використовується з компілятором LaTeX вашого проєкту та версією TeX Live, а також робить його доступним для завантаження:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Про цей проєкт}
Цей проєкт надає доступ до системного файла ініціалізації (конфігурації) \texttt{LatexMk}, який використовується Overleaf. \texttt{LatexMk} — це скрипт Perl, який може трохи відрізнятися залежно від версії \TeX{} Live та вибраного для проєкту компілятора. Якщо вам потрібно бути на 100\% певними, який саме \texttt{LatexMk} використовується, додайте код із цього проєкту до свого проєкту та скомпілюйте його, щоб зверстати перелік \texttt{LatexMk} і зробити його доступним для завантаження як один із вихідних файлів.
\section*{Перелік файла \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Відкрийте цей код в 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)

Після компіляції наведеного вище проєкту `LatexMk` файл можна завантажити за допомогою **Журнали та вихідні файли** кнопки, як показано в короткому відеофрагменті нижче:

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

### Інші примітки та поради

Якщо ви хочете задати або перевірити версію TeX Live, використану для компіляції вашого проєкту, зверніться до цієї [публікації в блозі Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) або до наведеного нижче зображення:

![Вибір версії TeX Live в Overleaf](/files/89142c95886d1d675cbb8ca4ec774b310d54006d)

Якщо ви хочете збирати свій проєкт Overleaf офлайн за допомогою latexmk, вам може знадобитися копія файла LatexMk від Overleaf, щоб переконатися, що він застосовує процес збірки Overleaf — зауважте, що ім’я завдання Overleaf встановлено як output.

Overleaf компілює проєкти, використовуючи прапорець latexmk `-cd` командного рядка, і компіляція завжди запускається з кореневої теки проєкту. Зверніть увагу, що деякі `latexmk` опції несумісні з Overleaf — зокрема, якщо ви задасте `$preview_continuous_mode` або `$output_dir` опції, це може зламати попередній перегляд в Overleaf.

Додаткову інформацію про `latexmkrc` файли читайте статтю [Як використовувати latexmkrc з Overleaf](/latex/uk/dokladni-statti/28-how-to-use-latexmkrc-with-overleaf.md) у якій є корисні поради та хитрощі від наших привітних TeX-експертів Overleaf.

## Перелік файла LatexMk від Overleaf (2023)

Для зручності наведений нижче перелік показує файл Overleaf’а `LatexMk` у тому вигляді, як він використовується з TeX Live 2023 — скористайтеся посиланням вище, щоб отримати доступ до найновішої версії.

```perl
# Налаштування
$xdvipdfmx = "xdvipdfmx -z 6 -i dvipdfmx-unsafe.cfg -o %D %O %S";

# Обхідний спосіб, щоб дозволити прозорість pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Післяобробка файла PDF #
###############################

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

# еквівалент опції -gt. Використовується, щоб запобігти пропуску перекомпіляції latexmk
# файлів output.log і output.pdf
$go_mode = 3;

# еквівалент опції -bibtex. Запускати bibtex безумовно, коли файли bbl є
# застарілими.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # отримати вік наявного PDF, якщо він є
    $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;

    # Шукати файл узгодження knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Виправлення файла synctex для knitr...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Повернутися одразу, якщо файл PDF не існує або не був оновлений
    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;

    # Визначити, де розташований 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});

    # Запустити qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "Код виходу qpdf=$qpdf_exit_code\n";

    # Замінити вихідний файл, якщо qpdf завершився успішно
    # qpdf повертає 0 у разі успіху, 3 — для попереджень (PDF усе одно створено)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Перейменування оптимізованого файла на $output_file\n";
    rename($optimised_file, $output_file);

    print "Витягування таблиці xref для $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=$qpdf_xref_exit_code\n";
}

##############
# Глосарії #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # з Overleaf v1
sub glo2gls {
    system("makeglossaries $_[0]");
}

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

################
# номенклатура #
################
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  #  # з 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;

    # визначити основний файл
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # змінити теку в межах обмеженої області дії
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # запустити chktex для основного файла
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # повернутися до початкової теки
        chdir($orig_dir);

        # у режимі VALIDATE ми завжди виходимо після запуску chktex
        # інакше ми виходимо, якщо встановлено EXIT_ON_ERROR

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex не дає нам доступу до інформації про помилку через код виходу
            # тому переглядаємо вивід
            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/uk/baza-znan/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.
