> 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/033-cross-referencing-with-the-xr-package-in-overleaf.md).

# Referencias cruzadas con el paquete xr en Overleaf

## Descripción general

El [`xr` paquete](https://ctan.org/pkg/xr?lang=en) te permite crear referencias cruzadas a ecuaciones, figuras, tablas, etc., contenidas en documentos LaTeX externos, siempre que esos documentos sean *independientes.* Un documento LaTeX independiente es uno que puede compilarse porque contiene una `\documentclass{...}` instrucción y el `\begin{document}`...`\end{document}` constructo.

### Resumen de uso

1. Escribe `\usepackage{xr}` en el preámbulo del archivo LaTeX que necesita crear referencias cruzadas al contenido contenido en archivos LaTeX externos.
2. Use el `xr` comando del paquete `\externaldocument{filename}` para especificar el/los documento(s) externo(s) cuyo contenido quieres referenciar cruzadamente.

El `xr` paquete funciona usando las etiquetas de referencia cruzada contenidas en los `.aux` archivos generados cuando se compilan los documentos LaTeX externos.

### Cómo funcionan las referencias cruzadas (un breve resumen)

Para referenciar cruzadamente un elemento en un documento LaTeX necesitas:

1. Asignarle un identificador único, `some_string`, usando el `\label` comando:

```latex
\label{some_string}
```

3. En la ubicación donde quieres hacer referencia a ese elemento, necesitas escribir

```latex
\ref{some_string}
```

En pocas palabras, LaTeX gestiona las referencias cruzadas escribiendo datos en un archivo llamado `filename.aux` donde `filename` es el nombre del archivo principal `.tex` que se está compilando.

Para que el proceso funcione, el documento LaTeX debe compilarse al menos dos veces: la primera compilación *genera* los datos de referencia, escribiéndolos en `filename.aux`. Durante la segunda compilación, LaTeX *lee* `filename.aux` para resolver las referencias, proporcionando datos para reemplazar las instancias de `\ref{some_string}`.

* Para más detalles sobre las referencias cruzadas, consulta el artículo de Overleaf [Referencias cruzadas de secciones, ecuaciones y elementos flotantes](/latex/es/estructura-del-documento/03-cross-referencing-sections-equations-and-floats.md).

## Proyectos en los que no se requiere el paquete xr

Los proyectos grandes de LaTeX, como libros o informes largos, a menudo se dividen en una serie de `.tex` archivos más pequeños, uno por capítulo, con el `.tex` archivo de cada capítulo añadido al documento principal de LaTeX mediante `\input` o `\include`. Normalmente, esos capítulos no son independientes: no puedes compilar capítulos individuales porque no contienen una `\documentclass{...}` instrucción o el `\begin{document}...\end{document}` construcción. Esos capítulos están destinados a la *inclusión* en un documento "contenedor" que *puede* compilarse. En esas circunstancias, las referencias cruzadas a elementos del documento —dentro de cualquier archivo de capítulo individual— pueden realizarse con normalidad: no necesitas usar el `xr` paquete.

Para explorar un ejemplo de un proyecto grande puedes [abrir este ejemplo en Overleaf.](https://www.overleaf.com/project/new/template/20618?id=70769185\&templateName=Managing+a+large+project+on+Overleaf\&latexEngine=pdflatex\&texImage=texlive-full%3A2020.1\&mainFile=)

## Ejemplo de un proyecto en el que se requiere el paquete xr

Supón que tienes un conjunto de documentos LaTeX independientes, como una colección de N artículos: `article1.tex`, `article2.tex` ... `articleN.tex`. Cada uno de esos artículos puede compilarse por separado y es probable que se hayan escrito usando una variedad de clases de documento, paquetes, etc.

Ahora imagina que quieres usar LaTeX para escribir una descripción general o un resumen de esos artículos —llamaremos a nuestro archivo `summary.tex`. Nuestro resumen necesita hacer referencia a secciones, figuras, tablas, ecuaciones, etc. contenidas en esos artículos individuales, independientes y N. ¿Cómo podemos hacerlo?

El `xr` paquete te permite hacer esto: permite `summary.tex` usar etiquetas de referencia generadas por cualquiera de los `article*.tex` archivos.

### Una nota sobre los archivos .aux

* Nota: aquí estamos usando un asterisco (`*`) como marcador de posición para cualquier número del 1 al N.

Compilar cualquiera de los archivos independientes `article1.tex`, `article2.tex` ... `articleN.tex` hace que LaTeX genere un correspondiente `article*.aux` (\*\*`aux`\*\*iliar) archivo que, entre otras cosas, contiene datos de etiquetas necesarios para generar referencias cruzadas.

Si cualquiera de los `article*.tex` archivos se edita —por ejemplo, para cambiar, añadir o eliminar etiquetas (`\label{...}`)—, el/los `article*.tex` archivo(s) correspondiente(s) debe(n) recompilarse para actualizar el `article*.aux` archivo(s) de tu proyecto.

Detectar cambios en `article*.tex`y, posteriormente, recompilarlos, puede automatizarse en Overleaf usando un `latexmkrc` archivo.

## Cómo usar xr en Overleaf

Usaremos una versión simplificada de nuestro ejemplo de varios artículos; en particular, mostraremos cómo automatizar el proceso de compilación mediante un `latexmkrc` editable [proporcionado a Overleaf por John Collins](#code-for-latexmkrc) ([mantenedor de `latexmk`](https://ctan.org/pkg/latexmk?lang=en)).

### Archivos usados en nuestro ejemplo

Nuestro ejemplo usa los siguientes archivos:

* `**summary.tex**`: este es nuestro documento de resumen. Lo necesitamos para referenciar contenido contenido en `article1.tex`, como figuras y secciones.
  * `summary.tex` carga el `xr` paquete y usa `\externaldocument{article1}` para especificar que los datos de referencia de `article1.aux` deben utilizarse.
* `**article1.tex**`: un único artículo independiente que contiene referencias cruzadas internas. Compilar `article1.tex` genera los datos de referencia cruzada contenidos en el archivo `article1.aux`.
  * Un archivo externo como `article1.tex` que podría haber sido escrito por otra persona, para que lo uses "tal como se suministra", es decir, sin tocarlo.
* `**latexmkrc**`: contiene código (Perl) para automatizar la recompilación de `article1.tex` debido a cualquier cambio realizado en él—para crear un `article1.aux` archivo.
  * Nuestro `latexmkrc` archivo fue [proporcionado a Overleaf por John Collins](#code-for-latexmkrc) ([mantenedor de `latexmk`](https://ctan.org/pkg/latexmk?lang=en)).

### Acerca del comando \externaldocument

El `xr` paquete proporciona el`\externaldocument` comando, que tiene la forma general

```latex
\externaldocument[prefix]{external_file}
```

* **`prefijo` (opcional):** Este argumento opcional te permite definir un prefijo que se añadirá a todas las etiquetas importadas del documento externo. Esto es útil para evitar conflictos si se usan los mismos nombres de etiqueta en varios documentos.
* **`external_file` (obligatorio):** Este argumento obligatorio especifica el nombre del documento externo de LaTeX (sin la `.tex` extensión) del que deseas importar referencias. El `xr` paquete buscará el `.aux` archivo correspondiente a `external_file` (por ejemplo, `external_file.aux`) para recuperar las etiquetas.

A modo de ejemplo, si nuestro archivo principal `.tex` editable `summary.tex` y el archivo externo, `article1.tex` ambos contienen la etiqueta `\label{eq:1}` entonces tenemos un conflicto de nombres de etiquetas. Ese conflicto puede evitarse escribiendo

```latex
\externaldocument[art1-]{article1}
```

en cuyo caso todas las etiquetas creadas al compilar `article1.tex` llevan como prefijo `art1-`. Ahora puedes acceder a `\label{eq:1}`, contenida en `article1.tex`, escribiendo `\ref{art1-eq:1}` en `summary.tex`.

### Los archivos del proyecto

#### article1.tex

El siguiente código puede abrirse en Overleaf mediante el enlace debajo del listado.

```latex
\documentclass{article}
\title{Este es \texttt{article1.tex}}
\begin{document}
\section{Introducción}
\label{introduction}

Este es un documento \LaTeX{} independiente con
referencias que queremos usar en \texttt{summary.tex}.

\subsection{Referencias matemáticas}
\label{mathrefs}
Como se menciona en la sección \ref{introduction},
se pueden referenciar distintos elementos dentro de
un documento.

\subsection{Series de potencias}
\label{powers}

\begin{equation}
\label{eq:1}
\sum_{i=0}^{\infty} a_i x^i
\end{equation}

La ecuación \ref{eq:1} es una serie de potencias típica.
\end{document}
```

[Abrir `article1.tex` en Overleaf](https://www.overleaf.com/docs?engine=%5B%5B%3ATemplate%3AEngine%5D%5D}\&snip_name\[]=readme.txt\&snip\[]=A+project+created+from+the+Overleaf+wiki\&snip_name\[]=article1.tex\&main_document=article1.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Ctitle%7BThis+is+%5Ctexttt%7Barticle1.tex%7D%7D%0A%5Cbegin%7Bdocument%7D%0A%5Csection%7BIntroduction%7D%0A%5Clabel%7Bintroduction%7D%0A%0AThis+is+a+standalone+%5CLaTeX%7B%7D+document+with%0Areferences+we+want+to+use+in+%5Ctexttt%7Bsummary.tex%7D.%0A%0A%5Csubsection%7BMath+references%7D%0A%5Clabel%7Bmathrefs%7D%0AAs+mentioned+in+section+%5Cref%7Bintroduction%7D%2C+%0Adifferent+elements+can+be+referenced+within%0Aa+document.%0A%0A%5Csubsection%7BPowers+series%7D%0A%5Clabel%7Bpowers%7D%0A%0A%5Cbegin%7Bequation%7D%0A%5Clabel%7Beq%3A1%7D%0A%5Csum_%7Bi%3D0%7D%5E%7B%5Cinfty%7D+a_i+x%5Ei%0A%5Cend%7Bequation%7D%0A%0AEquation+%5Cref%7Beq%3A1%7D+is+a+typical+power+series.%0A%5Cend%7Bdocument)

Compilación `article1.tex` produce la siguiente salida:

![Salida producida al compilar el archivo article1.tex en Overleaf](/files/19935254f60540f7cf9170f924bda7e05a426ae3)

#### summary.tex

Aquí está nuestro archivo inicial `summary.tex` editable *antes de que* hemos especificado qué documento externo queremos referenciar. Para simplificar, `summary.tex` no contiene ningún `\label` comandos porque no hay referencias cruzadas internas. Todos los `\ref` comandos se refieren a etiquetas generadas por `\label` comandos contenidos en `article1.tex`.

```latex
\documentclass{article}
\usepackage{xr}
\title{Este es \texttt{summary.tex}}
\begin{document}
En el archivo \texttt{article1.tex}, la introducción es la sección \ref{introduction}. En ese archivo, hay dos subsecciones: \ref{mathrefs} y \ref{powers}. En la subsección \ref{powers}, la ecuación \ref{eq:1} muestra una serie de potencias.
\end{document}
```

[Abre este *incompleto* `summary.tex` en Overleaf](https://www.overleaf.com/docs?engine=%5B%5B%3ATemplate%3AEngine%5D%5D}\&snip_name\[]=readme.txt\&snip\[]=A+project+created+from+the+Overleaf+wiki\&snip_name\[]=summary.tex\&main_document=summary.tex\&snip\[]=%5Cdocumentclass%7Barticle%7D%0A%5Cusepackage%7Bxr%7D%0A%5Ctitle%7BThis+is+%5Ctexttt%7Bsummary.tex%7D%7D%0A%5Cbegin%7Bdocument%7D%0AIn+the+file+%5Ctexttt%7Barticle1.tex%7D%2C+the+introduction+is+section+%5Cref%7Bintroduction%7D.++In+that+file%2C+there+are+two+subsections%3A+%5Cref%7Bmathrefs%7D+and+%5Cref%7Bpowers%7D.+In+subsection+%5Cref%7Bpowers%7D%2C+equation+%5Cref%7Beq%3A1%7D+demonstrates+a+power+series.%0A%5Cend%7Bdocument%7D)

Si compilamos esta versión de `summary.tex` intentará leer datos de referencia de `summary.aux` pero los datos requeridos están contenidos en el archivo externo `article1.aux` al que todavía no se puede acceder.

Al compilar este `summary.tex` archivo, se produce la siguiente salida, con dobles signos de interrogación que muestran referencias indefinidas:

![Imagen que muestra el informe de referencias faltantes](/files/cade2cef21d15e35a4e8b05883cd9b90d925e121)

### Especificando el documento externo

El siguiente paso es especificar `article1` como el nombre del documento externo cuyas etiquetas queremos referenciar. Añade la siguiente línea al preámbulo de `summary.tex`:

```latex
\externaldocument{article1}
```

Aquí, `article1` puede sustituirse por cualquier archivo cuyas etiquetas quieras usar: puedes usar varios `\externaldocument` comandos para acceder a archivos externos adicionales.

### Creando el archivo latexmkrc

El siguiente paso es crear un `latexmkrc` archivo como se muestra a continuación:

* En la ventana del editor de tu proyecto, selecciona el **Archivo nuevo** icono en la parte superior izquierda de la ventana del proyecto.
* Selecciona **Archivo nuevo** en el **cuadro de diálogo emergente** Agregar archivos y nombra el archivo `latexmkrc`—observa que no hay extensión de archivo:

![Creando un archivo latexmkrc en Overleaf](/files/aa9e319b83a58e08f531a8e60cdadd7ea7042fd0)

* Asegúrate de que el `latexmkrc` archivo se cree y se guarde en el nivel superior (raíz) del área de archivos del proyecto. Es decir, no dentro de ninguna carpeta del árbol de archivos.
* Copia y pega el siguiente código en tu `latexmkrc` archivo.

#### Código para latexmkrc

Overleaf agradece a John Collins, [mantenedor de `latexmk`](https://ctan.org/pkg/latexmk?lang=en), por ponerse en contacto con nosotros para proporcionarnos el siguiente `latexmkrc` archivo, que nos complace publicar íntegramente, incluidos los comentarios en línea sumamente útiles.

```perl
# Esto muestra cómo usar el paquete xr con latexmk.
# John Collins 2023-03-29
#
# El paquete xr ("un sistema para referencias externas") es utilizado por un documento
# para hacer referencias a secciones, ecuaciones, etc. en otros
# documentos.
# Las definiciones de este archivo permiten que latexmk aplique latexmk a
# actualizar automáticamente un documento externo cada vez que su archivo .tex cambie,
# para que las referencias del documento principal se mantengan actualizadas.

# Notas:
#    1. Esta versión está definida para colocar los archivos de las compilaciones de
#       los documentos externos en un subdirectorio definido, para separar
#       potencialmente muchos archivos generados de los directorios del documento
#       principal.
#    2. Pero para usar el mecanismo de dependencias personalizadas de latexmk, como aquí,
#       el archivo aux generado al compilar un subdocumento debe generarse en
#       el mismo directorio que el archivo fuente .tex correspondiente.  Por eso,
#       se copia el archivo .aux.
#    3. Se asume que los documentos externos serán compilados con
#       pdflatex.  Esto puede cambiarse, por supuesto, modificando la opción '-pdf'
#       pasada al latexmk invocado por la que sea necesaria.
#    4. Una implementación ideal también garantizaría que la recompilación de un
#       documento externo también ocurra cada vez que cualquiera de sus otros archivos fuente
#       cambie.  Pero esto no se hace en la versión actual, y
#       probablemente implicaría el uso de variables internas de latexmk
#       o mejoras adicionales en latexmk.
#    5. El código utiliza las subrutinas copy y fileparse que se cargan desde
#       latexmk desde los paquetes Perl File::Copy y File::Basename.
#    6. También usa algunas funciones de latexmk aún no documentadas: una variable de matriz
#       @file_not_found y las subrutinas popd, pushd y
#       rdb_add_generated.

#--------------------
# Opciones configurables para la compilación de documentos externos

# Subdirectorio para los archivos de salida de la compilación de documentos externos:
$sub_doc_output = 'output-subdoc';

# Opciones que se proporcionarán a latexmk para la compilación de documentos externos:
@sub_doc_options = ();

push @sub_doc_options, '-pdf'; # Usar pdflatex para la compilación de documentos externos.
# Sustituye '-pdf' por '-pdfdvi', 'pdfxe' o 'pdflua' si es necesario.

#--------------------

# Añade un patrón para el mensaje del archivo de registro de xr sobre archivos faltantes a la
# lista.  La variable @file_not_found de Latexmk aún no está documentada.
# Esta línea no es necesaria para la versión 4.80 o posterior de latexmk.
push @file_not_found, '^No file\\s*(.+)\\s*$';

add_cus_dep( 'tex', 'aux', 0, 'makeexternaldocument' );
sub makeexternaldocument {
    if ( $root_filename ne $_[0] )  {
        my ($base_name, $path) = fileparse( $_[0] );
        pushd $path;
        my $return = system "latexmk",
                            @sub_doc_options,
                            "-aux-directory=$sub_doc_output",
                            "-output-directory=$sub_doc_output",
                            $base_name;
        if ( ($sub_doc_output ne '') && ($sub_doc_output ne '.') ) {
               # En este caso, el archivo .aux generado por pdflatex no está en el mismo
               # directorio que el archivo .tex.
               # Por lo tanto:
               # 1. El archivo .aux realmente generado debe figurar como producido por esta
               #    regla, para que latexmk gestione correctamente las dependencias.
               #    (Problema a superar: si $sub_dir_output es el mismo que $aux_dir
               #    para el documento principal, xr puede leer el archivo .aux en el
               #    aux_dir en lugar del que latexmk supone que producirá la dependencia
               #    personalizada, que está en el mismo directorio que el archivo fuente
               #    .tex para esta dependencia personalizada.)
               #    Usa la subrutina de latexmk aún no documentada rdb_add_generated
               #    para hacer esto:
               # 2. Debe haber una copia del archivo .aux en el mismo directorio que el archivo .tex
               #    para satisfacer la definición de dependencia personalizada de latexmk.
             rdb_add_generated( "$sub_doc_output/$base_name.aux" );
             copy "$sub_doc_output/$base_name.aux", ".";
        }
        popd;
        return $return;
   }
}
```

### Abre un proyecto de Overleaf que demuestra xr

El siguiente proyecto de tres archivos ahora puede abrirse en Overleaf usando los enlaces proporcionados arriba y abajo de los listados de archivos. Ten en cuenta que el `latexmkrc` archivo contiene el código proporcionado por John Collins, pero, para abreviar, la mayoría de los comentarios se han eliminado.

[Abre este ejemplo de tres archivos en Overleaf.](/latex/es/base-de-conocimientos/033-cross-referencing-with-the-xr-package-in-overleaf.md)

**summary.tex**

Este es nuestro archivo de resumen. Desde este archivo queremos usar referencias cruzadas creadas en archivos externos. Aquí queremos usar etiquetas generadas en `article1.tex`.

```latex
\documentclass[12pt]{article}
\usepackage{xr}

\title{Uso del paquete xr en Overleaf}
% ¡pon todos los documentos externos aquí!
\externaldocument{article1}

\begin{document}

En el archivo \texttt{article1.tex}, la introducción es la sección \ref{introduction}. En ese archivo, hay dos subsecciones: \ref{mathrefs} y \ref{powers}. En la subsección \ref{powers}, la ecuación \ref{eq:1} muestra una serie de potencias.

\end{document}
```

**article1.tex**

Este archivo es uno de nuestros artículos. Observa cómo contiene varios `\label` comandos para crear etiquetas que, gracias al `xr` paquete, podemos usar en el archivo `summary.tex`.

```latex
\documentclass{article}
\title{Este es \texttt{article1.tex}}
\begin{document}
\section{Introducción}
\label{introduction}

Este es un documento \LaTeX{} independiente con
referencias que queremos usar en \texttt{summary.tex}.

\subsection{Referencias matemáticas}
\label{mathrefs}
Como se menciona en la sección \ref{introduction},
se pueden referenciar distintos elementos dentro de
un documento.

\subsection{Series de potencias}
\label{powers}

\begin{equation}
\label{eq:1}
\sum_{i=0}^{\infty} a_i x^i
\end{equation}

La ecuación \ref{eq:1} es una serie de potencias típica.
\end{document}
```

**latexmkrc**

Este `latexmkrc` archivo contiene código para garantizar que los archivos externos se compilen.

```latex
$sub_doc_output = 'output-subdoc';

@sub_doc_options = ();

push @sub_doc_options, '-pdf'; # Usar pdflatex para la compilación de documentos externos.
# Sustituye '-pdf' por '-pdfdvi', 'pdfxe' o 'pdflua' si es necesario.

push @file_not_found, '^No file\\s*(.+)\\s*$';

add_cus_dep( 'tex', 'aux', 0, 'makeexternaldocument' );
sub makeexternaldocument {
    if ( $root_filename ne $_[0] )  {
        my ($base_name, $path) = fileparse( $_[0] );
        pushd $path;
        my $return = system "latexmk",
                            @sub_doc_options,
                            "-aux-directory=$sub_doc_output",
                            "-output-directory=$sub_doc_output",
                            $base_name;
        if ( ($sub_doc_output ne '') && ($sub_doc_output ne '.') ) {

             rdb_add_generated( "$sub_doc_output/$base_name.aux" );
             copy "$sub_doc_output/$base_name.aux", ".";
        }
        popd;
        return $return;
   }
}
```

[Abre este ejemplo de tres archivos en Overleaf.](/latex/es/base-de-conocimientos/033-cross-referencing-with-the-xr-package-in-overleaf.md)

El siguiente gráfico es una versión anotada de la salida al maquetar `summary.tex`, mostrando las referencias cruzadas y las etiquetas correspondientes del archivo externo `article1.tex`.

![Mostrando referencias importadas desde un archivo externo](/files/cb59a3696b6c50fa7acad2afdf3c369101d1f87c)

* Para más detalles sobre las referencias cruzadas, consulta el artículo de Overleaf [Referencias cruzadas de secciones, ecuaciones y elementos flotantes](/latex/es/estructura-del-documento/03-cross-referencing-sections-equations-and-floats.md).

## Una nota sobre errores de sintaxis

Para tu archivo principal del proyecto, puedes usar el [modo de compilación "Detenerse en el primer error"](/latex/es/base-de-conocimientos/149-using-the-stop-on-first-error-compilation-mode.md) para asegurarte de que la compilación termine inmediatamente al detectar el primer error. Esto puede ayudar a aislar e identificar errores en tu código, en lugar de permitir que los errores se propaguen, lo que hace mucho más difícil encontrar y depurar problemas.

El *external* los documentos se compilan automáticamente mediante el `latexmkrc` archivo; en consecuencia, cualquier error de sintaxis de LaTeX en ellos no se mostrará en la interfaz de Overleaf, a menos que también los recompiles en Overleaf. Los errores en esos archivos externos podrían impedir que las referencias cruzadas aparezcan correctamente en el PDF maquetado, por lo que recomendamos encarecidamente comprobar y corregir cualquier error de ese tipo en cuanto ocurra.


---

# 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/033-cross-referencing-with-the-xr-package-in-overleaf.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.
