> 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/it/base-di-conoscenza/064-how-does-overleaf-compile-my-project.md).

# Come compila Overleaf il mio progetto?

## Automazione della compilazione LaTeX

Per supportare funzionalità come indice, elenchi delle figure, riferimenti incrociati, glossari, indici analitici e citazioni bibliografiche, LaTeX utilizza un processo di composizione a più passaggi: i dati prodotti in un passaggio (compilazione) vengono scritti su file e usati come input per eventuali passaggi successivi che possano essere necessari. Il video seguente mostra cosa succede ogni volta che fai clic sul pulsante “Ricomponi” nel tuo progetto Overleaf:

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

Quando si esegue la compilazione manuale, di solito è evidente se è necessario un altro passaggio di LaTeX, ma automatizzare la compilazione di LaTeX presenta diverse difficoltà. Una sfida chiave per le soluzioni automatiche è determinare *quanti* passaggi di LaTeX (compilazioni) sono necessari per risolvere eventuali dipendenze dei dati, assicurando così che il documento finale composto sia aggiornato e completo. Un'altra complessità è identificare correttamente i programmi esterni che devono essere eseguiti per pre-elaborare parti del contenuto del documento—come l'esecuzione di BibTeX/BibLaTeX per produrre gli elenchi delle referenze o l'esecuzione di applicazioni grafiche più specialistiche come [MetaPost](https://tug.org/metapost.html) o [Asymptote](https://asymptote.sourceforge.io/).

## Introduzione a latexmk

