> 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/ar/mzyd-mn-almwdhwaat/23-how-tex-macros-actually-work-part-5.md).

# كيف تعمل وحدات TeX الماكرو فعليًا: الجزء 5

[الجزء 1](/latex/ar/mzyd-mn-almwdhwaat/19-how-tex-macros-actually-work-part-1.md) [الجزء 2](/latex/ar/mzyd-mn-almwdhwaat/20-how-tex-macros-actually-work-part-2.md) [الجزء 3](/latex/ar/mzyd-mn-almwdhwaat/21-how-tex-macros-actually-work-part-3.md) [الجزء 4](/latex/ar/mzyd-mn-almwdhwaat/22-how-tex-macros-actually-work-part-4.md) [الجزء 5](/latex/ar/mzyd-mn-almwdhwaat/23-how-tex-macros-actually-work-part-5.md) [الجزء 6](/latex/ar/mzyd-mn-almwdhwaat/24-how-tex-macros-actually-work-part-6.md)

## مقدمة ونظرة عامة

في الجزء 4 راجعنا بعض الخصائص الأساسية لِماكروات TeX استعدادًا للمقالين التاليين حيث نلقي نظرة متعمقة على الآليات الكامنة وراء ماكروات TeX: قوائم الرموز المتخصصة. في هذين المقالين الأخيرين نستخدم مخططات، تُسمّى قوائم العقد، أُعدّت من بيانات تم توليدها باستخدام نسخة معدّلة خصيصًا من برنامج TeX الأصلي لكَنوث — وقد صُمِّمت تلك التعديلات للوصول إلى هياكل بيانات TeX الداخلية التي تكون عادةً غير متاحة للمستخدم. ومن خلال «الارتباط» بروتينات المعالجة والتنفيذ الداخلية للماكرو في TeX أمكن إخراج بيانات رسومية تتيح مناقشة أكثر تفصيلًا ودقة لسلوك معالجة الماكرو في TeX. وتأمل Overleaf أن تساعد هذه المخططات القراء على فهم أفضل لكيفية عمل ماكروات TeX بالفعل.

### قراءة خلفية إضافية محتملة

كانت Overleaf قد نشرت بالفعل مقالين مرتبطين بالرموز يقدمان معلومات خلفية إضافية حول رموز TeX وقوائم رموز TeX. يرجى تخصيص بعض الوقت للاطلاع عليهما إذا كنت بحاجة إلى سد أي فجوات في فهمك ومساعدتك على الاستفادة القصوى من الجزأين 5 و6 من هذه السلسلة.

* [ما هو «رمز TeX»؟](/latex/ar/mqalat-mtamqh/53-what-is-a-tex-token.md)
* [ما هي قائمة رموز TeX؟](/latex/ar/mqalat-mtamqh/54-what-is-a-tex-token-list.md)

## الماكروات بوصفها قوائم رموز

عندما يكتشف TeX أمر إنشاء ماكرو (`\def`, `\edef`, `\gdef` أو `\xdef`) داخل تدفق الإدخال فإنه يفعّل عملية تحوّل كلا الجزأين `<نص المعامل><نص الاستبدال>` من تعريف ماكروِنا إلى قائمة رموز طويلة واحدة — ولكن من نوع محدد جدًا من قوائم الرموز.

تختلف قوائم الرموز الخاصة بالماكروات قليلًا عن غيرها من قوائم الرموز المستخدمة داخل TeX لأنها تحتوي على قيم رمزية «خاصة» لا يمكن إلا للعمليات الداخلية في TeX نفسه إنشاؤها/توليدها: وهذه الرموز الخاصة لا يمكن إنشاؤها مباشرةً بواسطة أي أوامر يمكنك تضمينها في ملف .tex الخاص بك. ينشئ TeX تلك القيم الرمزية «الخاصة» ويستخدمها للمساعدة في معالجة استدعاء الماكرو، كما سنستكشف ونشرح أدناه.

