> 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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.md).

# كيف تعمل \expandafter: دراسة تفصيلية لأوامر \expandafter المتتالية

&#x20;[الجزء 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)&#x20;

## دراسة حالة: فهم \expandafter\expandafter\expandafter...

الماكروات المتقدمة، مثل تلك الموجودة في حزم LaTeX، غالبًا ما تستخدم على نطاق واسع عدة `\expandafter` أوامر متتالية لإجراء “تلاعب” متقن بالرموز. بالنسبة لمعظمنا، قد يكون فهم مثل هذه الماكروات صعبًا أو تبدو كتابتها مخيفة. في هذا القسم سنراجع الآلية الكامنة وراء معالجة TeX للأوامر المتتالية `\expandafter` الأوامر:

```
\expandafter\expandafter\expandafter...
```

ولمساعدتنا في الشرح سنضيف أرقامًا سفلية إلى كل `\expandafter`—للدلالة على أيٍّ منها نشير إليه:

```
        \expandafter1\expandafter2\expandafter3...
```

بالإضافة إلى ذلك، سنوسّع الترميز للرموز التي تعالجها كل `\expandafter` لاستخدام $$\mathrm{T^i\_1}$$ و $$\mathrm{T^i\_2}$$ لتمثيل الرموز $$\mathrm{T\_1}$$ و $$\mathrm{T\_2}$$ التي يقرأها `\expandafter` مع الرقم السفلي `i`: `\expandafter`<sub>i</sub> $$\mathrm{T^i\_1T^i\_2}$$. وسنفترض أيضًا أن رمزين $$\mathrm{T\_X}$$ و $$\mathrm{T\_Y}$$ يليان بعد `\expandafter<sub>3</sub>` بحيث يبدو إدخالنا هكذا: `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$.

عندما يبدأ TeX في معالجة هذا الإدخال، فبالنسبة إلى `\expandafter<sub>1</sub>` سيرى

* $$\mathrm{T^1\_1} =$$`\expandafter<sub>2</sub>` والذي يُحفظ لاستخدام لاحق *إعادة الإدراج* مرة أخرى في الإدخال
* $$\mathrm{T^1\_2} =$$`\expandafter<sub>3</sub>`، والذي يُوسَّع

إذا عدنا إلى مناقشتنا السابقة لـ [الشيفرة داخل TeX](/latex/ar/mqalat-mtamqh/20-how-does-expandafter-work-from-basic-principles-to-exploring-tex-s-source-code.md) التي تنفذ `\expandafter`، فمع توسيع `\expandafter<sub>3</sub>` نرى حدوث الاستدعاء الذاتي. ولمعالجة `\expandafter<sub>1</sub>` يكون TeX قد استدعى بالفعل دالته الداخلية `expand()`، لذا فبغرض معالجة (التوسيع) `\expandafter<sub>3</sub>` يقوم TeX بإجراء *ثاني* استدعاء لـ `expand()`—من داخل `expand()` الدالة نفسها.

بالنسبة إلى `\expandafter<sub>3</sub>` لدينا

* $$\mathrm{T^3\_1 = T\_X}$$، والذي يُحفظ لاستخدام لاحق *إعادة الإدراج* مرة أخرى في الإدخال
* $$\mathrm{T^3\_2 = T\_Y}$$، والذي سنفترض أنه قابل للتوسيع

لنفترض أيضًا أن توسيع $$\mathrm{T\_Y}$$ ينتج التسلسل التالي من الرموز: $$\mathrm{{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. وبذلك وصلنا الآن إلى نهاية عملية التوسيع التي بدأت بتسلسل الأوامر `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_{X}T\_{Y}}$$ ويشرع TeX في “فكّ” عملية الاستدعاء الذاتي التي بدأت بـ `\expandafter<sub>1</sub>`.

