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

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

[الجزء 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)

## مقدمة: أهداف هذه السلسلة

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

لتحقيق هدفنا نحتاج إلى البدء بمناقشة موضوعات منخفضة المستوى إلى حد كبير، وقد تبدو هذه في البداية بعيدة بعض الشيء عن مهمة تنضيد مستنداتك. ونأمل أنه بعد التعمق أكثر ستخرج بأساس يبني فهمًا أفضل سيوفر لك في النهاية الكثير من الوقت، وربما يخفف أيضًا من مستوى الإحباط.

### لغة برمجة TeX: هل تعرف هذا الشعور؟

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

## إذًا، من أين نبدأ؟ مع رموز الفئات.

تندرج محركات TeX ضمن فئة من البرامج تُسمّى [المترجمات](https://en.wikipedia.org/wiki/Compiler): برامج تُدخل ملفًا مكتوبًا بلغة *المصدر* و *تُترجم* (تُحوّله) إلى ملف خرج مكتوب بلغة *الهدف* لغة. وبشكل أكثر تحديدًا، TeX هو *مترجم مستندات*. وبالنسبة لمحركات TeX، يُكتب ملف الإدخال بلغة تنضيد TeX، ويكون الهدف ملفَ خرج مكتوبًا بلغة أخرى «مثل [DVI](https://en.wikipedia.org/wiki/Device_independent_file_format) أو PDF—مع أننا نستخدم مفهوم «اللغة» هنا بتساهل قليل.

لنلقِ نظرة أقرب على لغة «المصدر» أو «الإدخال» المستخدمة لكتابة ملف TeX الخاص بك. إن `.tex` الملف هو، في النهاية، سلسلة طويلة واحدة من الأحرف (بما في ذلك أحرف فواصل الأسطر): تتكوّن من نص مخصّص للتنضيد تتخلله `\`, `}`, `$`, `[` وكل أنواع الأحرف التي يمكن أن تظهر في نطاق يبدو شبه لانهائي من التركيبات. وأي شخص لا يستخدم TeX/LaTeX قد ينظر إلى ملف `.tex` ويُعذر إن اعتبره خليطًا مربكًا إلى حد ما من الأحرف مع بنية ملف مرئية قليلة، إن وُجدت أصلًا. وبالتأكيد تسهم حزمة ماكرو LaTeX إلى حد ما في «فرض» بعض البنية الأساسية على ملف إدخال .tex. ومع ذلك، بين `\begin{document}` و `\end{document}` الأمر متروك لمؤلف المستند فيما يوضع هناك. وإذا نظرت إلى `.tex` الملفات المكتوبة باستخدام حزمة ماكرو Plain TeX الأصلية التي وضعها كنوث، سترى أن بنية المستند تكاد تكون غائبة تمامًا.

إذًا، بوجه عام، يمكن أن يبدو ملف إدخال TeX غير منظم إلى حد كبير، وهو مزيج يبدو عشوائيًا من المحتوى المراد تنضيده تتخلله تعليمات (أوامر) توجه تنضيد ذلك المحتوى. فكيف يمكن أصلًا لـTeX أن يفهم ملف إدخال نموذجيًا `.tex` للإدخال: كيف يُرشّح هذا الخليط الوارد من الأحرف إلى تعليمات قابلة للتنفيذ لمحرك التنضيد وإلى محتوى يُراد تنضيده؟

### ترشيح الخليط: مرحبًا برموز الفئات

أي مراقب بشري لا يعرف شيئًا عن TeX قد ينظر إلى `.tex` ملف ويتعرّف على بعض الأحرف مثل `$` ويعرف أنها علامة لعملة، أو يرى `&` ويتعرف عليها على أنها علامة «&». ويستنتج ذلك المراقب *ومعناه* لكل حرف يراه—وهو معنى يستند إلى الدور الذي يؤديه ذلك الحرف في التواصل البشري. بالإضافة إلى ذلك، قد يرون أحرفًا مثل `a`, `e`, `أو` ويعرفون أنها تُصنّف كحروف علة، بينما تُصنّف أخرى مثل `b`, `c` أو `d` إلى حروف ساكنة. وبصفتنا بشرًا، لدينا نوع من جدول البحث المدمج (في ذاكرتنا) نمنح من خلاله معنى لكل حرف نراه—معنى قائم على الدور الذي يؤديه ذلك الحرف في اللغات التي نستطيع التواصل بها.

لمعالجة `.tex` ملف، يجب على برنامج TeX أيضًا أن ينظر إلى كل حرف داخل الإدخال الخاص بك، وهو بدوره يحتاج إلى إسناد *ومعناه* إلى كل حرف «يراه». لكن TeX ليس سوى آلة برمجية تتعامل مع معالجة النص—المخزن كسلسلة من الأعداد الصحيحة (رموز الأحرف) الموجودة في ملف إدخال. وبصفته آلة، يجب أن يُبرمج TeX بالبيانات ذات الصلة التي تخبره كيف يحدد معنى الحرف الذي «ينظر إليه»، ثم ما الذي يحتاج إلى فعله به. كيف يحقق TeX ذلك؟

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

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

يعرض الجدول التالي رموز الفئات الستة عشر هذه: ما الذي يرمز إليه كل منها مع أمثلة للأحرف التي تُسند عادةً إلى كل فئة.

| **رمز الفئة** | **الوصف**                                          | **لاتِخ/تيكْس القياسي**                            |
| ------------- | -------------------------------------------------- | -------------------------------------------------- |
| 0             | محرف الهروب—يخبر TeX بالبدء في البحث عن أمر        | `\`                                                |
| 1             | ابدأ مجموعة                                        | {                                                  |
| 2             | أنهِ مجموعة                                        | }                                                  |
| 3             | تحويل الرياضيات—التبديل إلى/من وضع الرياضيات       | $                                                  |
| 4             | علامة محاذاة                                       | &                                                  |
| 5             | نهاية السطر                                        | رمز ASCII 13 (`\\r`)                               |
| 6             | معامل ماكرو                                        | #                                                  |
| 7             | أسّ علوي—لصفّ الرياضيات: `$y=x^2$` $$y=x^2$$       | ˆ                                                  |
| 8             | أسّ سفلي—لصفّ الرياضيات: `$y=x_2$` $$y=x\_2$$      | \_                                                 |
| 9             | محرف مُهمل                                         | ASCII 0 `<null>`                                   |
| 10            | فاصل                                               | رمزا ASCII 32 (المسافة) و9 (محرف الجدولة)          |
| 11            | الحرف                                              | A...Z، a...z، (وآلاف محارف يونيكود)                |
| 12            | أخرى                                               | 0...9 بالإضافة إلى ,.;?" وغيرها الكثير             |
| 13            | محرف نشِط                                          | رمز فئة خاص لإنشاء وحدات ماكرو أحادية المحرف مثل ˜ |
| 14            | محرف تعليق—تجاهل كل ما يليه حتى نهاية السطر        | %                                                  |
| 15            | محرف غير صالح، لا يُسمح بظهوره في ملف الإدخال .tex | رمز ASCII 127 (`DEL`)                              |

إن استخدام رموز الفئات هو الآلية الأساسية في TeX لترشيح تدفق الأحرف الواردة، وفهم إدخالك لتحديد:

* الأحرف التي تُكوّن النص المراد تنضيده؛
* المحتوى الفاصل الذي يجب أن يُنضد على هيئة رياضيات؛
* تسلسلات الأحرف التي تمثل أسماء أوامر يجب معالجتها أو تنفيذها؛
* … والعديد من عمليات التنضيد الأخرى.

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

إذا كان اهتمامك الأساسي هو استخدام LaTeX «لإنجاز المهمة»، فالأرجح أنك لم تواجه رموز الفئات مباشرة، إلا ربما من خلال رسائل الخطأ التي قد تكون رأيتها. لكن اطمئن، فرموز الفئات مكوّن أساسي في عمليات محرك TeX: فهي تمكّن LaTeX (وحزم LaTeX) من القيام فعليًا بعمل تنضيد مستندك.

عندما يبدأ محرك TeX التشغيل («[يُقلع](https://en.wikipedia.org/wiki/Bootstrapping)») سيستخدم مجموعة افتراضية من تعيينات الأحرف إلى رموز الفئات، ولكن عبر `\catcode` الأمر، يمكن تغيير تلك القيم الافتراضية بواسطة الشيفرة الأساسية لـLaTeX (الماكروات) و/أو بواسطة حزم LaTeX التي قمت بتحميلها—بل وحتى بواسطة شيفرة TeX أو ماكرواتك الخاصة. غير أنه بمرور الوقت ومن خلال التقليد/الاستخدام، أصبحت بعض الأحرف المعيّنة إلى رموز فئات معينة مقبولة بوصفها «معايير»، والالتزام بهذه المعايير مرغوب بالتأكيد إذا أردت أن تكون مستنداتك قابلة للنقل وسهلة المشاركة مع الزملاء أو المستخدمين الآخرين. فعلى سبيل المثال، الحرف `\` يُخصَّص له رمز الفئة 0 للدلالة على بداية أمر TeX/LaTeX—انظر [الجدول أعلاه](#tbl-0).

### قراءة (مسح) الإدخال

عندما يقرأ TeX (يمسح) الحرف التالي من ملف الإدخال، فإن أول ما يفعله هو النظر إلى رمز فئته، لذا فلنلقِ نظرة أقرب على ما يحدث عندما يقرأ TeX سطرًا نموذجيًا من الإدخال.

لنفترض أن لدينا ملف .tex يحتوي على النص `Hello World \jobname` في مكان ما داخل فقرة. وإذا نظرنا داخل `.tex` الملف باستخدام [محرر سداسي عشري](https://en.wikipedia.org/wiki/Hex_editor)، نرى أن تسلسل الأحرف `Hello World \jobname` في `.tex` ملفنا ليس سوى سلسلة من الأعداد الصحيحة، أو *رموز الأحرف*، كما هو موضح في لقطة الشاشة أدناه على هيئة التسلسل السداسي العشري:

`48، 65، 6C، 6C، 6F، 20، 57، 6F، 72، 6C، 64، 20، 5C، 6A، 6F، 62، 6E، 61، 6D، 65، 20`

![رموز الأحرف السداسية العشرية في ملف TeX](/files/5b3c1801db5b364a7765a32d7fe6ccff9f243a6e)

إذا حوّلنا من السداسي العشري (الأساس 16) إلى العشري (الأساس 10)، فإن تسلسل رموز الأحرف هو:

![رموز الأحرف العشرية في ملف TeX](/files/f4ac455d9e5807f1052a646eab63ea694a95f780)

ونحن نعلم أيضًا أنه بالنسبة إلى TeX، لكل حرف رمز فئة مقابل؛ لذا، بناءً على [الجدول أعلاه](#tbl-0) , نعلم أن تعيينات رموز الفئات الافتراضية التالية (على الأرجح) مستخدمة أيضًا:

![رموز فئات TeX](/files/02db4cd8488a6c1d92bc8a50cb76131f3dbf4b83)

وعليه، فإن كل حرف في ملف الإدخال يُمثَّل بالنسبة إلى TeX بواسطة *عنصرين* قيم رقمية—رمز حرفه ورمز فئته:

![رموز الأحرف ورموز فئات TeX المقابلة](/files/0a552e6517e100e67a60e15bd8a0fee499ddf132)

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

## الجزء 2

في الجزء 2 سنلقي نظرة أقرب على كيفية قراءة TeX لإدخالك: وسنتصرف كأننا «عيون» 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/19-how-tex-macros-actually-work-part-1.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.
