> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-pro.ayaka.space/latex/tr/derinlemesine-makaleler/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# \expandafter nasıl çalışır: Ardışık \expandafter komutlarının ayrıntılı bir incelemesi

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

## Vaka çalışması: \expandafter\expandafter\expandafter... ifadesini anlamak

LaTeX paketlerinde bulunanlar gibi gelişmiş makrolar, çoğu zaman art arda gelen çok sayıda `\\expandafter` komutu, gelişmiş token “cambazlığı” yapmak için yoğun biçimde kullanır. Çoğumuz için bu tür makroları anlamak zor, yazmak ise göz korkutucu olabilir. Bu bölümde, TeX’in ardışık `\\expandafter` komutlarını:

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

açıklamamıza yardımcı olmak için her birine alt simgeler ekleyeceğiz `\\expandafter`—hangi birinden söz ettiğimizi belirtmek için:

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

Ayrıca, her biri tarafından işlenen tokenlar için gösterimi genişleteceğiz `\\expandafter` şu şekilde kullanmak için $$\mathrm{T^i\_1}$$ ve $$\mathrm{T^i\_2}$$ işlenen tokenları $$\mathrm{T\_1}$$ ve $$\mathrm{T\_2}$$ tarafından okunan `\\expandafter` alt simgeli `i`: `\\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. Ayrıca iki tokenın $$\mathrm{T\_X}$$ ve $$\mathrm{T\_Y}$$ sonrasında geldiğini `\expandafter<sub>3</sub>` varsayacağız; böylece girdimiz şöyle görünür: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

TeX bu girdiyi işlemeye başladığında,  `\expandafter<sub>1</sub>` şunu görecektir

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` sonradan yeniden kullanılmak üzere saklanır *yeniden eklenme* girdiye geri
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`, bu da genişletilir

Önceki [TeX’in içindeki kod](/latex/tr/derinlemesine-makaleler/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) uygulayan `\\expandafter`, genişletilmesiyle birlikte `\expandafter<sub>3</sub>` özyinelemenin gerçekleştiğini görüyoruz. İşlemek için `\expandafter<sub>1</sub>` TeX daha önce kendi iç işlevini çağırmış durumda `expand()`, dolayısıyla işlemek (genişletmek) için `\expandafter<sub>3</sub>` TeX bir *ikinci* çağrı yapıyor `expand()`—işlevin `expand()` kendisinin içinden.

için `\expandafter<sub>3</sub>` elimizde

* $$\mathrm{T^3\_1 = T\_X}$$, bu da sonradan yeniden kullanılmak üzere saklanır *yeniden eklenme* girdiye geri
* $$\mathrm{T^3\_2 = T\_Y}$$, bunun genişletilebilir olduğunu varsayacağız

Şimdi ayrıca $$\mathrm{T\_Y}$$ genişletilmesinin aşağıdaki token dizisini verdiğini varsayalım: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. Artık komut dizisinin başlattığı genişletme sürecinin sonuna ulaştık `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ ve TeX, bununla başlayan özyineleme sürecini “geri açmaya” devam eder `\expandafter<sub>1</sub>`.

İşledikten sonra `\expandafter<sub>3</sub>` TeX’in belleğinde, genişletilmesinden gelen tokenları içeren bir token listesi vardır $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. TeX şimdi, işlerken kaydettiği tokenları yeniden eklemeye başlar `\\expandafter` komutlarını:

1. TeX, tokenı yeniden eklemekle başlar $$\mathrm{T\_X}$$ tarafından kaydedilen `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ yeniden eklenir *önüne* genişletilmesinin $$\mathrm{T\_Y}$$, bu da bir token dizisi oluşturur: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. Ancak, tarafından başlatılan süreci hâlâ tamamlamamız gerekiyor `\expandafter<sub>1</sub>` hangi, tokenı kaydetti `\expandafter<sub>2</sub>`
3. TeX tarafından oluşturulan ve TeX’in işlenmesinin bir sonraki aşamasında okunmaya hazır son token dizisi şudur `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. TeX artık işlemenin “ilk turunu” tamamladı ve ürettiği token listeleri dizisini okumaya geçiyor—bu dizi şununla başlar `\expandafter<sub>2 (token)</sub>` ve TeX bunu işlemeye devam eder. İçin `\expandafter<sub>2</sub>` elimizde
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ sonradan yeniden kullanılmak üzere saklanır *yeniden eklenme* girdiye geri
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ ki bu, genişletilmesinden doğan ilk tokendır $$\mathrm{T\_Y}$$; eğer genişletilebilir ise, genişletilir
5. Eğer tokenı varsayarsak $$\mathrm{T^1\_Y}$$, genişletilmesinden gelen ilk token $$\mathrm{T\_Y}$$, şuna genişler: $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ o zaman, TeX yeniden ekledikten sonra $$\mathrm{T\_X}$$, TeX tarafından yeniden işlenecek ortaya çıkan token dizisi şöyle olurdu: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   bunu şu şekilde yeniden ifade edebiliriz

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

Aşağıdaki diyagram, TeX kodunun oluşturduğu token listelerini gösterir

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

![TeX’in birden çok \expandafter komutunu işlediğini gösteren görüntü](/files/852321229a517801d8fae97320caef311917b03f)

### Teoriden pratiğe

Bir örnek olarak, aşağıdaki makroları $$\mathrm{T\_X}$$ ve $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\\foo` olarak tanımlayalım `\\foo` şu şekilde `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` önce şunları tanımlayalım `\def\abc{Hello}`, `\def\xyz{, World!}` ve sonra `\def\bar{\abc\xyz}`

Önceki analizimizi göstermek için aşağıdaki kod parçasını kullanacağız:

\expandafter\expandafter\expandafter\foo\bar

Tartışmamıza göre, sonucun `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ şu biçimde bir token dizisi üretir:

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