### لمحة موجزة عن كيفية تخزين قوائم الرموز: العقد

لتخزين قائمة من الرموز (قيم صحيحة) يستخدم TeX بنية بيانات تُسمّى [قائمة مرتبطة](https://en.wikipedia.org/wiki/Linked_list)، والتي تتألف في حالة TeX من قائمة من ما يُسمّى *عُقد*. يمكنك أن تفكر في العقدة على أنها حزمة صغيرة من ذاكرة الحاسوب يمكن استخدامها لتخزين مجموعة من عناصر البيانات. ولتخزين ماكرو، تُربط هذه العقد معًا مثل سلسلة، بحيث يمكن لكل عقدة (حلقة في السلسلة) أن تخزن عدة قطع من المعلومات — بما في ذلك قيمة رمز وعنوان الذاكرة للعقدة التالية في القائمة. لمزيد من المعلومات، يمكنك قراءة المقال [ما هي قائمة رموز TeX](/latex/ar/mqalat-mtamqh/54-what-is-a-tex-token-list.md) لكن المخطط التالي يلخص الخصائص الأساسية لماكرو مخزن على هيئة قائمة رموز:

![مخطط لقائمة رموز ماكرو في TeX مخزنة كقائمة عقد مرتبطة](/files/f79fd8879a2b271f2b19a405b62e9cf4934a98f4)

### تذكير: الأجزاء الأربعة لتعريف ماكرو

كما نوقش في الجزء 4، يمكن كتابة بنية أي ماكرو على النحو التالي:

```
<بدائية ماكرو TeX><اسم الماكرو><نص المعامل>{<نص الاستبدال>}
```

حيث:

* `<بدائية ماكرو TeX>` = أحد `\def`, `\edef`, `\gdef` أو `\xdef`;
* `<اسم الماكرو>`= اسم ماكروك، مثل `\foo`;
* `<نص المعامل>` يمكن أن يكون «null» (غير موجود) أو يمكن أن يكون سلسلة من رموز الفاصل ورموز معاملات الماكرو؛
* `<نص الاستبدال>` هو جسم ماكروك الفعلي: الجزء الذي يُ«نفَّذ» عند استدعاء الماكرو.

**ملاحظة**: (وكما لوحظ أيضًا في الجزء 4) نفترض طوال المناقشة أن `<اسم الماكرو>` سيتبعها حرف مسافة ذو رمز فئة 10 ليعمل كفاصل ينهي `<اسم الماكرو>`. *لم* نُظهر صراحةً ذلك حرف المسافة في نصنا/نقاشنا، لكننا نفترض أنه موجود. وبدقة، ينبغي أن نمثله شيئًا مثل هذا:

```
<بدائية ماكرو TeX><اسم الماكرو><مسافة><نص المعامل>{<نص الاستبدال>}
```

ومع ذلك، سنحذف الإدراج الصريح لحرف `<مسافة>` ونفترض ضمنيًا وجوده.

**ملاحظة**: الأحرف `{` و `}` *لا* تصبح جزءًا من قائمة رموز الماكرو: فالغرض منها ببساطة هو إخبار ماسح إدخال TeX (الذي ينشئ الرموز) بمكان `<نص الاستبدال>` يبدأ وينتهي.

عندما يعرّف TeX ماكروًا، فإن الجزأين `<نص المعامل><نص الاستبدال>` يُحوَّلان إلى قائمة رموز واحدة طويلة ومتصلة — ويعتمد العدد الإجمالي للرموز في تلك القائمة على تعقيد الماكرو. وكما رأينا، فإن الجزء له غرض محدد يتمثل في العمل كـ«قالب رمزي» أو «مخطط» يستخدمه TeX لاقتطاف الرموز التي تُشكّل المعاملات (القيم) المستخدمة مع الماكرو الفعلي: أي الرموز التي تُغذَّى إلى `<نص الاستبدال>`.

لتثبيت هذه الأفكار، لنأخذ ماكروًا مثاليًا ولكن لنبقه قصيرًا حتى لا تصبح المخططات اللاحقة مزدحمة جدًا:

```
\def\foo A#1\fake{123 #1}
```

بالنسبة لماكروِنا، `\foo`

* `<نص المعامل>` = `A#1\fake`
* `<نص الاستبدال>` = `123 #1`

على الرغم من أن هذا المثال ماكرو بسيط، فإنه يحتوي على جميع الميزات التي نحتاج إلى استكشافها.

كما ذُكر، سيحوّل TeX `<نص المعامل><نص الاستبدال>` إلى قائمة رموز طويلة واحدة يمكنك رؤيتها في المخطط أدناه. في مثالنا، الرموز المتكوّنة من `A#1\fake{123 #1}` تم تحويلها إلى تسلسل متتالٍ من الرموز مخزّن في قائمة رموز (على هيئة قائمة مرتبطة من العقد).

## رسم يوضح قائمة رموز ماكرو حقيقية

يوضح المخطط التالي كيفية تخزين الماكرو `\def\foo A#1\fake{123 #1}` يستخدم بيانات حقيقية من داخل محرك TeX. وقد أُنشئ باستخدام [نسخة مخصصة من TeX الخاص بـ Knuth](/latex/ar/mqalat-mtamqh/01-a-new-series-of-articles-tex-tokens-and-related-concepts-but-why-and-how.md#how-can-you-study-tex-tokens3f) التي عُدلت بشيفرة إضافية لاعتراض استدعاءات الماكرو، وفحص البيانات الداخلية لـ TeX وتصديرها بتنسيق مناسب للمعالجة باستخدام برنامج رسوميات مفتوح المصدر يُسمى [Graphviz](https://www.graphviz.org/).

يمكنك تنزيل الرسم التالي كملف [PDF](https://assets.ctfassets.net/nrgyaltdicpt/N6gT757eXCxRV3FtdPPga/7ce120dc05ed05962bb911ff1124734b/annotatednodelist-plain.pdf) (675 كيلوبايت) أو [SVG](https://images.ctfassets.net/nrgyaltdicpt/4PkmtHDhO8KF892ZDWuLHP/2c9c8385c6948fd122b228c5c780a3a6/annotatednodelist-plain.svg) (1.8 ميغابايت).

![مخطط لقائمة رموز TeX مشروحة](/files/ec21bf9263e6e9cfcae430949c326cdb19439f8f)

#### فهم العقد

داخل المخطط أعلاه سترى أن كل عقدة تحتوي على عنصرَي بيانات يُسمَّيان **العقدة التالية** و **العقدة الحالية**. وهذه مجرد قيم صحيحة تمثل مواقع ذاكرة داخل TeX — أي المواقع التي تُخزَّن فيها عقد أخرى. أما قيم **العقدة التالية** و **العقدة الحالية** فليست مهمة، فهي ببساطة تخزن المواقع (عناوين الذاكرة) التي تسمح بربط العقد معًا في قائمة.

![معنى العقدة التالية والعقدة الحالية](/files/b0e896e1991894b244f391e68827c05525250c76)

#### العودة إلى المثال

في مخطط العقد، قائمة الرموز المتكوّنة من `A#1\fake{123 #1}` تحتوي على عدة «رموز خاصة» قدّمناها في بداية هذا المقال. إضافةً إلى ذلك، تبدأ قائمة العقد التي تمثل ماكروَنا بـ«عقدة أولى خاصة»: وسنستكشف ما هذه وما الذي تفعله.

أول عنصر في قائمة رموز الماكرو (وبعض أنواع قوائم الرموز الأخرى) لا يخزن قيمة رمز، بل عنصر بيانات يُسمى *عداد المراجع* الذي يستخدمه TeX لتتبع استخدام الماكرو.

![عقدة عداد المراجع هي الأولى في قائمة الرموز](/files/7e80d5972f4d14458a892c7a00d69e28be79fc00)

أول رمز في `<نص المعامل>` يُخزَّن في العقدة التي تلي عداد المراجع مباشرةً: ويمكنك أن ترى أنه رمز يمثّل الحرف `مشروع` ذو رمز الفئة 11. ومن المناقشات في الجزأين 2 و3 نعلم أن رمز الحرف يُحسب باستخدام

$$\text{token value}=256\times \text{category code} + \text{character code}$$

والذي، بالنسبة لحرف `مشروع` ذو رمز الفئة 11، يساوي

$$\text{token value}=256\times 11 + 65$$

فتكون القيمة 2881، كما هو موضح في العقدة.

#### الأمر «\fake» المستخدم في \foo

ضمن تعريف الماكرو الخاص بنا `\def\foo A#1\fake{123 #1}` أحد الفواصل هو *غير معرّف* الأمر `\fake` الذي يُخزَّن داخل قائمة الرموز كجزء من `<نص المعامل>` الجزء. وكما ترى، ضمن قائمة رموز الماكرو الكلية `\fake` يوجد رمز قيمته `19491`—وهي قيمة صحيحة يحسبها TeX باستخدام الصيغة التي نوقشت في الجزء 3. عندما يحاول TeX تنفيذ `\foo` فإنه يتوقع أن يجد `\fake` قيمة الرمز في نهاية `<نص المعامل>` الجزء. وTeX *لن* يحاول تنفيذ `\fake` الأمر لأن دوره يقتصر على توفير نوع من «الترقيم» داخل `<نص المعامل>` «القالب الرمزي».

![استخدام رمز أمر كفاصل للماكرو](/files/41bfb56a5d2498c9a5231cc1a985dbb2ce7ca301)

#### الرموز الخاصة في قائمة الرموز

**رمز «نهاية المطابقة»**

عند استدعاء ماكرو، تكون أول مهمة لـTeX هي فحص الماكرو كما كتبه المستخدم ومقارنة الرموز الموجودة في `<نص المعامل>` جزء المستخدم بالرموز الموجودة داخل القالب `<نص المعامل>` المخزَّن في الذاكرة (المُنشأ عند تعريف الماكرو). وبما أن التعريف الكامل للماكرو، المكوَّن من `<نص المعامل><نص الاستبدال>` يُخزَّن كقائمة واحدة طويلة ومتتابعة من الرموز، يحتاج TeX إلى معرفة أين، داخل تلك القائمة الرمزية, `<نص المعامل>` *تتوقف* وأين `<نص الاستبدال>` *تبدأ البيئة*. **نهاية المطابقة** كآخر رمز تمامًا في مجموعة الرموز المتولدة من `<نص المعامل>`. الحزمة **نهاية المطابقة** لا يمكن توليد هذا الرمز من أوامر المستخدم، بل TeX نفسه فقط هو من يمكنه إنشاؤه، ولذلك فإن TeX سيتأكد من اكتشاف نهاية `<نص المعامل>`.

![إظهار رمز نهاية المطابقة في قائمة رموز TeX](/files/a6727ad177159bea2e61b8bf6634dcc162a9b808)

هنا نرى أن أول رمز يأتي بعد **نهاية المطابقة** هو رمز يمثل الرقم `1` ذو رمز الفئة 12. وهذا متوقع لأن `<نص الاستبدال>` لماكروِنا `\foo` هو `123 #1`—أي أنه يبدأ بالرمز الذي يمثل الرقم `1` (ذو رمز الفئة 12).

من المناقشة في الجزأين 2 و3 نعلم أن رمز الحرف يُحسب باستخدام

$$\text{token value}=256\times \text{category code} + \text{character code}$$

والذي، بالنسبة لرقم `1` ذو رمز الفئة 12، يساوي

$$\text{token value}=256\times 12 + 49$$

فتكون قيمة الرمز 3121، كما هو موضح في العقدة.

**رموز «معلمة المطابقة»**

عندما يخزّن TeX تعريف الماكرو، فإنه يحوّل أي رموز معلمة (`#1`, `#2`… `#9`) داخل `<نص المعامل>` إلى واحد يسمى **معلمة المطابقة** رمزًا. تخبر هذه الرموز TeX بأنه يحتاج إلى البدء بالبحث عن الرموز، داخل استدعاء الماكرو من المستخدم، التي تمثل معاملات الماكرو.

![إظهار رمز معلمة المطابقة في قائمة رموز TeX](/files/37b7bca2477c0a4621419bd2ac1060e52a148bf7)

### الرموز الخاصة في قائمة الرموز

#### رموز «معلمة الإخراج»

عندما يكون TeX قد عالج كل شيء وأصبح جاهزًا فعليًا لتشغيل (توسيع) الماكرو، فإن **معلمة الإخراج** الرموز تُعلِم TeX بالمواقع داخل `<نص الاستبدال>` حيث يحتاج إلى إدخال الرموز التي تمثل المعاملات التي قدّمها المستخدم عند استدعاء الماكرو. وبعبارة أخرى: «في هذا الموضع، أدرج الرموز التي تمثل معامل المستخدم n، حيث n=1...9».

ضمن `<نص الاستبدال>` الجزء من قائمة رموز تعريف الماكرو المخزنة سيكون هناك **معلمة الإخراج** رمز يقابل كل `#1`, `#2`... `#9` موجود في التعريف الأصلي.

![إظهار رمز معلمة الإخراج في قائمة رموز TeX](/files/fa238cc2fe7867d69d65b91932075cc96dc753ba)

إذا نظرنا إلى تعريفنا لـ `\foo` (`\def\foo A#1\fake{123 #1}`) نرى أن هناك معلمة ماكرو واحدة فقط (`#1`) في `<نص المعامل>` (`A#1\fake`) وبالتالي لا يظهر سوى معلمة ماكرو واحدة (`#1`) تظهر في `<نص الاستبدال>` (`123 #1`): وهذا ينتج عنه رمز واحد فقط **معلمة الإخراج** موجود في قائمة الرموز التي تمثل `<نص الاستبدال>`.

لاحظ ما يلي في قائمة العقد التي تمثل `\foo`لـ `<نص الاستبدال>`:

* الرمز مباشرةً قبل **معلمة الإخراج** يمثل حرف مسافة (رمز الفئة 10، ورمز الحرف 32) لأن هناك مسافة بين `123` وبين معلمة الماكرو (`#1`) في التعريف الأصلي لـ `\foo`;
* موقع **معلمة الإخراج** هو آخر رمز في القائمة: و **العقدة التالية** له قيمة خاصة هي «null» (أي «فارغ») تُستخدم لإنهاء القائمة: لا توجد عقد أخرى بعد **معلمة الإخراج** لأنه الرمز الأخير، مما يشير إلى نهاية `<نص الاستبدال>` وبالتالي نهاية تعريف الماكرو.

## الجزء 6

في الجزء 6 نستخدم بعض الرسوم التفصيلية لشرح واستكشاف المعنى الدقيق لتوسيع الماكرو ونتائج تقطيع TeX إلى رموز لمعلمات الماكرو قبل إدخالها في `<نص الاستبدال>`.

[الجزء 1](/latex/ar/mzyd-mn-almwdhwaat/19-how-tex-macros-actually-work-part-1.md) [الجزء 2](/latex/ar/mzyd-mn-almwdhwaat/20-how-tex-macros-actually-work-part-2.md) [الجزء 3](/latex/ar/mzyd-mn-almwdhwaat/21-how-tex-macros-actually-work-part-3.md) [الجزء 4](/latex/ar/mzyd-mn-almwdhwaat/22-how-tex-macros-actually-work-part-4.md) [الجزء 5](/latex/ar/mzyd-mn-almwdhwaat/23-how-tex-macros-actually-work-part-5.md) [الجزء 6](/latex/ar/mzyd-mn-almwdhwaat/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/ar/mzyd-mn-almwdhwaat/23-how-tex-macros-actually-work-part-5.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.
