> 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/23-how-does-latex-typeset-headers-and-footers.md).

# Bagaimana LaTeX menata header dan footer?

## Bagaimana LaTeX mengatur header dan footer?

### Pendahuluan

Jika Anda mencari panduan cara mengubah header dan footer, silakan [kunjungi halaman bantuan kami](/latex/id/pemformatan/02-headers-and-footers.md) karena artikel ini berfokus pada penjelasan mekanisme tingkat rendah yang digunakan oleh mesin TeX dan LaTeX untuk menghasilkan header dan footer.

* **Catatan (pembaruan)**: Artikel ini membahas mekanisme mark inti LaTeX yang digunakan sebelum Juni 2022, saat implementasi baru dan lebih serbaguna untuk penanganan mark LaTeX diperkenalkan. Lihat [Ikhtisar mekanisme mark baru LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) untuk detail selengkapnya. Demi kompatibilitas mundur, LaTeX tetap mendukung mekanisme mark lamanya. Materi artikel yang membahas perilaku mesin TeX tidak terpengaruh oleh perubahan pada LaTeX ini.
* **Catatan**: istilah “LaTeX”, “TeX”, dan “mesin TeX” digunakan di seluruh pembahasan ini, jadi ada baiknya memahami artinya—lihat artikel Overleaf [Apa Arti Sebuah Nama: Panduan untuk Berbagai Ragam TeX](/latex/id/artikel-mendalam/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) untuk informasi lebih lanjut.

Untuk memberikan latar belakang/konteks yang berguna, kita mulai dengan gambaran umum beberapa area tingkat rendah yang relevan dalam penataan huruf berbasis TeX—termasuk penyimpanan konten sementara (internal), pemutusan halaman, dan penyusunan. Pembahasan telah disederhanakan dengan mempertimbangkan halaman yang ditata yang berisi “isi” teks beserta beberapa header dan footer. Elemen halaman seperti gambar (float) dan catatan kaki tidak dibahas karena melibatkan mekanisme TeX yang kompleks yang disebut *insertions*, yang jauh di luar cakupan artikel ini.

Kita akan mulai dengan gagasan dasar tentang *node*: blok penyusun fundamental yang digunakan oleh mesin TeX untuk penyimpanan konten sementara (internal).

### Beberapa catatan tentang penyimpanan konten: node TeX

