> 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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# Bagaimana \expandafter bekerja: Studi terperinci tentang perintah \expandafter berurutan

&#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: Memahami \expandafter\expandafter\expandafter...

Makro tingkat lanjut, seperti yang terdapat dalam paket LaTeX, sering memanfaatkan secara ekstensif beberapa `\expandafter` perintah berturut-turut untuk melakukan “jongling” token yang canggih. Bagi kebanyakan dari kita, makro seperti itu bisa sulit dipahami atau terasa menakutkan untuk ditulis. Di bagian ini kita akan meninjau mekanisme yang mendasari pemrosesan TeX terhadap perintah berturut-turut `\expandafter` perintah:

```
\expandafter\expandafter\expandafter...
```

Untuk membantu penjelasan kita, kita akan menambahkan subskrip pada setiap `\expandafter`—untuk menunjukkan yang mana yang sedang kita maksud:

```
        \expandafter1\expandafter2\expandafter3...
```

Selain itu, kita akan memperluas notasi untuk token yang diproses oleh masing-masing `\expandafter` agar menggunakan $$\mathrm{T^i\_1}$$ dan $$\mathrm{T^i\_2}$$ yang merepresentasikan token-token $$\mathrm{T\_1}$$ dan $$\mathrm{T\_2}$$ yang dibaca oleh `\expandafter` dengan subskrip `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Kita juga akan mengasumsikan bahwa dua token $$\mathrm{T\_X}$$ dan $$\mathrm{T\_Y}$$ mengikuti setelah `\expandafter<sub>3</sub>` sehingga masukan kita terlihat seperti ini: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

Ketika TeX mulai memproses masukan ini, untuk `\expandafter<sub>1</sub>` ia akan melihat

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

Jika kita kembali pada pembahasan sebelumnya tentang [kode di dalam TeX](/latex/id/artikel-mendalam/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) yang mengimplementasikan `\expandafter`, adalah dengan perluasan `\expandafter<sub>3</sub>` kita melihat rekursi terjadi. Untuk memproses `\expandafter<sub>1</sub>` TeX telah memanggil fungsi internalnya `expand()`, jadi untuk memproses (memperluas) `\expandafter<sub>3</sub>` TeX melakukan *kedua* pemanggilan ke `expand()`—dari dalam `expand()` fungsi itu sendiri.

Untuk `\expandafter<sub>3</sub>` kita memiliki

* $$\mathrm{T^3\_1 = T\_X}$$, yang disimpan untuk kemudian *penyisipan kembali* ke dalam masukan
* $$\mathrm{T^3\_2 = T\_Y}$$, yang akan kita asumsikan dapat diperluas

Mari kita asumsikan lebih lanjut bahwa perluasan dari $$\mathrm{T\_Y}$$ menghasilkan urutan token berikut: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Kita sekarang telah mencapai akhir proses perluasan yang dimulai oleh rangkaian perintah `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ dan TeX melanjutkan untuk “membuka” proses rekursi yang dimulai dengan `\expandafter<sub>1</sub>`.

Setelah memproses `\expandafter<sub>3</sub>` TeX memiliki, dalam memorinya, daftar token yang berisi token-token dari perluasan $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX sekarang mulai menyisipkan kembali token-token yang disimpannya saat memproses `\expandafter` perintah:

1. TeX memulai dengan menyisipkan kembali token $$\mathrm{T\_X}$$ yang disimpan oleh `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ disisipkan kembali *di depan* dari perluasan $$\mathrm{T\_Y}$$, yang menghasilkan urutan token: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Namun, kita masih perlu menyelesaikan proses yang dimulai oleh `\expandafter<sub>1</sub>` yang menyimpan token yang merepresentasikan `\expandafter<sub>2</sub>`
3. Urutan token akhir yang disusun oleh TeX, siap untuk dibaca pada tahap berikutnya dari pemrosesan TeX adalah `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX sekarang telah menyelesaikan “putaran pertama” pemrosesan dan beralih untuk membaca urutan daftar token yang telah dihasilkannya—urutan itu dimulai dengan `\expandafter<sub>2 (token)</sub>` yang kemudian diproses oleh TeX. Untuk `\expandafter<sub>2</sub>` kita memiliki
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ yang disimpan untuk kemudian *penyisipan kembali* ke dalam masukan
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ yang merupakan token pertama yang muncul dari perluasan $$\mathrm{T\_Y}$$; jika dapat diperluas, token itu diperluas
5. Jika kita mengasumsikan token $$\mathrm{T^1\_Y}$$, token pertama dari perluasan $$\mathrm{T\_Y}$$, diperluas menjadi $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ maka, setelah TeX menyisipkan kembali $$\mathrm{T\_X}$$, urutan token yang dihasilkan untuk diproses ulang oleh TeX adalah: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   yang dapat kita nyatakan ulang sebagai

   $$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

Diagram berikut mengilustrasikan daftar token yang dibuat oleh kode TeX

```
    \expandafter1\expandafter2\expandafter3TXTY
```

![Gambar yang menunjukkan TeX memproses beberapa perintah \expandafter](/files/9101f44faddfe55b83397df34cc30c5f42e7ded4)

### Teori menjadi praktik

