> 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.md).

# مقدمة إلى \endlinechar: كيف يقرأ TeX الأسطر من ملفات النص

بصفتنا بشرًا، نفضّل عرض ملفات النصوص وتحريرها على أساس سطرًا بسطر. وما إن نعتقد أن سطرًا من النص قد أصبح طويلًا بما فيه الكفاية حتى نضغط «return» (في محرر النصوص) للإشارة إلى نهاية ذلك السطر. ومن وراء الكواليس، سيفسر محرر النصوص هذا على أنه تعليمات لإضافة [محرف سطر جديد](https://en.wikipedia.org/wiki/Newline) في الموضع الذي تقرر فيه كسر السطر.

لكن لو كان الأمر بهذه البساطة فقط: فالمشكلة هي أن أنظمة التشغيل المختلفة لديها تصورات متفاوتة عمّا يُعدّ محرف سطر جديد. ولزيادة الأمر سوءًا، ستتعامل Windows مع محارف سطر جديد بشكل مختلف تبعًا لما إذا كان الملف مفتوحًا في ما يُسمّى [*الوضع الثنائي* أو *وضع النص*](https://docs.microsoft.com/en-us/cpp/c-runtime-library/text-and-binary-mode-file-i-o?view=vs-2017). والنتيجة هي أنه، تبعًا لنظام التشغيل المضيف، يمكن أن تُنهى الأسطر في ملف نصي بتراكيب مختلفة من المحارف تُسمّى *عودة العربة* (المحرف 13 في ASCII/Unicode) و *تغذية السطر* (المحرف 10 في ASCII/Unicode): ويُشار إليهما بواسطة `\\r` و `\n` على الترتيب.

من الواضح أنه لكي يكون TeX مستقلًا عن النظام يحتاج إلى طريقة للتعامل مع الاختلافات التي تدخلها المحارف المختلفة المستخدمة لإنهاء السطر داخل ملفات النص التي يحتاج إلى قراءتها ومعالجتها.

### مخزن إدخال TeX المؤقت

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

## «سأفعلها بطريقتي»—أمر TeX \endlinechar

عندما يقرأ TeX سطرًا آخر من النص من ملف إدخال فإنه ينفذ مهمتين «لأعمال الصيانة»:

* يزيل أي محارف سطر جديد نهائية (\r أو \n) وُجدت في نهاية السطر—أي إنه يحذف جميع نهايات الأسطر المضافة عندما تم حفظ ملف النص أصلاً على القرص؛
* كما يزيل أيضًا جميع محارف المسافة البيضاء النهائية الموجودة في نهاية السطر.

تحدث هاتان العمليتان قبل أن يبدأ TeX فعليًا في فحص المحارف الموجودة في السطر نفسه: فكّر فيهما على أنهما شكل من أشكال «أعمال الصيانة» استعدادًا لمرحلة المعالجة التالية (الفحص). لذا، خلال هذه المرحلة الأولية من عملية قراءة السطر يكون TeX قد نزع جميع نهايات الأسطر المعتمدة على المنصة (وأي مسافات بيضاء نهائية): فكيف سيعرف TeX (يكتشف) أين ينتهي ذلك السطر؟ لدى TeX خدعة أخرى في جعبته: `\endlinechar` الأمر.

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

سيستخدم TeX القيمة المخزنة في `\endlinechar` لإضافة مُنهٍ خاص به لنهاية السطر إذا، وفقط إذا، `\endlinechar` مُعرَّفًا على نحو مناسب—في TeX الخاص بكنوث يعني ذلك أنه يجب أن تكون قيمته >-1 و< 256. عادةً، `\endlinechar` تُسنَد إليه القيمة 13: محرف عودة العربة—ويُشار إليه عادةً بواسطة `\\r` في الأدبيات البرمجية.

لكن إذا كتبت `\endlinechar=-1` في مكان ما ضمن إدخالِك فإن *في المرة التالية* عندما يقرأ TeX سطرًا من النص من ملف فإنه سي *تحتوي* يضيف أي مُنهٍ إضافي إلى نهاية السطر. وبالتالي سيُعامل إدخالك كسلسلة نصية واحدة متصلة طويلة إلى أن تعيد ضبط `\endlinechar` إلى قيمة مناسبة—عادةً 13 (`\\r`):

```latex
\endlinechar=13
```

أحد رموز الفئات الـ16 في TeX (القيمة 5) مخصّص للتعرّف على محرف «نهاية السطر» والذي يكون عادةً المحرف الذي `\endlinechar` يُدرجه—والذي لا يُدرَج إلا إذا كانت قيمة `\endlinechar` مضبوطة على قيمة مناسبة.

## ملخص معالجة نهاية السطر

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

1. عندما يقرأ TeX سطرًا من ملفك فإنه سيحذف أولًا جميع محارف نهاية السطر (`\\r` و `\n`) المضافة بواسطة محرر النصوص لديك عندما تم حفظ الملف. بالإضافة إلى ذلك:

* يحذف TeX أيضًا أي محارف مسافة بيضاء نهائية من نهاية السطر؛
* TeX *لا* إزالة محارف الجدولة النهائية (رمز المحرف ASCII 9).

**ملاحظة جانبية**: أحد ملفات الشيفرة المصدرية لـLuaTeX، وهو الملف الذي يحتوي على شيفرة لتنفيذ هذا الحذف للمسافات، يتضمن الملاحظة التالية:

> (مقتبس في الملف `luatex.c`) «يذكر David Fuchs أن هذا \[حذف] المسافات كان يُجرى لضمان قابلية نقل وثائق TeX بالنظر إلى الحشو بالمسافات على "الأسطر" ذات السجل الثابت في بعض أنظمة ذلك الوقت، مثل IBM VM/CMS وOS/360.»

3. بعد الخطوة (1) يضيف TeX (يدرِج) محرفًا إضافيًا تُخزَّن قيمته في \endlinechar (بشرط أن يكون معرّفًا على نحو مناسب: >-1 و< 256)
4. \endlinechar يُضبط عادةً على القيمة 13 (`\\r`)، ما يعني أن المحرف المضاف في الخطوة (2) يكون عادةً المحرف 13 (`\\r`)—لكن، بالطبع، يمكنك ضبط \endlinechar على قيمة أخرى لتحقيق تأثيرات خاصة عبر برمجة الماكرو.
5. عندما تكتشف روتينات فحص الإدخال لديه المحرف `\\r` (رمز المحرف 13) في نهاية المخزن المؤقت الداخلي، سيقوم TeX، كالمعتاد، بالتحقق من رمز فئته ليقرر ماذا يفعل به.
6. المحرف 13 *عادةً* يكون له قيمة رمز فئة 5 («نهاية السطر») ما لم يكن، بالطبع، قد تغيرت قيمة رمز فئته—فبعض الماكروز تجعل محرف نهاية السطر نشطًا من أجل إجراء معالجة متقدمة.
7. اعتمادًا على الحالة الداخلية لـTeX (أي عمليًا، على ما يفعله) يمكن لـTeX أن يغيّر محرف نهاية السطر (عادةً `\\r`، رمز الفئة 5) إلى محرف مسافة—وهكذا تتحول محارف نهاية السطر إلى مسافات.
8. لاحظ أيضًا أن TeX يستخدم محارف ذات رمز الفئة 5 لاكتشاف متى يكون قد قرأ سطرًا فارغًا ويحتاج إلى توليد `\par` رمز.

يعطي الرسم التالي ملخصًا بصريًا للخطوتين (1) و(2): حذف محارف سطر جديد ومحارف المسافة النهائية وإدراج `\endlinechar` جاهزًا لمهمة فحص الإدخال.

![كيف يستخدم TeX \endlinechar](/files/16382ac04f431a9184e9eb59fcc84fcb35d8c157)


---

# 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/05-an-introduction-to-endlinechar-how-tex-reads-lines-from-text-files.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.
