> 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/22-how-tex-macros-actually-work-part-4.md).

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

[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ış

1–3. Bölümlerde, TeX makrolarının nasıl çalıştığını anlamaya hazırlanırken bazı düşük düzeyli arka plan ayrıntılarına derinlemesine baktık. Bu makalede, 5. ve 6. Bölümlerdeki bir başka derin incelemeye hazırlanmak için TeX makrolarının bazı temel pratik ilkelerini gözden geçirmek üzere biraz nefes alacağız. Bu makale boyunca, TeX ilkel komutunu kullanarak tanımlanmış örnek makrolar göstereceğiz `\def`: muhtemelen daha tanıdık olan LaTeX komutunu kullanmayacağız `\newcommand`. Bunun çok iyi bir nedeni var: amacımız TeX'in makro davranışının temelinde yatan ilkeleri anlamak; fakat bunu yapabilmek için çekirdek komutları kullanmamız gerekiyor *yerleşik* TeX yazılımına. LaTeX komutları, örneğin `\newcommand`, aslında makroların kendisidir: belirli programlanmış davranışlara sahip komutlar; bunlar nihayetinde daha düşük düzeyli TeX ilkel komut katmanlarından oluşturulur. TeX'in temel davranışını daha iyi anlamak için LaTeX makrolarını değil, TeX ilkellerini kullanmamız gerekir.

### Nereye gidiyoruz?

Özünde, makroları özel bir belirteç listesi biçimi olarak açıklamaya çalışıyoruz: TeX'e bir makro tanımlamasını söylediğinizde, bir dizi belirteç (bir belirteç listesi) oluşturur ve bunları, sizin tanımladığınız bir adla bağlantılı olarak belleğinde saklar. 5. ve 6. Bölümlerde makro belirteç listelerine ayrıntılı olarak bakacağız; ancak bu makaleden çıkıp bazı arka plan bilgileri okumayı tercih ederseniz bunları şurada bulabilirsiniz [TeX belirteç listesi nedir?](/latex/tr/derinlemesine-makaleler/54-what-is-a-tex-token-list.md)

Makroların belirteç listeleri ve bunların parametreleri, üzerinde ayrıntılı olarak çalışacağımız—ve bolca örnek kullanacağımız—birkaç ek ayrıntı içerir. TeX'in makro işleme davranış(lar)ını daha iyi anlamak için gerçekten hatırlanması gereken tek önemli faktör şudur: TeX, giriş işlemenin en erken aşamasında yalnızca karakterleri düşünür; o noktadan sonra her şey belirteçtir! Bu makale ve dizinin kalan makaleleri boyunca, belirteçlerin TeX makrolarında oynadığı rolü inceleyeceğiz.

## Makronun dört bölümü

### Makro parametreleri ve makro argümanları için hatırlatma

Başlamadan önce, bir makronun *parametreleri* ve bir makronun *bağımsız değişkenleri*argümanları

```
\def\foo#1#2{Bu #1, bu da #2}
```

Yapılar (belirteçler) `#1`, `#2` (şuna kadar `#9`) makronun *parametreleri*olarak adlandırılır: bunları, makroyu çağırdığınızda kullanacağınız gerçek veriler için “yer tutucular” olarak düşünebilirsiniz:

```
\foo{alpha}{beta}
```

Burada, `alpha` ve `beta` şunlardır *bağımsız değişkenleri* \foo çağrısında kullanılan argümanlardır: bir makronun argümanları, makroyu tanımladığınızda kullanılan parametre yer tutucularına (`#1`, `#2`... `#9`) makroyu tanımlarken kullanılan gerçek değerlerdir.

### Makro tanımı: 4 öğeden oluşur

Belki de bir makronun biraz resmî görünen bir tanımıyla başlayacağız; ancak bu, sonraki tartışmalar için yararlı bir çerçeve sağlar.

Her makro tanımı 4 bölümden oluşur:

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

burada:

* `<TeX macro primitive>`: bunlardan biri `\def`, `\edef`, `\gdef` ya da `\xdef`;
* `<makro adı>`: makro komutunuza verilen ad, örneğin `\\foo`;
* `<parametre metni>`: bu kısım olmayabilir; ancak varsa, bu *tokenlar* öncesinde görünen bir dizi `<yerine geçecek metin>` makro tanımının. The `<parametre metni>` makro parametreleri içerebilir (`#1`, `#2`... `#9`) ve diğer belirteç türlerini. Özünde, ve ayrıntılı olarak göreceğimiz gibi, `<parametre metni>` bir tür *belirteç şablonu* sağlar; bu da TeX'in kullanıcının makro argümanları olarak hangi belirteçleri kullanmak istediğini anlamak için kullandığı şeydir: bir makroyu çağırdığınızda TeX *bağımsız değişkenin* belirteçleri makronuzun `<yerine geçecek metin>` (bu da bir belirteç listesidir);
* `{<yerine koyma metni>}`: bu, makronuzun gerçek gövdesidir: makro işlendiğinde (genişletildiğinde) *bağımsız değişkenleri* argümanların“ enjekte edildiği” bir dizi belirteçtir. Argümanlar, özgün tanımda kullanılan makro parametrelerinin gösterdiği konumlara aktarılır.

**NOT**: Tartışma boyunca, `<makro adı>` kategori kodu 10 olan bir boşluk karakteriyle izleneceğini ve bunun sonlandırmak için bir ayıraç olarak görev yapacağını varsayıyoruz. Biz `<makro adı>`henüz *açıkça göstermedik* bu boşluk karakterini metnimizde/tartışmamızda ama orada olduğunu varsayıyoruz. Teknik olarak bunu aşağı yukarı şöyle göstermeliyiz:

```
<TeX makro ilkeli><makro adı><boşluk><parametre metni>{<yerine koyma metni>}
```

Bununla birlikte, bir `<space>` karakterini açıkça eklemeyeceğiz ve varlığını örtük olarak varsayacağız.

#### {} hakkında notlar

İki süslü parantezin kullanımını gösterdik: `{` ve `}` ki bunlar makronuzun gerçek gövdesini kuşatır (sınırlar) `<yerine geçecek metin>`. Ancak, `{` ve `}` yalnızca benimsenmiş bir gelenektir; çünkü TeX'in aslında beklediği şey makronuzun metninin `<yerine geçecek metin>` kategori kodu 1 olan bir karakterle (“Bir grubu başlat”) açılması ve kategori kodu 2 olan bir karakterle (“Bir grubu bitir”) kapanmasıdır. Geleneksel olarak bunlar `{` ve `}` sırasıyla karakterlerdir. Ancak isterseniz bunu yapmak için herhangi bir karakter çifti atayabilirsiniz. Örneğin

```
\catcode`\(=1
\catcode`\)=2
```

Şimdi makroları şöyle tanımlayabilir ve kullanabilirsiniz:

```
\def\foo #1(Merhaba, #1)
\foo(Dünya!)
```

Ve hâlâ kullanabilirsiniz `{` ve `}` çünkü onların kategori kodlarını değiştirmedik—birden çok karakter aynı kategori koduna sahip olabilir ve gerçekten de sahiptir; bu yüzden makroları normal şekilde tanımlamaya devam edebilirsiniz:

```
\def\foo #1{Merhaba, #1}
\foo{Dünya!}
```

### ve {}

Tartışmamız açısından bir makro tanımının en ilgili bileşenleri `<parametre metni>` ve `{<yerine koyma metni>}`. Bir makro tanımladığınızda `<parametre metni>` aslında makronun nasıl kullanılacağını belirleyen katı bir belirteç şablonudur. Belirtildiği gibi, `<parametre metni>` boş olabilir; örneğin, `\def\foo{Bazı metinler}` burada, komut adımız (`\\foo`) ile açılış süslü parantezi arasında hiçbir şey görünmez `{` ve bu, burada makromuzun başlangıcını işaret eder `<yerine geçecek metin>`.

**Not**: Bazı okuyucular TeX'in “hashquote” mekanizmasını (`#{`) biliyor olabilir; ancak burada buna değinmeyeceğiz.

### ve makro ayıraçları

Bu makalenin amacı makro yazımının son derece kapsamlı bir incelemesini sunmak değil; ancak bazı örneklerle birlikte kısa bir hatırlatma yapmak faydalıdır; bu da `<parametre metni>` karmaşık hale gelebilir; çünkü TeX, ... içermesine izin verir `<parametre metni>` şunları:

* **makro parametreleri**: (`#1`, `#2`,... `#9`) kullanıcının makroyu çalıştırdığında sağlayacağı değerler için “yer tutucular” olarak görev yapar—makronun *bağımsız değişkenleri*;
* **ayıraç belirteçleri**: parametre belirteçlerinin arasına/çevresine serpiştirilmiş ve makro parametreleri arasındaki sınırı belirtmek için kullanılan rastgele belirteçler. Bu ayıraçları, bir tür “noktalama işareti” oluşturarak `<parametre metni>` makroyu kullanırken izlemeniz gereken bir “belirteç şablonu” haline getiren şey olarak düşünebilirsiniz. Ayıraç belirteçleri dizilmez.

Peki bu gerçekte ne anlama geliyor—gelin bazı örneklere bakalım.  `<parametre metni>` makro adının ve sol süslü parantezin arasında yer alır `{` makro tanımının

#### Ayıraçlar: Örnek 1

Basit bir makro tanımladığımızı varsayalım `\\foo` şöyle:

```
\def\foo ABC{merhaba, orada}
```

* `<parametre metni>` = `ABC`
* Parametre belirteçleri yoktur (`#1`, `#2`,... `#9`)
* Ayıraçlar şunlardır: *üç karakter belirteci* `ABC` ancak bu örnekte bir ölçüde gereksizdir ve yalnızca örnek olarak kullanılmıştır.

Üç karakter belirteci `ABC` ayıraçlar olarak ele alınır: dizilmesi gereken bir şey değil, makro çağrıldığında mevcut olması beklenen “noktalama işareti”dir—makroyu kullandığınızda `\\foo` tanımlandığında mevcut olan aynı ayıraçları sağlamalısınız.

Şunu yazarsanız `\foo ABC` metniniz içinde bu, aşağıdakini dizdirir `merhaba, orada`—karakter belirteçleri `ABC` dizilmez; ancak TeX, bunların `\\foo`o ayıraçları (“noktalama işareti”) arar ve aşağıdaki Overleaf ekran görüntüsünde görebileceğiniz gibi onları kaldırır (içine çeker): `ABC` dizilmez:

![Bir TeX makrosunu çalıştıran Overleaf](/files/4fad341a7733770628840f121a653cb168ed4d12)

Kullanmaya çalışırsanız `\\foo` olmadan `ABC` ayıraçlar TeX şikâyet eder `\foo kullanımı tanımıyla eşleşmiyor.`:

![Overleaf'te bir TeX hatasının gösterimi](/files/d728bfcb9dadb9596baa2d4da7a395edd98e9b0c)

Yukarıdaki örnekte, ... tespit ettikten sonra `\\foo` TeX, üç karakter belirtecini görmeyi bekler `ABC` ancak görmez: bunun yerine için karakter belirtecini görür `w` ve hemen bir sorun olduğunu fark eder.

#### Ayıraçlar: Örnek 2

İlginç, hatta belki de şaşırtıcı bir gerçek şudur: ayıraçlar keyfî komut belirteçleri olabilir—hatta *henüz tanımlanmamış*. Örneğin, şunu tanımlayabiliriz `\\foo` olarak:

```
\def\foo A\bob B\anne{Merhaba \TeX{}}
```

* `<parametre metni>` = `A\bob B\anne`
* Parametre belirteçleri yoktur (`#1`, `#2`,... `#9`)
* Ayıraçlar şu belirteçlerdir `A\bob B\anne` ancak yine de bu örnekte gereksizdir ve yalnızca tartışma amacıyla kullanılmıştır. Şuna dikkat edin: `\bob` ve `\anne` bunlar, hayalî komutlardır;  *tanımlanmamış*—ve olmaları da gerekmez.

Bir makro çağırdığınızda, TeX `<parametre metni>` orada bulunan *makro çağrınızda* ve onu belirteç belirteç, “belirteç şablonu” sürümüyle karşılaştırır *bellekte saklanan*—makro tanımlanırken oluşturulan sürümle. TeX, *makro çağrınızda kullanılan* ve orada bulduğu tüm komutları basitçe sayısal belirteç değerine dönüştürür: bu komutları çalıştırmaya çalışmıyordur; dolayısıyla `\bob` ve `\anne` asla tanımlanmamış olmaları önemli değildir. TeX, bellekte saklanan belirteç şablonunu yalnızca bir kılavuz olarak kullanır; bu da ona, `<parametre metni>` makro çağrınızın hangi belirteçlerinin, ... içine verilecek gerçek argümanlar olduğunu `<yerine geçecek metin>`.

Aşağıdaki Overleaf ekran parçasında görebileceğiniz gibi, karakter belirteçlerinin hiçbiri (`Bir` ve `B`) içinde `A\bob B\anne` dizilmedi ve tanımlanmamış komutlarımız `\bob` ve `\anne` hiçbir sorun oluşturmadı. Bu belirteçlerin hepsi *içine çekildi* TeX tarafından, sizin `\\foo` kullanımınızı, ... tanımındaki (belirteç şablonundaki) `\\foo` (bellekte saklanan bir belirteç listesiyle) eşleştirirken.

![Bir TeX makrosunu çalıştıran Overleaf](/files/28c9bb7e475d89ddbb3239ee87970f737e060da8)

#### Ayıraçlar: Örnek 3

Bu örnekte olduğu gibi, çeşitli ayıraçları (karakter belirteçleri, komut belirteçleri) makro parametreleri arasına serpiştirebilirsiniz:

```
\def\foo A\bob#1B\anne#2\jane#3bye!{Merhaba \TeX{}'ten \#1=#1, \#2=#2 ve \#3=#3'e}
```

* `<parametre metni>` = `A\bob#1B\anne#2\jane#3bye!`
* 3 makro parametre belirteci vardır: `#1`, `#2`, `#3`
* Bu kez parametreler (`#1`, `#2`, `#3`) bir belirteç kombinasyonu ile sınırlandırılmıştır:

  `A\bob#1B\anne#2\jane#3bye!`

Burada, aslında TeX'e, siz `\\foo`: makro çağrınızın içinden geçecek, *belirteç belirteç*, ve şunları eşleştirmeyi (bulmayı) bekleyecektir:

* iki belirteç `Bir` ve `\bob` önce `#1`
* iki belirteç `B` ve `\anne` önce `#2`
* belirteç `\jane` parametreden önce `#3` ve *dört karakter belirteci* `b`, `y`,`e` ve `!` sonrasına `#3`.

**Unutmayın**: TeX belirteçlerle düşündüğü için `güle güle!` şudur *dört karakter belirteci*.

Bu makroyu kullanmanın iki yolu vardır—herhangi bir çok belirteçli argümanı bir grup sağlamak için süslü parantez içine koyabiliriz:

```
\foo A\bob{Bu}B\anne{Şu}\jane{Diğer}güle güle!
```

Ancak bu *gerekli değildir* çünkü makro tanımımız, bir belirteç şablonu sağlayan ayıraçlara sahiptir. TeX, bu şablonu kullanarak, her bir argüman için belirteçleri yalnızca ayıraç olan belirteçler arasından ayıklayabilir. Makromuzu şöyle kullanabiliriz:

```
\foo A\bob ThisB\anne That\jane Otherbye!
```

ve TeX, gruplar kullanmayla aynı sonucu üretmek için argümanları ayıklayabilir `{...}`:

![Ayıraçlar kullanılarak bir TeX makrosunu çalıştıran Overleaf](/files/8ca75b461d4ded9bad9572d2e895017d6b37e4eb)

TeX'in hangi belirteçlerin parametrelerle eşleştiğini tam olarak nasıl tespit edebildiğine dikkat edin `#1` ve `#3`:

![Ayıraçlar kullanılarak bir TeX makrosunu çalıştıran Overleaf](/files/341772a9a3cf74bdfa09ef6a354de101ae748b8b)

#### Ayıraçlar: Örnek 4 (mesele karakterler değil, tamamen belirteçler!)

Makrolarla çalışırken gerçekten de ... dünyasında olduğumuzu hatırlamanın önemli olduğunu göstermek için kısa bir örnek: *tokenlar* ve **yapmaz** *karakterlerini*…

A ve B'nin ayıraç olarak görev yapan karakterler olduğu ve her ikisinin de kategori kodu 11'e sahip olduğu aşağıdaki kısa makroyu tanımlayacağız. Bu, sorunsuz çalışır:

```
\documentclass{article}
\begin{document}
\def\foo A#1B{Merhaba, #1}
\foo AGrahamB
\end{document}
```

ve şunu dizdirir `Merhaba, Graham`.

Ancak, A ya da B'nin kategori kodunu 11 dışındaki bir değere değiştirirseniz makro çağrısı başarısız olur. B'nin kategori kodunu 12'ye değiştirdiğimizi varsayalım; bunun için ``\catcode`B=12`` ve makroyu yine, eskisi gibi, çağırmayı deneyelim:

```
\documentclass{article}
\begin{document}
\def\foo A#1B{Merhaba, #1}
\foo AGrahamB % Bu çalışır
\catcode`\B=12\relax
\foo AGrahamB
\end{document}
```

Biraz kafa karıştırıcı bir hatayla başarısız olur:

```
Kontrolden çıkan argüman?
GrahamB \end {document}
! Dosya, \foo kullanımını tararken sona erdi.
<inserted text>
                \par
<*> main.tex

`}` karakterini unutmuş olabileceğinizi düşünüyorum; bu da bana
durmamı istediğiniz yerin ötesini okutuyor.
Kurtarmaya çalışacağım; ama hata ciddiyse,
şimdi `E' ya da `X' yazıp dosyanızı düzeltmeniz daha iyi olur.

! Acil duruş.
<*> main.tex

*** (iş sonlandırıldı, geçerli bir \end bulunamadı)
```

![Bir TeX makro hatasını gösteren Overleaf](/files/dad406795794772c7c95f22ed9279f6cd35b0aea)

Ne yazık ki TeX'in varsayılan önerisi olan `` `}` karakterini unutmuş olabileceğinizi düşünüyorum `` şudur **yanlıştır**, bunun nedeni eksik bir süslü parantez değildir (`}`).

#### Ne oldu?

TeX, ... eşleştirmeye çalışıyor `\\foo` makro *çağrıyı* ile `\\foo` makro *tanımı* bellekte sakladığı tanımla. Bir veya daha fazla argümana ihtiyaç duyan bir makro çağırdığınızda, TeX sizin makro kullanımınızı incelemek (taramak) ve belirlemek zorundadır *bağımsız değişkenleri* bu makroya sağladığınız argümanı. Burada TeX, argümanın bir A (kategori kodu 11) ile bir B (kategori kodu 11) arasına sıkıştırılmış olmasını bekliyor. Unutmayın: TeX *tokenlar*, **yapmaz** *karakterlerini*.

A ve B için belirteç değerleri, $$\mathrm{T\_A}$$ ve $$\mathrm{T\_B}$$ sırasıyla şöyledir:

$$\mathrm{T\_A = 256 \times 11 + 65 = 2881}$$ $$\mathrm{T\_B = 256 \times 11 + 66 =2882}$$

Ancak TeX aramasına devam ederken B'yi görür *ancak* şimdi bunun kategori kodu 12'dir ve bu da farklı bir belirteç değeri sonucunu doğurur:

$$\mathrm{T'\_B= 256 \times 12 + 66 =3138}$$

İçinde `\\foo` makro tanımında, B'nin (ayıraç olarak kullanılan) belirteç değeri 2882 idi, ancak TeX şimdi 3138 değerinde bir belirteç görüyor: bunu, içinde kullanılmak üzere ayrılmış başka bir belirteç sanıyor *bağımsız değişkenin* sağlanan `\\foo`. TeX'e göre argümanın son belirteci henüz bulunmamıştır; bu yüzden kategori kodu 11 olan bir B arayışında başka bir belirteç almaya gider. Makronun başarısız olmasının nedeni ve anı budur: argümanı bulmaya çalışırken TeX “fazla ileri gider” ve argümanın parçası olmasını istemediğiniz belirteçleri okumaya başlar `\\foo` makro çağrısı için. Sonra ne olacağı, TeX'in B'den sonra keşfettiği belirteçlere bağlıdır—bunlar çeşitli `Kontrolden çıkan argüman?` hataları tetikler.

Bizim örneğimizde TeX fazla ileri gider ve şu belirteç akışını tüketir `\end {document}` ve hızla dosyanın sonuna ulaşır; dolayısıyla hata mesajı:

```
! Dosya, \foo kullanımını tararken sona erdi
```

## Bölüm 5

Yukarıda gördüğümüz gibi, makromuzun `<parametre metni>` bölümü son derece basitten, karakter belirteçleri ve ayıraç olarak görev yapan komut belirteçleriyle serpiştirilmiş karmaşık bir makro parametresi karışımına kadar uzanabilir. TeX, içinde bulunan çeşitli belirteç kombinasyonlarını işleyebilir `<parametre metni>` bir makroya sağlanan argümanları çıkarmak için—ve bir makroyu yanlış kullanmaya çalıştığımızı tespit etmek için. Bunu nasıl yaptığı, dizinin bir sonraki makalesinin konusudur.

[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/22-how-tex-macros-actually-work-part-4.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.
