> 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/mqalat-mtamqh/22-how-does-expandafter-work-the-meaning-of-expansion.md).

# كيف تعمل \expandafter: معنى التوسيع

[الجزء 1](/latex/ar/mqalat-mtamqh/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [الجزء 2](/latex/ar/mqalat-mtamqh/22-how-does-expandafter-work-the-meaning-of-expansion.md) [الجزء 3](/latex/ar/mqalat-mtamqh/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [الجزء 4](/latex/ar/mqalat-mtamqh/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [الجزء 5](/latex/ar/mqalat-mtamqh/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [الجزء 6](/latex/ar/mqalat-mtamqh/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md)

## مقدمة إلى مفهوم «الاستبدال» في TeX

بعد أن استعرضنا [رموز TeX وقوائم الرموز](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true)، التالي في قائمة موضوعات الخلفية الخاصة بـ `\expandafter` هو مفهوم TeX لـ *الماكرو*: العملية الأساسية في TeX `\expandafter` مصمَّمة للعمل مع.

### حول تحدّي شرح الاستبدال...

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

ولشرح آلية الاستبدال في TeX سنسير خطوة بخطوة، مستعرضين مجموعة من الموضوعات ذات الصلة/الارتباط، ثم نربطها معًا لتطوير فهم لهذا العنصر الحاسم من سلوك TeX. وفي وقت لاحق من المقالة، وللقارئ الأكثر جرأة والمولع بالتفاصيل، سنلقي نظرة داخل TeX نفسه، ملخِّصين الشفرة المصدرية الأساسية التي تدير عملية الاستبدال.

### نقاط أساسية حول رموز TeX

طوال المناقشة التالية من المهم أن نتذكر أن TeX يمكنه الحصول على عنصر الإدخال التالي من مصدرين:

1. **ملفات نصية فعلية**، عبر توليد *رموز جديدة* بقراءة/مسح الأحرف والأوامر داخل تلك الملفات، أو
2. **قوائم الرموز المميزة**، عبر الحصول على الإدخال بقراءته من قائمة موجودة من *مُعدّة مسبقًا*، وهي رموز مخزنة في ذاكرة TeX.

وتذكّر أيضًا أن TeX يستخدم الرموز كطريقة ملائمة لـ«تغليف» المعلومات المتعلقة بأي عنصر (حرف أو أمر) قام بقراءته.

عندما يكون TeX بصدد توليد *رموز جديدة* فإنه، *في لحظة إنتاج الرمز*، سيكون لديه وصول فوري إلى معلومات حول العنصر الذي يحسب قيمة رمزه. فعلى سبيل المثال، عند توليد رموز أوامر جديدة، يحسب TeX أولًا قيمة تُسمّى `curcs` والتي تمكّن TeX من البحث عن معلومات حول الأمر الذي يوشك على إنتاج رمزه.

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

* لـ *رموز الأوامر* (قيمة الرمز > 4095): احسب `curcs` عبر $$\text{curcs}=\text{token value}-4095$$ واستخدم `curcs` للبحث عن معلومات حول الأمر؛
* لـ *رموز الأحرف* (قيمة الرمز < 4095): قسِّم رمز الحرف إلى الزوج المكوّن له من (رمز الحرف، رمز الفئة).

### في البداية...

لبدء استكشافنا لمفهوم الاستبدال سننظر في كيفية تصنيف محركات TeX، أو تجميعها، لمجموعة الأوامر التي يمكنها معالجتها. في الوقت الحالي، افترض أن «القابل للاستبدال» ليس سوى «خاصية» غير مُفسَّرة بعد لأمر من أوامر TeX.

### مفهوم الأوامر «القابلة للاستبدال»

تفهم جميع برامج التنضيد المبنية على TeX («محركات TeX») فئتين رئيسيتين من الأوامر:

* الأوامر المدمجة في المحرك التنفيذي نفسه: ما يُسمّى *البدائيات*;
* الأوامر التي يعرّفها المستخدم: ما يُسمّى *ماكروهات*.

كما تستخدم محركات TeX أيضًا «كونه قابلًا للاستبدال»، وهو نوع من «سلوك» الأوامر، كآلية لتصنيف جميع الأوامر إلى مجموعتين:

* أوامر قابلة للاستبدال؛
* أوامر غير قابلة للاستبدال.

لذا يمكننا اعتبار أن مجموعة جميع الأوامر (البدائيات بالإضافة إلى الماكروات) يمكن تصنيفها كما هو موضح في الرسم التالي:

![مخطط يبيّن تصنيف جميع أوامر TeX](/files/02950920d7ade30b0a8259e8a5f8c670469148aa)

مع أننا لا نعرف بعد ما الذي يعنيه الاستبدال/القابلية للاستبدال فعلًا، فمن الممكن أن نرى أن:

* جميع الماكروات تُصنَّف على أنها أوامر قابلة للاستبدال؛
* بعض الأوامر البدائية (المدمجة) تُصنَّف أيضًا على أنها قابلة للاستبدال (معظمها ليس كذلك).

**ملاحظة عن الأحرف النشطة**‏: بالإضافة إلى البدائيات والماكروات، هناك فئة ثالثة من العناصر «القابلة للاستبدال»: الأحرف النشطة — أي أحرف مُسند إليها رمز فئة 13 تُعد أيضًا «قابلة للاستبدال» لأنها تُعالَج على أنها «ماكروات مصغّرة».

#### كيف يعرف TeX ما إذا كان الأمر «قابلًا للاستبدال»؟

من خلال [مناقشتنا لرموز TeX](https://www.overleaf.com/learn/latex/Articles/\expandafter_TeX_tokens?preview=true) نعلم أن الرموز ليست أكثر من أعداد صحيحة يحسبها TeX ويستخدمها لـ«تغليف» معلومات حول عنصر إدخال: حرف أو أمر. كما لاحظنا أنه، بالنسبة لأي قيمة رمز (عدد صحيح)، يمكن لـTeX، عند الحاجة، عكس عملية الترميز لـ«فك تغليف» الرمز وكشف البيانات الخاصة بالأمر أو الحرف الذي يمثله.

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

![مخطط يبيّن كيف يغلّف TeX الرموز ويفك تغليفها](/files/ea47ab370ca163be11ef8c44460e6502a3b29778)

### أكواد الأوامر

جزء من المعلومات التي يخزنها TeX عن كل أمر (بدائي أو ماكرو) هو ما يُسمّى *كود الأمر*‏: وهو قيمة صحيحة يستخدمها TeX (داخليًا) لتصنيف الأوامر — الأوامر ذات السلوك/الوظيفة المتشابهة تشترك في كود الأمر نفسه.

**ملاحظة**‏: بالنسبة إلى حرف *غير النشطة*فردي، *رمز الفئة* فإن كود الأمر الخاص به هو

الذي أُسند إليه عند لحظة قراءته (مسحه) بواسطة TeX. ولاحظ أيضًا أنه، باستثناء الأحرف، فإن أكواد الأوامر داخلية بحتة في TeX: فهي غير متاحة عبر الماكروات أو الأوامر البدائية — ولرؤية تلك التفاصيل ستحتاج إلى قراءة الشفرة المصدرية لـTeX!

* `\hbox`, `\vbox`, `\vtop`, `\vcenter`, `\box` ‏(وغيرها) كلها تُصنَّف على أنها أوامر «صناعة الصناديق» وتشترك في كود الأمر 20؛
* `\def`, `\edef`, `\gdef`, `\xdef` كلها أوامر «تعريف ماكرو» وتشترك في كود الأمر 97؛
* تُصنَّف جميع الماكروات بأحد أكواد الأوامر 111 أو 112 أو 113 أو 114: وتُحدَّد أكواد الأوامر المختلفة بحسب استخدام `\long` أو `\outer` عند تعريف الماكرو:
* 111: كود أمر لماكرو غير طويل وغير خارجي (مثل، `\def\foo{...}`)
* 112: كود أمر لماكرو طويل وغير خارجي (مثل، `\long\def\foo{...}`)
* 113: كود أمر لماكرو غير طويل وخارجي (مثل، `\outer\def\foo{...}`)
* 114: كود أمر لماكرو طويل وخارجي (مثل، `\long\outer\def\foo{...}`)

يستخدم TeX أيضًا أكواد الأوامر لتحديد مجموعة الأوامر المصنفة على أنها «قابلة للاستبدال». وللقيام بذلك، يربط TeX الأوامر القابلة للاستبدال بقيم لأكواد أوامر تتجاوز القيمة الحدية 100 (وهي القيمة المستخدمة في TeX الأصلي لـKnuth وe-TeX وpdfTeX). وبالتالي:

* *غير قابلة للتوسيع* الأوامر (الغالبية العظمى) لها كود أمر <= 100
* *القابلة للاستبدال* الأوامر لها كود أمر > 100

لذلك، إذا بحث TeX عن تفاصيل أمر معيّن واكتشف أن كود الأمر > 100، فإنه يعرف فورًا أنه قابل للاستبدال. تُسند إلى جميع الماكروات وعدد قليل من البدائيات (الأوامر المدمجة) أكواد أوامر تشير إلى أنها قابلة للاستبدال: لكن لماذا يهتم TeX أصلًا بهذا التصنيف «القابل للاستبدال»؟ كما قد تظن، فهذا يعني ببساطة أن تلك الأوامر «خاصة» إلى حد ما؛ أي يمكن إخضاعها لعملية TeX الخاصة بـ *الماكرو*.

**ملاحظة (الأحرف)**&#x200F;: ما لم يكن الحرف قد عُرِّف على أنه نشط (رمز فئة 13)، فكل الأحرف غير قابلة للاستبدال. ويمكن التفكير في الأحرف النشطة على أنها «ماكروات مصغّرة» من حرف واحد.

## نعم، نعم، لكن ما هو الاستبدال؟؟؟

لقد لاحظنا أن قيم الرموز الأكبر من 4095 تُستخدم لتمثيل الأوامر؛ وبالتالي يمكن لـTeX، عند الحاجة، «فك تغليف» ذلك الرمز للوصول إلى معلومات حول أمر TeX الذي يمثله. ويمكن لـTeX أن يبحث عن قيمة كود الأمر ذاك ليحدد إن كان يندرج ضمن الفئة الخاصة المتمثلة في كونه قابلًا للاستبدال. لكن ماذا يفعل TeX بهذه المعلومات، وماذا يعني «كونه قابلًا للاستبدال»، أي الاستبدال، *حقًا*?

### الاستبدال: مصطلح عام لمجموعة من العمليات

في نقاط معينة أثناء معالجة TeX يحتاج إلى أن يعرف ما إذا كان الرمز يمثل أمرًا قابلًا للاستبدال:

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

في الجوهر، ينطوي الاستبدال على أن يقوم TeX *إزالة* ذلك الرمز من مدخلاته و *استبداله* به برموز تنشأ من «عملية الاستبدال» الخاصة بذلك الأمر أو بمجموعة الأوامر التي تشترك في كود الأمر نفسه.

يتطلّب الأمر بعض الممارسة والخبرة لمعرفة متى يقوم TeX باستبدال الرموز ومتى لا يقوم بذلك — فصفحة 215 من The TeXbook تسرد الحالات التي لا تُستبدل فيها الرموز القابلة للاستبدال. والحقيقة أن عملية TeX في تنفيذ الاستبدال معقدة ومليئة بالتفاصيل الدقيقة.

#### ما الأوامر القابلة للاستبدال؟

إذا نظرت إلى قائمة الأوامر البدائية (المدمجة) التي يصنّفها TeX على أنها قابلة للاستبدال (مثل الصفحات 212–215 من The TeXbook) يصبح واضحًا أن الاستبدال، في الممارسة، هو مصطلح عام إلى حد ما يستخدمه TeX لوصف سلوك مجموعة متباينة نوعًا ما من الأوامر. تختلف نتائج استبدال أمر معيّن (قابل للاستبدال) بالفعل، ويمكننا رؤية ذلك عبر سرد مجموعة من الأوامر القابلة للاستبدال — مجمّعة بحسب وظائفها. إن الدلالات الدقيقة للأوامر الفردية ليست مهمة هنا، والأهم هو النتائج العامة لأفعالها — ما الذي يحققه استبدالها فعليًا *يفعله أو يحققه*.

| **الأمر**                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | **الوصف**                                                                                                                                 | **سلوك الاستبدال**                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <ul><li>جميع الماكروات</li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                           | سلسلة مخزنة من رموز الأوامر/الأحرف                                                                                                        | <p>فعليًا، يعني استبدال الماكرو إدراج قائمة من الرموز ليقرأها TeX. ويتضمن ذلك:</p><ul><li>إنشاء قوائم رموز لأي وسائط للماكرو — وتشمل تلك العملية تحديد/استيعاب رموز الفاصل؛</li><li>استرجاع قائمة من الرموز المخزنة (تعريف الماكرو) والاستعداد لإدراج رموز المعاملات التي جرى إنشاؤها في الخطوة الأولى داخل تعريف الماكرو.</li></ul><p>فعليًا، استبدال الماكرو <em>يزيل رمز الماكرو</em> يُزال من الإدخال و <em>ويستبدله</em> بالرموز الموجودة في التعريف.</p> |
| <ul><li><code>\expandafter</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                | تغيير ترتيب الاستبدال                                                                                                                     | ترشيح/خلط الرموز                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| <ul><li><code>\noexpand</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                   | منع الاستبدال (نعم، بشكل مفاجئ يُصنَّف كأمر قابل للاستبدال)                                                                               | تأخير الاستبدال (نوع من ترشيح الرموز)                                                                                                                                                                                                                                                                                                                                                                                                                          |
| <ul><li><code>\input</code>, <code>\endinput</code>, <code>\scantokens</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | مرتبط بإدخال مصدر جديد من الرموز عبر ملفات المصدر — نعم، `\scantokens` ضمن هذه الفئة بسبب استخدامه لما يُسمّى «الملفات الزائفة»           | العمل كمصدر لرموز جديدة                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| <ul><li><code>\if</code>, <code>\ifcat</code>, <code>\ifnum</code>, <code>\ifdim</code>, <code>\ifodd</code>, <code>\ifvmode</code>, <code>\ifhmode</code>, <code>\ifmmode</code>, <code>\ifinner</code>, <code>\ifvoid</code>, <code>\ifhbox</code>, <code>\ifvbox</code>, <code>\ifx</code>, <code>\ifeof</code>, <code>\iftrue</code>, <code>\iffalse</code>, <code>\ifcase</code>, <code>\ifdefined</code>, <code>\ifcsname</code>, <code>\iffontchar</code></li></ul> | بدء تعبير شرطي                                                                                                                            | بدء «ترشيح» الرموز: تحديد أيٍّ من الرموز التالية يجب معالجته.                                                                                                                                                                                                                                                                                                                                                                                                  |
| <ul><li><code>\fi</code>, <code>\or</code>, <code>\else</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                   | إنهاء تعبير شرطي                                                                                                                          | إيقاف «ترشيح» الرموز: تحديد الرموز التي يجب معالجتها                                                                                                                                                                                                                                                                                                                                                                                                           |
| <ul><li><code>\csname</code>… <code>\endcsname</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                            | بناء/توليد رمز أمر                                                                                                                        | تحويل سلسلة من الرموز إلى رمز أمر واحد                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <ul><li><code>\number</code>, <code>\romannumeral</code>, <code>\string</code>, <code>\meaning</code>, <code>\fontname</code>, <code>\jobname</code>, <code>\eTeXrevision</code></li></ul>                                                                                                                                                                                                                                                                                 | تحويل شيء ما إلى سلسلة من الرموز                                                                                                          | توليد بعض الرموز (التي تمثل كمية أو قيمة داخلية)                                                                                                                                                                                                                                                                                                                                                                                                               |
| <ul><li><code>\the</code>, <code>\unexpanded</code>, <code>\detokenize</code></li></ul>                                                                                                                                                                                                                                                                                                                                                                                    | `\the` له استخدامات متعددة، منها إدراج الرموز؛ `\detokenize` يحوّل قائمة رموز إلى قائمة من رموز الأحرف؛ `\unexpanded` يمنع استبدال الرموز | إدراج/توليد بعض الرموز أو التحكم في الاستبدال                                                                                                                                                                                                                                                                                                                                                                                                                  |
| <ul><li><code>\topmark</code>, <code>\firstmark</code>, <code>\botmark</code>, <code>\splitfirstmark</code>, <code>\splitbotmark</code>, <code>\topmarks</code>, <code>\firstmarks</code>, <code>\botmarks</code>, <code>\splitfirstmarks</code>, <code>\splitbotmarks</code></li></ul>                                                                                                                                                                                    | أوامر للوصول إلى قوائم الرموز ذات الاستخدامات المتخصصة                                                                                    | الوصول إلى مصدر من الرموز المخزنة (قوائم الرموز)                                                                                                                                                                                                                                                                                                                                                                                                               |

استنادًا إلى القائمة أعلاه، هل يمكن استخراج أي «سلوكيات عامة» من هذه المجموعة من الأوامر — لتعميق فهمنا للاستبدال؟ وبدرجة تقريبية عادلة، تنحصر نتائج استبدال أمر ما في بضعة أنشطة رئيسية:

* توليد الرموز
* إدراج الرموز
* ترشيح الرموز
* تغيير/التحكم في استبدال الرمز التالي

### وأخيرًا: ما معنى الاستبدال؟

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

## الاستبدال وبنية TeX

يمكن القول إن أفضل طريقة لرؤية كيف/أين يميّز TeX بين الأوامر القابلة للاستبدال وغير القابلة للاستبدال هي النظر في الشفرة المصدرية لـTeX.

داخليًا، TeX قطعة شديدة التعقيد من البرمجيات؛ وبالتالي فمن غير العملي محاولة وصف كامل للعديد من السلوكيات الدقيقة الكامنة في تشغيل TeX. وكما ذُكر، فإن متى أو أين ينفذ TeX فعليًا الاستبدال أثناء قراءته للرموز هو أمر «معقد بعض الشيء»؛ لذلك يفترض النقاش التالي أن TeX في حالة تتطلب حدوث الاستبدال. وتشمل الحالات التي يقرأ/ينشئ فيها TeX رموزًا ولكن دون تنفيذ الاستبدال، إنشاء/تخزين الرموز لـ `\def` أمر تعريف الماكرو أو تخزين الرموز في `\toks` مسجل.

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

![](/files/008ef556d66ec7d0e3d8f70d4768947200d4618c)

### شرح مخطط بنية TeX

على نحو عام، تُدار معالجة TeX بواسطة دالة تُسمّى `maincontrol()` والتي يشير إليها كنوت في الشفرة المصدرية لـTeX على أنها «الرئيس التنفيذي» ويصفها على النحو التالي:

> «نصل الآن إلى `maincontrol` الإجراء، الذي يحتوي على المفتاح الرئيسي الذي يجعل جميع أجزاء TeX المختلفة تقوم بأعمالها، بالترتيب الصحيح… هذا هو الذروة الكبرى للبرنامج… نحن الآن في مركز الشبكة، والجهاز العصبي المركزي الذي يلمس معظم الأجزاء الأخرى ويربطها معًا.»

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

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

### فهم maincontrol()

ال `maincontrol()` تحتوي الدالة على ما يُسمّى كبيرًا [عبارة switch](https://en.wikipedia.org/wiki/Switch_statement)— ويسميها كنوت «المفتاح الكبير» — والتي يستخدمها TeX لتنفيذ جميع *غير قابلة للتوسيع* الأوامر البدائية: تلك التي لها كود أمر <=100.

ولتنفيذ أمر معيّن (أو حرف) تستخدم عبارة «المفتاح الكبير» هذه مزيجًا من نمط TeX الحالي:

* النمط الرأسي الداخلي/الخارجي، أو
* النمط الأفقي المقيّد/أفقي الفقرة، أو
* نمط الرياضيات داخل السطر/العرض

*مع* قيمة كود الأمر لكل بدائية أو حرف — فكود الأمر الخاص بـ *غير النشطة* حرف *رمز الفئة* هو

|                           |                                 |                |
| ------------------------- | ------------------------------- | -------------- |
| **النمط**                 | **المعنى**                      | **قيمة النمط** |
| رأسي خارجي                | بين الفقرات (بناء الصفحات)      | 1              |
| رأسي داخلي                | مباشرة داخل `\vbox{...}`        | -1             |
| أفقي                      | أثناء تنضيد/بناء الفقرات        | 102            |
| أفقي مقيّد                | مباشرة داخل `\hbox{...}`        | -102           |
| رياضيات عرضية             | تنضيد *العرضية* المعادلات/الصيغ | 203            |
| رياضيات داخل السطر (صيغة) | تنضيد *السطرية* المعادلات/الصيغ | -203           |

لاحظ استخدام القيم السالبة لمتمّم الأنماط المختلفة، مثل الداخلي مقابل الرأسي الخارجي. عند معالجة الأوامر في `maincontrol()`، يستخدم TeX القيمة المطلقة للنمط الحالي — أي يتجاهل الإشارة السالبة. فعلى سبيل المثال، إذا كان TeX في أي من نمطيه الأفقيين ويحتاج إلى معالجة حرف ذي رمز فئة 11، فإنه سيستخدم المجموع $$102 + 11 = 113$$ داخل «المفتاح الكبير» الخاص به للانتقال إلى الشفرة التي تعالج تلك الأحرف في أي من النمطين الأفقيين (بناء الفقرات أو داخل `\hbox`).

#### الحصول على الرمز التالي

ال `maincontrol()` تستدعي الدالة `getxtoken()` للحصول على الرمز التالي من الإدخال؛ وبدورها، `getxtoken()` تستدعي دالة الإدخال ذات المستوى الأدنى `getnext()`. بعد أن `getnext()` تنهي عملها، وتضبط قيمة *المتغيرات العالمية*, `getxtoken()` تختبر ما إذا كان العنصر الذي جرى قراءته للتو يمثل ماكروًا أو بدائية قابلة للاستبدال.

بعض الملاحظات حول `getnext()` و `getxtoken()`:

* **`getnext()`**&#x200F;: هذه هي دالة الإدخال الأساسية في TeX. فهي تقرأ وتعالج الأحرف الداخلة من ملف فعلي أو تقرأ رموزًا من قائمة رموز. لاحظ أن `getnext()` لا تحسب فعليًا قيم الرموز، لكنها تضبط عددًا من *العالمية* المتغيرات (مثل كود الأمر و `curcs`) التي تُستخدم لاحقًا في المعالجة.
* **`getxtoken()`**&#x200F;: «الحصول على الرمز الموسّع» يستخدم `getnext()` لقراءة عنصر الإدخال التالي. ثم يختبر كود الأمر للعنصر المقروء للتو للتحقق مما إذا كان ذلك العنصر يمثل أمرًا قابلًا للاستبدال: فإذا كان كذلك، يُستبدل أو يُستدعى الماكرو. أما العناصر غير القابلة للاستبدال، `getxtoken()` فيحسب قيمة رمز، وتُمرَّر هذه التفاصيل إلى المرحلة التالية من المعالجة: «المفتاح الكبير» حيث تُنفَّذ البدائيات غير القابلة للاستبدال وتُنضَّد الأحرف.

في الجوهر، من خلال `getxtoken()` يُرشَّح كل عنصر قابل للاستبدال خارجًا قبل معالجته في `maincontrol()`: ونتيجة ذلك أن «المفتاح الكبير» في TeX يعالج فقط الأوامر البدائية غير القابلة للاستبدال.

ومرة أخرى نؤكد أن المخطط أعلاه تبسيطٌ لأن مناطق أخرى من معالجة TeX ستؤدي أيضًا إلى استبدال الرموز؛ على سبيل المثال:

* عندما يبحث TeX (يمسح) عن قيم عددية فإنه سيحفّز الاستبدال في سعيه إلى الأعداد الصحيحة (من خلال استدعاء `getxtoken()`) ;
* الأمر البدائي `\romannumeral` يتسبب في الاستبدال — انظر المقالة [الاستبدال باستخدام `\romannumeral`](https://www.texdev.net/2011/07/05/expansion-using-romannumeral/) للاستخدام الدقيق لهذه الحقيقة؛
* ال `\edef` أمر تعريف الماكرو («التعريف الموسّع») يفرض استبدالًا كاملًا؛
* سيستبدل TeX الرموز في نقاط معينة عند معالجة المقدمة لـ `\halign` أو `\valign` (كلا الأمرين مرتبطان بخوارزميات تنضيد الجداول في TeX).

[الجزء 1](/latex/ar/mqalat-mtamqh/19-how-does-expandafter-work-an-introduction-to-tex-tokens.md) [الجزء 2](/latex/ar/mqalat-mtamqh/22-how-does-expandafter-work-the-meaning-of-expansion.md) [الجزء 3](/latex/ar/mqalat-mtamqh/21-how-does-expandafter-work-tex-uses-temporary-token-lists.md) [الجزء 4](/latex/ar/mqalat-mtamqh/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) [الجزء 5](/latex/ar/mqalat-mtamqh/17-how-does-expandafter-work-a-detailed-macro-case-study.md) [الجزء 6](/latex/ar/mqalat-mtamqh/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://overleaf-pro.ayaka.space/latex/ar/mqalat-mtamqh/22-how-does-expandafter-work-the-meaning-of-expansion.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.
