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

# Pengantar Kpathsea dan cara mesin TeX mencari file

## Pendahuluan

Artikel ini memberikan pengantar tentang bagaimana mesin TeX menemukan berkas yang dibutuhkan untuk menata dokumen Anda—menggunakan LaTeX atau paket makro lainnya. Meskipun Overleaf membebaskan pengguna dari tantangan mengelola instalasi TeX ([TeX Live](https://www.tug.org/texlive/)), dasar-dasar cara mesin TeX mencari berkas akan berguna/menarik jika Anda ingin membuat struktur folder untuk membantu mengelola proyek Overleaf Anda.

Mengapa itu bisa benar? Jika Anda menyimpan beberapa berkas proyek Overleaf Anda di dalam folder, LaTeX mungkin tidak menemukan berkas-berkas tersebut karena, secara default, mesin TeX (kompiler) mungkin tidak *tahu* bahwa ia perlu mencari di folder-folder tersebut—sehingga tidak akan menemukan berkas yang ada di dalamnya. Untuk menghindari hal ini, Anda dapat membuat, dan menambahkan ke proyek Anda, sebuah berkas konfigurasi yang disebut [berkas latexmkrc](https://mg.readthedocs.io/latexmk.html#configuration-files) yang dapat digunakan untuk memberi tahu mesin TeX bahwa folder-folder Anda ada dan bahwa ia harus mencarinya.

Jika Anda ingin langsung melihat contoh yang menunjukkan berkas latexmkrc, Anda dapat membaca artikel bantuan ini: [Cara menggunakan latexmkrc dengan Overleaf: contoh dan teknik](/latex/id/artikel-mendalam/28-how-to-use-latexmkrc-with-overleaf.md). Mungkin tidak langsung jelas bagaimana, atau mengapa, berkas latexmkrc itu benar-benar bekerja. Jika Anda ingin tahu alasannya dan, mungkin, mengembangkan pemahaman yang lebih baik untuk digunakan pada kemungkinan konfigurasi lanjutan bagi proyek Anda, maka lanjutkan membaca... Di akhir artikel ini kita akan membahas sebuah [contoh praktis](#kpathsea-and-texinputs-latexmkrc-file-to-the-rescue)—menggunakan pengetahuan tentang cara TeX mencari berkas—untuk membuat berkas latexmkrc guna mengelola folder bertingkat yang berisi berkas grafis Anda.

## TeX dan independensi platform

Ketika Knuth menciptakan TeX, independensi platform merupakan prinsip sentral yang memandu desain dan implementasinya, dan filosofi itu tercermin di seluruh operasi internal TeX (misalnya, menggunakan aritmetika bilangan bulat, penanganan string “buatan sendiri”, manajemen memori, dll). Bahkan hingga kini, independensi platform dari mesin berbasis TeX modern masih menimbulkan pertanyaan dan perdebatan di forum publik; misalnya, lihat diskusi ini di tex.stackexchange: [Apakah XeTeX dan LuaTeX bergantung pada platform?](https://tex.stackexchange.com/questions/94297/are-xetex-and-luatex-platform-dependent) yang berisi komentar dan pengamatan dari sejumlah pakar TeX ternama.

Namun, untuk saat ini mari kita kesampingkan rincian lebih halus dan catat bahwa mesin TeX memang masih harus sangat portabel—mampu bekerja pada berbagai sistem operasi dan menghasilkan hasil yang “identik”. Aspek kunci dari portabilitas adalah mencari berkas dengan cara yang independen terhadap platform.

## Mesin TeX tidak mencari berkas… sungguhan!?

Tidak, mesin TeX tidak *langsung* mencari berkas *sendiri*. Saat memproses sebuah `.tex` berkas, mesin TeX mungkin mengidentifikasi perlunya membuka berkas tertentu tetapi ia *mendelegasikan* tugas menemukannya kepada perangkat lunak lain yang disebut [*Kpathsea*](https://tug.org/kpathsea/): sebuah pustaka perangkat lunak eksternal yang bukan bagian dari *inti* kode sumber mesin TeX. Yang disediakan Kpathsea, pada dasarnya, adalah sebuah API ([Antarmuka Pemrograman Aplikasi](https://en.wikipedia.org/wiki/Application_programming_interface)) yang dapat dipanggil oleh mesin TeX (beserta BibTeX, MetaPost, dan aplikasi lain) setiap kali mereka perlu membuka berkas tertentu: Kpathsea-lah yang melakukan pekerjaan sebenarnya untuk menemukan berkas itu.

Ketika Knuth menulis mesin TeX asli—yang darinya semua mesin TeX lainnya, pada akhirnya, berasal—masalah menemukan/membuka berkas merupakan tantangan besar karena, sebagian, ekosistem teknologi yang sangat beragam pada masa itu. Bahkan, di kode sumber TeX Knuth merujuk input/output berkas sebagai “kutukan portabilitas” (lihat halaman 12, bagian 25 dari [TeX: The Program](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)).

Komunitas TeX menyadari perlunya menyelaraskan (menstandarkan) pencarian berkas untuk TeX—*dan perangkat lunak terkait TeX*—dan memutuskan untuk menyediakan alat bagi TeX untuk melakukannya. Untuk mengatasi masalah yang sangat sulit tentang metode menemukan berkas yang independen terhadap platform, Karl Berry, anggota terkemuka komunitas TeX, menulis perangkat lunak untuk menyelesaikan masalah *path*-searching: sebuah solusi yang ia beri nama [**Kpathsea**](http://tug.org/texinfohtml/kpathsea.html)—yang berasal dari **K**arl’s **Path** **Sea**rching (lihat ini [wawancara dengan Karl Berry](http://www.tug.org/interviews/berry.html)).

Kita dapat mencatat bahwa ini disebut K**path**sea dan bukan K**yang dapat diedit**sea karena, seperti yang [dokumentasi](http://tug.org/texinfohtml/kpathsea.html) dicatat, ini adalah pustaka \*pencarian-jalur\*. Penting untuk menyadari bahwa Kpathsea tidak hanya digunakan oleh mesin TeX; berbagai program terkait TeX, termasuk BibTeX dan MetaPost, juga menggunakan Kpathsea untuk mencari berkas masukan.

Secara garis besar, kapan pun makro TeX/LaTeX perlu membuka berkas tertentu, perintah yang menjadi dasar penyusunan makro tersebut pada akhirnya akan diubah menjadi instruksi TeX tingkat rendah (primitif TeX) yang benar-benar dieksekusi oleh mesin TeX. Jika instruksi itu mencakup kebutuhan untuk membuka sebuah berkas, mesin TeX akan memanggil Kpathsea sambil, pada dasarnya, berkata, “tolong temukan berkas ini”; jika pencarian Kpathsea berhasil, berkas dibuka. Namun, jika Kpathsea tidak dapat menemukan berkas tersebut maka mesin TeX akan diberi tahu hal itu dan akan menghentikan eksekusi untuk menampilkan kesalahan yang terkenal ``! Saya tidak dapat menemukan berkas `...'`` Yang sebenarnya adalah Kpathsea tidak dapat menemukannya.

### Catatan tentang LuaTeX

Secara ketat, kami seharusnya memberi catatan pada bagian ini dengan menyebutkan bahwa LuaTeX memang menawarkan mekanisme bagi pengguna untuk menyediakan kode pencarian berkas mereka sendiri melalui penggunaan *callback*. LuaTeX memungkinkan pengguna menulis fungsi dalam bahasa skrip Lua dan mendaftarkannya dengan LuaTeX sehingga ia akan memanggil fungsi yang ditentukan pengguna itu pada tahap-tahap tertentu selama eksekusi LuaTeX—karenanya istilah *callback*. Ini adalah teknik yang sangat kuat dan pembaca yang berminat dapat menemukan informasi lebih lanjut di Bagian 9 dari [Panduan Referensi LuaTeX](http://www.pragma-ade.com/general/manuals/luatex.pdf) (pada saat penulisan, tautan itu untuk LuaTeX 1.09).

### Berkas konfigurasi Kpathsea: texmf.cnf

Setiap instalasi TeX berisi sebuah berkas teks bernama `texmf.cnf` yang merupakan berkas konfigurasi yang digunakan oleh Kpathsea: berkas ini berisi banyak “variabel konfigurasi” yang mendefinisikan jalur yang akan digunakan Kpathsea untuk mencari berbagai jenis berkas yang mungkin diperlukan mesin TeX (atau BibTeX, MetaPost, dll). Seperti akan kita lihat di bawah, “variabel konfigurasi” itu mendefinisikan jalur pencarian yang dibangun dari apa yang disebut *elemen jalur*: menggunakan berbagai konstruksi, variabel, dan parameter untuk mendefinisikan setiap elemen jalur sebagai “templat” yang diproses Kpathsea untuk menghasilkan direktori fisik sebenarnya yang akan dicari.

Sebagai contoh konkret, berikut salah satu variabel konfigurasi yang mendefinisikan jalur pencarian untuk font OpenType—untuk saat ini, jangan khawatir tentang arti konstruksi jalur ini:

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

Yang penting di sini adalah bahwa berkas `texmf.cnf` (dibaca oleh Kpathsea) mendefinisikan sebuah variabel konfigurasi bernama `OPENTYPEFONTS` yang digunakan untuk mendefinisikan jalur yang akan dipakai Kpathsea untuk mencari font OpenType. Sisi kanan tanda “=” tidak tampak seperti jalur apa pun yang biasa Anda lihat pada perangkat biasa karena ia dibangun menggunakan berbagai variabel dan parameter untuk mendefinisikan setiap jalur sebagai “templat” atau “cetak biru” yang akan digunakan Kpathsea untuk menghasilkan direktori nyata yang akan dicari.

### Konsep “jalur” milik Kpathsea

Mungkin konsep inti yang perlu dipahami adalah pengertian Kpathsea tentang sebuah “jalur”: konstruksi dasar yang digunakan Kpathsea untuk mengetahui di mana suatu berkas tertentu berada. Seperti yang kita lihat pada `OPENTYPEFONTS` contoh di atas, pengertian jalur dalam Kpathsea tampak sangat berbeda dari jalur yang biasa kita gunakan pada perangkat desktop atau portabel.

Untuk mengutip dari dokumentasi Kpathsea [dokumentasi](http://tug.org/texinfohtml/kpathsea.html#Searching-overview):

> ... sebuah *jalur pencarian* adalah daftar elemen jalur yang dipisahkan oleh titik dua *elemen jalur*, yang merupakan nama direktori dengan beberapa “hiasan tambahan”.

—tetapi perhatikan bahwa titik koma (`;`) juga digunakan untuk memisahkan *elemen jalur*. Nanti, kita akan secara singkat menunjukkan sifat dari beberapa “hiasan tambahan” itu.

Dalam `OPENTYPEFONTS` contoh kita ada tiga elemen jalur, masing-masing dipisahkan menggunakan titik koma (`;`):

![Gambar yang menunjukkan elemen-elemen jalur yang terkandung dalam definisi jalur Kpathsea](/files/461bb35ab108e438ab9d8a5ee72803fa9b2e1b3e)

1. `.` (artinya direktori saat ini)
2. `$TEXMF/fonts/{opentype,truetype}//`
3. `$OSFONTDIR//`

Perhatikan bahwa dua garis miring (`//`) dalam sebuah elemen jalur berarti mencari subdirektori (secara rekursif).

Sebuah `texmf.cnf` berkas biasanya akan berisi banyak “variabel konfigurasi” untuk mendefinisikan jalur pencarian bagi tipe berkas yang dapat dicari Kpathsea.

## Kpathsea: Ikhtisar yang sangat singkat

Kpathsea adalah pustaka yang canggih—dengan banyak rincian halus dan nuansa—dan bahkan sekilas melihat [dokumentasi](http://tug.org/texinfohtml/kpathsea.html) membuat jelas bahwa kita tidak bisa membahas semua rinciannya. Namun, kita dapat mencoba memberikan ikhtisar tentang apa yang dilakukannya—untuk membantu mengarahkan pemikiran Anda dan menawarkan titik awal untuk bacaan lebih lanjut.

### Tujuan inti Kpathsea

Seperti dicatat dalam dokumentasi, tujuan mendasar Kpathsea adalah “mengembalikan nama berkas dari daftar direktori yang ditentukan oleh pengguna” dan bahwa direktori-direktori itu (jalur pencarian) ditentukan menggunakan “beberapa hiasan tambahan”.

### “Hiasan tambahan” itu

“Beberapa hiasan tambahan” yang disebutkan di atas mencakup berbagai parameter dan variabel yang digunakan Kpathsea untuk menyusun jalur pencariannya (atau “templat jalur”) sehingga ia dapat mendefinisikan jalur dengan cara yang lebih umum. Ketika sebuah mesin TeX benar-benar sedang berjalan (mengeksekusi), Kpathsea dapat menggunakan nilai terkini dari parameter/variabel tersebut untuk mengetahui jalur yang sebenarnya dengan mengganti variabel-variabel itu dengan nilai sebenarnya (saat runtime). Anda dapat dengan mudah mengidentifikasi variabel-variabel itu (di dalam elemen jalur) karena mereka dimulai dengan tanda `$` tanda $.

Jadi, kita mengatakan bahwa Kpathsea *memperluas* sebuah elemen jalur, yang berarti ia mengubah parameter dan variabel tersebut: mengubah sebuah “templat” jalur menjadi nama sebenarnya dari satu atau lebih direktori fisik tempat berkas dicari. Ini menawarkan banyak fleksibilitas dan berarti bahwa Kpathsea mungkin menyusun daftar direktori yang sesuai dengan sebuah elemen jalur individual—misalnya, jika ia diberi tahu untuk mencari subdirektori.

### Meninjau kembali contoh OpenType kita

Kita akan merangkai berbagai bagian dan menjelajahi `OPENTYPEFONTS` dengan sedikit lebih detail:

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

Mari kita pertimbangkan dua elemen jalur `$TEXMF/fonts/{opentype,truetype}//` dan `$OSFONTDIR//`. Di sini, Kpathsea memperhatikan penggunaan kurung kurawal `{...}` dan memperlakukannya `$TEXMF/fonts/{opentype,truetype}` sebagai mewakili *dua* elemen jalur:

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

dan bahwa *subdirektori* dari kedua elemen jalur itu juga harus dicari (ditunjukkan oleh akhiran `//`).

**Catatan**: Lihat dokumentasi Kpathsea tentang [ekspansi subdirektori](http://tug.org/texinfohtml/kpathsea.html#Subdirectory-expansion) untuk catatan penting tentang urutan pencarian subdirektori, pada level mana pun (urutan itu tidak ditentukan).

Kita akan membuat beberapa pengamatan tentang `$TEXMF` di bawah.

#### $OSFONTDIR//

`$OSFONTDIR` adalah sebuah variabel yang nilainya harus didefinisikan sebagai variabel lingkungan yang berisi lokasi tempat font disimpan: nilai persisnya tentu saja akan bergantung pada sistem operasi yang digunakan untuk menjalankan TeX. Perhatikan bahwa, di sini, akhiran `//` memerintahkan Kpathsea untuk mencari subdirektori saat mencari font OpenType.

Definisi bawaan `OSFONTDIR` di dalam `texmf.cnf` adalah:

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

Jadi, ini jelas sesuatu yang perlu Anda atur jika ingin menggunakannya—variabel lingkungan Anda akan menimpa definisi “placeholder” yang terdapat dalam `texmf.cnf`.

Jika Anda memang mengatur variabel lingkungan `OSFONTDIR` maka, saat runtime, di mana pun Kpathsea melihat `$OSFONTDIR` sebagai bagian dari elemen jalur (di `texmf.cnf`) ia dapat mengganti variabel `$OSFONTDIR` dengan nilai sebenarnya yang tersimpan dalam variabel lingkungan `OSFONTDIR`. Ingat bahwa ketika menggunakannya di dalam `texmf.cnf` elemen jalur kita menetapkan variabel `$OSFONTDIR`—dengan awalan `$`—untuk memberi tahu Kpathsea bahwa ini adalah variabel yang *nilai* ia perlu gunakan.

#### Catatan singkat tentang $TEXMF

`TEXMF` adalah variabel konfigurasi lain yang didefinisikan dalam `texmf.cnf`; misalnya, dalam distribusi utama TeX Live Anda akan melihat:

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

Anda tidak perlu memikirkan rincian definisi `TEXMF`—kita tidak akan membahas semua detailnya, tetapi cukup catat bahwa `$TEXMF` variabel ini digunakan di dalam elemen jalur karena ia mendefinisikan serangkaian folder tingkat atas (disebut “pohon texmf”) dari mana Anda dapat memulai pencarian berkas.

`TEXMF` sangat berguna jika Anda ingin, atau perlu, memisahkan instalasi TeX ke dalam beberapa direktori (atau “pohon” direktori). Misalnya, memiliki koleksi utama atau induk paket TeX/LaTeX (mis., TeX Live) dan koleksi lain berisi berkas dan folder yang digunakan untuk menyimpan paket LaTeX lokal—atau, mungkin, digunakan untuk menyimpan berkas konfigurasi lokal atau versi yang disesuaikan dari paket standar. Memisahkan instalasi TeX dengan cara ini dapat memudahkan pengelolaan pembaruan koleksi utama/induk (distribusi) paket TeX/LaTeX karena koleksi lokal Anda terpisah dari berkas induk yang diperbarui saat Anda meningkatkan distribusi/instalasi TeX Live Anda.

Untuk rincian lebih lanjut tentang mengelola instalasi TeX yang lebih kompleks, pembaca yang berminat dirujuk ke dua makalah berikut:

* [Mengelola Beberapa Pohon TDS](http://tug.org/TUGboat/Articles/tb22-3/tb72downes.pdf) oleh Michael J Downes;
* [Juggling texmf trees](http://www.ntg.nl/maps/27/17.pdf) oleh Siep Kroonenberg.

#### Struktur Direktori TeX

Siapa pun yang pernah mengelola instalasi TeX tahu bahwa sistem TeX modern, seperti TeX Live, berisi puluhan ribu berkas yang mencakup rentang tipe berkas yang sangat luas. TeX Directory Structure (TDS) dirancang sebagai “cetak biru” praktik terbaik untuk mengorganisasi kumpulan berkas yang sangat besar dalam instalasi TeX yang berfungsi dan sangat disarankan untuk digunakan bersama Kpathsea.

Untuk informasi lebih lanjut pembaca diarahkan ke spesifikasi TDS: [Struktur Direktori untuk File TeX](https://www.tug.org/tds/tds.pdf).

## Tipe berkas Kpathsea

Rangkaian aplikasi yang menggunakan Kpathsea perlu mengakses beragam tipe berkas sehingga Kpathsea menggunakan sebuah “variabel konfigurasi” untuk mengidentifikasi jalur untuk setiap tipe berkas (atau kelompok berkas) yang didukungnya. Dokumentasi daring memiliki daftar lengkap (lihat juga [tabel ringkasan kami di bawah](#table-listing-kpathsea-config-variables)) tetapi berikut adalah “variabel konfigurasi” untuk tipe berkas yang lebih umum:

|                          |                                            |
| ------------------------ | ------------------------------------------ |
| **Variabel konfigurasi** | **Contoh tipe berkas**                     |
| TEXINPUTS                | Berkas sumber TeX dan berkas gambar/grafis |
| BIBINPUTS, BSTINPUTS     | Berkas sumber bibliografi BibTeX           |
| TTFONTS                  | Font outline TrueType                      |
| OPENTYPEFONTS            | font outline OpenType                      |

`TEXINPUTS` adalah variabel konfigurasi yang sangat penting karena ia menentukan dari mana sebuah mesin TeX memperoleh berkas sumber masukannya. Perhatikan bahwa berkas gambar dianggap sebagai berkas masukan dan juga dapat dicari menggunakan jalur yang ditentukan oleh `TEXINPUTS`.

### Beberapa nuansa Kpathsea

Seperti disebutkan, Kpathsea memiliki banyak nuansa yang tidak dapat kita bahas secara rinci di sini. Namun, berikut adalah fitur-fitur yang mungkin ingin dijelajahi oleh sebagian pembaca:

* **basis data nama berkas:** Untuk meminimalkan pencarian disk, Kpathsea dapat memanfaatkan sebuah “ [berkas basis data nama berkas yang dibangun secara eksternal bernama ls-R](http://tug.org/texinfohtml/kpathsea.html#Filename-database) yang memetakan berkas ke direktori”. TeX Live menyediakannya beserta alat untuk memperbaruinya jika berkas baru ditambahkan.
* **variabel lingkungan**: Selain “variabel konfigurasi” (seperti `OPENTYPEFONTS`) Kpathsea juga menggunakan [variabel lingkungan](https://en.wikipedia.org/wiki/Environment_variable); misalnya, nilai runtime variabel lingkungan dapat digunakan untuk mendefinisikan elemen jalur dalam `texmf.cnf` berkas (mungkin untuk menimpa variabel dengan nama sama yang didefinisikan dalam `texmf.cnf`).
* **nama program:** Salah satu aspek halus tetapi penting dari perilaku Kpathsea adalah bahwa ia dapat memanfaatkan nama program eksekutabel (mis., mesin TeX) untuk membangun konstruksi jalur pencarian spesifik program. Ini memberikan fleksibilitas yang besar karena pencarian jalur dapat diarahkan ke berkas untuk mesin TeX tertentu. Misalnya, untuk LuaTeX/LuaLaTeX:

  ```
  TEXINPUTS.lualatex = .;$TEXMF/tex/{lualatex,latex,luatex,generic,}//
  TEXINPUTS.luatex = .;$TEXMF/tex/{luatex,plain,generic,}//
  ```
* **menemukan `texmf.cnf`**: Pertanyaan yang mungkin Anda ajukan adalah bagaimana Kpathsea tahu di mana `texmf.cnf` disimpan? Jawabannya adalah variabel lingkungan bernama `TEXMFCNF`. Ini perlu diatur (pada perangkat/platform yang menjalankan TeX) ke jalur tempat `texmf.cnf` disimpan.

#### Men-debug masalah Kpathsea

Pengguna Overleaf kemungkinan besar tidak memerlukan fasilitas ini tetapi kami mencantumkannya untuk kelengkapan:

* **kpsewhich**: Sebuah program mandiri (disertakan dalam TeX Live) yang dapat digunakan untuk menguji pengaturan Anda: menentukan nilai variabel dan menemukan berkas. Pembaca yang berminat dirujuk ke [dokumentasi daring](http://tug.org/texinfohtml/kpathsea.html#Invoking-kpsewhich) untuk informasi lebih lanjut.
* **variabel lingkungan**: Kpathsea mendukung variabel lingkungan bernama [`KPATHSEA_DEBUG`](http://www.tug.org/texinfohtml/kpathsea.html#Debugging) untuk membantu men-debug perilakunya. Anda dapat mengatur `KPATHSEA_DEBUG` ke berbagai nilai tergantung pada seberapa banyak informasi debug yang Anda butuhkan. Mengatur `KPATHSEA_DEBUG=-1` akan menghasilkan *sejumlah besar* data.

## Dan akhirnya: folder, berkas gambar, dan latexmkrc

Jadi, bagaimana hal di atas terkait dengan latexmkrc? Jika Anda membaca artikel ini [Cara menggunakan latexmkrc dengan Overleaf: contoh dan teknik](/latex/id/artikel-mendalam/28-how-to-use-latexmkrc-with-overleaf.md) Anda dapat melihat bahwa kode (Perl) dalam contoh latexmkrc menetapkan nilai variabel lingkungan `TEXINPUTS`:

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

Perhatikan bahwa titik dua (:) yang digunakan di sini (`./tex//**:**`) adalah *sangat* penting. Jika Anda menghilangkan titik dua itu maka TeX/LaTeX mungkin tidak dapat menemukan berkas sistem vital, seperti paket LaTeX!

Apa yang dilakukan berkas latexmkrc ini, pada dasarnya, adalah menambahkan sebuah jalur folder tingkat atas (`./tex` pada contoh di atas) ke `TEXINPUTS` variabel lingkungan yang ditentukan sistem sehingga ketika Kpathsea menggunakan variabel `$TEXINPUTS` ia kemudian akan menyadari bahwa folder `/tex//` harus dicari untuk menemukan berkas masukan. Jika Anda perhatikan dengan saksama, Anda akan melihat bahwa jalur sebenarnya yang digunakan adalah `./tex//:` situs web `//` memerintahkan Kpathsea untuk mencari folder tex secara rekursif—yakni, melihat ke dalam subfolder apa pun yang terkandung dalam `tex` folder. Seperti disebutkan, kita juga menambahkan karakter titik dua yang penting.

Kita dapat menggunakan teknik yang sama persis untuk berkas gambar.

### Sisipan tentang BibTeX

Seperti disebutkan, program BibTeX juga menggunakan Kpathsea untuk mencari berkas masukannya; khususnya:

* situs web `BSTINPUTS` variabel konfigurasi (jalur pencarian) digunakan untuk mencari `.bst` berkas;
* dan `BIBINPUTS` variabel konfigurasi (jalur pencarian) akan digunakan untuk mencari `.bib` berkas.

Jika Anda menambahkan baru `.bst` atau `.bib` berkas ke proyek Overleaf Anda, Anda dapat menggunakan teknik di bawah ini untuk memberi tahu BibTeX di mana menemukan berkas-berkas ini—Anda perlu mengganti `TEXINPUTS` dengan `BSTINPUTS` dan/atau `BIBINPUTS`.

### TEXINPUTS dan penggunaan folder bertingkat untuk berkas grafis

Jika proyek Anda memiliki banyak berkas grafis, akan praktis untuk membuat seperangkat folder untuk menyimpan dan mengelolanya. Misalnya, tangkapan layar berikut menunjukkan bagian dari proyek Overleaf yang menggunakan folder tingkat atas bernama **`grafis`**:

![Gambar yang menunjukkan folder bertingkat dalam sebuah proyek Overleaf](/files/a5da233eba173c30918dcc53d20a9aa0b9f7554c)

Ada banyak subfolder (bertumpuk) yang berisi grafis untuk berbagai bagian dokumen kami.

Misalkan kita memiliki struktur folder di atas dan ingin menggunakan `graphicx` (`\usepackage{graphicx}`) dan bahwa kita mencoba melakukannya seperti ini:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% praktik terbaik adalah tidak menggunakan ekstensi berkas
\end{document}
```

Itu tidak akan berhasil dan Anda akan mendapatkan kesalahan seperti ini:

```
! Kesalahan LaTeX: Berkas `endlinechar' tidak ditemukan.
l.4 \includegraphics{endlinechar}
Saya tidak dapat menemukan berkas dengan ekstensi mana pun berikut ini:
.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
```

Kesalahan itu muncul karena berkas grafis kita disimpan di lokasi yang tidak diketahui oleh TeX/LaTeX (dan Kpathsea), sehingga tidak dapat menemukannya—jalur ke berkas grafis tersebut adalah:

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

**Catatan**: Secara umum dianggap praktik terbaik untuk ***menghindari karakter spasi dalam nama folder***. Meskipun tentu saja dimungkinkan untuk memiliki spasi dalam nama folder, dengan menggunakan teknik yang dibahas di bawah ini, kami akan menyarankan untuk tidak melakukannya demi portabilitas dokumen di luar platform Overleaf.

Seperti dijelaskan dalam [artikel bantuan Overleaf](/latex/id/topik-lainnya/27-inserting-images.md) Anda tentu saja dapat menggunakan folder untuk menyimpan grafis Anda tetapi Anda perlu memberi tahu LaTeX di mana grafis itu disimpan. Di sini, kita akan melihat dua solusi:

* Menggunakan perintah \graphicspath;
* Menggunakan pengetahuan kita tentang Kpathsea dan `TEXINPUTS`.

### Menggunakan \graphicspath

Fitur `graphicx` paket menyediakan `\graphicspath` perintah yang dapat Anda gunakan untuk mendeklarasikan jalur tempat grafis Anda berada; jadi kita bisa melakukan sesuatu seperti ini:

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

dan LaTeX sekarang akan menemukan grafis apa pun yang disimpan di bawah jalur itu.

**Catatan**: Jika Anda *harus* memiliki spasi dalam nama folder maka Anda perlu mengapit jalur dalam tanda kutip ganda (`"..."`):

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

**Catatan**: Anda dapat mendeklarasikan beberapa jalur seperti ini:

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

di mana `...` berarti jalur tambahan yang diapit oleh kurung kurawal.

**Catatan**: Kita memulai jalur dengan `./graphics` dan bukan hanya `/graphics`. Titik (.) memberi tahu sistem operasi bahwa jalur tersebut relatif terhadap direktori kerja saat ini.

Fitur `\graphicspath` perintah bekerja dengan baik tetapi jika Anda memiliki banyak folder bisa menjadi cukup merepotkan untuk menambahkan setiap jalur; selain itu, jalur yang didefinisikan melalui `\graphicspath` tidak akan lagi berfungsi jika Anda mengganti nama folder atau menyusun ulang strukturnya. Apakah ada cara yang lebih mudah? Ya, Anda dapat menggunakan file latexmkrc!

#### \graphicspath dan rekursi (subdirektori)

Perhatikan bahwa ada diskusi/debat daring tentang apakah beberapa sistem mendukung/mengaktifkan `\graphicspath` untuk mencari subdirektori secara rekursif jika Anda menambahkan `//` di akhir jalur: lihat, misalnya, diskusi berikut di tex.stackexchange:

* [Pencarian rekursif \graphicspath di LaTeX](https://tex.stackexchange.com/questions/25443/latex-graphicspath-recursive-search);
* [Graphicspath untuk MikTeX](https://tex.stackexchange.com/questions/3131/graphicspath-for-miktex).

Untuk kompatibilitas terbesar Anda sebaiknya mengasumsikan bahwa `\graphicspath` tidak mendukung pencarian direktori secara rekursif.

### Kpathsea dan TEXINPUTS (file latexmkrc sebagai penyelamat)

**CATATAN:** Perhatikan bahwa teknik berikut bekerja dengan baik di Overleaf dan instalasi TeX lokal yang dikonfigurasi dengan sesuai; **tetapi** jika Anda menggunakan file latexmkrc, proyek Anda mungkin menjadi tidak kompatibel dengan instalasi TeX lain, seperti yang digunakan oleh penerbit dan sistem pengajuan jurnal daring. Instalasi TeX pihak ketiga mungkin, atau mungkin tidak, mendukung atau mengizinkan penggunaan latexmkrc. Jika Anda perlu mengekspor proyek Overleaf Anda untuk digunakan di tempat lain, atau ingin mengirimkannya ke jurnal, Anda harus menghapus karakter spasi dari nama jalur dan, demi kompatibilitas yang lebih baik, menambahkan sebuah `\graphicspath` perintah yang mendefinisikan semua jalur:

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

di mana `...` berarti jalur tambahan yang diapit oleh kurung kurawal.

Teknik yang dibahas di bawah ini (menggunakan `TEXINPUTS`) telah berhasil diuji di Overleaf dengan mesin pdfTeX, XeTeX, dan LuaTeX (yakni, opsi kompilator pdfLaTeX, XeLaTeX, dan LuaLaTeX di menu Overleaf):

![Gambar yang menunjukkan cara memilih kompiler LaTeX di Overleaf](/files/d3a5f1369c0e8318ecb060baa0e905cfafaf9462)

Kembali ke contoh kita, kita ingin menggunakan kode ini (dengan folder yang sangat bertingkat) dan kita akan menggunakan file latexmkrc untuk mewujudkannya:

```latex
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{endlinechar}% praktik terbaik adalah tidak menggunakan ekstensi berkas
\end{document}
```

Berikut tangkapan layar yang menunjukkan kode di atas bekerja tanpa masalah: LaTeX telah menemukan berkas grafis kita (`endlinechar.png`) meskipun berkas itu berada dalam struktur folder yang sangat bertingkat (tanpa spasi apa pun dalam nama folder).

![Gambar yang menunjukkan proyek dengan folder bertingkat yang dikompilasi di Overleaf](/files/297cfc591826bb1459f41e4b3d551e26f511854e)

Jadi, bagaimana kita melakukan ini? Yang perlu Anda lakukan hanyalah:

* membuat file baru, tanpa ekstensi, dan beri nama latexmkrc;
* tambahkan baris berikut ke file itu:

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

Kpathsea kini akan mengetahui folder yang terdapat di bawah `**graphics**` dan karena `//` ia juga akan mencari di subfolder.

Perhatikan kembali bahwa titik dua dalam `./graphics//:` sebenarnya *sangat* penting. Jika Anda menghilangkan titik dua itu maka TeX/LaTeX mungkin tidak dapat menemukan berkas sistem vital, seperti paket LaTeX!

Dengan menggunakan contoh proyek sederhana di atas, kini Anda dapat mengompilasinya dan voila! LaTeX menemukan berkas grafis Anda—dan Anda dapat mengganti nama atau menata ulang folder di bawah /graphics tanpa menghalangi LaTeX untuk menemukannya.

## Tabel yang mencantumkan “variabel konfigurasi” Kpathsea

Tabel berikut adalah ringkasan yang diambil dari [data yang tercantum dalam dokumentasi Kpathsea](http://tug.org/texinfohtml/kpathsea.html#Supported-file-formats).

|                                                     |                                                                              |                                |
| --------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------ |
| **Variabel konfigurasi Kpathsea**                   | **Deskripsi jenis berkas**                                                   | **Sufiks berkas**              |
| AFMFONTS                                            | metrik font Adobe                                                            | .afm                           |
| MFBASES, TEXMFINI                                   | dump memori Metafont                                                         | .base                          |
| BIBINPUTS, TEXBIB                                   | sumber bibliografi BibTeX                                                    | .bib                           |
| BLTXMLINPUTS                                        | berkas bibliografi BibLaTeXML untuk Biber                                    | .bltxml                        |
| BSTINPUTS                                           | gaya BibTeX                                                                  | .bst                           |
| CLUAINPUTS                                          | pustaka dinamis untuk Lua                                                    | .dll dan .so                   |
| CMAPFONTS                                           | berkas peta karakter                                                         | .cmap                          |
| TEXMFCNF                                            | Berkas konfigurasi runtime                                                   | .cnf                           |
| CWEBINPUTS                                          | berkas masukan CWEB                                                          | .w, .web, .ch                  |
| TEXCONFIG                                           | berkas 'config.\*' Dvips, seperti config.ps                                  |                                |
| ENCFONTS                                            | vektor pengodean                                                             | .enc                           |
| TEXFORMATS, TEXMFINI                                | dump memori TeX                                                              | .fmt                           |
| FONTCIDMAPS                                         | pemetaan CJK                                                                 | .cid                           |
| FONTFEATURES                                        | terutama untuk fitur font OpenType                                           | .fea                           |
| FONTS, GFFONTS, GLYPHFONTS, TEXFONTS                | bitmap font generik                                                          | .gf                            |
| TEXPICTS, TEXINPUTS                                 | gambar PostScript Terenkapsulasi                                             | .eps, .epsi                    |
| TEXINDEXSTYLE, INDEXSTYLE                           | berkas gaya makeindex                                                        | .ist                           |
| LIGFONTS                                            | berkas definisi ligatur                                                      | .lig                           |
| TEXMFDBS                                            | Basis data nama berkas                                                       |                                |
| TEXFONTMAPS                                         | Peta font                                                                    | .map                           |
| MPMEMS, TEXMFINI                                    | dump memori MetaPost                                                         | .mem                           |
| MPSUPPORT                                           | berkas pendukung MetaPost, digunakan oleh DMP                                |                                |
| MFINPUTS                                            | sumber Metafont                                                              | .mf                            |
| MFPOOL, TEXMFINI                                    | string program Metafont                                                      | .pool                          |
| MFTINPUTS                                           | berkas gaya MFT                                                              | .mft                           |
| MISCFONTS                                           | berkas terkait font yang tidak termasuk dalam kategori lain                  |                                |
| MLBIBINPUTS, BIBINPUTS, TEXBIB                      | sumber bibliografi MlBibTeX                                                  | .mlbib, .mlbib                 |
| MLBSTINPUTS, BSTINPUTS                              | gaya MlBibTeX                                                                | .mlbst, .bst                   |
| MPINPUTS                                            | sumber MetaPost                                                              | .mp                            |
| MPPOOL, TEXMFINI                                    | string program MetaPost                                                      | .pool                          |
| OCPINPUTS                                           | berkas proses terkompilasi Omega                                             | .ocp                           |
| OFMFONTS, TEXFONTS                                  | metrik font Omega                                                            | .ofm, .tfm                     |
| OPENTYPEFONTS                                       | font OpenType                                                                |                                |
| OPLFONTS, TEXFONTS                                  | daftar properti Omega                                                        | .opl                           |
| OTPINPUTS                                           | berkas proses penerjemahan Omega                                             | .otp                           |
| OVFFONTS, TEXFONTS                                  | font virtual Omega                                                           | .ovf                           |
| OVPFONTS, TEXFONTS                                  | daftar properti virtual Omega                                                | .ovp                           |
| PDFTEXCONFIG                                        | berkas konfigurasi khusus PDFTeX                                             |                                |
| PROGRAMFONTS, PKFONTS, TEXPKS, GLYPHFONTS, TEXFONTS | font bitmap terkemas                                                         | .pk                            |
| TEXPSHEADERS, PSHEADERS                             | PostScript yang dapat diunduh                                                | .pro                           |
| RISINPUTS                                           | berkas bibliografi RIS, terutama untuk Bibe                                  | .ris                           |
| SFDFONTS                                            | berkas definisi subfont                                                      | .sfd                           |
| TEXINPUTS                                           | sumber TeX                                                                   | .tex                           |
| TEXDOCS                                             | Berkas dokumentasi untuk sistem TeX                                          |                                |
| TEXSOURCES                                          | Berkas sumber untuk sistem TeX                                               |                                |
| TEXMFSCRIPTS                                        | Berkas eksekusi independen arsitektur yang didistribusikan dalam pohon texmf |                                |
| TEXPOOL, TEXMFINI                                   | string program TeX                                                           | .pool                          |
| TFMFONTS, TEXFONTS                                  | metrik font TeX                                                              | .tfm                           |
| TRFONTS                                             | font Troff                                                                   |                                |
| TTFONTS                                             | Font outline TrueType                                                        | .ttf, ,TTF, .ttc, .TTC, .dfont |
| T1FONTS, T1INPUTS, TEXPSHEADERS, DVIPSHEADERS       | font outline PostScript Tipe 1                                               | .pfa, .pfb                     |
| T42FONTS                                            | font outline PostScript Tipe 42                                              |                                |
| VFFONTS, TEXFONTS                                   | font virtual                                                                 | .vf                            |
| WEBINPUTS                                           | berkas masukan WEB                                                           | .web, .ch                      |
| WEB2C                                               | berkas khusus untuk implementasi 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/id/artikel-mendalam/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.
