> 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/14-how-do-tex-engines-typeset-tables.md).

# كيف تنضّد محركات TeX الجداول

## كيف تقوم محركات TeX بتنسيق الجداول

## مقدمة: ما الذي تغطيه هذه السلسلة؟

إن إنتاج جداول جذابة من الناحية الجمالية قد يكون مهمة تستغرق وقتًا طويلًا—سواء كنت تستخدم أداة تنسيق مرئي، أو LaTeX، أو لغة ترميز مثل HTML أو Markdown. وبالنسبة لمستخدمي LaTeX على وجه الخصوص، فإن تنضيد الجداول يحتل مرتبة متقدمة في قائمة «نقاط الألم» لدى كثيرين، وربما يدل على ذلك أن «الجداول» تُعدّ واحدة من أكثر [الموضوعات الأكثر وسمًا على tex.stackexchange](https://tex.stackexchange.com/tags).

إضافةً إلى الإجابات والأمثلة على tex.stackexchange، فإن مجرد مراجعة سريعة للدعم المتاح بشأن تنضيد الجداول باستخدام LaTeX تكشف عن عدد من موارد المعلومات المتعلقة بالجداول:

* منصة Overleaf [صفحات المساعدة](https://www.overleaf.com/learn/latex/tables) ومواقع أخرى مثل [learnlatex.org](https://www.learnlatex.org/en/lesson-08)
* يفهرس CTAN، شبكة TeX الشاملة، أكثر من [70 حزمة من حزم TeX/LaTeX](https://ctan.org/topic/table) مرتبطة بإنشاء الجداول
* كتابًا كاملًا [عن تنضيد الجداول باستخدام LaTeX](https://www.amazon.co.uk/Typesetting-Tables-LaTeX-Herbert-Voss/dp/1906860254)
* مولدًا ممتازًا [عبر الإنترنت لجداول LaTeX](https://www.tablesgenerator.com/latex_tables)

إن بحثًا بسيطًا في Google عن [جداول LaTeX](https://www.google.com/search?q=latex+tables) يُظهر عددًا هائلًا من النتائج، مع سردٍ للعديد من المواقع التي تقدم المساعدة والنصائح والأمثلة والشروحات.

### TeX، وليس LaTeX

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

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

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

### استكشاف آليات جداول TeX: كيف يمكن فعل ذلك؟

وللاستكشاف ثم الكتابة عن الآليات والعمليات ذات المستوى الأدنى التي تحدث داخل محركات TeX، مثل تنضيد الجداول، قامت Overleaf ببناء (ترجمة) نسخ «تصحيحية» من محرك TeX الخاص بـ Knuth باستخدام [عملية Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html).

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

وعلى النقيض، تنتج Web2W شيفرة مصدرية بلغة C (متاحة [هنا](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/ctex.c)) وهي *أكثر وضوحًا بمراحل* وقابلة للقراءة أكثر بكثير من الشيفرة التي تنتجها Web2C. ونتيجةً لذلك، فإن الشيفرة المصدرية C الخاصة بـ Web2W أسهل بكثير للتعديل لأغراض التعلم/التجريب.

تنتج Web2W نسخة من TeX («CTeX») تكون *شديدة* قريبة من البرنامج الأصلي لـ Knuth: فـ«CTeX» لا تتضمن العديد من التغييرات والتحسينات التي أدخلتها عملية Web2C—مثل SyncTeX ومعالجة سطر الأوامر والبحث عن الملفات عبر Kpathsea. وعلى الرغم من أنك تتنازل عن تلك التحسينات القيّمة، فإن الشيفرة C الناتجة عن (Web2W) سهلة نسبيًا للتنقل فيها باستخدام الشيفرة المصدرية المنشورة لـ TeX الخاصة بـ Knuth، حتى مع أن TeX كُتب بلغة باكال.

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

تم تشغيل النسخة التصحيحية من CTeX باستخدام [بيئة التطوير المتكاملة Eclipse](https://www.eclipse.org/downloads/packages/)، مما أتاح ملاحظة المعالجة في الوقت الحقيقي لشيفرة C التي تنفذ أوامر TeX البدائية (المضمنة) منخفضة المستوى، والخوارزميات التي صممها Knuth لدعم تنضيد الجداول.

يعرض الفيديو القصير التالي (حوالي 90 ثانية) محرك CTeX أثناء عمله داخل [بيئة التطوير المتكاملة Eclipse](https://www.eclipse.org/downloads/packages/):

{% embed url="<https://videos.ctfassets.net/nrgyaltdicpt/7drdFwYR6h5xD88XnurDIH/36511f504755ab274f4da2e3f3fc1ce5/TeXtables.mp4>" %}

إضافةً إلى CTeX، قمنا أيضًا بترجمة e-TeX للوصول إلى بضعة بدائيات إضافية غير موجودة في البرنامج الأصلي لـ Knuth. وعلى الرغم من أن CTeX وe-TeX محركان قديمان الآن قائمين على TeX، فإنهما لا يزالان مناسبين كأساس لاستكشاف آليات تنضيد الجداول لأن تلك المبادئ الكامنة لا تزال تنطبق على جميع محركات التنضيد القائمة على TeX.

### لماذا نستخدم محرك TeX أقدم لاستكشاف الجداول؟

أولًا، الكتاب المطبوع، [TeX: البرنامج](https://www.amazon.co.uk/Computers-Typesetting-TeX-Program-TEX/dp/0201134373)الذي يسرد ويشرح الشيفرة المصدرية لـ TeX، لا يزال دليلًا ملائمًا للغاية إلى المياه الغامضة لآليات TeX الداخلية، رغم أنه نُشر قبل أكثر من 30 عامًا (1986). وبالطبع، يمكنك تنضيد توثيق الشيفرة المصدرية لـ TeX بنفسك، على سبيل المثال انظر مشروع Overleaf [تنضيد توثيق الشيفرة المصدرية لـ TeX أو e-TeX أو pdfTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv). منذ نشر TeX:البرنامج في 1986، تطورت محركات TeX الجديدة، بما في ذلك pdfTeX وXeTeX وLuaTeX، وكلها أضافت ميزات وأوامر لا يوثقها TeX:البرنامج ببساطة لأنها لم تكن موجودة في البرنامج الأصلي لـ Knuth.

بالنسبة للعديد من العمليات الأساسية، مثل تنضيد الجداول في TeX، لا تزال الشيفرة الموثقة في TeX:البرنامج ذات صلة كأساس للدراسة—رغم أن الشيفرة المصدرية لـTeX مكتوبة بلغة باكال. إضافةً إلى ذلك، فإن TeX الخاص بـ Knuth سهل نسبيًا وسريع في الترجمة—خصوصًا عبر عملية [Web2W](https://w3-o.cs.hm.edu/users/ruckert/public_html/web2w/index.html) التي طورها Martin Ruckert. إن سهولة/سرعة الترجمة تجعل من الأكثر ملاءمة بكثير تعديل TeX بطرق بسيطة—مثل إنشاء رسومات SVG المستخدمة لاحقًا في هذه السلسلة من المقالات.

### فهم الفرق بين TeX وLaTeX

يعرف كثير من القراء بالفعل أن LaTeX ليس في الواقع *برنامجًا تنفيذيًا* للتنضيد، بل مجموعة كبيرة من الأوامر (*ماكروهات*) التي تُكتب، في نهاية المطاف، بلغة تنضيد/برمجة منخفضة المستوى تُسمى TeX. لا ينتج كود LaTeX الخاص بك مخرجات منسقة إلا بعد أن تتم معالجته بواسطة برنامج تنفيذي يُسمى *محرك TeX*—وهو البرنامج الذي يقع بين كود LaTeX الخاص بك (المستند) وملف PDF المنضد. واليوم، يمكن للمستخدمين الاختيار بين عدة محركات TeX لتنضيد كود LaTeX الخاص بهم، بما في ذلك pdfTeX وXeTeX ومشتقات LuaTeX.

غالبًا ما يَحتار القادمون الجدد إلى منظومة TeX/LaTeX، وهذا مفهوم، أمام وفرة الأسماء الغامضة التي يواجهونها للأدوات: TeX، LaTeX، pdfTeX، pdfLaTeX، XeTeX، XeLaTeX، LuaTeX وLuaLaTeX. إذا كنت تشعر بالأمر نفسه، فالمساعدة متاحة في مقال Overleaf [ما في الاسم: دليل إلى الأنواع العديدة من TeX](/latex/ar/mqalat-mtamqh/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) الذي يشرح أصل ومعنى كل تلك المصطلحات.

#### اللهجات وبدائيات TeX

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

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

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

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

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

ومع ذلك، فإن محركات TeX تفرض ثمنًا مقابل المرونة التي توفرها قدراتها على بناء الجداول: العديد من الدقائق والفروق في السلوك منخفض المستوى لأوامر تنضيد الجداول المضمنة (البدائية)، وعددها 9:

* **`\halign`**, **`\valign`**&#x623;وامر بناء الجداول الأساسية
* **`\tabskip`**: مادة لاصقة توضع بين أعمدة \halign أو صفوف \valign
* **`\cr`**«إرجاع السطر»؛ فاصل إلزامي لجميع أسطر الجدول
* **`\noalign`**&#x625;دراج مواد بين صفوف \halign أو أعمدة \valign
* **`\everycr`**&#x623;وامر (سجل رمزي) تُقرأ بعد اكتشاف \cr
* **`\span`**&#x623;مر مزدوج الوظيفة: \span لإنشاء خلايا تمتد عبر الأعمدة أو الصفوف، أو لتوسيع الأوامر في مقدمة الجدول (وسننظر في ذلك بالتفصيل)
* **`\omit`**&#x62A;خطي القوالب الخاصة بخليّة معينة
* **`\crcr`**&#x64A;ُستخدم في الماكروهات لتجنب الأخطاء إذا نسي المستخدمون \cr المطلوب

سنصادف هذه الأوامر في رحلتنا عبر بناء الجداول.

### أصداء بعيدة للتحديات

مدفون في [الشيفرة المصدرية لـTeX](https://www.overleaf.com/latex/examples/typeset-the-source-code-documentation-for-tex-e-tex-or-pdftex/qkgfgyspnhcv) يوجد مقدمة مهيبة إلى حد ما لموضوع تنفيذ الأوامر منخفضة المستوى \halign و\valign المصممة لتنضيد الجداول:

> «إنه نوع من المعجزة كلما عملت \halign و\valign، لأنهما تعبران العديد من هياكل التحكم في TeX. لذلك فربما ليست هذه الصفحة الحالية أفضل مكان ليبدأ فيه المبتدئ قراءة هذا البرنامج؛ فمن الأفضل إتقان كل شيء آخر أولًا.»

ويتابع Knuth قائلًا

> «لاحظ أنه أثناء معالجة \halign، نتخلى بلا خوف عن التحكم لبقية TeX. وعند المنعطفات الحرجة، يُستدعى روتين للمحاذاة ليتدخل ويقوم بعمل صغير، لكن معظم الوقت تظل هذه الروتينات كامنة في الخلفية. إنه شيء يشبه الإيحاء ما بعد التنويم.»

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

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


---

# 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/14-how-do-tex-engines-typeset-tables.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.
