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

# ¿Cómo compila Overleaf mi proyecto?

## Automatización de la compilación de LaTeX

Para admitir funciones como la tabla de contenidos, las listas de figuras, las referencias cruzadas, los glosarios, el índice y las citas bibliográficas, LaTeX utiliza un proceso de composición tipográfica de múltiples pasadas: los datos producidos en una pasada (compilación) se escriben en archivo(s) y se usan como entrada para cualquier pasada(s) posterior(es) que puedan ser necesarias. El siguiente video muestra qué ocurre cada vez que haces clic en el botón “Recompilar” en tu proyecto de Overleaf:

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

Al realizar una compilación manual, normalmente es evidente si se requiere otra ejecución de LaTeX (pasada), pero automatizar la compilación de LaTeX presenta una serie de dificultades. Un desafío clave para las soluciones automatizadas es determinar *cuántas* pasadas de LaTeX (compilaciones) se necesitan para resolver cualquier dependencia de datos, garantizando así que el documento final compuesto esté actualizado y completo. Otra complejidad es identificar correctamente los programas externos que deben ejecutarse para preprocesar partes del contenido del documento —como ejecutar BibTeX/BibLaTeX para producir listas de referencias o ejecutar aplicaciones gráficas más especializadas, como [MetaPost](https://tug.org/metapost.html) o [Asymptote](https://asymptote.sourceforge.io/).

## Presentando latexmk

Un paquete bien establecido para automatizar la compilación es [`latexmk`](https://ctan.org/pkg/latexmk?lang=en), un gran script Perl incluido en TeX Live y utilizado por Overleaf para compilar tus proyectos de LaTeX. `latexmk` dispara automáticamente el número necesario de ejecuciones de LaTeX y ejecuta los programas externos (auxiliares) requeridos para procesar partes del contenido de tu documento.

### Personalización de latexmk

Aunque `latexmk` es extremadamente versátil, los distintos entornos de compilación de LaTeX y la enorme variedad de tipos de documento hacen que sea poco práctico para `latexmk` intentar proporcionar soluciones automatizadas que satisfagan plenamente las necesidades de cualquier documento de LaTeX imaginable. En cambio, el comportamiento de `latexmk` puede personalizarse mediante archivos de configuración *implementados en **Perl***:

* un archivo de configuración “a nivel de sistema” que atiende al entorno/plataforma informática específica, y
* un archivo de configuración a nivel de usuario que maneja los requisitos específicos del documento

El [`manual de latexmk`](http://mirrors.ctan.org/support/latexmk/latexmk.pdf) proporciona más detalles sobre la instalación y el uso de archivos de configuración.

## Archivo LatexMk de Overleaf

El archivo de configuración “a nivel de sistema” de Overleaf sigue `latexmk` las convenciones (para Linux): se llama `**LatexMk**` y está ubicado en la carpeta `/usr/local/share/latexmk/`. **Nota**: ese archivo se lee *antes de que* los archivos de configuración a nivel de usuario.

Los archivos de configuración a nivel de usuario deben llamarse `latexmkrc` y añadirse a tu proyecto de Overleaf para proporcionar reglas personalizadas que aborden los requisitos específicos de tu proyecto/documento LaTeX en Overleaf.

El `LatexMk` de Overleaf contiene código para el procesamiento específico de Overleaf, además de reglas para glosarios, nomenclatura y otros paquetes de uso común. El `LatexMk` de Overleaf puede mostrar alguna variación entre versiones de TeX Live para acomodar cambios y actualizaciones realizadas a los paquetes y herramientas de software dentro del propio TeX Live.

### Cambiar el modo de compilación de LaTeX

De forma predeterminada, Overleaf indica a latexmk que use un modo de compilación al que nosotros (Overleaf) nos referimos como **Intentar compilar a pesar de los errores**. En ese modo de compilación, el compilador de LaTeX no se detiene, a pesar de encontrar [errores de compilación de LaTeX](/latex/es/conceptos-basicos-de-latex/05-errors.md); podría generarse un PDF, incluso si contiene salida incorrecta. A menudo, los errores de compilación pueden ser demasiado graves, o demasiados, para que el compilador de LaTeX los corrija, por lo que aún podría “abortar” sin producir un PDF.

Puedes cambiar el modo de compilación de LaTeX para que la compilación se detenga inmediatamente al encontrar el primer error: consulta el artículo de ayuda [Usar el modo de compilación Detener en el primer error](/latex/es/base-de-conocimientos/149-using-the-stop-on-first-error-compilation-mode.md) para obtener más información.

### Cómo acceder a una copia del archivo LatexMk de Overleaf

El siguiente enlace abre un proyecto para componer tipográficamente el archivo de Overleaf `LatexMk` archivo que se está usando con el compilador de LaTeX y la versión de TeX Live de tu proyecto y también lo pone disponible para descarga:

```latex
\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{verbatim,shellesc}
\ShellEscape{cp /usr/local/share/latexmk/LatexMk ./LatexMk}
\begin{document}
\section*{Acerca de este proyecto}
Este proyecto proporciona acceso al archivo de inicialización (configuración) del sistema \texttt{LatexMk} utilizado por Overleaf.  \texttt{LatexMk} es un script Perl que puede variar ligeramente según la versión de \TeX{} Live y el compilador elegidos para el proyecto. Si necesitas estar 100\% seguro de cuál \texttt{LatexMk} se está usando, añade el código de este proyecto a tu proyecto y compílalo para componer un listado de \texttt{LatexMk} y ponerlo disponible para descarga como uno de los archivos de salida.
\section*{Listado del archivo \texttt{LatexMk}}
\verbatiminput{./LatexMk}
\end{document}
```

[Abre este código en 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)

Después de compilar el proyecto anterior, el `LatexMk` archivo se puede descargar mediante el botón **Registros y archivos de salida** como se muestra en el siguiente breve video:

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

### Otras notas y consejos

Si deseas establecer o verificar la versión de TeX Live utilizada para compilar tu proyecto, consulta esta [entrada del blog de Overleaf](https://www.overleaf.com/blog/new-feature-select-your-tex-live-compiler-version#How-Switch) o el siguiente gráfico:

![Elegir la versión de TeX Live de Overleaf](/files/6eb795d635d277ab4e775417a776dc2c9b3b0a78)

Si quieres compilar tu proyecto de Overleaf sin conexión usando latexmk, quizá quieras usar una copia del archivo LatexMk de Overleaf para asegurarte de que aplica el proceso de compilación de Overleaf —nota que el nombre del trabajo de Overleaf está establecido en output.

Overleaf compila los proyectos usando la opción `-cd` de la línea de comandos de latexmk, y la compilación siempre se ejecuta desde el directorio raíz del proyecto. Ten en cuenta que algunas `latexmk` opciones no son compatibles con Overleaf; en particular, si estableces las opciones `$preview_continuous_mode` o `$output_dir` , eso puede romper la vista previa en Overleaf.

Para obtener más información sobre `latexmkrc` archivos, lee el artículo [Cómo usar latexmkrc con Overleaf](/latex/es/articulos-en-profundidad/28-how-to-use-latexmkrc-with-overleaf.md) que tiene consejos y trucos útiles de nuestros amables TeXpertos de Overleaf.

## Un listado del archivo LatexMk de Overleaf (2023)

Por conveniencia, el siguiente listado muestra el `LatexMk` archivo de Overleaf tal como se usa con TeX Live 2023; usa el enlace de arriba para acceder a la versión más reciente.

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

# Solución alternativa para permitir la transparencia de pstricks (https://github.com/overleaf/issues/issues/3449)
$dvipdf = "dvipdf -dNOSAFER -dALLOWPSTRANSPARENCY %O %S %D";

###############################
# Posprocesamiento del archivo pdf #
###############################

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

# equivalente a la opción -gt. Se usa para evitar que latexmk omita la recompilación
# de output.log y output.pdf
$go_mode = 3;

# equivalente a la opción -bibtex. Ejecuta bibtex incondicionalmente cuando los archivos bbl están
# desactualizados.
$bibtex_use = 2;

my $ORIG_PDF_AGE;

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

    # obtener la antigüedad del pdf existente si está 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;

    # Buscar un archivo concordance de knitr
    my $concordance_file = "${source_without_ext}-concordance.tex";
    if (-e $concordance_file) {
        print "Aplicando parche al archivo synctex para knitr...\n";
        system("patchSynctex.R", $source_without_ext, $output_without_ext);
    }

    # Devuelve antes si el archivo pdf no existe o no se actualizó
    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;

    # Averiguar dónde está 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});

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

    # Reemplazar el archivo de salida si qpdf tuvo éxito
    # qpdf devuelve 0 para éxito, 3 para advertencias (el archivo pdf de salida aún se crea)
    return if !($qpdf_exit_code == 0 || $qpdf_exit_code == 3);
    print "Renombrando el archivo optimizado a $output_file\n";
    rename($optimised_file, $output_file);

    print "Extrayendo la tabla 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 salida de qpdf --show-xref=$qpdf_xref_exit_code\n";
}

##############
# Glosarios #
##############
add_cus_dep( 'glo', 'gls', 0, 'glo2gls' );
add_cus_dep( 'acn', 'acr', 0, 'glo2gls');  # de 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  #  # de 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 el archivo principal
    my $target = $ARGV[-1];
    my $file = basename($target);

    if ($file =~ /\.tex$/) {
        # cambiar de directorio por un alcance limitado
        my $orig_dir = cwd();
        my $subdir = dirname($target);
        chdir($subdir);
        # ejecutar chktex en el archivo principal
        $status = system("/usr/local/bin/run-chktex.sh", $orig_dir, $file);
        # volver al directorio original
        chdir($orig_dir);

        # en modo VALIDATE siempre salimos después de ejecutar chktex
        # de lo contrario salimos si CHKTEX_EXIT_ON_ERROR está establecido

        if ($ENV{'CHKTEX_EXIT_ON_ERROR'} || $ENV{'CHKTEX_VALIDATE'}) {
            # chktex no nos permite acceder a la información del error mediante el estado de salida
            # así que revisa la salida
            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/es/base-de-conocimientos/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.
