> 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/tr/daha-fazla-konu/24-how-tex-macros-actually-work-part-6.md).

# TeX makroları gerçekte nasıl çalışır: Bölüm 6

[Bölüm 1](/latex/tr/daha-fazla-konu/19-how-tex-macros-actually-work-part-1.md) [Bölüm 2](/latex/tr/daha-fazla-konu/20-how-tex-macros-actually-work-part-2.md) [Bölüm 3](/latex/tr/daha-fazla-konu/21-how-tex-macros-actually-work-part-3.md) [Bölüm 4](/latex/tr/daha-fazla-konu/22-how-tex-macros-actually-work-part-4.md) [Bölüm 5](/latex/tr/daha-fazla-konu/23-how-tex-macros-actually-work-part-5.md) [Bölüm 6](/latex/tr/daha-fazla-konu/24-how-tex-macros-actually-work-part-6.md)

## Giriş ve genel bakış: Şimdiye kadarki hikâye

Bu serinin önceki 5 bölümünde şunları gördük:

* TeX'in bir girdi dosyasındaki karakterleri nasıl okuduğunu ve farklı karakter “sınıflarını” tanımak, ardından bunları karakter belirteçlerine ve komut belirteçlerine dönüştürmek için kategori kodlarını nasıl kullandığını;
* bir makronun gerçekte dört bölümden oluştuğunu:

```
<TeX macro primitive><macro name><parameter text>{<replacement text>}
```

burada:

* `<TeX macro primitive>` = şunlardan biri `\def`, `\edef`, `\gdef` ya da `\xdef`;
* `<makro adı>`=makronuzun adı; örneğin `\\foo`;
* `<parametre metni>` “null” (mevcut değil) olabilir ya da sınırlayıcı belirteçler ve makro parametresi belirteçlerinden oluşan bir dize olabilir;
* `<yerine geçecek metin>` makronuzun asıl gövdesidir: makroyu çağırdığınızda “yürütülen” (genişletilen) bölüm.
* nasıl `<parametre metni>` bölümünün geniş bir belirteç yelpazesi içerebildiğini ve TeX'in bu bölümü bir makro çağrısını özgün tanımıyla eşleştirmek ve makroyla kullanılan bağımsız değişkenleri belirlemek için bir “belirteç şablonu” olarak kullandığını—ve TeX'in makro kullanımınızın özgün tanımıyla eşleşmesini nasıl beklediğini;
* TeX içinde bir makro tanımının, şunları temsil eden kesintisiz bir belirteç dizisi olarak saklandığını `<parametre metni>` ve `<yerine geçecek metin>` bölümlerini.

Bir makro komutu kullandığınızda TeX, önce herhangi bir parametre alıp almadığını denetler. Alıyorsa TeX'in asıl *bağımsız değişkenleri* makro çağrınızda kullanılanları belirlemesi gerekir. TeX, makro çağrınızı bellekte sakladığı “belirteç şablonu” tanımıyla karşılaştırmalıdır. Özellikle TeX, makronuzun `<parametre metni>` bölümünün dahili (saklanmış) tanımını, şunları ayırt edebileceği şablon olarak kullanır *tokenlar* asıl bağımsız değişkenler olanların hangileri olduğunu ve hangilerinin *tokenlar* yalnızca sınırlayıcı görevi görmek için bulunduğunu.

## Makro genişletmenin anlamı

Artık, nihayet, en önemli konuya geçmeye hazırız: TeX'in makro bağımsız değişkenlerini nasıl işlediği ve makroyu gerçekten nasıl yürüttüğü; TeX'in şu şekilde adlandırdığı bir süreç: *makro genişletme*.

### Ama önce kısa bir örnek: garip bir şey mi?

TeX'in makroları ve bağımsız değişkenlerini işlediği mekanizmayı açıklamak için “sahneyi kurmak” üzere, ele almamız gereken sorunları göstermek için kısa bir örnek kullanacağız.

#### Bağımsız değişkenler önce belirteçlere dönüştürülür

