> 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/overleaf-learn-latex-pt/base-de-conhecimento/064-how-does-overleaf-compile-my-project.md).

# Como é que o Overleaf compila o meu projeto?

## Automatizando a compilação LaTeX

Para suportar funcionalidades como índice, listas de figuras, referências cruzadas, glossários, indexação e citações bibliográficas, o LaTeX usa um processo de composição tipográfica em várias passagens: os dados produzidos numa passagem (compilação) são gravados em ficheiro(s) e usados como entrada para quaisquer passagem(ns) subsequente(s) que possam ser necessárias. O vídeo seguinte mostra o que acontece sempre que clica no botão “Recompilar” no seu projeto Overleaf:

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

Ao efetuar compilação manual, normalmente é evidente se é necessária outra execução do LaTeX (passagem), mas automatizar a compilação LaTeX apresenta várias dificuldades. Um desafio fundamental para soluções automáticas é determinar *quantas* passagens do LaTeX (compilações) são necessárias para resolver quaisquer dependências de dados, garantindo assim que o documento final composto está atualizado e completo. Outra complexidade é identificar corretamente os programas externos que têm de ser executados para pré-processar partes do conteúdo do documento — por exemplo, executar BibTeX/BibLaTeX para produzir listas de referências ou correr aplicações gráficas mais especializadas como [MetaPost](https://tug.org/metapost.html) ou [Asymptote](https://asymptote.sourceforge.io/).

## Apresentando latexmk

Um pacote bem estabelecido para automatizar a compilação é [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), um grande script Perl incluído no TeX Live e usado pelo Overleaf para compilar os seus projetos LaTeX. `latexmk` ativa automaticamente o número necessário de execuções do LaTeX e executa os programas externos (auxiliares) necessários para processar partes do conteúdo do seu documento.

### Personalizando o latexmk

Embora `latexmk` seja extremamente versátil, diferentes ambientes de compilação LaTeX e a enorme variedade de tipos de documentos tornam impraticável para `latexmk` tentar fornecer soluções automáticas que deem suporte total às necessidades de todos os documentos LaTeX imagináveis. Em vez disso, o comportamento de `latexmk` pode ser personalizado através de ficheiros de configuração *implementados em **Perl***:

* um ficheiro de configuração “de todo o sistema” que atende ao ambiente/plataforma de computação específico, e
* um ficheiro de configuração ao nível do utilizador que trata de requisitos específicos do documento

O [`manual do latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) fornece mais detalhes sobre a instalação e a utilização de ficheiros de configuração.

## Ficheiro LatexMk do Overleaf

O ficheiro de configuração “de todo o sistema” do Overleaf segue `latexmk` as convenções (para Linux): chama-se `**LatexMk**` e está localizado na pasta `/usr/local/share/latexmk/`. **Nota**: esse ficheiro é lido *antes de* antes de quaisquer ficheiros de configuração ao nível do utilizador.

Os ficheiros de configuração ao nível do utilizador têm de se chamar `latexmkrc` e ser adicionados ao seu projeto Overleaf para fornecer regras personalizadas que tratem os requisitos específicos do seu projeto/documento LaTeX no Overleaf.

O `LatexMk` do Overleaf contém código para processamento específico do Overleaf, além de regras para glossários, nomenclatura e outros pacotes usados com frequência. O `LatexMk` do Overleaf pode apresentar alguma variação entre versões do TeX Live para acomodar alterações e atualizações feitas aos pacotes e às ferramentas de software dentro do próprio TeX Live.

### Alterando o modo de compilação do LaTeX

Por predefinição, o Overleaf instrui o latexmk a usar um modo de compilação a que nós (Overleaf) nos referimos como **Tentar compilar apesar dos erros**modo de continuidade [erros de compilação LaTeX](/latex/overleaf-learn-latex-pt/nocoes-basicas-de-latex/05-errors.md). Nesse modo de compilação, o compilador LaTeX não pára, apesar de encontrar

; poderá ser produzido um PDF, mesmo que contenha saída incorreta. Muitas vezes, os erros de compilação podem ser demasiado graves, ou numerosos, para o compilador LaTeX corrigir, pelo que ainda pode “abortar” sem produzir um PDF. [Pode alterar o modo de compilação do LaTeX para que a compilação pare imediatamente ao encontrar o primeiro erro: veja o artigo de ajuda](/latex/overleaf-learn-latex-pt/base-de-conhecimento/149-using-the-stop-on-first-error-compilation-mode.md) para mais informações.

### Como aceder a uma cópia do ficheiro LatexMk do Overleaf

A ligação seguinte abre um projeto para compor tipograficamente o Overleaf `LatexMk` ficheiro usado com o compilador LaTeX e a versão do TeX Live do seu projeto e também o disponibiliza para transferência:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Sobre este projeto}
Este projeto fornece acesso ao ficheiro de inicialização (configuração) do sistema \texttt{LatexMk} usado pelo Overleaf.  \texttt{LatexMk} é um script Perl que pode variar ligeiramente consoante a versão do \TeX{} Live e o compilador escolhidos para o projeto. Se precisar de ter 100\% de certeza de qual \texttt{LatexMk} está a ser usado, adicione o código deste projeto ao seu projeto e compile para compor uma listagem de \texttt{LatexMk} e torná-la disponível para transferência como um dos ficheiros de saída.
\section*{Listar o ficheiro \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Abra este código no 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)

Depois de compilar o projeto acima, o `LatexMk` ficheiro pode ser transferido através do botão **Registos e ficheiros de saída** como mostrado no seguinte breve vídeo:

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

### Outras notas e conselhos

Se quiser definir, ou verificar, a versão do TeX Live usada para compilar o seu projeto, consulte esta [publicação do blog do Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) ou o seguinte gráfico:

![Escolher a versão do TeX Live no Overleaf](/files/e2187b37ace0bdf467912c941f668ac250d6f430)

Se quiser construir o seu projeto Overleaf offline usando latexmk, poderá querer usar uma cópia do ficheiro LatexMk do Overleaf para garantir que este aplica o processo de compilação do Overleaf — note que o nome do trabalho do Overleaf é definido como output.

O Overleaf compila projetos usando o `-cd` sinalizador de linha de comandos do latexmk, e a compilação é sempre executada a partir do diretório raiz do projeto. Note que algumas `latexmk` opções não são compatíveis com o Overleaf — em particular, se definir as `$preview_continuous_mode` ou `$output_dir` opções, isso pode comprometer a pré-visualização no Overleaf.

Para mais informações sobre `latexmkrc` ficheiros lidos, consulte o artigo [Como usar latexmkrc com o Overleaf](/latex/overleaf-learn-latex-pt/artigos-aprofundados/28-how-to-use-latexmkrc-with-overleaf.md) que tem dicas e truques úteis dos nossos simpáticos TeXperts do Overleaf.

## Listagem do ficheiro LatexMk do Overleaf (2023)

Por conveniência, a listagem seguinte mostra o `LatexMk` ficheiro do Overleaf tal como usado com o TeX Live 2023 — use a ligação acima para aceder à versão mais recente.

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

# Solução alternativa para permitir transparência pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Pós-processamento do ficheiro pdf #
###############################

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

# equivalente à opção -gt. Usada para impedir que o latexmk ignore a recompilação
# de output.log e output.pdf
$go_mode = 3;

# equivalente à opção -bibtex. Executa bibtex incondicionalmente quando os ficheiros bbl estão
# desatualizados.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # obter a idade do PDF existente, se estiver 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;

    # Procurar um ficheiro de concordância do knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        A aplicar correções ao ficheiro synctex para knitr...\n
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Sair antecipadamente se o ficheiro pdf não existir ou não tiver sido atualizado
    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;

    # Descobrir onde está o 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});

    # Executar qpdf
    my $optimised_file = "${output_file}.opt";
    system($qpdf, split(' ', $qpdf_opts), $output_file, $optimised_file);
    $qpdf_exit_code = ($? >> 8);
    print "código de saída do qpdf=$qpdf_exit_code\n";

    # Substituir o ficheiro de saída se o qpdf tiver sido bem-sucedido
    # o qpdf devolve 0 em caso de sucesso, 3 para avisos (o PDF de saída ainda é criado)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "A renomear o ficheiro otimizado para $output_file\n";
    rename($optimised_file, $output_file);

    print "A extrair a tabela xref para $output_file\n";
    my $xref_file = "${output_file}xref";
    system("$qpdf --show-xref ${output_file} > ${xref_file}");
    $qpdf_xref_exit_code = ($? >> 8);
    print "código de saída do qpdf --show-xref=$qpdf_xref_exit_code\n";
}

##############
# Glossários #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # do 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: 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  #  # do 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;

    # identificar o ficheiro principal
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # alterar o diretório com âmbito limitado
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # executar chktex no ficheiro principal
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # voltar ao diretório original
        chdir($orig_dir);

        # no modo VALIDATE saímos sempre depois de executar chktex
        # caso contrário, saímos se EXIT_ON_ERROR estiver definido

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # o chktex não nos permite aceder à informação do erro através do estado de saída
            # por isso, procure na saída
            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/overleaf-learn-latex-pt/base-de-conhecimento/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.
