> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# صندوق \hbox الخاص بباندورا: استخدام LuaTeX لرفع الغطاء عن صناديق TeX

## مقدمة

الصناديق والغراء مفهومان أساسيان يشكلان أساس نموذج وقدرات التنضيد في TeX. وبناءً على المادة التمهيدية في مقال سابق، [الصناديق والغراء: مقدمة موجزة، لكنها مرئية، باستخدام LuaTeX](/latex/ar/mqalat-mtamqh/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md)، يستعرض هذا المقال، الغني بالرسوم التوضيحية، الصناديق والغراء بمزيد من التفصيل. كما نقدم مشروع Overleaf جديدًا قائمًا على LuaTeX [مشروع Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) يتيح لك استكشاف البنية الداخلية العميقة لصناديق TeX، مما يوفر رؤى ستساعدك على فهم سلوكها فهمًا حقيقيًا. وقد سُهّل إنشاء مشروع Overleaf كثيرًا بفضل عمل Patrick Gundlach، ولذلك نقدم [شكرنا له](#credits-thanks-patrick).

## لماذا تختار LuaTeX؟

أولًا، يجدر إعادة توضيح الفرق بين LuaTeX وLuaLaTeX:

* LuaTeX هو اسم محرّك تنضيد قابل للتنفيذ قائم على TeX؛
* يشير LuaLaTeX إلى استخدام حزمة ماكرو LaTeX مع محرّك LuaTeX.

هذا التمييز مهم للغاية لأننا في هذا المقال نستغل القدرات المضمنة في محرّك LuaTeX نفسه، وليس مجرد الاستفادة من ميزات/وظائف الأوامر التي توفرها حزمة ماكرو LaTeX.

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

### pdfTeX/XeTeX مقابل LuaTeX: بالصور

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

#### pdfTeX/XeTeX

![{{{alt}}}](/files/7c46311ce899e4f1269c437ddb06fda499c239e5)

#### LuaTeX

يقدم LuaTeX أمرًا بدائيًا جديدًا يسمى `\directlua{...}` يمكنك من خلاله كتابة شيفرة لا تتيح وصولًا كاملًا إلى لغة Lua فحسب، بل تسمح لك أيضًا بتوسيع قدرات LuaTeX بكتابة إضافات باستخدام لغات مثل C وC++. وفي Windows، تسمى هذه الإضافات *مكتبات الارتباط الديناميكي* (.DLL)؛ أما في Linux فتُعرف باسم *مكتبات الكائنات المشتركة* (.so). لكن القوة الحقيقية لـ LuaTeX مستمدة من مجموعة ضخمة من دوال Lua المضمنة التي تتيح الوصول إلى الجوانب الداخلية لـ LuaTeX، مما يتيح تحكمًا وبرمجةً متطورين للغاية للتنضيد القائم على TeX. وتُعرف مجموعة من هذه الدوال باسم API (واجهة برمجة التطبيقات)، ومن خلال واجهة API الخاصة بـ LuaTeX تستخدم برامج Lua للتواصل مع محرّك التنضيد القائم على TeX وبنى بياناته.

![{{{alt}}}](/files/6b6043603bf852ac2fba6240f64d8dfd246adebc)

باستخدام أمر LuaTeX `\directlua{...}` يمكنك، على سبيل المثال، الوصول إلى بُنى بيانات TeX الداخلية منخفضة المستوى المخفية عن العرض داخل محرّكات TeX الأخرى. بالإضافة إلى ذلك، يمكنك استخدام نصوص Lua البرمجية لإجراء جميع أنواع الحسابات البرمجية ومعالجة السلاسل النصية وما إلى ذلك، ثم تمرير النتائج إلى TeX: فالاحتمالات لا تكاد تنتهي. غير أن هذا المقال لا يهدف إلى أن يكون عرضًا تفصيليًا أو برنامجًا تعليميًا عن LuaTeX، رغم أنه من المغري تقديم أمثلة تنقل التنوع المذهل لهذا المحرّك القوي على نحو استثنائي.

## الصناديق والغراء: تذكير موجز

كما قُدّم في المقال [الصناديق والغراء: مقدمة موجزة، لكنها مرئية، باستخدام LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) الصناديق والغراء مفهومان أساسيان ترتكز عليهما قدرات التنضيد في TeX. يُقدَّم المخطط التالي كتذكير موجز جدًا بسلوك نوعي الصناديق الأفقية والعمودية في TeX. ملاحظة: يمكن للصناديق الأفقية، بالطبع، أن تحتوي على نص منضد بلغات تُكتب من اليمين إلى اليسار، مثل العربية أو العبرية، ما يعني أن اتجاه نمو الصندوق قد يكون معاكسًا لما هو موضح للصندوق الأفقي في المخطط أدناه.

![{{{alt}}}](/files/3e91777cf9c7f1c4e57ae9484edd27e9e105ca49)

### بدائيات TeX لبناء الصناديق

يُعد معظم الناس اليوم مستنداتهم في TeX باستخدام حزمة ماكرو LaTeX، المصممة لتوفير أوامر تعزل المستخدمين عن الكثير من لغة TeX منخفضة المستوى، أي ما يُسمى *البدائيات*— الأوامر الأساسية المضمنة في محرّكات TeX (انظر المقال [ما في الاسم: دليل إلى الأنواع العديدة من TeX](/latex/ar/mqalat-mtamqh/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) لمناقشة بدائيات TeX). توفر مجموعة ماكرو LaTeX طيفًا من وحدات الماكرو لإنشاء الصناديق وتخزينها (حفظها)، لكن إذا أزلت جميع شيفرات الماكرو فستجد أن هناك 4 أوامر بدائية منخفضة المستوى فقط لبناء الصناديق:

لإنشاء القوائم الأفقية:

* \hbox{...}

لإنشاء القوائم العمودية وتكديسها:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

لن نشرح كيفية استخدام جميع أوامر الصناديق هذه، لأن هناك الكثير من الأمثلة والدروس التعليمية في أماكن أخرى على الويب أو في كتب TeX/LaTeX، لكننا سننظر في كيفية تمثيل الصناديق وتخزينها داخل بُنى بيانات TeX.

### الغراء: تباعد مرن

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

`**\hskip** <العرض الطبيعي> **plus** <مقدار التمدد> **minus** <مقدار الانكماش>`

`**plus**` و `**minus**` هما كلمتان مفتاحيتان في TeX، لكن ليس عليك استخدامهما لكل غراء. إذا كانتا `**plus**` أو `**minus**` غير موجودتين، فإن `<مقدار التمدد>` أو `<مقدار الانكماش>` يُفترض أنه صفر. على سبيل المثال، `\hskip 3pt` يُدرج غراءً بعرض ثابت دون مكوّن للتمدد أو الانكماش.

في الوقت الحالي، فكّر في `<مقدار التمدد>` و `<مقدار الانكماش>` على أنها *توصياتنا* إلى TeX، لأن المقدار الدقيق للتمدد أو الانكماش سيحسبه TeX.

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

![{{{alt}}}](/files/dd784414dc6199ac3e9ec48a4749921877993ac1)

#### مثال على \hbox

لنفترض أننا نريد إنشاء `\hbox{...}` يحتوي فقط على الأحرف A وB وC وD، ونحتاج أن يكون عرض هذا الصندوق 100pt (100 نقطة TeX). بالإضافة إلى ذلك، من الآمن افتراض أن العرض الكلي لهذه الأحرف الأربعة أقل بكثير من 100pt، مما يشير إلى أن TeX يحتاج إلى طريقة لملء المساحة المتبقية داخل الصندوق: سنستخدم بعض الغراء لفعل ذلك. لكن، لأننا لا نعرف المقدار الدقيق من الغراء المطلوب لملء الصندوق، فمن المستحسن إضافة بعض أنواع الغراء المرنة وترك TeX يتولى حساب مقدار المساحة التي يجب أن تشغلها. في مقتطف الشيفرة التالي، لاحظ استخدام «%» لمنع المسافات بين الكلمات الناتجة عن محارف نهاية السطر.

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

يبدو الصندوق الناتج بهذا الشكل (مكبرًا للوضوح):

![{{{alt}}}](/files/a48434ecd1ee522eeed6345dfbc19f4042adaac0)

هذا `\hbox` مُغطّى بصناديق متقطعة (بالأحمر) للإشارة إلى عرض الأحرف (كما يراه TeX). ولأغراض التنضيد، تُعد الأحرف صناديق صغيرة، ويُحدَّد (يُحسب) مقدار الغراء اللازم لملء هذا `\hbox`بأخذ عروض كل حرف في الحسبان.

اتضح أن TeX لم يمدد أو يقلص الغراء بين A وB (المضبوط على 4pt)، ولا يوجد غراء بين B وC (المضبوط على 0pt). لكن الغراء بين C وD والغراء بين D ونهاية الصندوق قد تمددا بدرجة كبيرة، لأن هذين الغراءين يمتلكان أكثر مكوّنات التمدد مرونةً؛ وفعليًا، امتص هذان الغراءان كل التمدد اللازم لملء الصندوق.

## العودة إلى LuaTeX

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

### كيف يخزن TeX الصناديق في الذاكرة: تشبيه

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

1. بيانات عن الصندوق المادي («البيانات الوصفية»):

* width
* الارتفاع
* العمق
* الوزن
* اللون
* النوع (خشبي، بلاستيكي، كرتوني)

3. بيانات عن محتوى الصندوق: شكل من أشكال القائمة يصف العناصر التي يحتويها، ومن المحتمل أن تُدرج دون ترتيب معين.

وهناك تشابه وثيق جدًا مع الطريقة التي يخزن بها TeX الصناديق.

### كيف يخزن TeX الصناديق في الذاكرة: hlists وvlists

داخليًا، ينشئ TeX «حاويات» تسمى *hlists* (قوائم أفقية) و *vlists* (قوائم عمودية)، تمثل hboxes وvboxes على التوالي. توفر كائنات hlist/vlist هذه مجموعة من «البيانات الوصفية» عن الصندوق، كما توفر الوصول إلى قائمة الكائنات التي يحتويها الصندوق فعليًا، وتسمى تلك القائمة *قائمة عُقد*. بخلاف الصندوق المادي، حيث يمكنك وضع الكائنات داخله بأي ترتيب، فإن ترتيب محتويات الصندوق مهم للغاية بالنسبة إلى TeX، فهي عناصر ستُنضّد. إذا كانت لديك أي خلفية في البرمجة أو علوم الحاسوب، فلن تتفاجأ عندما تعلم أن الكائنات داخل صندوق TeX تُخزن، ويُحافظ على ترتيب إنشائها، باستخدام ما يسمى [قائمة مترابطة مزدوجة](https://en.wikipedia.org/wiki/Doubly_linked_list). لن نناقش القوائم المترابطة بمزيد من التفصيل، لأن الويب مليء بالدروس والأمثلة والشروحات.

مفهوم العُقد وقوائم العُقد جانب أساسي من كيفية عمل TeX، لكن لأغراض هذا المقال سنقدم عرضًا موجزًا فقط. العُقد هي، في جوهرها، نوع من «الحاويات المصغرة»، واعتبارًا من LuaTeX 1.04، يوجد نحو 50 نوعًا مختلفًا من العُقد، تعكس أنواع البيانات الداخلية والمكونات التي يستخدمها LuaTeX للتنضيد. على سبيل المثال، توجد عُقد لتمثيل: الرموز (الناتجة من «الأحرف»)، والغراء، والقواعد الأفقية/العمودية، والعقوبات، و«whatsits»، وkern، وما إلى ذلك. ستصبح كل المواد المنضدة، في نهاية المطاف، جزءًا من قائمة عُقد ضخمة، ويمنحك LuaTeX وصولًا مباشرًا إلى بُنى البيانات الداخلية تلك. يتيح لك LuaTeX أيضًا إضافة قوائم العُقد أو تحريرها أو تعديلها أو إنشائها، بحيث يمكنك، على سبيل المثال، إنشاء صناديق مباشرة داخل شيفرة Lua دون الحاجة إلى استخدام أي شيفرة TeX على الإطلاق. لكن الكتابة عن ذلك موضوع ليوم آخر.

### مثال بسيط على \directlua{...} أثناء العمل

ينشئ المثال التالي `\hbox` ويحفظه في سجل الصندوق 0. ثم نُبلغ عن عرض الصندوق باستخدام شيفرة TeX التقليدية، ونحصل على المعلومات نفسها باستخدام طريقة ثانية عبر `\directlua{}`. هنا، نشغل نص Lua برمجيًا صغيرًا يصل إلى منطقة التخزين الداخلية للصناديق في TeX للحصول على عرض الصندوق؛ وبالطبع، القيمتان متماثلتان: 2412092sp ‏(sp=نقطة محجّمة: 65536sp = نقطة TeX واحدة). وفي النهاية، في هذا المثال البسيط جدًا، تفحص شيفرة TeX وشيفرة Lua كلتاهما بُنى البيانات الداخلية نفسها للحصول على عرض الصندوق، لكن من خلال مسار الوصول المباشر يفتح LuaTeX الباب أمام ثروة من المعلومات والتحكم غير المتاحة مع المحرّكات الأخرى.

![{{{alt}}}](/files/747e7416b6e169d34360f5c0e58a6fc0aa45b3be)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent باستخدام شيفرة \TeX{}، يبلغ عرض الصندوق 0 ‏\number\wd0\relax \space sp\par
\noindent يمكننا أيضًا استخدام Lua واستدعاء إحدى دوال Lua\TeX للحصول على المعلومات نفسها
المعلومات.\vskip10mm
\noindent من شيفرة Lua، يبلغ عرض الصندوق 0
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} وهو، بالطبع، مطابق للقيمة التي تم الحصول عليها من شيفرة \TeX{}.
\end{document}
```

## جمع كل شيء معًا: مشروع Overleaf

لاحظنا أن TeX يمثل الصناديق داخليًا بوصفها «حاويات» تسمى hlists/vlists، تخزن «بيانات وصفية» عن الصندوق وتوفر الوصول إلى قائمة المكونات التي يُبنى منها الصندوق. وباستخدام LuaTeX يمكنك الوصول إلى «البيانات الوصفية» للصندوق وقائمة العناصر الموجودة في صندوق TeX: الرموز والغراء والعقوبات والصناديق الأخرى وما إلى ذلك. ومن الممكن باستخدام نصوص Lua البرمجية فحص صندوق موجود في ذاكرة TeX ورسم تمثيل مفصل لما يحتويه ذلك الصندوق. ويتحقق تمثيل مناسب لصندوق TeX ومحتواه باستخدام *رسوم بيانية للعُقد* وقد أعددنا [مشروع Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) ينجز ذلك بالاستفادة من نص Lua برمجي ممتاز كتبه Patrick Gundlach (انظر الشكر والتقدير). لن نصف العمليات التفصيلية المطلوبة لفحص الصناديق وإنشاء رسوم العُقد البيانية، إلا للإشارة إلى أن أي برنامج/نص برمجي يعالج صناديق TeX يجب أن يكون *الاستدعاء الذاتي* تكراريًا، لأن الصناديق يمكن أن تكون متداخلة؛ أي يمكنك وضع hboxes داخل vboxes، داخل hboxes… مع جمع جميع أنواع الصناديق حتى مستوى عميق جدًا من التداخل.

![{{{alt}}}](/files/a969335ef7cfc5b9e18182980ee6a572ee96edf8)

### ماذا يوفر المشروع؟

ينفذ أمرًا واحدًا فقط يسمى `\dobox{أمر الصندوق}`، على سبيل المثال:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

ال `\dobox{...}` ينفذ الأمر عددًا من المهام:

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

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

![{{{alt}}}](/files/76fdac8ec5a71dc3ea07842bdacbae1a3cb0f3ef)

### رسومات من مشروع Overleaf: وصف موجز

قبل عرض بعض الأمثلة، يجدر إبداء بعض الملاحظات حول الرسومات التي ينتجها مشروع Overleaf، وسنستخدم نفس `\hbox` المثال المذكور سابقًا في المقال. إليك إياه مغلفًا في `\dobox{...}` الأمر:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

إليك `\hbox` الذي ينتجه TeX؛ وللوضوح، تم تكبير الصندوق، لكن الحد مدرج في الرسومات التي ينتجها مشروع Overleaf.

![{{{alt}}}](/files/c71f3a0edfb079516b4d97f531fdf8d5b2e18608)

إليك مخطط SVG *مُشروحًا* لقائمة العُقد التي تمثل الصندوق أعلاه؛ أُضيفت التعليقات التوضيحية لإبراز «البيانات الوصفية» للصندوق وقائمة الكائنات التي يحتويها: ولا تظهر تلك التعليقات في الرسومات التي ينتجها مشروع Overleaf.

[![{{{alt}}}](/files/1f84c13b8d2933845fc55d5192fe90c70333e714)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

إذا نظرت إلى قسم «البيانات الوصفية»، فقد تلاحظ بعض المعلمات غير المألوفة:

* `glue_set`
* `glue_sign`
* `glue_order`

هذه المعلمات هي الإعدادات التي يستخدمها TeX لحساب مقدار تمدد الغراء أو انكماشه داخل هذا الصندوق، وهي مجرد مثال واحد على البيانات التي يمكنك الحصول عليها بسهولة عبر LuaTeX دون غيره من محرّكات TeX. لاحظ أن عُقد الغراء الموجودة ضمن مكونات الصندوق *تحتفظ* بقِيَم الغراء الأصلية التي كتبناها لإنشاء الصندوق. وهذا ضروري لأن TeX يوفر الأوامر `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` التي «تخرج محتويات الصندوق من الصندوق» وتعيدها إلى دفق الإدخال للمشاركة من جديد في عمليات التنضيد. ولا تُطبّق `glue_set`, `glue_sign` و `glue_order` على أي أنواع غراء موجودة في الصندوق إلا عندما يُخرج TeX أخيرًا الصندوق إلى ملف PDF أو DVI، لحساب المقدار الفعلي للتمدد أو الانكماش المطلوب لوضع المكونات داخل الصندوق ثم إنشاء بيانات PDF المناسبة أو تعليمات DVI البرمجية.

معلمة أخرى مدرجة في «البيانات الوصفية» هي `الإزاحة`: وهي قيمة إزاحة الصندوق الناتجة عن تطبيق أوامر TeX:

* `\raise`, `\lower` (تُطبق على `\hbox`);
* `\moveleft`, `\moveright` (تُطبق على `\vbox`).

في مثالنا، `الإزاحة` تساوي 0pt لأننا لم نزح `\hbox` عن موضعه الطبيعي.

ال [مشروع Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) ينتج أيضًا مخططات رسوم العُقد بتنسيق PDF: إليك رابطًا لتنزيل [نسخة ملف PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) من رسم العُقد البياني أعلاه.

### كيف ينشئ مشروع Overleaf تلك الرسومات؟

يستفيد مشروع Overleaf من القدرة على تشغيل أدوات وبرامج مساعدة مثبتة على خوادم Overleaf؛ انظر [منشور المدونة هذا](/latex/ar/mqalat-mtamqh/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) لمزيد من التفاصيل ومشروع نموذجي. لإنتاج رسم SVG يمثل صندوق TeX، تُكتب شيفرة TeX الخاصة بالصندوق في ملف صغير، ثم يُنضّد باستخدام pdfTeX لإنشاء ملف DVI. لاحظ أن برنامج pdfTeX يُنفذ بواسطة LuaTeX عبر استخدام بضعة أسطر من نص Lua البرمجي. ويُحوَّل ملف DVI هذا فورًا إلى SVG باستخدام الأداة `dvisvgm` — وهي مضمنة مع توزيعة TeX Live المثبتة على خوادم Overleaf. `dvisvgm` يُنفذ مع خيار سطر الأوامر `-n` لضمان تحويل أي نص منضد إلى خطوط/منحنيات، بحيث لا يعتمد العرض الصحيح لملف SVG على تثبيت خطوط TeX.

لإنشاء رسوم العُقد البيانية، نستخدم نص Lua برمجيًا يسمى `hiviznodelist.lua` وهو قائم على عمل Patrick Gundlach. يكتب ذلك النص ما يسمى ملف `.gv` (Graphviz)، وهو ملف نصي يحتوي على رسم بياني للعُقد موصوف بلغة `dot` . ويُعالج الملف `.gv` بواسطة برنامج أداة يسمى `dot` ينتج مخطط عُقد بتنسيقي ملفي PDF وSVG.

### أمثلة المشروع

إليك بعض الأمثلة الإضافية مع رسومات SVG أُنتجت باستخدام مشروع Overleaf. الصناديق التي تحتوي على الكثير من النصوص (مثلًا في \vbox)، أو الرياضيات المعقدة، ستنتج رسوم عُقد بيانية هائلة؛ وإذا استكشفت مشروع Overleaf، فمن المستحسن عدم استخدام صناديق معقدة بلا داعٍ لعرض الميزات التي تهمك.

#### \vbox to 25pt{A}

يوضح هذا المثال أثر وضع نص مباشرة في `\vbox`: لاحظ أن بنية العُقد معقدة جدًا، حتى لمثل هذا الصندوق البسيط. وسبب هذا التعقيد هو أن النص الموضوع مباشرة في `\vbox` يجعل TeX يجري عملية تقسيم الأسطر. يمكنك أن ترى أن `\vbox` بعرض 345pt: وهي قيمة `\hsize` وقت إنشاء هذا الصندوق. لاحظ أيضًا أن الحرف «A» موجود داخل `hlist` بعرض 345 نقطة أيضًا، ولاحظ العقوبة الكبيرة (10000) مع `\parfillskip` و `\rightskip` من أنواع الغراء في نهاية محتويات الصندوق. تُدرج تلك العقوبة وعنصرا الغراء بواسطة أنشطة تقسيم الأسطر في TeX. إذا نظرت إلى قيمة `glue_set` للسطر الفقري (`hlist`) الذي يحتوي على الحرف «A»، فسترى أنها كبيرة للغاية (322.500000): لماذا؟ ذلك لأن عرض سطر الفقرة 345pt، لكنه لا يحتوي إلا على `\parindent` والحرف «A»: يجب ملء المساحة المتبقية بواسطة غراء `\parfillskip` الذي يجب أن يتمدد مسافة كبيرة لملء المساحة المتبقية في السطر.

![{{{alt}}}](/files/5e14642ccb02844319034e50f9bdf5f40d9617cd)

[![{{{alt}}}](/files/64ab225f8c7c1c8a37af1b144e41570e80ba0d09)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[تنزيل ملف PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

من المفيد جدًا مقارنة هذا المثال بالسابق. هنا، لا يكون رسم العُقد البياني أصغر بكثير فحسب، بل إن عرض `\vbox` لا يتجاوز 7.50002pt: وهو نفس عرض الحرف «A». والسبب هو أن «A» قد لُف داخل `\hbox` مما يمنع `\vbox` من تشغيل TeX لإجراء تقسيم الأسطر، وهي خاصية مهمة للصناديق المنشأة باستخدام `\vbox`.

![{{{alt}}}](/files/8a28ea1bff37bb4c30ce96013041e724df8e8429)

[![{{{alt}}}](/files/ed042dfaa1232233c39b1bf8389ea802219da559)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[تنزيل ملف PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### رياضيات بسيطة: \hbox{$$\displaystyle \int f(x) dx$$}، صندوق معقد!

يوضح هذا المثال أن الرياضيات المنضدة البسيطة جدًا تنشئ بنية صندوق مفصلة: فتنضيد الرياضيات ينتج *شديدة* بُنى بيانات معقدة داخل TeX!

![{{{alt}}}](/files/8cceb7a66769513e47ce559ba9ce2b7a43d91aee)

[![{{{alt}}}](/files/816a056a7c41990efe642d7f6aa4f79b6dd55c76)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[تنزيل ملف PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## شكر وتقدير: شكرًا Patrick!

شكرنا لـ [Patrick Gundlach](https://twitter.com/patrickgundlach) الذي منح Overleaf الإذن باستخدام وتوزيع نسخة معدلة من نص Lua البرمجي الخاص به، `viznodelist.lua`، الذي يعالج صناديق TeX وينتج ملفًا (بلغة `dot` ) يمكن معالجته لرسم مخطط عُقد بياني. يحتوي مشروع Overleaf على نص Lua برمجي يسمى `hiviznodelist.lua`— نسخة معاد تسميتها ومعدلة من شيفرة Patrick الأصلية، المتاحة على [Github](http://gist.github.com/556247). أنشأ Patrick نظام تنضيد مفتوح المصدر قائمًا على LuaTeX يسمى [speedata Publisher](https://speedata.github.io/publisher/index.html) يمكنك تنزيله واستخدامه مجانًا، مع توفر خيارات دعم تجاري أيضًا.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