بعد معالجة `\expandafter<sub>3</sub>` لدى TeX، في ذاكرته، قائمة رموز تحتوي على رموز من توسيع $$\mathrm{T\_Y\text{: }{T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$. ويبدأ TeX الآن في إعادة إدراج الرموز التي حفظها أثناء معالجة `\expandafter` الأوامر:

1. يبدأ TeX بإعادة إدراج الرمز $$\mathrm{T\_X}$$ المحفوظ بواسطة `\expandafter<sub>3</sub>`. $$\mathrm{T\_X}$$ يُعاد إدراجه *قبل* توسيع $$\mathrm{T\_Y}$$، مما ينتج عنه تسلسل رموز: $$\mathrm{{{T\_X}T^1\_Y}{T^2\_Y}{T^3\_Y}}\cdots\mathrm{T^N\_Y}$$.
2. ومع ذلك، ما زلنا بحاجة إلى إكمال العملية التي بدأت بـ `\expandafter<sub>1</sub>` والذي حفظ الرمز الذي يمثل `\expandafter<sub>2</sub>`
3. التسلسل النهائي للرموز الذي يجمعه TeX، الجاهز لقراءته في المرحلة التالية من معالجة TeX هو `\expandafter<sub>2 (token)</sub>` $$\mathrm{T\_{X}T^1\_{Y}T^2\_{Y}T^3\_{Y}\cdots T^N\_Y}$$
4. أنهى TeX الآن “الجولة الأولى” من المعالجة وينتقل إلى قراءة تسلسل قوائم الرموز الذي أنشأه—ويبدأ ذلك التسلسل بـ `\expandafter<sub>2 (token)</sub>` والذي يشرع TeX في معالجته. بالنسبة إلى `\expandafter<sub>2</sub>` لدينا
   * $$\mathrm{T^2\_1} =\ \mathrm{T\_X}$$ والذي يُحفظ لاستخدام لاحق *إعادة الإدراج* مرة أخرى في الإدخال
   * $$\mathrm{T^2\_2} = \mathrm{T^1\_Y}$$ وهو أول رمز ناتج عن توسيع $$\mathrm{T\_Y}$$؛ وإذا كان قابلًا للتوسيع، فيُوسَّع
5. إذا افترضنا أن الرمز $$\mathrm{T^1\_Y}$$، وهو أول رمز من توسيع $$\mathrm{T\_Y}$$، يتوسّع إلى $$\mathrm{{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}}$$ عندئذ، بعد أن يكون TeX قد أعاد إدراج $$\mathrm{T\_X}$$، فإن تسلسل الرموز الناتج الذي سيُعاد معالجته بواسطة TeX سيكون: $$\mathrm{{T\_X}{T^A\_{Y1}}{T^B\_{Y1}}{T^C\_{Y1}}{T^2\_Y}{T^3\_Y}\cdots{T^N\_Y}}$$

   والذي يمكننا إعادة صياغته على أنه

   $$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

يوضّح المخطط التالي قوائم الرموز التي ينشئها كود TeX

```
    \expandafter1\expandafter2\expandafter3TXTY
```

![صورة تُظهر معالجة TeX لعدة أوامر \expandafter](/files/844384c8ade3423d83d8840179473859982643ec)

### من النظرية إلى التطبيق

وعلى سبيل المثال، سنعرّف الماكروات التالية لتكون بمثابة $$\mathrm{T\_X}$$ و $$\mathrm{T\_Y}$$

* $$\mathrm{T\_X}=$$`\foo` حيث نعرّف `\foo` على أنها `\def\foo#1{\textbf{#1}}`
* $$\mathrm{T\_Y}=$$`\bar` حيث نعرّف أولًا `\def\abc{Hello}`, `\def\xyz{, World!}` ثم `\def\bar{\abc\xyz}`

سنستخدم المقتطف البرمجي التالي لتوضيح تحليلنا السابق:

\expandafter\expandafter\expandafter\foo\bar

من مناقشتنا، فإن نتيجة `\expandafter<sub>1</sub>\expandafter<sub>2</sub>\expandafter<sub>3</sub>` $$\mathrm{T\_X}\mathrm{T\_Y}$$ ينتج تسلسلًا من الرموز بالشكل:

$$\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}$$

حيث يعتمد التسلسل الدقيق على طبيعة الرمز $$\mathrm{T\_Y}$$. وإذا أدخلنا أوامر المثال الخاصة بنا باستخدام $$\mathrm{T\_X}=$$`\foo` و $$\mathrm{T\_Y}=$$`\bar`، والذي يُعرَّف على أنه `\def\bar{\abc\xyz}`، نرى:

* الرمز الأول في $$\mathrm{T\_Y}$$ هو `\abc` وتوسعه هو تسلسل من رموز الأحرف: `Hello`
* الرموز المتبقية في $$\mathrm{T\_Y}$$ هو الرمز الوحيد الذي يمثل `\xyz`.

إذا أدخلنا هذه المعلومات في “تحليلنا” نحصل على

$$\begin{align\*} &\mathrm{T\_X}\text{\<expansion of the first token in }\mathrm{T\_Y}\text{>\<remaining tokens in }\mathrm{T\_Y}\text{>}\ &=\text{foo}*{\text{token}}\text{\<expansion of \abc>}*\text{token list (characters)}\text{xyx}*\text{token}\ &=\text{foo}*\text{token}\text{Hello}*\text{token list (characters)}\text{xyx}*\text{token}\\\[10pt] \end{align\*}$$

لاحظ أن الأرقام السفلية <sub>الرمز</sub> و <sub>قائمة الرموز (الأحرف)</sub> تُستخدم للتأكيد (لتذكيرنا) بأن TeX يقرأ *قيم الرموز الصحيحة*، وليس *أحرف النص*، ومن ثم لا حاجة لإظهار أي أحرف مسافة أو فواصل أخرى بعد `\foo`: فقد تمت معالجة هذه الفواصل أو التخلص منها منذ زمن؛ وهنا نحن في عالم TeX الداخلي من قوائم الرموز وقيم الرموز الصحيحة.

عندما يعالج TeX تسلسل قائمة الرموز الناتج عن `\expandafter` الأوامر فسيُنضِّد `**H**ello, World!`—فقط `H` يُنضَّد بالخط العريض. ويمكننا تحقيق النتيجة نفسها بكتابة كود TeX المكافئ `\foo Hello\xyz`. لاحظ أن تعريف `\foo` استخدم معاملًا واحدًا؛ وبالتالي، `\foo` يمتص الرمز `H` الحرفي الوحيد لحجته، تاركًا رموز الأحرف المتبقية (`ello`) دون تغيير.

**ملاحظات:**

* كتابة `\foo\bar` ينتج مخرجات مختلفة جدًا: فالرمز الخاص بـ `\bar` سيُستخدم كوسيط لـ `\foo` مما يؤدي إلى تنضيد **`Hello, World`**—يُنضَّد كل شيء بالخط العريض.
* كتابة `\expandafter\foo\bar` يتسبب في `\bar` أن يُوسَّع، مما ينتج عنه رمزان: $$\text{abc}*\text{token}\text{xyz}*\text{token}$$. ثم، بعد أن $$\text{foo}*\text{token}$$ يُعاد إدراجه بواسطة `\expandafter` يعالج TeX تسلسل الرموز $$\text{foo}*\text{token}\text{abc}*\text{token}\text{xyz}*\text{token}$$ الذي يُنضَّد فيه `**Hello**, World`—فقط **`Hello`** يُنضَّد بالخط العريض. هنا، الرمز الوحيد $$\text{abc}*\text{token}$$ يُعالج كوسيط لرمز الماكرو $$\text{foo}*\text{token}$$، تاركًا الرمز $$\text{xyz}\_\text{token}$$ دون تغيير، ويُنضَّد محتواه بالخط الحالي.

## ملاحظة حول \expandafter والماكروات ذات الوسائط

عند استخدام `\expandafter` لفرض توسيع الماكروات، من المفيد معرفة كيفية عمل توسيع الماكرو—وخاصةً الماكروات التي تأخذ وسائط. قبل أن يتمكن TeX من تشغيل ماكرو—أي قراءة ومعالجة الرموز الموجودة داخل تعريف الماكرو—يحتاج TeX إلى جعل الماكرو “جاهزًا للتشغيل” بإجراء عملية التوسيع الأولية للماكرو. إذا كان تعريف الماكرو يتضمن استخدام معلمات (`#1`, `#2`, ... `#9`), فإن جزءًا من عملية توسيع الماكرو يتطلب من TeX مسح الإدخال بحثًا عن الرموز التي تتكوّن منها الوسيط/الوسائط التي يوفرها المستخدم: فهذه الرموز الوسيطة تُمتص (تُزال) من الإدخال. أثناء توسيع الماكرو يقرأ TeX الرموز من الإدخال ويمتصها لإنشاء قوائم رموز صغيرة، قائمة واحدة لكل وسيط؛ وستُدرج هذه القوائم الرمزية لاحقًا في الموضع المناسب داخل جسم الماكرو—عندما ينفذه TeX. وتتمثل الخطوة الأخيرة في توسيع الماكرو في قيام TeX بتحديد موقع تعريف الماكرو المخزَّن في الذاكرة وترتيب أن يصبح ذلك الموقع هو المصدر الذي سيقرأ منه TeX مجموعة الرموز التالية من الإدخال. ويبدأ تنفيذ الماكرو عندما يبدأ TeX في قراءة ومعالجة تلك الرموز، مع تغذية قوائم الرموز التي أُنشئت سابقًا لتخزين الوسائط.

### تُمتص رموز الفاصل أيضًا

إذا كان تعريف الماكرو الأصلي قد استخدم أيضًا رموزًا تعمل كفواصل، فسيحتاج TeX أيضًا إلى مقارنة تعريف الماكرو الأصلي باستخدام المستخدم (استدعائه) لذلك الماكرو، بحثًا عن رموز الفاصل ومطابقتها. وبمجرد مطابقتها/تحديدها، تُهمَل رموز الفاصل لاحقًا لأن غرضها الوحيد هو العمل كـ“ترقيم”، لمساعدة TeX على استخراج وتحديد الرموز الفعلية المخصصة لتكوين كل وسيط.

&#x20;[الجزء 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/18-how-does-expandafter-work-a-detailed-study-of-consecutive-expandafter-commands.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.
