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

# Вступ до Kpathsea і того, як рушії TeX шукають файли

## Вступ

Ця стаття містить вступ до того, як TeX-движки знаходять файли, потрібні для верстки вашого документа — за допомогою LaTeX або будь-якого іншого макропакета. Хоча Overleaf позбавляє користувачів труднощів керування інсталяцією TeX ([TeX Live](https://www.tug.org/texlive/)),

Чому це може бути правдою? Якщо ви зберігаєте деякі файли вашого проєкту Overleaf у папках, тоді LaTeX може не знайти ці файли, тому що за замовчуванням TeX-движок (компілятор) може не *знати* що йому потрібно шукати в цих папках — і тому він не знайде файли, які вони містять. Щоб цього уникнути, ви можете створити й додати до свого проєкту файл конфігурації, який називається [файл latexmkrc](https://mg.readthedocs.io/latexmk.html#configuration-files) який можна використати, щоб повідомити TeX-движку, що ваші папки існують і що він має їх шукати.

Якщо ви хочете перейти до прикладу, що показує файл latexmkrc, можете прочитати цю довідкову статтю: [Як використовувати latexmkrc з Overleaf: приклади та техніки](/latex/uk/dokladni-statti/28-how-to-use-latexmkrc-with-overleaf.md). Можливо, не одразу очевидно, як або чому той файл latexmkrc насправді працює. Якщо ви хочете дізнатися чому і, можливо, краще зрозуміти, як використовувати подальші можливості конфігурації для вашого проєкту, тоді читайте далі... Наприкінці цієї статті ми розглянемо [практичний приклад](#kpathsea-and-texinputs-latexmkrc-file-to-the-rescue)—використовуючи наші знання про те, як TeX шукає файли,— щоб створити файл latexmkrc для керування вкладеними папками, що містять ваші графічні файли.

## TeX і незалежність від платформи

Коли Кнут створював TeX, незалежність від платформи була центральним принципом, що керував його проєктуванням і реалізацією, і ця філософія відлунює в усіх внутрішніх операціях TeX (наприклад, використання цілочисельної арифметики, «доморощеної» обробки рядків, керування пам’яттю тощо). Навіть сьогодні незалежність сучасних TeX-базованих движків від платформи все ще викликає запитання та дискусії на публічних форумах; наприклад, див. це обговорення на tex.stackexchange: [Чи є XeTeX і LuaTeX залежними від платформи?](https://tex.stackexchange.com/questions/94297/are-xetex-and-luatex-platform-dependent) яке містить коментарі та зауваження, зроблені низкою добре відомих експертів TeX.

Однак поки що відкладемо вбік тонкощі й зауважимо, що TeX-движки все ж мають бути дуже портативними — здатними працювати на кількох операційних системах і видавати «ідентичні» результати. Ключовим аспектом портативності є пошук файлів у незалежний від платформи спосіб.

## TeX-движки не шукають файли… справді!?

Ні, TeX-движки не *безпосереднього* шукають файли *самі по собі*. Під час обробки `.tex` файла TeX-движок може визначити потребу відкрити певний файл, але він *делегує* завдання знайти його іншій програмі під назвою [*Kpathsea*](https://tug.org/kpathsea/): зовнішній програмній бібліотеці, яка не є частиною *основного* вихідного коду TeX-движків. Фактично Kpathsea надає API ([інтерфейс програмування застосунків](https://en.wikipedia.org/wiki/Application_programming_interface)) який TeX-движки (а також BibTeX, MetaPost та інші програми) можуть викликати щоразу, коли їм потрібно відкрити певний файл: Kpathsea виконує фактичну роботу з пошуку цього файла.

Коли Кнут писав оригінальний TeX-движок — від якого, зрештою, походять усі інші TeX-движки — проблема знаходження/відкривання файлів була значним викликом, частково через дуже неоднорідну технологічну екосистему того часу. Насправді у вихідному коді TeX Кнут називає введення/виведення файлів «прокляттям портативності» (див. сторінку 12, розділ 25 [TeX: Програма](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)).

Спільнота TeX усвідомила потребу узгодити (стандартизувати) пошук файлів для TeX —*та програмного забезпечення, пов’язаного з TeX*— і вирішила дати TeX інструменти для цього. Щоб розв’язати дуже непросту проблему незалежного від платформи методу пошуку файлів, Карл Беррі, провідний член спільноти TeX, написав програму для розв’язання *проблеми*пошуку шляхів: рішення, яке він назвав [**Kpathsea**](http://tug.org/texinfohtml/kpathsea.html)—що походить від **K**Карла **Path** **Sea**rching (див. це [інтерв’ю з Карлом Беррі](http://www.tug.org/interviews/berry.html)).

Можемо зауважити, що воно називається K**проблеми**sea, а не K**файлу**sea, тому що, як [документації](http://tug.org/texinfohtml/kpathsea.html) зазначає документація, це бібліотека для \*пошуку шляхів\*. Важливо усвідомлювати, що Kpathsea використовується не лише TeX-движками; різні програми, пов’язані з TeX, зокрема BibTeX і MetaPost, також використовують Kpathsea для пошуку вхідних файлів.

У загальних рисах, коли макросам TeX/LaTeX потрібно відкрити певний файл, команди, з яких ці макроси побудовані, зрештою будуть перетворені на низькорівневі інструкції TeX (примітиви TeX), які TeX-движки фактично виконують. Якщо ці інструкції містять потребу відкрити файл, TeX-движок звернеться до Kpathsea з проханням, по суті, «знайди цей файл»; якщо цей пошук Kpathsea успішний, файл відкривається. Однак якщо Kpathsea не може знайти файл, TeX-движок буде про це повідомлено, і він зупинить виконання, щоб видати сумнозвісну помилку ``! Я не можу знайти файл `...'`` Правда в тому, що Kpathsea не може його знайти.

### Нотатки щодо LuaTeX

Строго кажучи, цю секцію слід супроводити застереженням, зазначивши, що LuaTeX справді пропонує механізм, за допомогою якого користувач може надати власний код пошуку файлів через використання *зворотних викликів*LuaTeX дає змогу користувачам писати функції мовою сценаріїв Lua та реєструвати їх у LuaTeX так, щоб він викликав цю визначену користувачем функцію на певних етапах під час виконання LuaTeX — звідси термін *зворотних викликів*зворотні виклики. [Довіднику з LuaTeX](http://www.pragma-ade.com/general/manuals/luatex.pdf) (на момент написання цього тексту це посилання веде на LuaTeX 1.09).

### Файл конфігурації Kpathsea: texmf.cnf

Кожна інсталяція TeX містить текстовий файл під назвою `texmf.cnf` який є конфігураційним файлом, що використовується Kpathsea: він містить численні «конфігураційні змінні», які визначають шляхи, які Kpathsea використовуватиме для пошуку різних типів файлів, потрібних TeX-движкам (або BibTeX, MetaPost тощо). Як ми побачимо нижче, ці «конфігураційні змінні» визначають шляхи пошуку, побудовані з так званих *елементів шляху*: використовуючи різні конструкції, змінні та параметри, щоб визначити кожен елемент шляху як «шаблон», який Kpathsea обробляє для створення фактичних, фізичних каталогів для пошуку.

Щоб навести конкретний приклад, ось одна така конфігураційна змінна, яка визначає шляхи пошуку для шрифтів OpenType — поки що не переймайтеся значенням побудови цього шляху:

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

Усе, що тут важливо, це те, що файл `texmf.cnf` (прочитаний Kpathsea) визначає конфігураційну змінну під назвою `OPENTYPEFONTS` яка використовується для визначення шляху (шляхів), які Kpathsea застосовуватиме для пошуку шрифтів OpenType. Права частина знака «=» не схожа на жоден шлях, який ви бачите на типовому пристрої, тому що вона побудована з використанням різних змінних і параметрів, щоб визначити кожен шлях як «шаблон» або «креслення», яке Kpathsea використовуватиме для створення реальних каталогів для пошуку.

### Уявлення Kpathsea про «шлях»

Мабуть, центральне поняття, яке варто зрозуміти, — це уявлення Kpathsea про «шлях»: базова конструкція, яку Kpathsea використовує, щоб з’ясувати, де розташований певний файл. Як ми бачили в `OPENTYPEFONTS` наведеному вище прикладі, уявлення Kpathsea про шлях дуже відрізняється від шляхів, до яких ми звикли на наших настільних або портативних пристроях.

Щоб процитувати документацію Kpathsea: [документації](http://tug.org/texinfohtml/kpathsea.html#Searching-overview):

> ... *шлях пошуку* це список, розділений двокрапками, з *елементів шляху*, які є іменами каталогів із кількома «додатковими фішками».

—але зауважте, що крапка з комою (`;`) також використовується для розділення *елементів шляху*. Пізніше ми коротко вкажемо на природу деяких із цих «додаткових фішок».

У нашому `OPENTYPEFONTS` прикладі є три елементи шляху, кожен із яких відокремлено крапкою з комою (`;`):

![Зображення, що показує елементи шляху, які містяться у визначенні шляху Kpathsea](/files/5527e2c38d1dd68a13eb084242a985aac7301a56)

1. `.` (тобто поточний каталог)
2. `$TEXMF/fonts/{opentype,truetype}//`
3. `$OSFONTDIR//`

Зауважте, що подвійна коса риска (`//`) в елементі шляху означає пошук у підкаталогах (рекурсивно).

Типовий `texmf.cnf` файл міститиме численні «конфігураційні змінні» для визначення шляхів пошуку для типів файлів, які Kpathsea може шукати.

## Kpathsea: дуже короткий огляд

Kpathsea — це складна бібліотека з багатьма тонкощами й нюансами, і навіть побіжний погляд на її [документації](http://tug.org/texinfohtml/kpathsea.html) робить цілком зрозумілим, що ми не можемо вдаватися в усі деталі. Однак ми можемо спробувати дати огляд того, що вона робить, — щоб допомогти вам зорієнтуватися і дати відправну точку для подальшого читання.

### Основна мета Kpathsea

Як зазначено в документації, фундаментальна мета Kpathsea — «повертати ім’я файла зі списку каталогів, указаних користувачем», а ці каталоги (шляхи пошуку) задаються з використанням «кількох додаткових фішок».

### Ці «додаткові фішки»

До згаданих вище «кількох додаткових фішок» входять різні параметри та змінні, які Kpathsea використовує для побудови своїх шляхів пошуку (або «шаблонів шляхів»), щоб визначати шляхи у більш загальний спосіб. Коли TeX-движок фактично працює (виконується), Kpathea може використовувати поточне значення цих параметрів/змінних, щоб визначити фактичні шляхи, замінюючи ці змінні їхніми фактичними (під час виконання) значеннями. Ви легко можете впізнати ці змінні (у межах елементів шляху), тому що вони починаються зі `$` знака

Отже, ми кажемо, що Kpathsea *розгортає* елемент шляху, тобто перетворює ці параметри та змінні: перетворює шаблон шляху на фактичну назву (назви) одного чи кількох фізичних каталогів, у яких потрібно шукати файл. Це дає велику гнучкість і означає, що Kpathsea може побудувати список каталогів, що відповідає окремому елементу шляху — наприклад, якщо йому наказано шукати в підкаталогах.

### Наш приклад OpenType ще раз

Зведімо докупи різні нитки й розгляньмо `OPENTYPEFONTS` це трохи детальніше:

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

Розгляньмо два елементи шляху `$TEXMF/fonts/{opentype,truetype}//` та `$OSFONTDIR//`. Тут Kpathsea помічає використання фігурних дужок `{...}` і трактує `$TEXMF/fonts/{opentype,truetype}` як таке, що представляє *два* елементи шляху:

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

і що *підкаталоги* обох цих елементів шляху також слід шукати (на що вказує завершальний `//`).

**Примітка**: Див. документацію Kpathsea щодо [розгортання підкаталогів](http://tug.org/texinfohtml/kpathsea.html#Subdirectory-expansion) для важливого застереження щодо порядку, в якому підкаталоги на будь-якому рівні перевіряються (він не визначений).

Ми зробимо кілька зауваг щодо `$TEXMF` нижче.

#### $OSFONTDIR//

`$OSFONTDIR` —це змінна, значення якої слід визначити як змінну середовища, що містить розташування, де зберігаються шрифти: точне значення, звісно, залежатиме від операційної системи, яку використовують для запуску TeX. Зауважте, що тут завершальний `//` інструктує Kpathsea шукати в підкаталогах під час пошуку шрифтів OpenType.

Типове визначення `OSFONTDIR` у `texmf.cnf` така:

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

Тож це, безумовно, те, що вам потрібно задати, якщо ви хочете використовувати це, — ваша змінна середовища перевизначить це «заповнювальне» визначення, що міститься в `texmf.cnf`.

Якщо ви дійсно задасте змінну середовища `OSFONTDIR` тоді під час виконання, де б Kpathsea не бачила `$OSFONTDIR` як частину елемента шляху (у `texmf.cnf`), вона може замінити змінну `$OSFONTDIR` на фактичне значення, збережене у змінній середовища `OSFONTDIR`. Пам’ятайте, що коли використовується це всередині `texmf.cnf` елементів шляху, ми вказуємо змінну `$OSFONTDIR`—із початковим `$`— *значення* назву якої їй потрібно використовувати.

#### Короткі нотатки про $TEXMF

`TEXMF` —це ще одна конфігураційна змінна, визначена в `texmf.cnf`; наприклад, у головному розповсюдженні TeX Live ви побачите:

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

Не потрібно перейматися деталями цього визначення `TEXMF`—ми не розглядатимемо всі деталі, але лише зауважимо, що `$TEXMF` ця змінна використовується в елементах шляху, тому що вона визначає низку папок верхнього рівня (які називають «texmf trees»), від яких можна починати пошук файлів.

`TEXMF` надзвичайно корисна, якщо ви хочете або вам потрібно розділити інсталяцію TeX на кілька каталогів (або дерев каталогів). Наприклад, мати основну або головну колекцію пакетів TeX/LaTeX (наприклад, TeX Live) і ще одну колекцію файлів і папок, які використовуються для зберігання локальних пакетів LaTeX — або, можливо, для зберігання локальних конфігураційних файлів чи налаштованих версій стандартних пакетів. Розділення інсталяції TeX у такий спосіб може спростити керування оновленням основної/головної колекції (дистрибутива) пакетів TeX/LaTeX, оскільки ваша локальна колекція відокремлена від головних файлів, які оновлюються, коли ви оновлюєте свій дистрибутив/інсталяцію TeX Live.

Для подальших відомостей про керування складнішими інсталяціями TeX зацікавленому читачеві пропонуються ці дві статті:

* [Керування кількома деревами TDS](http://tug.org/TUGboat/Articles/tb22-3/tb72downes.pdf) від Майкла Дж. Даунса;
* [Жонглювання деревами texmf](http://www.ntg.nl/maps/27/17.pdf) від Сіпа Круненберга.

#### Структура каталогів TeX

Кожен, хто керував інсталяцією TeX, знає, що сучасні системи TeX, такі як TeX Live, містять багато десятків тисяч файлів, що охоплюють величезний спектр типів файлів. Структура каталогів TeX (TDS) була створена як «креслення» найкращих практик для впорядкування величезної колекції файлів у робочій інсталяції TeX і настійно рекомендується для використання з Kpathsea.

Для подальшої інформації читача спрямовують до специфікації TDS: [Структура каталогів для файлів TeX](https://www.tug.org/tds/tds.pdf).

## Типи файлів Kpathsea

Набір програм, які використовують Kpathsea, має доступ до широкого спектра типів файлів, тому Kpathsea використовує «конфігураційну змінну» для визначення шляху(ів) для кожного типу файла (або групи файлів), які він підтримує. Онлайн-документація має повний список (див. також нашу [таблицю-резюме нижче](#table-listing-kpathsea-config-variables)) але ось «конфігураційні змінні» для найпоширеніших типів файлів:

|                           |                                            |
| ------------------------- | ------------------------------------------ |
| **Конфігураційна змінна** | **Приклади типів файлів**                  |
| TEXINPUTS                 | вихідні файли TeX і файли рисунків/графіки |
| BIBINPUTS, BSTINPUTS      | вихідні файли бібліографії BibTeX          |
| TTFONTS                   | контурні шрифти TrueType                   |
| OPENTYPEFONTS             | контурні шрифти OpenType                   |

`TEXINPUTS` є особливо важливою конфігураційною змінною, оскільки вона визначає, звідки TeX-движок отримує свої вхідні вихідні файли. Зауважте, що файли зображень вважаються вхідними файлами, і їх також можна шукати, використовуючи шлях, визначений `TEXINPUTS`.

### Деякі нюанси Kpathsea

Як уже зазначалося, Kpathsea має багато нюансів, які ми не можемо тут детально розглядати. Однак ось функції, які деякі читачі можуть захотіти дослідити:

* **база даних імен файлів:** Щоб мінімізувати пошуки на диску, Kpathsea може використовувати «зовнішньо зібраний [файл бази даних імен файлів під назвою ls-R](http://tug.org/texinfohtml/kpathsea.html#Filename-database) який зіставляє файли з каталогами». TeX Live надає його й інструменти для оновлення, якщо додаються нові файли.
* **змінні середовища** : Окрім «конфігураційних змінних» (таких як `OPENTYPEFONTS`TEXINPUTS [змінні середовища](https://en.wikipedia.org/wiki/Environment_variable); наприклад, значення змінних середовища під час виконання можна використовувати для визначення елементів шляху у `texmf.cnf` файлі (можливо, щоб перевизначити змінні з тим самим іменем, які визначені в `texmf.cnf`).
* **назві програми:** Тонкий, але важливий аспект поведінки Kpathsea полягає в тому, що вона може використовувати назву виконуваної програми (наприклад, TeX-движка) для побудови специфічних для програми конструкцій шляхів пошуку. Це дає значну гнучкість, тому що пошук шляхів можна спрямовувати до файлів для конкретного TeX-движка. Наприклад, для LuaTeX/LuaLaTeX:

  ```
  TEXINPUTS.lualatex = .;$TEXMF/tex/{lualatex,latex,luatex,generic,}//
  TEXINPUTS.luatex = .;$TEXMF/tex/{luatex,plain,generic,}//
  ```
* **пошуку `texmf.cnf`**: Питання, яке ви можете собі поставити, — як Kpathsea знає, де `texmf.cnf` зберігається? Відповідь — це змінна середовища під назвою `TEXMFCNF`. Її потрібно задати (на пристрої/платформі, де запускається TeX) як шлях, де `texmf.cnf` зберігається.

#### Налагодження проблем Kpathsea

Користувачам Overleaf навряд чи знадобляться ці засоби, але ми наводимо їх для повноти:

* **kpsewhich**: Окрема програма (входить до складу TeX Live), яку можна використовувати для перевірки ваших налаштувань: визначати значення змінних і знаходити файли. Зацікавлених читачів відсилаємо до [онлайн-документації](http://tug.org/texinfohtml/kpathsea.html#Invoking-kpsewhich) для додаткової інформації.
* **змінні середовища**: Kpathsea підтримує змінну середовища під назвою [`KPATHSEA_DEBUG`](http://www.tug.org/texinfohtml/kpathsea.html#Debugging) для допомоги в налагодженні своєї поведінки. Ви можете встановити `KPATHSEA_DEBUG` різні значення залежно від того, скільки налагоджувальної інформації вам потрібно. Встановлення `KPATHSEA_DEBUG=-1` згенерує *значний* обсяг даних.

## І нарешті: папки, файли графіки та latexmkrc

Отже, як усе вищесказане пов’язане з latexmkrc? Якщо ви прочитаєте цю статтю [Як використовувати latexmkrc з Overleaf: приклади та техніки](/latex/uk/dokladni-statti/28-how-to-use-latexmkrc-with-overleaf.md) ви побачите, що код (Perl) у прикладі latexmkrc задає значення змінної середовища `TEXINPUTS`:

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

Зауважте, що двокрапка (:) тут використовується (`./tex//**:**`) є *надзвичайно* важливо. Якщо ви пропустите цю двокрапку, TeX/LaTeX може не зуміти знайти важливі системні файли, такі як пакети LaTeX!

Те, що цей файл latexmkrc фактично робить, — це додає шлях до папки верхнього рівня (`./tex` у наведеному вище прикладі) до системно визначеної `TEXINPUTS` змінної середовища, щоб, коли Kpathsea використовує змінну `$TEXINPUTS` вона тоді знала, що папку `/tex//` слід шукати, щоб знайти вхідні файли. Якщо придивитися уважно, ви побачите, що фактичний шлях, який використовується, є `./tex//:` сайті `//` підказує Kpathsea шукати в папці tex рекурсивно — тобто заглядати в будь-які підпапки, що містяться в `tex` папці. Як уже зазначалося, ми також додали важливий символ двокрапки.

Ми можемо використати точно таку саму техніку для файлів графіки.

### Відступ про BibTeX

Як зазначалося, програма BibTeX також використовує Kpathsea для пошуку своїх вхідних файлів; зокрема:

* сайті `BSTINPUTS` конфігураційна змінна (шлях пошуку) використовується для пошуку `.bst` файлів;
* та `BIBINPUTS` конфігураційна змінна (шлях пошуку) буде використовуватися для пошуку `.bib` файли.

Якщо ви додаєте нові `.bst` або `.bib` файли до вашого проєкту Overleaf, ви можете використати техніку нижче, щоб сказати BibTeX, де знайти ці файли — вам потрібно замінити `TEXINPUTS` з `BSTINPUTS` та/або `BIBINPUTS`.

### TEXINPUTS і використання вкладених папок для файлів графіки

Якщо у вашому проєкті багато файлів графіки, може бути зручно створити набір папок, у яких їх зберігати й упорядковувати. Наприклад, наведений нижче знімок екрана показує частину проєкту Overleaf, який використовує папку верхнього рівня під назвою **`graphics`**:

![Зображення, що показує вкладені папки в проєкті Overleaf](/files/432bc28271c6343b30df94cad139598e4960114a)

Є численні (вкладені) підпапки, що містять графіку для різних розділів нашого документа.

Припустімо, що ми маємо наведену вище структуру папок і хочемо використати `graphicx` пакета (`\usepackage{graphicx}`) і що ми спробуємо зробити це так:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% найкраща практика — не використовувати розширення файла
\end{document}
```

Це не спрацює, і ви отримаєте таку помилку:

```
! Помилка LaTeX: Файл `endlinechar' не знайдено.
l.4 \includegraphics{endlinechar}
Я не можу знайти файл із жодним із цих розширень:
.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
```

Ця помилка виникає тому, що наш графічний файл зберігається в місці, про яке TeX/LaTeX (і Kpathsea) не знають, і тому не можуть його знайти — шлях до графічного файла такий:

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

**Примітка** : Загалом визнано найкращою практикою ***уникати пробілів у назвах папок***. Хоча, безумовно, можливо мати пробіли в назвах папок, використовуючи техніки, обговорені нижче, ми застерігали б від цього з міркувань портативності документа поза платформою Overleaf.

Як пояснено в цій [статті довідки Overleaf](/latex/uk/inshi-temi/27-inserting-images.md) ви, звісно, можете використовувати папки для зберігання графіки, але вам потрібно сказати LaTeX, де вони зберігаються. Тут ми розглянемо два рішення:

* Використання команди \graphicspath;
* Використання наших знань про Kpathsea та `TEXINPUTS`.

### Використання \graphicspath

Функція `graphicx` пакет надає `\graphicspath` команду, яку можна використовувати для оголошення шляхів, де розташована ваша графіка; тож ми могли б зробити щось таке:

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

і тепер LaTeX знайде будь-яку графіку, що зберігається за цим шляхом.

**Примітка** : Якщо ви *необхідно* маєте пробіли в назвах папок, тоді вам потрібно буде взяти шляхи в подвійні лапки (`"..."`):

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

**Примітка** : Ви можете оголосити кілька шляхів так:

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

де `...` означає додаткові шляхи, взяті у фігурні дужки.

**Примітка** : Ми починаємо шлях з `./graphics` а не просто з `/graphics`. Крапка (.) повідомляє операційній системі, що шлях є відносним до поточного робочого каталогу.

Функція `\graphicspath` Команда працює добре, але якщо у вас багато папок, додавати кожен шлях може бути доволі нудно; окрім того, шляхи, визначені через `\graphicspath` \graphicspath, більше не працюватимуть, якщо ви перейменуєте папки або перебудуєте їхню структуру. Чи є простіший спосіб? Так, можна використати файл latexmkrc!

#### \graphicspath і рекурсія (підкаталоги)

Зауважте, що в онлайн-обговореннях/дискусіях точаться суперечки щодо того, чи деякі системи підтримують/вмикають `\graphicspath` рекурсивний пошук у підкаталогах, якщо ви додасте `//` наприкінці шляху: див., наприклад, ці обговорення на tex.stackexchange:

* [Рекурсивний пошук \graphicspath у LaTeX](https://tex.stackexchange.com/questions/25443/latex-graphicspath-recursive-search);
* [Graphicspath для MikTeX](https://tex.stackexchange.com/questions/3131/graphicspath-for-miktex).

Для найбільшої сумісності слід припускати, що `\graphicspath` не підтримує рекурсивний пошук каталогів.

### Kpathsea і TEXINPUTS (файл latexmkrc на виручку)

**ЗАСТЕРЕЖЕННЯ:** Зауважте, що наведена нижче техніка добре працює в Overleaf і в належним чином налаштованих локальних інсталяціях TeX; **але** якщо ви використовуєте файл latexmkrc, ваш проєкт може стати несумісним з іншими інсталяціями TeX, такими як ті, що використовуються видавцями та онлайн-системами подання статей до журналів. Сторонні інсталяції TeX можуть, а можуть і не можуть, підтримувати або дозволяти використання latexmkrc. Якщо вам потрібно експортувати ваш проєкт Overleaf для використання в іншому місці або ви хочете надіслати його до журналу, слід прибрати будь-які пробіли з назв шляхів і, для кращої сумісності, додати `\graphicspath` команду, яка визначає всі шляхи:

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

де `...` означає додаткові шляхи, взяті у фігурні дужки.

Наведена нижче техніка (з використанням `TEXINPUTS`) була успішно протестована в Overleaf із рушіями pdfTeX, XeTeX і LuaTeX (тобто параметрами компілятора pdfLaTeX, XeLaTeX і LuaLaTeX у меню Overleaf):

![Зображення, що показує, як вибрати компілятор LaTeX в Overleaf](/files/19142718812b90c8193c9047b9f1f4a05ac4f448)

Повертаючись до нашого прикладу, ми хочемо використати цей код (з глибоко вкладеними папками), і для цього скористаємося файлом latexmkrc:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% найкраща практика — не використовувати розширення файла
\end{document}
```

Ось знімок екрана, який показує, що наведений вище код працює без проблем: LaTeX знайшов наш графічний файл (`endlinechar.png`) навіть попри те, що він знаходиться в глибоко вкладеній структурі папок (без жодних пробілів у назвах папок).

![Зображення, що показує проєкт із вкладеними папками, який компілюється в Overleaf](/files/5cbda41e6a4ce15069bc31e554ed4383e4f3cccc)

Отже, як ми це зробили? Усе, що вам потрібно зробити, це:

* створити новий файл без розширення і назвати його latexmkrc;
* додати до цього файла такий рядок:

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

Тепер Kpathsea знатиме про теки, що містяться під `**graphics**` і завдяки `//` він також шукатиме й у підтеках.

Знову зверніть увагу, що двокрапка в `./graphics//:` насправді є *надзвичайно* важливо. Якщо ви пропустите цю двокрапку, TeX/LaTeX може не зуміти знайти важливі системні файли, такі як пакети LaTeX!

Використовуючи наведений вище простий приклад проєкту, ви тепер можете скомпілювати його — і voila! LaTeX знаходить ваш файл графіки — і ви можете перейменовувати або впорядковувати теки під /graphics, і це не завадить LaTeX знаходити їх.

## Таблиця зі списком «конфігураційних змінних» Kpathsea

Наведена нижче таблиця є зведенням, отриманим із [даних, перелічених у документації Kpathsea](http://tug.org/texinfohtml/kpathsea.html#Supported-file-formats).

|                                                     |                                                                                  |                                |
| --------------------------------------------------- | -------------------------------------------------------------------------------- | ------------------------------ |
| **Конфігураційна змінна Kpathsea**                  | **Опис типу файлу**                                                              | **Суфікс файлу**               |
| AFMFONTS                                            | Метрики шрифтів Adobe                                                            | .afm                           |
| MFBASES, TEXMFINI                                   | Дамп пам’яті Metafont                                                            | .base                          |
| BIBINPUTS, TEXBIB                                   | Бібліографічне джерело BibTeX                                                    | .bib                           |
| BLTXMLINPUTS                                        | Бібліографічні файли BibLaTeXML для Biber                                        | .bltxml                        |
| BSTINPUTS                                           | Стиль BibTeX                                                                     | .bst                           |
| CLUAINPUTS                                          | динамічні бібліотеки для Lua                                                     | .dll і .so                     |
| CMAPFONTS                                           | файли карти символів                                                             | .cmap                          |
| TEXMFCNF                                            | Файли конфігурації під час виконання                                             | .cnf                           |
| CWEBINPUTS                                          | вхідні файли CWEB                                                                | .w, .web, .ch                  |
| TEXCONFIG                                           | Файли Dvips 'config.\*', наприклад config.ps                                     |                                |
| ENCFONTS                                            | вектори кодування                                                                | .enc                           |
| TEXFORMATS, TEXMFINI                                | Дамп пам’яті TeX                                                                 | .fmt                           |
| FONTCIDMAPS                                         | відображення CJK                                                                 | .cid                           |
| FONTFEATURES                                        | передусім для можливостей шрифтів OpenType                                       | .fea                           |
| FONTS, GFFONTS, GLYPHFONTS, TEXFONTS                | загальний растровий образ шрифту                                                 | .gf                            |
| TEXPICTS, TEXINPUTS                                 | фігури Encapsulated PostScript                                                   | .eps, .epsi                    |
| TEXINDEXSTYLE, INDEXSTYLE                           | файли стилю makeindex                                                            | .ist                           |
| LIGFONTS                                            | файли визначення лігатур                                                         | .lig                           |
| TEXMFDBS                                            | Бази даних імен файлів                                                           |                                |
| TEXFONTMAPS                                         | Карти шрифтів                                                                    | .map                           |
| MPMEMS, TEXMFINI                                    | Дамп пам’яті MetaPost                                                            | .mem                           |
| MPSUPPORT                                           | файли підтримки MetaPost, що використовуються DMP                                |                                |
| MFINPUTS                                            | джерельний код Metafont                                                          | .mf                            |
| MFPOOL, TEXMFINI                                    | рядки програми Metafont                                                          | .pool                          |
| MFTINPUTS                                           | файл стилю MFT                                                                   | .mft                           |
| MISCFONTS                                           | файли, пов’язані зі шрифтами, що не підпадають під інші категорії                |                                |
| MLBIBINPUTS, BIBINPUTS, TEXBIB                      | Бібліографічне джерело MlBibTeX                                                  | .mlbib, .mlbib                 |
| MLBSTINPUTS, BSTINPUTS                              | Стиль MlBibTeX                                                                   | .mlbst, .bst                   |
| MPINPUTS                                            | Джерельний код MetaPost                                                          | .mp                            |
| MPPOOL, TEXMFINI                                    | рядки програми MetaPost                                                          | .pool                          |
| OCPINPUTS                                           | скомпільовані файли процесу Omega                                                | .ocp                           |
| OFMFONTS, TEXFONTS                                  | метрики шрифтів Omega                                                            | .ofm, .tfm                     |
| OPENTYPEFONTS                                       | Шрифти OpenType                                                                  |                                |
| OPLFONTS, TEXFONTS                                  | списки властивостей Omega                                                        | .opl                           |
| OTPINPUTS                                           | файли процесу перекладу Omega                                                    | .otp                           |
| OVFFONTS, TEXFONTS                                  | віртуальні шрифти Omega                                                          | .ovf                           |
| OVPFONTS, TEXFONTS                                  | віртуальні списки властивостей Omega                                             | .ovp                           |
| PDFTEXCONFIG                                        | файли конфігурації, специфічні для PDFTeX                                        |                                |
| PROGRAMFONTS, PKFONTS, TEXPKS, GLYPHFONTS, TEXFONTS | упаковані растрові шрифти                                                        | .pk                            |
| TEXPSHEADERS, PSHEADERS                             | PostScript, що завантажується                                                    | .pro                           |
| RISINPUTS                                           | бібліографічні файли RIS, переважно для Bibe                                     | .ris                           |
| SFDFONTS                                            | файли визначення підшрифтів                                                      | .sfd                           |
| TEXINPUTS                                           | джерельний код TeX                                                               | .tex                           |
| TEXDOCS                                             | Файли документації для системи TeX                                               |                                |
| TEXSOURCES                                          | Файли вихідного коду для системи TeX                                             |                                |
| TEXMFSCRIPTS                                        | виконувані файли, незалежні від архітектури, що розповсюджуються в деревах texmf |                                |
| TEXPOOL, TEXMFINI                                   | рядки програми TeX                                                               | .pool                          |
| TFMFONTS, TEXFONTS                                  | метрики шрифтів TeX                                                              | .tfm                           |
| TRFONTS                                             | шрифти Troff                                                                     |                                |
| TTFONTS                                             | контурні шрифти TrueType                                                         | .ttf, ,TTF, .ttc, .TTC, .dfont |
| T1FONTS, T1INPUTS, TEXPSHEADERS, DVIPSHEADERS       | контурні шрифти PostScript Type 1                                                | .pfa, .pfb                     |
| T42FONTS                                            | контурні шрифти PostScript Type 42                                               |                                |
| VFFONTS, TEXFONTS                                   | віртуальні шрифти                                                                | .vf                            |
| WEBINPUTS                                           | вхідні файли WEB                                                                 | .web, .ch                      |
| WEB2C                                               | файли, специфічні для реалізації 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/uk/dokladni-statti/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.
