# الإعدادات: النص والعناوين

> تنضيد نص المتن وتقسيم الكلمات بالواصلة ولغة المستند، ثم العناوين والقوائم المرقّمة وغير المرقّمة والصيغ الرياضية

- نسخة HTML: https://postext.dev/ar/docs/configuration-text
- آخر تحديث: 2026-10-10
- مدة القراءة: 11 دقيقة
- لغات أخرى: [en](https://postext.dev/en/docs/configuration-text.md), [es](https://postext.dev/es/docs/configuration-text.md), [ca](https://postext.dev/ca/docs/configuration-text.md), [pt](https://postext.dev/pt/docs/configuration-text.md), [zh](https://postext.dev/zh/docs/configuration-text.md), [ja](https://postext.dev/ja/docs/configuration-text.md)

## باختصار

تتناول هذه الصفحة إعدادات الكلمات في الصفحة. تختار خط النص الأساسي وحجمه والمسافة بين أسطره، وطريقة تقسيم الكلمات في آخر السطر. وتخبر Postext باللغة التي كُتب بها الكتاب. وتحدد مظهر كل مستوى من العناوين، وطريقة رسم القوائم المرقّمة وغير المرقّمة. ويضبط القسم الأخير حجم الصيغ الرياضية ولونها.

## نص المتن

تتحكم الخاصية `bodyText` في طباعة نص الفقرات كله.

> **شكل: سلّم أحجام الحروف**
> التدرّج الطباعي من H1 نزولًا إلى نص المتن الصغير، مع الأحجام النسبية للعناوين ونص المتن والتعليقات.
>
> *السلّم المتّسق يُبقي التدرّج مقروءًا من النظرة الأولى.*

> **شكل: سلّم المسافات**
> سلّم مسافات متدرّج يعرض القيم المتزايدة المستخدمة في الهوامش والحشوات والفواصل.
>
> *درجات المسافات تبني إيقاعًا متوقَّعًا في أنحاء الإخراج.*

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `fontFamily` | `string` | `'EB Garamond'` | عائلة الخط لنص المتن. أي خط من Google Fonts، أو خط من خطوط النظام، أو عائلة مخصّصة معرّفة في [`customFonts`](https://postext.dev/ar/docs/configuration-fonts-colors-viewers.md#الخطوط-المخصّصة). عائلة واحدة، لا سلسلة خطوط CSS (انظر أدناه). |
| `fontSize` | `Dimension` | `8 pt` | حجم الخط الأساسي لنص المتن. |
| `lineHeight` | `Dimension` | `1.5 em` | المسافة العمودية بين الأسطر. الوحدات النسبية (em و rem) تتغيّر مع حجم الخط. |
| `paragraphSpacing` | `boolean` | `false` | عند التفعيل، يُدرج سطرًا فارغًا (يساوي `lineHeight`) بين الفقرات المتتالية، للفصل بينها على طريقة دور النشر. |
| `color` | `ColorValue` | `#000000` | لون النص. |
| `boldColor` | `ColorValue` | اللون الرئيسي (`#295AA3`) | اللون المطبّق على المقاطع العريضة (bold/strong). يُحسم وفق المدخل `main-color` في لوحة الألوان الافتراضية، فتغيير لون اللوحة يعيد تلوين كل المقاطع العريضة في المستند. |
| `italicColor` | `ColorValue` | اللون الرئيسي (`#295AA3`) | اللون المطبّق على المقاطع المائلة والمؤكَّدة (italic/emphasis). القيمة الافتراضية المرتبطة باللوحة نفسها كما في `boldColor`. |
| `referenceColor` | `ColorValue` | اللون الرئيسي (`#295AA3`) | اللون المطبّق على تسميات `:ref` المضمَّنة في السطر (الإحالات إلى الموارد). القيمة الافتراضية المرتبطة باللوحة نفسها كما في `boldColor`. يتبع اللوحة منذ postext 1.5؛ وحتى 1.4 كان يبقى `#295AA3` أيًّا كان اللون الرئيسي. |
| `referenceBold` | `boolean` | `true` | ارسم تسميات `:ref` المضمَّنة بالخط العريض. تحتفظ الإحالة بتوكيد النص المحيط بها (داخل `***…***` تبقى عريضة مائلة أيًّا كانت القيمة)؛ ولا يضيف هذا الخيار إلا العرض فوقه. |
| `referenceItalic` | `boolean` | `false` | ارسم تسميات `:ref` المضمَّنة بالخط المائل. تبقى الإحالة الواقعة داخل نص مائل مائلةً أيًّا كانت القيمة. |
| `emphasis` | `'auto' \| 'italic' \| 'bold' \| 'color' \| 'overline'` | `'auto'` | كيف يُنضَّد `*…*`: بالمائل، أو بالوجه العريض وبلون `boldColor`، أو قائمًا بلون `italicColor`، أو قائمًا مع خط فوق الكلمات. القيمة `'auto'` تعني `'bold'` في مستند مكتوب بالحرف العربي، و`'italic'` في أي مستند آخر. انظر [النص العربي](https://postext.dev/ar/docs/configuration-text.md#النص-العربي). |
| `tashkil` | `'keep' \| 'strip' \| 'strip-vowels'` | `'keep'` | علامات التشكيل العربية: تُنضَّد كما كُتبت، أو تُحذف كلها، أو تُحذف ما عدا الشدّة. انظر [النص العربي](https://postext.dev/ar/docs/configuration-text.md#النص-العربي). |
| `textAlign` | `'left' \| 'justify' \| 'start' \| 'end'` | `'justify'` | محاذاة النص. `'left'` (أو `'start'`) هو الجانب الذي يبدأ منه السطر: يمين الفقرة المكتوبة من اليمين إلى اليسار (انظر [اتجاه النص](https://postext.dev/ar/docs/configuration-text.md#اتجاه-النص)). النص المضبوط يوزّع المسافات على كل سطر لتستوي الحافتان. وتُرسم الأسطر الأخيرة من الفقرات المضبوطة غير مضبوطة بعرضها الطبيعي — إلا حين تقبل خوارزمية Knuth-Plass سطرًا أخيرًا زائد الامتلاء يعتمد على انكماش المسافات المرنة (glue)، فتنضغط حينئذ المسافات بين الكلمات ليملأ السطر عرضه تمامًا (دلالة ضبط المسافات المرنة في TeX، مطبّقة بالطريقة نفسها في مُخرِجات Canvas وHTML وPDF). |
| `fontWeight` | `number` | `400` | وزن النص العادي (100–900). |
| `boldFontWeight` | `number` | `700` | وزن النص العريض (100–900). |
| `hyphenation` | `HyphenationConfig` | مفعّل، `'en-us'` | إعدادات التقسيم الآلي للكلمات بالواصلة. انظر أدناه. |
| `firstLineIndent` | `Dimension` | `1.5em` | المسافة البادئة المطبّقة على السطر الأول من كل فقرة (أو على كل الأسطر عدا الأول حين تُفعَّل المسافة البادئة المعلّقة). |
| `hangingIndent` | `boolean` | `false` | عند التفعيل، تُطبَّق المسافة البادئة على كل الأسطر عدا الأول (المسافة البادئة الفرنسية أو المعلّقة). |
| `indentAfterHeading` | `boolean` | `true` | حين يُضبط على `false`، تُرسم الفقرة الأولى التالية مباشرة لعنوان بلا مسافة بادئة للسطر الأول — وهو عُرف طباعي شائع في المنشورات العلمية وفي كثير من أساليب الكتب. وينطبق الأمر نفسه على الفقرة التي تلي مباشرة سطر [`:::space`](https://postext.dev/ar/docs/document-format.md#space). ويُتجاوَز الإطار المنضَّد خارج النص الواقع بينهما — في العمود الجانبي (`span: 'side'`)، أو العائم إلى رأس الصفحة أو ذيلها، أو الثابت — وكذلك الشكل العائم: ففي عمودها تظل الفقرة تالية للعنوان، وتُنضَّد بلا مسافة بادئة. أما الإطار المنضَّد داخل النص (`placement: 'here'`) فيُحتسب، وتُزاح الفقرة التي تليه. لا أثر له حين تكون `hangingIndent` مفعّلة. |
| `maxWordSpacing` | `number` | `2` | الحد الأعلى لتباعد الكلمات في النص المضبوط، معبَّرًا عنه بمضاعِف لعرض المسافة العادية. تُبقي Knuth-Plass ضمنه كل سطر تسمح به الفقرة، فتقسم كلمة بالواصلة أو توزّع الفراغ الزائد على الأسطر المجاورة أولًا؛ والسطر الذي لا تُبقيه ضمنه أي مجموعة من نقاط الكسر يتمدّد متجاوزًا إياه، والسطر الذي يتجاوز 3× المسافة العادية يُنضَّد غير مضبوط. الأسطر التي تتجاوز هذه النسبة تُعدّ «متخلخلة»: انظر [الأسطر التي يعجز الكاسر عن ملئها](https://postext.dev/ar/docs/justification.md#أسطر-يعجز-مقسِّم-الأسطر-عن-ملئها)، و`maxJustifyTracking` للسماح لها بقليل من التتبّع بدلًا من ذلك. |
| `minWordSpacing` | `number` | `0.6` | الحد الأدنى لتباعد الكلمات في النص المضبوط، بمضاعِف لعرض المسافة العادية. |
| `maxJustifyTracking` | `number` | `0` | أقصى تتبّع يجوز أن يأخذه السطر المضبوط، بأجزاء الألف من em في الاتجاهين (وحدة InDesign: 10 = 0.01 em لكل حرف)، حين تتمدّد مسافات كلماته وحدها إلى ما بعد `maxWordSpacing` أو تنكمش إلى ما دون `minWordSpacing`. ما يتجاوز الحدّ من التعديل يذهب إلى الحروف، فتعود مسافات السطر المتخلخل إلى `maxWordSpacing` ويستقر السطر المضغوط عند `minWordSpacing`. تزنه Knuth-Plass حين تختار نقاط الكسر، وللأسطر التي يتجاوز بها تباعدُ الكلمات وحده الحدودَ فقط: أما الأسطر الأخرى، والسطر الأخير من الفقرة (ما لم يتجاوز عرضه)، والسطر المكوّن من كلمة واحدة، والسطر الذي يحوي شارة (chip)، فلا تأخذ منه شيئًا. يسجّله السطر في `letterSpacing`، وترسمه مخرجات Canvas وHTML وPDF. يتطلب `optimalLineBreaking`. القيمة `0` توقفه. انظر [التتبّع ملاذًا أخيرًا](https://postext.dev/ar/docs/justification.md#التتبّع-ملاذًا-أخيرًا). |
| `kashida` | `'auto' \| 'none'` | `'auto'` في مستند مكتوب بالحرف العربي، وإلا `'none'` | ضبط الأسطر بالكشيدة (kashida): يأخذ السطر المضبوط من نص مكتوب بالحرف العربي فراغه الزائد في المسافات بين كلماته (حتى ربع عرضها) ثم في الكشيدات، وهي محارف تطويل (tatweel) كاملة (U+0640) تُدرج بين حرفين متصلين، ولا يأخذه أبدًا تباعدًا بين الحروف. تحتسب Knuth-Plass إطالة كل كلمة تمدّدًا. لا كشيدة أبدًا في الكلمات اللاتينية، ولا في الأرقام، ولا في العناوين، ولا في الأسطر غير المضبوطة، ولا في السطر الأخير من الفقرة. تُرسم محارف التطويل لكنها تُستبعد من النص المجرّد والنص المنسوخ. انظر [الكشيدة في النص العربي](https://postext.dev/ar/docs/justification.md#الكشيدة-في-النص-العربي). |
| `kashidaPatterns` | `'auto' \| 'naskh' \| 'simple' \| 'nastaliq'` | `'auto'` | أيّ مواضع الاتصال تأخذ كشيدة، وبأي ترتيب: قواعد النسخ الكلاسيكية، أو أولويات Microsoft، أو قواعد النسخ المعدّلة للنستعليق (على طريقة raqim-kashida). القيمة `'auto'` تقرأ خط المتن: لا كشيدة في خط رقعة أو ديواني (Aref Ruqaa)، وقواعد النستعليق في خط نستعليق، والنسخ فيما عدا ذلك. |
| `kashidaPerWord` | `number` | `1` | أقصى عدد من الإطالات في الكلمة الواحدة. |
| `kashidaMaxLength` | `number` | `0.6` | أطول إطالة عند موضع اتصال واحد، بوحدة em؛ وتأخذ من محارف التطويل الكاملة ما يتّسع له. |
| `optimalLineBreaking` | `boolean` | `true` | استخدم كسر الأسطر الأمثل بخوارزمية Knuth-Plass بدلًا من الملء الجشع للسطر تلو الآخر (greedy first-fit). ينتج تباعدًا أكثر انتظامًا بين الكلمات عبر الفقرة. الفقرة الصينية أو اليابانية أو الكورية (انظر [طباعة شرق آسيا](https://postext.dev/ar/docs/configuration-east-asian.md#تنضيد-نصوص-شرق-آسيا))، أو الفقرة التي فيها كلمة أعرض من العمود، تظل تُنضَّد سطرًا سطرًا؛ أما الفقرة اللاتينية التي تقتبس بضع كلمات CJK فتحتفظ به. ويأخذه النص غير المضبوط أيضًا مع `optimalRagged`. انظر [تقسيم الكلمات وضبط الأسطر](https://postext.dev/ar/docs/justification.md). |
| `optimalRagged` | `boolean` | `true` | اكسر النص الجاري غير المضبوط بخوارزمية Knuth-Plass أيضًا: نص المتن والاقتباسات الكتلية وبنود القوائم المحاذاة إلى اليسار أو اليمين أو الوسط، وأنماط الفقرات غير المضبوطة، ومتون الأطر، ومتون الأجزاء وأنماط الأقسام. تحتفظ المسافات بين الكلمات بعرضها. يزن الكاسر مقدار قصور كل سطر عن عرض السطر الكامل (السطر الذي ينقصه 3 em يكلّف ما يكلّفه سطر مضبوط عند `maxWordSpacing`)، فيسوّي الحافة بدلًا من ملء كل سطر قبل الذي يليه، وتعمل قواعد الكلمة المعزولة (`avoidRunts` و`tightenRunts`) و`hyphenateAcrossColumns` على النص غير المضبوط كما تعمل على المضبوط. ومع `hyphenation.ragged` تظل المنطقة هي التي تقرّر أيّ المقاطع يجوز أن ينتهي بها السطر (انظر [النص غير المضبوط](https://postext.dev/ar/docs/configuration-text.md#النص-غير-المضبوط)). أما العناوين وتعليقات الأشكال والملاحظات وخلايا الجداول وجدول المحتويات غير المضبوطة فتظل تُنضَّد سطرًا سطرًا. يتطلب `optimalLineBreaking`. القيمة `false` تنضّد النص غير المضبوط سطرًا سطرًا، كما حتى postext 1.4؛ والإعدادات المخزَّنة قبل ذلك التي تجعل بعض النص الجاري غير مضبوط تُقرأ بها (انظر [الحزم المكتوبة بـ postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). |
| `breakAfterDashes` | `boolean` | `true` | اسمح للسطر بأن ينتهي بعد شرطة طويلة (em) أو متوسطة (en) منضَّدة ملتصقة بين كلمتين: `say—that’s`، `riddles.—I`، `Hamburg–Berlin`، وكذلك حين تُنضَّد الكلمة التالية للشرطة بنمط آخر (`see—*and*`). تأخذه Knuth-Plass كما تأخذ المسافة بين الكلمات، وينتهي السطر بالشرطة دون إضافة شيء. ولا يكون أبدًا بعد شرطة تفتح جملة اعتراضية أو سطر حوار (`—dijo`، `said "—Hola`، `sagte »—Ich`: مسافة، أو مسافة وعلامة تنصيص، قبل الشرطة؛ أما بعد علامة تنصيص تُغلق كلمة، كما في `"no"—and` أو الألمانية `„nein“—und` أو الفرنسية `« non »—et`، فيجوز أن ينتهي السطر)، ولا قبل علامة ترقيم (`él—,`)، ولا قبل علامة تنصيص أو قوس (`thinking—" and`، `says—“no”`، `says—(no)`: علامة التنصيص بعد الشرطة كثيرًا ما تُغلق الكلام الذي قطعته الشرطة)، ولا داخل سلسلة من الشرطات، ولا داخل مدى أرقام منضَّد بشرطة متوسطة (`1914–1918`). القيمة `false` تُبقي نقاط الكسر كما في 1.4: لا تكسر Knuth-Plass أبدًا بعد شرطة، ولا يكسر الكاسرُ الذي ينضّد سطرًا سطرًا النصَّ المنسَّق أو غير المضبوط المقسَّم بالواصلة إلا بين حرفين؛ والإعدادات المخزَّنة قبل ذلك التي يحوي نصها مثل هذه الشرطة تُقرأ بها (انظر [الحزم المكتوبة بـ postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). ينطبق على النص الجاري والعناوين والقوائم والاقتباسات الكتلية والأطر. أما تعليقات الأشكال والملاحظات وخلايا الجداول وجدول المحتويات فتحتفظ بنقاط كسر 1.4، والفقرة غير المضبوطة البسيطة المنضَّدة سطرًا سطرًا تتبع قواعد pretext الخاصة في الحالتين. |
| `breakAfterHyphens` | `boolean` | `true` | اسمح للسطر بأن ينتهي بعد واصلة الكلمة المركّبة، أي الواصلة الواقعة بين حرفين (`well-` · `known`، `vencer-` · `se`)، في كل فقرة تكسرها Knuth-Plass. ينتهي السطر بالواصلة ولا يُضاف شيء؛ ويُسعَّر الكسر كما يُسعَّر المقطع. ولا يكون أبدًا بعد واصلة مجاورة لرقم أو رمز (`COVID-19`، `-5 °C`). الفقرة المضبوطة الخالية من التنسيق المضمَّن لا تنكسر هناك إلا إذا كان على كل جانب من الواصلة حرفان، فلا ينتهي أي سطر بـ `e-` من `e-mail`. القيمة `false` تُبقي نقاط كسر 1.4: الفقرة المضبوطة الخالية من التنسيق المضمَّن لا تنكسر هناك أبدًا، في حين تنكسر هناك الفقرة نفسها إذا احتوت كلمة مائلة واحدة في أي موضع، والفقرة غير المضبوطة، والفقرة المنضَّدة سطرًا سطرًا؛ والإعدادات المخزَّنة قبل ذلك التي يحوي نصها كلمة مركّبة تُقرأ بها (انظر [الحزم المكتوبة بـ postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). ينطبق على النص الجاري والعناوين والقوائم والاقتباسات الكتلية والأطر. انظر [الكلمات المركّبة](https://postext.dev/ar/docs/justification.md#الكلمات-المركّبة). |
| `repeatHyphen` | `boolean` | `false` | ابدأ السطر التالي لكسرٍ عند واصلة كلمة مركّبة بواصلة أيضًا: `vencer-` · `-se`، كما يطلب الإملاء البرتغالي، و`léxico-` · `-semántico`، كما تطلب قواعد الأكاديمية الملكية الإسبانية منذ 2010. تُقاس الواصلة المكرَّرة وتُرسم مع سطرها، الذي يسجّلها في `repeatedHyphen`؛ ويشير `plainStart` و`sourceStart` إلى ما بعدها، فتقرأ الروابط والترويسات و Sandbox الكلمة كما كُتبت. ويرسمها ملف PDF تحت `/ActualText` يستبعدها، فيقرأ النص المنسوخ أو المستخرَج من PDF الكلمة مرة واحدة. ولا يأخذها عنوان الويب أبدًا. ينطبق على النص الجاري والعناوين والقوائم والاقتباسات الكتلية والأطر؛ والفقرة الخالية من التنسيق التي تحوي كلمة مركّبة يكسرها حينئذ الكاسر الذي ينضّد النص المنسَّق. |
| `hardLineBreaks` | `boolean` | `true` | اقرأ الشرطة المائلة العكسية في آخر سطر من النص، و`\\` المتبوعة بمسافة، فاصلَ سطرٍ إجباريًا داخل الفقرة أو الاقتباس أو عنصر القائمة (الفاصل الإجباري في CommonMark): تبدأ الكلمات التالية سطرًا جديدًا من الفقرة نفسها، ويُضبط السطر الذي قبله بعرضه الطبيعي، كالسطر الأخير. وتُطبع الشرطة المائلة العكسية التي تختم الفقرة، ولا تكون المسافتان في آخر السطر فاصلًا (انظر [صيغة المستند › فواصل الأسطر](https://postext.dev/ar/docs/document-format.md#فواصل-الأسطر)). القيمة `false` تحتفظ بقراءة 1.22: تُطبع الشرطات وتُوصل الأسطر بمسافة؛ والإعدادات المحفوظة قبل ذلك التي في نصها شرطة كهذه تُقرأ بها (انظر [الحزم التي كتبها postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). وتنكسر العناوين والتعليقات والملاحظات وخلايا الجداول عند `\\` في الحالتين. |
| `tabStops` | `TabStop[]` | غير محدَّد | مواضع الجدولة لكل فقرة وعنصر قائمة واقتباس: إلى أين ترسل الجدولة (`:tab`، أو محرف جدولة في النص) الكلمات التي تليها. ونمط الفقرة أو متن الإطار الذي يحدّد مواضعه الخاصة يستبدل بها. وحين لا تُحدَّد يكون محرف الجدولة مسافة بين كلمتين، كما كان من قبل، وكذلك `:tab` الذي لا يجد موضعًا يذهب إليه. انظر [مواضع الجدولة](https://postext.dev/ar/docs/configuration-text.md#مواضع-الجدولة). منذ postext 1.23. |
| `tabInterval` | `Dimension` | غير محدَّد | مواضع افتراضية كل مسافة منه بدءًا من بداية عرض السطر، بعد آخر موضع في `tabStops`. وحين لا يُحدَّد تكون الجدولة التي بعد آخر موضع مسافة بين كلمتين. منذ postext 1.23. |
| `blockquote` | `BlockquoteConfig` | انظر أدناه | كيف تُنضَّد الاقتباسات الكتلية في Markdown (`> …`): اللون والمائل والمسافات البادئة. انظر [الاقتباسات الكتلية](https://postext.dev/ar/docs/configuration-text.md#الاقتباسات-الكتلية). |

### الاقتباسات الكتلية

يأخذ الاقتباس الكتلي (الأسطر التي تبدأ بـ `>`) عائلة خط المتن وحجمه وتباعد أسطره وأوزانه ومحاذاته وتقسيمه بالواصلة. ويضبط `bodyText.blockquote` الباقي؛ وإن لم يُضبط، يبدو الاقتباس الكتلي كما كان حتى postext 1.4: رماديًا مائلًا، بالمسافة البادئة للسطر الأول في المتن وبلا إزاحة جانبية.

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `color` | `ColorValue` | `#666666` | لون النص. اللون المرتبط بمدخل في لوحة الألوان (`paletteId`) يتبع ذلك المدخل، كما في كل موضع؛ ولا تنطبق ألوان العريض والمائل والإحالات الخاصة بالمتن داخل الاقتباس الكتلي. |
| `italic` | `boolean` | `true` | نضّد النص بالمائل. المقطع `*…*` داخله يعود قائمًا؛ ومع `false` يكون مائلًا كما في الفقرة. |
| `indent` | `Dimension` | `0` | إزاحة كل سطر عن الحافة اليسرى للعمود أو الإطار. يضيق عرض السطر بمقدارها، فتنتهي الأسطر المضبوطة عند الحافة اليمنى. وحدة `em` هي حجم خط المتن. |
| `firstLineIndent` | `Dimension` | قيمة المتن | المسافة البادئة للسطر الأول من كل فقرة مقتبسة، محسوبة من `indent` (ومع `hangingIndent` الخاصة بالمتن، المسافة البادئة لكل سطر عدا الأول). إن لم تُضبط: `bodyText.firstLineIndent`. |

```ts
bodyText: {
  firstLineIndent: { value: 1.5, unit: 'em' },
  // Upright verse in the body colour, set in by 2 em, no first-line indent.
  blockquote: { color: { hex: '#241f26', model: 'hex' }, italic: false, indent: { value: 2, unit: 'em' }, firstLineIndent: { value: 0, unit: 'em' } },
}
```

في Sandbox، هذه هي مجموعة **الاقتباسات الكتلية** في قسم نص المتن.

### الشعر

القصيدة `:::verse` التي لا تحمل أسطرها فاصل الشطرين تُصَفّ سطرًا سطرًا (انظر [تنسيق المستند › `:::verse`](https://postext.dev/ar/docs/document-format.md#verse)). ويعطي `bodyText.verse` القيم الافتراضية لهذه القصائد؛ والسمة التي تحمل الاسم نفسه في سطر فتح القصيدة تحدّدها لتلك القصيدة.

| الخاصية | النوع | الافتراضي | الوصف |
| --- | --- | --- | --- |
| `layout` | `'auto' \| 'bayt'` | `'auto'` | كيف تُصَفّ قصيدة لا يسمّي سطر فتحها تخطيطًا. `'auto'`: أبياتًا حين يحمل سطر فاصلًا (`\|\|`)، وسطرًا سطرًا في غير ذلك. `'bayt'`: أبياتًا دائمًا، والقصيدة بلا فاصل أشطرًا مفردة في الوسط، كما كانت حتى postext 1.22. |
| `indentStep` | `Dimension` | `0.5em` | عرض مسافة واحدة في أول سطر من الشعر (علامة الجدولة بأربع، والمسافة الإيديوغرافية باثنتين)؛ و`em` هو حجم القصيدة. |
| `turnover` | `'hang' \| 'right'` | `'hang'` | كيف يُكمَل سطر أعرض من العرض: معلّقًا في السطر التالي، أو ملاصقًا لنهاية العرض بعد `turnoverMark`. |
| `hang` | `Dimension` | `2em` | إزاحة التتمّة المعلّقة عن بداية سطرها حين لا يحدّد نمط فقرة القصيدة `hangingIndent`. |
| `turnoverMark` | `string` | `'['` | العلامة التي تسبق تتمّة مصفوفة إلى الطرف. |
| `stanzaSpace` | `number` | `1` | المسافة بين المقاطع، بأسطر من تباعد أسطر القصيدة. وعلى شبكة خط الأساس تصير أسطرًا كاملة؛ ونمط الفقرة الذي فيه `snapToGrid: false` يبقيها دقيقة. |
| `keepStanzas` | `number` | `0` | إبقاء كل مقطع لا تزيد أسطره على هذا العدد في عمود واحد. `0` يعطّله. |
| `tighten` | `boolean` | `true` | تضييق المسافات بين كلمات سطر الشعر الأعرض قليلًا من عرض السطر، حتى `bodyText.minWordSpacing` من عرضها الطبيعي، وإبقاؤه في سطر واحد؛ ولا يُكمَل في سطر تالٍ إلا ما بقي أعرض بعد ذلك. ولا تُباعَد الحروف لهذا الغرض. `false` يُكمل كل سطر أعرض من عرض السطر في سطر تالٍ، كما كان يفعل postext 1.23. أما EPUB المرن، الذي يقسم نظامُ القراءة أسطره، فلا يضيّق. |

```ts
bodyText: {
  // التتمّات إلى الطرف بعد قوس معقوف؛ والتانكا كاملة.
  verse: { turnover: 'right', keepStanzas: 5 },
}
```

الإعداد المحفوظ قبل هذه الإعدادات (`configVersion` 8 أو أقدم) الذي يصفّ قصيدة بلا فاصل يُقرأ مع `layout: 'bayt'`، فتحتفظ القصيدة بالأسطر الموسّطة التي أعطاها إياها postext 1.22. والإعداد المحفوظ بالإصدار postext 1.23 (`configVersion` 9) الذي يصفّ قصيدة سطرًا سطرًا يُقرأ مع `tighten: false`، فتُكمَل أسطرها حيث كان يكملها الإصدار 1.23.

في Sandbox، هذه هي مجموعة **الشعر** في قسم نص المتن.

### مواضع الجدولة

يسرد `bodyText.tabStops` المواضع التي تذهب إليها الجدولة: `:tab`، أو محرف جدولة في فقرة لها مواضع (انظر [صيغة المستند › الجدولة ومواضع الجدولة](https://postext.dev/ar/docs/document-format.md#الجدولة-ومواضع-الجدولة) للترميز وطريقة تنضيد السطر). وتستبدل بها `tabStops` في نمط الفقرة لفقراته، و`body.tabStops` في نمط الإطار داخل إطاراته؛ والقائمة الفارغة لا تحدّد أي موضع. وكل موضع `TabStop`:

```ts
bodyText: {
  tabStops: [
    { position: { value: 30, unit: 'mm' } },
    { position: 'end', align: 'end', leader: '.', leaderGap: { value: 2, unit: 'pt' } },
  ],
  tabInterval: { value: 10, unit: 'mm' },
}
```

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `position` | `Dimension \| 'end' \|  0 ` | إلزامي | أين يقع الموضع، من حافة البداية لعرض سطر الفقرة (بعد `indent` في نمط الفقرة؛ و`em` حجم الفقرة نفسها): طول، أو `'end'` لحافة النهاية من عرض السطر، أو نسبة من عرض السطر (`'50%'`). وفي النص المكتوب من اليمين إلى اليسار تكون حافة البداية هي اليمنى. |
| `align` | `'start' \| 'end' \| 'center' \| 'decimal'` | `'start'` | كيف يقع النص الذي يلي الجدولة عند الموضع: يبدأ عنده، أو ينتهي عنده (النص حتى الجدولة التالية أو نهاية الفقرة)، أو يتوسّطه، أو تقع فاصلته العشرية عليه (والمقطع الذي لا فاصلة فيه ينتهي عنده). |
| `leader` | `string` | لا شيء | يتكرّر على المساحة التي قبل الموضع: `'.'`، `'. '`، `'·'`، `'_'`، `'-'` أو أي نص قصير، بخط الفقرة ولونها؛ و`'rule'` يرسم خطًا تحت خط الأساس بقليل. وينتهي خط الإرشاد ملاصقًا لنهاية مساحته، فتصطفّ خطوط إرشاد الأسطر المتعددة. ويُقاس سلسلةً كاملة، كما يُقاس خط الإرشاد في سطر المحتويات. |
| `leaderGap` | `Dimension` | `0.5em` | المسافة المتروكة بين خط الإرشاد والنص على جانبيه، مثل `leader.gap` في المحتويات. ولا فراغ قبل خط الإرشاد حين تفتح الجدولة سطرها، ولا بعده حين لا يليه شيء. |
| `decimalChar` | `string` | فاصلة لغة المستند | الفاصلة التي يحاذيها الموضع `'decimal'`: `.` في الإنجليزية والصينية واليابانية والعربية، و`,` في الإسبانية والكتالونية والبرتغالية والفرنسية والألمانية وغيرها. |

يضيف `tabInterval` مواضع كل مسافة منه بدءًا من بداية عرض السطر، بعد آخر موضع في القائمة؛ ومن دونه تكون الجدولة التي بعد آخر موضع مسافة بين كلمتين. ومحرف الجدولة المكتوب في النص لا يكون جدولة إلا في فقرة لنمطها مواضع أو مسافة، خاصة به أو مأخوذة من المتن؛ وفي غير ذلك يبقى المسافة بين كلمتين كما كان دائمًا، فيُخرَج المستند المحفوظ كما كان ولا يحتاج إلى تثبيت.

تُفحص المواضع مع بقية الإعدادات (انظر [تحذيرات الإعدادات](https://postext.dev/ar/docs/configuration-fonts-colors-viewers.md#تحذيرات-الإعدادات)): يُبلَّغ عن المفتاح غير المعروف في الموضع (`leaders`) بوصفه `unknownConfigKey` مع أقرب مفتاح إليه؛ وعن `align` الذي ليس إحدى الكلمات الأربع بوصفه `unknownConfigValue`، ويُنضَّد الموضع بقيمة `'start'`؛ وعن `position` الذي ليس طولًا ولا `'end'` ولا نسبة مئوية بوصفه `unknownConfigValue` مع `used: 'none'`، ويُستبعد الموضع.

لون خط الإرشاد وخطه هما لون الفقرة وخطها؛ ولا إعداد خاصًا بهما بعد.

### الحروف الاستهلالية

يمكن أن تُفتتح فقرة المتن بحرف استهلالي: يُنضَّد حرفها الأول كبيرًا بجوار أسطرها الأولى، فتقصر هذه الأسطر بمقدار عرض الحرف ومسافة فاصلة، وتُنضَّد كأي أسطر أخرى (تكسرها Knuth–Plass، وتُضبط، وتُقسَّم كلماتها بالواصلة). ويعطي نمطُ الفقرة حرفًا استهلاليًا للفقرة الأولى من كل مجموعة `:::paragraphs` منضَّدة به (ولكل فقرة فيها مع `each: true`، كما في فهرس من المداخل)؛ ويعطيه مستوى العنوان أو نمط العنوان لأول فقرة متن بعد العنوان (انظر الحقل `dropCap` في [تجاوزات كل مستوى](https://postext.dev/ar/docs/configuration-text.md#تجاوزات-كل-مستوى) و[أنماط الفقرات](https://postext.dev/ar/docs/configuration-styles.md#أنماط-الفقرات) و[أنماط العناوين](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين)). ويُبحث عن الفقرة التي تلي العنوان متجاوزًا أسيجة الحاويات والتوجيهات والإطارات التي خرجت من التدفق والأشكال العائمة، كما يجدها `indentAfterHeading`؛ أما الفقرة الواقعة داخل إطار أو عنصر قائمة أو اقتباس أو قصيدة أو حاشية فلا تأخذه أبدًا. وفي النص، تفعّله `{dropcap}` وتعطّله `{dropcap=false}` وتحدّد أسطره `{dropcap=N}` لذلك الفصل أو لتلك المجموعة، حين تُكتب في سطر عنوان أو في سياج `:::paragraphs` (انظر [صيغة المستند › الحروف الاستهلالية](https://postext.dev/ar/docs/document-format.md#الحروف-الاستهلالية)). منذ postext 1.23.

```ts
headings: {
  levels: [
    { level: 1, dropCap: { lines: 3, fontFamily: 'Libre Bodoni', fontWeight: 700, color: { hex: '#8b2e2a', model: 'hex', paletteId: 'accent' }, leadIn: { words: 3 } } },
  ],
},
```

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `lines` | `number` | `3` | عدد الأسطر التي يمتد عليها الحرف الاستهلالي، من أعلى حروفه الكبيرة إلى خط أساسه. والقيمة `1` مع `fontSize` أكبر تعطي حرفًا استهلاليًا بارزًا يقف على خط الأساس الأول. |
| `sink` | `number` | `lines` | عدد الأسطر التي ينزلها الحرف في النص: يقف على خط أساس السطر رقم `sink`، وتقصر تلك الأسطر. والقيمة الأقل من `lines` ترفعه فوق السطر الأول. |
| `characters` | `number` | `1` | عدد العناقيد الحرفية (grapheme clusters) التي تُنضَّد كبيرة: يُعدّ واحدًا كلٌّ من *É*، والحرف مع علامة مركّبة عليه، والمحرف الواقع خارج المستوى متعدد اللغات الأساسي. ولا تتجاوز الكلمة الأولى. |
| `fontFamily`، `fontWeight`، `italic` | `string`، `number`، `boolean` | قيم الفقرة؛ `false` | خط الحرف الاستهلالي. يُحمَّل ويُضمَّن مع بقية خطوط المستند. |
| `fontSize` | `Dimension` | انظر أدناه | حجم الحرف الاستهلالي. إن لم يُحدَّد: الحجم الذي يجعل أعلى حروفه الكبيرة في مستوى الحروف الكبيرة للسطر الأول وهو قائم على بعد `lines` أسطر إلى الأسفل. |
| `color` | `ColorValue` | لون الفقرة | اللون المرتبط بلوحة الألوان يتبع لوحات ألوان الأجزاء والأقسام. |
| `gap` | `Dimension` | `0.15em` | المسافة بين الحرف الاستهلالي والأسطر المقصّرة، و`em` هو حجم النص. |
| `punctuation` | `'with-cap' \| 'hang' \| 'text'` | `'with-cap'` | علامة تنصيص افتتاحية أو `¿` أو `¡` أو قوس قبل الحرف: تُنضَّد كبيرة جزءًا من الحرف الاستهلالي، أو تُعلَّق بحجم النص خارج عرض السطر قبله، أو تُنضَّد بحجم النص في أول السطر الأول، بعد الحرف الاستهلالي. |
| `leadIn` | `{ words, smallCaps, uppercase }` | لا شيء | أول `words` كلمات بعد الحرف الاستهلالي بحروف كبيرة مصغّرة (الافتراضي) أو بحروف كبيرة (`uppercase: true`)؛ و`words: 'line'` تأخذ كلمات السطر الأول. وكلمات استهلال السطر الأول تُعدّ في تنضيد أول وتُنضَّد في تنضيد ثانٍ: فبالحروف الكبيرة المصغّرة قد يتسع السطر عندئذ لكلمة أخرى، تُنضَّد كما كُتبت. |
| `shortParagraph` | `'reserve' \| 'shrink' \| 'skip'` | `'reserve'` | فقرة أسطرها أقل من `sink`: تُبقى الكتلة بارتفاع `sink` أسطر كي تتجاوز الكتلة التالية الحرف الاستهلالي، أو يُصغَّر الحرف الاستهلالي إلى أسطر الفقرة نفسها، أو تُنضَّد الفقرة بلا حرف استهلالي. وكل حالة تُطلق تحذير المحتوى `dropCap`. |
| `each` | `boolean` | `false` | لأنماط الفقرات وحدها: تُفتتح كل فقرة من المجموعة بالحرف الاستهلالي، لا الأولى وحدها. |

كيف يُنضَّد الحرف:

- **الحجم.** يُقاس ارتفاعا الحروف الكبيرة، للنص وللحرف الاستهلالي، من خطّيهما (حبر الحرف `H`؛ وحبر الحرف الاستهلالي نفسه في النص الصيني أو الياباني)، والخط الذي لا يعطي مقاييس الحبر تُحتسب حروفه الكبيرة 0.72 من حجمه. والحجم الافتراضي يناسب أي زوج من الخطوط، فلا حاجة إلى تصحيح لكل خط. أما `dropCap` في النص التصميمي فيحتفظ بقيمته الثابتة 0.72 (انظر [عناصر النص](https://postext.dev/ar/docs/configuration-page-layout.md#عناصر-النص)).
- **الحرف وكلمته.** يأخذ الحرف الاستهلالي عناقيد حرفية كاملة. ويتابع باقي الكلمة الأولى بعده بلا مسافة؛ والكلمة ذات الحرف الواحد (*A*، *Y*) تحتفظ بالمسافة التي تليها في أول السطر الأول. وتسقط إزاحة السطر الأول الخاصة بالفقرة. ويقرأ النسخُ والبحث وخريطة المصدر ومؤشر الكتابة في Sandbox الفقرةَ كما كُتبت: النص المجرّد للكتلة يشمل الحرف، و`plainStart` للسطر الأول يُعدّ بعده، و`VDTBlock.dropCap` يحمل مداه وهندسته في الجزء الذي فيه السطر الأول.
- **الحرف الاستهلالي البارز** (`lines: 1` مع `fontSize` أكبر، أو `sink` أقل من `lines`) يعلو فوق السطر الأول، وتُبقي الفقرة ذلك الارتفاع خاليًا فوقها، بأسطر شبكة كاملة، فلا يُطبع فوق النص الذي يسبقها.
- **الكسر.** لا تنكسر الفقرة أبدًا قبل السطر رقم `sink`: بل تنتقل كاملة إلى العمود أو الصفحة التالية، إلا إذا كانت وحدها في عمود فارغ لا يتسع لتلك الأسطر، فتنكسر مع ذلك وتُطلق تحذير `dropCap`. والعنوان المُبقى مع نصه يُبقي تلك الأسطر تحته. والجزء الذي يتابع في العمود التالي لا حرف استهلاليًا فيه، وأسطره بالعرض الكامل؛ وإذا انكسرت الفقرة مرة أخرى لعمود بعرض آخر، احتفظت أسطرها الأولى بإزاحتها. ويجوز لموازنة الأعمدة أن ترخي الفقرة أو تشدّها كأي فقرة أخرى، ولا تضيف أبدًا فراغًا بين الأسطر المقصّرة.
- **أنظمة الكتابة.** تقصر الأسطر من جهة البداية: اليسار في النص اللاتيني، واليمين في العربية والعبرية. والحرف الذي يتصل بما بعده (العربية والسريانية وإنكو) لا يُفصل، وتُطلق الفقرة تحذير `dropCap`؛ وتأخذ الصينية واليابانية الأفقيتان حرفًا استهلاليًا من محرف واحد (首字下沉). ولا يأخذه النص العمودي (مع تحذير). ولا تأخذه كذلك الفقرة التي لا تُفتتح بحرف ولا برقم (إحالة، أو صيغة، أو علامة حاشية) (مع تحذير).
- **المخرجات.** ترسم Canvas وعارض HTML وEPUB الثابت التخطيط الحرفَ الاستهلالي بجوار الأسطر؛ ويكتبه HTML مباشرةً قبل نص السطر الأول بلا فاصل بينهما، فيقرأ قارئ الشاشة الكلمة كاملة. وفي ملف PDF الموسوم يكون الحرف الاستهلالي جزءًا من `P` الخاص بالفقرة، ويكون مع باقي كلمته `Span` قيمة `/ActualText` فيه هي الكلمة: فيقرأ استخراج النص *Long before*، ولا يقرأ *L ong before* أبدًا. ويضبطه EPUB القابل لإعادة التدفق بخاصية CSS `initial-letter` (الأسطر والنزول)، ويجعله عائمًا حيث لا يدعمها نظام القراءة.

تُفحص هذه الإعدادات مع بقية الإعدادات (انظر [تحذيرات الإعدادات](https://postext.dev/ar/docs/configuration-fonts-colors-viewers.md#تحذيرات-الإعدادات)): يُبلَّغ عن المفتاح غير المعروف في الحرف الاستهلالي أو في كلمات استهلاله بوصفه `unknownConfigKey`، وعن `punctuation` أو `shortParagraph` الذي ليس إحدى كلماته، أو `lines` أو `sink` أو `characters` الذي ليس عددًا صحيحًا من 1 فصاعدًا، بوصفه `unknownConfigValue`، وتُستخدم القيمة الافتراضية. والحروف الاستهلالية معطّلة افتراضيًا، فلا يتغيّر أي مستند محفوظ.

### عائلة واحدة لكل `fontFamily`

`fontFamily` — هنا وفي كل حقل آخر لعائلة الخط (`headings.fontFamily`، و`tableStyle.bodyFontFamily`، و`separatorFontFamily`، و`fontFamily` لنمط شارة أو لعنصر تصميم…) — يسمّي عائلة **واحدة**. فمخرجات Canvas وHTML وPDF يجب أن تنضّد الوجه نفسه، وPDF يضمّن خطًا واحدًا لكل عائلة بلا سلسلة بدائل، فلا يوجد ما ترجع إليه سلسلة خطوط CSS. السلسلة تُنضَّد بعائلتها الأولى ويُبلَّغ عنها [تحذيرَ إعدادات](https://postext.dev/ar/docs/configuration-fonts-colors-viewers.md#تحذيرات-الإعدادات):

```ts
bodyText: { fontFamily: "'EB Garamond', Georgia, serif" } // set in EB Garamond
```

حمّل تلك العائلة قبل الإخراج (انظر [الخطوط المخصّصة](https://postext.dev/ar/docs/configuration-fonts-colors-viewers.md#الخطوط-المخصّصة) ومزوّد الخطوط في [إنتاج ملفات PDF](https://postext.dev/ar/docs/configuration-programmatic-usage.md#توليد-ملفات-pdf))؛ وإن كانت غائبة، يقيس المتصفح بخطه الافتراضي، أيًّا كان ما تقوله بقية السلسلة. الفاصلة داخل علامات التنصيص جزء من الاسم (`'"Foo, Bar"'` عائلة واحدة).

### تقسيم الكلمات بالواصلة

حين تُضبط محاذاة النص على `'justify'`، يمنع التقسيم بالواصلة الإفراط في تباعد الكلمات بكسر الكلمات الطويلة عند حدود المقاطع. يستخدم المحرّك أنماط TeX/Liang لإيجاد نقاط الكسر الطبيعية عند حدود المقاطع. انظر [تقسيم الكلمات وضبط الأسطر](https://postext.dev/ar/docs/justification.md) لشرح مفصّل. ولا يُقسَّم النص غير المضبوط إلا إذا طلبت ذلك: انظر [النص غير المضبوط](https://postext.dev/ar/docs/configuration-text.md#النص-غير-المضبوط) أدناه.

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `true` | ما إذا كان التقسيم بالواصلة مسموحًا. |
| `locale` | `LocaleTag` | `locale` في المستوى الأعلى، وإلا `'en-us'` | قواعد اللغة لحدود المقاطع: إحدى اللغات المدعومة أدناه، أو أي وسم BCP 47 (`'es-ES'`، `'pt-BR'`). |
| `ragged` | `boolean` | `false` | قسّم بالواصلة النص غير المضبوط أيضًا (المحاذى إلى اليسار أو اليمين أو الوسط)، ضمن `zone`. انظر [النص غير المضبوط](https://postext.dev/ar/docs/configuration-text.md#النص-غير-المضبوط). |
| `zone` | `Dimension` | `3em` | منطقة التقسيم بالواصلة في النص غير المضبوط: لا تُقسَّم الكلمة التي لا يتّسع لها السطر إلا حين يترك إرسالها كاملة إلى السطر التالي فراغًا أعرض من هذا. وحدة `em` نسبية إلى حجم خط النص نفسه. تُتجاهَل في النص المضبوط. |
| `compounds` | `boolean` | `true` | اسمح للقاموس بتقسيم أجزاء الكلمة المركّبة، وهي كلمة فيها واصلة بين حرفين (`af-ter-dinner`). القيمة `false` تُبقي هذه الكلمة كاملة إلا عند واصلتها الخاصة، حيث يظل جائزًا أن ينتهي السطر (`after-` · `dinner`)، كما يفعل TeX. الواصلة الاختيارية (soft hyphen) المكتوبة في الكلمة تظل تكسرها، والكلمة المركّبة الأعرض من السطر كله تظل تُقسَّم. ينطبق على النص الجاري والعناوين والقوائم والاقتباسات الكتلية والأطر؛ أما تعليقات الأشكال والملاحظات وخلايا الجداول وجدول المحتويات فتظل تقسّم الكلمات المركّبة. انظر [الكلمات المركّبة](https://postext.dev/ar/docs/justification.md#الكلمات-المركّبة). |

**اللغات المدعومة:** `'en-us'` (الإنجليزية)، `'es'` (الإسبانية)، `'fr'` (الفرنسية)، `'de'` (الألمانية)، `'it'` (الإيطالية)، `'pt'` (البرتغالية)، `'ca'` (الكتالونية)، `'nl'` (الهولندية).

تُتجاهَل الوسوم الفرعية للمنطقة ونظام الكتابة والمتغيّر عند اختيار الأنماط، وكذلك حالة الأحرف والفاصل `_`: فـ `'es-ES'` و`'es-MX'` و`'es_419'` تُقسَّم بأنماط `'es'`، و`'pt-BR'` بأنماط `'pt'`، وكل وسم إنجليزي (`'en'`، `'en-GB'`) بأنماط `'en-us'` — وهي الأنماط الإنجليزية الوحيدة المضمَّنة، فينال النص البريطاني نقاط كسر أمريكية. واللغة التي لا أنماط مضمَّنة لها (`'sv'`، `'pl'`، `'fi'`…) تُقسَّم بأنماط `'en-us'`، وهذا يعطي نقاط كسر خاطئة لا انعدامها؛ ويبلّغ المحرّك عن ذلك مرة واحدة لكل وسم عبر `console.warn`، ويُدرجه Sandbox في لوحة «الفحوص». اضبط `enabled: false` لمثل هذا المستند؛ فذلك يُسكت التحذير أيضًا. أما الصينية واليابانية والكورية (`zh`، `ja`، `ko`، أيًّا كانت المنطقة أو نظام الكتابة) فلا تحتاج إلى أنماط ولا تطبع تحذيرًا: المستند المكتوب بإحداها يُنضَّد بلا تقسيم بالواصلة. ولتقسيم الكلمات اللاتينية المقتبسة فيه، اضبط `enabled: true` وسمِّ لغتها في `locale` (`'en-us'` للإنجليزية). أما `enabled: true` بلا `locale`، أو مع لغة صينية أو يابانية أو كورية، فيترك التقسيم معطّلًا ويقول ذلك مرة واحدة في وحدة التحكم (console). تعيد `matchHyphenationLocale(tag)` اللغة المضمَّنة التي يُطابقها الوسم (`undefined` حين لا توجد)، وتُدرج `HYPHENATION_LOCALES` اللغات المضمَّنة. وتسمّي الإعدادات المحلولة (`doc.config.bodyText.hyphenation`) الأنماط المستخدمة فعلًا في `locale`، وتحتفظ بالوسم الذي أعطيته في `tag` حين يختلف. ويعلن مُخرِج PDF لغة المستند من `locale` في المستوى الأعلى، ومن هذا الوسم فقط حين لا يكون `locale` مضبوطًا (انظر [لغة المستند](https://postext.dev/ar/docs/configuration-text.md#لغة-المستند)).

```ts
import { matchHyphenationLocale } from 'postext';

matchHyphenationLocale('es-MX'); // 'es'
matchHyphenationLocale('en-GB'); // 'en-us'
matchHyphenationLocale('sv');    // undefined: hyphenated with 'en-us', with a console warning
```

لا تُقسَّم أبدًا الكلمات الأقصر من 5 أحرف. ويشترط المحرّك حرفين على الأقل قبل نقطة الكسر و3 أحرف بعدها.

#### النص غير المضبوط

افتراضيًا لا يُقسَّم بالواصلة إلا النص المضبوط: مع `textAlign: 'left'`، وفي أنماط الفقرات المحاذاة إلى اليسار أو الوسط أو اليمين، تبقى كل كلمة كاملة مهما ازدادت الحافة تعرّجًا، إلا عند واصلة اختيارية (U+00AD) مكتوبة في النص. اضبط `hyphenation.ragged: true` لتقسيم النص غير المضبوط أيضًا.

لا يُمدَّد السطر غير المضبوط أبدًا، فتقسيم كل كلمة لا يتّسع لها السطر سيملأ الحافة بالواصلات. وتحدّ من ذلك **منطقة التقسيم بالواصلة**، كما يفعل مُنضِّد السطر الواحد في برامج النشر المكتبي. حين لا تتّسع كلمة في آخر السطر، ينظر المحرّك إلى الفراغ الذي سيتركه إرسالها كاملة إلى السطر التالي. فإن كان ذلك الفراغ أعرض من `zone`، تُقسَّم الكلمة عند آخر مقطع يتّسع؛ وإلا نزلت كاملة. المنطقة المقيسة بـ `em` نسبية إلى حجم خط النص نفسه. القيمة الافتراضية `3em` لا تقسّم إلا الكلمات التي ستترك سطرًا قصيرًا على نحو ملحوظ. والمنطقة الأعرض تعطي واصلات أقل وحافة أكثر تعرّجًا؛ والقيمة `0` تقسّم كل كلمة لا تتّسع. وفي التنضيد سطرًا سطرًا، لا ينتهي أكثر من سطرين متتاليين بمقطع. أما الواصلات الصلبة (`enseñanza-aprendizaje`) ومفاصل عناوين URL والواصلات الاختيارية المكتوبة في النص والكلمات الأعرض من السطر كله فتنكسر كما تفعل دائمًا: المنطقة وحدّ السطرين لا يحكمان إلا مقاطع القاموس.

الإعداد على مستوى المستند كله. ينطبق على نص المتن والاقتباسات الكتلية حين تكون غير مضبوطة، وعلى كل نمط فقرة غير مضبوط ومتن إطار يكون `hyphenation` الخاص به مفعّلًا (وقيمته الافتراضية هي `hyphenation.enabled` الخاصة بالمتن)، فالقيمة `hyphenation: false` تُبقي كلمات نمطٍ واحد كاملة. لا تُقسَّم العناوين وتعليقات الأشكال والملاحظات وخلايا الجداول وجدول المحتويات؛ وهناك، كما في كل موضع، لا تُقسَّم إلا الكلمة الأعرض من عرض السطر كله. أما نص التصميم — الترويسات وصفحات الافتتاح وصفحات الأجزاء — فيتبع علامة `hyphenate` الخاصة بكل عنصر نصي، التي تضبطها صفحات الافتتاح الكاملة وصفحات الأجزاء المضمَّنة، ويستخدم قاموس المستند أيضًا. ويتجاهل النص المضبوط `ragged` و`zone`.

```ts
const config: PostextConfig = {
  locale: 'es',
  bodyText: {
    textAlign: 'left',
    // A little more hyphenation than the 3 em default.
    hyphenation: { ragged: true, zone: { value: 2, unit: 'em' } },
  },
};
```

مع `optimalRagged` (القيمة الافتراضية) يُكسر النص الجاري غير المضبوط بخوارزمية Knuth-Plass، وتحتفظ المنطقة بمعناها هناك: لا تُقسَّم الكلمة إلا حين لا يتّسع لها باقي السطر ويترك إنزالها كاملة أكثر من المنطقة فارغًا. ولا يُرفض مقطعان متتاليان، لكنهما يكلّفان ما تكلّفه واصلتان متتاليتان في النص المضبوط، فيندر الثالث. ومع `optimalRagged: false`، أو `optimalLineBreaking: false`، يُملأ كل سطر قبل الذي يليه، كما حتى postext 1.4.

يُخرج التقسيمُ بالواصلة للنص غير المضبوط الفقراتِ بكاسر الأسطر الذي تستخدمه دائمًا الفقرات ذات التنسيق المضمَّن (العريض والمائل والروابط والرياضيات)، فتفعيله قد يحرّك بضع نقاط كسر غير الواصلات. في السطر غير المضبوط، وإلى جانب المسافات ومقاطع القاموس، يكسر ذلك الكاسر بعد واصلة صلبة أو شرطة بين كلمتين (`largas—separadas`؛ ومع `breakAfterDashes`، بعد أي شرطة منضَّدة ملتصقة بين كلمتين، و`riddles.—I` و`riddles—*and*` أيضًا)، وعند مفاصل عناوين URL وبين الرموز الإيديوغرافية، ويُبقي معًا الكلمة المنضَّدة في عدة مقاطع (`**Nota**:`، `(*véase*`). ومن دون التقسيم بالواصلة للنص غير المضبوط، تكسر Knuth-Plass الفقرة غير المضبوطة الخالية من التنسيق حين يكون `optimalRagged` مفعّلًا (القيمة الافتراضية): عند المسافات بين الكلمات، وبعد واصلة صلبة بين حرفين (`meta-` · `analyses`)، كما يفعل الكاسر الآخر، ومع `breakAfterDashes`، بعد الشرطات الملتصقة. وفي التنضيد سطرًا سطرًا، تمرّ الفقرة عبر كاسر pretext، الذي يختلف في ثلاثة أمور: قد يكسر أيضًا قبل شرطة تُغلق جملة اعتراضية أو بعد شرطة تفتحها (`él` · `— y`)، وبعد الشرطة المائلة عند التقسيم بالواصلة (`km/` · `h`)، ويقطع الكلمة الأعرض من السطر عند أي حرف بلا واصلة، حيث يقسّمها الكاسر الآخر عند مقطع أولًا.

في Sandbox، المفتاح هو **قسّم النص غير المضبوط بالواصلة**، تحت محاذاة الفقرة في قسم نص المتن، والمنطقة تحته. وتحت متنٍ مضبوط يقع المفتاح نفسه مع إعدادات ضبط الأسطر، لأنماط الفقرات والأطر غير المضبوطة.

### لغة المستند

`locale` في المستوى الأعلى هو لغة المستند ككل. يأخذ القيم نفسها التي يأخذها `hyphenation.locale`، وهو البديل حين لا يكون ذلك الحقل مضبوطًا، فلا يحتاج كتاب إسباني إلا إلى `locale: 'es'` ليُقسَّم بالواصلة بالإسبانية. ويختار أيضًا لغة عبارات الاستمرار المضمَّنة في الجداول والأطر المقسومة (`(cont.)` / *Continued* مقابل *Continúa*، انظر [الجداول الأطول من الصفحة](https://postext.dev/ar/docs/configuration-resources.md#الجداول-الأطول-من-الصفحة) و[العلامات على الإطار المقسوم](https://postext.dev/ar/docs/configuration-styles.md#علامات-الإطار-المقسوم)) ولغة أرقام العناوين المكتوبة بالحروف (*Chapter One* مقابل *Capítulo uno*، انظر [الأرقام المكتوبة بالحروف](https://postext.dev/ar/docs/configuration-text.md#الأعداد-المكتوبة-بالحروف))، وهو اللغة التي يُوسَم بها ملف PDF الميسَّر الوصول. إن لم يُضبط، يفترض المحرّك `'en-us'`؛ ويرجع Sandbox إلى لغة الواجهة ويضبط الحقل تحت **التصميم › نظام الكتابة**.

ويختار أنواع الموارد المضمَّنة أيضًا. حين لا يكون `resourceTypes` مضبوطًا، يرقّم `buildDocument` ويكتب التعليقات باستخدام `defaultResourceTypes(locale)`، فيعطي `locale: 'de'` وحده *Abbildung 1.1* و*Tabelle 1.1*. وحين لا يكون `locale` مضبوطًا، تحلّ محلّه لغة التقسيم بالواصلة، لأنواع الموارد ولعبارات الجداول على السواء. وقائمة `resourceTypes` الصريحة تغلب دائمًا. كانت الإصدارات السابقة تستخدم الأنواع الإنجليزية أيًّا كان `locale` ما لم تمرّر `defaultResourceTypes(locale)` بنفسك؛ والمستند الذي يضبط `locale` ويريد الاحتفاظ بالتسميات الإنجليزية يمرّر `resourceTypes: defaultResourceTypes('en')`. كتب Sandbox والحزم تحمل قائمتها الخاصة، فلا تتأثر.

أي وسم BCP 47 يصلح هنا كما في `hyphenation.locale`: فـ `'de-AT'` ينال العبارات الألمانية. العبارات المضمَّنة موجودة باللغات الثماني التي يدعمها التقسيم بالواصلة، وبالصينية (بالحروف المبسّطة والتقليدية)، وباليابانية، وبالعربية؛ وأي لغة أخرى تنال العبارات الإنجليزية.

تقبل الصينية `zh` و`zh-Hans` و`zh-Hant` و`zh-CN` و`zh-SG` و`zh-TW` و`zh-HK` و`zh-MO` والصيغ الطويلة (`zh-Hant-TW`)، بأي حالة أحرف ومع `-` أو `_`. تتبع العبارات نظامَ الكتابة، مقروءًا بـ `Intl.Locale(tag).maximize()`: `zh` و`zh-CN` و`zh-SG` مبسّطة، و`zh-TW` و`zh-HK` و`zh-MO` تقليدية. أما الإعدادات الطباعية الافتراضية التي تعتمد على اللغة فتتبع المنطقة بدلًا من ذلك، كما يوصي [clreq §1.2](https://www.w3.org/TR/clreq/#x1-2-basic-features-of-chinese-script): تُعدّ CN و SG و MY البرَّ الرئيسي، و TW تايوان، و HK و MO هونغ كونغ، والوسم الذي لا منطقة فيه يُؤخذ بنظام كتابته (`zh-Hant` تايوان، و`zh` و`zh-Hans` البر الرئيسي). وتقبل اليابانية `ja` و`ja-JP` و`ja-Jpan` وأي وسم `ja` آخر (`isJapaneseLanguage(tag)`)؛ ومنذ postext 1.16 لها عباراتها الخاصة ومنطقتها الخاصة، `japan`، التي تتبع إعداداتها الطباعية الافتراضية JLReq (انظر [الإخراج الياباني](https://postext.dev/ar/docs/japanese-layout.md)). وجدول العبارات الذي لا مدخل ياباني فيه يعطي الإنجليزية، ولا يعطي الصينية أبدًا. تعطي `localeScript(tag)` و`cjkRegionOf(tag)` و`stringsKeyOf(tag)` و`sameContentLocale(a, b)` هذه القراءات، وتُدرج `DOCUMENT_LANGUAGES` اللغات ذات العبارات المضمَّنة، كلٌّ منها باسمها في لغتها (日本語 بين المداخل الصينية والعربية)، كما تعرضها قائمة «لغة المستند» في Sandbox.

| اللغة | الشكل: الاسم، الجمع، التسمية المختصرة | الجدول: الاسم، الجمع، التسمية المختصرة | استمرار الجدول: `continuedSuffix`، `continuesMarker` |
| --- | --- | --- | --- |
| الإنجليزية (`en`) | Figure, Figures, Fig. | Table, Tables, Tab. | (cont.), Continued |
| الإسبانية (`es`) | Figura, Figuras, Fig. | Tabla, Tablas, Tabla | (cont.), Continúa |
| الفرنسية (`fr`) | Figure, Figures, Fig. | Tableau, Tableaux, Tabl. | (suite), À suivre |
| الألمانية (`de`) | Abbildung, Abbildungen, Abb. | Tabelle, Tabellen, Tab. | (Forts.), Wird fortgesetzt |
| الإيطالية (`it`) | Figura, Figure, Fig. | Tabella, Tabelle, Tab. | (segue), Continua |
| البرتغالية (`pt`) | Figura, Figuras, Fig. | Tabela, Tabelas, Tab. | (cont.), Continua |
| الكتالونية (`ca`) | Figura, Figures, Fig. | Taula, Taules, Taula | (cont.), Continua |
| الهولندية (`nl`) | Figuur, Figuren, Fig. | Tabel, Tabellen, Tab. | (vervolg), Wordt vervolgd |
| الصينية المبسّطة (`zh-Hans`، `zh`، `zh-CN`) | 图, 图, 图 | 表, 表, 表 | （续）, 接下页 |
| الصينية التقليدية (`zh-Hant`، `zh-TW`، `zh-HK`) | 圖, 圖, 圖 | 表, 表, 表 | （續）, 接下頁 |
| اليابانية (`ja`، `ja-JP`) | 図, 図, 図 | 表, 表, 表 | （続き）, 次ページへ続く |
| العربية (`ar`، `ar-EG`، `ar-MA`…) | شكل, أشكال, شكل | جدول, جداول, جدول | (تابع), يتبع |

بادئة التعليق هي اسم النوع (*Figure 1.1.*). ترقّم الأنواع الصينية داخل الفصل بواصلة، `{h1}-{n}` (图 1-1)؛ ومع إعدادَي التعليق `labelNumberGap: ''` و`labelSeparator: '　'` يصبح التعليق 图1-1　标题 (انظر [نمط التعليق](https://postext.dev/ar/docs/configuration-resources.md#نمط-التعليقات)). ويتبع الفهرس الأبجدي في آخر الكتاب اللغةَ أيضًا: 见 و另见 قبل الإحالة، و符号 و数字 فوق الرموز والأرقام في المبسّطة؛ و見 و另見 و符號 و數字 في التقليدية. وترقّم اليابانية أنواعها بالطريقة نفسها وتجعل تعليقاتها 図1-1　題 دون هذين الإعدادين، وتكتب الإحالات على هيئة 第3章 و2.3節 و12ページ، وتعنون قائمة المراجع بـ 参考文献، ويطبع فهرسها 記号 و数字 فوق الرموز والأرقام ويكتب إحالاته بسهم، `→夏目漱石` لـ *انظر* و`→夏目漱石、森鷗外も見よ` بعد الصفحات لـ *انظر أيضًا*، والتسميات قائمة. وترقّم العربية أنواعها بالطريقة نفسها، `{h1}-{n}` (شكل 2-3)، وتكتب الإحالات على هيئة «الفصل 3» و«القسم 2-1» و«ص 12»، وتعنون قائمة المراجع بـ «المراجع»، ويطبع فهرسها «انظر» / «انظر أيضًا» و«رموز» و«أرقام»، بالفاصلة والفاصلة المنقوطة العربيتين (، ؛).

يعلن المستند الصيني أو الياباني أو الكوري لغته في مخرجات HTML (`lang` على الجذر `.pt-doc`، مع الإبقاء على `zh-Hant-TW` كاملًا) وعلى اللوحة التي يرسمها (`ctx.lang`، في Chrome 136 وما بعده)، فيرسم المتصفح أشكال الحروف الخاصة بالمنطقة: يوحّد Unicode محارف الهان، ونقطة الترميز الواحدة تبدو مختلفة في خط تايواني وفي خط ياباني. ولا تحمل المستندات الأخرى `lang`، كما كان من قبل. ويعلن ملف PDF القيمة `/Lang` من `locale` لكل مستند، موسومًا كان أو غير موسوم، مع نظام كتابته ومنطقته. والمستند المكتوب بلغة تُكتب من اليمين إلى اليسار (العربية والفارسية والأردية والعبرية…) يعلن لغته أيضًا: أشكال الحروف الخاصة باللغة في الخط (`locl`) والخط البديل يتبعانها.

```ts
const config: PostextConfig = {
  locale: 'es',
  bodyText: { textAlign: 'justify', hyphenation: { enabled: true } }, // hyphenates in Spanish
};
```

#### أرقام المستند

يضبط `numerals` في المستوى الأعلى أرقامَ كل عدد يكتبه المحرّك: أرقام الصفحات وتسميات الصفحات في جدول المحتويات والفهرس الأبجدي والإحالات إلى الصفحات؛ وأرقام القوائم المرقّمة والحواشي السفلية؛ وعدّادات العناوين والفصول، و`{chapterNumber}`؛ و`{h1}` و`{n}` في رقم الشكل وفي الإحالة إليه؛ و`{totalPages}` و`{bookTotalPages}` و`{numberDecimal}`. القيمة `'latn'` تكتب 0–9، و`'arab'` الأرقام الهندية العربية ٠–٩، و`'arabext'` الأرقام الفارسية ۰–۹. لا يتغيّر إلا التنسيق العشري — `decimal`، أو `arabic` في القوائم، أو إعداد متروك على قيمته الافتراضية — فالتنسيق الذي يسمّيه المؤلف يُطبع كما سُمّي: `lower-roman` يبقى i, ii, iii، و`arabic-indic` في مستند لاتيني يظل يكتب ١, ٢, ٣. ولا يُعاد أبدًا كتابة نص المستند.

القيمة الافتراضية، `'auto'`، تأخذ أرقام `locale` (`defaultNumeralsFor(tag)`): `'arab'` للعربية بلا منطقة أو مع أي منطقة خارج المغرب العربي (`ar`، `ar-EG`، `ar-SA`، `ar-AE`…)، و`'latn'` لـ `ar-MA` و`ar-DZ` و`ar-TN` و`ar-LY` و`ar-MR` و`ar-EH`، و`'arabext'` للفارسية (`fa`) والبشتوية (`ps`) وأردية الهند (`ur-IN`)، و`'latn'` لكل ما سوى ذلك، ومنه أردية باكستان. تعطي CLDR القيمة `latn` للوسم `ar` المجرّد وللوسم `ar-AE`؛ لكن الكتب العربية في المشرق والخليج تطبع ٠–٩، وهذا ما يتبعه Postext. والوسم الذي يسمّي أرقامه يحتفظ بها: `ar-MA-u-nu-arab`. والصفحة المرقّمة بأرقام المستند تسجّل `arabic-indic` أو `persian` في `pageNumberFormat` الخاص بها، فتعرض تسميات صفحات PDF الأرقام نفسها. والقيمة غير المعروفة تتبع اللغة ويُبلَّغ عنها بـ `unknownNumerals`.

الأعداد التي يكتبها المؤلف تُقرأ بأي من الأنظمة الثلاثة: بند القائمة `٣.` يبدأ من 3، و`{startAt=٥}` و`:::numbering{startAt=٥}` و`:::space{lines=٢}` و`:::part{number="٣"}` (من أجل `{numberDecimal}`) تقرأ القيمة.

```ts
const config: PostextConfig = { locale: 'ar' };                     // ١، ٢، ٣
const maghreb: PostextConfig = { locale: 'ar-MA' };                 // 1, 2, 3
const forced: PostextConfig = { locale: 'ar', numerals: 'latn' };   // 1, 2, 3
```

#### اتجاه النص

يضبط `direction` في المستوى الأعلى الاتجاه الأساسي للمستند: `'ltr'` أو `'rtl'` أو `'auto'` (القيمة الافتراضية)، وهي `'rtl'` حين يكون نظام الكتابة في `locale` مكتوبًا من اليمين إلى اليسار (العربية والفارسية والأردية والعبرية والسريانية والثانا وإنكو وأدلام…، ويقرؤه `directionOf(tag)`)، و`'ltr'` في غير ذلك. يُخرَج المستند المكتوب من اليمين إلى اليسار في إطار معكوس: تبدأ أسطره من اليمين، وعموده الأول هو الأيمن، وتقف مسافاته البادئة وعلامات قوائمه وعناصره العائمة وحواشيه السفلية وأطره على اليمين، و[`page.binding: 'auto'`](https://postext.dev/ar/docs/configuration-page-layout.md#التجليد) يجلّده من اليمين. ولا تحمل الإعدادات المحلولة `direction: 'rtl'` إلا لمثل هذا المستند، فيُحَلّ المستند المكتوب من اليسار إلى اليمين كما كان من قبل. والقيمة غير المعروفة تُقرأ `'auto'` ويُبلَّغ عنها بـ `unknownConfigValue`. وترتّب خوارزمية Unicode ثنائية الاتجاه (UAX #9) مقاطع كل سطر في أي من الاتجاهين: فالاقتباس العربي في كتاب إنجليزي يُقرأ من اليمين إلى اليسار في موضعه.

داخل المستند، يأخذ العنوان أو الحاوية `:::` القيمة `{dir=ltr}` أو `{dir=rtl}`، ويعزل `:ltr[…]` و`:rtl[…]` المضمَّنان مقطعًا من النص (انظر [اتجاه النص في الترميز](https://postext.dev/ar/docs/document-format.md#اتجاه-النص-في-الترميز))؛ ويأخذ مورد الجدول `table.direction`. والكتلة المضبوطة بعكس اتجاه المستند تحتفظ بجانب بدايتها الخاص: تنتقل مسافتها البادئة وعلامات قوائمها والطرف المحاذى لسطرها الأخير إلى الجانب الذي يبدأ منه نصها.

الإعداد الذي يسمّي جانبًا يعني جانبًا من النص أو من تدفّق المتن، لا من الورقة أبدًا، فالتصميم المُعدّ لكتاب إنجليزي يعمل حين يُحوَّل الكتاب إلى العربية. وتُقبل `'start'` و`'end'` اسمين صريحين:

| الإعداد | `'left'` / `'right'` | `'start'` / `'end'` |
| --- | --- | --- |
| `textAlign` للمتن والعناوين وأنماط الفقرات والأجزاء والحواشي السفلية ومتون الأطر؛ و`align` للتعليق ولملاحظة التعليق | جانبا النص: `'left'` هو الجانب الذي يبدأ منه السطر، أي يمين الفقرة العربية، حيث يذهب السطر الأخير من الفقرة المضبوطة. | مرادفات لـ `'left'` و`'right'`. تحمل الإعدادات المحلولة `'left'` / `'right'`؛ وتحتفظ الإعدادات المحفوظة بما كُتب. |
| `align` لخلية الجدول | جانبا نص الخلية، مقروءين باتجاه الجدول (`table.direction`). | مرادفات، مقروءة باتجاه الجدول. |
| `placement.align` (العناصر العائمة، الأشكال الضيقة) | جانبا تدفّق المتن: في كتاب مكتوب من اليمين إلى اليسار، `'left'` هو يمين الورقة. | مرادفات. |
| `stripe.side` و`icon.cornerSide` و`labelTab.position` للإطار (`'top-start'`، `'top-end'`) | جانبا تدفّق المتن، وهما نفسهما لكل إطار في الصفحة. | اتجاه الإطار الخاص (`:::callout{dir=ltr}` في كتاب عربي يبدأ من يسار الورقة). |
| خانات رأس الصفحة وتذييلها؛ وعناصر التصميم المثبّتة إلى الورقة | جانبا الورقة. | للعناصر النصية فقط: بداية `direction` الخاص بالعنصر ونهايته. |

يحتفظ `placement.rotate` بمعناه المادي في الصفحة المعكوسة: الشكل المُدار باتجاه عقارب الساعة يُدار باتجاه عقارب الساعة على الورقة. والمضيف الذي يقرأ الإخراج يجد الإطار المعكوس في كل صفحة (`VDTPage.flow` مع `direction: 'rtl'`، و`pageIsMirrored(page)`) والترتيب البصري لمقاطع كل سطر في `VDTLine.order`؛ وتحوّل `flowToPage` و`pageToFlow` بين التدفّق والورقة. انظر [الإخراج العربي](https://postext.dev/ar/docs/arabic-layout.md#الاتجاه-وخوارزمية-النص-ثنائي-الاتجاه).

```ts
const arabic: PostextConfig = { locale: 'ar' };                        // right to left, bound on the right
const english: PostextConfig = { locale: 'en', direction: 'rtl' };     // forced; rarely what you want
```

### اللغات وأنظمة الكتابة

ينضّد Postext أنظمة الكتابة الأبجدية المكتوبة من اليسار إلى اليمين، والصينية واليابانية أفقيًا عبر الصفحة وعموديًا نزولًا فيها. يشرح [الإخراج الصيني](https://postext.dev/ar/docs/chinese-layout.md) و[الإخراج الياباني](https://postext.dev/ar/docs/japanese-layout.md) كيف تُنضَّدان وأيّ الإعدادات تتحكم فيهما؛ والمفاتيح تحت [طباعة شرق آسيا](https://postext.dev/ar/docs/configuration-east-asian.md#تنضيد-نصوص-شرق-آسيا) و[الكتابة العمودية](https://postext.dev/ar/docs/configuration-page-layout.md#الكتابة-العمودية) و[التجليد](https://postext.dev/ar/docs/configuration-page-layout.md#التجليد). ما يناله كل نظام كتابة:

- **الصينية** يُنضّدها مُنضِّد CJK حين تحوي الفقرة محارف CJK أكثر من المسافات بين الكلمات: تنكسر أسطرها بين المحارف وفق قواعد بداية السطر ونهايته في `cjk.lineBreak` (لا سطر يبدأ بـ 。、」 أو ー، ولا سطر ينتهي بـ 「 أو （)، وتُبقي —— و…… والعدد مع علاماته والكلمة اللاتينية كاملةً، والسطر المضبوط تُوزَّع مسافاته بين محارفه حتى يبلغ عرض السطر. وتتبع عروضُ علامات الترقيم، وعلامات الترقيم المعلّقة، والمسافة بين الهان واللاتينية، وشبكة المحارف، ونقاط التوكيد، وعلامات أسماء الأعلام وعناوين الكتب، وحواشي الروبي (ruby) والواريتشو (warichu) منطقةَ `locale`، أفقيًا أو عموديًا (`layout.writingMode: 'vertical-rl'`). والفقرة اللاتينية التي تقتبس بضع كلمات CJK تحتفظ بكسر الأسطر الأمثل وقد تنكسر بجوارها؛ أما قوس CJK أو النقطة الوسطى أو العلامة كاملة العرض المقتبسة في نص لاتيني (〈h〉، ％) فلا تغيّر شيئًا.
- **اليابانية** تمرّ عبر المُنضِّد نفسه بقواعد خاصة بها منذ postext 1.16، هي قواعد وثيقة W3C *Requirements for Japanese Text Layout* (JLReq) والمعيار JIS X 4051: فالوسم `ja` يعطي المنطقة `japan`، وقيمها التلقائية تضبط مستويات الكينسوكو في JLReq (الكانا الصغيرة و ー لا تفتتح سطرًا أبدًا)، وعلامات ترقيم كاملة العرض مع ضغط الأزواج، وem بعد ？！، والقوس الذي يفتتح الفقرة في النصف الثاني من المسافة البادئة، وعلامات توكيد سمسمية فوق النص، وعناوين كتب بين 『』، وفوريغانا موزّعة بنسبة 1:2:1، وعدّادات يابانية، وحواشي، وفهرسًا مرتّبًا بحسب النطق. وكانت الإصدارات السابقة تنضّد اليابانية بالإعدادات الافتراضية لصينية البر الرئيسي.
- **الكورية** تمرّ عبر المُنضِّد نفسه وتُنضَّد بلا تقسيم بالواصلة، لكن بالإعدادات الافتراضية لصينية البر الرئيسي: قواعدها الخاصة (KLREQ) غير مطبّقة. والنص الكوري ينكسر بين المقاطع كما ينكسر عند مسافاته.
- **العربية وأنظمة الكتابة الأخرى من اليمين إلى اليسار** (الفارسية والأردية والعبرية…) تُنضَّد من اليمين إلى اليسار: يشرح [الإخراج العربي](https://postext.dev/ar/docs/arabic-layout.md) الكيفية. يأتي [`direction`](https://postext.dev/ar/docs/configuration-text.md#اتجاه-النص) الخاص بالمستند من نظام الكتابة في `locale`، وترتّب خوارزمية Unicode ثنائية الاتجاه الكلماتِ اللاتينية والأعداد داخل كل سطر، ويُجلَّد الكتاب من اليمين وعموده الأول هو الأيمن، وكل عدد يكتبه المحرّك يأخذ [أرقام](https://postext.dev/ar/docs/configuration-text.md#أرقام-المستند) المنطقة. والكلمة التي تحوي حرفًا من الحرف العربي لا تُقسَّم بالواصلة ولا تُباعَد حروفها ولا تُقطع أبدًا، والسطر العربي المضبوط يُمدَّد عند مسافاته وبالكشيدات. علامات التشكيل والتوكيد والحواشي السفلية وعبارات العربية مشروحة تحت [النص العربي](https://postext.dev/ar/docs/configuration-text.md#النص-العربي). وتنال الفارسية والأردية والعبرية الاتجاه والأرقام وقواعد الكلمة الكاملة، لكن بلا عبارات مضمَّنة خاصة بها.

تُشحن أنماط التقسيم بالواصلة لثماني لغات (`en-us`، `es`، `fr`، `de`، `it`، `pt`، `ca`، `nl`)؛ وأنواع الموارد وعبارات الاستمرار المضمَّنة موجودة بهذه الثماني وبالصينية واليابانية والعربية. تُنضَّد الصينية واليابانية والكورية واللغات المكتوبة من اليمين إلى اليسار بلا تقسيم بالواصلة. وأي لغة أخرى تُقسَّم بأنماط الإنجليزية الأمريكية، مع تحذير في وحدة التحكم، وتنال العبارات الإنجليزية. لمثل هذا المستند، اضبط `hyphenation.enabled: false` ومرّر `resourceTypes` وعبارات الاستمرار في `tableStyle` بلغته.

### النص العربي

تخدم هذه الإعدادات النص المكتوب بالحرف العربي؛ ولا يغيّر أيٌّ منها مستندًا مكتوبًا بنظام كتابة آخر. يشرحها [الإخراج العربي](https://postext.dev/ar/docs/arabic-layout.md) مع سائر ما في الكتاب العربي: الاتجاه والتجليد والأرقام والشعر وجدول المحتويات والفهرس.

- **علامات التشكيل وتباعد الأسطر.** علامات التشكيل في النص المشكول (الفتحة والكسرة والشدة والتنوين والألف الخنجرية والعلامات القرآنية) تتراكب فوق الحروف وتحتها، داخل تباعد الأسطر، الذي لا يزداد من أجلها أبدًا. كل سطر يحوي علامات يسجّل مدى وصول حبرها (`VDTLine.markInk`)، ويشمل قصّ العمود في المُخرِجات علاماتِ السطرين الأول والأخير من العمود. وحين تلتقي علامة فوق كلمة بالحروف أو العلامات المتدلّية تحت الكلمة التي فوقها، يبلّغ البناء عن الفقرة (`arabicMarksExceedLeading`، في لوحة «الفحوص» في Sandbox). ولا تُقارَن إلا الكلمات الواقعة بعضها فوق بعض. يحتاج النص المشكول جزئيًا إلى نحو 1.7–1.85 em من `lineHeight`، والشعر المشكول كاملًا إلى 1.9–2.1 em.
- **التوكيد.** لا مائل في الحرف العربي، ففي المستند الذي تُكتب لغته `locale` بالحرف العربي يُنضَّد `*…*` بالعريض افتراضيًا (`bodyText.emphasis: 'auto'`). القيمة `'color'` تنضّده قائمًا بلون `italicColor`، و`'overline'` ترسم خطًا فوق الكلمات، وهو الخط الفوقي في الكتب العربية. يصل الإعداد إلى كل نص منضَّد بوجوه خط المتن: الفقرات والقوائم والاقتباسات الكتلية وأنماط الفقرات ومتون الأطر والملاحظات والعناوين. أما تعليقات الأشكال وخلايا الجداول وجدول المحتويات والفهرس فتحتفظ بإعدادات المائل الخاصة بها. ومهما كان الاختيار، لا يُميل المحرّك الحروف العربية أبدًا: الكلمات العربية في مقطع منضَّد بالمائل تقف قائمة، وكلماته اللاتينية تحتفظ بميلها. والاقتباس الكتلي قائم افتراضيًا في مثل هذا المستند.
- **التشكيل.** `bodyText.tashkil: 'strip'` يحذف علامات التشكيل والعلامات القرآنية من النص الذي ينضّده الإخراج، لإصدار غير مشكول يُصنع من مصدر مشكول: الفتحة والضمة والكسرة وتنوينها، والسكون، والشدة، والألف الخنجرية (هٰذا تصبح هذا) والعلامات U+0656–U+065F و U+06D6–U+06ED. والقيمة `'strip-vowels'` تُبقي الشدة، كما تطبعها معظم الكتب الحديثة. وتبقى الهمزة والمدّة (أ إ آ حروف، حتى حين تُكتب بعلامات مركّبة). يحتفظ المصدر بعلاماته؛ وتُنضَّد الأسطر والعناوين وجدول المحتويات بدونها، ويظل كل محرف منضَّد مرتبطًا بموضعه في المصدر.
- **الحواشي السفلية.** `footnotes.markerTemplate: '({n})'` يكتب العلامات «(١)» بأرقام المستند، و`numbering: 'page'` يعيد ترقيمها في كل صفحة، و`noteNumberPosition: 'inline'` ينضّد رقم الحاشية نفسها على السطر. ويقف خط الفصل وأرقام الحواشي في بداية العمود، على اليمين في الكتاب المكتوب من اليمين إلى اليسار.
- **الكلمات الكاملة.** الكلمة التي تحوي حرفًا من الحرف العربي لا تُقسَّم بالواصلة ولا تُقطع ولا تُباعَد حروفها أبدًا، في كتاب عربي أو مقتبسةً في كتاب آخر. والنمط الذي يضبط `letterSpacing` على نص عربي يُبلَّغ عنه (`joiningScriptLetterSpacing`)، والكلمة الأعرض من سطرها تفيض عنه ويُبلَّغ عنها (`unbreakableWordOverflow`). انظر [الإخراج العربي](https://postext.dev/ar/docs/arabic-layout.md#أشكال-الحروف-والكلمة-الكاملة).
- **الكشيدة والشعر.** يُمدَّد السطر العربي المضبوط بالكشيدات كما يُمدَّد عند مسافاته (`bodyText.kashida`، انظر [الكشيدة في النص العربي](https://postext.dev/ar/docs/justification.md#الكشيدة-في-النص-العربي))، وتُنضَّد القصيدة العمودية بيتًا في كل سطر، في شطرين متساويين في العرض، مع `:::verse` (انظر [`:::verse`](https://postext.dev/ar/docs/document-format.md#verse)).
- **الفهرس.** الفهرس بالعربية يُرتَّب ترتيبًا ألفبائيًا ويتجاهل أداة التعريف «ال» (`index.ignoreArticle`) وعلامات التشكيل وكراسي الهمزة؛ انظر [الفهرس الأبجدي في آخر الكتاب](https://postext.dev/ar/docs/configuration-notes-references.md#الفهرس-الأبجدي).

### الأسطر اليتيمة والأرامل والكلمات المعزولة وقواعد الإبقاء معًا

انظر [تقسيم الكلمات وضبط الأسطر](https://postext.dev/ar/docs/justification.md) لآلية نقاط الجزاء هذه. وهذا القسم هو المرجع لمفاتيح `bodyText` التي تتحكم فيها.

وإلى جانب حدود التقسيم بالواصلة والتباعد، تتيح إعدادات نص المتن القواعدَ المرنة التي تمنع الانكسارات المحرجة بنيويًا في الفقرات. وكلها تُغذّى في خوارزمية Knuth-Plass لكسر الأسطر على هيئة نقاط جزاء (demerits) — تميل بالإخراج نحو الانكسارات النظيفة دون أن تفرض قاعدة صارمة أبدًا. اضبط قيم `*Penalty` على `0` لتعطيل أيٍّ منها فعليًا.

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `avoidOrphans` | `boolean` | `true` | اثنِ الفقرة عن أن تنتهي بأقل من `orphanMinLines` سطرًا في أعلى العمود التالي. |
| `orphanMinLines` | `number` | `2` | أدنى عدد من الأسطر مطلوب في أعلى العمود التالي حين تنقسم الفقرة. لا يعمل إلا حين تكون `avoidOrphans` هي `true`. |
| `orphanPenalty` | `number` | `1000` | نقاط الجزاء المضافة عند مخالفة قيد الأسطر اليتيمة. القيم الأعلى تميل بالخوارزمية أشدّ ضد الأسطر اليتيمة؛ و`0` يعطّل الجزاء. |
| `avoidOrphansInLists` | `boolean` | `true` | حين تكون `true`، تنال بنود القوائم أيضًا الحماية من الأسطر اليتيمة (لا الفقرات وحدها). لا يكون فعّالًا إلا حين تكون `avoidOrphans` هي `true`. |
| `avoidWidows` | `boolean` | `true` | اثنِ الفقرة عن أن تبدأ بأقل من `widowMinLines` سطرًا في أسفل العمود الحالي. |
| `widowMinLines` | `number` | `2` | أدنى عدد من الأسطر مطلوب في أسفل العمود الحالي حين تنقسم الفقرة. لا يعمل إلا حين تكون `avoidWidows` هي `true`. |
| `widowPenalty` | `number` | `1000` | نقاط الجزاء المضافة عند مخالفة قيد الأسطر الأرامل. `0` يعطّل الجزاء. |
| `avoidWidowsInLists` | `boolean` | `true` | حين تكون `true`، تنال بنود القوائم أيضًا الحماية من الأسطر الأرامل. لا يكون فعّالًا إلا حين تكون `avoidWidows` هي `true`. |
| `avoidRunts` | `boolean` | `true` | اثنِ الفقرات عن الانتهاء بسطر أخير قصير جدًا — *كلمة معزولة* (runt)، كأن تقف كلمة قصيرة واحدة وحدها. والنص غير المضبوط أيضًا، مع `optimalRagged`. والفقرة الصينية أو اليابانية أو الكورية لا تنتهي بسطر يحوي محرفًا واحدًا، وحده أو مع علامات إغلاقه (孤字): يعطيه السطر الذي فوقه محرفه الأخير حين يظل ممكنًا ضبط ذلك السطر ضمن سقف التتبّع. |
| `runtMinCharacters` | `number` | `20` | عتبة السطر الأخير من الفقرة، محسوبة بالمسافات بين الكلمات لا بالحروف: يكون السطر كلمة معزولة حين يكون أضيق من `runtMinCharacters × normalSpaceWidth` بكسل. المسافة بين الكلمات ربع إلى ثلث em في معظم خطوط النصوص، أي نحو نصف حرف صغير (lowercase)، فالقيمة الافتراضية 20 تلتقط الأسطر الأخيرة الأقل من 4 إلى 7 em — نحو 8 إلى 12 حرفًا. لالتقاط الأسطر الأخيرة الأقل من نحو N حرفًا، اضبطها قرب 2 × N. |
| `runtPenalty` | `number` | `1000` | رداءة مكافئة تُحقن في صيغة نقاط الجزاء التربيعية لـ Knuth–Plass (بمقياس *رداءة* السطر (badness) نفسه، التي تتشبّع عند 10000). `0` يعطّل الجزاء. |
| `gradedRuntPenalty` | `boolean` | `false` | اجعل جزاء الكلمة المعزولة متناسبًا مع مقدار قِصَر السطر الأخير: السطر الأخير الذي عرضه *w* تحت العتبة *t* يكلّف `runtPenalty × (1 − w / t)` بدلًا من الجزاء كله. فتكلّف النهاية المكوّنة من كلمتين أقل من النهاية المكوّنة من كلمة واحدة، ويُنزل الكاسر كلمة حين يستطيع سطر أعلى التخلّي عنها ('…sallies of' / 'our minds.' بدلًا من '…sallies of our' / 'minds.'). معطّل افتراضيًا: كل كلمة معزولة تكلّف القدر نفسه، ويُبقي الكاسر الأسطر الأضيق في الأعلى. |
| `avoidRuntsInLists` | `boolean` | `true` | حين تكون `true`، تنال بنود القوائم أيضًا جزاء الكلمة المعزولة. لا يكون فعّالًا إلا حين تكون `avoidRunts` هي `true`. |
| `tightenRunts` | `boolean` | `true` | حين يعجز الجزاء عن تجنّب كلمة معزولة، نضّد الفقرة بسطر أقل بدلًا من ذلك: تضيق المسافات بين الكلمات (دون تجاوز `minWordSpacing` أبدًا)، وإن لم يكفِ ذلك وحده لاستيعاب السطر، ينضمّ قليل من التتبّع السالب. ويُرفض التنضيد الأقصر، وتبقى الكلمة المعزولة، حين يمدّ سطرًا مضبوطًا إلى ما بعد `maxWordSpacing` أو، إذا كان في الفقرة أصلًا سطر مضبوط أكثر ارتخاءً، إلى ما بعد ذلك السطر، أو حين ينضّد أسطرًا غير مضبوطة (بعد 3× المسافة العادية) أكثر مما كان في الفقرة. والمسافات بين الكلمات في النص غير المضبوط تحتفظ بعرضها، فلا يشارك هناك إلا التتبّع. يتطلب `optimalLineBreaking` و`avoidRunts` (و`optimalRagged` للنص غير المضبوط). |
| `maxRuntTracking` | `number` | `10` | أقصى تتبّع يجوز أن يأخذه إصلاح الكلمة المعزولة، بأجزاء الألف من em (وحدة InDesign: 10 = 0.01 em لكل حرف)، ويُطبَّق تضييقًا. `0` يترك الإصلاح لتباعد الكلمات وحده. |
| `slackWeight` | `number` | `10` | الوزن المطبّق على الكلفة التربيعية لـ«مساحة العمود غير المستخدمة». القيم الأعلى تجعل الإخراج يفضّل ملء الأعمدة بإحكام؛ و`0` يعطّل ضغط الفراغ تمامًا. |
| `keepColonWithList` | `boolean` | `true` | حين تنتهي فقرة بنقطتين تقدّمان قائمة مباشرة، أبقِ السطر الأخير الحامل للنقطتين متصلًا بالقائمة: إن كان وضع الفقرة لن يترك متّسعًا لبدء أول بند من القائمة في العمود أو الصفحة نفسها، يُنقل السطر الأخير (أو الفقرة كلها، إن كانت سطرًا واحدًا) إلى العمود التالي مع القائمة. ومقدار المتّسع الكافي يحدّده `colonListRoom`. وحين تدفع هذه القاعدة الفقرة كلها وتسبقها مباشرة في العمود سلسلة من العناوين، تُسحب تلك العناوين معها أيضًا ليظل `headings.keepWithNext` نافذًا. |
| `colonListRoom` | `'item' \| 'line'` | `'item'` | المتّسع الذي يطلبه `keepColonWithList` تحت سطر النقطتين. `'item'`: ما تتركه قواعد الأسطر اليتيمة والأرامل للقوائم من البند الأول في أسفل العمود، سطرًا حين يجوز أن ينقسم هناك، وكلّه حين تُبقيه كاملًا (بند من سطرين، مثلًا). `'line'`: سطر واحد، كما حتى postext 1.4؛ فالبند الأول الذي تُبقيه تلك القواعد كاملًا ينتقل حينئذ إلى العمود التالي وحده ويترك سطر النقطتين في أسفل العمود. والإعدادات المخزَّنة قبل `configVersion` 6، في كتاب يقدّم قائمة بنقطتين، تُقرأ بـ `'line'` (انظر [الحزم المكتوبة بـ postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). وأي قيمة أخرى تُقرأ `'item'`. |
| `hyphenateAcrossColumns` | `boolean` | `true` | اسمح للعمود أو الصفحة بأن ينتهي بكلمة مقسومة بالواصلة (*Hyphenate Across Column* في InDesign). القيمة `false` تعيد كسر الفقرة التي تعبر فاصل العمود، لينتهي سطرها الأخير في العمود بكلمة كاملة؛ وتمتصّ المسافاتُ بين كلمات الأسطر التي فوقه الفرقَ، ضمن `maxWordSpacing` و`minWordSpacing`. وهو تفضيل: حيث لا يتجنّبه أي كسر ضمن تلك الحدود، تبقى الواصلة. يجرّب كل فاصل عمود في الفقرة: الأول، واللاحقة التي تقع حيث ينتهي عمود ممتلئ، في إعادة كسر واحدة؛ والفاصل اللاحق الذي يقع في موضع آخر (سطر أرملة أُبقي، أو شريط قُطع عند مستوى واحد) في إعادة كسر أخرى، من ذلك العمود، تُبقي الأسطر المنضَّدة في الأعمدة السابقة عند نقاط كسرها ولا تكسر إلا الباقي. لا تتأثر متون الأطر. ومع `optimalRagged`، يُعاد كسر الفقرة غير المضبوطة بالطريقة نفسها: تحتفظ المسافات بين كلماتها بعرضها، فلا تتحرك إلا نهايات أسطرها. وكل إعادة كسر تقيس الفقرة مرة أخرى، فالكتاب الذي فيه كثير من الواصلات في نهايات الأعمدة يُخرَج أبطأ قليلًا. يتطلب `optimalLineBreaking`، و`optimalRagged` للنص غير المضبوط. |
| `paragraphContainerSpacing` | `'collapse' \| 'add'` | `'collapse'` | المسافة تحت حاوية `:::paragraphs` التي تُغلق على فقرة، بين تلك الفقرة والكتلة التي تليها (انظر [الحاوية `:::paragraphs`](https://postext.dev/ar/docs/configuration-styles.md#الحاوية-paragraphs)). `'collapse'`: الأكبر من `spaceBetween` و`marginBottom` الخاصين بالنمط ومن تباعد الفقرات في النص المحيط بالحاوية (سطر مع `paragraphSpacing`؛ وفي الإطار، تباعد الإطار)، مدمجًا مع المسافة التي تُبقيها الكتلة التالية فوقها، كما بين فقرتين من النص الجاري: فالعنوان الواقع تحت قائمة مراجع يقع على بُعد `marginTop` الخاص به تحتها، لا ذلك الهامش مضافًا إليه تباعد المدخلات. `'add'`: كما حتى postext 1.4، تُوضع مسافة النمط وحدها تحت السطر الأخير قبل المحاذاة إلى الشبكة، وتُضاف تحتها المسافة التي تُبقيها الكتلة التالية فوقها، ويُستبعد تباعد الفقرات، فقد تقع الفقرة التالية للحاوية أقرب إليها من أي فقرة أخرى. والإعدادات المخزَّنة قبل `configVersion` 8 التي تعرّف نمط فقرة، في كتاب يحوي مثل هذه الحاوية، تُقرأ بـ `'add'` (انظر [الحزم المكتوبة بـ postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). والقيمة السالبة لـ `marginBottom` تسحب الكتلة التالية إلى الأعلى في الحالتين. |

**عن الكلمات المعزولة.** الكلمة المعزولة فقرةٌ سطرها الأخير أقصر من أن يبدو سطرًا حقيقيًا من النص — عادةً كلمة أو كلمتان قصيرتان منقطعتان في آخر الفقرة. ولأن الفحص يقوم على طول السطر بالبكسل نسبةً إلى عرض المسافة العادية، يتكيّف `runtMinCharacters` تلقائيًا مع حجم الخط الحالي. الكلمة القصيرة التي تكون بصريًا أعرض من `runtMinCharacters × spaceWidth` لا بأس بها؛ أما الكلمة الأضيق من ذلك (أو المنفردة فعلًا) فتستجلب جزاء الكلمة المعزولة. تحسب العتبة المسافات بين الكلمات، وعرضها نحو نصف عرض الحروف: فالقيمة الافتراضية 20 تعني سطرًا أخيرًا من نحو 8 إلى 12 حرفًا. كل كلمة معزولة تكلّف الجزاء كله، فبين نهايتين تحت العتبة يُبقي الكاسر الأسطر الأضيق في الأعلى؛ أما `gradedRuntPenalty` فيسعّر كلًّا منهما بمقدار قصورها، فتفوز النهاية الأطول. ولمن يهمّه الحساب: عند القيمة الافتراضية 1000 لـ `runtPenalty`، يغلب تجنّبُ الكلمة المعزولة أيَّ مجموعة نقاط كسر بديلة تتطلب تمدّدًا في تباعد الكلمات حتى نحو r≈2.15.

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

## العناوين

تتحكم الخاصية `headings` في طباعة كل مستويات العناوين (H1–H6). يمكنك ضبط قيم افتراضية عامة تسري على كل المستويات، ثم تجاوز خصائص بعينها لكل مستوى.

### القيم الافتراضية العامة

| الخاصية | النوع | الافتراضي | الوصف |
| --- | --- | --- | --- |
| `fontFamily` | `string` | `'Open Sans'` | عائلة الخط لكل العناوين. |
| `lineHeight` | `Dimension` | `1.2 em` | ارتفاع السطر في العناوين، وهو أضيق منه في النص الأساسي. |
| `color` | `ColorValue` | اللون الرئيسي (`#295AA3`) | لون نص العنوان. مرتبط بالمدخل `main-color` في لوحة الألوان الافتراضية، فإذا غيّرت ذلك اللون في اللوحة تغيّر لون كل العناوين. |
| `textAlign` | `'left' \| 'justify' \| 'center' \| 'right' \| 'start' \| 'end'` | `'left'` | محاذاة كل مستويات العناوين (لا توجد قيمة خاصة بكل مستوى): إلى اليسار بحافة يمنى حرّة، أو مضبوطة، أو في الوسط، أو إلى اليمين بحافة يسرى حرّة. العنوان المضبوط يضع سطره الأخير ملاصقًا لليسار، كما تفعل الفقرة، فيبدو العنوان ذو السطر الواحد كأنه `'left'`. ترسم Canvas وHTML وPDF الأسطر بالطريقة نفسها، بما في ذلك بادئة الرقم. وتتبعها أيضًا الافتتاحية الافتراضية لعنوان `span: 'page'` ليس له تصميم متقدم (القيمة المضبوطة تضعها ملاصقة لليسار)؛ أما التصميم المتقدم فيحاذي عناصره النصية بقيمة `align` الخاصة بكل منها. |
| `fontWeight` | `number` | `700` | وزن خط العناوين (100–900). |
| `marginTop` | `Dimension` | `1.5 em` | المسافة فوق العناوين. |
| `marginBottom` | `Dimension` | `0.5 em` | المسافة تحت العناوين. |
| `keepWithNext` | `boolean` | `true` | عند `true` لا يوضع العنوان أبدًا عنصرًا أخيرًا في عمود أو صفحة. إذا لم يبقَ للكتلة التالية بعد العنوان متسع لعدد من الأسطر لا يقل عن `bodyText.widowMinLines` (أو لسطر واحد حين تكون قيمة `bodyText.avoidWidows` هي `false`)، يُدفع العنوان إلى الأمام ليبقى ملتصقًا بنصه. ويتفاعل مع `bodyText.keepColonWithList`: إذا اضطرت تلك القاعدة إلى دفع الفقرة المنتهية بنقطتين كاملةً، انتقلت معها العناوين الأخيرة في العمود بدل أن تُترك معزولة. |
| `keepWithNextSpread` | `boolean` | `false` | مع `keepWithNext`، يُسمح مع ذلك للعنوان بأن يختم آخر عمود نص في الصفحة الزوجية، لأن نصه يفتتح عندئذ الصفحة الفردية المقابلة في الصفحتين المتقابلتين نفسيهما (JLReq §4.1.7). والصفحات المتقابلة هي الصفحة 1 وحدها، ثم 2–3، و4–5…، محسوبةً مع `pageIndexOffset`، في الكتب المجلّدة من اليسار ومن اليمين على السواء. منذ postext 1.16. |
| `keepWithNextSplit` | `'rules' \| 'fill'` | `'rules'` | كيف تنقسم الفقرة التي تحت العنوان حين ينتهي العنوان في أسفل عمود ويؤدي دفع الفقرة كاملة إلى ترك العنوان خلفها. `'rules'`: أكبر عدد من الأسطر يتسع له المكان، بشرط أن يبقى تحت العنوان عدد من الأسطر لا يقل عن `bodyText.widowMinLines` وأن ينتقل إلى العمود التالي عدد لا يقل عن `bodyText.orphanMinLines`؛ وإذا لم يحقق أي تقسيم الشرطين معًا، انتقل العنوان مع فقرته، وملأت موازنة الأعمدة المكان الذي يتركه. `'fill'`: كل ما يتسع له المكان من أسطر مهما قلّ ما ينتقل منها، فالفقرة ذات الأسطر الأربعة التي يتسع المكان لثلاثة منها تنقسم 3 + 1. حتى الإصدار postext 1.4 كان كل عنوان ينقسم بهذه الطريقة، والإعدادات المخزّنة قبل `configVersion` 8 تحتفظ بها (انظر [الحزم المكتوبة بالإصدار postext 1.4 أو أقدم](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). وعند تعطيل `avoidWidows` أو `avoidOrphans` يسقط ذلك الشق من القاعدة. |
| `snapToGrid` | `boolean` | `true` | هل يعود التدفق إلى شبكة خطوط الأساس تحت العنوان. مع `true` تُقرَّب قيمة `marginBottom` للعنوان صعودًا إلى عدد صحيح من أسطر الشبكة؛ ومع `false` يُحتفظ بالهامش الدقيق، وقد يقع النص تحت العنوان خارج الشبكة حتى نقطة الالتقاط التالية (نهاية قائمة، أو ذيل حاوية `:::paragraphs`، أو معادلة منفصلة) — وهي الطريقة التي تضع بها كتب كثيرة سطرًا ونصف سطر تحت العنوان. يمكن لمستوى (`levels[].snapToGrid`) أو لنمط عنوان أن يحدد قيمته الخاصة؛ وهذه القيمة هي ما يرثانه. |
| `inlineMarks` | `boolean` | `true` | هل يقرأ العنوان علاماته المضمّنة كما تقرؤها الفقرة: `*italic*` و`**bold**` و`^superscript^` و`~subscript~` و`:smallcaps[…]` والروابط. المقطع المائل يعكس ميل العنوان، فيظهر قائمًا في عنوان مائل؛ والمقطع العريض يأخذ `bodyText.boldFontWeight`، أو وزن العنوان نفسه إن كان أثقل. يعرض جدول المحتويات المقاطع العريضة والمائلة أيضًا؛ أما الترويسات وإشارات PDF المرجعية فتطبع النص وحده. مع `false` تُحذف العلامات وتُطبع الكلمات بنمط العنوان نفسه، كما كان الحال حتى postext 1.4. الافتتاحية الافتراضية لعنوان `span: 'page'` ليس له تصميم تضبط أيضًا المقاطع العريضة والمائلة والعلوية والسفلية؛ أما تصميم العنوان (شريط افتتاح مصمَّم أو `advancedDesign` داخل العمود) فيطبع `{titleText}` نصًا عاديًا في الحالتين، ما لم يقرأ عنصره النصي العلامات المضمّنة (`inlineMarks: true`): فعندئذ يحتفظ `{titleText}` بمقاطع العنوان العريضة والمائلة والعلوية والسفلية (منذ postext 1.19). الإعدادات المخزّنة سابقًا التي تحمل عناوينها علامات تُقرأ بقيمة `false` (انظر [الحزم المكتوبة بالإصدار postext 1.4 أو أقدم](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). |
| `balancing` | `ColumnBalancingConfig` | مفعّلة | موازنة الأعمدة عموديًا — مسافة إضافية فوق العناوين كي تنتهي الأعمدة محاذية لأسفل الصفحة. انظر أدناه. |

عناوين في الوسط لقصائد أو لفصول مسرحية، بلا خانة تصميم:

```ts
headings: {
  textAlign: 'center',
  levels: [{ level: 2, textTransform: 'uppercase' }],
}
```

تمرير كائن `headings` يحتفظ بكل قيمة افتراضية لمستوى لا تعيد ذكرها، بما في ذلك فاصل الصفحة قبل H1 (انظر [تجاوزات كل مستوى](https://postext.dev/ar/docs/configuration-text.md#تجاوزات-كل-مستوى)).

### موازنة الأعمدة

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

1. **إطار يختم العمود** — الإطار الذي ينهي عمودًا قصيرًا يُدفع إلى الأسفل بمقدار المتسع الذي تحت قاعدته بالضبط، فتقع حافته السفلى على آخر خانة في شبكة الصفحة، بمحاذاة آخر سطر في العمود المجاور. ويأخذ ذلك المتسع حتى لو كان أقل من سطر، ما دام لا ينتقل شيء إلى عمود آخر. افتراضيًا يعمل قبل كل الأدوات الأخرى ويأخذ الفجوة كلها، فقد ينتهي الإطار الذي يعلّق على الفقرة التي فوقه على بعد عدة أسطر منها؛ والقيمة `closingBox: 'last'` تترك للعناوين ونهايات القوائم وأدوات المسافات الأخرى أن تأخذ الأسطر الكاملة أولًا، ولا يأخذ الإطار إلا ما تتركه، والقيمة `closingBox: 'off'` لا تحرّكه أبدًا.
2. **الصور ذات المنطقة الآمنة** — الصورة التي لها منطقة آمنة (`Resource.safeArea`، انظر [صيغة المستند › المنطقة الآمنة](https://postext.dev/ar/docs/document-format.md#المنطقة-الآمنة)) المضمّنة في العمود القصير، أو العائمة في رأسه أو أسفله وفوقه وحده، تطول بأسطر كاملة من الشبكة، مقصوصة داخل منطقتها الآمنة، حتى يمتلئ العمود أو يبلغ القصّ المنطقة الآمنة. والصورة الأطول لا تترك فجوة في الصفحة، ولذلك تعمل هذه الأداة قبل إضافة أي مسافة؛ أما العنصر العائم في رأس عمود من صفحة أو شريط تبقى رؤوس أعمدته متساوية (انظر أدناه) فلا يطول. وتُسجَّل باسم `flexFigure`. وليس لها إعداد خاص: لا تطول إلا الصورة التي يحدّد موردها منطقة آمنة.
3. **العناوين** — تُضاف أسطر كاملة من الشبكة إلى الهامش العلوي للعناوين داخل العمود القصير. وإذا احتيج إلى عدة أسطر وكان في العمود عدة عناوين، وُزّعت الأسطر عليها، مع إعطاء الحصة الكبرى دائمًا للعنوان الأهم (يتلقى `h2` أكثر مما يتلقى `h3`). العناوين الواقعة في أعلى العمود تمامًا لا تتلقى مسافة إضافية أبدًا، فتظل الأعمدة تبدأ عند أعلى الصفحة — إلا العنوان الواقع مباشرة تحت شكل أو جدول يتصدّر عموده في صفحة يستمر تدفقها إلى التالية: هنا يذهب المتسع فوق ذلك العنوان، تحت الشكل.
4. **نهايات القوائم** — حين لا تستطيع العناوين استيعاب الفجوة كلها، يُضاف سطر من الشبكة حيث تنتهي قائمة أو تعداد (المسافة بعد القائمة تبدو طبيعية للقارئ)، مع حد أقصى لكل نهاية قائمة.
5. **الفقرات المرخاة** — في آخر المطاف، يُعاد تقسيم فقرة واحدة من العمود إلى أسطر بحيث تزيد سطرًا واحدًا (`\looseness=+1` في TeX)، ويُختار أطول فقرة كي تتوزع المسافة الإضافية بين الكلمات دون أن تُلحظ. لا يُقبل الحل المرخى إلا إذا بقي كل سطر **دون `bodyText.maxWordSpacing`** — فلا تتجاوز كثافة الطباعة (type colour) الحد الذي ضبطته أصلًا. يتطلب `bodyText.optimalLineBreaking`.

في شبكة المحارف (`cjk.grid`، انظر [الإخراج الصيني › شبكة المحارف](https://postext.dev/ar/docs/chinese-layout.md#شبكة-المحارف)) يقف كل محرف في خانة عرضها em واحد، ويقع كل سطر على خطوة أسطر الشبكة، وهي أيضًا شبكة خطوط الأساس. والموازنة معطّلة هناك افتراضيًا، كما في النص العمودي: فالصفحة المنضّدة سطرًا سطرًا على شبكة، على نحو ما يعدّ GB/T 9704 الصفحة 22 سطرًا من 28 محرفًا، تترك العمود القصير قصيرًا. والإعدادات التي تضبط `enabled: true` تحصل على أدوات تحافظ على الشبكة: العناوين ونهايات القوائم والمعادلات المنفصلة والأشكال تأخذ أسطرًا كاملة من الشبكة، فينزل النص الذي تحتها بصفوف كاملة، و`gridLines: 'off'` تستبعد هذه الأدوات حين يكون المعيار لا يملك صفًّا فارغًا يتنازل عنه. ولا تطول الفقرة الصينية أو اليابانية سطرًا إلا إذا لم تتّسع أي فجوة بين محرفين من محارفها أكثر من `maxTracking`، ولا يُضاف إلى حروفها تتبّع: فالسطر الناقص محرفًا واحدًا يوزّع em كاملًا على فجواته، وهذا أبعد كثيرًا من القيمة الافتراضية 0.01 em، ولذلك لا تجد أداة الفقرات المرخاة في الغالب شيئًا على شبكة من خانات كاملة. أما الإطار الذي يختم العمود والصور ذات المنطقة الآمنة فهي خارج الشبكة عن قصد، وتعمل كما تعمل في أي مكان آخر.

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

| الخاصية | النوع | الافتراضي | الوصف |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `true` | هل تُوازَن أسافل الأعمدة. معطّلة افتراضيًا في النص العمودي (`layout.writingMode: 'vertical-rl'`) وفي شبكة المحارف (`cjk.grid.enabled`، منذ postext 1.25)؛ والقيمة `true` تفعّلها هناك أيضًا. |
| `maxLinesPerHeading` | `number` | `4` | الحد الأقصى لأسطر الشبكة الإضافية التي يمكن إضافتها فوق عنوان واحد. |
| `stretchAfterLists` | `boolean` | `true` | السماح بأسطر شبكة إضافية حيث تنتهي قائمة، حين لا تستطيع العناوين استيعاب الفجوة كلها. |
| `maxLinesAfterList` | `number` | `1` | الحد الأقصى لأسطر الشبكة الإضافية بعد نهاية قائمة واحدة. |
| `stretchAfterFloats` | `boolean` | `true` | السماح بأسطر شبكة إضافية تحت شكل أو جدول يتصدّر العمود القصير (عنصر عائم علوي)، بعد أداة نهاية القائمة، فينزل النص الذي تحته بدل أن ينتهي العمود قصيرًا. لا يعمل أبدًا في صفحة لا يستمر تدفقها (الصفحة الأخيرة من فصل) ولا في شريط ختامي يقطعه `trailing` قطعًا متساويًا: هناك تبقى رؤوس الأعمدة متساوية وقد ينتهي العمود الأخير أقصر بسطر. قد تكون الكتلة الأولى تحت الشكل بقيةَ فقرة بدأت في الصفحة السابقة: تنزل هي أيضًا، بمقدار السطر الذي تركته قواعد الفصل خاليًا في أسفل العمود (سطر أبقته قاعدة الأرملة فارغًا، أو مسافة فقرة لا متسع بعدها لنص). اضبطه على `false` لإبقاء النص مباشرة تحت الشكل. |
| `maxLinesAfterFloat` | `number` | `1` | الحد الأقصى لأسطر الشبكة الإضافية تحت عنصر عائم علوي واحد. |
| `looseParagraphs` | `boolean` | `true` | آخر الأدوات: إعادة تقسيم فقرات العمود القصير بإرخاء يزيدها سطرًا (سطر إضافي لكل منها)، ضمن حدود `bodyText.maxWordSpacing`. |
| `maxLooseParagraphs` | `number` | `2` | عدد فقرات العمود القصير الواحد التي يجوز أن تطول سطرًا، بدءًا بالأطول. |
| `trackParagraphs` | `boolean` | `true` | حين لا يكفي تباعد الكلمات وحده لكسب السطر، يجوز للفقرة المرخاة أن تأخذ أيضًا أصغر تتبّع موجب (تباعد الحروف) يحقق ذلك. |
| `maxTracking` | `number` | `10` | الحد الأعلى لذلك التتبّع، بأجزاء الألف من em لكل حرف (10 = 0.01 em). |
| `trailing` | `boolean` | `true` | مساواة الشريط الختامي للفصل وللمستند: حين ينتهي التدفق قبل امتلاء الصفحة (عند صفحة افتتاح فصل، أو `:::part`، أو إطار `placement: 'fixed'` يختم الفصل، أو نهاية المستند) وأعمدته غير متساوية، تُقطع قطعًا متساويًا — بحد أقصى للشريط قدره `ceil(Σ used / N / grid)` سطرًا، يُحسب بعد أن تستقر الأدوات السابقة على الصفحات الأسبق — فتنتهي قائمة مراجع قصيرة على الارتفاع نفسه في كل عمود بدل أن تملأ العمود الأول وتترك الأخير نصف فارغ. يحافظ القطع على القواعد التي يحافظ عليها شريط غير مقطوع: إذا كانت كتلة لا يمكن تقسيمها عبره (ذيل فقرة يبقيه الحدّان الأدنيان لليتيمة والأرملة كاملًا، أو إطار يبقى متماسكًا) ستتجاوزه — فتفقد أسطرها الأخيرة، لأن المُخرِجات تقصّ العمود عند حدود صندوقه — أو كان عنوان سيختم عمودًا بينما يفتتح نصه العمود التالي (مع `headings.keepWithNext`، وهو الافتراضي)، يؤخذ القطع أدنى بسطر، حتى ثلاث مرات، وإلا أُلغي. الكتلة التي لا تستطيع أن تبدأ في الأسطر التي يتركها القطع تحت شكل يتصدّر عمودًا (تحتاج الفقرة هناك إلى حدها الأدنى لليتيمة) تنتقل إلى العمود التالي من الشريط، كما تفعل من عمود غير مقطوع، ويقف الشكل وحده في عموده. الأعمدة التي تختلف أسافلها بسطر شبكة واحد أو أقل تُترك كما هي: الشريط الختامي الذي ينتهي عموده الأخير أقصر بسطر هو الخاتمة المعتادة، وقطعه لن يفعل سوى نقل سطر. يذهب القطع إلى الشريط الذي قيس فيه، وكذلك القطع الذي يطلبه إطار يمتد بعرض الصفحة في منتصفها: حتى postext 1.4، حين كان أول نص في الصفحة الختامية قد عُرض أولًا على شريط لا متسع فيه له (صفحة يشغلها عنصر عائم كلها، أو الشريط الرفيع الذي يتركه إطار يمتد بعرض الصفحة في أسفل الصفحة السابقة)، كان القطع يُستهلك في ذلك الشريط وتُبقي الصفحة الختامية كل سطر في عمودها الأول. الأعمدة المختلفة العرض (تخطيط عمود ونصف فيه نص في العمودين) تُقطع بحسب المساحة، فيُرجَّح ارتفاع كل عمود بعرضه، لأن سطر العمود الضيق يتسع لقدر أقل من النص. لا يعمل إلا حين تكون قيمة `enabled` هي true. |
| `beforeSpan` | `boolean` | `true` | مساواة الشريط الذي تتركه كتلة تمتد بعرض الصفحة: حين لا يتسع إطار `span: 'page'` تحت الأعمدة الحالية حتى بعد قطع متساوٍ، ويجب أن ينتقل إلى الصفحة التالية أو ينقسم (`calloutStyles[].keepTogether: false`)، تُقطع الأعمدة التي يقاطعها قطعًا متساويًا — بالحد الختامي نفسه الذي يناله الشريط الختامي — بدل أن يملأ الأول الصفحة وينتهي الأخير قصيرًا. تُترك الصفحة فاصلًا صريحًا كي لا تمدّ الأدوات السابقة عمودها الأخير من جديد حتى أسفل الصفحة؛ ثم يستقر الإطار، أو الجزء الذي يتسع منه، تحت الأعمدة المتساوية. لا يعمل إلا حين تكون قيمة `enabled` هي true. |
| `closingBox` | `'first' \| 'last' \| 'off'` | `'first'` | متى يأخذ الإطار الذي يختم عمودًا قصيرًا المتسعَ الذي تحت قاعدته (الأداة 1، وتُسجَّل باسم `trailingCallout`). `'first'`: قبل أي أداة أخرى، كما كان الحال حتى postext 1.4 — يأخذ الإطار الفجوة كلها، ولو كانت عدة أسطر، ولا تنال العناوين التي فوقه شيئًا. `'last'`: بعد أدوات العناوين ونهايات القوائم والمعادلات المنفصلة والعناصر العائمة، التي تأخذ الأسطر الكاملة أولًا؛ ينزل الإطار مع النص الذي فوقه ثم لا يأخذ إلا ما تركته، وهو عادة جزء من سطر، فتلتقي قاعدته بآخر خانة في الشبكة ويبقى قريبًا من النص الذي يعلّق عليه. `'off'`: أبدًا؛ يحتفظ الإطار بالمتسع الذي تحت قاعدته، وإن كانت الأدوات الأخرى تستطيع إنزاله بأسطر كاملة حين تضيف مسافة فوقه، ويبقى جزء السطر المتروك تحته. في الصفحة الختامية، حيث الإطار هو الأداة الوحيدة التي تساوي قاعدته بالعمود المجاور، تتركه `'off'` حيث وضعه التدفق. أي قيمة أخرى تُقرأ `'first'`. أما الإطار الذي يُغلق عمود النص الوحيد في شريطه (صفحة ذات عمود واحد تنتهي مبكرًا وتبدأ كتلتها التالية الصفحة التالية) فلا يُحرَّك أبدًا: لا عمود بجانبه يُحاذى معه (منذ postext 1.19). |
| `gridLines` | `'allow' \| 'off'` | `'allow'` | في شبكة المحارف: هل يجوز أن تعمل الأدوات التي تضيف أسطرًا كاملة من الشبكة (فوق العنوان، وحيث تنتهي قائمة، وتحت معادلة منفصلة أو إطار، وتحت شكل يتصدّر العمود). وهي تُبقي كل محرف في خانته؛ و`'off'` تناسب معيارًا يعدّ أسطر الصفحة، فتترك العمود قصيرًا بدلًا من ذلك. لا أثر لها خارج الشبكة. أي قيمة أخرى تُقرأ `'allow'`. منذ postext 1.25. |

#### أيّ أداة عملت

يسجّل الإخراج كل أداة طبّقها، على الكتلة التي طبّقها عليها: `block.balancing` في VDT الذي تعيده `buildDocument`. يمكن لبروفة أو اختبار أو تقرير أن يبيّن لماذا ينتهي عمود محاذيًا للأسفل — وأي الأعمدة لم تستطع أي أداة إغلاقها. الكتل التي تركتها الموازنة على حالها لا تحمل `balancing`، والمستند المبني مع `enabled: false` لا يحمل شيئًا منها.

في شبكة المحارف يبيّن المستند لماذا قد ينتهي عمود قصيرًا: تكون `doc.gridBalancing` هي `{ off: true }` حين تكون الموازنة معطّلة لأن الصفحة على شبكة والإعدادات لا تفعّلها، و`{ gridLines: 'off' }` حين تعمل بلا أدوات الأسطر الكاملة؛ والعمود الذي يبقى قصيرًا يحمل `column.gridRefused`، أي الأدوات التي منعته الشبكة منها (`'looseParagraph'` حين لا تكسب الفقرة سطرها إلا بمدّ محارفها خارج خاناتها، وأدوات الأسطر الكاملة في ظل `gridLines: 'off'`). ولا يوجد أيّ منهما خارج الشبكة.

```ts
interface VDTBalancing {
  levers: BalanceLever[]; // usually one: a paragraph after a list can take the list-end line and run a line long too
  spaceAbove: number;     // px the spacing levers added above the block (0 when only looseParagraph or flexFigure fired)
  bodyGrowth?: number;    // flexFigure: px the picture grew, cropped within its safe area
  extraLines?: number;    // looseParagraph: lines the paragraph gained
  tracking?: number;      // looseParagraph: the tracking that gained them, in thousandths of an em (0 = word spacing alone)
}
type BalanceLever = 'trailingCallout' | 'flexFigure' | 'heading' | 'listEnd' | 'afterDisplay' | 'afterFloat' | 'looseParagraph';
```

| الأداة | تُسجَّل على | ما فعلته |
| --- | --- | --- |
| `trailingCallout` | كتلة حدود الإطار | إطار يختم العمود نزل بمقدار المتسع الذي تحت قاعدته بالضبط (`spaceAbove`؛ ولا بأس بجزء من سطر). |
| `flexFigure` | كتلة الصورة (المضمّنة) أو العنصر العائم | صورة ذات منطقة آمنة طالت `bodyGrowth` px بأسطر كاملة من الشبكة، مقصوصة داخل المنطقة الآمنة. و`bodySource` في كتلة المورد هو الجزء الظاهر، و`bodyFlex.delta` هو مقدار الإطالة نفسه. |
| `heading` | العنوان | أسطر شبكة كاملة فوق العنوان، حتى `maxLinesPerHeading`. |
| `listEnd` | أول كتلة بعد القائمة | سطر شبكة حيث تنتهي قائمة، حتى `maxLinesAfterList`. |
| `afterDisplay` | الكتلة التي تلي المعادلة أو الإطار | سطر شبكة تحت معادلة منفصلة أو إطار. |
| `afterFloat` | أول كتلة في العمود | سطر شبكة بين شريط عناصر عائمة يتصدّر العمود ونصه، حتى `maxLinesAfterFloat`. |
| `looseParagraph` | الفقرة | الفقرة بعد إعادة تقسيمها أطول بمقدار `extraLines`، بأصغر تتبّع حقق ذلك (`tracking`؛ وقيمة `block.letterSpacing` هي القيمة نفسها بالبكسل). |

تُسجَّل القطوع المتساوية على الأعمدة التي قطعتها: قيمة `column.bandCapped` هي true على كل عمود قُطع قطعًا متساويًا (الشريط الذي يتركه إطار يمتد بعرض الصفحة، أو شريط ختامي)، و`column.trailingCap` تعلّم أيضًا الشريط الختامي لفصل أو للمستند (`trailing`).

```ts
import { buildDocument } from 'postext';

const doc = buildDocument(content, config);
for (const page of doc.pages) {
  page.columns.forEach((column, i) => {
    const levers: string[] = column.blocks.flatMap((block) => block.balancing?.levers ?? []);
    if (column.trailingCap) levers.push('closing band cut level');
    else if (column.bandCapped) levers.push('band cut level');
    if (levers.length > 0) console.log(`page ${page.index + 1}, column ${i + 1}: ${levers.join(', ')}`);
  });
}
// page 3, column 1: heading, heading
// page 3, column 2: listEnd, looseParagraph
```

### تجاوزات كل مستوى

يمكن لكل مستوى عناوين أن يتجاوز القيم الافتراضية العامة عبر المصفوفة `levels`. لا يختلف افتراضيًا إلا `fontSize` (إضافة إلى `breakBefore` في H1، المذكور أدناه) — وكل الخصائص الأخرى تُورث من إعدادات العناوين العامة.

| المستوى | حجم الخط الافتراضي | `breakBefore` الافتراضي |
| --- | --- | --- |
| H1 | `18 pt` | `{ enabled: true, parity: 'always-odd' }` |
| H2 | `15 pt` | `{ enabled: false, parity: 'any' }` |
| H3 | `12 pt` | `{ enabled: false, parity: 'any' }` |
| H4 | `10 pt` | `{ enabled: false, parity: 'any' }` |
| H5 | `9 pt` | `{ enabled: false, parity: 'any' }` |
| H6 | `8 pt` | `{ enabled: false, parity: 'any' }` |

القيمة الافتراضية في H1 تحاكي إخراج الفصول في الكتب: كل عنوان من المستوى الأعلى يُفتتح في صفحة فردية جديدة (اليمنى في كتاب يُقرأ من اليسار إلى اليمين)، مع صفحة فاصلة فارغة إلزامية بعد الفصل السابق. تجاوزها في `levels[0].breakBefore` إذا كانت بنية مستندك أبسط من بنية الكتاب.

يُدمج `breakBefore` الخاص بمستوى حقلًا بحقل فوق تلك القيمة الافتراضية، وكائن `headings` الذي لا يذكره يحتفظ بها. القيمة `{ parity: 'odd' }` في H1 تُبقي الفاصل وتغيّر الزوجية وحدها؛ والقيمة `{ enabled: false }` تجعل الفصول تتوالى دون فاصل:

```ts
headings: {
  fontFamily: 'Merriweather',                               // H1 still breaks to a fresh recto (always-odd)
  levels: [{ level: 1, breakBefore: { parity: 'odd' } }],    // …or: a recto, with no mandatory blank
}

headings: { levels: [{ level: 1, breakBefore: { enabled: false } }] } // chapters run on
```

**تغيّر في postext 1.5.** حتى postext 1.4 كان أي كائن `headings` يعطّل فاصل H1 ما لم يُعَد ذكر `levels[0].breakBefore`، وكان `breakBefore` الجزئي يملأ حقله الناقص من القيمة الافتراضية التي لا فاصل فيها. لذلك فإن إعدادًا مكتوبًا في الشيفرة للإصدار 1.4 فيه كائن `headings` وليس فيه فاصل قبل H1 يفتتح الآن كل فصل في صفحة فردية جديدة، مع صفحات زوجية فارغة حيث يلزم. لإبقاء الفصول متوالية، أعطِ مدخل H1 في `levels` حقلًا واحدًا:

```ts
headings: { fontFamily: 'Merriweather', levels: [{ level: 1, breakBefore: { enabled: false } }] } // as 1.4 laid it out
```

حين يكون الإعداد مخزّنًا، يستطيع المحرّك أن يعرف ذلك فيقوم بالعمل عنك: Sandbox للكتب والإعدادات التي حفظها آنذاك (انظر **Sandbox › حفظ العمل**)، و`openBundle` / `readBundle` لحزمة `.postext` مكتوبة بالإصدار postext 1.4 أو أقدم (انظر [الحزم المكتوبة بالإصدار postext 1.4 أو أقدم](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). أما الإعداد الذي خزّنته بنفسك فيمكن تمريره عبر `migrateConfig(config)` من `postext/bundle`، التي تكتب صراحةً الفواصل التي أخرجها الإصدار 1.4 (`pinLegacyHeadingBreaks`): `enabled: false` على H1 لم يكن له فاصل، و`parity: 'any'` بجانب `enabled: true` لم يذكر زوجية، في H1 وفي أنماط العناوين. وتثبّت أيضًا حجم الرياضيات، والمسافة حول الأشكال المضمّنة (في الإطارات أيضًا)، والعلامات المضمّنة في العناوين، وأحجام الحروف الاستهلالية، والمتسع تحت سطر النقطتين الذي يقدّم قائمة، والأسطر التي يتركها قطع الإطار من فقرة أو بند قائمة، وفواصل الأسطر عند الشرطات، والتقسيم سطرًا بسطر للنص غير المضبوط، وتقسيم الفقرة تحت العنوان، وفواصل الأسطر عند واصلة الكلمة المركبة، والمسافة تحت حاويات `:::paragraphs`، كما ضبطها الإصدار 1.4. مرّر نص Markdown للكتاب وسيطًا ثالثًا، `{ content }`، فتُسقط تثبيت الرياضيات إذا لم يكن في النص `$`، وتثبيتات الفجوات إذا لم يضمّن أي سطر موردًا (وتثبيت فجوة الإطار إذا لم يفعل ذلك أي سطر داخل إطار)، وتثبيت علامات العناوين إذا لم يحمل أي عنوان علامة، وتثبيت سطر النقطتين إذا لم تلِ أي قائمة سطرًا ينتهي بنقطتين، وتثبيت قطع الإطار إذا لم يفتح النص أي `:::callout`، وتثبيت الشرطة إذا لم توضع أي شرطة ملاصقة بين كلمتين، وتثبيت تقسيم العنوان إذا لم يكن في النص عنوان، وتثبيت الحاوية إذا لم يفتح النص أي حاوية `:::paragraphs`، وتثبيت الكلمات المركبة إذا لم تقع أي واصلة بين حرفين؛ ولا يذهب تثبيت التقسيم غير المضبوط إلا إلى إعداد يجعل بعض النص الجاري غير مضبوط، ولا تثبيت الحاوية إلا إلى إعداد يعرّف نمط فقرة (انظر [الحزم المكتوبة بالإصدار postext 1.4 أو أقدم](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)). وللفواصل وحدها، استدعِ `pinLegacyHeadingBreaks(config)`.

تدعم تجاوزات المستوى الخصائص نفسها التي تدعمها القيم الافتراضية العامة — `fontSize` و`lineHeight` و`fontFamily` و`color` و`fontWeight` و`marginTop` و`marginBottom` و`snapToGrid` — إضافة إلى هذه الحقول الخاصة بالمستوى (ويقبلها [نمط العنوان](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) أيضًا):

| الخاصية | النوع | الافتراضي | الوصف |
| --- | --- | --- | --- |
| `italic` | `boolean` | `false` | يرسم العنوان بخط مائل. يُطبَّق فوق `fontWeight`. |
| `textTransform` | `'none' \| 'uppercase'` | `'none'` | يحوّل نص العنوان إلى أحرف كبيرة (تبقى بادئة الترقيم كما كُتبت، وكذلك الشارة (chip) وتسمية `:ref` فيه). يحافظ على الطول كي تبقى خريطة المصدر في المحرّر متطابقة 1:1: الحروف التي يطول شكلها الكبير (`ß` → `SS`) تُترك كما هي. والنص المحوَّل يغذي أيضًا العنصر النائب `{titleText}` في التصاميم المتقدمة وصفحات افتتاح الفصول. أما إشارات PDF المرجعية فتحتفظ بالعنوان كما كُتب — *Author contributions* لا *AUTHOR CONTRIBUTIONS* — كما تترك خاصية `text-transform` في CSS النص نفسه دون تغيير (حتى postext 1.4 كانت تأخذ الأحرف الكبيرة). |
| `letterSpacing` | `Dimension` | `0` | التتبّع بعد كل رسم حرفي (glyph) في العنوان — بما في ذلك المسافات وبادئة الترقيم — كما في `letter-spacing` في CSS. القيمة الموجبة تباعد الحروف (الأحرف الكبيرة الناتجة عن `textTransform: 'uppercase'` تحتاج عادة إلى قليل منه: `{ value: 0.12, unit: 'em' }`)، والسالبة تضيّق حجمًا عرضيًا كبيرًا. قيمة `em` نسبية إلى `fontSize` الخاص بالمستوى. تُقاس أسطر العنوان معه، فتلتف حيث ينتهي النص المتتبَّع، وترسمه Canvas وHTML وPDF بالطريقة نفسها. السطر الموسَّط أو المحاذى إلى اليمين يوضع بحسب حروفه: يُستبعد التتبّع الذي بعد آخر رسم حرفي فيه، كما في نص التصميم، فيصطف العنوان الموسَّط مع الافتتاحية الافتراضية لعنوان `span: 'page'`. المستوى المرسوم من `advancedDesign` الخاص به يتجاهله، شأنه شأن حقول الطباعة الأخرى هنا: لكل عنصر نصي في التصميم `letterSpacing` خاص به. ويضبطه [نمط العنوان](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) أيضًا، للعناوين التي تستخدمه. حتى postext 1.4 لم يكن للعناوين تتبّع، وكان المفتاح يُحذف دون أي تنبيه. |
| `lineSpan` | `number` | غير مضبوط | الأسطر المأخوذة (行取り، JLReq §4.1.6): يُنضَّد العنوان في شريط من هذا العدد من أسطر المتن، ومحارفه في وسطه، بدل `marginTop` و`marginBottom`؛ و`3` عنوان من نوع 3行取り. ويبدأ الشريط على سطر من أسطر المتن حين يلتصق العنوان بالشبكة، ويبقى النص بعده على الشبكة، في وضعَي الكتابة كليهما ومع `cjk.grid`؛ والعنوان الذي تحتاج أسطره إلى أكثر يأخذ العدد الصحيح التالي. والوسط هو وسط المحارف (خط الأساس ناقصًا المركز الإيديوغرافي للخط)، كما تقيسه JLReq، لا وسط صناديق الأسطر. ولا يسري على صفحات الافتتاح (`span: 'page'`) ولا على العناوين المرسومة من `advancedDesign` ولا على العناوين المخفية أو العناوين داخل الإطارات. ويجوز لنمط العنوان أن يضبط `0` لإلغاء قيمة مستواه. منذ postext 1.16. |
| `indent` | `Dimension` | `0` | إزاحة العنوان عن بداية السطر (字下げ)، و`em` هو حجم **المتن**، لأن الكتب اليابانية تعدّ إزاحات العناوين بمحارف المتن (JLReq §4.1.3): `{ value: 6, unit: 'em' }` هو 6字下げ مهما كان حجم العنوان. ويضيق عرض السطر بقدرها، والعنوان الموسَّط يتوسط ما بقي. منذ postext 1.16. |
| `firstLineIndent` | `Dimension` | `0` | إزاحة السطر الأول وحده من العنوان، محسوبة من `indent` وبوحدات em من **المتن** مثلها: الأسطر التي يلتفّ إليها العنوان الطويل تبدأ عند `indent` (عند بداية السطر إن لم تُضبط)، كما يضع معيار GB/T 9704 كل مستويات العناوين بإزاحة خانتين ويعيد ما يلتفّ منها إلى الهامش: `{ value: 2, unit: 'em' }`. ومع تفعيل `cjk.grid` تكون وحدتا em من المتن خانتين من الشبكة. والعنوان المرقّم يطبع رقمه بعد الإزاحة، فلا يحتاج قالب الترقيم إلى مسافات إيديوغرافية كانت ستُطبع أيضًا في الفهرس وفي علامات PDF المرجعية. وتعمل في النص العمودي (من رأس السطر)، ومع مُنضِّد CJK (القوس الافتتاحي في بداية العنوان يتبع قواعد بداية السطر كما في الفقرة)، ومع Knuth–Plass. والعنوان الموسَّط يأخذها كما تأخذها الفقرة الموسَّطة: يتوسّط سطره الأول ما يبقى بعد الإزاحة. وتضبط `{firstLineIndent=N}` بعد نص العنوان عنوانًا واحدًا، وتلغي `{firstLineIndent=0}` إزاحة مستواه. منذ postext 1.24. |
| `jidori` | `number` | غير مضبوط | التوزيع المتساوي (字取り): العنوان ذو السطر الواحد الأضيق من هذا العدد من وحدات em **الخاصة به** يُوزَّع بالتساوي حتى ذلك العرض بالضبط، فيُنضّد `3` 序章 هكذا 序　章. أما العناوين الأعرض والعناوين ذات الأسطر المتعددة فتُترك كما هي. و`{jidori=N}` بعد عنوان ما يضبط عنوانًا واحدًا، و`{jidori=0}` يلغي ما يضبطه مستواه. منذ postext 1.16. |
| `dropCap` | `ParagraphDropCap \| false` | لا شيء | حرف استهلالي يفتتح أول فقرة متن بعد عنوان من هذا المستوى (انظر [الحروف الاستهلالية](https://postext.dev/ar/docs/configuration-text.md#الحروف-الاستهلالية)): إعداد واحد يعطي كل فصل حرفه الاستهلالي. ويلغيه العنوان بـ`{dropcap=false}` أو يحدّد أسطره بـ`{dropcap=2}`. منذ postext 1.23. |
| `numberingTemplate` | `string` | `''` | قالب الرقم التلقائي للمستوى. الرمز `{1}` … `{6}` يطبع العدّاد الجاري لمستوى العنوان ذاك، منسَّقًا اختياريًا بلاحقة — `{1:I}` أرقام رومانية كبيرة، و`{1:i}` رومانية صغيرة، و`{1:A}` / `{1:a}` أبجدية، و`{1:01}` مع أصفار بادئة، و`{1:words}` بالحروف (*twenty-one*)، و`{1:ordinal}` عددًا ترتيبيًا (*twenty-first*)، و`{1:一}` بالأرقام الصينية (واليابانية في المستند الياباني: 第百一章)، و`{1:〇}` رقمًا رقمًا، و`{1:壹}` بالأرقام المالية الصينية، و`{1:①}` داخل دوائر، أو أي اسم من [تسميات صيغ الترقيم](https://postext.dev/ar/docs/configuration-page-layout.md#صيغ-كتابة-أنماط-الترقيم) — وأي نص آخر يُطبع حرفيًا (`'Chapter {1}. '`، `'{1}.{2}'`، `'第{1:一}回'` لطباعة 第一百二十回؛ والشرطة المائلة العكسية تجعل القوس المعقوف حرفيًا). الرمز الذي ما زال عدّاده فارغًا يختفي مع الفاصل المجاور له. القيمة الفارغة (الافتراضية) تعني عدم وجود رقم تلقائي. يُضاف الرقم الناتج قبل العنوان في التدفق، ويغذي العنصر النائب `{number}` في خانة التصميم المتقدم (حيث لا تُضاف البادئة نفسها)، ويُطبع في جدول المحتويات. انظر [الأعداد المكتوبة بالحروف](https://postext.dev/ar/docs/configuration-text.md#الأعداد-المكتوبة-بالحروف) للكلمات، و[أنماط العناوين](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) لقالب خاص ببعض عناوين مستوى ما. |
| `numberSeparator` | `string` | `' '` | ما يقع بين الرقم والعنوان: في العمود، وفي الافتتاحية الافتراضية لمستوى `span: 'page'`، وفي الترويسات التي تطبع سطر العنوان، وفي إشارات PDF المرجعية. وفاصل المستوى 1 يربط أيضًا رقم الجزء بعنوانه في صفحة الجزء الافتراضية وفي صف الجزء الافتراضي في جدول المحتويات. تأخذ عناوين الفصول الصينية مسافة إيديوغرافية أو لا شيء (`'　'`: 第一回　甄士隱夢幻識通靈). يحتفظ جدول المحتويات بعمود أرقامه الخاص (`toc.levels[].numberGap`). ويجوز أن يضبط [نمط العنوان](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) فاصله الخاص. حين يُقسم عنوان إلى شطرين باستخدام `\\`، كما تُقسم عناوين الفصول المزدوجة في الروايات الصينية، تربط الصيغ ذات السطر الواحد (العمود، وجدول المحتويات، والترويسات) الشطرين بمسافة إيديوغرافية حين يكون الجانبان حروفًا صينية أو يابانية، وبمسافة عادية في غير ذلك. |
| `numberPosition` | `'before' \| 'replace'` | `'before'` | موضع الرقم المولَّد. `'before'`: قبل العنوان، موصولًا به عبر `numberSeparator`. `'replace'`: الرقم هو العنوان كله، ولا يُطبع العنوان المكتوب في المصدر، فإن `# Night` مع `numberingTemplate: 'الليلة {1:ordinal-feminine}'` يطبع الليلة الثانية. يُدرج جدول المحتويات الرقم عنوانًا للمدخل (بلا عمود أرقام)، وتقرؤه أيضًا الترويسات (`{chapterTitle}`، `{titleText}`) وإشارات PDF المرجعية؛ ويكون `{number}` فارغًا لمثل هذا العنوان. لا يسري إلا على العناوين المرقّمة التي لها قالب (قالب مستواها أو نمطها)؛ وأي عنوان آخر يحتفظ بنصه. ويجوز أن يضبط [نمط العنوان](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) قيمته الخاصة، `'before'` للاحتفاظ بالعناوين التي كان مستواه سيستبدلها. |
| `breakBefore` | `HeadingBreakBeforeConfig` | H1: `{ enabled: true, parity: 'always-odd' }` H2–H6: `{ enabled: false, parity: 'any' }` | فرض فاصل صفحة قبل كل عنوان من هذا المستوى. `parity: 'odd'` / `'even'` يقيّد كذلك الجانب الذي يُفتتح فيه العنوان من الصفحتين المتقابلتين — وتُدرج صفحة حشو فارغة عند الحاجة (وتُحتسب في ترقيم الصفحات). أما `'always-odd'` / `'always-even'` فتضمنان فوق ذلك صفحة فاصلة فارغة إلزامية واحدة على الأقل بين المحتوى السابق والعنوان الجديد (تنتمي الصفحة الفاصلة إلى الفصل السابق؛ وأي حشو إضافي للزوجية ينتمي إلى الفصل الجديد). حين يكون العنوان أول كتلة في المستند والصفحة الأولى ما زالت فارغة، يُتخطى فرض الزوجية — فيقع العنوان في الصفحة 1 كما كُتب. الحقل غير المضبوط يحتفظ بالقيمة الافتراضية للمستوى: `{ parity: 'odd' }` في H1 يظل يفرض الفاصل. |
| `hidden` | `boolean` | `false` | عنوان بنيوي: لا يطبع شيئًا ولا يشغل مكانًا في العمود ولا في إطار — لا نص ولا هوامش ولا شريط افتتاح — لكنه يفعل كل ما يفعله العنوان عدا ذلك. ما زال `breakBefore` الخاص به يفتح صفحة، ويفتتح قسم نمطه، ويُعدّ (ما لم يقل نمطه `numbered: false`)، ويُدرجه `:::toc`، وتسمّيه ترويسات `{chapterTitle}`، ويحصل على إشارة مرجعية في PDF. يناسب الإهداء أو صفحة التصدير (epigraph) أو بيانات الطبع (colophon) التي يحتاجها جدول المحتويات وإشارات القارئ المرجعية، ولا تُظهرها الصفحة. اضبطه على [نمط عنوان](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) لا على مستوى كامل؛ ويتجاوزه العنوان باستخدام `{hidden="true"}` / `{hidden="false"}`. |

```ts
headings: {
  fontFamily: 'Merriweather',
  levels: [
    // Canonical book preset: chapters on a right-hand (odd) page.
    { level: 1, fontSize: { value: 24, unit: 'pt' }, breakBefore: { enabled: true, parity: 'odd' } },
    { level: 2, fontSize: { value: 18, unit: 'pt' }, italic: true },
  ]
}
```

يعمل `snapToGrid` لكل مستوى أيضًا. إن لم يُضبط، يتبع المستوى `headings.snapToGrid`؛ وإن ضُبط، تجاوزه — فيمكن لمستند واحد أن يضع عناوين H2 فيه على بعد سطر ونصف فوق نصها، خارج الشبكة حتى نقطة الالتقاط التالية، بينما تقرّب عناوين H3 المسافة تحتها صعودًا إلى أسطر شبكة كاملة. ويمكن لنمط العنوان أن يضبطه كذلك، للعناوين التي تستخدمه.

```ts
headings: {
  marginBottom: { value: 1.5, unit: 'em' },
  levels: [
    { level: 2, snapToGrid: false }, // exactly 1.5 em under every H2
    { level: 3 },                    // inherits headings.snapToGrid: true
  ],
}
```

### الفاصل قبل العنوان

`breakBefore` مستقل عن عناصر التحكم في الترقيم: تفعيله يفرض فاصل صفحة، لكن العدّاد الرقمي لا يُعاد ضبطه إلا حين تُدرج صراحةً توجيه `:::numbering`. تُحتسب صفحات الزوجية الفارغة صفحاتٍ حقيقية في التسلسل، وتتلقى الترويسات والتذييلات وفق قواعدها المعتادة للصفحات الفردية والزوجية.

التوجيه `:::pagebreak` الواقع مباشرة قبل مثل هذا العنوان لا يحل محل فاصله: يظل العنوان يطبّق زوجيته بعد الصفحة التي فتحها التوجيه، وقد يضيف ذلك صفحة فارغة. انظر [أنماط العناوين](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين) لعنوان ينبغي أن يبدأ مباشرة بعد فاصل يدوي.

#### قيم الزوجية

| القيمة | السلوك |
| --- | --- |
| `'any'` (الافتراضية) | لا قيد على الزوجية. يُفتتح العنوان ببساطة في الصفحة التالية. |
| `'odd'` | ضمان أن يُفتتح العنوان في صفحة فردية (يمنى في الكتاب اللاتيني). لا تُدرج صفحة فارغة واحدة إلا إذا كانت الصفحة التالية الطبيعية زوجية. |
| `'even'` | مثلها، لكن لصفحة زوجية (يسرى في الكتاب اللاتيني). |
| `'always-odd'` | ضمان **صفحة فاصلة فارغة إلزامية واحدة على الأقل** بين المحتوى السابق والعنوان الجديد، ثم ضمان أن تكون الصفحة فردية. مفيدة حين يجب أن يبدأ كل فصل في صفحتين متقابلتين جديدتين. |
| `'always-even'` | مثلها، لكن لصفحة زوجية. |

#### تبعية الصفحات الفارغة

تحمل الصفحات الفارغة التي يدرجها `breakBefore` ترويسات بعنوان الفصل بحسب *سبب* إدراجها:

- الصفحات المدرجة لتلبية قيد الزوجية (`'odd'` أو `'even'` أو ذيل الزوجية في `'always-*'`) تنتمي إلى الفصل **القادم**. يُحلّ العنصر النائب `{chapterTitle}` في ترويستها إلى عنوان الفصل الجديد — لأن الصفحة الفارغة لا توجد إلا لدفع الفصل الجديد إلى الزوجية الصحيحة.
- الصفحة الفاصلة الإلزامية في البداية التي يدرجها `'always-odd'` / `'always-even'` تنتمي إلى الفصل **السابق**. إنها استراحة مقصودة في نهاية الفصل، لذا تظل ترويسة `{chapterTitle}` تُظهر عنوان الفصل القديم.

تتبع ترويسات القسم المنمَّط ولوحة ألوانه (انظر [أنماط العناوين](https://postext.dev/ar/docs/configuration-styles.md#أنماط-العناوين)) القاعدتين نفسيهما في الصفحات الفارغة.

#### استثناء بداية المستند

حين تكون أول كتلة في المستند عنوانًا مفعَّلًا فيه `breakBefore` — أو حين يبدأ المصدر بالتوجيه `:::pagebreak` — يُتخطى فرض الزوجية ما دامت الصفحة الأولى فارغة. يقع العنوان في الصفحة 1 كما كُتب، بصرف النظر عن الزوجية المضبوطة، فلا يرث مستند يبدأ بالعنوان `# Chapter 1` المضبوط على `parity: 'odd'` صفحة فارغة زائفة في بدايته. وبمجرد وضع أي محتوى، يعمل فرض الزوجية كالمعتاد.

### الامتداد والتصميم المتقدم

يقبل كل مستوى عناوين حقلين إضافيين يتحكمان في طريقة رسم العنوان صفحةَ افتتاح فصل بعرض الصفحة كله.

| الخاصية | النوع | الافتراضي | الوصف |
| --- | --- | --- | --- |
| `span` | `'column' \| 'page'` | `'column'` | عند `'page'` يُعامل العنوان صفحةَ افتتاح فصل (opener)، ويُلحق تصميمه المتقدم (إن كان مفعّلًا) بالصفحة شريطَ افتتاح فوق المتن. اقرنه بالقيمة `breakBefore.enabled: true` كي تبدأ الافتتاحية صفحة جديدة دائمًا. إن لم يكن له تصميم خاص، ترسم العنوانَ افتتاحيةٌ افتراضية عبر منطقة المحتوى كلها، بطباعة المستوى وتباعد أسطره، مع مقاطعه العريضة والمائلة والعلوية والسفلية (`headings.inlineMarks`)، ويُقاس الشريط بذلك العرض. يتسع الشريط لكل سطر ترسمه الافتتاحية: حيث تأخذ الافتتاحية أسطرًا أكثر مما يأخذه العنوان في قياسه الخاص (عنوان مضبوط كانت مسافاته ستنكمش ليسعه سطر واحد، أو فاصل قسري `\\`)، يأخذها الشريط أيضًا. حتى postext 1.4 كان الشريط يُقاس والعنوان ملتف بعرض العمود، فكان العنوان الذي يسعه سطر واحد في منطقة المحتوى يأخذ شريطًا بارتفاع سطرين، والسطر موسَّط فيه. تبدأ الأعمدة الأخرى تحت الشريط كما يبدأ عمود العنوان نفسه. النص الذي يفتتح أحدها يبدأ حيث كان سيبدأ النص الواقع مباشرة تحت الافتتاحية، أيًّا كان ما يلي الافتتاحية في عمودها: `marginBottom` الخاص بالافتتاحية تحت عنوانها أو تصميمها، مأخوذًا إلى سطر الشبكة التالي حين يلتقط المستوى الشبكة. العنوان أو المعادلة المنفصلة أو صف جدول المحتويات الذي يفتتح أحدها يوضع على مستوى أول عنوان أو معادلة منفصلة تحت الافتتاحية، مع حساب الهوامش كما هناك؛ وحين يستمر عمود الافتتاحية بأي شيء آخر، يبدأ حيث يبدأ ذلك النص. العنوان المخفي تحت الافتتاحية لا يُحتسب، والمسافة التي تضيفها [موازنة الأعمدة](https://postext.dev/ar/docs/configuration-text.md#موازنة-الأعمدة) فوق العنوان الواقع تحت الافتتاحية لا تتكرر في الأعمدة الأخرى. ما تلتقطه هذه الأعمدة إلى الشبكة يقع على شبكة الصفحة. حتى postext 1.4 كانت كتلتها الأولى تستقر عند قاعدة الشريط: خارج الشبكة حين ينتهي الشريط بين سطرين، وملاصقة للشريط تمامًا بلا هامش حين يلي الافتتاحيةَ عنوان (أعلى بسطر مما هي الآن حين ينتهي الشريط على الشبكة)؛ وكان العنوان هناك يُسقط أيضًا الهامش العلوي الذي احتفظ به عنوان العمود الأول. |
| `spanBreak` | `boolean` | `true` | هل يبدأ العنوان ذو `span: 'page'` صفحة جديدة. `true` يفتح الصفحة التالية (ويختار `breakBefore` جهتها). و`false` مع `breakBefore.enabled: false` يفتحه حيث يصل النص، كما يفعل الإطار الممتد على الصفحة: تنتهي الأعمدة التي فوقه على ارتفاع واحد (يُوازَن الشريط حين يكون `headings.balancing.trailing` مفعّلًا)، ويُصفّ تصميم العنوان أو الافتتاح الافتراضي بعرض منطقة المحتوى تحتها، ويستمر النص في كل الأعمدة تحته: كالمقال الثاني في نشرة تحت نهاية الأول. وإن لم يتسع ما بقي من مساحة للعنوان وللحد الأدنى من الأسطر الأرملة تحته، فتح الصفحة التالية كما مع `true`. ويبقى دور الصفحة ما تحدده كتلتها الأولى. لا أثر له في عنوان `span: 'column'`. ويُضبط في نمط العنوان أيضًا. منذ postext 1.19. |
| `advancedDesign` | `HeadingAdvancedDesignConfig` | `{ enabled: false, slot: { elements: [] } }` | خانة تصميم حرّ التركيب لهذا المستوى. عند `enabled` تؤلف عناصر الخانة الافتتاحية. استخدم `{titleText}` داخل عنصر نصي لرسم نص العنوان؛ واستخدم `{number}` و`{numberRoman}` وغيرهما لإدراج رقم العنوان المنسَّق. |
| `advancedDesign.minHeight` | `Dimension` | — | أدنى ارتفاع محجوز للعنوان في تدفق العمود. يأخذ العنوان `max(design content bottom, minHeight)`، ثم `marginBottom` الخاص بالعنوان تحته (من نمط عنوانه أو مستواه أو `headings.marginBottom`؛ 0.5 em من حجم العنوان افتراضيًا)، ويُقرَّب المجموع صعودًا إلى شبكة خطوط الأساس حين تلتقط العناوين الشبكة. وهكذا يمكن للافتتاحية أن تدفع النص الأساسي إلى الأسفل (أو أن تستحوذ على الصفحة كلها) حتى حين تكون عناصرها قصيرة أو مثبتة إلى إطارَي الصفحة أو النزف فوق العنوان. لشريط ارتفاعه `minHeight` بالضبط، اضبط ذلك `marginBottom` على 0 واجعل `minHeight` عددًا صحيحًا من أسطر الشبكة. يسري كلما كانت قيمة `enabled` هي true، حتى مع خانة فارغة. انظر [الارتفاع المحجوز](https://postext.dev/ar/docs/configuration-text.md#الارتفاع-المحجوز) لما يحتسبه أسفل محتوى التصميم. |

**افتتاحية بطول الصفحة.** حين يمتد الارتفاع المحجوز إلى ما بعد قاعدة العمود — غلاف قيمة `minHeight` فيه تساوي ارتفاع الصفحة، أو صورة أو صندوق مثبت إلى الصفحة أو النزف ويمتد حتى حدّ القص — تستحوذ الافتتاحية على بقية الصفحة: يبدأ النص الذي يليها في الصفحة التالية، في كل عمود من تخطيط بعمودين أو بعمود ونصف على السواء. لذلك لا يحتاج الغلاف إلى `:::pagebreak` بعده (ولا ضرر من وجوده: لا يضيف صفحة فارغة). العنوان داخل العمود (`span: 'column'`) الذي يكون تصميمه أطول من عموده يستحوذ على ذلك العمود، ويبدأ النص عند رأس العمود التالي. عندئذ تمتد كتلة العنوان حتى قاعدة العمود الذي تستحوذ عليه، ويُخرج تصميمها مقابل ذلك الشريط: العناصر المثبتة إلى الأعلى تبقى حيث ثُبتت، والعناصر التي تتبع الشريط — المثبتة إلى وسطه أو قاعدته، أو التي ارتفاعها `'fill'` — تلتزم بالمتسع الذي يستحوذ عليه العنوان، كما تلتزم بالارتفاع المحجوز حين يتسع له العمود (حتى postext 1.4 كانت الكتلة تحتفظ بارتفاع نصها، فكانت تلك العناصر تُخرج مقابل شريط بارتفاع عنوان واحد، ويستمر النص الذي بعده تحت التصميم). عناصر الصفحة الثابتة التي لا ينبغي أن تستحوذ على الصفحة — شريط على الحافة الخارجية (fore-edge) بطول الصفحة كلها، أو زخرفة في أسفل الصفحة — مكانها تصميم الترويسة أو التذييل: إذا ثُبتت إلى `'page'` أو `'bleed'` وعُرضت مع `pages: 'opener'`، فإنها تُرسم في صفحة الافتتاح ولا تحجز أي مساحة من المتن.

مثال: افتتاحية فصل بسيطة تُظهر «Chapter N» فوق العنوان:

```json
{
  "headings": {
    "levels": [
      {
        "level": 1,
        "span": "page",
        "breakBefore": { "enabled": true, "parity": "always-odd" },
        "advancedDesign": {
          "enabled": true,
          "slot": {
            "elements": [
              {
                "kind": "text",
                "id": "chapterLabel",
                "placement": {
                  "anchor": { "to": "container", "edge": "top" },
                  "offset": { "y": { "value": 48, "unit": "pt" } },
                  "size": { "width": "fill" }
                },
                "content": "Chapter {numberRoman}",
                "fontSize": { "value": 10, "unit": "pt" },
                "align": "center",
                "overflow": "ellipsis-end"
              },
              {
                "kind": "text",
                "id": "chapterTitle",
                "placement": {
                  "anchor": { "to": "#chapterLabel", "edge": "below" },
                  "offset": { "y": { "value": 12, "unit": "pt" } },
                  "size": { "width": "fill" }
                },
                "content": "{titleText}",
                "fontSize": { "value": 24, "unit": "pt" },
                "fontWeight": 700,
                "align": "center",
                "overflow": "wrap",
                "hyphenate": true
              }
            ]
          }
        }
      }
    ]
  }
}
```

العناصر النائبة الخاصة بالعناوين المتاحة داخل خانة تصميم المستوى:

- `{titleText}` — النص العادي للعنوان (بلا بادئة الترقيم). الفاصل القسري في العنوان (`\\`) يكون فاصل سطر هنا، في شريط الافتتاح وفي التصميم داخل العمود على السواء (حتى postext 1.4 كان التصميم داخل العمود يطبع مسافة مكانه، بينما يُقاس ارتفاعه مع الفاصل). الأسطر التي يلتف إليها العنوان المخفي في عموده تُضمّ مجددًا في العنوان كما كُتب: الكلمة المقسومة بعد واصلتها الأصلية تحتفظ بالواصلة بلا مسافة بعدها، والكلمة التي قسمها العمود تعود كاملة بلا الواصلة التي أضافها الفصل، والمجموعة الملتحمة بمسافة غير قابلة للفصل التي كانت أعرض من العمود فقُسمت عند تلك المسافة تستعيد مسافتها غير القابلة للفصل (`Capítulo XVIII` لا `CapítuloXVIII`)، وكل فاصل آخر يعيد مسافته الواحدة. حتى postext 1.4 كان كل فاصل سطر يصبح مسافة، فكان العنوان الملتف عند واصلة يطبع `Word- Book`، وكان الفاصل القسري في مثل هذا العنوان يُحذف.
- `{number}` — الرقم المنسَّق وفق `numberingTemplate` الخاص بالمستوى.
- `{numberDecimal}`, `{numberRoman}`, `{numberRomanLower}`, `{numberAlpha}`, `{numberAlphaLower}` — عدّاد العنوان (العدّ الجاري لمستواه، أيًا كان ما يطبعه القالب) بصيغ أعداد أخرى: الفصل الثالث يعطي `3` و`III` و`iii` و`C` و`c`، مع `numberingTemplate` أو بدونه. العنوان غير المرقّم (نمط فيه `numbered: false`) يتركها فارغة.
- `{numberWords}`, `{numberWordsLower}`, `{numberOrdinalWords}`, `{numberOrdinalWordsLower}` — العدّاد نفسه مكتوبًا بالحروف، بحرف أول كبير أو بأحرف صغيرة: *Three* / *three*، *Third* / *third* (انظر [الأعداد المكتوبة بالحروف](https://postext.dev/ar/docs/configuration-text.md#الأعداد-المكتوبة-بالحروف)).
- `{numberHan}` — العدّاد نفسه بالأرقام الصينية، بنظام الكتابة الذي يحدده `locale` الخاص بالمستند: الافتتاحية المضبوطة بالقالب `第{numberHan}回` تطبع 第十二回 للفصل الثاني عشر بينما يُدرج جدول المحتويات `12`.
- `{chapterNumber}`, `{chapterTitle}`, `{pageNumber}`, `{totalPages}`, `{bookTotalPages}`, `{title}`, `{subtitle}`, `{author}`, `{publishDate}` — عناصر نائبة مشتركة للبيانات الوصفية.
- `{attr.<key>}` — سمة مكتوبة على سطر العنوان نفسه (`# Title {author="I. Zango Martín"}`)، وإلا فسمة H1 للفصل الحالي. السمات المفقودة تُحلّ إلى سلسلة فارغة دون تحذير.

يطبع `{chapterNumber}` ما تطبعه الترويسات للفصل: رقم H1 حين يكون لمستواه (أو لنمطه) `numberingTemplate`، وإلا فترتيب الفصل — `1`، `2`… مستمرًا بعد الفصول التي أُخرجت قبل هذا الفصل — ولا شيء لفصل غير مرقّم أو لنمط قالبه `''`. يقرأ تصميم العنوان الفصل الذي ينتمي إليه عنوانه: عنوان المستوى 1 يقرأ فصله، والعنوان الأدنى يقرأ آخر عنوان من المستوى 1 قبله. ويصح ذلك أيضًا حيث يلتقي فصلان في صفحة واحدة، بينما تطبع ترويسات تلك الصفحة الفصل اللاحق. ويُقاس الارتفاع الذي تحجزه الافتتاحية بالقيمة نفسها. حتى postext 1.4 كان يُقاس ببادئة رقم العنوان (الفارغة دون قالب)، فقد يُرسم التصميم الذي يعتمد ارتفاعه على `{chapterNumber}` أطول من المتسع الذي أخذه؛ وكان التصميم يطبع فصل الصفحة، فكان أول فصلين يتشاركان صفحة يُظهر رقم الثاني.

تتبع العناصر النائبة للعدّاد الكتابَ عبر الفصول التي تُخرج واحدًا تلو الآخر (العدّادات التي تمررها `continuationAfter()`)، وتعيد السمة `startAt` في العنوان بدء عدّها (انظر **صيغة المستند › سمات العناوين**). افتتاحية تقول *Chapter III* فوق عنوان مرقّم `3.` في التدفق وفي جدول المحتويات:

```ts
{
  level: 1,
  span: 'page',
  numberingTemplate: '{1}.',
  advancedDesign: {
    enabled: true,
    slot: { elements: [
      { kind: 'text', id: 'label', content: 'Chapter {numberRoman}', fontSize: { value: 10, unit: 'pt' }, overflow: 'ellipsis-end',
        placement: { anchor: { to: 'container', edge: 'top-left' }, size: { width: 'fill', height: 'auto' } } },
      { kind: 'text', id: 'title', content: '{titleText}', fontSize: { value: 24, unit: 'pt' }, overflow: 'wrap',
        placement: { anchor: { to: '#label', edge: 'below' }, size: { width: 'fill', height: 'auto' } } },
    ] },
  },
}
```

#### الارتفاع المحجوز

يشغل العنوان ذو التصميم المتقدم مكانًا في العمود كأي كتلة: يبدأ النص الأساسي بعده تحت ذلك المكان. والمكان هو أكبر ثلاثة ارتفاعات، تُقاس كلها نزولًا من أعلى العنوان (من أعلى منطقة المحتوى في افتتاحية تبدأ صفحتها):

1. نص العنوان نفسه، مضبوطًا بطباعة المستوى (يكون مخفيًا تحت التصميم، لكنه يحتفظ بأسطره)؛
2. أسفل محتوى التصميم — أدنى حافة سفلية بين العناصر المحتسبة (أدناه)؛
3. `advancedDesign.minHeight`.

يُضاف `marginBottom` الخاص بالعنوان بعده (من نمط عنوانه أو مستواه أو `headings.marginBottom`؛ 0.5 em افتراضيًا)، ويُلتقط الناتج صعودًا إلى شبكة خطوط الأساس حين تلتقط العناوين الشبكة. في الافتتاحية (`span: 'page'`) يُترك الشريط نفسه خاليًا في كل عمود من الصفحة. وفي العنوان داخل العمود الذي يتسع له عموده، يُخرج التصميم في صندوق العنوان، الذي يكون بهذا الارتفاع بالضبط.

**أي العناصر تُحتسب.** كل عنصر في التصميم يُحتسب — النصوص والخطوط والصناديق والصور على السواء (حتى postext 1.4 لم يكن عنصر `image` يُحتسب أبدًا، فكان النص قد يبدأ فوق صورة الشريط ما لم يُبعده `minHeight`) — باستثناء:

- **العناصر التي فيها `reserve: false`** — زخرفة يجوز أن تقع تحت النص؛
- **العناصر التي تتبع الشريط نفسه** — المثبتة إلى الصف الأوسط من الحاوية (`left`، `center`، `right`) أو صفها السفلي (`bottom-left`، `bottom`، `bottom-right`)، والتي ارتفاعها `'fill'` مقابل الحاوية (الصندوق أو الخط العمودي الذي لا ارتفاع له يملؤها افتراضيًا)، وأي عنصر مثبت إلى أحدها. الحاوية هي الشريط المحجوز، فهذه العناصر تستقر على قاعدته أو تمتد عبره: خط تحت الشريط، أو لوحة ملوّنة خلف العنوان. إنها تتبع الارتفاع ولا تحدده أبدًا. والنص بينها الذي يحتفظ بارتفاعه الخاص ما زال يحتاج إلى متسع: نص العنوان المثبت إلى قاعدة الشريط يجعل الشريط بطول ذلك النص على الأقل، فلا يبدأ أبدًا فوق أعلى العنوان. مع `minHeight: 36mm` ونص العنوان مثبت `bottom-left`، يكون صندوق العنوان 36 مم مضافًا إليها `marginBottom` الخاص به، مقرَّبًا صعودًا إلى الشبكة، ويقع نص العنوان عند قاعدة ذلك الصندوق، فوق النص التالي مباشرة؛ ومن دون `minHeight`، فإن نص العنوان الذي يأخذ أسطرًا أكثر من نص العنوان المخفي يجعل الشريط بعمق ذلك النص. حتى postext 1.4 كان مثل هذا النص يُرسم صاعدًا فوق النص الذي يسبق العنوان. الصناديق والخطوط والصور التي تتبع الشريط لا تضع حدًا أدنى كهذا، فاللوحة المثبتة إلى القاعدة يمكن أن تمتد فوق العنوان.

العناصر المثبتة إلى الصفحة أو النزف تُحتسب بقدر امتدادها تحت أعلى العنوان. الشريط الممتد عبر أعلى الصفحة الذي ينتهي فوق العنوان لا يُحتسب منه شيء؛ والصورة الممتدة إلى النزف الكامل التي تتجاوزه تدفع النص إلى أسفل حتى حافتها السفلى. وكذلك أي شيء يقع منخفضًا في الصفحة: الختم على بعد 25 مم فوق أسفل الصفحة، أو الشريط الجانبي بطول الصفحة، أو الإطار، يحجز الصفحة حتى حافته السفلى، وعادة يبدأ النص في الصفحة التالية. علّم مثل هذه الزخرفة بالقيمة `reserve: false` — فهي تظل تُرسم ويمكن للعناصر أن تُثبت إليها — وأعطِ العنوان المتسع الذي يحتاجه بعناصره النصية أو بالقيمة `minHeight`:

```json
{
  "kind": "image", "id": "seal", "resourceId": "seal", "reserve": false,
  "placement": {
    "anchor": { "to": "page", "edge": "bottom-right" },
    "offset": { "x": { "value": -25, "unit": "mm" }, "y": { "value": -25, "unit": "mm" } },
    "size": { "width": { "value": 30, "unit": "mm" } }
  }
}
```

العنصر المثبت إلى عنصر لا يحجز مكانًا يظل يُحتسب ما لم يُعلَّم هو أيضًا (التعليق المثبت إلى الختم يحتاج إلى `reserve: false` خاص به).

**أين يُرسم.** يُرسم تصميم الافتتاحية (`span: 'page'`) قبل المتن، فالزخرفة التي لا تحجز شيئًا تقع تحت النص. أما تصميم العنوان داخل العمود فيُرسم مع كتلة العنوان — فوق الكتل التي تسبقه في العمود، وتحت الكتل التي تليه — حيثما وُضع فوق قاعدة عموده: في الهوامش الجانبية، والهامش العلوي، والنزف، والأعمدة المجاورة أيضًا. تقصّه قاعدة العمود، في Canvas وفي PDF، لأن التدفق ينتهي هناك (انظر **أطول من العمود** أدناه). حتى postext 1.4 كانت Canvas وPDF تقصّانه أيضًا عند أعلى عموده، فكان الشريط المثبت إلى أعلى الصفحة أو النزف يمتد إلى الهوامش الجانبية لكنه يتوقف عند الهامش العلوي. الزخرفة المثبتة إلى أسفل الصفحة مكانها الافتتاحية، أو تصميم التذييل مع `pages: 'opener'`.

**أطول من العمود.** حين يمتد المتسع إلى ما بعد قاعدة العمود — `minHeight` بطول الصفحة، أو صورة أو إطار يمتد حتى حدّ القص — يستحوذ العنوان على بقية صفحته (الافتتاحية، في كل عمود) أو عموده (العنوان داخل العمود)، ويبدأ النص الذي بعده في الصفحة أو العمود التالي. عندئذ تمتد كتلته حتى قاعدة العمود، ولا تُقصّ أبدًا إلى ارتفاع نصها، فيكون الشريط الذي يُخرج تصميمه مقابله هو المتسع الذي يستحوذ عليه (بما في ذلك `minHeight`، حتى القاعدة). التصميم الأطول من الصفحة نفسها — نص تمهيدي طويل في صفحة شاشة صغيرة — يظل يُقصّ عند أسفل الصفحة (والتصميم داخل العمود عند أسفل عموده): يُدرجه Sandbox في لوحة **الفحوص** باسم *تصميم العنوان مقطوع*. لا يصدر الإخراج تحذيرًا بشأنه — فالغلاف الذي يستحوذ على صفحته حالة معتادة ولا يفقد شيئًا — لكن أي مضيف يمكنه إجراء الفحص نفسه على الإخراج النهائي: تعيد `collectHeadingDesignCuts(doc)` كائنًا `{ kind: 'headingDesignCut', pageIndex, level, where, overflowPx, sourceStart, sourceEnd }` لكل عنوان يقع نص تصميمه بعد أسفل حدّ قص الصفحة (`where: 'page'`، افتتاحية) أو بعد أسفل عموده (`where: 'column'`)، وتصف `formatWarning` كلًا منها. انظر **افتتاحية بطول الصفحة** ضمن [الامتداد والتصميم المتقدم](https://postext.dev/ar/docs/configuration-text.md#الامتداد-والتصميم-المتقدم).

**العمود الجانبي.** في تخطيط العمود ونصف الذي يحمل عموده الجانبي العناصر العائمة (`sideColumnRole: 'floats'`)، فإن عنصر تصميم عنوان داخل العمود الذي يقف في العمود الجانبي — رقم فصل مثبت إلى الصفحة في عمود الهامش الخارجي لافتتاحية كتاب مدرسي — يُبعد عنه مكدّس العناصر الجانبية. كل شكل أو جدول أو إطار `span: 'side'` تضعه الصفحة بعد العنوان يترك فجوة عنصر عائم واحدة بينه وبين كل عنصر من هذا النوع: يبقى حيث يضعه المكدّس حين يتسع فوق العنصر، وإلا ذهب تحته — أو انتظر الصفحة التالية حين لا تتسع له بقية العمود الجانبي هناك. وهكذا فإن رقمًا عند رأس الهامش يُبقي المكدّس كله تحته، بينما رقم قسم معلّق في الهامش بجانب عنوان أدنى في الصفحة يترك رأس الهامش للأشكال التي تحيل إليها الصفحة (يبقى الشكل الهامشي في أعلى صفحته). ما يحمله العمود الجانبي بالفعل عند وضع العنوان لا يُحرّك: الشكل المكدّس سابقًا في الصفحة والذي يمتد حتى عنصر العنوان يبقى حيث هو، تحت العنصر، لذا فإن التصميم الذي يقف عنصره في العمود الجانبي في منتصف الصفحة يحتاج إلى أن تأتي الإحالة إلى أشكاله بعد العنوان. العناصر التي فيها `reserve: false` تترك العمود الجانبي حرًا، كما تترك النص. الافتتاحية (`span: 'page'`) لا تحتاج إلى شيء من هذا: شريطها محجوز في كل عمود، بما فيه العمود الجانبي. حتى postext 1.4 كان الشكل الجانبي المحال إليه في مثل هذه الافتتاحية يوضع عند رأس العمود الجانبي، فوق الرقم.

**الأغلفة.** عنوان الغلاف الذي يملأ صفحته — `minHeight` بطول الصفحة، أو صورة بحجم الصفحة الكاملة في تصميمه — يرسل إذن النص الذي بعده إلى الصفحة التالية بنفسه، في التخطيطات ذات العمود الواحد والأعمدة المتعددة على السواء. والتوجيه `:::pagebreak` بعده مباشرة اختياري ولا ضرر منه: فاصل الصفحة في صفحة ما زالت فارغة لا يفعل شيئًا، فلا يضيف صفحة فارغة أبدًا. لا يُحتاج إليه إلا حين يتوقف تصميم الغلاف قبل أسفل الصفحة ويُراد مع ذلك أن يبدأ النص في صفحة جديدة.

```md
# Annual report 2026 {style="cover"}

:::pagebreak

# Letter from the chair
```

### الأعداد المكتوبة بالحروف

لاحقتان من لواحق قالب الترقيم تكتبان العدّاد بالكلمات، بلغة المستند (`locale` في المستوى الأعلى، وإلا فلغة تقسيم الكلمات — انظر [لغة المستند](https://postext.dev/ar/docs/configuration-text.md#لغة-المستند)): `words` للعدد الأصلي و`ordinal` للعدد الترتيبي. حالة أحرف اللاحقة تحدد حالة أحرف الكلمات، كما تفعل `A` / `a` للحروف:

| الرمز | الإنجليزية (21) | الإسبانية (21) | الصينية (21) |
| --- | --- | --- | --- |
| `{1:words}` | twenty-one | veintiuno | 二十一 |
| `{1:Words}` | Twenty-one | Veintiuno | 二十一 |
| `{1:WORDS}` | TWENTY-ONE | VEINTIUNO | 二十一 |
| `{1:ordinal}` | twenty-first | vigesimoprimero | 第二十一 |
| `{1:Ordinal}` | Twenty-first | Vigesimoprimero | 第二十一 |
| `{1:ORDINAL}` | TWENTY-FIRST | VIGESIMOPRIMERO | 第二十一 |

تُكتب الأعداد بالكلمات في الإنجليزية والإسبانية والصينية والعربية؛ وأي لغة أخرى تأخذ الكلمات الإنجليزية، كما تفعل نصوص استمرار الجداول المدمجة. تكتب الصينية الأرقام غير الرسمية في `simp-chinese-informal` أو `trad-chinese-informal`، بحسب نظام الكتابة في `locale` (一万 / 一萬)، مع 第 قبل العدد الترتيبي؛ ولا حالة أحرف للحروف الصينية، فتطبع الكتابات الثلاث للاحقة النتيجة نفسها. تتبع الإنجليزية الاستعمال الأمريكي (*one hundred five*، بلا *and*). وتستخدم الإسبانية صيغ المذكر، كما يُرقَّم *capítulo* أو *libro* (*capítulo primero*، *tercero*، *veintiuno*)، وتكتب الأعداد الترتيبية من 13 إلى 29 كلمة واحدة، كما تفضّل الأكاديمية الملكية الإسبانية (RAE) (*decimotercero*، *vigesimoprimero*). تُكتب الأعداد الأصلية بالحروف حتى 999 999 والترتيبية الإسبانية حتى 999؛ وتُطبع الأعداد الأكبر بالأرقام.

تتطابق الأعداد العربية في التذكير والتأنيث مع المعدود، لذا تأخذ اللاحقة مُعدِّلًا: `-feminine` (أو `-f`) للمعدود المؤنث، و`-masculine` (`-m`، الافتراضي) للمذكر؛ و`-classical` تكتب المئات بصيغة مائة، كما تفعل طبعات بولاق ومعظم الطبعات المصرية، بدل صيغة مئة الحديثة. يكتب `{1:ordinal}` العدد الترتيبي المعرّف المرفوع الذي يستخدمه العنوان: `الفصل {1:ordinal}` يعطي *الفصل الأول*، *الفصل الحادي عشر*، *الفصل الحادي والعشرون*؛ و`الليلة {1:ordinal-feminine}` يعطي *الليلة الأولى*، *الليلة الحادية عشرة*، *الليلة الحادية والعشرون*، *الليلة المئتان*، وفوق المئة صيغة «بعد» الكلاسيكية: *الليلة الخامسة والأربعون بعد الثلاثمئة*، *الليلة الحادية بعد الألف*. ويكتب `{1:words}` العدد الأصلي (واحد وعشرون؛ والمؤنث إحدى عشرة، واحدة وعشرون). تُكتب الأعداد الترتيبية حتى 9 999 والأصلية حتى 99 999؛ ويمكن الجمع بين المعدّلات (`{1:ordinal-f-classical}`)، وتتجاهلها اللغات الأخرى. لا أحرف كبيرة في العربية، فلا تغيّر حالة أحرف اللاحقة شيئًا. العنصران النائبان للتصميم `{numberWords}` و`{numberOrdinalWords}` يكتبان صيغ المذكر؛ ولافتتاحية بصيغة المؤنث، ضع العدد الترتيبي في قالب المستوى واطبعه بالعنصر `{number}`.

في تصميم العنوان، يكتب `{numberWords}` / `{numberWordsLower}` و`{numberOrdinalWords}` / `{numberOrdinalWordsLower}` عدّاد العنوان بالطريقة نفسها، فيمكن أن تقول الافتتاحية *Chapter One* بينما يُدرج جدول المحتويات `1`. وتعطي `textTransform: 'uppercase'` في العنصر النصي الأحرف الكبيرة:

```ts
// Spanish novel: "CAPÍTULO PRIMERO" above the title, "1." in the contents.
{ level: 1, numberingTemplate: '{1}.', span: 'page',
  advancedDesign: { enabled: true, slot: { elements: [
    { kind: 'text', id: 'n', content: 'Capítulo {numberOrdinalWordsLower}', textTransform: 'uppercase', /* … */ },
    { kind: 'text', id: 't', content: '{titleText}', /* … */ },
  ] } } }
```

## القوائم غير المرقّمة

تتحكم الخاصية `unorderedLists` في طريقة إخراج القوائم النقطية (`-`، `*`، `+`) وقوائم المهام بصيغة GFM (`- [ ]`، `- [x]`). يمكن أن تتداخل القوائم حتى خمسة مستويات.

### القيم الافتراضية للقوائم غير المرقّمة

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `fontFamily` | `string` | ترث `bodyText.fontFamily` | الخط المستخدم لنص البند. |
| `color` | `ColorValue` | اللون الرئيسي (`#295AA3`) | لون نص البنود ونقاطها. مربوط بالمُدخل `main-color` في لوحة الألوان الافتراضية. |
| `fontWeight` | `number` | `700` | وزن خط نص البند (100–900). ترث النقاط هذا الوزن ما لم يُتجاوز في مستوى بعينه. |
| `italic` | `boolean` | `false` | يُخرج نص البند بخط مائل. |
| `bulletChar` | `string` | `'•'` | الرمز (glyph) المستخدم علامةً للنقطة. |
| `bulletFontSize` | `Dimension` | `1 em` | حجم رمز النقطة. تتغير الوحدات النسبية بتغير حجم خط المتن. |
| `gap` | `Dimension` | `0.5 em` | المسافة الأفقية بين النقطة ونص البند. |
| `indent` | `Dimension` | `0 em` | الإزاحة الأساسية للمستوى 1. تتسلسل المستويات الأعمق من موضع بداية نص المستوى الأب ما لم تُتجاوز (انظر أدناه). |
| `bulletVerticalOffset` | `Dimension` | `0 em` | ضبط دقيق للموضع الرأسي للنقطة. القيم السالبة ترفع النقطة، والموجبة تخفضها. |
| `marginTop` / `marginBottom` | `Dimension` | `1.5 em` | المسافة قبل القائمة كلها وبعدها. |
| `itemSpacing` | `Dimension` | `0 em` | مسافة رأسية إضافية تُدرج بين البنود فوق ارتفاع السطر. حول قائمة متداخلة في بند من قائمة أخرى، تُطبَّق مسافة القائمة الخارجية على الجانبين: قبل البند الأول من القائمة المتداخلة وبعد آخر بند فيها (حتى postext 1.4 كان البند التالي لقائمة متداخلة يأخذ مسافة القائمة المتداخلة). |
| `snapTopToGrid` | `boolean` | `false` | يقرّب المسافة فوق القائمة إلى الأعلى كي تستقر نقطتها الأولى على شبكة خطوط الأساس، كما يفعل النص تحت العنوان؛ وتصبح `marginTop` حينئذ حدًّا أدنى. نهاية القائمة تعيد التدفق إلى الشبكة في الحالتين، فإذا كانت `itemSpacing` تساوي 0 اصطفّ كل بند مع النص في العمود المجاور. معطّل افتراضيًا، كما كان حتى postext 1.4: قيمة `marginTop` التي لا تساوي عددًا صحيحًا من الأسطر تُبقي البنود خارج الشبكة حتى نهاية القائمة. لا يتأثر بذلك القوائم داخل الإطارات (callout)، إذ إن دواخلها خارج الشبكة أصلًا. |
| `hangingIndent` | `boolean` | `true` | عند تفعيله، تصطف الأسطر الملتفّة مع أول حرف من النص بدلًا من أن تبدأ تحت النقطة. |
| `levels` | `UnorderedListLevelConfig[]` | — | تجاوزات لكل عمق من المستويات 1–5. انظر أدناه. |

### امتدادات قوائم المهام

تُخرَج بنود المهام بصيغة GFM (`- [ ] …`، `- [x] …`) بنودًا غير مرقّمة يحل فيها رمز مربع اختيار محل النقطة. الحقول الآتية لا تنطبق إلا على بنود المهام:

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `taskCheckboxChar` | `string` | `'☐'` | الرمز المستخدم للمهام غير المنجزة. |
| `taskCheckedChar` | `string` | `'☑'` | الرمز المستخدم للمهام المنجزة. |
| `taskCompletedStrikethrough` | `boolean` | `true` | يرسم خط شطب عبر نص المهام المنجزة. |
| `taskCompletedColor` | `ColorValue` | يرث لون البند | لون اختياري يُطبَّق على نص المهام المنجزة. إذا أُغفل استُخدم لون البند المعتاد. |

### تجاوزات كل مستوى في القوائم غير المرقّمة

كل مُدخل في `levels` يستهدف عمقًا واحدًا (1–5) ويمكنه أن يتجاوز أيًّا مما يلي:

| الخاصية | النوع | الوصف |
| --- | --- | --- |
| `bulletChar` | `string` | رمز النقطة لهذا العمق. |
| `fontFamily` | `string` | عائلة خط البند لهذا العمق. |
| `fontSize` | `Dimension` | حجم رمز النقطة لهذا العمق. |
| `color` | `ColorValue` | لون البند. |
| `fontWeight` | `number` | وزن خط البند. |
| `italic` | `boolean` | تفعيل الخط المائل أو تعطيله. |
| `indent` | `Dimension` | إزاحة صريحة للنقطة في هذا العمق. انظر قاعدة التسلسل أدناه. |
| `verticalOffset` | `Dimension` | ضبط رأسي دقيق للنقطة في هذا العمق. |

**تسلسل الإزاحة.** يبدأ المستوى 1 دائمًا عند قيمة `indent` العامة (وهي افتراضيًا `0 em`، أي أن النقاط مثبّتة عند حافة العمود). في المستويات 2–5، إذا تركت `indent` دون تعريف وضع المحرّك النقطة عند موضع بداية نص المستوى *السابق* (إزاحة الأب + عرض النقطة + `gap`). عيّن `indent` صريحة لمستوى ما لتقطع التسلسل وتثبّت ذلك العمق حيث تشاء.

```ts
unorderedLists: {
  bulletChar: '—',
  gap: { value: 0.4, unit: 'em' },
  hangingIndent: true,
  levels: [
    { level: 2, bulletChar: '·' },
    { level: 3, bulletChar: '◦', color: { hex: '#666666', model: 'hex' } },
  ],
}
```

## القوائم المرقّمة

تتحكم الخاصية `orderedLists` في القوائم المرقّمة (`1.`، `2)`، إلخ). يمكن أن تتداخل القوائم حتى خمسة مستويات، ويمكن لكل عمق أن يستخدم تنسيق ترقيم مختلفًا.

### القيم الافتراضية للقوائم المرقّمة

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `fontFamily` | `string` | ترث `bodyText.fontFamily` | الخط المستخدم لنص البند ولعلامة الرقم. |
| `color` | `ColorValue` | اللون الرئيسي (`#295AA3`) | لون نص البنود وعلامات أرقامها. مربوط بالمُدخل `main-color` في لوحة الألوان الافتراضية. |
| `fontWeight` | `number` | `700` | وزن خط نص البند وعلامات الأرقام (100–900). |
| `italic` | `boolean` | `false` | يُخرج نص البند بخط مائل. |
| `numberFormat` | `OrderedListNumberFormat` | `'arabic'` | نمط الترقيم: `'arabic'`، `'lower-alpha'`، `'upper-alpha'`، `'lower-roman'`، `'upper-roman'`. تعمل كذلك الكتابات المستخدمة في الإعدادات الأخرى (`'decimal'`، `'roman-lower'`، `'i'`…؛ انظر [صيغ كتابة تنسيق الترقيم](https://postext.dev/ar/docs/configuration-page-layout.md#صيغ-كتابة-أنماط-الترقيم))؛ والقيمة غير المعروفة تُرقّم بالأرقام العربية (0–9) ويُبلَّغ عنها. |
| `prefix` | `string` | `''` | نص يوضع قبل الرقم، بنمط الفاصل: مع `'（'` هنا و`'）'` فاصلًا تُقرأ القائمة الصينية （一）، （二）. وحين يُرسم الفاصل مقطعًا مستقلًا، تُرسم البادئة مقطعًا مستقلًا كذلك، قبل الرقم مباشرة. |
| `separator` | `string` | `'.'` | الحرف الموضوع بين الرقم والنص، وهو عادةً `'.'` أو `')'`. |
| `separatorFontFamily` | `string` | ترث `fontFamily` | خط الفاصل. إذا اختلف أي جانب من نمط الفاصل عن نمط الرقم، رُسم الفاصل مقطعًا مستقلًا بعد الرقم (المحاذى إلى اليمين)، مثل `1` بخط Optima Bold أسود يليه `•` بخط DIN Pro Bold أزرق. |
| `separatorFontWeight` | `number` | ترث `fontWeight` | وزن خط الفاصل (100–900). |
| `separatorItalic` | `boolean` | ترث `italic` | يُخرج الفاصل بخط مائل. |
| `separatorColor` | `ColorValue` | ترث `color` | لون الفاصل. تُحترم الإشارات إلى لوحة الألوان. |
| `separatorGap` | `Dimension` | `0 em` | المسافة بين الرقم والفاصل. يبقى نص البند يبدأ على بُعد `gap` بعد الفاصل. |
| `numberFontSize` | `Dimension` | `1 em` | حجم علامة الرقم. |
| `gap` | `Dimension` | `0.5 em` | المسافة الأفقية بين الرقم ونص البند. |
| `indent` | `Dimension` | `0 em` | الإزاحة الأساسية للمستوى 1؛ تتسلسل المستويات الأعمق من موضع بداية نص المستوى الأب ما لم تُتجاوز. |
| `numberVerticalOffset` | `Dimension` | `0 em` | ضبط دقيق للموضع الرأسي لعلامة الرقم. |
| `marginTop` / `marginBottom` | `Dimension` | `1.5 em` | المسافة قبل القائمة كلها وبعدها. |
| `itemSpacing` | `Dimension` | `0 em` | مسافة رأسية إضافية بين البنود. حول قائمة متداخلة في بند من قائمة أخرى، تُطبَّق مسافة القائمة الخارجية على الجانبين: قبل البند الأول من القائمة المتداخلة وبعد آخر بند فيها (حتى postext 1.4 كان البند التالي لقائمة متداخلة يأخذ مسافة القائمة المتداخلة). |
| `snapTopToGrid` | `boolean` | `false` | يقرّب المسافة فوق القائمة إلى الأعلى كي يستقر رقمها الأول على شبكة خطوط الأساس، كما يفعل النص تحت العنوان؛ وتصبح `marginTop` حينئذ حدًّا أدنى. نهاية القائمة تعيد التدفق إلى الشبكة في الحالتين، فإذا كانت `itemSpacing` تساوي 0 اصطفّ كل بند مع النص في العمود المجاور. معطّل افتراضيًا، كما كان حتى postext 1.4: قيمة `marginTop` التي لا تساوي عددًا صحيحًا من الأسطر تُبقي البنود خارج الشبكة حتى نهاية القائمة. لا يتأثر بذلك القوائم داخل الإطارات (callout)، إذ إن دواخلها خارج الشبكة أصلًا. |
| `numberWidth` | `'run' \| 'level'` | `'run'` | عرض عمود الرقم في البند، وهو ما يحدد موضع بداية نصه؛ وتُصفّ الأرقام فيه محاذاةً إلى اليمين. `'run'`: أعرض رقم في السلسلة التي ينتمي إليها البند، أي بنود العمق الواحد التي لا يفصل بينها إلا بنود أعمق. الشكل أو الفقرة أو الإطار بين بندين يبدأ سلسلة جديدة، فقد يبدأ نص `ii)` بعد جدول أبعد قليلًا إلى اليمين من نص `i)` قبله، وتبدأ قائمة من تسعة بنود نصها إلى يسار نص قائمة من اثني عشر بندًا. `'level'`: أعرض رقم في عمق البند في المستند كله (الفصل، في الكتاب)، فتبدأ كل قائمة، وكل جزء من قائمة متقطعة، نصها في الموضع نفسه، كما تفعل أصلًا إزاحات المستويات الأعمق. |
| `numberAlign` | `'end' \| 'start'` | `'end'` | موضع الرقم في عموده. `'end'`: بجوار النص، فتنتهي أرقام السلسلة عند موضع واحد وتتحاذى نقطتا `9.` و`10.`. `'start'`: في أول العمود (اليسار في صفحة تُقرأ من اليسار إلى اليمين، واليمين في صفحة تُقرأ من اليمين إلى اليسار، ورأس السطر في النص العمودي)، فتبدأ التسميات المختلفة الطول من موضع واحد، كما تبدأ مواد القانون (第九條، 第十一條). يحتفظ العمود بالعرض الذي يحدده `numberWidth`، فيبدأ نص البنود من الموضع نفسه في الحالتين؛ وإذا كان للفاصل نمط خاص به تبع الفاصل رقمه. منذ postext 1.26. |
| `hangingIndent` | `boolean` | `true` | تصطف الأسطر الملتفّة مع أول حرف من النص بدلًا من أن تبدأ تحت الرقم. |
| `levels` | `OrderedListLevelConfig[]` | — | تجاوزات لكل عمق من المستويات 1–5. |

### تجاوزات كل مستوى في القوائم المرقّمة

يمكن لكل مُدخل في `levels` أن يتجاوز `numberFormat` و`prefix` و`separator` و`fontFamily` و`fontSize` و`color` و`fontWeight` و`italic` و`indent` و`verticalOffset` ونمط الفاصل (`separatorFontFamily`، `separatorFontWeight`، `separatorItalic`، `separatorColor`، `separatorGap`)، وتنطبق قاعدة تسلسل الإزاحة نفسها المطبقة على القوائم غير المرقّمة. يرث نمط الفاصل في مستوى ما نمط الرقم في المستوى نفسه، ما لم يُعطَ إعداد الفاصل على مستوى القائمة كلها.

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

```ts
orderedLists: {
  numberFormat: 'arabic',
  separator: '.',
  levels: [
    { level: 2, numberFormat: 'lower-alpha' },
    { level: 3, numberFormat: 'lower-roman', separator: ')' },
  ],
}
```

ينتج عن ذلك المزيج المتداخل المألوف:

```
1. First item
   a. Sub-item
      i) Deep note
   b. Sub-item
2. Second item
```

تراتبية المستندات الصينية (GB/T 15834—2011، الملحق B.3) تتألف من خمسة مستويات: 一、 ثم （一） ثم 1. ثم （1） ثم ①:

```ts
orderedLists: {
  levels: [
    { level: 1, numberFormat: 'simp-chinese-informal', separator: '、' },
    { level: 2, numberFormat: 'simp-chinese-informal', prefix: '（', separator: '）' },
    { level: 3, numberFormat: 'arabic', separator: '.' },
    { level: 4, numberFormat: 'arabic', prefix: '（', separator: '）' },
    { level: 5, numberFormat: 'circled-decimal', separator: '' },
  ],
}
```

## الصيغ الرياضية

تتحكم الخاصية `math` في طريقة تحليل صيغ LaTeX وإخراجها، سواء داخل المحدِّدين `$...$` (ضمن السطر) أو `$$...$$` (صيغة منفصلة، display). المحرّك الذي تقوم عليه هو MathJax (الحزمة `mathjax-full`) في وضع الإخراج SVG، ويُحوَّل إلى صورة نقطية في Canvas ويُضمَّن في PDF رموزًا قابلة للتحجيم.

```ts
interface MathConfig {
  enabled?: boolean;        // Render LaTeX. When false, spans pass through as literal TeX.
  fontSizeScale?: number;   // × the surrounding text's size (the body size for display maths).
  color?: ColorValue;       // Formula colour; inherits body colour if omitted.
  marginTop?: Dimension;    // Space above display math blocks.
  marginBottom?: Dimension; // Minimum space below; baseline grid snap may enlarge it.
  indentAfterDisplay?: boolean; // Indent a paragraph that follows a display formula.
  keepWithLeadIn?: boolean; // Keep a display formula with the line that leads into it.
  equationNumbering?: {      // Number the display formulas that carry a \label.
    enabled?: boolean;           // default true
    numberingTemplate?: string;  // '{n}'; '{h1}.{n}' numbers by chapter
    resetOn?: ResourceCounterReset; // 'never' | 'h1' … 'h6'
    counterFormat?: ResourceCounterFormat; // 'decimal'
    format?: string;             // '({n})': what the formula and \eqref print
  };
}
```

| الخاصية | النوع | القيمة الافتراضية | الوصف |
| --- | --- | --- | --- |
| `enabled` | `boolean` | `true` | عند القيمة false تبقى مقاطع `$...$` و`$$...$$` تُحلَّل (فتظل تحذيرات المحدِّدات غير المغلقة تُطلق)، لكنها تُخرج بنص TeX المصدري كما هو. يفيد ذلك حين يحتوي المحتوى على علامات الدولار عمدًا، أو حين تريد تعطيل إخراج الرياضيات تمامًا. |
| `fontSizeScale` | `number` | `1.0` | معامل يُضرب في حجم النص المحيط قبل الإخراج: الـ em الواحد من خط TeX في الصيغة يساوي ذلك الحجم × `fontSizeScale`، والحجم هو `bodyText.fontSize` للصيغة المنفصلة وللرياضيات ضمن السطر في نص المتن، وحجم الكتلة الحاوية للرياضيات ضمن السطر في عنوان أو نمط فقرة أو تعليق أو متن إطار. القيمة 1.0 تطابق النص المحيط؛ والقيم بين 0.9 و1.1 شائعة حين يبدو خط الرياضيات أكبر قليلًا أو أصغر قليلًا من خط النثر. **تغيّر في postext 1.5:** حتى 1.4 كانت الصيغ تخرج أكبر من ذلك بنحو 13% (انظر أدناه). |
| `color` | `ColorValue` | يرث لون المتن | لون الصيغة المُخرجة. أغفله ليرث `bodyText.color`. عيّنه صراحةً حين تريد للصيغ لونًا مختلفًا عن النثر، كأن يطابق لون إبراز العناوين. |
| `marginTop` | `Dimension` | `0.8em` | المسافة فوق كتلة الصيغة المنفصلة. تُهمل في الرياضيات ضمن السطر. |
| `marginBottom` | `Dimension` | `0.8em` | المسافة تحت كتلة الصيغة المنفصلة. وهي **حد أدنى**: قد يمدّها الالتصاق بالشبكة كي يقع خط الأساس التالي على أحد خطوط الشبكة (سواء رسمت `page.baselineGrid` الشبكة أم لا). |
| `indentAfterDisplay` | `boolean` | `true` | يزيح السطر الأول من الفقرة التي تلي صيغة منفصلة، كأي فقرة أخرى. أما `false` فتجعل كل فقرة تلي صيغة منفصلة مباشرةً بلا إزاحة، بوصفها تتمة للجملة التي قطعتها الصيغة ("where *L* is…"). والصيغة المكتوبة داخل فقرة، بلا سطر فارغ فوقها ولا تحتها، يليها دائمًا نص بلا إزاحة: النص الواقع تحت `$$` الختامية يتابع تلك الفقرة ولا يُزاح أبدًا (انظر [الصيغ الرياضية](https://postext.dev/ar/docs/document-format.md#الصيغ-الرياضية)). |
| `keepWithLeadIn` | `boolean` | `false` | يُبقي الصيغة المنفصلة في عمود السطر الذي يمهّد لها، وهو ما يسميه TeX جزاء ما قبل الصيغة (predisplay penalty). حين لا تتسع الصيغة تحت السطر الأخير من الفقرة التي قبلها، ينتقل ذلك السطر مع الصيغة إلى العمود أو الصفحة التالية؛ وحين يكون عدد الأسطر المتروكة خلفه أقل من `bodyText.widowMinLines` (أقل من سطر واحد حين يكون `bodyText.avoidWidows` معطّلًا)، تنتقل الفقرة التي تبدأ في ذلك العمود كاملةً (مع العناوين التي تختم العمود فوقها، بحسب `headings.keepWithNext`). يقف السطر المنقول وحده في رأس العمود التالي، أيًّا كان ما تطلبه قاعدة الأسطر اليتيمة (orphans). ومع `false` تنتقل الصيغة وحدها، وقد يختم السطرُ الذي يقدّمها العمودَ السابق، أو يقع فوق شكل يتصدر العمود التالي. |
| `equationNumbering` | `{ enabled, numberingTemplate, resetOn, counterFormat, format }` | `true`، `'{n}'`، `'never'`، `'decimal'`، `'({n})'` | طريقة ترقيم الصيغ المنفصلة التي تحمل `\label` (انظر *المعادلات المرقّمة* أدناه). تعمل `numberingTemplate` و`resetOn` و`counterFormat` كما تعمل في نوع المورد: `'{h1}.{n}'` مع `resetOn: 'h1'` يرقّم (2.1)، (2.2)… بحسب الفصل، و`'{h1}.{h2}.{n}'` مع `'h2'` بحسب القسم. و`format` هو الرقم كما تطبعه الصيغة و`\eqref`، ويقوم فيه `{n}` مقام الرقم: `'[{n}]'` يطبع [3]. ومع `enabled: false` لا يُرقَّم شيء: يُسقَط `\label`، وتطبع الإحالة إليه صفحته. |

```ts
math: {
  enabled: true,
  fontSizeScale: 1.0,
  color: { hex: '#295AA3', model: 'hex' },
  marginTop: { value: 1, unit: 'em' },
  marginBottom: { value: 1, unit: 'em' },
}
```

**حجم الصيغ، تغيّر في postext 1.5.** يعطي MathJax صندوق الصيغة بوحدة `ex`، والـ `ex` الواحد من خط TeX فيها يساوي 0.442 em. حتى postext 1.4 كان المحرّك يعدّه نصف em، فكانت كل صيغة تُنضَّد أكبر بنحو 13% من `bodyText.fontSize × fontSizeScale`. صارت الصيغ الآن تخرج بالحجم الموثَّق، فيُعاد تدفق الأسطر والصفحات التي فيها رياضيات. والإعدادات المكتوبة برمجيًا للإصدار 1.4 تحتفظ بحجم صيغ 1.4 إذا مُرّرت عبر `pinLegacyMathSize` من `postext/bundle`، مرة واحدة، كما كُتبت:

```ts
import { pinLegacyMathSize } from 'postext/bundle';

config = pinLegacyMathSize(config); // formulas, and the space around display formulas, as 1.4 set them
```

وثمة تغييرات أخرى في القواعد في 1.5 قد تحرّك صفحاتها أيضًا: فواصل أسطر العناوين، والمسافة حول الشكل ضمن السطر (في النص الجاري وفي الإطارات)، والعلامات المضمَّنة في عناوينها، وحجم حروفها الاستهلالية، والحيّز المحجوز تحت سطر ينتهي بنقطتين للقائمة التي يقدّمها، والأسطر التي يتركها قطع الإطار من فقرة أو بند قائمة، وفواصل الأسطر بعد الشَّرطة، وتقسيم أسطر النص غير المضبوط، وانقسام الفقرة تحت العنوان، وفواصل الأسطر بعد واصلة الكلمة المركّبة، والمسافة تحت الحاوية `:::paragraphs`. الدالة `migrateConfig`، إذا شُغّلت مرة واحدة مع نص Markdown الذي يُخرجه الإعداد، تثبّت ما يحتاجه هذا النص من تلك التغييرات، بما فيها حجم الصيغ (انظر [الحزم التي كتبها postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله)):

```ts
import { migrateConfig } from 'postext/bundle';

config = migrateConfig(config, undefined, { content: markdown }); // heading breaks, formulas, inline gaps, heading marks, drop caps, colon lines, box cuts, dash breaks, compound breaks, ragged breaking, splits under a heading and container space as 1.4 set them
```

يمنع ذلك ما كانت تغييرات القواعد هذه ستحرّكه، لكنه لا يحفظ كل صفحة من صفحات 1.4. فالإصدار 1.5 يصلح أيضًا أخطاء في الإخراج، والإصلاح لا يُثبَّت: يحصل عليه الإعداد القديم كما يحصل عليه الجديد، فقد تتحرك صفحة يمسّها. ومن هذه الإصلاحات: العنوان الممتد عبر الصفحة بلا تصميم خاص به يُقاس على عرض الصفحة ويُنضَّد بتباعد أسطر مستواه؛ لا يُحجز شيء تحت خط أساس الحرف الاستهلالي في تصميم العنوان؛ يأخذ الحرف الاستهلالي لون لوحة القسم، ويُنضَّد حتى في نص التصميم الذي ليست قيمة `overflow` فيه `'wrap'`، فيلتف النص حينئذ؛ الفقرة داخل الإطار تُرسم بالتتبّع الذي قيست به؛ الإطار المقسوم يحتفظ بعمود أيقونته في كل جزء منه؛ سطر الإطار الذي كانت مسافاته ستتمدد إلى أكثر من 3× يُنضَّد غير مضبوط، كما في النص الجاري؛ أداة الفقرة المرخاة لا تجعل أبدًا سطرًا مضبوطًا أعرض مما تسمح به `maxWordSpacing`؛ الإطار العائم يحتفظ بقيمة `marginBottom` (في الشريط العلوي) أو `marginTop` (في الشريط السفلي) إذا كانت أعرض من فجوة العناصر العائمة؛ نص التصميم المتوسّط أو المحاذى إلى اليمين الذي فيه تتبّع (كالترويسة أو عنوان صفحة الافتتاح) يوضع بحسب حروفه، دون التتبّع الذي بعد الحرف الأخير؛ تحت عنوان افتتاح ممتد عبر الصفحة، يبدأ النص الذي يفتتح العمود الثاني حيث كان سيبدأ النص الواقع مباشرة تحت عنوان الافتتاح، حتى حين يلي عنوانٌ عنوانَ الافتتاح؛ تتوقف نقاط جدول المحتويات قبل رقم الصفحة في الخط الذي يباعد بتقنين الأزواج (kerning) بين النقاط المتتالية؛ تقرأ الترويسة العنوان كما كُتب، بلا مسافة حيث ينتهي أحد أسطره بعد واصلة أو شَرطة أو داخل كلمة قُطعت لضيق العرض (`MEDIOAMBIENTALES` لا `MEDIOAMBIENTALE S`)، ويقرؤه `{titleText}` في تصميم العنوان بالطريقة نفسها (`thousand-colour` لا `thousand- colour`)؛ النص المثبَّت في أسفل شريط تصميم العنوان أو وسطه يُبقي الشريط طويلًا بما يكفي لاحتوائه، فلم يعد يرتفع فوق النص الذي يعلو العنوان؛ الكلمة الأعرض من سطرها، إذا قُطعت بجوار واصلة تحملها، تُقطع بعد تلك الواصلة ولا تُضاف إليها واصلة ثانية؛ البند التالي لقائمة متداخلة في أخرى يأخذ `itemSpacing` قائمته هو، لا قيمة القائمة المتداخلة؛ وبقية الكلمة المقطوعة لأنها أعرض من سطرها تحتفظ بمواضع القطع الخاصة بها، فيظل عنوان الويب ينقطع عند مفاصله والكلمة المركّبة عند واصلاتها، بدلًا من مقاطع القاموس.

تضرب `pinLegacyMathSize` المقياس في 1.1312 (0.5 ÷ 0.442) وتقسم هوامش الصيغ المنفصلة المعبَّر عنها بوحدة `em` على المعامل نفسه. المقياس وحده لا يكفي لكتاب فيه صيغ منفصلة: فهوامشها أطوال بمقياس حجم الصيغة نفسها، فكانت ستكبر بنسبة الـ 13% نفسها وتدفع النص الذي تحتها إلى الأسفل. وهذه هي القيم الثلاث مكتوبةً للهوامش الافتراضية:

```ts
math: {
  fontSizeScale: 1.131,
  marginTop: { value: 0.7072, unit: 'em' },
  marginBottom: { value: 0.7072, unit: 'em' },
} // formulas as large as 1.4 set them, with the space 1.4 left around them
```

حيث يكون الإعداد مخزَّنًا، يستطيع المحرّك أن يتعرّف على ذلك ويقوم به عنك: `openBundle` / `readBundle` لحزمة `.postext` كُتبت قبل 1.5 (انظر [الحزم التي كتبها postext 1.4 أو ما قبله](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحزم-التي-كتبها-postext-14-أو-ما-قبله))، وSandbox للكتب ونسخة العمل وملفات `postext-config.json` المحفوظة آنذاك (انظر **Sandbox › حفظ العمل**). تُقرأ هذه عبر `migrateConfig`، التي تثبّت الحجم (`pinLegacyMathSize`): تصبح `fontSizeScale` مساويةً للمقياس المخزَّن (1 إن لم يُعيَّن) × 1.1312، ويُقسَم هامش الصيغة المنفصلة المعبَّر عنه بوحدة `em` أو `rem`، وهو طول بمقياس حجم الصيغة نفسها، على المعامل نفسه، فتبقى المسافة حول الصيغة المنفصلة كما تركها 1.4 (تصبح القيمة الافتراضية 0.8 em هي 0.7072 em). أما الهامش بوحدة من وحدات الصفحة (`pt`، `mm`…) فيُترك كما هو، وكذلك الإعداد الذي فيه `enabled: false` أو الذي ليس في كتابه أي `$`. عندئذ يُخرَج الكتاب القديم كما أخرجه 1.4، ويُظهر قسم `math` فيه الحجم الذي يُنضَّد به. ولتنضيد هذا الكتاب بحجم اليوم بدلًا من ذلك، أعد تعيين تلك القيم: **الصيغ الرياضية › معامل الحجم** و*الهامش العلوي للصيغة المعروضة* و*الهامش السفلي للصيغة المعروضة* في Sandbox، أو برمجيًا:

```ts
math: { ...config.math, fontSizeScale: 1, marginTop: undefined, marginBottom: undefined } // today's size and margins
```

**المعادلات المرقّمة.** الصيغة المنفصلة ذات الرقم تمتد على عرض قياسها (العمود، أو العرض الداخلي للإطار الذي تقع فيه): تُوسَّط المعادلة ويُصفّ رقمها محاذىً إلى اليمين على سطر المعادلة، في كل صف مرقّم من بيئة `align`. ويأتي الرقم من `\label{eq:x}` (منذ postext 1.19): تُرقَّم الصيغ التي تحمل `\label`، والصفوف التي تحمله في `align` أو `gather` أو `alignat` أو `flalign` أو `eqnarray`، بترتيب القراءة وفق `equationNumbering`، ما لم يحمل الصف `\nonumber` أو `\notag`. والبيئات مثل `equation` لا تُرقَّم من تلقاء نفسها: فالصيغة التي لا تسمية لها لا رقم لها. ويطبع `\tag{…}` التسمية التي تعطيها له بين قوسين، و`\tag*{…}` كما كُتبت؛ ولا يدخل أيٌّ منهما في العدّ، و`\label` المجاور لأحدهما يسمّيه. والمعادلة المرقّمة الأعرض من قياسها تفيض إلى اليمين، كأي صيغة منفصلة. (حتى postext 1.4 لم تكن الصيغة التي فيها `\tag` تُرسم أصلًا؛ وحتى 1.18 لم يكن يرقّمها إلا `\tag`.)

يطبع `\eqref{eq:x}` في النص الرقمَ بصيغة `format`، أي (3)، ويطبع `\ref{eq:x}` الرقم مجرّدًا؛ وكذلك يفعل `:ref{id="eq:x"}` و`@eq:x` (انظر [الإحالات](https://postext.dev/ar/docs/document-format.md#الإحالات-والمراسي))، وداخل الصيغة يطبع `\eqref` الرقم نصًا. وفي كتاب يُخرَج فصلًا فصلًا يستمر العدّاد من الفصل السابق: تحمله `continuationAfter` في `LayoutContinuation.statementCounters` (`equation`)، ويعطي مخطّط الكتاب كل تسمية رقمها (`OutlineEntry.numberLabel`)، فتطبعه الإحالة إلى معادلة في فصل آخر.

```ts
math: {
  equationNumbering: { numberingTemplate: '{h1}.{n}', resetOn: 'h1' }, // (1.1), (1.2)… (2.1)
}
```

دالتا الحل والتجريد مماثلتان لنظيراتهما في الأقسام الأخرى:

```ts
import {
  DEFAULT_MATH_CONFIG,
  resolveMathConfig,
  stripMathDefaults,
} from 'postext';

const resolved = resolveMathConfig(config.math);
const minimal  = stripMathDefaults(config.math);
```

### تشغيل محرّك الرياضيات

يُحمَّل MathJax عند الطلب، لا مع بقية المحرّك. حين تُجري الإخراج على الخيط الرئيسي، شغّله قبل بناء مستند فيه صيغ:

```ts
import { buildDocument, initMathEngine, renderPage } from 'postext';

await initMathEngine(); // loads MathJax once; later calls resolve at once
const doc = buildDocument({ markdown: 'Euler: $e^{i\\pi}+1=0$.' }, config);
document.body.append(renderPage(doc.pages[0], doc));
```

- **إلى أن يعمل المحرّك، تكون الصيغ عناصر نائبة.** تُخرَج كل صيغة صندوقًا رماديًا بحجم تقديري. وإذا أُخرج مستند فيه رياضيات قبل أن تُستدعى `initMathEngine()` ولو مرة، أظهرت وحدة التحكم تحذيرًا واحدًا بذلك.
- **عامل الإخراج (worker) يشغّله عنك.** البناء في `postext/worker` يستدعي `initMathEngine()` بنفسه حين يحتوي نص Markdown على `$`.
- **أخرج الآن، ثم أعد الإخراج حين يجهز.** تخبرك `isMathReady()` هل المحرّك يعمل. وتستدعي `onMathReady(fn)` الدالة `fn` حين يجهز (فورًا إن كان جاهزًا) وتعيد دالة تلغي الاستدعاء. يستطيع المحرّر أن يعرض العناصر النائبة فورًا ثم يعيد الإخراج حين يصل MathJax؛ ولا يُطبع أي تحذير ما دامت `initMathEngine()` قيد التنفيذ.
- **الإخفاق.** ترفض `initMathEngine()` (reject) حين يتعذر تحميل MathJax، والاستدعاء اللاحق يحاول من جديد.
- **أي مُجمِّع (bundler)، أو Node، أو CDN.** يأتي MathJax داخل الحزمة وحدةً واحدة مجمَّعة مسبقًا (نحو 1.8 MB قبل الضغط، ولا تجلبها إلا `initMathEngine`). يعمل الاستيراد البسيط `import { initMathEngine } from 'https://esm.sh/postext'`؛ ولا حاجة إلى `?bundle`. الحزمة `mathjax-full` لا تلزم إلا لبناء postext، فتثبيت postext لا يثبّتها. MathJax ومحلّل mhchem المضمَّن فيه مرخّصان بترخيص Apache-2.0: تأتي إشعاراتهما ونص الترخيص بجوار الوحدة، في `dist/math/THIRD_PARTY_LICENSES.txt`.
- **محرّك واحد لكل صفحة.** يتشارك المحرّك وذاكرته المؤقتة للصيغ المُخرجة كلُّ ما يستورد `postext` في نطاق JavaScript نفسه (انظر [الحالة العامة المشتركة في صفحة واحدة](https://postext.dev/ar/docs/configuration-programmatic-usage.md#الحالة-العامة-المشتركة-في-صفحة-واحدة)).

لقواعد الكتابة في جانب المستند (`$...$`، `$$...$$`، تهريب علامة الدولار الحرفية)، انظر [صيغة المستند](https://postext.dev/ar/docs/document-format.md#الصيغ-الرياضية).