burada tam sıra, tokenın doğasına bağlıdır $$\mathrm{T\_Y}$$. Örnek komutlarımızı kullanarak yerleştirirsek $$\mathrm{T\_X}=$$`\\foo` ve $$\mathrm{T\_Y}=$$`\bar`, şu şekilde tanımlanan `\def\bar{\abc\xyz}`, şunu görürüz:

* ilk token $$\mathrm{T\_Y}$$ şudur `\abc` ve onun genişlemesi karakter tokenlarından oluşan bir dizidir: `Hello`
* kalan tokenlar $$\mathrm{T\_Y}$$ tek tokendir ve şunu temsil eder `\xyz`.

Bu bilgiyi “analizimize” uygularsak

$$\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\*}$$

Alt simgelerin <sub>belirtecini</sub> ve <sub>token listesi (karakterler)</sub> TeX’in okuduğunu vurgulamak (hatırlatmak) için kullanıldığını unutmayın *tamsayı token değerlerini*, değil *metin karakterlerini*, bu yüzden `\\foo`sonra herhangi bir boşluk karakteri ya da başka ayırıcı göstermeye gerek yoktur: bu tür ayırıcılar çoktan işlenmiş ya da atılmıştır; burada artık TeX’in token listeleri ve tamsayı token değerlerinden oluşan iç dünyasındayız.

TeX bizim `\\expandafter` komutlarımızın ürettiği token-listesi dizisini işlediğinde `**H**ello, World!`—yalnızca `H` kalın dizilir. Aynı sonucu eşdeğer TeX kodunu yazarak da elde edebiliriz `\foo Hello\xyz`. Şuna dikkat edin `\\foo` tanımında `\\foo` tek bir parametre kullanılmıştı; dolayısıyla, `H` tek`karakter tokenını argümanı olarak alır, kalan karakter tokenlarını (`) dokunulmamış bırakır.

**Notlar:**

* yazmak `\foo\bar` çok farklı bir çıktı üretir: token `\bar` için `\\foo` argüman olarak kullanılacaktır **`Hello, World`**—her şey kalın dizilir.
* yazmak `\expandafter\foo\bar` neden olur `\bar` genişletilmesine, bu da iki token üretir: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. Sonra, $$\text{foo}*\text{token}$$ yeniden eklenir `\\expandafter` TeX token dizisini işler $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ ki bu,  `**Hello**, World`—yalnızca **`Hello`** kalın dizilir. Burada, tek token $$\text{abc}*\text{token}$$ makro tokenı için argüman olarak işlenir $$\text{foo}*\text{token}$$, tokenı bırakır $$\text{xyz}\_\text{token}$$ dokunulmamış ve içeriği mevcut yazı tipinde dizilmiş olarak.

## \expandafter ve argüman alan makrolar üzerine not

Kullanırken `\\expandafter` makroların genişletilmesini zorlamak için makro genişletmesinin nasıl çalıştığını bilmekte fayda vardır—özellikle argüman alan makrolar için. TeX bir makroyu çalıştırabilmeden önce—yani, makronun tanımında yer alan tokenları okuyup işleyebilmeden önce—TeX’in ilk makro genişletme işlemini gerçekleştirerek makroyu “çalışmaya hazır” hale getirmesi gerekir. Bir makronun tanımı parametrelerin (`#1`, `#2`, ... `#9`) kullanımını içeriyorsa, makro genişletme sürecinin bir kısmı TeX’in girdiyi tarayıp kullanıcı tarafından sağlanan argüman(lar)ı oluşturan tokenları bulmasını gerektirir: bu argüman tokenları girdiden emilir (çıkarılır). Makro genişletmesi sırasında TeX, her argüman için birer küçük token listesi oluşturmak üzere girdiden tokenları okur ve emer; bu token listeleri daha sonra TeX onu çalıştırdığında makronun gövdesindeki uygun konuma yerleştirilecektir. Makro genişletmesinin son aşaması, TeX’in bellekte saklanan makro tanımını bulmasını ve o konumu TeX’in bir sonraki giriş tokenları kümesini okuyacağı kaynak olacak şekilde düzenlemesini içerir. Makro çalıştırma, TeX bu tokenları okumaya ve işlemeye başladığında, önceden oluşturulmuş ve argümanları saklayan token listelerini içeri besleyerek başlar.

### Sınırlandırıcı tokenlar da emilir

İlk makro tanımı ayrıca sınırlandırıcı olarak işlev gören tokenları da kullanmış olsaydı, TeX’in orijinal makro tanımını kullanıcının o makroyu kullanımı (çağrısı) ile de karşılaştırması, sınırlandırıcı tokenları bulup eşleştirmesi gerekirdi. Bir kez eşleşip/bulunduktan sonra, sınırlandırıcı tokenlar sonraki aşamada yok sayılır; çünkü tek amaçları “noktalama işareti” gibi davranarak TeX’in her argümanı oluşturacak gerçek tokenları seçip tanımlamasına yardımcı olmaktır.

&#x20;[Bölüm 1](/latex/tr/derinlemesine-makaleler/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md)   [Bölüm 2](/latex/tr/derinlemesine-makaleler/22-how-does-expandafter-work-the-meaning-of-expansion.md)   [Bölüm 3](/latex/tr/derinlemesine-makaleler/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md)   [Bölüm 4](/latex/tr/derinlemesine-makaleler/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md)   [Bölüm 5](/latex/tr/derinlemesine-makaleler/17-how-does-expandafter-work-a-detailed-macro-case-study.md)   [Bölüm 6](/latex/tr/derinlemesine-makaleler/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://ayakaleaf-pro.ayaka.space/latex/tr/derinlemesine-makaleler/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.