Aşağıdaki örnek, kitabın 114–5. sayfalarında ele alınan bir örneğe dayanmaktadır: [The Advanced TeXbook](https://www.amazon.co.uk/Advanced-Texbook-David-Salomon/dp/0387945563) David Salomon tarafından yazılmıştır. Çok kısa bir TeX makrosu içinde temel fikirleri güzel biçimde özetlediği için seçilmiştir.

Normal TeX/LaTeX işlemleri sırasında, `$` işaretinin kategori kodu 3'tür (“matematik geçişi”); bu, TeX'i satır içi matematik kipine/kipinden geçirir (`$...$`) veya görüntü matematiği kipine/kipinden geçirir (`$$...$$`)—elbette LaTeX `\(..\)` ve `\[..\]` aynı amaçlar için kullanır.

Bir işaretin kategori kodunu değiştiren bir makro istediğimizi varsayalım `$` işaretini, örneğin 11'e değiştirerek normal herhangi bir karakter gibi dizgileyebilmek istiyoruz. TeX'in ilkel komutunu kullanabiliriz `\catcode` ve böyle bir makroya yönelik ilk denememiz, `\docat`, şu olabilir:

```
\def\docat #1{\catcode`\$=11 #1}
```

Ancak bunu şöyle kullanmayı denediğimizde

```
\begin{document}
\def\docat #1{\catcode`\$=11 #1}
I paid \docat{$90} for that book.
\end{document}
```

TeX'in şunu dizgilemesini bekleriz: `I paid $90 for that book.` ancak şu hata mesajıyla başarısız olur:

```
! Missing $ inserted.
<inserted text>
                $
<yeniden okunacak>
                   \par
l.7
```

Hatadan, `$` makromuzun bağımsız değişkeninde kullanılanın hâlâ TeX'i matematik dizgilemeye tetiklediği anlaşılıyor; açıkça TeX *değiştirmedi* kategori kodunu `$` makromuzun bağımsız değişkeninde kullanılanın (`$90`). Soru şu: *neden* TeX neden kategori kodunu değiştirmedi `$` 11'e ve onu normal bir karakter olarak dizgilemedi? Kısa cevap, TeX'in makro bağımsız değişkenlerini önce belirteçlere dönüştürmesidir **önce** onları belirteç listesine aktarmadan önce `<yerine geçecek metin>`—ama temel mekanizmalara çok daha ayrıntılı bakacağız.

Hatırlamamız gereken şey, TeX'in metin/karakter kullanmasına ilişkin anlayışımızın yalnızca TeX'in okumakta olduğu dosyanın içeriği için geçerli olduğudur: TeX herhangi bir karakteri okur okumaz, şu dünyanın içine gireriz: *tokenlar*. TeX makro çağrıları şunlarla çalışır: *tokenlar*, gerçek *yazılı/metinsel gösterimle* TeX/LaTeX komutlarının—örneği inceledikçe bu daha açık hâle gelecektir.

Başlangıçta, şunu kullanımımızın `\docat` makrosunun `I paid \docat{$90} for that book.` eşdeğer TeX (veya LaTeX) kodunu doğrudan yazmakla aynı olduğunu düşünebiliriz—örneğin aşağıdaki kod, *yapar* çalışır:

```
\begin{document}
I paid \catcode`\$=11 $90 for that book.
\end{document}
```

![Overleaf üzerinde çalışan bazı TeX kodları](/files/f0d276974566f83bbcdcd54cefa1c70db918056f)

Ancak yukarıda gördüğümüz gibi, TeX'in makro bağımsız değişkenlerini işleme biçimi, TeX kodunu yazmaktan oldukça farklı bir sonuç (`! Missing $ inserted.`) üretir: şimdi *neden* bunun nasıl gerçekleştiğini inceleyeceğiz.

### Belirteç listeleri olarak makrolar ve bağımsız değişkenler

Şunun davranışını tam olarak anlamak için `\docat` makrosunun ve bağımsız değişkeninin (`$90`), ayrıca neden başarısız olduğunu anlamak için, yine `\docat` makrosunun tanımını ve kullanılan tüm bağımsız değişkenleri (\docat çağrıldığında) *belirteç listeleri*olarak, karakter dizisi olarak değil, görselleştirmemiz gerekir.

TeX girdi metninizi tararken, şunu tanıyacaktır: `\docat` bir makro komutu olarak; ardından herhangi bir parametre alıp almadığını denetler—TeX'in bunu nasıl yaptığı, ayrıntılarla ilgilenen okurlar için sonraki bölümde açıklanmıştır.

#### Ayrıntıları sevenler için...

Makro çağrıldıktan sonra TeX, makronun saklanmış tanım belirteç listesinde yer alan ilk belirtecin **eşleşme sonu** belirteci olup olmadığını denetler: öyleyse TeX, makronun herhangi bir parametre almadığından emin olabilir.

**Bir örnek**

Aşağıdaki düğüm-listesi diyagramları, iki makronun belirteç listelerini karşılaştırır:

* `\def\foo A#1B{#1}`: bunun `<parametre metni>` için bir belirteç değeri oluşturur `A#1B`bölümü vardır, dolayısıyla **eşleşme sonu** belirteci **yapmaz** ilk belirteçtir; bu nedenle TeX parametre aramaya devam eder;
* `\def\foo{X}`: bunun bir `<parametre metni>` bölümü yoktur, dolayısıyla **eşleşme sonu** belirteci belirteç listesindeki ilk belirteçtir ve TeX herhangi bir parametre aramaması gerektiğini bilir.

![TeX'in bir makronun parametre alıp almadığını denetlemesi](/files/28c454c17570314b5f55983d02ad43afccf0456b)

## “Büyük Final”e doğru: genişletme

Soruyu kendimize yeniden hatırlatalım: aşağıdaki makro neden çalışmadı; yani TeX neden herhangi bir `$` işaretinin `\docat` makrosunun bağımsız değişkeninde kullanılan kategori kodunu değiştirmiyor; örneğin `\docat{$90}`?

```
\begin{document}
\def\docat #1{\catcode`\$=11 #1}
I paid \docat{$90} for that book.
\end{document}
```

Yukarıda açıklandığı gibi, TeX girdinizi tarayıp bir makro komutunu tanıdığında—TeX'in onu yürüteceği sırada—önce o makronun herhangi bir parametre alıp almadığını denetler. Alıyorsa TeX'in asıl *bağımsız değişkenleri* kullanıcının bu belirli makro çağrısı için sağladığı bağımsız değişkenleri belirlemek üzere girdi dosyasını daha fazla taraması gerekir: TeX bunu **önce** asıl makro kodunu çağırabilmeden önce yapmalıdır. Açıkça, TeX'in kullanıcının makroya sağlamak istediği veriyi belirlemesi gerekir.

Girdide bulunan bağımsız değişkenleri (kullanıcının makro çağrısını) belirlemek için TeX, o makronun dahili olarak saklanan tanımından yararlanacaktır: özellikle, `<parametre metni>` saklanan makro tanımının (belirteç listesinin) bölümü—bir tür “belirteç şablonu” sağlar. TeX, bu “belirteç şablonunu” kullanarak hangilerinin *tokenlar* kullanıcının makro çağrısında yalnızca *ayırıcılar* (temelde “noktalama işaretleri”) olduğunu ve hangilerinin *tokenlar* bir *bağımsız değişkenin*parçasını oluşturduğunu belirlemelidir. TeX, saklanan makro tanımında bir **eşleşme parametresi** belirteciyle karşılaştığında `<parametre metni>` bölümünde (“belirteç şablonunda”), bir *belirteç listesi* oluşturmaya başlaması gerektiğini bilir.

TeX, kullanıcının bağımsız değişkenini belirleme gereğini tanır tanımaz, belirteçler üretmek için girdiyi tarar ve bunları belirteç belirteç saklanan makro tanımına karşı çok dikkatlice denetler. TeX, bir bağımsız değişken için belirteç toplamayı, gerçekten sınırlayıcı olan bir belirteç algılayana ya da **eşleşme sonu** belirtecini algılayana kadar sürdürür: her iki durumda da TeX, o bağımsız değişkenin parçasını oluşturan belirteçleri aramayı bırakma zamanının geldiğini bilir.

### \docat makrosu neden başarısız oldu

Belirtildiği gibi, *önce* TeX bir makroyu gerçekten çağırabilmek için, o makroyla kullanılacak tüm bağımsız değişkenleri belirleyip hazırlamalıdır. Ancak bağımsız değişkenleri makroya aktarılmaya hazır hâlde belirlemek için TeX'in her bağımsız değişkeni bir *belirteç listesi*olarak üretmesi gerekir: ve bu, `\docat`başarısızlığının nedenidir.

Örneğimizde, `\docat` makrosuna şu bağımsız değişkeni verdik: `$90` ancak bu bağımsız değişken önce *bir belirteç listesine dönüştürülür* TeX makro çağrısını tararken—bağımsız değişken belirteçlere dönüştürülür *önce* makro gerçekten çağrılmadan önce. Burada, bağımsız değişken için `$90`, TeX üç karakter belirteci üretecektir: her biri için bir belirteç `$`, `9` ve `0`.

Aşağıdaki grafik, bağımsız değişken için üretilen belirteç listesini gösterir `$90`, makronun gövdesine aktarılmadan önce `\docat` makro:

![Bir makro bağımsız değişkeni için oluşturulan TeX belirteç listesi](/files/4cf480acd091785a3029d8312e3c6c3aa8dae3b8)

Yukarıdaki grafikte, bağımsız değişken belirteç listesinin şunu içerdiğini açıkça görebiliriz: `$` kategori kodu 3'e dayalı bir karakter belirteci olarak.

1 ila 3. Bölümlerde gördüğümüz gibi, karakter belirteçleri kategori kodu değerleri kullanılarak oluşturulur *karakterin okunduğu anda geçerli olan*—yani bağımsız değişkenin belirteç listesi oluşturulduğu (belirteçlere dönüştürüldüğü) anda. Bağımsız değişkenler belirteçleştirilirken, `\docat` makrosu henüz yürütülmemiştir; dolayısıyla makro çağrısına koyduğumuz kategori kodu değişikliği (``\catcode`\$=11``) *sonlanmıyor;* bağımsız değişkenin belirteçlerini üretmek için kullanılan kategori kodlarını etkilemez.

TeX, şunun bağımsız değişkenini temsil eden bir belirteç listesi oluşturduğunda `$90`, bu üç karakter belirteci asıl makroya aktarılır `<yerine geçecek metin>`. Ancak bu, şunun `$` şu şekilde aktarılmasına yol açar: *karakter belirteci* kategori kodu 3 kullanılarak oluşturulmuş: “matematik açık”; bir karakter belirteci oluşturulduğunda, ekli kategori kodunun kalıcı olduğunu gördük.  `$` şudur *yapmaz* makroya aktarılan *bir karakter olarak değil,*&#x62;ir *karakter belirteci* olarak aktarılır ve şu temele dayanır: `$` kategori kodunun 3 olması.

### \docat'ı çalıştırma: makro genişletme

TeX, bir makroyu “yürütme” sürecine şu adı verir: *makro genişletme*; bu yazarın görüşüne göre biraz kafa karıştırıcı bir terimdir, ancak kabul edilmiş terminoloji budur; bu yüzden kullanmaya devam edeceğiz.

#### Makro genişletmenin gerçek anlamı

TeX, `\docat` komutunu kullanıcının girdisinde algıladıktan sonra bağımsız değişkenleri tarar ve bağımsız değişkenleri için bir belirteç listesi üretir (`$90`). Makroyu yürütmek (genişletmek) için TeX bakışını kullanıcının girdi dosyasından çevirir ve içerdiği belirteçleri okumaya başlar `\docat`’nin `<yerine geçecek metin>` TeX'in belleğinde saklanan belirteç listesinde.

TeX şunu işlerken `\docat`tanımını, daha sonra makroyu tanımlamak için başlangıçta kullanılan belirteç dizisini görecek ve yürütecektir (`**catcode**`, ``**`**``, `**\$**`, `**=**`, `**1**`, `**1**`, `**#1**`).

Aşağıdaki grafik, şunun genişletilme sürecini gösterir: `\docat` makrosu: TeX girdi dosyasından belirteç almayı bırakır ve belirteçleri şuradan okumaya başlar: `<yerine geçecek metin>` bölümü `\docat` bellekte saklanan makro tanımının. TeX, bir **çıktı parametresi** belirteci görene kadar bu önceden hazırlanmış belirteçleri yürütür; bu belirteç TeX'e bu noktada bağımsız değişken belirteçlerini okumasını (“enjekte etmesini”) ve “yürütmesini” söyler. Örneğimizde bu, şunları temsil eden üç karakter belirtecidir: `$90` ve bu, önceden hazırlanmış karakter belirteci için `$` kategori kodu 3 olduğundan bir hatayla sonuçlanır. Karakterlerle değil karakter belirteçleriyle uğraştığımız için, `$` önceki kategori kodu değişikliğinden etkilenmez; bu değişiklik, şuradaki belirteçlerden kaynaklanmıştır: ``\catcode`\$=11``.

![\docat makrosunun genişletilme sürecini gösterme](/files/1ca1523bca927cc007051aaf544aa1a18d55d22d)

TeX, şunları temsil eden belirteçleri işledikten sonra ``\catcode`\$=11``, şu kategori kodu değişikliği: `$` artık yürürlükte olacaktır. TeX daha sonra şu adlı “özel belirteçle” karşılaşır: **çıktı parametresi** bu, TeX'e şunu yapmasını söyler: **ekler** bağımsız değişkenin belirteç listesi. Ancak bu belirteç listesi üç karakter *tokenlar*belirtecinden oluşur; bunların ilki bir `$` için kategori kodu 3 (“matematik açık”) atanmış bir belirteçtir: makro içindeki önceki kategori kodu değişikliği bu karakter belirtecini etkileyemez; dolayısıyla TeX bu belirteci matematik işlemesini başlatma sinyali olarak ele alır ve bu da makronun başarısız olmasına neden olur.

### \docat makrosu düzeltilebilir mi?

Yukarıdaki tartışmalardan, makro bağımsız değişkenlerinde görünen tüm karakterlerin, belirteçleştirmenin gerçekleştiği anda yürürlükte olan kategori kodları kullanılarak belirteçleştirildiği açıktır—bu, örneğimizde *her zaman* şundan önce `<yerine geçecek metin>` olan `\docat` makrosu gerçekten yürütülür. Peki bir makronun bağımsız değişkenlerinin kategori kodlarının değiştirilmesini nasıl sağlayabiliriz?

Bunun bir yolu şunu değiştirmektir: `\docat` yalnızca kategori kodu değişikliğini yapan parametresiz bir makro hâline getirmek—belirteçleştirilecek hiçbir bağımsız değişkeni olmaz. Daha sonra tek bir parametre alan ikinci bir makro kullanırız, `\getarg`, bu makronun bağımsız değişkenini, uygun kategori kodu `$` etkinken belirteçleştirecek şekilde düzenleriz.

```
\begin{document}
\def\docat{\catcode`\$=11 \getarg} % Parametre yok, ikinci bir \getarg makrosunu çağırır
\def\getarg#1{#1} % Bağımsız değişkeni belirteçleştirilecek 1 parametre
Artık onu şöyle çalıştırabilirsiniz ve çalışacaktır:

I paid \docat{$90} for that book.
\end{document}
```

Yeni sürümümüzü kullandığımızda `\docat` (şöyle `\docat{$90}`) o *görünür* sanki `$90` hâlâ şunun için bir bağımsız değişken olarak kullanılıyormuş gibi: `\docat` makrosu. Ancak yukarıda ele alındığı gibi, TeX şunu algıladığında `\docat` girdide, herhangi bir bağımsız değişkeni olup olmadığını denetler: artık yoktur, dolayısıyla TeX onu yürütmeye (genişletmeye) devam eder. Şunun genişletilmesi: `\docat` şu belirteç dizisidir: `**catcode**`, ``**`**``, `**\$**`, `**=**`, `**1**`, `**1**`, `**boşluk**`, `**getarg**` ve bu gerçekleşir *önce* TeX, girdi dosyasında bulunan sonraki karakterleri—yani grubu—okumaya (belirteçleştirmeye) başlar `{$90}`. TeX bir makroyu genişlettiğinde, sonraki girdisini o makronun tanımının belirteç listesinde bulunan belirteçleri okuyarak aldığını hatırlayın; yani bellekte saklanan `<yerine geçecek metin>` bölümünden.

TeX, şunun genişletilmesini işleyecek ve yürütecektir: `\docat` ve *belirtecini* **`getarg`**&#x62;ir parametre alan bir komutu temsil eden belirteç olarak tanıyarak algılayacaktır. Bu noktada TeX, şunun için girdi dosyasını tarayacaktır: **`getarg`**&#x62;ağımsız değişkeni: karakterler: `{$90}`. Her zamanki gibi bunlar belirteçleştirilir, ancak TeX şunun genişletilmesini okuyup işlediği için `\docat`, karakterler `$90` şunun kategori kodu `$` 11 olarak değiştirildiğinde belirteçleştirilir. Şunun tanımı (`<yerine geçecek metin>`) `\getarg` basitçe şudur: `#1` bu, sağlanan bağımsız değişkeni dizgilemek anlamına gelir ve olan da budur; sonuç olarak bir `$` kategori kodu 11 ile üretilir ve güvenli biçimde dizgilenir.

## Sonuç notları: düğümlerde hikâye

Şunun yeniden yazılmasından kaynaklanan olaylar dizisi: `\docat` makroyu kullanmak üzere `\getarg` aşağıdaki açıklamalı düğüm-listesi diyagramında yer alır; bu diyagram, makro için genişletme sürecini gösterir `\docat`. Bu diyagramı dikkatlice incelemek isteyen okuyucular grafiği şu biçimde indirebilir: [PDF](https://assets.ctfassets.net/nrgyaltdicpt/7MOBdavza4WxAEQGISEEht/cabe5097d9063a6415bc553cd38237e6/newdocatexpansion.pdf) ya da [SVG](https://images.ctfassets.net/nrgyaltdicpt/2FIqqVRXjakdAzTpZsV0m9/10ccc1353741d42d3df18f1692d8aa84/newdocatexpansion--plain.svg) çevrimdışı kullanım için dosyası.

![Değiştirilmiş \docat makrosunun ve \getarg makrosunun genişletilme sürecini gösterme](/files/ce839623f4c27c26688d48009e29ea52b1ab22b2)

[Bölüm 1](/latex/tr/daha-fazla-konu/19-how-tex-macros-actually-work-part-1.md) [Bölüm 2](/latex/tr/daha-fazla-konu/20-how-tex-macros-actually-work-part-2.md) [Bölüm 3](/latex/tr/daha-fazla-konu/21-how-tex-macros-actually-work-part-3.md) [Bölüm 4](/latex/tr/daha-fazla-konu/22-how-tex-macros-actually-work-part-4.md) [Bölüm 5](/latex/tr/daha-fazla-konu/23-how-tex-macros-actually-work-part-5.md) [Bölüm 6](/latex/tr/daha-fazla-konu/24-how-tex-macros-actually-work-part-6.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/tr/daha-fazla-konu/24-how-tex-macros-actually-work-part-6.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.
