> 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/17-how-does-expandafter-work-a-detailed-macro-case-study.md).

# Bagaimana \expandafter bekerja: Studi kasus makro yang terperinci

&#x20;[Bagian 1](/latex/id/artikel-mendalam/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Bagian 2](/latex/id/artikel-mendalam/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Bagian 3](/latex/id/artikel-mendalam/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Bagian 4](/latex/id/artikel-mendalam/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Bagian 5](/latex/id/artikel-mendalam/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Bagian 6](/latex/id/artikel-mendalam/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)&#x20;

## Studi kasus: contoh \expandafter dari The $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Manual

Fitur $$\varepsilon\mathrm{\text{-}{\TeX}}$$ mesin penataan huruf diturunkan dari perangkat lunak TeX milik Knuth dan awalnya dimaksudkan sebagai langkah “sementara” menuju pengembangan [New Typesetting System](https://en.wikipedia.org/wiki/New_Typesetting_System) (NTS), yang ditulis dalam bahasa pemrograman Java. $$\varepsilon\mathrm{\text{-}{\TeX}}$$ pertama kali dikembangkan pada akhir 1990-an untuk menambahkan rangkaian perintah primitif baru yang menyediakan fungsi tambahan yang tidak tersedia dalam program asli Knuth. Meskipun $$\varepsilon\mathrm{\text{-}{\TeX}}$$ telah menerima pembaruan berkala sejak rilis awalnya, saat ini ia tidak banyak digunakan sebagai mesin penataan huruf mandiri meskipun inovasinya telah diserap ke dalam generasi TeX berikutnya: pdfTeX, XeTeX, dan LuaTeX.

Fitur [$$\varepsilon\mathrm{\text{-}{\TeX}}$$ manual](http://mirror.ox.ac.uk/sites/ctan.org/systems/doc/etex/etex_man.pdf) memuat contoh yang mencerahkan tentang sebuah makro yang menggunakan dengan cerdik `\expandafter`:

```
    \def\foo#1#2{\number#1
    \ifnum#1<#2,
    \expandafter\foo
    \expandafter{\number\numexpr#1+1\expandafter}%
    \expandafter{\number#2\expandafter}%
    \fi}
```

`\foo` menerapkan mekanisme perulangan, sedemikian rupa sehingga `\foo{7}{13}` menghasilkan `7, 8, 9, 10, 11, 12, 13`; namun, `\foo` tidak menggunakan apa pun *penugasan ke variabel* untuk mengendalikan proses perulangan—yang membuatnya menjadi makro yang menarik untuk dibahas agak rinci.

### Sedikit latar belakang: ekspresi dan penugasan

Salah satu unsur penting dari `\foo`adalah penggunaan perintah `\numexpr`, sebuah perintah dari seperangkat empat primitif terkait yang pertama kali diperkenalkan oleh $$\varepsilon\mathrm{\text{-}{\TeX}}$$: `\numexpr`, `\dimexpr`, `\glueexpr` dan `\muexpr`. Tujuannya adalah untuk membentuk apa yang disebut *ekspresi* yang memungkinkan perhitungan/manipulasi nilai TeX bertipe number, dimen, glue, atau muglue (berturut-turut). Seperti dibahas pada halaman 8–9 The $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Manual, karakteristik penting dari *ekspresi* adalah bahwa evaluasi (perhitungannya) tidak mengharuskan TeX melakukan apa pun *penugasan*.

Dalam istilah pemrograman, penugasan adalah proses menetapkan (menugaskan) sebuah variabel agar memiliki nilai tertentu; misalnya, menugaskan `\count` register `99` agar berisi nilai `12345` melalui `\count99=12345`. Banyak jenis penugasan lain terjadi selama pemrosesan TeX—seperti menugaskan register token untuk berisi serangkaian token, menugaskan register kotak untuk berisi isi kotak, dan seterusnya.

Untuk melakukan penugasan, seperti `\count99=12345`, TeX perlu mengaktifkan (mengeksekusi) kode internal yang menerapkan perilaku dari `\count` atau primitif lain apa pun yang melakukan semacam penugasan. Namun, ada kalanya TeX sedang melakukan *ekspansi* ekspansi murni*dan, pada saat-saat itu, penugasan semacam itu tidak diaktifkan—*&#x70;ada titik itu dalam pemrosesan TeX

* `\edef\command {*token list*}` perintah makro “definisi yang diperluas” yang memperluas token dalam *daftar token* dan menyimpan hasilnya sebagai definisi dari `\command`.
* `\write *number* {*token list*}` memperluas token dalam `*token list*` dan menuliskannya ke sebuah berkas yang diwakili oleh `*number*`.
* `\directlua {*token list*}` perintah primitif LuaTeX ini digunakan untuk meneruskan kode Lua ke interpreter Lua bawaan. Semua token dalam `*token list*` diperluas sepenuhnya sebelum diteruskan ke interpreter Lua untuk dieksekusi.

#### Contoh cepat \edef

Jika kita menulis makro dasar berikut:

```
     \def\mycount{\count99=12345}
     \edef\mymacro{\mycount}
```

`\edef` akan memperluas `\mycount` ke token-token penyusunnya tetapi tidak melangkah lebih jauh: tidak ada perintah yang terkandung dalam definisi `\mymacro` yang akan diaktifkan: yaitu, penugasan dari `12345` ke `\count99` *tidak terjadi pada titik ini*; hanya ketika kita memanggil `\mymacro` barulah penugasan itu terjadi saat TeX mengeksekusi kode untuk memproses primitif `\count` . Saat TeX melakukan *aktivitas hanya-ekspansi* setiap penugasan akan diaktifkan nanti dalam pemrosesan TeX, bukan selama proses ekspansi itu sendiri.

#### Mengapa penugasan menarik di sini?

Saat menulis kode untuk melakukan perulangan—dalam bahasa pemrograman apa pun—praktik umum adalah memiliki variabel yang ditetapkan sebagai “penghitung loop”: digunakan untuk mengendalikan berapa kali sebuah loop dijalankan. Perulangan biasanya dikendalikan dengan menguji apakah variabel penghitung loop yang ditetapkan itu telah mencapai nilai tertentu—variabel tersebut dinaikkan (atau diturunkan) untuk setiap iterasi loop. Namun, memodifikasi variabel penghitung loop berarti menugaskannya nilai baru yang, untuk TeX, biasanya memerlukan perintah primitif `\advance` untuk menaikkan (atau menurunkan) nilai yang disimpan dalam sebuah `\count` register. Seperti yang telah kita lihat, selama proses ekspansi murni TeX, penugasan semacam itu (termasuk menaikkan variabel) tidak dapat terjadi: makro `\foo` dengan cerdik mengatasi pembatasan ini.

### Kembali menjelaskan \foo

Makro `\foo` mampu mengendalikan proses perulangan *tanpa* tanpa perlu menugaskan nilai ke variabel apa pun: ia mengendalikan seberapa sering perulangan terjadi menggunakan data yang timbul dari ekspansi: nilai data yang disimpan dalam daftar token sementara. Dengan menggunakan pengetahuan kita tentang penggunaan TeX (pembuatan) daftar token sementara, kita dapat melihat lebih dekat untuk mengetahui secara tepat bagaimana `\foo` mencapai hasilnya.

**Ingat**: Kita sedang menelusuri eksekusi sebuah makro setelah teks asli dari definisinya—yang terkandung dalam sebuah `.tex` fisik—telah dipindai (dibaca masuk oleh TeX) dan diubah menjadi daftar token yang mewakili definisi makro. Pada intinya, kita mengikuti pemrosesan TeX atas token-token tersimpan tersebut *token* saat TeX membaca dan memproses token dalam definisi makro yang terkandung di suatu tempat dalam memori TeX. Setiap karakter spasi yang semula ada dalam kode TeX definisi makro (teks di dalam `.tex` berkas) akan diserap saat TeX memindai teks itu untuk perintah (spasi sebagai penanda akhir), atau akan diubah menjadi token, seperti karakter spasi setelah koma (`,`) dalam `\ifnum#1<#2,` yang berasal dari konversi karakter akhir-baris (`\r`) menjadi spasi.

Karena kode TeX dalam `\foo` menggunakan beberapa `\expandafter` perintah, kita akan membantu penjelasan kita dengan menambahkan subskrip pada setiap `\expandafter`, yang menunjukkan yang mana yang kita maksud. Selain itu, kita akan memperluas notasi untuk token yang diproses oleh `\expandafter` ke $$\mathrm{T^i\_1}$$ dan $$\mathrm{T^i\_2}$$, yang merepresentasikan token $$\mathrm{T\_1}$$ dan $$\mathrm{T\_2}$$ untuk `\expandafter<sub>i</sub>`: `\expandafter<sub>i</sub>` $$\mathrm{T^i\_1T^i\_2}$$

Berikut adalah kode makro beranotasi:

```
    \def\foo#1#2{\number#1
    \ifnum#1<#2,
    \expandafter1\foo
    \expandafter2{\number\numexpr#1+1\expandafter3}%
    \expandafter4{\number#2\expandafter5}%
    \fi}
```

`\foo` diawali dengan `\number#1` yang menggunakan perintah yang dapat diperluas `\number` untuk mengonversi nilai argumen pertama menjadi representasi teretakkan. Perintah `\number` bekerja dengan menghasilkan daftar token sementara yang berisi token karakter yang mewakili digit-digit individu yang terkandung dalam nilai numerik yang sedang dioperasikan oleh `\number` . Daftar token itu menjadi sumber input TeX berikutnya. Di sini, daftar token itu dibaca dan token-token tersebut dikeluarkan untuk menata nilai `#1`.

Berikutnya, makro melakukan pengujian `\ifnum#1<#2` untuk memeriksa apakah argumen untuk `#1` lebih kecil daripada argumen yang diteruskan untuk `#2`. Jika ya, sebuah token koma (`,`) dikeluarkan (ditata) diikuti oleh beberapa spasi yang timbul dari token yang dihasilkan dari karakter jeda-baris setelah koma (`,`). Karakter spasi itu pertama kali dihasilkan ketika TeX membaca baris ini dari `.tex` .

Makro melanjutkan dengan memproses bagian kode berikut ini, yang merupakan inti dari operasinya:

```
    \expandafter1\foo
    \expandafter2{\number\numexpr#1+1\expandafter3}%
    \expandafter4{\number#2\expandafter5}%
    \fi}
```

Pada intinya, kode ini menghasilkan serangkaian daftar token sementara yang menghasilkan beberapa pemanggilan ke makro `\foo` , berakhir ketika uji if `\ifnum#1<#2` tidak lagi benar. Tetapi *bagaimana* apakah perulangan ini dikendalikan tanpa penugasan karena tidak ada penugasan yang terjadi: di mana “penghitung loop”-nya?

Mari kita mulai dengan melihat kode `\expandafter<sub>1</sub>\foo\expandafter<sub>2</sub>`. Perhatikan bahwa kita akan menggunakan notasi subskrip `<sub>token</sub>` (atau `<sub>(token)</sub>`) untuk mengingatkan diri kita bahwa, di sini, TeX sedang membaca/memproses nilai token numerik (bilangan bulat).

Di sini, kita memiliki token-token berikut sebagai input untuk `\expandafter<sub>1</sub>`:

* $$\mathrm{T^1\_1} =$$`\foo<sub>token</sub>` yang dibaca masuk dan disimpan untuk diproses nanti *penyisipan kembali* ke dalam masukan
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>2 (token)</sub>` yang diperluas

Untuk `\expandafter<sub>2</sub>` kita memperoleh:

* $$\mathrm{T^2\_1} =$$`{<sub>token</sub>` yang disimpan untuk kemudian *penyisipan kembali* ke dalam masukan
* $$\mathrm{T^2\_2} =$$ `\number<sub>token</sub>` yang diperluas

**Catatan:**`\number` adalah perintah yang dapat diperluas yang tujuannya adalah “mengonversi ke token”: yaitu, mengonversi suatu kuantitas numerik menjadi serangkaian token karakter yang merepresentasikan kuantitas itu. Saat `\number` diperluas, hal pertama yang dilakukan TeX adalah memindai input untuk mencari bilangan bulat: suatu proses yang memicu ekspansi lebih lanjut.

**Kunci ceritanya:** Di sini, `\number` sedang bekerja pada *ekspresi* `\numexpr#1+1` yang menghitung nilai `#1+1`. Hasil perhitungan itu diproses oleh `\number` untuk mengubahnya menjadi daftar token sementara yang berisi token karakter yang mewakili nilai `#1 + 1`. Daftar token sementara itu, yang dihasilkan oleh `\number`, pada akhirnya akan dibaca masuk sebagai argumen pertama untuk pemanggilan lain dari `\foo`. Alih-alih menaikkan penghitung loop (melalui `\advance` dan penugasan), penggunaan `\numexpr` menciptakan nilai baru tetapi tanpa perlunya penugasan. Melalui mekanisme ini, variabel yang mengendalikan loop (`\foo`parameter `#1`dari

Berikutnya, `\expandafter<sub>3</sub>` diproses, menghasilkan:

* $$\mathrm{T^3\_1} =$$`}<sub>token</sub>` yang disimpan untuk kemudian *penyisipan kembali* ke dalam masukan
* $$\mathrm{T^3\_2} =$$`\expandafter<sub>4 (token)</sub>`, yang diperluas:

Untuk `\expandafter<sub>4</sub>` kita memperoleh:

* $$\mathrm{T^4\_1} =$$`{<sub>token</sub>` yang disimpan untuk kemudian *penyisipan kembali* ke dalam masukan
* $$\mathrm{T^4\_2} =$$`\number<sub>token</sub>` yang diperluas dan mengonversi `#2` menjadi daftar token sementara lainnya.

Akhirnya,`\expandafter<sub>5</sub>` diperluas:

* $$\mathrm{T^5\_1} =$$`}<sub>token</sub>` yang disimpan untuk kemudian *penyisipan kembali* ke dalam masukan
* $$\mathrm{T^5\_2} =$$`\fi<sub>token</sub>`, yang merupakan perintah yang dapat diperluas.

  Ekspansi dari `\fi` secara efektif mengakhiri `\ifnum` dan, pada praktiknya, menutup iterasi makro ini. TeX kini menyelesaikan penyisipan kembali semua token yang disimpan sementara oleh beberapa `\expandafter` perintah: ini menghasilkan serangkaian daftar token satu-token yang berasal dari token yang disimpan oleh setiap `\expandafter`. Selain itu TeX juga telah membuat daftar token dari melalui aksi `\number`.

### Merangkai daftar token

Pada intinya, `\foo` makro menghasilkan rangkaian daftar token: Anda dapat menganggap `\foo` sebagai fasilitas “manufaktur” daftar token. Daftar token itu dibaca oleh TeX untuk menjadi sumber input berikutnya. Bagian cerdik terdapat dalam salah satu tindakan awal dari `\foo`:

```
    \expandafter1\foo\expandafter2
```

melalui mana `\foo` mengatur untuk memanggil dirinya sendiri lagi tetapi dengan argumen berbeda yang disimpan dalam daftar token yang dibangun oleh `\number`. Agar daftar token ini secara kolektif berperilaku sebagai sebuah pemanggilan makro, tanda kurung kurawal `{` dan `}` semuanya telah disimpan dan disisipkan kembali ke dalam input (sebagai daftar satu-token) oleh aksi `\expandafter` perintah.

![daftar token yang dihasilkan oleh makro \foo](/files/79d0ea733e55a3fa7c9f78e6deee72c3499f9856)

&#x20;[Bagian 1](/latex/id/artikel-mendalam/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Bagian 2](/latex/id/artikel-mendalam/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Bagian 3](/latex/id/artikel-mendalam/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Bagian 4](/latex/id/artikel-mendalam/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Bagian 5](/latex/id/artikel-mendalam/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Bagian 6](/latex/id/artikel-mendalam/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)


---

# 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/17-how-does-expandafter-work-a-detailed-macro-case-study.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.