Sebagai contoh, kita akan mendefinisikan makro berikut untuk berfungsi sebagai $$\mathrm{T\_X}$$ dan $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` di mana kita mendefinisikan `\foo` sebagai `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` di mana pertama-tama kita mendefinisikan `\def\abc{Hello}`, `\def\xyz{, World!}` dan kemudian `\def\bar{\abc\xyz}`

Kita akan menggunakan cuplikan kode berikut untuk mendemonstrasikan analisis kita sebelumnya:

\expandafter\expandafter\expandafter\foo\bar

Dari pembahasan kita, hasil dari `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ menghasilkan urutan token dalam bentuk:

$$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

di mana urutan persisnya bergantung pada sifat token $$\mathrm{T\_Y}$$. Jika kita memasukkan contoh perintah kita menggunakan $$\mathrm{T\_X}=$$`\foo` dan $$\mathrm{T\_Y}=$$`\bar`, yang didefinisikan sebagai `\def\bar{\abc\xyz}`, kita melihat:

* token pertama dalam $$\mathrm{T\_Y}$$ adalah `\abc` dan perluasannya adalah urutan token karakter: `Hello`
* token-token yang tersisa dalam $$\mathrm{T\_Y}$$ adalah token tunggal yang merepresentasikan `\xyz`.

Jika kita memasukkan informasi ini ke dalam “analisis” kita, kita memperoleh

$$\begin{align\*} &\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}\ &=\text{foo}*{\text{token}}\text{\<expansion of \abc>}*\text{token list (characters)}\text{xyx}*\text{token}\ &=\text{foo}*\text{token}\text{Hello}*\text{token list (characters)}\text{xyx}*\text{token}\\\[10pt] \end{align\*}$$

Perhatikan bahwa subskrip <sub>token</sub> dan <sub>daftar token (karakter)</sub> digunakan untuk menegaskan (mengingatkan kita) bahwa TeX sedang membaca *nilai token integer*, bukan *karakter teks*, karenanya tidak perlu menampilkan karakter spasi atau pembatas lain setelah `\foo`: pembatas seperti itu sudah lama diproses atau dibuang; di sini kita sepenuhnya berada di dunia dalam TeX berupa daftar token dan nilai token integer.

Ketika TeX memproses urutan daftar token yang dihasilkan oleh `\expandafter` perintah-perintah kita, TeX akan menata huruf `**H**ello, World!`—hanya `H` yang ditata tebal. Kita bisa mencapai hasil yang sama dengan menulis kode TeX yang ekuivalen `\foo Hello\xyz`. Perhatikan bahwa definisi `\foo` menggunakan satu parameter; akibatnya, `\foo` menyerap satu `H` token karakter untuk argumennya, meninggalkan token karakter yang tersisa (`ello`) tidak tersentuh.

**Catatan:**

* menulis `\foo\bar` menghasilkan keluaran yang sangat berbeda: token untuk `\bar` akan digunakan sebagai argumen untuk `\foo` yang menghasilkan penataan huruf **`Hello, World`**—semuanya ditata tebal.
* menulis `\expandafter\foo\bar` menyebabkan `\bar` diperluas, yang menghasilkan dua token: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Lalu, setelah $$\text{foo}*\text{token}$$ disisipkan kembali oleh `\expandafter` TeX memproses urutan token $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ yang menata huruf `**Hello**, World`—hanya **`Hello`** ditata tebal. Di sini, token tunggal $$\text{abc}*\text{token}$$ diproses sebagai argumen untuk token makro $$\text{foo}*\text{token}$$, meninggalkan token $$\text{xyz}\_\text{token}$$ tidak tersentuh dan isinya ditata dengan font saat ini.

## Catatan tentang \expandafter dan makro dengan argumen

Saat menggunakan `\expandafter` untuk memaksa perluasan makro, ada baiknya mengetahui cara kerja perluasan makro—terutama untuk makro yang mengambil argumen. Sebelum TeX dapat menjalankan sebuah makro—yaitu, membaca dan memproses token yang terkandung di dalam definisi makro—TeX perlu membuat makro itu “siap dijalankan” dengan melakukan proses perluasan makro awal. Jika definisi sebuah makro mencakup penggunaan parameter (`#1`, `#2`, ... `#9`) sebagian dari proses perluasan makro mengharuskan TeX memindai masukan untuk mencari token-token yang membentuk argumen yang diberikan oleh pengguna: token-token argumen itu diserap (dihapus) dari masukan. Selama perluasan makro TeX membaca dan menyerap token dari masukan untuk membuat daftar token kecil, satu daftar per argumen; daftar token tersebut kemudian akan disisipkan ke lokasi yang sesuai di dalam tubuh makro—ketika TeX mengeksekusinya. Langkah terakhir dalam perluasan makro melibatkan TeX menemukan definisi makro yang tersimpan dalam memori dan mengatur agar lokasi itu menjadi sumber tempat TeX akan membaca set token masukannya berikutnya. Eksekusi makro dimulai ketika TeX mulai membaca dan memproses token-token tersebut, memasukkan daftar token yang sebelumnya dibuat untuk menyimpan argumen.

### Token delimitasi juga diserap

Jika definisi makro asli juga menggunakan token yang berperan sebagai delimitasi, TeX juga perlu membandingkan definisi makro asli dengan pemakaian (pemanggilan) makro tersebut oleh pengguna, untuk mencari dan mencocokkan token delimitasi. Setelah cocok/ditemukan, token delimitasi selanjutnya diabaikan karena satu-satunya tujuan mereka adalah berfungsi sebagai “tanda baca”, membantu TeX memilih dan mengidentifikasi token-token yang sebenarnya yang akan membentuk setiap argumen.

&#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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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.