Un pacchetto ben consolidato per automatizzare la compilazione è [`latexmk`](https://ctan.org/pkg/latexmk?lang=en)latexmk, un grande script Perl incluso in TeX Live e utilizzato da Overleaf per compilare i tuoi progetti LaTeX. `latexmk` attiva automaticamente il numero necessario di esecuzioni di LaTeX ed esegue i programmi esterni (ausiliari) richiesti per elaborare parti del contenuto del tuo documento.

### Personalizzazione di latexmk

Sebbene `latexmk` sia estremamente versatile, i diversi ambienti di compilazione LaTeX e l'enorme varietà di tipi di documento rendono impraticabile per `latexmk` tentare di fornire soluzioni automatiche che supportino completamente le esigenze di ogni possibile documento LaTeX. Invece, il comportamento di `latexmk` può essere personalizzato tramite file di configurazione *implementati in **Perl***:

* un file di configurazione “di sistema” che si adatta allo specifico ambiente/piattaforma di calcolo, e
* un file di configurazione a livello utente che gestisce i requisiti specifici del documento

Il [`manuale di latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) fornisce maggiori dettagli sull'installazione e sull'uso dei file di configurazione.

## Il file LatexMk di Overleaf

Il file di configurazione “di sistema” di Overleaf segue `latexmk` le convenzioni (per Linux): si chiama `**LatexMk**` e si trova nella cartella `/usr/local/share/latexmk/`. **Nota**: quel file viene letto *prima* prima di qualsiasi file di configurazione a livello utente.

I file di configurazione a livello utente devono essere chiamati `latexmkrc` e aggiunti al tuo progetto Overleaf per fornire regole personalizzate che rispondano ai requisiti specifici del tuo progetto/documento LaTeX su Overleaf.

Il `LatexMk`  file contiene codice per l'elaborazione specifica di Overleaf oltre a regole per glossari, nomenclatura e altri pacchetti comunemente usati. Il `LatexMk`  file può mostrare alcune variazioni tra le release di TeX Live per adattarsi ai cambiamenti e agli aggiornamenti apportati ai pacchetti e agli strumenti software all'interno di TeX Live stessa.

### Modifica della modalità di compilazione di LaTeX

Per impostazione predefinita, Overleaf istruisce latexmk a usare una modalità di compilazione che noi (Overleaf) definiamo come **Prova a compilare nonostante gli errori**. In quella modalità di compilazione il compilatore LaTeX non si arresta, nonostante incontri [errori di compilazione LaTeX](/latex/it/concetti-di-base-di-latex/05-errors.md); potrebbe essere prodotto un PDF, anche se contiene un output errato. Spesso gli errori di compilazione possono essere troppo gravi o numerosi perché il compilatore LaTeX li corregga, quindi potrebbe comunque “tirarsi indietro” senza produrre un PDF.

Puoi modificare la modalità di compilazione di LaTeX in modo che la compilazione si interrompa immediatamente al primo errore incontrato: vedi l'articolo di aiuto [Uso della modalità di compilazione Stop on First Error](/latex/it/base-di-conoscenza/149-using-the-stop-on-first-error-compilation-mode.md) per ulteriori informazioni.

### Come accedere a una copia del file LatexMk di Overleaf

Il seguente link apre un progetto per comporre il file LatexMk di Overleaf `LatexMk` utilizzato con il compilatore LaTeX e la versione di TeX Live del tuo progetto e lo rende disponibile anche per il download:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Informazioni su questo progetto}
Questo progetto fornisce accesso al file di inizializzazione (configurazione) di sistema \texttt{LatexMk} usato da Overleaf.  \texttt{LatexMk} è uno script Perl che può variare leggermente in base alla versione di \TeX{} Live e al compilatore scelto per il progetto. Se devi essere sicuro al 100\% di quale  \texttt{LatexMk} venga usato, aggiungi al tuo progetto il codice di questo progetto e compila per impaginare un elenco di \texttt{LatexMk} e renderlo disponibile per il download come uno dei file di output.
\section*{Elenco del file \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Apri questo codice 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)

Dopo aver compilato il progetto sopra, il `LatexMk` file può essere scaricato tramite il **Log e file di output** pulsante come mostrato nel breve video seguente:

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

### Altre note e consigli

Se desideri impostare o verificare la versione di TeX Live usata per compilare il tuo progetto, fai riferimento a questo [post del blog di Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) o alla seguente immagine:

![Scelta della versione TeX Live di Overleaf](/files/76f7d29602725d116c1c0bbbcc7e4b3d392ad2a3)

Se vuoi compilare offline il tuo progetto Overleaf usando latexmk, potresti voler usare una copia del file LatexMk di Overleaf per assicurarti che applichi il processo di build di Overleaf—nota che il nome del job di Overleaf è impostato su output.

Overleaf compila i progetti usando l'opzione `-cd` da riga di comando di latexmk, e la compilazione viene sempre eseguita dalla directory root del progetto. Nota che alcune `latexmk` opzioni non sono compatibili con Overleaf—in particolare, se imposti le opzioni `$preview_continuous_mode` o `$output_dir` , ciò potrebbe interrompere l'anteprima su Overleaf.

Per ulteriori informazioni sui `latexmkrc` file, leggi l'articolo [Come usare latexmkrc con Overleaf](/latex/it/articoli-approfonditi/28-how-to-use-latexmkrc-with-overleaf.md) che contiene consigli e trucchi utili dai nostri cordiali TeXpert di Overleaf.

## Un elenco del file LatexMk di Overleaf (2023)

Per comodità, l'elenco seguente mostra il `LatexMk` file usato con TeX Live 2023—usa il link sopra per accedere alla versione più recente.

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

# Soluzione alternativa per consentire la trasparenza di pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Post-elaborazione del file PDF #
###############################

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

# equivalente all'opzione -gt. Usato per impedire a latexmk di saltare la ricompilazione
# di output.log e output.pdf
$go_mode = 3;

# equivalente all'opzione -bibtex. Esegui bibtex incondizionatamente quando i file bbl sono
# non aggiornati.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # ottieni l'età del PDF esistente, se presente
    $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;

    # Cerca un file di concordanza knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Applicazione della patch al file synctex per knitr...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # restituisci subito se il file PDF non esiste o non è stato aggiornato
    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;

    # Determina dove si trova 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});

    # Esegui qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "Codice di uscita di qpdf=$qpdf_exit_code\n";

    # Sostituisci il file di output se qpdf ha avuto successo
    # qpdf restituisce 0 in caso di successo, 3 in caso di avvisi (il PDF di output viene comunque creato)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Rinomina del file ottimizzato in $output_file\n";
    rename($optimised_file, $output_file);

    print "Estrazione della tabella xref per $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "Codice di uscita di qpdf --show-xref=$qpdf_xref_exit_code\n";
}

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

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

################
# nomenclatura #
################
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: Impossibile trovare il file della figura (.*); continuo.$');
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  #  # da 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;

    # identifica il file principale
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # cambia directory per un ambito limitato
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # esegui chktex sul file principale
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # torna alla directory originale
        chdir($orig_dir);

        # in modalità VALIDATE usciamo sempre dopo aver eseguito chktex
        # altrimenti usciamo se è impostato EXIT_ON_ERROR

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex non ci consente di accedere alle informazioni sugli errori tramite lo stato di uscita
            # quindi analizziamo l'output
            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/it/base-di-conoscenza/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.
