> 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# Pengantar \endlinechar: Bagaimana TeX membaca baris dari file teks

Sebagai manusia, kita lebih suka melihat dan mengedit file teks berdasarkan baris demi baris. Setelah kita menganggap satu baris teks cukup panjang, kita menekan “return” (di editor teks) untuk menandai akhir baris tersebut. Di balik layar, editor teks Anda akan menafsirkannya sebagai instruksi untuk menambahkan sebuah [karakter baris baru](https://en.wikipedia.org/wiki/Newline) di titik ketika Anda memutuskan untuk memutus baris.

Namun, seandainya sesederhana itu: masalahnya adalah bahwa sistem operasi yang berbeda memiliki pengertian yang berbeda tentang apa yang merupakan karakter baris baru. Lebih buruk lagi, Windows akan memperlakukan karakter baris baru secara berbeda tergantung pada apakah sebuah file dibuka dalam yang disebut [*mode biner* atau *mode teks*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). Hasilnya adalah, tergantung pada sistem operasi host, baris dalam file teks dapat diakhiri oleh berbagai kombinasi karakter yang disebut *carriage return* (karakter ASCII/Unicode 13) dan *line feed* (karakter ASCII/Unicode 10): dilambangkan oleh `\r` dan `\n` masing-masing.

Jelas, agar independen terhadap sistem, TeX memerlukan cara untuk menangani keanehan yang diperkenalkan melalui karakter-karakter berbeda yang digunakan untuk mengakhiri baris di dalam file teks yang perlu dibaca dan diprosesnya.

### Buffer input TeX

Anda mungkin, atau mungkin tidak, akan terkejut mengetahui bahwa mesin TeX (termasuk LuaTeX dan XeTeX) membaca file input satu baris pada satu waktu: mereka tidak membaca seluruh file teks ke dalam memori. Meskipun sebagian besar file teks yang diproses oleh mesin TeX sangat kecil dibandingkan dengan memori yang tersedia pada perangkat modern, setiap baris dalam file dibaca dan disimpan secara individual dalam buffer internal kecil. Namun, tentu saja, proses TeX dalam membaca dan menyimpan sebuah baris memiliki beberapa putaran tambahan.

## “Saya akan melakukannya dengan Cara Saya Sendiri”—perintah \endlinechar TeX

Saat TeX membaca baris teks lain dari file input, ia melakukan dua “tugas pemeliharaan”:

* ia menghapus semua karakter baris baru penutup (\r atau \n) yang ditemukan di akhir baris—yaitu, ia menghapus semua akhir baris yang ditambahkan saat file teks awalnya disimpan ke disk;
* ia juga menghapus semua karakter spasi di akhir baris yang ditemukan di akhir baris.

Kedua proses ini terjadi sebelum TeX benar-benar mulai memindai karakter-karakter yang terkandung dalam baris itu sendiri: anggap saja ini sebagai bentuk “pemeliharaan” sebagai persiapan untuk tahap pemrosesan berikutnya (pemindaian). Jadi, selama tahap awal proses pembacaan baris ini, TeX telah menghapus semua akhiran baris yang bergantung pada platform (dan spasi kosong di akhir): jadi bagaimana TeX akan mengetahui (mendeteksi) di mana baris itu berakhir? TeX punya satu “trik” lagi: `\endlinechar` perintah.

Untuk menghindari masalah karakter baris baru yang bergantung pada platform, TeX memperkenalkan konsep `\endlinechar`, sebuah parameter yang dapat ditentukan pengguna yang digunakan TeX untuk menyisipkan karakter akhir-barisnya sendiri di bagian paling akhir baris teks yang baru saja dibacanya dari file. Perhatikan lagi bahwa ini terjadi sebelum TeX benar-benar mulai memindai karakter-karakternya—ini adalah langkah terakhir dalam “pemeliharaan” TeX sebelum siap untuk mulai membaca (memindai) karakter sebenarnya yang terkandung dalam baris.

TeX akan menggunakan nilai yang disimpan dalam `\endlinechar` untuk menambahkan terminator akhir-barisnya sendiri jika, dan hanya jika, `\endlinechar` didefinisikan dengan semestinya—dalam TeX karya Knuth itu berarti nilainya harus >-1 dan < 256. Biasanya, `\endlinechar` ditetapkan ke nilai 13: karakter carriage return—biasanya dilambangkan dengan `\r` dalam literatur pemrograman.

Namun jika Anda menulis `\endlinechar=-1` di suatu tempat dalam input Anda maka *lain kali* TeX membaca sebuah baris teks dari file, ia akan *berisi nilai data aktual yang disimpan dalam* tidak menambahkan terminator tambahan apa pun ke akhir baris. Akibatnya, input Anda akan diperlakukan sebagai satu string teks kontinu yang panjang sampai Anda mengatur ulang `\endlinechar` ke nilai yang sesuai—biasanya 13 (`\r`):

```latex
\endlinechar=13
```

Salah satu dari 16 kode kategori TeX (nilai 5) dicadangkan untuk mengidentifikasi karakter “akhir baris” yang biasanya merupakan karakter yang `\endlinechar` menyisipkan—yang disisipkan jika (dan hanya jika) nilai `\endlinechar` diatur ke nilai yang sesuai.

## Ringkasan pemrosesan akhir-baris

Meskipun rincian ini cukup rendah tingkatnya, rincian ini akan menarik bagi siapa pun yang ingin menjelajahi penulisan makro yang menangani pembacaan baris teks.

1. Saat TeX membaca sebuah baris dari file Anda, ia akan terlebih dahulu menghapus semua karakter akhir-baris (`\r` dan `\n`) yang ditambahkan oleh editor teks Anda ketika file disimpan. Selain itu:

* TeX juga menghapus semua karakter spasi di akhir baris;
* TeX *tidak* menghapus karakter tab di akhir baris (kode karakter ASCII 9).

**Catatan**samping

> (Dikutip dalam file `luatex.c`) “David Fuchs menyebutkan bahwa penghapusan \[spasi] ini dilakukan untuk memastikan portabilitas dokumen TeX mengingat pengisian dengan spasi pada "baris" rekaman tetap pada beberapa sistem di masa itu, misalnya IBM VM/CMS dan OS/360.”

3. Setelah langkah (1) TeX menambahkan (menyisipkan) karakter tambahan yang nilainya disimpan dalam \endlinechar (dengan syarat nilainya didefinisikan dengan semestinya: >-1 dan < 256)
4. \endlinechar biasanya disetel ke nilai 13 (`\r`), yang berarti karakter yang ditambahkan pada langkah (2) biasanya karakter 13 (`\r`)—tetapi, tentu saja, Anda dapat menyetel \endlinechar ke nilai lain untuk mencapai efek khusus melalui pemrograman makro.
5. Ketika rutin pemindaian inputnya mendeteksi karakter `\r` (kode karakter 13) di akhir buffer internalnya, TeX akan, seperti biasa, memeriksa kode kategorinya untuk memutuskan apa yang harus dilakukan dengannya.
6. Karakter 13 *biasanya* memiliki nilai kode kategori 5 (“akhir baris”) kecuali, tentu saja, kode kategorinya telah diubah—beberapa makro membuat karakter akhir-baris aktif untuk melakukan pemrosesan yang canggih.
7. Tergantung pada keadaan internal TeX (pada praktiknya, apa yang sedang dilakukannya) TeX dapat mengubah karakter akhir-baris itu (biasanya `\r`, kode kategori 5) menjadi karakter spasi—inilah cara karakter akhir baris menjadi spasi.
8. Perhatikan juga bahwa TeX menggunakan karakter dengan kode kategori 5 untuk mendeteksi saat ia telah membaca baris kosong dan perlu menghasilkan sebuah `\par` token.

Grafik berikut memberikan ringkasan visual dari langkah (1) dan (2): menghapus karakter baris baru dan karakter spasi di akhir baris serta menyisipkan `\endlinechar` siap untuk tugas memindai input.

![Bagaimana TeX menggunakan \endlinechar](/files/16b64dcb082ca36ae620acde36c8a40ea69e1732)


---

# 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-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.
