> 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/articulos-en-profundidad/06-an-introduction-to-kpathsea-and-how-tex-engines-search-for-files.md).

# Una introducción a Kpathsea y a cómo los motores TeX buscan archivos

## Introducción

Este artículo ofrece una introducción a cómo los motores TeX localizan los archivos necesarios para componer tu documento—usando LaTeX o cualquier otro paquete de macros. Aunque Overleaf libera a los usuarios de los desafíos de gestionar una instalación de TeX ([TeX Live](https://www.tug.org/texlive/)), los conceptos básicos de cómo los motores TeX buscan archivos serán útiles/interesantes si quieres crear una estructura de carpetas para ayudar a gestionar tu proyecto de Overleaf.

¿Por qué podría ser cierto? Si almacenas algunos de los archivos de tu proyecto de Overleaf dentro de carpetas, entonces LaTeX podría no encontrar esos archivos porque, de forma predeterminada, el motor TeX (compilador) quizá no *sepa* que necesita buscar en esas carpetas—por lo tanto no encontrará los archivos que contienen. Para evitarlo, puedes crear y añadir a tu proyecto un archivo de configuración llamado un [archivo latexmkrc](https://mg.readthedocs.io/latexmk.html#configuration-files) que puede usarse para indicar a un motor TeX que tus carpetas existen y que debe buscarlas.

Si quieres saltar a un ejemplo que muestra un archivo latexmkrc, puedes leer este artículo de ayuda: [Cómo usar latexmkrc con Overleaf: ejemplos y técnicas](/latex/es/articulos-en-profundidad/28-how-to-use-latexmkrc-with-overleaf.md). Quizá no sea inmediatamente obvio cómo, o por qué, ese archivo latexmkrc realmente funciona. Si te gustaría saber por qué y, quizá, desarrollar una mejor comprensión para usarlo con más posibilidades de configuración para tu proyecto, entonces sigue leyendo... Al final de este artículo trabajaremos un [ejemplo práctico](#kpathsea-and-texinputs-latexmkrc-file-to-the-rescue)—usando nuestro conocimiento de cómo TeX busca archivos—para crear un archivo latexmkrc para gestionar carpetas anidadas que contienen tus archivos de gráficos.

## TeX e independencia de plataforma

Cuando Knuth creó TeX, la independencia de plataforma fue un principio central que guió su diseño e implementación y esa filosofía se refleja en todas las operaciones internas de TeX (por ejemplo, uso de aritmética entera, manejo de cadenas “artesanal”, gestión de memoria, etc.). Incluso hoy, la independencia de plataforma de los motores modernos basados en TeX sigue planteando preguntas y debates en foros públicos; por ejemplo, consulta esta discusión en tex.stackexchange: [¿Son XeTeX y LuaTeX dependientes de la plataforma?](https://tex.stackexchange.com/questions/94297/are-xetex-and-luatex-platform-dependent) que contiene comentarios y observaciones hechas por varios expertos conocidos en TeX.

Sin embargo, por ahora dejemos de lado los detalles más finos y observemos que los motores TeX sí necesitan seguir siendo altamente portables—capaces de funcionar en múltiples sistemas operativos y producir resultados “idénticos”. Un aspecto clave de la portabilidad es buscar archivos de una manera independiente de la plataforma.

## ¿Los motores TeX no buscan archivos... de verdad!?

No, los motores TeX no *directamente* buscan archivos *por sí mismos*. Al procesar un `.tex` archivo, un motor TeX podría identificar la necesidad de abrir un archivo concreto, pero *delega* la tarea de encontrarlo a otro programa llamado [*Kpathsea*](https://tug.org/kpathsea/): una biblioteca de software externa que no forma parte del *código fuente* de los motores TeX. Lo que Kpathsea proporciona es, en efecto, una API ([Interfaz de Programación de Aplicaciones](https://en.wikipedia.org/wiki/Application_programming_interface)) que los motores TeX (además de BibTeX, MetaPost y otras aplicaciones) pueden invocar siempre que necesiten abrir un archivo concreto: Kpathsea realiza el trabajo real de localizar ese archivo.

Cuando Knuth escribió el motor TeX original—del cual descienden, en última instancia, todos los demás motores TeX—el problema de encontrar/abrir archivos era un desafío importante debido, en parte, al ecosistema tecnológico muy dispar de aquella época. De hecho, en el código fuente de TeX Knuth se refiere a la entrada/salida de archivos como la “ruina de la portabilidad” (véase la página 12, sección 25 de [TeX: El programa](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)).

La comunidad de TeX reconoció la necesidad de armonizar (estandarizar) la búsqueda de archivos para TeX—*y el software relacionado con TeX*—y decidió proporcionar a TeX las herramientas para hacerlo. Para abordar el problema muy espinoso de un método independiente de la plataforma para encontrar archivos, Karl Berry, un miembro destacado de la comunidad TeX, escribió el software para resolver el problema de búsqueda de *ruta*-búsqueda: una solución que llamó [**Kpathsea**](http://tug.org/texinfohtml/kpathsea.html)—que se deriva de **K**arl’s **Path** **Sea**rching (see this [entrevista con Karl Berry](http://www.tug.org/interviews/berry.html)).

Podemos señalar que se llama K**ruta**sea y no K**editable**sea porque, como indica la [documentación](http://tug.org/texinfohtml/kpathsea.html) señala, es una biblioteca de búsqueda de \*rutas\*. Es importante reconocer que Kpathsea no solo la usan los motores TeX; varios programas relacionados con TeX, incluidos BibTeX y MetaPost, también usan Kpathsea para buscar archivos de entrada.

En resumen, siempre que las macros de TeX/LaTeX necesiten abrir un archivo concreto, los comandos a partir de los cuales se construyen esas macros se convertirán, en última instancia, en instrucciones TeX de bajo nivel (primitivas TeX) que los motores TeX ejecutan realmente. Si esas instrucciones incluyen la necesidad de abrir un archivo, el motor TeX llamará a Kpathsea diciendo, en efecto, “por favor, encuentra este archivo”; si esa búsqueda de Kpathsea tiene éxito, el archivo se abre. Sin embargo, si Kpathsea no puede localizar el archivo, entonces se avisará de ello al motor TeX y este detendrá la ejecución para emitir el famoso error ``! ¡No puedo encontrar el archivo `...'`` La verdad es que Kpathsea no puede encontrarlo.

### Notas sobre LuaTeX

Hablando con rigor, deberíamos poner una advertencia a esta sección señalando que LuaTeX sí ofrece un mecanismo para que el usuario proporcione su propio código de búsqueda de archivos mediante el uso de *retrollamadas*. LuaTeX permite a los usuarios escribir funciones en el lenguaje de scripting Lua y registrarlas en LuaTeX para que llame a esa función definida por el usuario en ciertas etapas durante la ejecución de LuaTeX—de ahí el término *retrollamadas*retrollamada [El Manual de referencia de LuaTeX](http://www.pragma-ade.com/general/manuals/luatex.pdf) (en el momento de escribir esto, ese enlace es para LuaTeX 1.09).

### El archivo de configuración de Kpathsea: texmf.cnf

Toda instalación de TeX contiene un archivo de texto llamado `texmf.cnf` que es un archivo de configuración usado por Kpathsea: contiene numerosas “variables de configuración” que definen las rutas que Kpathsea usará para buscar diversos tipos de archivos que los motores TeX (o BibTeX, MetaPost, etc.) puedan necesitar. Como veremos más abajo, esas “variables de configuración” definen rutas de búsqueda construidas a partir de los llamados *elementos de ruta*: usando varias construcciones, variables y parámetros para definir cada elemento de ruta como una “plantilla” que Kpathsea procesa para generar los directorios físicos reales donde buscar.

Para dar un ejemplo concreto, aquí hay una de esas variables de configuración que define las rutas de búsqueda de las fuentes OpenType; por ahora, no te preocupes por el significado de la construcción de esta ruta:

```
OPENTYPEFONTS = .;$TEXMF/fonts/{opentype,truetype}//;$OSFONTDIR//
```

Lo único importante aquí es que el archivo `texmf.cnf` (leído por Kpathsea) define una variable de configuración llamada `OPENTYPEFONTS` que se usa para definir la(s) ruta(s) que Kpathsea utilizará para buscar fuentes OpenType. El lado derecho del “=” no se parece a ninguna ruta que veas en un dispositivo típico porque está construido usando varias variables y parámetros para definir cada ruta como una “plantilla” o “esquema” que Kpathsea usará para generar directorios reales donde buscar.

### El concepto de “ruta” de Kpathsea

Quizá el concepto central que conviene comprender es la noción de “ruta” de Kpathsea: la construcción básica que Kpathsea usa para determinar dónde se encuentra un archivo concreto. Como vimos en el `OPENTYPEFONTS` ejemplo anterior, la noción de ruta de Kpathsea se ve muy diferente de las rutas a las que estamos acostumbrados en nuestro escritorio o dispositivos portátiles.

Para citar la documentación de Kpathsea, [documentación](http://tug.org/texinfohtml/kpathsea.html#Searching-overview):

> ... un *ruta de búsqueda* es una lista separada por dos puntos de *elementos de ruta*, que son nombres de directorio con algunos “adornos extra”.

—pero observa que también se usa un punto y coma (`;`) para separar *elementos de ruta*. Más adelante, indicaremos brevemente la naturaleza de algunos de esos “adornos extra”.

En nuestro `OPENTYPEFONTS` ejemplo hay tres elementos de ruta, cada uno delimitado usando punto y coma (`;`):

![Imagen que muestra los elementos de ruta contenidos en una definición de ruta de Kpathsea](/files/173a4b75c867e138cc9fd86598ba2be8787a4d7a)

1. `.` (lo que significa el directorio actual)
2. `$TEXMF/fonts/{opentype,truetype}//`
3. `$OSFONTDIR//`

Ten en cuenta que una doble barra diagonal (`//`) en un elemento de ruta significa buscar subdirectorios (recursivamente).

Un `texmf.cnf` archivo contendrá numerosas “variables de configuración” para definir rutas de búsqueda para los tipos de archivo que Kpathsea puede buscar.

## Kpathsea: una visión general muy breve

Kpathsea es una biblioteca sofisticada—con muchos detalles finos y matices—e incluso una mirada breve a su [documentación](http://tug.org/texinfohtml/kpathsea.html) deja claro que no podemos profundizar en todos los detalles. Sin embargo, podemos intentar ofrecer una visión general de lo que hace—para ayudar a orientar tu pensamiento y ofrecer un punto de partida para lecturas posteriores.

### El propósito central de Kpathsea

Como se indica en la documentación, el propósito fundamental de Kpathsea es “devolver un nombre de archivo a partir de una lista de directorios especificada por el usuario” y que esos directorios (rutas de búsqueda) se especifiquen usando “unos pocos adornos extra”.

### Esos “adornos extra”

Los “pocos adornos extra” mencionados arriba incluyen diversos parámetros y variables que Kpathsea usa para construir sus rutas de búsqueda (o “plantillas de ruta”) para que pueda definir rutas de una forma más general. Cuando un motor TeX está realmente ejecutándose, Kpathsea puede usar el valor actual de esos parámetros/variables para determinar las rutas reales reemplazando esas variables con sus valores reales (en tiempo de ejecución). Puedes identificar fácilmente esas variables (dentro de los elementos de ruta) porque comienzan con un `$` signo.

Así, decimos que Kpathsea *expande* un elemento de ruta, lo que significa que transforma esos parámetros y variables: convirtiendo una “plantilla” de ruta en el/los nombre(s) real(es) de uno o más directorios físicos en los que buscar un archivo. Esto ofrece una gran flexibilidad y significa que Kpathsea podría construir una lista de directorios correspondiente a un elemento de ruta individual—por ejemplo, si se le indica que busque en subdirectorios.

### Nuestro ejemplo OpenType revisitado

Reuniremos los diversos hilos y exploraremos `OPENTYPEFONTS` con un poco más de detalle:

```
OPENTYPEFONTS = .;$TEXMF/fonts/{opentype,truetype}//;$OSFONTDIR//
```

Consideremos los dos elementos de ruta `$TEXMF/fonts/{opentype,truetype}//` y `$OSFONTDIR//`. Aquí, Kpathsea detecta el uso de llaves `{...}` y trata `$TEXMF/fonts/{opentype,truetype}` como la representación de *dos* elementos de ruta:

1. `$TEXMF/fonts/opentype//`
2. `$TEXMF/fonts/truetype//`

y que los *subdirectorios* de ambos elementos de ruta también deben buscarse (indicado por la terminación `//`).

**Nota**Ver la documentación de Kpathsea sobre [expansión de subdirectorios](http://tug.org/texinfohtml/kpathsea.html#Subdirectory-expansion) para una advertencia importante sobre el orden en que se buscan los subdirectorios, en cualquier nivel (no está especificado).

Haremos algunas observaciones sobre `$TEXMF` más abajo.

#### $OSFONTDIR//

`$OSFONTDIR` es una variable cuyo valor debe definirse como una variable de entorno que contenga la ubicación donde se almacenan las fuentes: el valor exacto dependerá, por supuesto, del sistema operativo que se use para ejecutar TeX. Observa que, aquí, la barra final `//` indica a Kpathsea que busque en subdirectorios al buscar fuentes OpenType.

La definición predeterminada de `OSFONTDIR` dentro `texmf.cnf` es:

```
OSFONTDIR = /please/set/osfontdir/in/the/environment
```

Así que sin duda es algo que debes configurar si deseas usarlo: tu variable de entorno anulará esta definición “de marcador de posición” contenida en `texmf.cnf`.

Si estableces la variable de entorno `OSFONTDIR` entonces, en tiempo de ejecución, dondequiera que Kpathsea vea `$OSFONTDIR` como parte de un elemento de ruta (en `texmf.cnf`) puede reemplazar la variable `$OSFONTDIR` con el valor real almacenado en la variable de entorno `OSFONTDIR`. Recuerda que, al usarla dentro de `texmf.cnf` elementos de ruta, especificamos la variable `$OSFONTDIR`—con un `$`inicial—para indicarle a Kpathsea que esta es una variable cuyo *valor* necesita usar.

#### Notas breves sobre $TEXMF

`TEXMF` es otra variable de configuración que se define en `texmf.cnf`; por ejemplo, en la distribución maestra de TeX Live verías:

```
TEXMF = {$TEXMFAUXTREES$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFLOCAL,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFDIST}
```

No necesitas preocuparte por los detalles de esta definición de `TEXMF`—no exploraremos todos los detalles, sino simplemente señalaremos que la `$TEXMF` variable se usa dentro de elementos de ruta porque define una serie de carpetas de nivel superior (denominadas “texmf trees”) desde las cuales puedes comenzar la búsqueda de archivos.

`TEXMF` es extremadamente útil si quieres, o necesitas, dividir una instalación de TeX entre múltiples directorios (o “árboles” de directorios). Por ejemplo, teniendo una colección principal o maestra de paquetes TeX/LaTeX (p. ej., TeX Live) y otra colección de archivos y carpetas usadas para almacenar paquetes LaTeX locales—o, quizá, para almacenar archivos de configuración locales o versiones personalizadas de paquetes estándar. Dividir la instalación de TeX de esta manera puede hacer más fácil gestionar la actualización de la colección principal/maestra (distribución) de paquetes TeX/LaTeX porque tu colección local está separada de los archivos maestros que se actualizan cuando actualizas tu distribución/instalación de TeX Live.

Para más detalles sobre la gestión de instalaciones de TeX más complejas, se remite al lector interesado a estos dos artículos:

* [Administrar múltiples árboles TDS](http://tug.org/TUGboat/Articles/tb22-3/tb72downes.pdf) de Michael J Downes;
* [Haciendo malabares con árboles texmf](http://www.ntg.nl/maps/27/17.pdf) de Siep Kroonenberg.

#### Estructura de directorios de TeX

Cualquiera que haya gestionado una instalación de TeX sabe que los sistemas TeX modernos, como TeX Live, contienen muchas decenas de miles de archivos que comprenden una enorme variedad de tipos de archivo. La TeX Directory Structure (TDS) fue diseñada como un “esquema” de mejores prácticas para organizar la vasta colección de archivos en una instalación de TeX en funcionamiento y se recomienda encarecidamente su uso con Kpathsea.

Para más información, se dirige al lector a la especificación TDS: [Una estructura de directorios para archivos TeX](https://www.tug.org/tds/tds.pdf).

## Tipos de archivo de Kpathsea

El conjunto de aplicaciones que usan Kpathsea necesita acceder a una amplia gama de tipos de archivo, así que Kpathsea usa una “variable de configuración” para identificar la(s) ruta(s) de cada tipo de archivo (o grupo de archivos) que admite. La documentación en línea tiene una lista completa (véase también nuestra [tabla resumen, más abajo](#table-listing-kpathsea-config-variables)) pero aquí están las “variables de configuración” para los tipos de archivo más comunes:

|                               |                                                       |
| ----------------------------- | ----------------------------------------------------- |
| **Variable de configuración** | **Ejemplos de tipos de archivo**                      |
| TEXINPUTS                     | Archivos fuente de TeX y archivos de figuras/gráficos |
| BIBINPUTS, BSTINPUTS          | Archivos fuente bibliográficos de BibTeX              |
| TTFONTS                       | Fuentes outline TrueType                              |
| OPENTYPEFONTS                 | Fuentes outline OpenType                              |

`TEXINPUTS` es una variable de configuración especialmente importante porque especifica de dónde obtiene un motor TeX sus archivos fuente de entrada. Ten en cuenta que los archivos de imagen se consideran archivos de entrada y también pueden buscarse usando la ruta definida por `TEXINPUTS`.

### Algunos matices de Kpathsea

Como se ha señalado, Kpathsea tiene muchos matices que no podemos explorar aquí con detalle. Sin embargo, estas son funciones que algunos lectores quizá quieran investigar:

* **base de datos de nombres de archivo:** Para minimizar las búsquedas en disco, Kpathsea puede hacer uso de una “ [base de datos de nombres de archivo llamada ls-R](http://tug.org/texinfohtml/kpathsea.html#Filename-database) que asigna archivos a directorios”. TeX Live proporciona una y las herramientas para actualizarla si se añaden nuevos archivos.
* **variables de entorno**: Además de las “variables de configuración” (como `OPENTYPEFONTS`) Kpathsea también hace uso inteligente de [variables de entorno](https://en.wikipedia.org/wiki/Environment_variable); por ejemplo, el valor en tiempo de ejecución de las variables de entorno puede usarse para definir elementos de ruta en el `texmf.cnf` archivo (posiblemente para anular variables del mismo nombre definidas en `texmf.cnf`).
* **nombre del programa:** Un aspecto sutil pero esencial del comportamiento de Kpathsea es que puede hacer uso del nombre del programa ejecutable (p. ej., el motor TeX) para construir construcciones de ruta de búsqueda específicas del programa. Esto proporciona considerable flexibilidad porque la búsqueda de rutas puede dirigirse a archivos para un motor TeX concreto. Por ejemplo, para LuaTeX/LuaLaTeX:

  ```
  TEXINPUTS.lualatex = .;$TEXMF/tex/{lualatex,latex,luatex,generic,}//
  TEXINPUTS.luatex = .;$TEXMF/tex/{luatex,plain,generic,}//
  ```
* **búsqueda `texmf.cnf`**&#x55;na pregunta que quizá te estés haciendo es: ¿cómo sabe Kpathsea dónde `texmf.cnf` se almacena? La respuesta es una variable de entorno llamada `TEXMFCNF`. Esto necesita स्थापितirse (en el dispositivo/plataforma que ejecuta TeX) en la ruta donde `texmf.cnf` se almacena.

#### Depuración de problemas de Kpathsea

Es poco probable que los usuarios de Overleaf necesiten estas facilidades, pero las enumeramos por completitud:

* **kpsewhich**: Un programa independiente (incluido en TeX Live) que puede usarse para probar tus configuraciones: determinar el valor de variables y encontrar archivos. Se remite a los lectores interesados a la [documentación en línea](http://tug.org/texinfohtml/kpathsea.html#Invoking-kpsewhich) para obtener más información.
* **variables de entorno**: Kpathsea admite una variable de entorno llamada [`KPATHSEA_DEBUG`](http://www.tug.org/texinfohtml/kpathsea.html#Debugging) para ayudar a depurar su comportamiento. Puedes establecer `KPATHSEA_DEBUG` a distintos valores según cuánta información de depuración necesites. Establecer `KPATHSEA_DEBUG=-1` generará una *considerable* cantidad de datos.

## Y por último: carpetas, archivos de figuras y latexmkrc

Entonces, ¿cómo se relaciona lo anterior con latexmkrc? Si lees este artículo [Cómo usar latexmkrc con Overleaf: ejemplos y técnicas](/latex/es/articulos-en-profundidad/28-how-to-use-latexmkrc-with-overleaf.md) puedes ver que el código (Perl) del ejemplo latexmkrc establece el valor de una variable de entorno `TEXINPUTS`:

```
$ENV{'TEXINPUTS'}='./tex//:' . $ENV{'TEXINPUTS'};
```

Ten en cuenta que los dos puntos (:) usados aquí (`./tex//:`) es *extremadamente* es importante. Si omites ese dos puntos, TeX/LaTeX puede no ser capaz de encontrar archivos vitales del sistema, ¡como los paquetes de LaTeX!

Lo que hace, en efecto, este archivo latexmkrc es añadir una ruta de carpeta de nivel superior (`./tex` en el ejemplo anterior) a la variable de entorno definida por el sistema para que cuando Kpathsea use la variable `TEXINPUTS` $TEXINPUTS `sea entonces consciente de que la carpeta` /tex// `debe buscarse para encontrar archivos de entrada. Si miras con atención, verás que la ruta real utilizada es` ./tex//: `indica a Kpathsea que busque la carpeta tex de forma recursiva—es decir, que mire dentro de cualquier subcarpeta contenida en la` la `//` carpeta. Como se señaló, también añadimos el importante carácter dos puntos. `tex` Podemos usar exactamente la misma técnica para archivos de figuras.

Una nota sobre BibTeX

### Como se señaló, el programa BibTeX también usa Kpathsea para buscar sus archivos de entrada; en particular:

BSTINPUTS

* la `la variable de configuración (ruta de búsqueda) se usa para buscar` .bst `files;` archivos;
* y el `BIBINPUTS` la variable de configuración (ruta de búsqueda) se usará para buscar `.bib` archivos.

Si añades nuevos `files;` o `.bib` archivos a tu proyecto de Overleaf puedes usar la técnica siguiente para indicarle a BibTeX dónde encontrar estos archivos—debes reemplazar `TEXINPUTS` con `la variable de configuración (ruta de búsqueda) se usa para buscar` y/o `BIBINPUTS`.

### TEXINPUTS y usar carpetas anidadas para archivos gráficos

Si tu proyecto tiene muchos archivos gráficos puede ser conveniente crear un conjunto de carpetas en las que almacenarlos y gestionarlos. Por ejemplo, la siguiente captura muestra una sección de un proyecto de Overleaf que usa una carpeta de nivel superior llamada **`gráficos`**:

![Imagen que muestra carpetas anidadas en un proyecto de Overleaf](/files/97e09a5e96af2f5a850588c1bb439432999c1649)

Hay numerosas subcarpetas (anidadas) que contienen gráficos para varias secciones de nuestro documento.

Supongamos que tenemos la estructura de carpetas anterior y queremos usar el `graphicx` paquete (`\usepackage{graphicx}`) y que intentamos hacerlo así:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% la mejor práctica es no usar la extensión del archivo
\end{document}
```

No funcionará y obtendrás un error como este:

```
! Error de LaTeX: Archivo `endlinechar' no encontrado.
l.4 \includegraphics{endlinechar}
No pude localizar el archivo con ninguna de estas extensiones:
.pdf,.PDF,.ai,.AI,.png,.PNG,.jpg,.JPG,.jpeg,.JPEG,.jp2,.JP2,.jpf,.JPF,.bmp,.BMP,
,.ps,.PS,.eps,.EPS,.mps,.MPS,.pz,.eps.Z,.ps.Z,.ps.gz,.eps.gz
```

Ese error surge porque nuestro archivo gráfico está almacenado en una ubicación que TeX/LaTeX (y Kpathsea) desconocen, y por lo tanto no pueden encontrarlo—la ruta del archivo gráfico es:

```
./graphics/Introduction/Chapter1/Section1/Subsection3/endlinechar.png
```

**Nota**: En general, se acepta como buena práctica ***evitar caracteres de espacio en los nombres de carpeta***. Aunque ciertamente es posible tener espacios en los nombres de carpeta, usando las técnicas discutidas abajo, desaconsejaríamos hacerlo por razones de portabilidad del documento fuera de la plataforma Overleaf.

Como se explica en este [artículo de ayuda de Overleaf](/latex/es/mas-temas/27-inserting-images.md) puedes, por supuesto, usar carpetas para almacenar tus gráficos, pero necesitas indicarle a LaTeX dónde están almacenados. Aquí, veremos dos soluciones:

* Usando el comando \graphicspath;
* Usando nuestro conocimiento de Kpathsea y `TEXINPUTS`.

### Usando \graphicspath

El `graphicx` paquete proporciona el `\graphicspath` comando que puedes usar para declarar rutas donde se encuentran tus gráficos; así que podríamos hacer algo como esto:

```latex
\graphicspath{{./graphics/Introduction/Chapter1/Section1/Subsection3/}}
```

y ahora LaTeX encontrará cualquier gráfico almacenado bajo esa ruta.

**Nota**: Si *debe* tienes espacios en los nombres de carpeta, entonces necesitarás encerrar las rutas entre comillas dobles (`"..."`):

```latex
\graphicspath{{"./graphics/Introduction/Chapter 1/Section 1/Subsection 3/"}}
```

**Nota**: Puedes declarar múltiples rutas así:

```latex
\graphicspath{{path1}{path2}{path3}...{pathN}}
```

donde `...` significa rutas adicionales encerradas entre llaves.

**Nota**: Comenzamos la ruta con `./graphics` y no solo `/graphics`. El punto (.) le dice al sistema operativo que la ruta es relativa al directorio de trabajo actual.

El `\graphicspath` comando funciona bien, pero si tienes muchas carpetas puede volverse bastante tedioso añadir cada ruta; además, las rutas definidas mediante `\graphicspath` ya no funcionarían si renombraras las carpetas o las reestructuraras. ¿Hay una forma más fácil? Sí, ¡puedes usar un archivo latexmkrc!

#### \graphicspath y recursión (subdirectorios)

Ten en cuenta que hay debates/discusiones en línea sobre si algunos sistemas admiten/habilitan `\graphicspath` para buscar recursivamente subdirectorios si añades `//` al final de la ruta: consulta, por ejemplo, estas discusiones en tex.stackexchange:

* [Búsqueda recursiva de \graphicspath en LaTeX](https://tex.stackexchange.com/questions/25443/latex-graphicspath-recursive-search);
* [Graphicspath para MikTeX](https://tex.stackexchange.com/questions/3131/graphicspath-for-miktex).

Para la máxima compatibilidad deberías asumir que `\graphicspath` no admite la búsqueda recursiva en directorios.

### Kpathsea y TEXINPUTS (archivo latexmkrc al rescate)

**AVISO:** Ten en cuenta que la siguiente técnica funciona bien en Overleaf y en instalaciones locales de TeX debidamente configuradas; **pero** si usas un archivo latexmkrc tu proyecto puede volverse incompatible con otras instalaciones de TeX, como las utilizadas por editores y sistemas de envío de revistas en línea. Las instalaciones de TeX de terceros pueden, o no, admitir o permitir el uso de latexmkrc. Si necesitas exportar tu proyecto de Overleaf para usarlo en otro lugar, o quieres enviarlo a una revista, deberías eliminar cualquier carácter de espacio de los nombres de ruta y, para una mejor compatibilidad, añadir un `\graphicspath` comando que defina todas las rutas:

```latex
\graphicspath{{path1}{path2}{path3}...{pathN}}
```

donde `...` significa rutas adicionales encerradas entre llaves.

La técnica que se analiza a continuación (usando `TEXINPUTS`) se ha probado con éxito en Overleaf con los motores pdfTeX, XeTeX y LuaTeX (es decir, las opciones de compilador pdfLaTeX, XeLaTeX y LuaLaTeX en el menú de Overleaf):

![Imagen que muestra cómo elegir el compilador de LaTeX en Overleaf](/files/6da716123b6676ee77e977e69eed634a73bb82d6)

Volviendo a nuestro ejemplo, queremos usar este código (con carpetas profundamente anidadas) y usaremos un archivo latexmkrc para lograrlo:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% la mejor práctica es no usar la extensión del archivo
\end{document}
```

Aquí hay una captura de pantalla que muestra el código anterior funcionando sin problemas: LaTeX ha encontrado nuestro archivo gráfico (`endlinechar.png`) aunque está en una estructura de carpetas profundamente anidada (sin espacios en los nombres de carpeta).

![Imagen que muestra un proyecto con carpetas anidadas compilando en Overleaf](/files/97f176ed8a26ca73b9db5f53b8f36d4defae6c98)

Entonces, ¿cómo lo hicimos? Todo lo que necesitas hacer es:

* crear un archivo nuevo, sin extensión, y llamarlo latexmkrc;
* añadir la siguiente línea a ese archivo:

  ```
  $ENV{'TEXINPUTS'}='./graphics//:'.$ENV{'TEXINPUTS'};
  ```

Kpathsea ahora sabrá acerca de las carpetas contenidas bajo `**graphics**` y debido a la `//` también buscará en las subcarpetas.

Observa, de nuevo, que los dos puntos en `./graphics//:` en realidad es *extremadamente* es importante. Si omites ese dos puntos, TeX/LaTeX puede no ser capaz de encontrar archivos vitales del sistema, ¡como los paquetes de LaTeX!

Usando el ejemplo sencillo de proyecto anterior, ahora puedes compilarlo y ¡voilà! LaTeX encuentra tu archivo de gráficos, y puedes renombrar u reorganizar las carpetas bajo /graphics y eso no impedirá que LaTeX las encuentre.

## Tabla que enumera las «variables de configuración» de Kpathsea

La siguiente tabla es un resumen derivado de [los datos enumerados en la documentación de Kpathsea](http://tug.org/texinfohtml/kpathsea.html#Supported-file-formats).

|                                                                    |                                                                                 |                                |
| ------------------------------------------------------------------ | ------------------------------------------------------------------------------- | ------------------------------ |
| **Variable de configuración de Kpathsea**                          | **Descripción del tipo de archivo**                                             | **Sufijo de archivo**          |
| AFMFONTS                                                           | Métricas de fuente de Adobe                                                     | .afm                           |
| MFBASES, TEXMFINI                                                  | Volcado de memoria de Metafont                                                  | .base                          |
| BIBINPUTS, TEXBIB                                                  | Fuente bibliográfica de BibTeX                                                  | .bib                           |
| BLTXMLINPUTS                                                       | Archivos bibliográficos BibLaTeXML para Biber                                   | .bltxml                        |
| la variable de configuración (ruta de búsqueda) se usa para buscar | Estilo de BibTeX                                                                | files;                         |
| CLUAINPUTS                                                         | bibliotecas dinámicas para Lua                                                  | .dll y .so                     |
| CMAPFONTS                                                          | archivos de mapa de caracteres                                                  | .cmap                          |
| TEXMFCNF                                                           | Archivos de configuración en tiempo de ejecución                                | .cnf                           |
| CWEBINPUTS                                                         | Archivos de entrada de CWEB                                                     | .w, .web, .ch                  |
| TEXCONFIG                                                          | Archivos 'config.\*' de Dvips, como config.ps                                   |                                |
| ENCFONTS                                                           | vectores de codificación                                                        | .enc                           |
| TEXFORMATS, TEXMFINI                                               | Volcado de memoria de TeX                                                       | .fmt                           |
| FONTCIDMAPS                                                        | mapeo CJK                                                                       | .cid                           |
| FONTFEATURES                                                       | principalmente para características de fuentes OpenType                         | .fea                           |
| FONTS, GFFONTS, GLYPHFONTS, TEXFONTS                               | mapa de bits genérico de fuente                                                 | .gf                            |
| TEXPICTS, TEXINPUTS                                                | figuras PostScript encapsulado                                                  | .eps, .epsi                    |
| TEXINDEXSTYLE, INDEXSTYLE                                          | archivos de estilo de makeindex                                                 | .ist                           |
| LIGFONTS                                                           | archivos de definición de ligaduras                                             | .lig                           |
| TEXMFDBS                                                           | Bases de datos de nombres de archivo                                            |                                |
| TEXFONTMAPS                                                        | Mapas de fuentes                                                                | .map                           |
| MPMEMS, TEXMFINI                                                   | Volcado de memoria de MetaPost                                                  | .mem                           |
| MPSUPPORT                                                          | archivos de soporte de MetaPost, usados por DMP                                 |                                |
| MFINPUTS                                                           | fuente de Metafont                                                              | .mf                            |
| MFPOOL, TEXMFINI                                                   | cadenas del programa Metafont                                                   | .pool                          |
| MFTINPUTS                                                          | archivo de estilo MFT                                                           | .mft                           |
| MISCFONTS                                                          | archivos relacionados con fuentes que no encajan en las otras categorías        |                                |
| MLBIBINPUTS, BIBINPUTS, TEXBIB                                     | Fuente bibliográfica de MlBibTeX                                                | .mlbib, .mlbib                 |
| MLBSTINPUTS, BSTINPUTS                                             | Estilo de MlBibTeX                                                              | .mlbst, .bst                   |
| MPINPUTS                                                           | fuente de MetaPost                                                              | .mp                            |
| MPPOOL, TEXMFINI                                                   | cadenas del programa MetaPost                                                   | .pool                          |
| OCPINPUTS                                                          | archivos de proceso compilados de Omega                                         | .ocp                           |
| OFMFONTS, TEXFONTS                                                 | métricas de fuente de Omega                                                     | .ofm, .tfm                     |
| OPENTYPEFONTS                                                      | Fuentes OpenType                                                                |                                |
| OPLFONTS, TEXFONTS                                                 | listas de propiedades de Omega                                                  | .opl                           |
| OTPINPUTS                                                          | archivos de proceso de traducción de Omega                                      | .otp                           |
| OVFFONTS, TEXFONTS                                                 | fuentes virtuales de Omega                                                      | .ovf                           |
| OVPFONTS, TEXFONTS                                                 | listas de propiedades virtuales de Omega                                        | .ovp                           |
| PDFTEXCONFIG                                                       | archivos de configuración específicos de PDFTeX                                 |                                |
| PROGRAMFONTS, PKFONTS, TEXPKS, GLYPHFONTS, TEXFONTS                | fuentes de mapa de bits comprimidas                                             | .pk                            |
| TEXPSHEADERS, PSHEADERS                                            | PostScript descargable                                                          | .pro                           |
| RISINPUTS                                                          | Archivos bibliográficos RIS, principalmente para Bibe                           | .ris                           |
| SFDFONTS                                                           | archivos de definición de subfuentes                                            | .sfd                           |
| TEXINPUTS                                                          | fuente de TeX                                                                   | .tex                           |
| TEXDOCS                                                            | Archivos de documentación del sistema TeX                                       |                                |
| TEXSOURCES                                                         | Archivos fuente del sistema TeX                                                 |                                |
| TEXMFSCRIPTS                                                       | Ejecutables independientes de la arquitectura distribuidos en los árboles texmf |                                |
| TEXPOOL, TEXMFINI                                                  | cadenas del programa TeX                                                        | .pool                          |
| TFMFONTS, TEXFONTS                                                 | métricas de fuente de TeX                                                       | .tfm                           |
| TRFONTS                                                            | fuentes Troff                                                                   |                                |
| TTFONTS                                                            | Fuentes outline TrueType                                                        | .ttf, ,TTF, .ttc, .TTC, .dfont |
| T1FONTS, T1INPUTS, TEXPSHEADERS, DVIPSHEADERS                      | fuentes de contorno PostScript de tipo 1                                        | .pfa, .pfb                     |
| T42FONTS                                                           | fuentes de contorno PostScript de tipo 42                                       |                                |
| VFFONTS, TEXFONTS                                                  | fuentes virtuales                                                               | .vf                            |
| WEBINPUTS                                                          | archivos de entrada de WEB                                                      | .web, .ch                      |
| WEB2C                                                              | archivos específicos de la implementación web2c                                 |                                |


---

# 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/articulos-en-profundidad/06-an-introduction-to-kpathsea-and-how-tex-engines-search-for-files.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.