Saat mesin TeX yang mendasarinya memproses kode LaTeX Anda untuk menghasilkan materi yang ditata—seperti paragraf, tabel, dan matematika—mesin tersebut perlu menyimpan konten itu sementara di memori mesin TeX mana pun yang digunakan untuk memproses kode LaTeX Anda. Untuk menyimpan konten yang ditata, mesin TeX menggunakan urutan yang disebut *node*, yang dapat Anda anggap sebagai “potongan” memori komputer (perangkat) dengan ukuran bervariasi, yang dihubungkan bersama untuk membentuk daftar (lihat [artikel Wikipedia tentang struktur data terpaut](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Representasi skematis tentang bagaimana mesin TeX menyimpan konten menggunakan node yang saling tertaut](/files/598b03dacb89ecd6d5043bdf96065c0226ee5767)

Untuk merepresentasikan elemen fundamental penataan huruf berbasis TeX—seperti karakter, glue, kotak, penalti, kern, dan [*mark*](#why-were-here-understanding-mark-nodes) (untuk menyebut beberapa saja)—mesin TeX menggunakan berbagai *jenis* jenis node. Beberapa node, seperti yang untuk kotak, perlu menyimpan lebih banyak data dibandingkan jenis node yang lebih sederhana seperti node karakter; akibatnya, beberapa node lebih besar daripada yang lain—memerlukan lebih banyak byte untuk menyimpannya di memori. Saat membaca tentang TeX Anda mungkin menemui istilah seperti *node karakter*, *node glue*, [*node mark*](#why-were-here-understanding-mark-nodes) dan seterusnya: kini Anda tahu bahwa itu hanyalah nama yang diberikan kepada potongan memori yang dialokasikan untuk menyimpan data yang mewakili suatu elemen penataan huruf TeX.

#### Mengapa kita di sini: memahami node mark

Dari banyak jenis node, yang perlu kita bahas disebut *node mark* yang dibuat oleh `\mark` perintah:

```latex
\mark{sesuatu untuk disimpan}
```

Fitur `\mark` perintah tidak secara langsung menghasilkan konten yang ditata: argumennya `*sesuatu untuk disimpan*` disimpan ke memori untuk digunakan nanti dan sebuah *node mark* dibuat untuk memuat lokasi memori dari *sesuatu untuk disimpan*. Seperti yang akan kita lihat, `\mark` perintah *dibuat* secara khusus untuk membantu menghasilkan header dan footer.

Node mark yang dibuat oleh `\mark` perintah “disematkan” ke dalam konten halaman dan siap digunakan selama tahap akhir penyusunan halaman ketika mesin TeX siap menambahkan header dan footer ke halaman yang ditata (isi). Biasanya, `*sesuatu untuk disimpan*` akan berisi materi seperti nomor halaman dan judul/nomor bab atau bagian—blok penyusun header dan footer.

#### ε-TeX menambahkan perintah \marks

[Versi 2 dari ε-TeX](https://texdoc.org/serve/e-TeX/0), sebuah ekstensi dari TeX asli Knuth, diterbitkan pada tahun 1998 dan menyediakan kemampuan baru beserta peningkatan pada fitur yang sudah ada. Saat ini, sebagian besar peningkatan ε-TeX telah diintegrasikan ke dalam mesin TeX arus utama: pdfTeX, LuaTeX, dan XeTeX—lihat [**`-etex`** opsi baris perintah mesin TeX](/latex/id/topik-lainnya/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) yang memungkinkan penggunaan ekstensi ε-TeX.

Perangkat lunak TeX asli Knuth menyediakan perintah \mark yang hanya membuat 1 “kelas”, atau “jenis” node mark. Dokumen Anda dapat menyertakan banyak perintah \mark, tetapi semuanya membuat node mark dari “jenis” atau “kelas” yang sama—tidak ada mekanisme bawaan untuk mengelompokkan atau mengklasifikasikannya. Pembatasan ini dihapus oleh peningkatan ε-TeX: perintah \marks yang didukung oleh pdfTeX, LuaTeX, dan XeTeX:

```latex
\marks n {sesuatu untuk disimpan}
```

di mana `n` adalah bilangan bulat (`0` <= `n` < `32768`) yang menentukan node mark *kelas*.

Catatan:

* menulis `\marks 0` (yaitu, `n`=`0`) sinonim dengan menggunakan `\mark` perintah
* ε-TeX juga memperkenalkan variabel mark ([lihat nanti](#pre-output-checks-looking-for-mark-nodes)) untuk setiap kelas (`n`) mark: `\firstmarks n`, `\topmarks n` dan `\botmarks n`. Kelas variabel mark tertentu dapat digunakan untuk menyediakan data mark bagi tugas penataan huruf tertentu.
* LuaTeX meningkatkan nilai maksimum `n` ke `65535`, sehingga memungkinkan $$2^{16}$$ kelas mark

### Alasan TeX menggunakan mark

Untuk memahami *mengapa* (dan bagaimana) mesin TeX menggunakan `\mark` (atau `\marks`) untuk menghasilkan header dan footer, kita perlu memahami beberapa “keunikan” mekanisme mesin TeX dalam menyusun halaman—menemukan pemisahan halaman dan mengirim halaman yang selesai ke file PDF. Pada kenyataannya, proses penyusunan halaman itu kompleks, tetapi prinsip/konsep intinya dapat disederhanakan untuk memberikan penjelasan latar belakang yang cukup guna membantu pemahaman kita tentang mark.

Saat mesin TeX menyelesaikan penataan item konten individual seperti paragraf, tabel, atau matematika, ia memanggil rutinitas internal (fungsi yang disebut `build_page(...)`) yang mencoba menambahkan item yang baru ditata itu ke halaman yang sedang dibangun di memori. Saat materi baru itu ditambahkan ke halaman yang sedang dibangun, TeX juga memeriksa apakah konten yang baru ditambahkan itu telah membuat halaman saat ini menjadi “cukup penuh”. Jika halaman penuh, TeX dapat membuat sebuah *pemisahan halaman*—mengirim konten sebanyak satu halaman itu untuk pemrosesan akhir (“pengemasan”) dan selanjutnya keluaran ke file PDF.

Salah satu fitur kunci dari tahap akhir pengemasan halaman (komposisi) adalah sesuatu yang disebut *output routine* yang pada dasarnya merupakan urutan perintah yang ditentukan pengguna yang digunakan untuk mengemas halaman konten agar siap dikirim ke file PDF. Salah satu contoh aktivitas “pengemasan” adalah menambahkan header dan footer, tetapi ada banyak cara untuk menggunakan output routine—misalnya, lihat [artikel ini di TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). Output routine merupakan area TeX yang cukup kompleks sehingga kita tidak akan membahasnya secara rinci di sini: untuk keperluan saat ini, ingat saja bahwa tahap akhir komposisi halaman melibatkan penggunaan beberapa urutan perintah yang ditentukan pengguna (secara kolektif disebut *output routine*).

Tetapi mari kita pertimbangkan apa yang bisa terjadi ketika TeX menyelesaikan penataan sebuah paragraf teks yang panjang, memecahnya menjadi urutan baris-barus yang ditata satu per satu. TeX akan ingin menambahkan paragraf yang baru ditata itu—baris demi baris—ke halaman yang sedang dibangun, tetapi mungkin hanya *beberapa* dari baris-baris itu yang muat pada halaman saat ini. Perhatikan bahwa yang dimaksud “halaman” di sini adalah area teks utama (isi halaman) yang *tidak* mencakup elemen halaman lain seperti header dan footer yang ditambahkan kemudian (oleh output routine).

Setelah beberapa baris paragraf ditambahkan ke halaman saat ini, halaman itu bisa menjadi “cukup penuh” dan saatnya TeX membuat pemisahan halaman. Namun, kita masih memiliki materi “sisa” karena hanya *part* dari paragraf itu yang berhasil masuk ke halaman saat ini: “konten paragraf berlebih” disimpan untuk nanti, siap untuk pembuatan *berikutnya* halaman. Grafik berikut mengilustrasikan gagasan ini: sebagian paragraf berada di *ukuran* halaman dan sebagian ditahan untuk *berikutnya* halaman Anda.

![Representasi skematis paragraf yang melintasi pemisahan halaman](/files/ea96d066404b109e6f394f6baf1be6f108d2c38e)

Contoh paragraf ini menunjukkan bahwa mesin TeX sering kali memproses (menata) bagian konten yang tidak dapat, *secara keseluruhan*, muat pada halaman saat ini—karena konten tersebut melampaui titik di mana pemisahan halaman menjadi perlu. Ingat bahwa mesin TeX menemukan pemutusan baris dengan memasukkan, lalu menata, *seluruh paragraf* dan, tidak seperti beberapa aplikasi, tidak menerapkan pendekatan baris demi baris untuk menata paragraf. Dengan kata lain, TeX menata *seluruh* paragraf, apakah paragraf itu muat di halaman saat ini atau tidak (itu dihitung kemudian). Kebetulan, prinsip “ditata sepenuhnya lalu ditambahkan ke halaman saat ini” juga berlaku untuk jenis konten TeX lain, termasuk tabel yang dibaca sepenuhnya dari file .tex dan ditata secara keseluruhan sebelum upaya apa pun untuk menambahkannya ke halaman saat ini.

Untuk contoh paragraf kita, teks lengkap paragraf itu, *termasuk perintah apa pun di dalam teks itu*, telah diproses sepenuhnya—yang berarti bahwa penataan TeX telah mencapai lokasi tertentu di dalam `.tex` file Anda. “Status internal saat ini” dari mesin TeX, seperti nilai variabel atau pengaturan parameter yang tersimpan, akan mencerminkan materi, termasuk perintah apa pun, yang diproses hingga lokasi saat ini—akhir paragraf.

Meskipun paragraf lengkap telah ditata, sebagian darinya tidak dapat ditampung oleh halaman saat ini, sehingga “konten paragraf berlebih” disimpan untuk *berikutnya* halaman. Di dalam kode LaTeX (teks plus perintah) yang menghasilkan “konten paragraf berlebih” itu, mesin TeX *bisa* dapat saja memanggil sejumlah perintah dan makro yang mengubah nilai dan variabel yang disimpan secara internal oleh mesin TeX—yaitu, membuat perubahan pada “status saat ini” TeX.

Diagram berikut mengilustrasikan “keunikan” TeX yang sangat penting, yang berdampak pada beberapa aspek penataan huruf berbasis TeX. Melihat sisi kanan diagram, Anda melihat representasi node yang menyusun seluruh konten yang saat ini disimpan di memori: area abu-abu muda berisi node yang membentuk *ukuran* halaman dan area abu-abu tua adalah konten yang ditata yang ditujukan untuk *berikutnya* halaman. Skenario ini mencerminkan contoh paragraf kita: area abu-abu tua merepresentasikan “konten paragraf berlebih”: baris-baris teks yang ditahan karena tidak muat pada halaman saat ini.

![Representasi skematis lokasi node tempat TeX menemukan pemisahan halaman, juga menunjukkan konten yang ditahan untuk halaman berikutnya](/files/a1b9b6dd8c94d6698a85c9f72971166cf69293c4)

Ingat bahwa setelah TeX mendapatkan halaman (isi) yang “cukup penuh”, ia meneruskan konten itu ke sesuatu yang disebut *output routine* yang merupakan urutan perintah yang ditentukan pengguna. Di antara hal-hal lain, output routine menambahkan header dan footer ke isi halaman, menyelesaikan halaman agar siap dikirim ke file PDF.

Grafik kita (di atas) merepresentasikan saat ketika TeX memilih untuk membuat pemisahan halaman pada node tertentu, seperti `\baselineskip` glue di antara baris-baris yang ditata, dan siap untuk mulai mengemas halaman saat ini menggunakan output routine—urutan perintah bawaan dan makro yang ditentukan pengguna. *Namun*, selain konten yang menyusun halaman saat ini (disimpan di memori) TeX juga telah memproses dan menyimpan (di memori) *materi tambahan*, dari `.tex` file Anda. Materi tambahan itu meluas *melewati pemisahan halaman* dan *bisa* mungkin menyertakan perintah yang mengubah nilai atau variabel penting terkait halaman, sehingga memengaruhi “status internal saat ini” TeX—yang mencakup nilai parameter internal atau data yang disimpan oleh makro.

Ketika TeX mulai mengemas halaman saat ini, “status internal saat ini”nya adalah *berisi nilai data aktual yang disimpan dalam* ditentukan oleh semua yang ditata hingga lokasi pemisahan halaman karena TeX sudah *melewati titik itu* dalam file Anda dan memproses materi tambahan. Jika Anda mempertimbangkan lokasi dalam file Anda yang sesuai dengan tempat pemisahan halaman terjadi, dan lokasi yang sebenarnya telah dicapai TeX dalam `.tex` file, kedua status internal TeX yang bersesuaian, termasuk data yang tersimpan dan nilai variabel, bisa sangat berbeda. Status penataan TeX saat ini biasanya berada di depan tempat terjadinya pemisahan halaman; yaitu, aktivitas penataan TeX *tidak disinkronkan* dengan proses keluaran halaman yang telah ditata melalui output routine.

#### Contoh hipotetis: cara mendapatkan header yang salah

Diagram berikut mengilustrasikan perintah hipotetis `\myheader` dan `\myfooter` yang digunakan untuk menyimpan teks header dan footer yang diinginkan; misalnya, menggunakan definisi dasar seperti

```latex
\newtoks\headertoks% variabel daftar token baru untuk teks header
\newtoks\footertoks% variabel daftar token baru untuk teks footer
% Gunakan \global untuk memastikan data header atau footer yang tersimpan
% dapat diakses di mana saja, termasuk perintah dalam
% output routine
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

di mana `\headertoks` dan `\footertoks` adalah daftar token yang digunakan untuk menyimpan teks header dan footer.

Selain itu, contoh hipotetis kita juga memiliki output routine yang memperoleh teks header dan footer dari nilai saat ini dari `\myheader` dan `\myfooter`. Seperti ditunjukkan pada diagram, di dalam konten yang ditujukan untuk halaman saat ini, `\myheader` dan `\myfooter` menetapkan nilai yang sesuai (benar). Namun, sangat mungkin `\myheader` dan/atau `\myfooter` dipanggil di dalam paragraf yang melintasi pemisahan halaman. Karena TeX harus memproses seluruh paragraf, `\myheader` dan `\myfooter` akan dipanggil lagi untuk mengatur ulang teks header/footer yang disimpan dalam “status internal TeX”, menghasilkan nilai yang tidak benar untuk halaman saat ini. Ketika output routine menghasilkan header dan footer, isinya akan berupa teks yang dimaksudkan untuk halaman berikutnya.

![Grafik yang menggambarkan header dan footer yang salah yang dihasilkan jika output routine hanya menggunakan makro TeX untuk mengambil teks header dan footer](/files/a371e3498750b986aec8238beed77cfde971f45e)

#### Perilaku asinkron TeX: perintah \mark sebagai penyelamat

Aktivitas penataan TeX (penyusunan konten) adalah *tidak disinkronkan* dengan proses akhir pengeluaran halaman yang telah ditata melalui perintah yang terdapat dalam output routine. Saat waktunya mengeluarkan sebuah halaman, status internal TeX yang sebenarnya berada di depan dari status apa pun yang mungkin dimilikinya pada lokasi pemisahan halaman—tempat ia menata bagian konten terakhir pada halaman saat ini yang sedang dikeluarkan.

Di [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Donald Knuth, pencipta TeX, menggambarkan situasi ini sebagai

> ... output routine TeX tertinggal di belakang aktivitas penyusunan halamannya

Karena hubungan yang tidak tersinkronisasi ini, “fasilitas khusus” berupa *mekanisme mark*, diterapkan melalui `\mark` (atau `\marks n`) diperlukan untuk memastikan header dan footer berisi materi yang relevan dengan halaman aktual yang sedang dikeluarkan. Perintah `\mark` menyematkan node mark ke dalam konten halaman, menyimpan lokasi memori konten yang dapat digunakan untuk header dan footer halaman tersebut.

Penulis buku yang terkenal dan dihormati [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) menggambarkan `\mark` mekanisme tersebut sebagai

> ... mekanisme utama yang memungkinkan output routine memperoleh informasi tentang isi halaman yang sedang terpotong, khususnya bagian atas dan bawahnya.

Fitur `\mark` perintah merupakan mekanisme yang dirancang untuk mengatasi sifat asinkron dari algoritme pemisahan halaman dan output routine TeX.

![Representasi skematis data mark (node) yang disematkan di konten isi halaman](/files/7f69ae0d7c0fac6f6e86c3d921da98dee9c46a48)

### Pemeriksaan pra-keluaran: mencari node mark

Setelah mesin TeX menentukan lokasi pemisahan halaman, ia memanggil rutinitas internal (disebut `fire_up()`) yang melakukan banyak pra-pemrosesan sebelum output routine menyelesaikan komposisi halaman dan menulis halaman yang selesai ke file PDF. Bagian penting dari langkah pra-pemrosesan tersebut adalah menetapkan nilai tiga *variabel mark global*: `\botmark`, `\topmark` dan `\firstmark` yang digunakan untuk menyediakan data guna menyusun header dan footer. Tentu saja, sebuah halaman dapat berisi beberapa node mark, tetapi semuanya disaring untuk menghasilkan tiga variabel mark yang berfungsi sebagai berikut:

* **`\botmark`** adalah mark yang berlaku pada pemisahan halaman saat ini; yaitu, mark terakhir yang terlihat pada *ukuran* page
* **`\topmark`** adalah nilai `\botmark` dari *sebelumnya* page
* **`\firstmark`** adalah mark pertama pada *ukuran* halaman—mark pertama di antara `\topmark` dan `\botmark`

Skema berikut menunjukkan prinsip dasar pra-pemrosesan konten halaman yang ditata untuk menentukan nilai tiga variabel mark global `\botmark`, `\topmark` dan `\firstmark`:

![Representasi skematis prinsip dasar yang digunakan untuk menentukan nilai tiga variabel mark global \botmark, \topmark, dan \firstmark](/files/9ed583dfefcb90861cdcceb4468998c922ccfad2)

Bagian berikut menggunakan beberapa penjelasan di atas untuk menguraikan bagaimana LaTeX menata header dan footer.

### Kelas LaTeX: gaya halaman dan header/footer

Saat Anda menulis `\documentclass{*class*}` di mana `*class*` bisa jadi `article`, `book`, `laporan` atau `letter`, LaTeX memuat file bernama `*class*.cls`; misalnya, `book.cls`, `article.cls` dan seterusnya. File-file tersebut `.cls` berisi kode LaTeX untuk mengimplementasikan variasi khusus kelas dari berbagai perintah dan fitur yang diharapkan ada, serta disediakan oleh, semua kelas dokumen—perilaku yang dibagikan oleh semua kelas dokumen. Contohnya dapat mencakup margin tata letak halaman khusus kelas bersama dengan versi perintah khusus kelas, seperti `\section`, `\subsection` dan seterusnya.

Elemen penting lainnya dari `.cls` file adalah implementasi khusus kelas dari gaya halaman standar yang menentukan header dan footer dokumen yang dihasilkan menggunakan kelas dan gaya halaman tertentu. Misalnya:

* **`book.cls`** dan **`article.cls`** masing-masing berisi implementasi gaya halaman `headings` dan `myheadings`
* **`letter.cls`** berisi definisi untuk gaya halaman `headings`, `empty`, `plain` dan satu yang disebut `firstpage`
* **`report.cls`** berisi definisi untuk gaya halaman `headings` dan `myheadings`

Implementasi gaya halaman sering bergantung pada `twoside` opsi `\documentclass`—apakah dokumennya satu sisi atau dua sisi—agar header dan footer ditentukan secara tepat untuk halaman kiri (genap) dan halaman kanan (ganjil).

Kelas dokumen dapat bergantung pada definisi bawaan dari `plain` atau `empty` gaya halaman yang disediakan di bagian lain LaTeX—di luar `.cls` file yang digunakan.

#### Lebih lanjut tentang gaya halaman

Saat Anda mengubah gaya halaman menggunakan `\pagestyle{*somestyle*}` atau `\thispagestyle{*somestyle*}` LaTeX mengharapkan menemukan perintah internal bernama `ps@*somestyle*`—biasanya disediakan oleh kelas dokumen `.cls` file atau mungkin paket seperti `fancyhdr`. Ngomong-ngomong, yang dimaksud “perintah internal” adalah perintah yang merupakan bagian dari kode sumber LaTeX dan yang namanya mengandung `@` simbol, yang biasanya mencegah penggunaan sembarangan (karena [kode kategori](/latex/id/topik-lainnya/43-table-of-tex-category-codes.md)).

Definisi `\ps@*somestyle*` bertanggung jawab untuk mengimplementasikan fitur/perilaku gaya halaman tersebut, yang mencakup menyediakan definisi:

* perintah yang digunakan selama tahap akhir komposisi halaman (untuk menambahkan header dan footer, lihat [nanti dalam artikel](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* perintah untuk menyisipkan data mark terkait bagian untuk digunakan dalam menghasilkan header dan footer dokumen yang berisi judul bagian, nomor, dan sejenisnya. Misalnya, `headings` gaya halaman (di dalam `book.cls`) mendefinisikan perintah penghasil mark berikut:
  * `\chaptermark`
  * `\sectionmark`

Kita akan [menjelajahi lebih jauh perintah pembangkit mark](#mark-commands-and-mark-data), seperti `\chaptermark`, tetapi sebagai contoh: saat Anda menulis `\chapter{judul bab}` situs web `\chaptermark` perintah juga dijalankan untuk menyisipkan data mark terkait bab guna produksi header halaman berikutnya.

#### Anatomi perintah header dan footer berdasarkan gaya halaman

Bagian ini membahas beberapa perintah/proses inti LaTeX yang digunakan untuk membuat header dan footer—dengan merujuk pada penjelasan atau konsep yang telah disajikan sebelumnya dalam artikel ini.

**“Model” header dan footer LaTeX**

Konten header dan footer (bawaan) LaTeX didasarkan pada hierarki dua tingkat dari bagian dokumen: bagian “tingkat lebih tinggi” yang berisi beberapa bagian “tingkat lebih rendah”. Untuk kelas book dan article, ini diterjemahkan menjadi:

* `**book**` **kelas**: bagian “tingkat lebih tinggi” dihasilkan oleh `\chapter` perintah dan bagian “tingkat lebih rendah” melalui `\section`, yang mencerminkan bab yang berisi banyak bagian.
* `**article**` **kelas** (dengan asumsi dokumen dua sisi): bagian “tingkat lebih tinggi” dihasilkan menggunakan `\section` perintah dan yang “tingkat lebih rendah” melalui `\subsection`, yang mencerminkan beberapa subbagian muncul dalam bagian yang sama.

LaTeX menerapkan “model” header dan footer melalui perintah pengelompokan bagian yang “menyuntikkan” node mark (melalui `\mark` perintah) untuk menyimpan data yang relevan dengan bagian dokumen yang sedang dibuat. Misalnya, setiap kali Anda menulis `\section{*judul bagian*}` node mark akan dibuat, berisi data yang mencerminkan `*judul bagian*` dan nomor bagian.

LaTeX menggunakan sistem mark yang berisi data berbentuk `{left}{right}`, yang pada akhirnya dihasilkan melalui `\mark` perintah

```latex
\mark{{left}{right}}
```

yang dibungkus dalam lapisan makro yang dirancang untuk melindungi pengguna dari detail tingkat rendah—yang dibahas di bagian-bagian berikutnya dalam artikel ini.

#### Menjelajahi kelas book

Saat `book.cls` file dimuat, salah satu tindakan akhirnya adalah menjalankan `\pagestyle{headings}` yang menetapkan gaya halaman bawaan menjadi `headings`jadi kita akan membahas gaya halaman itu lebih rinci.

Sebagaimana [disebutkan di atas](#more-on-page-styles), fitur/properti dari `headings` gaya halaman, sebagaimana diimplementasikan oleh `book` kelas, akan ditentukan oleh perintah (internal) `\ps@headings` yang terdapat dalam file `book.cls`. Definisi pasti dari `\ps@headings` bergantung pada apakah dokumennya satu sisi atau dua sisi (bawaan untuk `book` kelas).

**“Perintah mark” dan “data mark”**

Untuk dokumen dua sisi yang dihasilkan oleh `book` kelas, definisi `\ps@headings` membuat (mendefinisikan) dua “perintah mark”: `\chaptermark` dan `\sectionmark` yang menghasilkan “data mark”, berbentuk `{left}{right}`, untuk digunakan dalam header dan footer. Perintah mark tersebut mencerminkan model header dan footer LaTeX—berdasarkan hierarki bagian dokumen:

* perintah bagian “tingkat lebih tinggi” (di sini, `\chapter`) digunakan untuk menyediakan “data mark” untuk header halaman kiri (bernomor genap). Saat Anda memulai bab baru, dengan menulis `\chapter{*judul bab*}`, `\chaptermark` dipanggil untuk membuat “data mark” yang mencerminkan bab baru itu—berisi `*judul bab*` dan nomor.
* perintah bagian “tingkat lebih rendah” (di sini, `\section`) digunakan untuk menyediakan “data mark” bagi halaman yang menghadap kanan (bernomor ganjil). Saat Anda menulis `\section{*judul bagian*}` situs web `\sectionmark` perintah akan dipanggil untuk membuat “data mark” yang mencerminkan bagian baru—yang memuat `*judul bagian*` dan nomornya. Setiap data mark yang disediakan oleh `\chapter` sebelumnya tidak terpengaruh oleh perintah \section berikutnya.

**\markboth dan \markright**

Perintah mark khusus bagian LaTeX, seperti `\chaptermark` dan `\sectionmark`, menggunakan dua perintah tambahan yang disebut `\markboth` dan `\markright` yang menyediakan data mark aktual untuk header dan footer. `\markboth` dan/atau `\markright` dapat menyertakan perintah untuk menata teks header atau footer, seperti membuatnya menjadi huruf kapital.

Untuk dokumen yang dihasilkan menggunakan `book` default kelas (dua sisi, `headings` gaya halaman), perintah pembuat mark bekerja sebagai berikut:

* `\chaptermark` menghasilkan data mark menggunakan `\markboth`
* `\sectionmark` menghasilkan data mark `\markright`

`\markboth` dan `\markright` adalah makro yang, pada akhirnya, menggunakan primitif (bawaan, tingkat rendah) `\mark` perintah untuk benar-benar menyisipkan mark yang dihasilkan dari dalam perintah pembagian bagian.

`\markboth` berbentuk

* **`\markboth{left}{right}`**: menyisipkan sebuah mark (node) menggunakan `\mark{{left}{right}}` yang menghasilkan node mark berisi sepasang nilai yang diapit kurung kurawal `{left}{right}`.

`\markright` berbentuk

* **`\markright{newright}`**: menyisipkan sebuah mark (node) menggunakan `\mark{{currentleft}{newright}}`; yaitu, mengubah nilai saat ini dari `kanan` ke `newright` tetapi nilai saat ini dari `kiri` (yaitu, `currentleft`) tidak berubah, menghasilkan node mark berisi sepasang nilai yang diapit kurung kurawal `{currentleft}{newright}`.

Perilaku dari `\markboth` dan `\markright` mendukung hierarki bagian dua tingkat, seperti dokumen yang berisi beberapa bagian di dalam setiap bab.

Sebagai contoh untuk kelas dokumen (dua sisi) `book` (menggunakan gaya halaman headings):

* `\chaptermark` menggunakan `\markboth` untuk menetapkan:
  * a `{left}` field yang menata CHAPTER . menjadi huruf kapital.
  * sebuah field {right} yang kosong (`{}`)
* `\sectionmark` menggunakan `\markright` untuk menetapkan `{right}` field mark agar ditata., juga dalam huruf kapital.

Untuk memahami mengapa `\sectionmark` menggunakan `\markright` kita dapat mengamati bahwa setiap `\section` perintah baru seharusnya:

* menyisipkan mark baru yang berisi data untuk `\section` (seperti judul dan nomornya).
* tetapi *berisi nilai data aktual yang disimpan dalam* mempengaruhi nilai data mark untuk `\chapter` tempat `\section` perintah tertentu muncul

Karena alasan-alasan ini, perintah `\section` memanggil perintah `\sectionmark` yang menggunakan `\markright` untuk membuat mark yang berkaitan dengan `\section`: perintah ini memperbarui field data mark tetapi tidak memengaruhi nilai field data mark saat ini yang ditetapkan oleh `{right}` field nilai mark-data `{left}` saat ini yang ditetapkan oleh `\chapter`.

Catatan: kode sumber LaTeX berisi peringatan:

> Perintah penandaan bekerja cukup baik untuk mark kanan yang ‘dinomori di dalam’ mark kiri—misalnya, mark kiri diubah oleh perintah \chapter dan mark kanan diubah oleh perintah \section. Namun, hasilnya agak anomali jika 2 \markboth terjadi pada halaman yang sama.

**Perintah untuk rutinitas keluaran**

Fitur `\ps@headings` perintah mengimplementasikan definisi dari perintah-perintah berikut

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

yang digunakan oleh rutinitas keluaran untuk menambahkan header dan footer selama tahap akhir penyusunan halaman. Misalnya, `book.cls` menetapkan `\@oddfoot` dan `\@evenfoot` ke nilai `\@empty`, yang didefinisikan sebagai `\def\@empty{}`, sehingga `\ps@headings` menghasilkan footer kosong pada halaman yang menghadap kiri dan kanan:

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

Header didefinisikan sebagai:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

di mana

* `\leftmark` mengambil `{left}` nilai dari pasangan `{left}{right}` mark
* `\rightmark` mengambil `{right}` nilai dari pasangan `{left}{right}` mark
* \thepage menampilkan nomor halaman saat ini

Pada intinya, implementasi `\@evenhead` dan `\@oddhead` menghasilkan hasil berikut:

* `\@evenhead`: nomor halaman muncul di kiri header dan konten `\leftmark`, yang ditata dengan perintah font `\slshape`, ditampilkan di kanan header—ruang kosong di antaranya disediakan oleh `\hfil` glue.
* `\@oddhead`: konten `\rightmark`, yang ditata dengan perintah font `\slshape`, muncul di kiri header dan nomor halaman saat ini ditampilkan di kanan header—lagi-lagi, ruang kosong di antaranya disediakan oleh `\hfil` glue.

Namun, satu pertanyaan penting masih tersisa: *yang* `{left}{right}` pasangan mark digunakan oleh `\leftmark` dan `\rightmark`: dengan kata lain, dari mana mereka memperoleh nilai data mark mereka?

Sebagaimana [disebutkan di atas](#filtering) tetapi [dijelaskan di bawah](#explainfiltering), selama tahap akhir penyusunan halaman, semua mark yang terdapat dalam halaman dokumen “disaring” dan digunakan untuk menetapkan nilai tiga variabel mark global: `\botmark`, `\topmark` dan `\firstmark`. Karena [struktur mark LaTeX](#latexs-model-of-headers-and-footers), masing-masing dari 3 variabel mark tersebut pada akhirnya akan berisi nilai `{left}{right}` untuk beberapa pasangan nilai `{left}` dan `{right}` dan inilah yang menyediakan pasangan mark aktual `{left}{right}` mark (field) untuk `\leftmark` dan `\rightmark`:

* `\leftmark` mengambil `kiri` nilai dari `{left}{right}` pasangan mark (field) yang disediakan oleh `\botmark`
* `\rightmark` mengambil `kanan` nilai dari `{left}{right}` pasangan mark yang disediakan oleh `\firstmark`

Catatan `\markboth` dan `\markright` dapat memuat perintah untuk menata teks header dan footer—seperti mengubahnya menjadi huruf kapital.

### Contoh menggunakan perintah LaTeX tingkat rendah

Contoh-contoh berikut menunjukkan perubahan pada gaya halaman atau header dan footer dengan mendefinisikan ulang beberapa perintah LaTeX tingkat rendah (internal) yang dibahas dalam artikel ini (yang memuat simbol @). Kami tidak menganjurkan metode ini untuk mengubah header dan footer, tetapi metode ini tersedia bagi mereka yang membutuhkannya (misalnya, penulis paket). Solusi yang disarankan untuk mengubah header dan footer adalah menggunakan [`fancyhdr` ke preambel dokumen Anda (seperti disarankan](https://ctan.org/pkg/fancyhdr?lang=en), yang dibahas dalam sebuah [artikel bantuan Overleaf](/latex/id/pemformatan/02-headers-and-footers.md).

#### Mendefinisikan gaya halaman minimal

Contoh berikut mendefinisikan gaya halaman baru yang sangat minimal bernama `demostyle` yang menggunakan teks statis untuk mendefinisikan header dan footer dan tidak bergantung pada perintah pembagian bagian (`\chapter`, `\section` dll.) untuk menetapkan isi header dan footer.

Contoh ini dimulai dengan mengubah kode kategori dari karakter `@` menjadi 11 sehingga dapat digunakan di dalam nama makro.  `\ps@demostyle` perintah mengimplementasikan gaya halaman minimal kita dengan mendefinisikan ulang perintah yang digunakan (dalam rutinitas keluaran) untuk menghasilkan header dan footer: `\@oddhead`, `\@oddfoot`, `\@evenhead` dan `\@evenfoot`. Perhatikan `twoside` opsi dalam `\documentclass` deklarasi kami—yang menggunakan `article` kelas.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Footer halaman ganjil\hfil}%
\renewcommand\@evenfoot{\hfil Footer halaman genap\hfil}%
\renewcommand\@evenhead{\thepage\hfil Header halaman genap}%
\renewcommand\@oddhead{Header halaman ganjil\hfil\thepage}}
\catcode`@=12
\title{Demonstrasi gaya halaman}
\author{Overleaf}
\date{Agustus 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Pendahuluan}
\newpage
\section{Materi lebih lanjut}
\end{document}
```

[Buka contoh ini di Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### Mengubah header untuk kelas book

Contoh berikut mengubah header untuk kelas book dengan mendefinisikan ulang `\@oddhead` dan `\@evenhead` agar header halaman yang menghadap kiri dan kanan memuat nomor halaman saat ini dan judul bab. Perhatikan bagaimana `\chapter` perintah kedua menggunakan judul bab bentuk singkat opsional `[Judul singkat]` yang kini menyediakan teks header, alih-alih judul lengkap.

`\section` perintah tidak berpengaruh pada isi header karena definisi ulang header kita hanya menggunakan `\leftmark` yang memperoleh rincian bab saat ini. Untuk mengakses rincian bagian saat ini kita perlu menggunakan `\rightmark` dalam definisi `\@oddhead` dan/atau `\evenhead`.

```latex
\documentclass{book}
% NB: kode kategori '@' sementara diubah menjadi 11
% untuk memungkinkan penggunaannya dalam nama perintah
\catcode `@=11
% Biarkan \@oddfoot dan \evenfoot setara dengan \@empty
% agar membuatnya kosong
\let\@oddfoot\empty\let\evenfoot\empty
% Mendefinisikan ulang \@oddhead dan \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Gunakan ukuran halaman yang nyaman kecil
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoar seorang pengguna \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Ini adalah frontmatter yang menggunakan angka Romawi.
\mainmatter
\chapter{Dari mana saya mulai?}
Bab 1: Bab pendek.
\newpage
\section{Di awal...}
Sebuah bagian.
\chapter[Judul singkat]{Sebuah bab dengan judul yang sangat panjang, sehingga tidak cocok untuk header}
\newpage
\section{Bagian lainnya}
Dengan sedikit isi.
\newpage
\section{Apa, bagian lain lagi?}
Juga dengan sedikit isi.
\end{document}
```

[Buka contoh ini di Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### Menggunakan perintah mark lanjutan ε-TeX

Fitur `book` kelas menggunakan definisi berikut dari `\@evenhead` dan `\@oddhead` untuk menghasilkan header:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

di mana perintah `\leftmark` dan `\rightmark` didefinisikan sebagai

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

Dengan menggunakan perintah lanjutan ε-TeX, dan kesetaraan antara kelas mark 0 ε-TeX dan perintah TeX asli, kita dapat:

* menulis ulang `\leftmark` untuk menggantikan `\botmark` dengan `\botmarks0` yang setara, dan
* menulis ulang `\rightmark` untuk menggantikan `\firstmark` dengan `\firstmarks0` yang setara

Definisi ulang ini menghasilkan

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

Perhatikan penggunaan `\relax` untuk mengakhiri pencarian TeX terhadap digit-digit berikutnya—Anda juga dapat mengganti `\relax` dengan spasi sebagai penutup.

Contoh berikut menghasilkan keluaran yang identik dengan definisi asli dari `\leftmark` dan `\rightmark`.

```latex
\documentclass{book}
% Mendefinisikan ulang \leftmark dan \rightmark untuk menggunakan
% \botmarks0 dan \firstmarks0 masing-masing
% NB: kode kategori '@' sementara diubah menjadi 11
% untuk memungkinkan penggunaannya dalam nama perintah
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Gunakan ukuran halaman yang nyaman kecil
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoar seorang pengguna \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Ini adalah frontmatter yang menggunakan angka Romawi.
\mainmatter
\chapter{Dari mana saya mulai?}
Bab 1: Bab pendek.
\newpage
\section{Di awal...}
Sebuah bagian.
\newpage
Bagian lain.
\end{document}
```

[Buka contoh ini di Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**Catatan tentang ε-TeX**

Sebagaimana [kita catat di atas](#etex), ε-TeX memperkenalkan `\marks` perintah:

```latex
\marks n {sesuatu untuk disimpan}
```

yang memperluas fitur asli `\mark` dari mesin TeX Knuth dan tersedia di ketiga mesin TeX arus utama: pdfTeX, LuaTeX, dan XeTeX.

Implementasi ε-TeX juga memperkenalkan variabel mark global baru `\firstmarks n`, `\botmarks n` dan `\topmarks n`: satu untuk setiap kelas `n`. Variabel mark berbasis kelas ini ditentukan [menggunakan mekanisme yang diuraikan di atas](#pre-output-checks-looking-for-mark-nodes), dan semuanya dapat digunakan dalam pembuatan header dan footer.

Anda dapat menggunakan salah satu dari $$2^{15}$$ = 32768 kelas mark, mulai dari 0 hingga 32767, di dalam definisi ulang `\leftmark` atau `\rightmark`. Itu mengasumsikan Anda telah menyediakan (menyisipkan) data mark yang sesuai untuk kelas mark pilihan Anda, `n`, melalui `\marks n{{left}{right}}`.

Perhatikan bahwa LuaTeX menyediakan $$2^{16}$$ = 65536 kelas mark, dengan `n` berkisar dari 0 hingga 65535.

**Contoh menggunakan kelas mark 10**

Contoh ini menunjukkan penggunaan kelas mark 10 (dipilih secara acak) untuk membuat header dokumen. Dokumen contoh menata 6 halaman yang berisi urutan mark yang disajikan dalam [contoh yang dikerjakan di akhir artikel ini](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Kajian atas contoh itu akan menunjukkan mengapa mesin TeX memilih mark tertentu, $$\alpha$$, $$\beta$$, $$\gamma$$ dan $$\delta$$, untuk digunakan di masing-masing header.

Kita mulai dengan mendefinisikan makro praktis, `\domark`, yang menggunakan `\marks 10` untuk menyisipkan data mark yang mengikuti konvensi LaTeX `{left}{right}` :

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

Mark kelas 10 dibuat dapat diakses oleh mekanisme header dan footer LaTeX dengan mendefinisikan ulang `\leftmark` dan `\rightmark`—dengan sedikit info tambahan di dalamnya:

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

Setelah menyisipkan sejumlah mark (kelas 10), mesin TeX (di sini, pdfTeX) dengan patuh membuat variabel mark global untuk kelas 10—`\botmarks10`, `\topmarks10` dan `\firstsmarks10` yang `\leftmark` dan `\rightmark` digunakan untuk menghasilkan header.

```latex
\documentclass{book}
% Perintah singkat untuk menggunakan mark dengan kelas 10
% dan mengikuti struktur mark LaTeX {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Mendefinisikan ulang \leftmark dan \rightmark untuk menggunakan
% masing-masing \botmarks10 dan \firstmarks10
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Mendemonstrasikan mark yang ditingkatkan milik \(\varepsilon\)-\TeX}
\author{Overleaf}
\date{Agustus 2022}
\begin{document}

Halaman 1: Tidak ada mark yang ditambahkan sehingga semua variabel mark tetap dalam status terinisialisasi: kosong (NULL).

\newpage
Halaman 2: mark $\alpha$ ditambahkan ke halaman ini melalui

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
Halaman 3: Tidak ada mark baru yang ditambahkan ke halaman ini.

\newpage
Halaman 4: mark $\beta$ diikuti mark $\gamma$ ditambahkan ke halaman ini melalui

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
Halaman 5: mark $\delta$ ditambahkan ke halaman ini melalui

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
Halaman 6: Tidak ada mark yang ditambahkan ke halaman ini.
\end{document}
```

[Buka contoh ini di Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

Grafik berikut menunjukkan header yang dihasilkan oleh contoh ini:

![Grafik yang menunjukkan keluaran dari kode LaTeX menggunakan Perintah mark lanjutan ε-TeX](/files/12c7d5ead5eb9256f222bd470cc0bdc8dd66b705)

* **Catatan**: Header pada halaman 1 dibuat pada saat ketiga variabel mark untuk kelas 10—`\botmarks10`, `\topmarks10` dan `\firstsmarks10`—masih kosong. Hasil akhirnya adalah bahwa `\rightmark` (untuk halaman 1) hanya menyisipkan fragmen header terakhir: `(via \texttt{\string\firstmarks10})`, seperti ditunjukkan pada grafik di atas.

## Contoh terperinci yang menunjukkan bagaimana mesin TeX menentukan nilai untuk \botmark, \topmark, dan \firstmark

![Db.gif](/files/8e9cb3961717e15eff4a9e636ffbb3363fc8150f)![Db.gif](/files/8e9cb3961717e15eff4a9e636ffbb3363fc8150f) Tampaknya tepat untuk meniru penggunaan tanda belok ganda berbahaya ala Knuth (gambar milik [situs web ini](http://www.truetex.com/db.htm)) karena materinya agak tingkat rendah dan “mengintip ke dalam mesin”—meskipun kami harap ini dapat menarik bagi pembaca pemberani yang ingin memahami beberapa detail lebih lanjut.

Pembahasan berikut sangat didasarkan pada contoh terakhir di halaman 258 dari [The TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Di sini, kami telah mengedit dan menata ulang contoh itu bagi mereka yang tidak memiliki akses ke The TeXbook:

![Versi yang telah diedit dan ditata ulang dari sebuah contoh dari halaman 258 The TeXbook](/files/6356d860a59f2de252c6b223671963f957c3bb0a)

Tabel yang disajikan dalam grafik ini direproduksi dari tabel yang disediakan oleh Knuth tetapi, seperti aslinya, tidak ada penjelasan tentang bagaimana tabel itu diturunkan. Di sini kami akan membahasnya untuk memberikan rincian tambahan yang menunjukkan bagaimana nilai-nilai `\botmark`, `\topmark` dan `\firstmark` ditentukan—mendapatkan rincian ini memerlukan penjelajahan kode sumber mesin TeX!

Proses penetapan nilai untuk `\botmark`, `\topmark` dan `\firstmark` dapat diringkas dalam 3 fragmen pseudocode singkat seperti ditunjukkan pada diagram berikut dan penjelasan selanjutnya:

1. Pemeriksaan pra-konten
2. Loop konten
3. Pemeriksaan pasca-konten

Catatan:

* Pengujian pada langkah 1 “Pemeriksaan pra-konten” dan langkah 3 “Pemeriksaan pasca-konten” dilakukan sekali per halaman.
* Langkah 2 “Loop konten” melibatkan TeX memindai konten halaman untuk mencari node mark, dan menggunakannya untuk menetapkan nilai variabel mark seperti yang ditunjukkan.

![Gambar yang menunjukkan versi pseudocode dari kode yang digunakan untuk menetapkan nilai bagi tiga variabel mark global yang digunakan oleh mesin TeX](/files/c17abc55c0d5a4c4bba2afcb55b0ead82a5ad672)

Setiap kali TeX menemukan pemisahan halaman yang cocok, ia mengirim konten halaman itu untuk pemrosesan akhir, melakukan langkah-langkah pemrosesan mark ini (tiga) untuk setiap halaman dalam dokumen Anda. Langkah-langkah pemrosesan yang diberi label 1, 2, dan 3 dirujuk dalam diagram akhir pada bagian ini.

Perhatikan bahwa:

* sebelum halaman pertama diproses, ketiga variabel mark global `\botmark`, `\topmark` dan `\firstmark` telah diinisialisasi menjadi kosong (NULL).
* nilai akhir dari `\botmark`, `\topmark` dan `\firstmark` yang ditentukan pada akhir *sebelumnya* halaman menjadi nilai (input) untuk memproses *ukuran* halaman—yang sedang diproses.

Fragmen kode berikut adalah ***pseudocode*** yang diturunkan (diringkas) dari kode sumber mesin TeX yang sebenarnya. Tujuannya adalah memberikan ringkasan kode yang ringkas untuk membantu menunjukkan prinsip-prinsip utama yang terlibat.

**Langkah 1: Pemeriksaan pra-konten** Sebelum TeX melihat konten aktual dari halaman saat ini, ia memeriksa apakah `\botmark` nilai saat ini—yaitu, yang dihasilkan dari *sebelumnya* halaman—adalah kosong (NULL):

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

Dalam pengujian ini, jika `\botmark` (dari *sebelumnya* halaman) adalah *berisi nilai data aktual yang disimpan dalam* kosong:

* `\topmark` untuk *ukuran* halaman diatur ke *sebelumnya* halaman `\botmark` nilai
* `\firstmark`, untuk *ukuran* halaman (yang sedang diproses), diatur ke kosong (NULL): mulai halaman ini dengan mengasumsikan tidak ada `\mark` node.

Perhatikan bahwa pengujian ini dilakukan *sekali* untuk setiap halaman yang sedang diproses.

**Langkah 2: Loop konten** Selanjutnya, TeX melintasi konten halaman; bagian dari loop itu mencakup pencarian `\mark` node:

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

Tes ini diterapkan pada setiap simpul mark yang berada di dalam (terkandung di dalam) halaman saat ini. Tes sebelumnya (Langkah 1, di atas) dapat saja telah menyetel `\firstmark` menjadi kosong sehingga mark pertama yang ditemukan di halaman saat ini menjadi nilai dari `\firstmark` dan `\botmark`. Apa pun *berikutnya* `\mark` simpul yang terdeteksi saat menjalankan loop ini tidak akan mengubah nilai dari `\firstmark`, karena sekarang tidak lagi kosong (NULL), tetapi `\botmark` diperbarui—karena memang itulah tujuan dari `\botmark`: untuk menyimpan `\mark` simpul terakhir yang terlihat untuk halaman ini.

**Langkah 3: Pemeriksaan pascakonten** Setelah menelusuri konten halaman, TeX menerapkan tes akhir berikut, yang juga dilakukan sekali per halaman:

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* Jika `\topmark` tidak kosong (NULL) kita tahu, dari Langkah 1, bahwa `\botmark` untuk halaman sebelumnya tidak kosong (NULL).
* Jika `\firstmark` masih kosong maka kita belum melihat ada `\mark` simpul karena tes pada Langkah 2 tidak terpicu; akibatnya, `\firstmark` disetel ke nilai dari `\topmark` yang juga merupakan nilai dari `\botmark` dari halaman sebelumnya.

Setelah penerapan berurutan dari ketiga langkah ini untuk semua 6 halaman dalam contoh kita, nilai dari `\botmark`, `\topmark` dan `\firstmark` diturunkan menggunakan transisi yang ditunjukkan dalam diagram di bawah ini, di mana:

* persegi panjang bersudut membulat berwarna biru muda adalah nilai variabel mark final untuk setiap halaman
* persegi bersudut membulat berwarna abu-abu muda merepresentasikan nilai sementara yang muncul selama pemrosesan
* panah berlabel merepresentasikan perubahan nilai variabel mark sesuai langkah 1, 2, atau 3 pada diagram di atas—atau suatu nilai tidak diubah oleh salah satu langkah; diberi label “tidak berubah”.

Diagram berikut menunjukkan bagaimana tiga fragmen pseudocode menghasilkan nilai akhir dari `\botmark`, `\topmark` dan `\firstmark` yang tercantum dalam tabel pada halaman 258 The TeXbook.

![Diagram transisi yang menyertai contoh dari halaman 258 The TeXbook, yang menunjukkan transisi internal saat variabel mark global diberi nilai-nilainya](/files/7aae0fc6c0e52538a383325e52300216e22abd3b)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
