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

# Comment Overleaf compile-t-il mon projet ?

## Automatisation de la compilation LaTeX

Pour prendre en charge des fonctionnalités telles que la table des matières, les listes des figures, les références croisées, les glossaires, l’indexation et les citations bibliographiques, LaTeX utilise un processus de composition en plusieurs passes : les données produites lors d’une passe (compilation) sont écrites dans un ou plusieurs fichiers et utilisées comme entrée pour toute passe suivante éventuellement nécessaire. La vidéo suivante montre ce qui se passe chaque fois que vous cliquez sur le bouton « Recompiler » dans votre projet Overleaf :

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

Lors d’une compilation manuelle, il est généralement évident si une autre exécution (passe) de LaTeX est nécessaire, mais l’automatisation de la compilation LaTeX pose un certain nombre de difficultés. Un défi clé pour les solutions automatisées consiste à déterminer *combien* de passes LaTeX (compilations) sont nécessaires pour résoudre toutes les dépendances de données, garantissant ainsi que le document composé final est à jour et complet. Une autre complexité consiste à identifier correctement les programmes externes qui doivent être exécutés pour prétraiter des parties du contenu du document — par exemple, exécuter BibTeX/BibLaTeX pour produire des listes de références ou lancer des applications graphiques plus spécialisées telles que [MetaPost](https://tug.org/metapost.html) ou [Asymptote](https://asymptote.sourceforge.io/).

## Présentation de latexmk

Un paquet bien établi pour automatiser la compilation est [`latexmk`](https://ctan.org/pkg/latexmk?lang=en)un gros script Perl inclus dans TeX Live et utilisé par Overleaf pour compiler vos projets LaTeX. `latexmk` déclenche automatiquement le nombre requis d’exécutions de LaTeX et exécute les programmes externes (auxiliaires) nécessaires pour traiter des parties du contenu de votre document.

### Personnalisation de latexmk

Bien que `latexmk` soit extrêmement polyvalent, les différents environnements de compilation LaTeX et l’énorme variété de types de documents rendent irréaliste pour `latexmk` tenter de fournir des solutions automatisées qui répondent pleinement aux besoins de tout document LaTeX imaginable. Au lieu de cela, le comportement de `latexmk` peut être personnalisé via des fichiers de configuration *implémentés dans **Perl***:

* un fichier de configuration « système » qui tient compte de l’environnement/plateforme informatique spécifique, et
* un fichier de configuration au niveau de l’utilisateur qui gère les exigences spécifiques au document

Le [`manuel latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) fournit plus de détails sur l’installation et l’utilisation des fichiers de configuration.

## Le fichier LatexMk d’Overleaf

Le fichier de configuration « système » d’Overleaf suit `latexmk` les conventions (pour Linux) : il s’appelle `**LatexMk**` et se trouve dans le dossier `/usr/local/share/latexmk/`. **Remarque**: ce fichier est lu *avant* avant tout fichier de configuration au niveau de l’utilisateur.

Les fichiers de configuration au niveau de l’utilisateur doivent s’appeler `latexmkrc` et être ajoutés à votre projet Overleaf pour fournir des règles personnalisées répondant aux exigences spécifiques de votre projet/document LaTeX sur Overleaf.

Le `LatexMk` contient du code pour un traitement spécifique à Overleaf ainsi que des règles pour les glossaires, la nomenclature et d’autres packages couramment utilisés. Le fichier d’Overleaf `LatexMk` peut présenter quelques variations entre les versions de TeX Live afin de prendre en compte les changements et mises à jour apportés aux packages et aux outils logiciels au sein même de TeX Live.

### Changer le mode de compilation de LaTeX

Par défaut, Overleaf indique à latexmk d’utiliser un mode de compilation que nous (Overleaf) appelons **Essayer de compiler malgré les erreurs**. Dans ce mode de compilation, le compilateur LaTeX ne s’arrête pas, même s’il rencontre [des erreurs de compilation LaTeX](/latex/fr/bases-de-latex/05-errors.md); un PDF peut être produit, même s’il contient une sortie incorrecte. Souvent, les erreurs de compilation peuvent être trop graves ou trop nombreuses pour que le compilateur LaTeX les corrige, de sorte qu’il peut quand même « abandonner » sans produire de PDF.

Vous pouvez modifier le mode de compilation LaTeX pour que la compilation s’arrête immédiatement à la première erreur rencontrée : consultez l’article d’aide [Utiliser le mode de compilation Arrêter à la première erreur](/latex/fr/base-de-connaissances/149-using-the-stop-on-first-error-compilation-mode.md) pour plus d’informations.

### Comment accéder à une copie du fichier LatexMk d’Overleaf

Le lien suivant ouvre un projet pour composer le fichier Overleaf `LatexMk` utilisé avec le compilateur LaTeX et la version de TeX Live de votre projet et le rend également disponible au téléchargement :

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{À propos de ce projet}
Ce projet donne accès au fichier d’initialisation (configuration) système \texttt{LatexMk} utilisé par Overleaf.  \texttt{LatexMk} est un script Perl qui peut varier légèrement selon la \TeX{} Live version et le compilateur choisis pour le projet. Si vous devez être certain à 100\% de quel  \texttt{LatexMk} est utilisé, ajoutez le code de ce projet à votre projet et compilez pour composer une liste de \texttt{LatexMk} et la rendre disponible au téléchargement comme l’un des fichiers de sortie.
\section*{Affichage du fichier \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Ouvrez ce code dans 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)

Après avoir compilé le projet ci-dessus, le `LatexMk` fichier peut être téléchargé via le **Journaux et fichiers de sortie** bouton comme le montre le bref clip vidéo suivant :

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

### Autres notes et conseils

Si vous souhaitez définir ou vérifier la version de TeX Live utilisée pour compiler votre projet, veuillez consulter cet [article de blog Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) ou le graphique suivant :

![Choisir la version de TeX Live d’Overleaf](/files/85d26dedcaccd6f96e9132a96976d4d1de39095e)

Si vous souhaitez construire votre projet Overleaf hors ligne à l’aide de latexmk, vous pouvez utiliser une copie du fichier LatexMk d’Overleaf afin de vous assurer qu’il applique le processus de compilation d’Overleaf — notez que le nom de tâche Overleaf est défini sur output.

Overleaf compile les projets en utilisant l’option de latexmk `-cd` en ligne de commande, et la compilation s’exécute toujours depuis le répertoire racine du projet. Notez que certaines `latexmk` options ne sont pas compatibles avec Overleaf — en particulier, si vous définissez les `$preview_continuous_mode` ou `$output_dir` options, cela peut casser l’aperçu sur Overleaf.

Pour plus d’informations sur `latexmkrc` fichiers, consultez l’article [Comment utiliser latexmkrc avec Overleaf](/latex/fr/articles-approfondis/28-how-to-use-latexmkrc-with-overleaf.md) qui contient des conseils et astuces utiles de nos sympathiques TeXperts Overleaf.

## Liste du fichier LatexMk d’Overleaf (2023)

Par souci de commodité, la liste suivante montre le `LatexMk` fichier tel qu’utilisé avec TeX Live 2023 — utilisez le lien ci-dessus pour accéder à la version la plus récente.

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

# Contournement pour autoriser la transparence pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Post-traitement du fichier PDF #
###############################

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

# équivalent à l’option -gt. Utilisé pour empêcher latexmk d’ignorer la recompilation
# de output.log et output.pdf
$go_mode = 3;

# équivalent à l’option -bibtex. Exécute bibtex sans condition lorsque les fichiers bbl sont
# obsolètes.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # obtenir l’âge du PDF existant s’il est présent
    $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;

    # Rechercher un fichier de concordance knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Correction du fichier synctex pour knitr...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Quitter immédiatement si le fichier PDF n’existe pas ou n’a pas été mis à jour
    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;

    # Déterminer où se trouve 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});

    # Exécuter qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "code de sortie de qpdf=$qpdf_exit_code\n";

    # Remplacer le fichier de sortie si qpdf a réussi
    # qpdf renvoie 0 en cas de succès, 3 en cas d’avertissements (le PDF de sortie est tout de même créé)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Renommage du fichier optimisé en $output_file\n";
    rename($optimised_file, $output_file);

    print "Extraction de la table xref pour $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "code de sortie qpdf --show-xref=$qpdf_xref_exit_code\n";
}

##############
# Glossaires #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # provenant d’Overleaf v1
sub glo2gls {
    system("makeglossaries $_[0]");
}

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

################
# nomenclature #
################
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  #  # provenant d’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;

    # identifier le fichier principal
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # changer de répertoire dans un périmètre limité
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # exécuter chktex sur le fichier principal
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # revenir au répertoire d’origine
        chdir($orig_dir);

        # en mode VALIDATE, nous quittons toujours après l’exécution de chktex
        # sinon, nous quittons si EXIT_ON_ERROR est défini

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex ne nous permet pas d’accéder aux informations d’erreur via le code de sortie
            # donc nous examinons la sortie
            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/fr/base-de-connaissances/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.
