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

# \expandafter nasıl çalışır: Ayrıntılı bir makro vaka 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;

## Örnek olay incelemesi: The'den \expandafter örneği $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Kılavuz

Bu $$\varepsilon\mathrm{\text{-}{\TeX}}$$ dizgi motoru, Knuth’un TeX yazılımından türetilmiştir ve başlangıçta “ara” bir adım olarak ... geliştirilmesine yönelik olarak tasarlanmıştır [Yeni Dizgi Sistemi](https://en.wikipedia.org/wiki/New_Typesetting_System) (NTS), Java programlama diliyle yazılmıştır. $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Knuth’un özgün programında bulunmayan ek işlevler sağlayan yeni bir dizi ilkel komut eklemek üzere ilk olarak 1990’ların sonlarında geliştirildi. Her ne kadar $$\varepsilon\mathrm{\text{-}{\TeX}}$$ ilk sürümünden bu yana periyodik güncellemeler almış olsa da, bugün bağımsız bir dizgi motoru olarak yaygın biçimde kullanılmamaktadır; ancak yenilikleri TeX’in sonraki kuşaklarına: pdfTeX, XeTeX ve LuaTeX’e aktarılmıştır.

Bu [$$\varepsilon\mathrm{\text{-}{\TeX}}$$ manual](http://mirror.ox.ac.uk/sites/ctan.org/systems/doc/etex/etex_man.pdf) akıllıca yararlandığı bir makronun aydınlatıcı bir örneğini içerir `\\expandafter`:

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

`\\foo` bir döngü mekanizması uygular, öyle ki `\foo{7}{13}` üretir `7, 8, 9, 10, 11, 12, 13`; ancak, `\\foo` herhangi bir *değişkenlere atama* döngü sürecini kontrol etmek için — bu da onu biraz ayrıntılı incelemeye değer ilginç bir makro hâline getirir.

### Biraz arka plan: ifadeler ve atamalar

... önemli bir öğesi `\\foo`’nin kodunun, şu komutun kullanılmasıdır `\\numexpr`, ilk kez $$\varepsilon\mathrm{\text{-}{\TeX}}$$: `\\numexpr`, `\\dimexpr`, `\\glueexpr` ve `\\muexpr`tarafından tanıtılan dört ilişkili ilkelden oluşan bir kümeden gelen bir komut. *ifadeler* bunlar sırasıyla number, dimen, glue veya muglue türündeki TeX değerlerinin hesaplanmasına/manipüle edilmesine olanak tanır. The’nin 8–9. sayfalarında tartışıldığı gibi $$\varepsilon\mathrm{\text{-}{\TeX}}$$ Kılavuz’da, *ifadeler* bunların değerlendirilmesi (hesaplanması), TeX’in herhangi bir *atamalar*.

Programlama terimleriyle, atama, bir değişkene belirli bir değer verme sürecidir; örneğin, `\\count` kayıt `99` değerini içerecek şekilde `12345` şunun aracılığıyla `\count99=12345`. TeX işleme sırasında başka birçok atama türü gerçekleşir — örneğin, belirteç kayıtlarına bir dizi belirteç içermelerini atamak, kutu kayıtlarına kutu içeriği içermelerini atamak ve benzerleri.

Böyle bir atamayı yapmak için, örneğin `\count99=12345`TeX’in davranışını gerçekleştiren iç kodu çalıştırması gerekir `\\count` veya herhangi başka bir atama türü gerçekleştiren ilkel komutu. Ancak, TeX’in saf *genişletme* ve o zamanlarda bu tür atamalar yürürlüğe konmaz —*TeX’in işleyişinin o noktasında*. Bu durumun örnekleri arasında şu komutlar bulunur:

* `\edef\command {*token list*}` belirteçleri ... içinde genişleten “genişletilmiş tanım” makro tanımlama komutu *belirteç listesi* ve sonuçları ... tanımı olarak saklar `\command`.
* `\write *number* {*token list*}` belirteçleri ... içinde genişletir `*token list*` ve onları ... ile temsil edilen bir dosyaya yazar `*number*`.
* `\directlua {*token list*}` bu LuaTeX ilkeli komutu, Lua kodunu yerleşik Lua yorumlayıcısına aktarmak için kullanılır. ... içindeki tüm belirteçler `*token list*` çalıştırılmak üzere Lua yorumlayıcısına iletilmeden önce tamamen genişletilir.

#### \edef için hızlı bir örnek

Aşağıdaki temel makroları yazarsak:

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

`\edef` genişletilecektir `\mycount` kendi bileşen belirteçlerine genişletir, ancak daha ileri gitmez: ... tanımında yer alan komutların hiçbiri `\mymacro` yürürlüğe konmayacaktır: yani, `12345` ile `\count99` *bu aşamada gerçekleşmez*; yalnızca `\mymacro` TeX, ... işlemek için kodu çalıştırırken bu atama gerçekleşecektir `\\count` ilkeli komutunu işlerken. TeX *yalnızca genişletme faaliyetleri* herhangi bir atama TeX işleyişinin daha sonraki bir aşamasında yürürlüğe konur, genişletme sürecinin kendisi sırasında değil.

#### Atamalar neden burada ilgi çekici?

Bir döngü gerçekleştirecek kod yazarken — herhangi bir programlama dilinde — “döngü sayacı” olarak görev yapacak bir değişken belirlemek yaygın bir uygulamadır: döngünün kaç kez çalıştırılacağını kontrol etmek için kullanılır. Döngü, genellikle o atanmış döngü-sayacı değişkeninin belirli bir değere ulaşıp ulaşmadığı test edilerek kontrol edilir — bu değişken döngünün her yinelemesinde artırılır (veya azaltılır). Ancak, bir döngü-sayacı değişkenini değiştirmek, ona yeni bir değer atamak demektir; TeX’te bu genellikle şu ilkel komutu gerektirir `\\advance` bir ... içinde depolanan değeri artırmak (veya azaltmak) için `\\count` kayıt `\\foo` bu kısıtı akıllıca aşar.

### \foo’yu açıklamaya geri dönelim

Makro `\\foo` döngü sürecini kontrol edebilir *olmayan* herhangi bir değişkene değer atamaya gerek duymadan: genişletmeden doğan verileri kullanarak döngünün ne sıklıkta gerçekleştiğini kontrol eder: geçici belirteç listelerinde saklanan veri değerleri. TeX’in geçici belirteç listelerini kullanımı (oluşturması) hakkındaki bilgimizi kullanarak, tam olarak nasıl olduğunu daha yakından inceleyebiliriz `\\foo` sonuçlarına ulaştığını.

**Unutmayın**: Fiziksel bir `.tex` dosya — taranmış (TeX tarafından okunmuş) ve makro tanımını temsil eden bir belirteç listesine dönüştürülmüştür. Özünde, TeX’in bu saklanmış *tokenlar* TeX belleğinin bir yerinde bulunan makro tanımındaki belirteçleri okurken ve işlerken. Makro tanımının TeX kodunda başlangıçta bulunan herhangi bir boşluk karakteri (içindeki metin `.tex` dosyasında) TeX bu metni komutlar için tararken emilmiş olacaktır (sonlandırıcı olarak boşluklar), ya da belirteçlere dönüştürülmüş olacaktır; örneğin, virgülden sonraki boşluk karakteri (`,`) içindeki `\ifnum#1<#2,` satır sonu karakterinin (`\r`) boşluğa dönüştürülmesinden ortaya çıkan

Çünkü ... içindeki TeX kodu `\\foo` birden çok `\\expandafter` komut, açıklamamıza yardımcı olmak için her birine alt simgeler ekleyeceğiz `\\expandafter`, hangisinden söz ettiğimizi belirtmek için. Ayrıca, `\\expandafter` ile $$\mathrm{T^i\_1}$$ ve $$\mathrm{T^i\_2}$$... tarafından işlenen belirteçler için gösterimi genişleteceğiz $$\mathrm{T\_1}$$ ve $$\mathrm{T\_2}$$ için `\expandafter<sub>i</sub>`: `\expandafter<sub>i</sub>` $$\mathrm{T^i\_1T^i\_2}$$

İşte açıklamalı makro kodu:

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

`\\foo` ile başlar `\number#1` genişletilebilir komutunu kullanır `\number` ilk argüman değerini dizgilenmiş gösterimine dönüştürmek için. The `\number` komutu, üzerinde çalıştığı sayısal değerde bulunan tek tek rakamları temsil eden karakter belirteçlerini içeren geçici bir belirteç listesi oluşturarak çalışır. `\number` üzerinde işlem yapar. O belirteç listesi TeX’in bir sonraki girdi kaynağı olur. Burada o belirteç listesi okunur ve belirteçler, ... değerini dizmek için çıktı olarak verilir `#1`.

Ardından makro şu testi yapar `\ifnum#1<#2` şu argümanının olup olmadığını kontrol etmek için `#1` ... için aktarılan argümandan küçüktür `#2`. Eğer öyleyse, bir virgül (`,`) belirteci çıktı olarak verilir (dizilir) ve ardından virgülden sonraki satır sonu karakterinden üretilen belirteçten kaynaklanan bir boşluk gelir (`,`). O boşluk karakteri ilk olarak TeX bu satırı `.tex` dosyasında.

Makro, işleminin çekirdeğini oluşturan şu bir sonraki kod bölümünü işleyerek devam eder:

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

Özünde, bu kod ... birçok kez çağrılmasına yol açan bir dizi geçici belirteç listesi üretir `\\foo` makrosunu üretir; if testi `\ifnum#1<#2` artık doğru değildir. Ancak *nasıl* döngü kontrolü, çünkü hiçbir atama gerçekleşmiyor: “döngü sayacı” nerede?

Koda bakarak başlayalım `\expandafter<sub>1</sub>\foo\expandafter<sub>2</sub>`. Alt simge gösterimini kullanacağımızı unutmayın `<sub>token</sub>` (veya `<sub>(token)</sub>`) burada TeX’in sayısal (tam sayı) belirteç değerlerini okuduğunu/işlediğini kendimize hatırlatmak için kullanacağız.

Burada, ... için girdi olarak şu belirteçlere sahibiz `\expandafter<sub>1</sub>`:

* $$\mathrm{T^1\_1} =$$`\foo<sub>token</sub>` okunup daha sonra kullanılmak üzere saklanan *yeniden eklenme* girdiye geri
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>2 (token)</sub>` genişletilen

için `\expandafter<sub>2</sub>` elimizde şunlar var:

* $$\mathrm{T^2\_1} =$$`{<sub>token</sub>` sonradan yeniden kullanılmak üzere saklanır *yeniden eklenme* girdiye geri
* $$\mathrm{T^2\_2} =$$ `\number<sub>token</sub>` genişletilen

**Not:**`\number` “belirteçlere dönüştürmek” amacı taşıyan genişletilebilir bir komuttur; yani, sayısal bir miktarı onu temsil eden bir dizi karakter belirtecine dönüştürür.  `\number` genişletildiğinde TeX’in yaptığı ilk şey, girdiyi tamsayılar için taramaktır: bu süreç daha fazla genişletmeyi tetikler.

**Hikâyenin anahtarı:** Burada, `\number` ... üzerinde işlem yapıyor *ifade* `\numexpr#1+1` şu değeri hesaplayan `#1+1`. Bu hesaplamanın sonucu `\number` onu, ... değerini temsil eden karakter belirteçlerini içeren geçici bir belirteç listesine dönüştürmek için `#1 + 1`. ... tarafından üretilen bu geçici belirteç listesi `\number`sonunda ...’nin başka bir çağrısına ilk argüman olarak okunacaktır `\\foo`. Bir döngü sayacını ( ... aracılığıyla) artırmak yerine `\\advance` ve atama), ... kullanımı `\\numexpr` atamaya gerek kalmadan yeni bir değer oluşturur. Bu mekanizma sayesinde döngüyü kontrol eden değişken (`\\foo`’nin parametresi `#1`) artırılır ve döngüdeki yineleme kontrol edilip sonlandırılır: oldukça zekice!

Sonra, `\expandafter<sub>3</sub>` işlenir ve şu sonucu verir:

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

için `\expandafter<sub>4</sub>` elimizde şunlar var:

* $$\mathrm{T^4\_1} =$$`{<sub>token</sub>` sonradan yeniden kullanılmak üzere saklanır *yeniden eklenme* girdiye geri
* $$\mathrm{T^4\_2} =$$`\number<sub>token</sub>` bu genişletilir ve `#2` başka bir geçici belirteç listesine dönüştürür.

Son olarak,`\expandafter<sub>5</sub>` genişletilir:

* $$\mathrm{T^5\_1} =$$`}<sub>token</sub>` sonradan yeniden kullanılmak üzere saklanır *yeniden eklenme* girdiye geri
* $$\mathrm{T^5\_2} =$$`\fi<sub>token</sub>`, bu genişletilebilir bir komuttur.

  ... genişletilmesi `\fi` fiilen ... sonlandırır `\ifnum` ve fiilen makronun bu yinelemesini kapatır. TeX şimdi, birden çok `\\expandafter` komutu tarafından geçici olarak kaydedilen tüm belirteçlerin yeniden eklenmesini tamamlar: bu, her bir `\\expandafter`tarafından kaydedilen belirteçlerden türeyen tek belirteçli belirteç listeleri dizisi üretir. `\number`.

### Belirteç listelerinin birleştirilmesi

Özünde, `\\foo` makro bir belirteç listeleri dizisi üretir: `\\foo` bir belirteç listesi “üretim tesisi” olarak düşünebilirsiniz. Bu belirteç listeleri, bir sonraki girdi kaynakları hâline gelmek üzere TeX tarafından okunur. Akıllı kısım, `\\foo`:

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

bu yolla `\\foo` kendi kendini yeniden çağıracak şekilde düzenler, ancak ... tarafından oluşturulan belirteç listelerinde saklanan farklı argümanlarla `\number`. Bu belirteç listelerinin topluca bir makro çağrısı gibi davranmasını sağlamak için, süslü parantezler `{` ve `}` tamamı ... işlemleriyle girişe (tek belirteçli listeler olarak) kaydedilmiş ve yeniden eklenmiştir `\\expandafter` komutları.

![\foo makrosu tarafından oluşturulan belirteç listeleri](/files/ca7340f6582d70cd06d0b82ad31aa2e8e637d02d)

&#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/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.
