> 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/23-how-does-latex-typeset-headers-and-footers.md).

# كيف ينضّد LaTeX الرؤوس والتذييلات؟

## كيف تُنسِّق LaTeX الرؤوس والتذييلات؟

### مقدمة

إذا كنت تبحث عن دليل إرشادي حول تغيير الرؤوس والتذييلات، فيرجى [زيارة صفحة المساعدة الخاصة بنا](/latex/ar/altnsyq/02-headers-and-footers.md) لأن هذه المقالة تركز على شرح الآليات منخفضة المستوى التي تستخدمها محركات TeX وLaTeX لإنتاج الرؤوس والتذييلات.

* **ملاحظة (تحديث)**: تستكشف هذه المقالة آلية العلامات الأساسية في LaTeX المستخدمة قبل يونيو 2022، وفي ذلك الوقت تم تقديم تنفيذ جديد وأكثر تنوعًا لمعالجة العلامات في LaTeX. انظر [نظرة عامة على آلية العلامات الجديدة في LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) لمزيد من التفاصيل. ولأسباب تتعلق بالتوافق مع الإصدارات السابقة، يواصل LaTeX دعم آلية العلامات القديمة. أما المواد الواردة في المقالة التي تناقش سلوك محركات TeX فلا تتأثر بهذه التغييرات في LaTeX.
* **ملاحظة**: تُستخدم المصطلحات «LaTeX» و«TeX» و«محرك TeX» في جميع هذه المناقشات، لذا من المفيد فهم معناها—انظر مقالة Overleaf [ما في الاسم: دليل إلى الأنواع العديدة من TeX](/latex/ar/mqalat-mtamqh/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) للحصول على مزيد من المعلومات.

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

سنبدأ بالمفهوم الأساسي لـ *عُقد*: اللبنات الأساسية التي تستخدمها محركات TeX للتخزين المؤقت (الداخلي) للمحتوى.

### بعض الملاحظات حول تخزين المحتوى: عقد TeX

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

![تمثيل تخطيطي لكيفية تخزين محركات TeX للمحتوى باستخدام عقد مرتبطة](/files/55195c11d45af679f94d31d9b113b6eefccb8474)

لتمثيل العناصر الأساسية للتنضيد المعتمد على TeX—مثل المحارف، والغراء، والصناديق، والعقوبات، والكرنات و [*العلامات*](#why-were-here-understanding-mark-nodes) (على سبيل المثال لا الحصر)—تستخدم محركات TeX أنواعًا مختلفة *أنواع* من العقد. فبعض العقد، مثل تلك الخاصة بالصناديق، تحتاج إلى تخزين بيانات أكثر مقارنةً بأنواع عقد أبسط مثل عقد المحارف؛ وبالتالي تكون بعض العقد أكبر من غيرها—وتتطلب بايتات أكثر لتخزينها في الذاكرة. وعند القراءة عن TeX قد تصادف مصطلحات مثل *عقد المحارف*, *عقد الغراء*, [*عقد العلامات*](#why-were-here-understanding-mark-nodes) وما إلى ذلك: وأنت الآن تعلم أن هذه مجرد أسماء تُطلق على كتل من الذاكرة المخصصة لتخزين بيانات تمثل عنصرًا من عناصر تنضيد TeX.

#### لماذا نحن هنا: فهم عقد العلامات

من بين الأنواع العديدة للعقد، النوع الذي نحتاج إلى مناقشته يُسمّى *عقدة علامة* والتي تنشئها `\mark` الأمر:

```latex
\mark{المحتوى المراد تخزينه}
```

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

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

#### يضيف ε-TeX الأمر \marks

[الإصدار 2 من ε-TeX](https://texdoc.org/serve/e-TeX/0)، وهو امتداد لـ TeX الأصلي من Knuth، نُشر عام 1998 ويوفر قدرات جديدة إلى جانب تحسينات على الميزات الموجودة. واليوم، أُدرجت معظم تحسينات ε-TeX في محركات TeX الشائعة: pdfTeX وLuaTeX وXeTeX—انظر [**`-etex`** خيار سطر الأوامر الخاص بمحركات TeX](/latex/ar/mzyd-mn-almwdhwaat/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) والذي يتيح استخدام امتدادات ε-TeX.

يوفر برنامج TeX الأصلي من Knuth الأمر \mark الذي ينشئ «فئة» أو «نوعًا» واحدًا فقط من عقدة العلامة. ويمكن أن يتضمن مستندك العديد من أوامر \mark، لكنها كلها تنشئ عقد علامات من «النوع» أو «الفئة» نفسها—ولا توجد آلية مدمجة لتجميعها أو تصنيفها. وقد أزيل هذا القيد بواسطة تحسين في ε-TeX: الأمر \marks الذي تدعمه pdfTeX وLuaTeX وXeTeX:

```latex
\marks n {المحتوى المراد تخزينه}
```

حيث `n` هو عدد صحيح (`0` <= `n` < `32768`) يحدد عقدة العلامة *الفئة*.

ملاحظات:

* كتابة `\marks 0` (أي، `n`=`0`) مرادف لاستخدام الأمر الأصلي في TeX `\mark` الأمر
* كما أدخل ε-TeX أيضًا متغيرات العلامات ([انظر لاحقًا](#pre-output-checks-looking-for-mark-nodes)) لكل فئة (`n`) من العلامات: `\firstmarks n`, `\topmarks n` و `\botmarks n`. ويمكن استخدام الفئات المختارة من متغيرات العلامات لتوفير بيانات العلامات لمهام تنضيد محددة.
* رفع LuaTeX القيمة القصوى لـ `n` إلى `65535`، مما أتاح $$2^{16}$$ فئات العلامات

### أسباب استخدام TeX للعلامات

لفهم *لماذا* (وكيف) تستخدم محركات TeX `\mark` (أو `\marks`) الأمر لإنتاج الرؤوس والتذييلات، نحتاج إلى تقدير بعض «الخصائص الغريبة» في آليات محرك TeX لبناء الصفحات—أي العثور على فواصل الصفحات وإخراج الصفحات المكتملة إلى ملف PDF. وفي الواقع، فإن عمليات بناء الصفحات تلك معقدة، لكن يمكن تبسيط المبادئ/المفاهيم الأساسية لتقديم شرح خلفي كافٍ يساعدنا على فهم العلامات.

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

إحدى السمات الرئيسية للمرحلة النهائية من تغليف الصفحة (تركيبها) هي شيء يُسمّى *روتين الإخراج* وهو في الواقع تسلسل من الأوامر يعرّفه المستخدم يُستخدم لتجميع صفحة المحتوى وجعلها جاهزة للإرسال إلى ملف PDF. ومن أمثلة نشاط «التجميع» إضافة الرؤوس والتذييلات، لكن توجد طرق عديدة لاستخدام روتينات الإخراج—على سبيل المثال، انظر [هذه المقالة في TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). تُعد روتينات الإخراج مجالًا معقدًا نسبيًا في TeX، لذلك لن ندخل في التفاصيل هنا: ولغرضنا الحالي يكفي أن تتذكر أن المرحلة النهائية من تركيب الصفحة تتضمن استخدام تسلسل من الأوامر يعرّفه المستخدم (ويُسمّى مجتمِعًا *روتين الإخراج*).

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

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

![تمثيل تخطيطي لفقرة تمتد عبر فاصل صفحة](/files/66f8c60bf2adb4f6ade715353047311e69931867)

يوضح مثال الفقرة هذا أن محرك TeX غالبًا ما يعالج (ينضّد) أجزاءً من المحتوى لا يمكنها، *بالكامل*، أن تتسع على الصفحة الحالية—لأن ذلك المحتوى يمتد beyond? Need Arabic: لأنه يصل إلى ما بعد النقطة التي يصبح عندها كسر الصفحة ضروريًا. تذكّر أن محركات TeX تعثر على فواصل الأسطر عن طريق إدخال، ثم تنضيد، *فقرات كاملة* وعلى خلاف بعض التطبيقات، لا تتبنى نهجًا سطرًا بسطر لتنضيد الفقرات. وبعبارة أخرى، ينضّد TeX *كامل* الفقرة كلها سواء أكانت تتسع على الصفحة الحالية أم لا (يُحسَم ذلك لاحقًا). وبالمناسبة، فإن مبدأ «النضد كاملًا ثم الإضافة إلى الصفحة الحالية» ينطبق أيضًا على أنواع أخرى من محتوى TeX، بما في ذلك الجداول التي تُقرأ كاملة من ملف .tex وتُضنَّد بالكامل قبل أي محاولة لإضافتها إلى الصفحة الحالية.

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

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

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

![تمثيل تخطيطي لموضع العقدة الذي يعثر عنده TeX على فاصل صفحة، مع إظهار المحتوى المحتجز للصفحة التالية](/files/2863133e46dd81d92affb0151e880499ad47b0a7)

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

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

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

#### مثال افتراضي: كيف نحصل على رؤوس خاطئة

يوضح المخطط التالي أوامر افتراضية `\myheader` و `\myfooter` المستخدمة لتخزين النص المطلوب للرؤوس والتذييلات؛ على سبيل المثال، باستخدام تعريفات أساسية مثل

```latex
\newtoks\headertoks% متغير جديد لقائمة الرموز النصية لنص الرأس
\newtoks\footertoks% متغير جديد لقائمة الرموز النصية لنص التذييل
% استخدم \global لضمان أن بيانات الرأس أو التذييل المخزنة تكون
% قابلة للوصول في كل مكان، بما في ذلك الأوامر في
% روتين الإخراج
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

حيث إن `\headertoks` و `\footertoks` هما قائمتا رموز تُستخدمان لتخزين نص الرؤوس والتذييلات.

بالإضافة إلى ذلك، يتضمن مثالنا الافتراضي أيضًا روتين إخراج يستخرج نص الرأس والتذييل من القيم الحالية لـ `\myheader` و `\myfooter`. كما هو موضح في المخطط، ضمن المحتوى المخصص للصفحة الحالية، `\myheader` و `\myfooter` تعيّن القيم المناسبة (الصحيحة). ومع ذلك، يمكن أن يكون من الممكن أن `\myheader` و/أو `\myfooter` يُستدعى داخل فقرة تمتد عبر فاصل صفحة. ولأن TeX يجب أن يعالج الفقرة كلها، `\myheader` و `\myfooter` فسيُستدعى مرة أخرى لإعادة تعيين نص الرأس/التذييل المحفوظ في «الحالة الداخلية لـTeX»، مما ينتج قيمًا غير صحيحة للصفحة الحالية. وعندما ينتج روتين الإخراج الرأس والتذييل فسيحتويان على نص مخصص للصفحة التالية.

![رسم يوضح الرؤوس والتذييلات غير الصحيحة التي تُنتج إذا استخدم روتين الإخراج ماكرو TeX فقط لاسترجاع نص الرأس والتذييل](/files/5603adb20e58420fd930105644a94f3ca8fa7aca)

#### السلوك غير المتزامن لـTeX: الأمر \mark لإنقاذ الموقف

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

في [كتاب TeX](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489)، يصف Donald Knuth، مبتكر TeX، هذا الوضع بأنه

> ... روتين إخراج TeX يتأخر عن أنشطة بناء الصفحات لديه

بسبب هذه العلاقة غير المتزامنة، تُحتاج «تسهيلات خاصة» على هيئة *آلية العلامات*، تُطبَّق عبر `\mark` (أو `\marks n`)، لضمان أن تحتوي الرؤوس والتذييلات على مواد ذات صلة بالصفحة الفعلية التي يجري إخراجها. إن `\mark` الأمر يدمج عقد العلامات داخل محتوى الصفحة، ويخزن موقع الذاكرة للمحتوى الذي يمكن استخدامه لرأس الصفحة وتذييلها.

مؤلف الكتاب المعروف والموقر [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) يصف `\mark` الآلية بأنها

> ... الآلية الرئيسية التي يستطيع من خلالها روتين الإخراج الحصول على معلومات حول محتويات الصفحة التي انقطعت حاليًا، وبخاصة أعلاها وأسفلها.

ال `\mark` آلية صُممت للتحايل على الطبيعة غير المتزامنة لخوارزمية كسر الصفحات وروتين الإخراج في TeX.

![تمثيل تخطيطي لبيانات العلامات (العقد) المدمجة في محتوى متن الصفحة](/files/97ab0a710bcc0ec0417c01d491806e4e03656bc6)

### فحوصات ما قبل الإخراج: البحث عن عقد العلامات

بعد أن يحدد محرك TeX موضع فاصل الصفحة، فإنه يستدعي روتينًا داخليًا (يُسمّى `fire_up()`) يقوم بقدر كبير من المعالجة المسبقة قبل أن يُكمل روتين الإخراج تركيب الصفحة ويكتب الصفحة النهائية إلى ملف PDF. ومن الأجزاء المهمة في تلك الخطوات المسبقة تعيين قيمة ثلاثة *متغيرات العلامات العامة*: `\botmark`, `\topmark` و `\firstmark` تُستخدم لتوفير بيانات لبناء الرؤوس والتذييلات. وبالطبع يمكن أن تحتوي الصفحة على عدة عقد علامات، لكن يجري ترشيحها لإنتاج متغيرات العلامات الثلاثة التي تعمل على النحو التالي:

* **`\botmark`** هي العلامة السارية عند فاصل الصفحة الحالي؛ أي آخر علامة شوهدت على الـ *الحالي* page
* **`\topmark`** هي قيمة `\botmark` من *السابق* page
* **`\firstmark`** هي أول علامة على الـ *الحالي* الصفحة—أول علامة بين `\topmark` و `\botmark`

يوضح المخطط التالي المبادئ الأساسية للمعالجة المسبقة لمحتوى الصفحة المنضَّدة لتحديد قيم متغيرات العلامات العامة الثلاثة `\botmark`, `\topmark` و `\firstmark`:

![تمثيل تخطيطي للمبادئ الأساسية المستخدمة لتحديد قيم متغيرات العلامات العامة الثلاثة \botmark و\topmark و\firstmark](/files/2c1b801ebfb81febf4801849a220a7274d3e9327)

يستخدم القسم التالي بعض الشروح المقدمة أعلاه لعرض كيفية تنضيد LaTeX للرؤوس والتذييلات.

### فئات LaTeX: أنماط الصفحات والرؤوس/التذييلات

عندما تكتب `\documentclass{*class*}` حيث `*class*` قد يكون `article`, `book`, `التقرير` أو `الرسائل`، يقوم LaTeX بتحميل ملف باسم `*class*.cls`؛ على سبيل المثال، `book.cls`, `article.cls` وما إلى ذلك. وتلك `.cls` الملفات تحتوي على شيفرة LaTeX لتنفيذ تنويعات خاصة بالفئة على أوامر وميزات مختلفة يُتوقع أن تكون موجودة في جميع فئات المستندات وأن توفّرها—أي السلوكيات المشتركة بين جميع فئات المستندات. وقد تشمل الأمثلة هوامش تخطيط صفحة خاصة بالفئة إلى جانب نسخ خاصة بالفئة من الأوامر، مثل `\section`, `\subsection` وما إلى ذلك.

عنصر مهم آخر في `.cls` الملفات هو التنفيذ الخاص بالفئة لأنماط الصفحات القياسية التي تحدد الرؤوس والتذييلات للمستندات المنتَجة باستخدام فئة ونمط صفحة معينين. على سبيل المثال:

* **`book.cls`** و **`article.cls`** يحتوي كلٌّ منها على تنفيذات لأنماط الصفحات `headings` و `myheadings`
* **`letter.cls`** يحتوي على تعريفات لأنماط الصفحات `headings`, `empty`, `plain` وواحد يُسمّى `firstpage`
* **`report.cls`** يحتوي على تعريفات لأنماط الصفحات `headings` و `myheadings`

غالبًا ما تعتمد تنفيذات أنماط الصفحات على `twoside` خيار `\documentclass`—أي ما إذا كان المستند أحادي الجانب أم مزدوج الجانب—بحيث تُعرّف الرؤوس والتذييلات بشكل مناسب للصفحات اليسرى (الزوجية) والصفحات اليمنى (الفردية).

قد تعتمد فئات المستندات على التعريفات الافتراضية لـ `plain` أو `empty` أنماط الصفحات المقدمة في موضع آخر ضمن LaTeX—خارج `.cls` الملف المستخدم.

#### المزيد عن أنماط الصفحات

عندما تغيّر نمط صفحة باستخدام `\pagestyle{*somestyle*}` أو `\thispagestyle{*somestyle*}` يتوقع LaTeX أن يجد أمرًا داخليًا باسم `ps@*somestyle*`—يُوفَّر عادةً بواسطة فئة المستند `.cls` أو ربما بواسطة حزمة مثل `fancyhdr`. وبالمناسبة، نعني بـ«الأمر الداخلي» أمرًا يُعد جزءًا من شيفرة LaTeX المصدرية ويحتوي اسمه على `@` الرمز @، الذي يمنع عادةً استخدامه العادي (بسبب [رمز الفئة](/latex/ar/mzyd-mn-almwdhwaat/43-table-of-tex-category-codes.md)).

تعريف `\ps@*somestyle*` مسؤول عن تنفيذ ميزات/سلوكيات ذلك النمط من الصفحات، وهذا يتضمن توفير تعريفات لـ:

* الأوامر المستخدمة خلال المراحل النهائية من تركيب الصفحة (لإضافة الرؤوس والتذييلات، انظر [لاحقًا في المقالة](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* أوامر لإدراج بيانات العلامات المتعلقة بالأقسام لاستخدامها في إنشاء رؤوس وتذييلات المستند التي تتضمن عناوين الأقسام وأرقامها وما شابه. على سبيل المثال، فإن `headings` نمط الصفحة (داخل `book.cls`) يعرّف الأوامر التالية المُنتِجة للعلامات:
  * `\chaptermark`
  * `\sectionmark`

سنقوم [باستكشاف الأوامر المُولِّدة للعلامات بشكل أوسع](#mark-commands-and-mark-data)، مثل `\chaptermark`، ولكن على سبيل المثال فقط: عندما تكتب `\chapter{chapter title}` موقع `\chaptermark` يُنفَّذ الأمر أيضًا لإدراج بيانات علامات متعلقة بالفصل من أجل الإنتاج اللاحق لرؤوس الصفحات.

#### تشريح أوامر الرأس والتذييل المعتمدة على نمط الصفحة

يستكشف هذا القسم بعض الأوامر/العمليات الأساسية في LaTeX المستخدمة لإنشاء الرؤوس والتذييلات—استنادًا إلى الشروحات أو المفاهيم المقدمة سابقًا في هذه المقالة.

**«نموذج» LaTeX للرؤوس والتذييلات**

يعتمد محتوى الرؤوس والتذييلات (الافتراضية) في LaTeX على تسلسل هرمي ذي مستويين من أقسام المستند: قسم «أعلى مستوى» يحتوي على عدة أقسام «أدنى مستوى». وبالنسبة إلى فئتي book وarticle فهذا يُترجم إلى:

* `**book**` **الفئة**: تُنتَج «الأقسام الأعلى مستوى» بواسطة `\chapter` أوامر و«الأقسام الأدنى مستوى» عبر `\section`، بما يعكس فصولًا تحتوي على العديد من الأقسام.
* `**article**` **الفئة** (على افتراض أن المستندات مزدوجة الجانب): تُنتَج «الأقسام الأعلى مستوى» باستخدام `\section` أوامر، بينما تُنتَج الأدنى مستوى عبر `\subsection`، بما يعكس وجود عدة أقسام فرعية داخل القسم نفسه.

يطبّق LaTeX «نموذجه» للرؤوس والتذييلات من خلال أوامر التقسيم التي «تُدرج» عقد العلامات (عبر `\mark` \mark `\section{*some section title*}` ستُنشأ عقدة علامة، تحتوي على بيانات تعكس `*some section title*` ورقم القسم.

يستخدم LaTeX نظامًا من العلامات يحتوي على بيانات بالشكل `{left}{right}`، وتُولَّد في نهاية المطاف عبر `\mark` الأوامر

```latex
\mark{{left}{right}}
```

والمغلَّفة ضمن طبقات من الماكرو المصممة لحماية المستخدمين من التفاصيل منخفضة المستوى—والتي سيُستكشفها في الأقسام اللاحقة من هذه المقالة.

#### استكشاف فئة book

عندما يُحمَّل `book.cls` ملف، فإن أحد إجراءاته النهائية هو تنفيذ `\pagestyle{headings}` والذي يعيّن نمط الصفحة الافتراضي إلى `headings`، لذا سننظر إلى نمط الصفحة هذا بمزيد من التفصيل.

كما [ذُكر أعلاه](#more-on-page-styles)، فإن ميزات/خصائص `headings` نمط الصفحة، كما ينفذه `book` class، ستُعرَّف بواسطة الأمر (الداخلي) `\ps@headings` الموجود في الملف `book.cls`. والتعريف الدقيق لـ `\ps@headings` يعتمد على ما إذا كان المستند أحادي الجانب أم مزدوج الجانب (وهو الإعداد الافتراضي لـ `book` class).

**«أوامر العلامات» و«بيانات العلامات»**

بالنسبة إلى المستندات مزدوجة الجانب المنتجة بواسطة `book` class، فإن تعريف `\ps@headings` ينشئ (يعرّف) أمرين من «أوامر العلامات»: `\chaptermark` و `\sectionmark` واللذين ينتجان «بيانات علامات» بالشكل `{left}{right}`، لاستخدامها في الرؤوس والتذييلات. وتعكس أوامر العلامات هذه نموذج LaTeX للرؤوس والتذييلات—المبني على التسلسل الهرمي لأقسام المستند:

* أمر القسم «الأعلى مستوى» (هنا، `\chapter`) يُستخدم لتوفير «بيانات علامات» لرؤوس الصفحات اليسرى (ذات الأرقام الزوجية). وعندما تبدأ فصلًا جديدًا، بكتابة `\chapter{*chapter title*}`, `\chaptermark` يُستدعى لإنشاء «بيانات علامات» تعكس ذلك الفصل الجديد—وتتضمن `*chapter title*` ورقمه.
* أمر القسم «الأدنى مستوى» (هنا، `\section`يُستخدم ) لتوفير «بيانات العلامة» للصفحات ذات الاتجاه نحو اليمين (الصفحات ذات الأرقام الفردية). عندما تكتب `\section{*section title*}` موقع `\sectionmark` سيُستدعى الأمر لإنشاء «بيانات العلامة» التي تعكس القسم الجديد—وتحتوي على `*section title*` ورقمه. أي بيانات علامة يوفّرها `\chapter` السابق لا تتأثر بأي أوامر \section اللاحقة.

**\markboth و \markright**

أوامر العلامات الخاصة بالأقسام في LaTeX، مثل `\chaptermark` و `\sectionmark`، تستخدم أمرين إضافيين يُسمَّيان `\markboth` و `\markright` اللذين يوفّران بيانات العلامة الفعلية للرؤوس والتذييلات. `\markboth` و/أو `\markright` يمكن أن تتضمن أوامر لتنسيق نص الرأس أو التذييل، مثل جعله بأحرف كبيرة.

بالنسبة للمستندات المنتَجة باستخدام `book` الافتراضات الافتراضية للفئة (مزدوجة الوجهين، `headings` نمط الصفحة)، تعمل أوامر إنشاء العلامات على النحو التالي:

* `\chaptermark` ينشئ بيانات علامة باستخدام `\markboth`
* `\sectionmark` ينشئ بيانات علامة `\markright`

`\markboth` و `\markright` هي ماكروات تستخدم، في النهاية، الأمر البدائي (المضمَّن، منخفض المستوى) `\mark` لإدراج العلامات المُنشأة فعليًا من داخل أوامر التقسيم إلى أقسام.

`\markboth` يأخذ الصيغة

* **`\markboth{left}{right}`**: يُدرج علامة (عقدة) باستخدام `\mark{{left}{right}}` مما ينتج عقدة علامة تحتوي على زوج من القيم بين أقواس معقوفة `{left}{right}`.

`\markright` يأخذ الصيغة

* **`\markright{newright}`**: يُدرج علامة (عقدة) باستخدام `\mark{{currentleft}{newright}}`; أي إنه يغيّر القيمة الحالية لـ `الأيمن` إلى `newright` لكن القيمة الحالية لـ `الأيسر` (أي، `currentleft`) تبقى دون تغيير، مما ينتج عقدة علامة تحتوي على زوج من القيم بين أقواس معقوفة `{currentleft}{newright}`.

سلوك `\markboth` و `\markright` تدعم التسلسل الهرمي ذا المستويين للأقسام، مثل مستند يحتوي على عدة أقسام داخل كل فصل.

على سبيل المثال بالنسبة إلى `book` فئة المستند (باستخدام نمط صفحة العناوين):

* `\chaptermark` يستخدم `\markboth` لضبط:
  * a `{left}` الحقل الذي يطبع CHAPTER . بأحرف كبيرة.
  * حقل {right} وهو فارغ (`{}`)
* `\sectionmark` يستخدم `\markright` لضبط `{right}` حقل العلامة ليُطبع., أيضًا بأحرف كبيرة.

ولفهم السبب، `\sectionmark` يستخدم `\markright` يمكننا ملاحظة أن كل `\section` أمر جديد ينبغي أن:

* يُدرج علامة جديدة تحتوي على بيانات هذا `\section` (مثل عنوانه ورقمه).
* لكن *تحتوي* تؤثر في قيم بيانات العلامة الخاصة بـ `\chapter` الحالي الذي يظهر فيه ذلك `\section` الأمر بعينه

ولهذه الأسباب، `\section` الأمر يستدعي `\sectionmark` الذي يستخدم `\markright` لإنشاء `\section`-علامة مرتبطة: فهو يحدّث `{right}` حقل بيانات العلامة لكنه لا يؤثر في `{left}` القيمة الحالية لحقل بيانات العلامة التي تم ضبطها بواسطة `\chapter`.

ملاحظة: يحتوي كود مصدر LaTeX على التحذير:

> تعمل أوامر العلامات بشكل معقول جيدًا بالنسبة إلى العلامات اليمنى «المُرقمة داخل» العلامات اليسرى—مثلًا، تتغير العلامة اليسرى بأمر \chapter وتتغير العلامة اليمنى بأمر \section. ومع ذلك، تنتج نتائج شاذة بعض الشيء إذا وُجدت علامتا \markboth في الصفحة نفسها.

**أوامر روتين الإخراج**

ال `\ps@headings` الأمر يطبّق تعريفات الأوامر التالية

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

التي يستخدمها روتين الإخراج لإضافة الرؤوس والتذييلات أثناء المرحلة النهائية من تكوين الصفحة. على سبيل المثال، `book.cls` يضبط `\@oddfoot` و `\@evenfoot` إلى القيمة `\@empty`، وهو معرّف على أنه `\def\@empty{}`، وبالتالي `\ps@headings` ينتج تذييلات فارغة على الصفحات ذات الاتجاهين الأيسر والأيمن:

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

تُعرَّف الرؤوس على النحو التالي:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

حيث

* `\leftmark` يستخرج `{left}` القيمة من `{left}{right}` زوج علامة
* `\rightmark` يستخرج `{right}` القيمة من `{left}{right}` زوج علامة
* \thepage يعرض رقم الصفحة الحالي

في الجوهر، تنتج هذه التطبيقات لـ `\@evenhead` و `\@oddhead` النتائج التالية:

* `\@evenhead`: يظهر رقم الصفحة على يسار الرأس ويظهر محتوى `\leftmark`، منسقًا بأمر الخط `\slshape`، على يمين الرأس—وتوفَّر المسافة البيضاء الفاصلة بواسطة `\hfil` اللواصق.
* `\@oddhead`: يظهر محتوى `\rightmark`، منسقًا بأمر الخط `\slshape`، على يسار الرأس ويظهر رقم الصفحة الحالي على يمين الرأس—ومرة أخرى تُوفَّر المسافة البيضاء الفاصلة بواسطة `\hfil` اللواصق.

مع ذلك، يبقى سؤال أساسي: *أي* `{left}{right}` زوج علامة يُستخدم بواسطة `\leftmark` و `\rightmark`: بعبارة أخرى، من أين تستمد قيم بيانات علامتها؟

كما [ذُكر أعلاه](#filtering) لكن [مُوضح أدناه](#explainfiltering)، أثناء مراحل تكوين الصفحة النهائية، تُجرى «تصفية» لأي علامات موجودة في صفحات المستند وتُستخدم لضبط قيمة ثلاث متغيرات عامة للعلامات: `\botmark`, `\topmark` و `\firstmark`بسبب [بنية علامات LaTeX](#latexs-model-of-headers-and-footers)، سينتهي الأمر بكل واحد من متغيرات العلامات الثلاثة هذه إلى احتواء قيمة `{left}{right}` لزوج ما من القيم `{left}` و `{right}` وهما اللذان يوفّران `{left}{right}` زوج العلامة (الحقول) الفعلي لـ `\leftmark` و `\rightmark`:

* `\leftmark` يستخرج `الأيسر` القيمة من `{left}{right}` زوج العلامة (الحقول) الذي يوفّره `\botmark`
* `\rightmark` يستخرج `الأيمن` القيمة من `{left}{right}` زوج العلامة الذي يوفّره `\firstmark`

ملاحظة `\markboth` و `\markright` يمكن أن تحتوي على أوامر لتنسيق نص الرأس والتذييل—مثل التحويل إلى أحرف كبيرة.

### أمثلة تستخدم أوامر LaTeX منخفضة المستوى

توضح الأمثلة التالية إجراء تغييرات على أنماط الصفحات أو الرؤوس والتذييلات عبر إعادة تعريف بعض أوامر LaTeX منخفضة المستوى (الداخلية) التي نوقشت في هذه المقالة (الأوامر التي تحتوي على الرمز @). نحن لا نوصي بهذه الطريقة لتغيير الرؤوس والتذييلات، لكنها متاحة لمن يحتاج إليها (مثل مؤلفي الحزم). والحل المفضّل لتغيير الرؤوس والتذييلات هو استخدام [`fancyhdr` الحزمة](https://ctan.org/pkg/fancyhdr?lang=en)، وهو ما يُناقَش في [مقالة مساعدة من Overleaf](/latex/ar/altnsyq/02-headers-and-footers.md).

#### تعريف نمط صفحة minimal

يعرّف المثال التالي نمط صفحة جديدًا بالغ البساطة يُسمّى `demostyle` الذي يستخدم نصًا ثابتًا لتعريف الرؤوس والتذييلات ولا يعتمد على أوامر التقسيم إلى أقسام (`\chapter`, `\section` إلخ) لضبط محتوى الرأس والتذييل.

يبدأ المثال بتغيير رقم الفئة الخاص بالحرف `@` إلى 11 بحيث يمكن استخدامه داخل أسماء الماكرو. الأمر `\ps@demostyle` يطبّق نمط الصفحة البسيط لدينا عبر إعادة تعريف الأوامر المستخدمة (في روتين الإخراج) لإنتاج الرؤوس والتذييلات: `\@oddhead`, `\@oddfoot`, `\@evenhead` و `\@evenfoot`. لاحظ `twoside` الخيار في `\documentclass` إعلاننا—الذي يستخدم `article` الفئة.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil The odd-page footer\hfil}%
\renewcommand\@evenfoot{\hfil The even-page footer\hfil}%
\renewcommand\@evenhead{\thepage\hfil The even-page header}%
\renewcommand\@oddhead{The odd-page header\hfil\thepage}}
\catcode`@=12
\title{Demonstrating a page style}
\author{Overleaf}
\date{August 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introduction}
\newpage
\section{More material}
\end{document}
```

[افتح هذا المثال في Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### تغيير الرؤوس لفئة book

يغيّر المثال التالي الرؤوس لفئة book عبر إعادة تعريف `\@oddhead` و `\@evenhead` بحيث تحتوي رؤوس الصفحات ذات الاتجاهين الأيسر والأيمن على رقم الصفحة الحالي وعنوان الفصل. لاحظ كيف أن `\chapter` الأمر الثاني يستخدم عنوان الفصل المختصر الاختياري `[العنوان المختصر]` الذي يوفّر الآن نص الرأس، بدلًا من العنوان الطويل.

`\section` الأوامر ليس لها تأثير في محتوى الرأس لأن إعادة تعريفات رؤوسنا تستخدم فقط `\leftmark` الذي يستخرج تفاصيل الفصل الحالي. وللوصول إلى تفاصيل القسم الحالي سنحتاج إلى استخدام `\rightmark` في تعريف `\@oddhead` و/أو `\evenhead`.

```latex
\documentclass{book}
% NB: تم تغيير رقم الفئة للحرف '@' مؤقتًا إلى 11
% للسماح باستخدامه في أسماء الأوامر
\catcode `@=11
% اجعل \@oddfoot و \evenfoot مكافئَين لـ \@empty
% لجعلهما فارغين (خاليين)
\let\@oddfoot\empty\let\evenfoot\empty
% أعد تعريف \@oddhead و \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% استخدم حجم صفحة صغيرًا ومناسبًا
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoirs of a \TeX{} user}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
هذا هو الجزء التمهيدي الذي يستخدم الأرقام الرومانية.
\mainmatter
\chapter{Where do I start?}
الفصل 1: فصل قصير.
\newpage
\section{في البداية...}
قسم.
\chapter[The short title]{A chapter with a very long title, making it unsuitable for headers}
\newpage
\section{قسم آخر}
مع قليل من المحتوى.
\newpage
\section{What, another section?}
وأيضًا مع قليل من المحتوى.
\end{document}
```

[افتح هذا المثال في Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### استخدام أوامر العلامات الموسعة في ε-TeX

ال `book` تستخدم الفئة التعريفات التالية لـ `\@evenhead` و `\@oddhead` لإنتاج الرؤوس:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

حيث تُعرَّف الأوامر `\leftmark` و `\rightmark` على النحو التالي

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

وباستخدام أوامر ε-TeX الموسعة، وبالاعتماد على التكافؤ بين فئة العلامات 0 في ε-TeX وأوامر TeX الأصلية، يمكننا:

* إعادة كتابة `\leftmark` للاستبدال بـ `\botmark` بـ `\botmarks0` المكافئ لـ
* إعادة كتابة `\rightmark` للاستبدال بـ `\firstmark` بـ `\firstmarks0` المكافئ

تنتج هذه التعريفات الجديدة

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

لاحظ استخدام `\\relax` لإنهاء سعي TeX وراء المزيد من الأرقام—يمكنك أيضًا استبدال `\\relax` بمسافة لتعمل كفاصل نهائي.

ينتج المثال التالي خرجًا مطابقًا للتعريفات الأصلية لـ `\leftmark` و `\rightmark`.

```latex
\documentclass{book}
% أعد تعريف \leftmark و \rightmark لاستخدام
% \botmarks0 و \firstmarks0 على التوالي
% NB: تم تغيير رقم الفئة للحرف '@' مؤقتًا إلى 11
% للسماح باستخدامه في أسماء الأوامر
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% استخدم حجم صفحة صغيرًا ومناسبًا
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memoirs of a \TeX{} user}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
هذا هو الجزء التمهيدي الذي يستخدم الأرقام الرومانية.
\mainmatter
\chapter{Where do I start?}
الفصل 1: فصل قصير.
\newpage
\section{في البداية...}
قسم.
\newpage
قسم آخر.
\end{document}
```

[افتح هذا المثال في Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**ملاحظات حول ε-TeX**

كما [أشرنا أعلاه](#etex)، يقدّم ε-TeX `\marks` الأمر:

```latex
\marks n {المحتوى المراد تخزينه}
```

الذي يوسّع `\mark` الميزة الأصلية لمحرك TeX الخاص بـ Knuth، وهو متاح في المحركات الثلاثة الرئيسية لـ TeX: pdfTeX وLuaTeX وXeTeX.

كما يقدّم تنفيذ ε-TeX متغيرات علامة عامة جديدة `\firstmarks n`, `\botmarks n` و `\topmarks n`: واحدًا لكل فئة `n`. وتُحدَّد متغيرات العلامات المعتمدة على الفئات هذه [باستخدام الآليات الموضحة أعلاه](#pre-output-checks-looking-for-mark-nodes)، ويمكن استخدام جميعها في إنتاج الرؤوس والتذييلات.

يمكنك استخدام أي من $$2^{15}$$ = 32768 فئة علامة، تتراوح من 0 إلى 32767، داخل عمليات إعادة تعريف `\leftmark` أو `\rightmark`. ويفترض ذلك أنك قد وفّرت (أدرجت) بيانات علامة مناسبة لفئة العلامة التي اخترتها، `n`، عبر `\marks n{{left}{right}}`.

لاحظ أن LuaTeX يوفّر $$2^{16}$$ = 65536 فئة علامة، مع `n` تتراوح من 0 إلى 65535.

**مثال يستخدم الفئة 10 للعلامات**

يوضح هذا المثال استخدام فئة العلامات 10 (مختارة عشوائيًا) لإنشاء رؤوس المستند. يطبع المستند النموذجي 6 صفحات تحتوي على تسلسل العلامات المعروض في [المثال التطبيقي في نهاية هذه المقالة](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). وستُظهر دراسة هذا المثال سبب اختيار محرك TeX لعلامة معينة، $$\alpha$$, $$\beta$$, $$\gamma$$ و $$\delta$$، لاستخدامها في كل واحد من الرؤوس.

نبدأ بتعريف ماكرو ملائم، `\domark`، الذي يستخدم `\marks 10` لإدراج بيانات علامة تتبع اصطلاح LaTeX `{left}{right}` التقليدي:

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

تُجعل علامات الفئة 10 متاحة لآلية الرؤوس والتذييلات في LaTeX عبر إعادة تعريف `\leftmark` و `\rightmark`—مع إضافة بعض المعلومات الإضافية:

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

بعد إدراج عدد من العلامات (فئة 10)، يقوم محرك TeX (هنا، pdfTeX) بإنشاء متغيرات علامة عامة للفئة 10—`\botmarks10`, `\topmarks10` و `\firstsmarks10` أي `\leftmark` و `\rightmark` تُستخدم لإنتاج الرؤوس.

```latex
\documentclass{book}
% أمر قصير لاستخدام العلامات ذات الفئة 10
% ومع بنية العلامة في LaTeX {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% أعد تعريف \leftmark و \rightmark لاستخدام
% \botmarks10 و \firstmarks10 على التوالي
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Demonstrating \(\varepsilon\)-\TeX’s enhanced marks}
\author{Overleaf}
\date{August 2022}
\begin{document}

الصفحة 1: لم تُضف أي علامات، لذا تبقى جميع متغيرات العلامة في حالتها المبدئية: فارغة (NULL).

\newpage
الصفحة 2: أُضيفت علامة $\alpha$ إلى هذه الصفحة عبر

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
الصفحة 3: لم تُضف أي علامات جديدة إلى هذه الصفحة.

\newpage
الصفحة 4: أُضيفت علامة $\beta$ تلتها علامة $\gamma$ إلى هذه الصفحة عبر

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
الصفحة 5: أُضيفت علامة $\delta$ إلى هذه الصفحة عبر

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
الصفحة 6: لم تُضف أي علامات إلى هذه الصفحة.
\end{document}
```

[افتح هذا المثال في Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

يُظهر الرسم التالي الرؤوس الناتجة عن هذا المثال:

![رسم يوضح المخرجات من كود LaTeX باستخدام أوامر ε-TeX الموسعة للعلامات](/files/3aa506a2ef7646c46278ece47efbcbf2a54d4919)

* **ملاحظة**: يُنشأ الرأس في الصفحة 1 في وقت تكون فيه متغيرات العلامة الثلاثة كلها للفئة 10—`\botmarks10`, `\topmarks10` و `\firstsmarks10`—فارغة. والنتيجة النهائية هي أن `\rightmark` (للصفحة 1) يُدرج فقط مقطع الرأس الأخير: `(via \texttt{\string\firstmarks10})`، كما هو موضح في الرسم أعلاه.

## مثال تطبيقي يوضح كيف تحدد محركات TeX قيم \botmark و\topmark و\firstmark

![Db.gif](/files/d5be0ada5fd531d0298ce02416c7847c7a9b41cf)![Db.gif](/files/d5be0ada5fd531d0298ce02416c7847c7a9b41cf) يبدو مناسبًا تكرار استخدام كنَث لعلامات التحذير المزدوجة (الصورة بإذن من [هذا الموقع](http://www.truetex.com/db.htm)) لأن المادة هنا منخفضة المستوى بعض الشيء و«تكشف ما تحت الغطاء»—مع أننا نأمل أن تكون مثيرة لاهتمام القراء الشجعان الراغبين في فهم بعض التفاصيل الإضافية.

يعتمد النقاش التالي اعتمادًا وثيقًا على المثال الأخير في الصفحة 258 من [كتاب TeX](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). هنا قمنا بتحرير ذلك المثال وإعادة تنسيقه لمن لا يملكون الوصول إلى The TeXbook:

![نسخة محررة ومعاد تنسيقها من مثال من الصفحة 258 من TeXbook](/files/cd7726be70776d4155c5c13f887f3915116b17fe)

الجدول المعروض في هذا الرسم مُعاد إنتاجه من جدول قدّمه Knuth، ولكن، مثل الأصل، لا يوجد تفسير لكيفية اشتقاقه. هنا سنتناول ذلك لتقديم تفاصيل إضافية تُظهر كيف جرى تحديد تلك القيم من `\botmark`, `\topmark` و `\firstmark` —وقد تطلب الحصول على هذه التفاصيل استكشاف الشفرة المصدرية لمحرك TeX!

يمكن تلخيص عملية ضبط قيم `\botmark`, `\topmark` و `\firstmark` في 3 مقاطع قصيرة من الشيفرة الزائفة كما هو موضح في المخطط التالي والتفسيرات اللاحقة:

1. فحص ما قبل المحتوى
2. حلقة المحتوى
3. فحص ما بعد المحتوى

ملاحظة:

* تُجرى الاختبارات في الخطوة 1 «فحص ما قبل المحتوى» والخطوة 3 «فحص ما بعد المحتوى» مرة واحدة لكل صفحة.
* تتضمن الخطوة 2 «حلقة المحتوى» قيام TeX بالمسح عبر محتوى الصفحة بحثًا عن عقد العلامات، واستخدامها لضبط قيم متغيرات العلامة كما هو موضح.

![صورة تُظهر نسخًا من الشيفرة الزائفة المستخدمة لضبط قيم متغيرات العلامة العامة الثلاثة التي تستخدمها محركات TeX](/files/63c45555d31d7d96812761fa2006c258349ca243)

في كل مرة يعثر فيها TeX على فاصل صفحة مناسب يرسل محتوى تلك الصفحة للمعالجة النهائية، وينفّذ هذه الخطوات (الثلاث) لمعالجة العلامات لكل صفحة في مستندك. ويُشار إلى خطوات المعالجة المرقمة 1 و2 و3 في الرسم النهائي ضمن هذا القسم.

لاحظ أن:

* قبل معالجة الصفحة الأولى، تكون جميع متغيرات العلامة العامة الثلاثة `\botmark`, `\topmark` و `\firstmark` قد تم تهيئتها لتكون فارغة (NULL).
* القيم النهائية لـ `\botmark`, `\topmark` و `\firstmark` المحددة في نهاية *السابق* الصفحة تصبح قيم (الإدخال) لمعالجة *الحالي* الصفحة—أي الصفحة التي تتم معالجتها.

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

**الخطوة 1: فحص ما قبل المحتوى** قبل أن يبحث TeX في المحتوى الفعلي للصفحة الحالية، يتحقق مما إذا كانت القيمة الحالية لـ `\botmark` —أي الناتجة عن *السابق* الصفحة—فارغة (NULL):

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

في هذا الاختبار، إذا كانت `\botmark` (من *السابق* الصفحة) *تحتوي* فارغة:

* `\topmark` فإن *الحالي* للصفحة يُضبط إلى *السابق* الصفحة `\botmark` القيمة
* `\firstmark`، أما بالنسبة إلى *الحالي* الصفحة (قيد المعالجة)، فيُضبط إلى فارغ (NULL): ابدأ هذه الصفحة بافتراض عدم وجود `\mark` عقد.

لاحظ أن هذا الاختبار يُجرى *مرة واحدة* لكل صفحة قيد المعالجة.

**الخطوة 2: حلقة المحتوى** بعد ذلك، يكرر TeX المرور على محتوى الصفحة؛ ويشمل جزء من تلك الحلقة البحث عن `\mark` عقد:

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

يُطبَّق هذا الاختبار على كل عقدة علامة تقع داخل (مضمَّنة في) الصفحة الحالية. كان الاختبار السابق (الخطوة 1 أعلاه) قد يمكنه أن يضبط `\firstmark` على فارغ، بحيث تصبح أول علامة يتم العثور عليها في الصفحة الحالية هي قيمة `\firstmark` و `\botmark`. أي *لاحقة* `\mark` عقدة يتم اكتشافها أثناء تنفيذ هذه الحلقة لن تغيّر قيمة `\firstmark`، لأنها لم تعد فارغة (NULL)، لكن `\botmark` يتم تحديثه — لأن هذا هو الغرض من `\botmark`: تخزين آخر `\mark` عقدة شوهدت لهذه الصفحة.

**الخطوة 3: فحص ما بعد المحتوى** بمجرد أن يكون TeX قد كرر على محتوى الصفحة، يطبّق الاختبار النهائي التالي، والذي يُجرى أيضًا مرة واحدة لكل صفحة:

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* إذا `\topmark` ليس فارغًا (NULL) نعلم، من الخطوة 1، أن `\botmark` للصفحة السابقة لم يكن فارغًا (NULL).
* إذا `\firstmark` ما يزال فارغًا، إذن لم نرَ أي `\mark` عُقد لأن الاختبار في الخطوة 2 لم يُفعَّل؛ وبالتالي، `\firstmark` يُضبط على قيمة `\topmark` وهي أيضًا قيمة `\botmark` من الصفحة السابقة.

بعد التطبيق المتسلسل لهذه الخطوات الثلاث على الصفحات الست جميعها في مثالنا، تُشتق قيم `\botmark`, `\topmark` و `\firstmark` باستخدام الانتقالات الموضّحة في الرسم البياني أدناه حيث:

* المستطيلات المستديرة باللون الأزرق الفاتح هي القيم النهائية لمتغيرات العلامة لكل صفحة
* المربعات المستديرة باللون الرمادي الفاتح تمثل القيم المؤقتة التي تنشأ أثناء المعالجة
* الأسهم المسمّاة تمثل التغييرات في قيم متغيرات العلامة وفقًا للخطوات 1 أو 2 أو 3 في الرسم أعلاه—أو أن قيمةً لم تتغير بأيٍّ من الخطوات؛ وموسومة بـ«لا تغيير».

يوضح الرسم البياني التالي كيف تولّد الأجزاء الثلاثة من الشيفرة الزائفة القيم النهائية لـ `\botmark`, `\topmark` و `\firstmark` المذكورة في الجدول الموجود في الصفحة 258 من كتاب TeX.

![رسم بياني للانتقالات يرافق المثال من الصفحة 258 من كتاب TeX، يوضح الانتقالات الداخلية أثناء إسناد القيم إلى متغيرات العلامة العامة](/files/c4762ac8572c5ae95ddab7d9dd8d0b904b834880)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
