انتقل إلى المحتوى الرئيسي

الفصل 9 · الجزء II · الحرفة

الإعدادات: الأنماط والأجزاء

الأنماط المسمّاة للفقرات والشارات وقوائم الشيفرة والإطارات والعناوين، والصفحات التي تفتتح كل جزء

آخر تحديث 2026-10-107 دقائقenescaptzhjaar

باختصار

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

#أنماط الفقرات

تعلن الخاصية paragraphStyles أنماطًا مسمّاة يطبّقها المستند على مجموعة من الفقرات بحاوية :::paragraphs{style="…"}: المراجع، ومسارد المصطلحات، والملاحظات، وأي كتلة من المدخلات تحتاج إلى خطها ووزنها وميلها وحجمها وتباعد أسطرها وحروفها الكبيرة أو حروفها الكبيرة المصغّرة (small caps) أو إزاحتها المعلّقة (hanging indent) الخاصة. وكل حقل طباعي اختياري ويرث نص المتن حين لا يُحدَّد، فلا يذكر النمط إلا ما يختلف عن النص الجاري.

const config: PostextConfig = {
  paragraphStyles: [
    {
      id: 'bibliography',
      name: 'Bibliography',
      fontSize: { value: 7, unit: 'pt' },
      lineHeight: { value: 1.2, unit: 'em' },
      hangingIndent: { value: 2, unit: 'em' },
      spaceBetween: { value: 0.25, unit: 'em' },
      marginTop: { value: 1, unit: 'em' },
      marginBottom: { value: 1, unit: 'em' },
    },
  ],
};
## References
 
:::paragraphs{style="bibliography"}
Knuth, D. E. (1984). *The TeXbook*. Addison-Wesley.
 
Bringhurst, R. (2004). *The Elements of Typographic Style*. Hartley & Marks.
:::
الخاصيةالنوعالقيمة الافتراضيةالوصف
idstringإلزاميالمعرّف الذي تشير إليه :::paragraphs{style="…"}.
namestringidاسم مقروء للبشر، لواجهات المحرّرات فقط.
fontFamilystringخط نص المتنعائلة الخط. أوزانها هي fontWeight / boldFontWeight أدناه (أوزان نص المتن حين لا تُحدَّد).
fontSizeDimensionحجم نص المتنحجم الخط.
lineHeightDimensionارتفاع سطر المتنتباعد الأسطر. الوحدتان em/rem نسبيتان إلى حجم خط النمط نفسه، فالقيمة الموروثة 1.5em تضيق مع الحجم الأصغر.
colorColorValueلون نص المتنلون النص. تحتفظ المقاطع الغامقة والمائلة بألوان التوكيد في المتن ما لم تحدد boldColor / italicColor ألوان النمط الخاصة.
textAlign'left' | 'justify' | 'center' | 'right' | 'start' | 'end'محاذاة المتنالمحاذاة الأفقية. تجعل 'center' و'right' كل سطر بحافة حرّة من الجهة الأخرى: إهداء، كتلة توقيع. وفي فقرة من اليمين إلى اليسار تكون 'left' جهة بدايتها، أي اليمين.
boldColorColorValuebodyText.boldColorلون المقاطع الغامقة (قائمة مؤلفين أسماؤهم بلون الدار).
italicColorColorValuebodyText.italicColorلون المقاطع المائلة (…)، وفي النمط italic لون المقاطع التي تصير قائمة. لا يتبع color: النمط الملوّن الذي ينبغي أن يبقى مائله بلونه يحدد الاثنين.
fontWeightnumberbodyText.fontWeightوزن النص العادي (100–900): سؤال نصف غامق في ورقة عمل، أو تصدير بوزن خفيف.
boldFontWeightnumberbodyText.boldFontWeightوزن المقاطع الغامقة (…).
italicbooleanfalseنضّد الفقرات بخط مائل: إرشادات المسرح، أو تصدير. والمقطع المائل … داخلها يصير قائمًا، كما في الاقتباس الكتلي.
smallCapsbooleanfalseنضّد الفقرات بالحروف الكبيرة المصغّرة: الحروف الصغيرة حروفًا كبيرة بنسبة 70% من الحجم، والحروف الكبيرة بحجمها الكامل، وتُرسم على النحو نفسه في كل مُخرِج (انظر الحروف الكبيرة المصغّرة): قائمة الشخصيات، أو مداخل مسرد المصطلحات.
hyphenationbooleanتقسيم كلمات المتنقسّم الكلمات بالواصلة عند ضبط الأسطر (يستخدم لغة المستند).
indentDimension0إزاحة كل سطر عن الحافة اليسرى للعمود (أو للإطار الذي تقع فيه الفقرات)؛ ووحدة em هي حجم النمط نفسه. تُقاس إزاحة السطر الأول والإزاحة المعلّقة منها، فيستطيع سطر شعري مُزاح أن يعلّق سطره المرحَّل (turnover) أعمق من بدايته: indent: 1.5em مع hangingIndent: 2.5em يضع السطر عند 1.5 em وسطره المرحَّل عند 4 em. والقيمة السالبة تُعدّ 0.
endIndentDimension0إزاحة كل سطر عن جانب النهاية (يمين السطر الأفقي، وذيل السطر العمودي)؛ ووحدة em هي حجم النمط نفسه. ومع textAlign: 'end' تضع السطر مرفوعًا بضعة حروف عن الذيل، وهو 地からN字上げ في تاريخ الرسالة اليابانية أو توقيعها. منذ postext 1.16.
firstLineIndentDimensionإزاحة السطر الأول في المتنإزاحة السطر الأول، من indent. مع hangingIndent غير صفري لا تُطبَّق إلا إذا حدّدها النمط نفسه: يبدأ السطر الأول عند indent + firstLineIndent والأسطر التالية عند indent + hangingIndent، فيمكن لسطر من الشعر أن يُزاح em واحدًا وتُعلَّق تتمّته 3 em. وإذا كانت موروثة من المتن تفسح للإزاحة المعلّقة ويبدأ السطر الأول عند indent، كما كان حتى postext 1.22 (والإعداد المحفوظ قبل ذلك تُحذف منه القيمة الصريحة في نمط كهذا).
hangingIndentDimension0إزاحة تُطبَّق على كل الأسطر ما عدا الأول، من indent — الشكل الكلاسيكي للمراجع ومسارد المصطلحات، وتتمّة سطر الشعر. يبدأ السطر الأول عند indent، أو عند firstLineIndent الخاص بالنمط إذا حدّده.
spaceBetweenDimension0المسافة العمودية بين الفقرات المتتالية داخل الحاوية. القيمة 0 تجعل المدخلات متلاصقة.
marginTopDimension0المسافة فوق الفقرة الأولى في الحاوية. تندمج مع المسافة المعلّقة أصلًا وتختفي في رأس العمود، كأي هامش آخر.
marginBottomDimension0أقل مسافة تحت الفقرة الأخيرة في الحاوية. وطريقة التقائها بمسافة الكتلة التي تلي الحاوية يحددها bodyText.paragraphContainerSpacing.
snapToGridbooleantrueأعِد التدفق إلى شبكة خطوط الأساس تحت الحاوية، على أن تكون المسافة تحتها حدًّا أدنى. القيمة false تُبقي المسافة الدقيقة: يبقى النص بعد الحاوية خارج الشبكة حتى الكتلة التالية التي تُحاذى عليها (عنوان، أو نهاية قائمة، أو معادلة رياضية مستقلة)، وهذا لمستند يجري خارج الشبكة أو لمجموعة لها تباعد أسطر خاص بها. وداخل الإطار (callout)، الذي لا شبكة له، لا تغيّر شيئًا.
textTransform'none' | 'uppercase''none'حالة أحرف الفقرات: 'uppercase' تنضّدها بالحروف الكبيرة (قائمة الشخصيات، سطر من الحركة المسرحية)، بما في ذلك كلمات الشارة وتسمية :ref. الطول يبقى على حاله، فتبقى خريطة المصدر في المحرّر مطابقة حرفًا بحرف: الحرف الذي صيغته الكبيرة أطول (ß) يُترك كما كُتب. تُترك الرياضيات كما هي، والترويسة التي تقرأ الفقرة علامةً ({firstMark.style}) تأخذ النص كما كُتب؛ أما نص التصميم فتنضّده بالحروف الكبيرة خاصيته textTransform.
wordBreak'normal' | 'keep-all'cjk.wordBreakأين تنكسر أسطر الفقرات الصينية أو اليابانية أو الكورية بين المحارف (انظر cjk.wordBreak): 'keep-all' لكتاب قراءة بالكانا مع مسافات بين العبارات يُقتبس في كتاب نثر عادي، و'normal' للعكس. منذ postext 1.16.
lineNumbersbooleanغير محدَّدهل يعدّ ترقيم الأسطر أسطر الفقرات. غير محدَّد: تُعدّ حين يكون lineNumbers.count هو 'all'، وفي قصيدة منضّدة بالنمط حين تُعدّ الأبيات. true: تُعدّ مع 'verse' أيضًا، وداخل الإطار، الذي لا يُعدّ نصه أبدًا في غير ذلك. false: لا تُعدّ أبدًا. منذ postext 1.23.
tabStopsTabStop[]bodyText.tabStopsمواضع الجدولة لفقرات النمط (انظر مواضع الجدولة)، مقيسةً من indent في النمط. ومحرف الجدولة في نصها جدولة حين تكون للنمط مواضع أو مسافة، خاصة به أو مأخوذة من المتن. غير محدَّد: مواضع المتن؛ والقائمة الفارغة لا تحدّد أي موضع. منذ postext 1.23.
tabIntervalDimensionbodyText.tabIntervalمواضع افتراضية بعد آخر موضع في tabStops. غير محدَّد: مسافة المتن. منذ postext 1.23.
dropCapParagraphDropCapلا شيءحرف استهلالي يفتتح الفقرة الأولى من كل مجموعة :::paragraphs منضَّدة بهذا النمط، أو كل فقرة مع each: true (انظر الحروف الاستهلالية). و{dropcap=false} في سياج المجموعة يلغيه، و{dropcap=2} يحدّد أسطره. منذ postext 1.23.

تنضّد المسرحية إرشادات المسرح بخط مائل وقائمة شخصياتها بالحروف الكبيرة المصغّرة:

paragraphStyles: [
  { id: 'direction', italic: true, fontSize: { value: 9, unit: 'pt' } },
  { id: 'cast', smallCaps: true, textAlign: 'center', fontWeight: 600 },
],
:::paragraphs{style="direction"}
Elsinore. A platform before the castle. *Francisco* at his post.
:::

تُطبع الإرشادات بخط مائل والاسم الذي داخلها قائمًا؛ وتسري الأوزان وitalic وsmallCaps الخاصة بالنمط داخل الإطارات أيضًا.

يُزيح ديوان الشعر بعض الأسطر، ويعلّق السطر المرحَّل من بيت أطول من عرض السطر أعمق من البيت نفسه. تُدخل indent كل أسطر الفقرة إلى الداخل، وتُحسب الإزاحة المعلّقة من هناك:

paragraphStyles: [
  { id: 'verse', textAlign: 'left', firstLineIndent: { value: 0, unit: 'em' }, hangingIndent: { value: 4, unit: 'em' } },
  { id: 'verse-indented', textAlign: 'left', indent: { value: 1.5, unit: 'em' }, hangingIndent: { value: 2.5, unit: 'em' } },
],

يبدأ السطر في verse-indented عند 1.5 em وسطره المرحَّل عند 4 em، على مستوى الأسطر المرحَّلة في verse. ومن دون indent يستطيع النمط أن يُزيح السطر الأول أو أن يعلّق الأسطر الأخرى، لا الاثنين معًا: تُتجاهل firstLineIndent متى حُدّدت hangingIndent.

تضع قائمة الطعام كل سعر ملاصقًا لنهاية عرض السطر، وراء خط إرشاد من النقاط:

paragraphStyles: [
  {
    id: 'menu',
    textAlign: 'left',
    firstLineIndent: { value: 0, unit: 'em' },
    tabStops: [{ position: 'end', align: 'end', leader: '. ' }],
  },
],
:::paragraphs{style="menu"}
شوربة البصل :tab 8.50
 
دنيس مشوي بالشمر والليمون :tab 21.00
:::

تنتهي نقاط كل سطر قبل السعر بنصف em (leaderGap). والطبق الذي يطول عن سطره يلتفّ، ويحتفظ سطره الأخير بخط الإرشاد والسعر؛ وحين لا يتّسع السعر بجانب الكلمة الأخيرة تنزل تلك الكلمة معه.

#الحاوية :::paragraphs

يفتح السطر :::paragraphs{style="<id>"} الحاوية ويغلقها سطر ::: وحده؛ وكل فقرة بينهما تأخذ النمط المسمّى، بينما تحتفظ العناوين والقوائم والكتل الأخرى داخلها بتنسيقها المعتاد. ويمكن أن تتداخل الحاويات داخل حاويات مسوّرة أخرى. ومعرّف style المجهول ليس خطأً: تُرسم الفقرات نصَّ متنٍ عاديًا.

ويقبل السور أيضًا align (start، end، left، right، center، justify) وindent وendIndent (والأعداد المجرّدة بوحدة em)، مع نمط أو دونه: مع النمط تتجاوزه، ودونه تُطبَّق فوق نمط الحاوية المحيطة، أو فوق نمط النص حيث يقع السور (المتن، أو الجزء، أو القسم ذو النمط، أو الإطار). ويضع :::paragraphs{align=end} كتلة ملاصقة لنهاية السطر (地付き)، و:::paragraphs{align=end endIndent=1} كتلة مرفوعة عنها حرفًا واحدًا. منذ postext 1.16.

داخل الحاوية يغادر التدفق شبكة خطوط الأساس، فالمدخل بحجم 7pt وتباعد أسطر 1.2em لا يمكن أن يستقر على شبكة 8pt/1.5em، ثم تعيد الفقرة الأخيرة التدفق إليها (الشبكة هي الغالبة؛ والمسافة تحتها حدٌّ أدنى، وهو العرف الذي تتبعه العناوين). وتنقسم المدخلات عبر الأعمدة والصفحات كفقرات المتن، مع الحماية نفسها من الأسطر اليتيمة (orphans) والأرامل (widows)؛ والعنوان الذي يسبق الحاوية مباشرة يبقى مع فقرتها الأولى.

المسافة تحت الحاوية هي الأكبر بين spaceBetween وmarginBottom الخاصتين بالنمط وتباعد الفقرات في النص المحيط (سطر واحد حين يكون bodyText.paragraphSpacing مفعّلًا)، وتندمج مع المسافة التي تحتفظ بها الكتلة التالية فوقها، كما تفعل المسافة بين فقرتين من المتن: فالعنوان بعد قائمة المراجع يقع تحت المدخل الأخير بمقدار marginTop الخاص به (أو بمسافة النمط حين تكون أكبر)، والفقرة بعد مجموعة من المدخلات الأضيق تحتفظ بتباعد فقرات النص. يعود التدفق إلى الشبكة تحت النص أولًا، وما لم تغطّه المحاذاة يُنقل في أسطر شبكة كاملة، فيقع النص بعد الحاوية على الشبكة. وحتى postext 1.4 كانت مسافة النمط توضع تحت السطر الأخير قبل المحاذاة، وتُضاف تحتها مسافة الكتلة التالية العليا، ويُهمَل تباعد الفقرات؛ والقيمة bodyText.paragraphContainerSpacing: 'add' تحتفظ بتلك القاعدة، والإعدادات المحفوظة قبلها تُقرأ بها. والنمط ذو snapToGrid: false لا يعود إلى الشبكة: يقع النص بعد الحاوية تحتها بالمسافة الدقيقة، خارج الشبكة حتى الكتلة التالية التي تُحاذى عليها. والحاوية التي تنتهي بقائمة تُنضَّد كما في 1.4 في كلتا القاعدتين: تحتفظ القائمة بمسافتها تحتها، وتتبع marginBottom تلك المسافة، مندمجةً مع مسافة الكتلة التالية.

داخل :::callout تأخذ الحاوية هوامش نمطها على النحو نفسه: تندمج marginTop وmarginBottom مع تباعد الكتل المحيطة بها (والقيمة السالبة تقرّبها)، والحاوية التي يبدأ بها الإطار لا تأخذ هامشًا علويًا، كما في رأس العمود. ولا شبكة خطوط أساس في الإطار يُعاد إليها، فالمسافة تحت الفقرة الأخيرة هي الأكبر بين marginBottom وspaceBetween وتباعد الفقرات الخاص بالإطار (body.paragraphSpacing الخاص به، أي سطر من نصه؛ ويُهمَل مع paragraphContainerSpacing: 'add')، أو الهامش العلوي للكتلة التالية حين يكون أكبر منها كلها؛ والقيمة السالبة لـ marginBottom ترفع الكتلة التالية بدلًا من ذلك. (حتى postext 1.4 كانت الحاوية داخل الإطار تتجاهل الهامشين.)

const resolved = resolveParagraphStylesConfig(config.paragraphStyles, resolvedBodyText);
// => every unset field filled from the resolved body text
 
const minimal  = stripParagraphStylesDefaults(config.paragraphStyles);
// => undefined when the list is empty; zero margins and `name === id` dropped

#أنماط الشارات

تعلن الخاصية chipStyles الأنماط المسمّاة للشارة (chip) المضمّنة :chip[text]{style="…"}، أي المربعات الملوّنة المستديرة الزوايا لبنك كلمات أو مفتاح لوحة مفاتيح أو وسم (الصيغة وقواعد كسر الأسطر الخاصة بها في مرجع صيغة المستند). يأتي نمط واحد، chip، افتراضيًا (تعبئة زرقاء شاحبة مع خط شعري باللون الرئيسي، زوايا مستديرة قليلًا، والنص كالكلمات المحيطة به)، فتعمل :chip[…] دون أي إعداد؛ وإعلان chipStyles يستبدل تلك القائمة الافتراضية. والشارة التي بلا style، أو بمعرّف لا يعلنه أي نمط، تأخذ النمط الأول.

const config: PostextConfig = {
  chipStyles: [
    { id: 'chip', name: 'Word bank' },
    {
      id: 'key',
      name: 'Keyboard key',
      background: { hex: '#fff4d6', model: 'hex' },
      borderColor: { hex: '#8a6d1f', model: 'hex' },
      borderRadius: { value: 2, unit: 'pt' },
      bold: true,
    },
  ],
};
Classify: :chip[battery] :chip[cable] :chip[switch]
 
Press :chip[Ctrl]{style="key"} + :chip[C]{style="key"}.
الخاصيةالنوعالقيمة الافتراضيةالوصف
idstringإلزاميالمعرّف الذي تشير إليه :chip[…]{style="…"}.
namestringidاسم مقروء للبشر، لواجهات المحرّرات فقط.
backgroundEnabledbooleantrueارسم تعبئة المربع.
backgroundColorValue#e8eef7تعبئة المربع (قابلة للربط بلوحة الألوان).
borderColorColorValueاللون الرئيسي في لوحة الألوانلون الخط المحيط.
borderWidthDimension0.5ptسُمك الخط المحيط؛ والقيمة 0 لا ترسم شيئًا. يُرسم الخط المحيط داخل حافة المربع.
borderRadiusDimension0.3emنصف قطر الزوايا، لا يتجاوز نصف ارتفاع المربع (القيمة الكبيرة تعطي شكل كبسولة).
paddingXDimension0.3emالمساحة بين الخط المحيط والنص، يسارًا ويمينًا. وهي جزء من مقدار تقدّم الشارة.
paddingYDimension0.1emالمساحة فوق شريط النص وتحته. تُرسم خارج مربع السطر: لا تغيّر ارتفاع السطر أبدًا.
paddingTop, paddingBottomDimensionpaddingYالمساحة فوق شريط النص أو تحته، كلٌّ منهما بدلًا من paddingY. يمتد الشريط 0.8 em فوق خط الأساس و0.25 em تحته، فيقع منتصفه على ارتفاع 0.275 em فوق خط الأساس، أدنى من منتصف الحرف الكبير (نحو 0.35 em في أغلب الخطوط): فيبدو الحرف الكبير أو الرقم في شارة مستديرة (borderRadius: 1em) مرتفعًا. والحشوة العليا التي تزيد على السفلى بضعف الفرق تتوسّطه: paddingTop: 0.2em مع paddingBottom: 0.05em لخط ارتفاع حروفه الكبيرة 0.7 em.
fontFamilystringالنص المحيطعائلة خط نص الشارة. تتبع الأوزان النص المحيط بها.
fontSizeDimensionالنص المحيطحجم نص الشارة؛ ووحدة em نسبية إلى النص المحيط.
colorColorValueالنص المحيطلون نص الشارة. حين لا يُحدَّد، تحتفظ المقاطع الغامقة والمائلة بألوان التوكيد.
boldbooleanfalseنضّد نص الشارة بخط غامق، فوق تنسيقه الخاص.
italicbooleanfalseنضّد نص الشارة بخط مائل، فوق تنسيقه الخاص.
gapDimension0.25emأقل مساحة تُترك بين المربع وكلمة أو شارة مجاورة عبر مسافة بين الكلمات؛ والمسافة الأضيق تُكمَّل داخل مقدار تقدّم الشارة، فلا يقتطع منها ضبط الأسطر أبدًا. ولا يُضاف شيء عند حافة السطر أو بجوار علامة ترقيم ملتصقة.

أطوال المربع بوحدة em (paddingX، paddingY، borderRadius، borderWidth، gap) نسبية إلى حجم خط الشارة نفسها. المربع شريط يمتد 0.8 em فوق خط الأساس و0.25 em تحته، يكبر بمقدار paddingY والخط المحيط؛ ويُرسم خارج مربع السطر ولا يغيّر تباعد الأسطر أبدًا، فتبقى شبكة خطوط الأساس سليمة. وحين يصير المربع أطول من خطوة السطر، يمكن أن تصطدم الشارة بشارة في السطر الذي فوقها أو تحتها، فيُدرج Sandbox تحذير «الشارات تلامس السطر التالي» حين تتداخل شارتان في سطرين مختلفين، مع مقدار التداخل بالنقاط، لكي تُقلَّص paddingY أو الخط المحيط أو fontSize. ولا يُبلَّغ عن شارة طويلة ليس فوقها ولا تحتها شارة.

في الـ VDT الشارة مقطع سطر من kind: 'chip' يحمل حقله chip مقاطع النص (لكل منها سلسلة الخط وعرضها)، وهندسة المربع (boxWidth، ascent، descent، paddingX، borderWidth، borderRadius، وهوامش المسافة) وألوانه؛ وtext الخاص بالمقطع عنصر نائب من حرف واحد، فتعدّ إزاحات النص العادي وخرائط المصدر الشارةَ حرفًا واحدًا.

const resolved = resolveChipStylesConfig(config.chipStyles);
// => the built-in `chip` style when unset; every field filled
 
const minimal  = stripChipStylesDefaults(config.chipStyles);
// => undefined for the built-in default; static defaults dropped
 
const style = pickChipStyle(resolved, 'key');
// => the `key` style, else the first one

#قوائم الشيفرة

تضبط الخاصية codeStyle مظهر قوائم الشيفرة: أسوار ``` و~~~ في النص (انظر صيغة المستند › كتل الشيفرة)، والشيفرة المضمّنة حين يُطلب لها خط شيفرة. تُنضَّد القائمة سطرًا سطرًا كما كُتبت، بخط ثابت العرض، داخل إطار: لا يُقسَّم أي سطر بالواصلة ولا يُضبط، وتحتفظ كل مسافة بعرضها، وتتقدّم الجدولة إلى موضع الجدولة التالي. ويأتي الإطار من الآلية نفسها التي تُخرج :::callout، فتنقسم القائمة بين أسطرها عبر الأعمدة والصفحات، ولكل جزء إطاره، والسور داخل إطار هو إطار متداخل فيه. كل الخصائص اختيارية. منذ postext 1.23.

const config: PostextConfig = {
  codeStyle: {
    fontFamily: 'JetBrains Mono',
    fontSize: { value: 0.8, unit: 'em' },
    background: { hex: '#0e1116', model: 'hex' },
    color: { hex: '#d3d9df', model: 'hex' },
    padding: { top: { value: 4, unit: 'mm' }, right: { value: 5, unit: 'mm' }, bottom: { value: 4, unit: 'mm' }, left: { value: 5, unit: 'mm' } },
    borderRadius: { value: 2, unit: 'pt' },
    lineNumbers: true,
    tokens: {
      keyword: { color: { hex: '#f2b134', model: 'hex' }, bold: true },
      string: { color: { hex: '#3ddc84', model: 'hex' } },
      comment: { color: { hex: '#8a939d', model: 'hex' }, italic: true },
    },
    inline: { background: { hex: '#eef1f4', model: 'hex' } },
  },
};
الخاصيةالنوعالقيمة الافتراضيةالوصف
blocksbooleantrueتُقرأ الأسوار كتلَ شيفرة. ومع false يُقرأ السور وأسطره Markdown كما في postext 1.22؛ وتأخذ هذه القيمةَ الإعداداتُ المخزّنة قبل 1.23 إذا كان في نصها سور (انظر الحزم التي كتبها postext 1.4 أو ما قبله).
indentedCodebooleanfalseتُقرأ أيضًا الأسطر المتتالية المزاحة أربعة أعمدة (أربع مسافات أو جدولة)، بعد سطر فارغ، قائمةَ شيفرة، ويُحذف من كل سطر أربعة أعمدة. موقوفة افتراضيًا: فكثيرًا ما تُزاح نصوص Postext بالمسافات، وعناصر القوائم المتداخلة تقرأ المسافات البادئة.
fontFamilystring'Source Code Pro'خط الشيفرة. الخط ثابت العرض يُبقي الأعمدة مصطفّة؛ ولتعليقات بالصينية أو اليابانية اختر خطًا فيه كانجي (BIZ UDGothic)، تأخذ محارفه كاملة العرض خليتين.
fontSizeDimension0.85emem هو حجم المتن.
fontWeight / boldFontWeightnumber400 / 700وزن الشيفرة ووزن الرموز العريضة.
lineHeightDimensionسطر الشبكة في المتنتباعد أسطر الشيفرة؛ وem هو حجم الشيفرة. وإن لم يُضبط وقعت الأسطر على شبكة خطوط الأساس.
snapToGridbooleantrueيعود النص الذي يلي القائمة إلى شبكة خطوط الأساس؛ ومع false يُحفظ marginBottom الدقيق، كما في الإطار.
colorColorValueلون المتنلون الشيفرة، وتأخذه الرموز التي ليس لها لون خاص.
backgroundEnabled / backgroundboolean / ColorValuetrue / #f4f4f4تعبئة الإطار.
border{ enabled, color, width }موقوف، #cccccc، 0.5ptحدّ الإطار.
borderRadiusDimension0زوايا مستديرة؛ ويحتفظ بها كل جزء من القائمة المقسومة، كما في الإطار المقسوم.
padding{ top, right, bottom, left }0.6em لكلٍّ منهاem هو حجم الشيفرة.
marginTop / marginBottomDimension0.75emالمسافة فوق الإطار وتحته.
span'column' | 'page''column'القائمة الممتدة على الصفحة تعبر كل أعمدة الصفحة متعددة الأعمدة، كما يفعل الإطار span: 'page'. ويضبط السور قيمته بـspan=page.
tabSizenumber4تتقدّم الجدولة إلى المضاعف التالي لهذا العدد من خلايا المحارف (ويُعدّ المحرف كامل العرض خليتين). وتبقى جدولةً: يحتفظ بها النص المنسوخ.
overflow'wrap' | 'shrink' | 'clip''wrap'السطر الأعرض من الإطار. 'wrap': ينكسر بعد آخر مسافة أو علامة ترقيم تتسع (وبين محرفين إن لم تتسع أي منهما)، ويستمر الباقي تحته، مزاحًا بمقدار wrapIndent من الخلايا، خلف wrapMarker؛ ولا يبدأ جزء من قائمة مقسومة ببقية كهذه ما دام قطع آخر يتسع. 'shrink': تُنضَّد القائمة كلها أصغر حتى يتسع أعرض أسطرها، إلى minFontScale على الأكثر، ويُكسر ما لا يزال لا يتسع. 'clip': يتوقف السطر عند الحافة الداخلية للإطار، ولا تُطبع المحارف التي تتجاوزها. وكلٌّ منها يُطلق تحذير codeOverflow.
wrapIndentnumber2إزاحة بقية السطر المكسور، بخلايا المحارف.
wrapMarkerstring'»'توضع في تلك الإزاحة، بلون أرقام الأسطر، وليست جزءًا من النص (لا تُنسخ، ويرسمها ملف PDF الموسوم عنصرًا زخرفيًا (artifact)). و'' لا تضع شيئًا. والمحرف ↪ غائب عن معظم خطوط الشيفرة، فيُطبع فيها مربعًا فارغًا.
minFontScalenumber0.8مع 'shrink'، أصغر نسبة من fontSize تُنضَّد بها القائمة.
lineNumbersbooleanfalseترقيم أسطر كل قائمة، في هامش قبل الشيفرة. ويضبط السور قيمته بـlineNumbers وlineNumbers=false وstart=N. ولا رقم لبقية السطر المكسور. تُنضَّد الأرقام بجانب النص لا فيه: يخفيها عارض HTML عن التحديد وعن التقنيات المساعدة، ويرسمها ملف PDF الموسوم عناصرَ زخرفية.
lineNumberColorColorValue#8a8a8aلون الأرقام (ولون علامة التتمة).
lineNumberGapDimension1emالمسافة بين أعرض رقم والشيفرة؛ وem هو حجم الشيفرة.
highlightBackgroundColorValue#fff4c2الشريط الملوّن خلف الأسطر التي يسمّيها السور بـhighlight="3,5-7"، على عرض الإطار.
keepTogetherbooleanfalseكما في نمط الإطار: false تقسم القائمة الأطول من المساحة المتبقية بين أسطرها؛ وtrue تنقلها كاملة، ولا تقسمها إلا إذا كانت أطول من عمود.
splitMinLinesnumber2أقل عدد من الأسطر على كل جانب من القطع، فلا يضم أي جزء سطرًا واحدًا.
repeatTitlebooleanfalseتكرار العنوان في رأس كل جزء، مع لاحقة «(cont.)» بلغة المستند.
continuesMarkerEnabled / continuesMarkerboolean / stringfalse / «Continued»علامة تحت السطر الأخير من كل جزء له تتمة.
titleStyleCalloutTitleStyleConfigخط الشيفرة، عريض، 0.9 من حجمهصف العنوان الذي يطبعه title في السور (انظر أنماط الإطارات للحقول).
labelCalloutLabelConfigلا شيءإذا ضُبط طُبع العنوان بدلًا من ذلك في لسان تسمية على الحافة العليا للإطار (بخط الشيفرة وحجمها ما لم يحدّد اللسان خطه).
highlight'builtin' | 'none''builtin'تلوين الرموز بالمُقطِّع المدمج (وبأي ملوّن مسجَّل)؛ و'none' تنضّد كل القوائم بلون color.
tokensPartial<Record<CodeTokenKind, { color?, bold?, italic? }>>لوحة ألوان هادئةمظهر كل نوع من الرموز، يُدمج نوعًا نوعًا مع القيم الافتراضية (انظر أدناه). واللون المرتبط باللوحة يتبع colorPalette ولوحة الجزء.
inlineInlineCodeStyleConfigغير مضبوطالشيفرة المضمّنة بخط الشيفرة (انظر أدناه). وإن لم يُضبط نُضّدت الشيفرة المضمّنة بخط النص، كما قبل 1.23.

#تلوين الصياغة

يسمّي مُقطِّع صغير مدمج في المحرّك رموزَ js وts (javascript وjsx وtypescript وtsx) وjson وpython وbash (sh وzsh وshell) وconsole (جلسة طرفية) وcss وhtml وxml (svg) وmarkdown وsql؛ أما القائمة بأي لغة أخرى، أو بلا لغة، فتُنضَّد بلون color. وهو يقرأ القائمة كلها، فالتعليق أو السلسلة النصية الممتدة على عدة أسطر تبقى رمزًا واحدًا. وفي قائمة console، السطر الذي يبدأ بموجّه أوامر ($ أو % أو # أو > أو >>> أو PS …> ) هو ما كتبه المستخدم (prompt)، وكل سطر آخر هو ما طبعته البرامج (output).

النوعالقيمة الافتراضيةما يسمّيه
keyword#8b2c8fالكلمات المحجوزة: const وdef وif وSELECT، واسم وسم HTML، وقاعدة @ في CSS.
string#3d7a2aالسلاسل النصية، والقوالب النصية (template literals)، وقيم السمات.
number#985f00الأرقام والثوابت (true وNone وnull)، والألوان، والكيانات (entities).
comment#7a7f87، مائلالتعليقات.
function#2b5fb4اسم يليه قوس؛ والأوامر المدمجة في الصدفة (shell).
type#99540aالأنواع وأسماء الأصناف المبدوءة بحرف كبير، ومحدِّدات CSS.
operatorلون الشيفرةالمعاملات، وأنابيب الصدفة وعمليات إعادة التوجيه.
punctuationلون الشيفرةالأقواس والفواصل.
variable#b23b2eمتغيرات الصدفة، ومفاتيح JSON، وخصائص CSS، وسمات HTML، وself.
meta#985f00المزخرفات (decorators)، وخيارات سطر الأوامر (-l و--all)، وتعريف نوع المستند (doctype).
promptلون الشيفرة، عريضالسطر المكتوب في جلسة الطرفية.
output#5c6168ما طبعته البرامج.

يستطيع التطبيق المضيف أن يركّب ملوّنه الخاص (Shiki أو Prism أو highlight.js) عبر registerCodeHighlighter. والإعدادات بيانات قابلة للتسلسل، فتُسجَّل الدالة لدى المحرّك ولا تُكتب في codeStyle:

import { registerCodeHighlighter } from 'postext';
 
// fn(code, lang) returns the listing's lines, each as runs whose texts join into the line.
registerCodeHighlighter('rust', (code) => code.split('\n').map((line) => [
  { text: line, token: line.trimStart().startsWith('//') ? 'comment' : undefined },
]));
registerCodeHighlighter('*', null); // remove the one registered for every language

الملوّن المسجَّل للغة ما يتقدّم على المسجَّل لـ'*'، وهذا يتقدّم على المُقطِّع المدمج. ويسمّي كل مقطع (run) نوعَ رمز في token (يلوّنه tokens) أو لونًا خاصًا به في color (قيمة CSS سداسية عشرية). ويُتجاوز الملوّن الذي يعيد undefined، أو يرمي استثناءً، أو يعيد أسطرًا لا تُكوِّن بضمّها أسطر القائمة نفسها. ويقرأ الإخراجُ السجلَّ حين ينضّد القائمة: سجّل الملوّن قبل البناء، وفي Web Worker (وSandbox يُخرج في واحد منها) سجّله داخل العامل نفسه.

#الشيفرة المضمّنة

يضبط codeStyle.inline النص الواقع بين علامتي الاقتباس المائلة بخط الشيفرة: وحدةً واحدة، كما الشارة، لا ينكسر السطر داخلها. وإن لم يُضبط احتفظت الشيفرة المضمّنة بخط النص.

الخاصيةالنوعالقيمة الافتراضيةالوصف
fontFamilystringcodeStyle.fontFamilyالخط.
fontSizeDimension0.9emem هو حجم النص المحيط بها.
colorColorValueلون النص
bold / italicbooleanfalseفوق علامات النص نفسه (الشيفرة داخل العريض عريضة).
backgroundColorValueلا شيءتعبئة خلف المقطع.
borderColor / borderWidthColorValue / Dimensionلا شيء / 0.5ptخط محيط.
borderRadiusDimension0.2emem هو حجم المقطع.
paddingX / paddingYDimension0.2em مع تعبئة أو خط محيط، وإلا 0 / 0.1emالمساحة داخل التعبئة؛ والحشوة العمودية تُرسم خارج مربع السطر.

#طريقة تنضيد القائمة

  • سطر لكل سطر في المصدر. تُبنى الأسطر من مسافات التقدّم (advances) في خط الشيفرة نفسه، لا بمقسِّم أسطر الفقرة: تحتفظ المسافات بعرضها، وتُحفظ سلسلة المسافات كما هي، وتُزيح المسافات البادئة السطر. والقائمة في كتاب من اليمين إلى اليسار تُقرأ من اليسار إلى اليمين، وتُنضَّد أسطرها من الجهة البعيدة للإطار كما يُنضَّد اقتباس مكتوب من اليسار إلى اليمين، وأرقامها في الهامش على يسارها. وفي الكتاب العمودي تتبع القائمة التدفق العمودي (وتُدار حروفها اللاتينية على جنبها، كما يُنضّدها النص العمودي) ولا تأخذ أرقام أسطر.
  • التقسيم. القائمة الأطول من المساحة المتبقية تنقسم بين أسطرها عبر الأعمدة والصفحات، ولكل جزء إطاره الخاص، ولا تترك أبدًا أقل من splitMinLines سطرًا على أي جانب؛ وتبقى بقية السطر المكسور معه ما دام قطع آخر يتسع.
  • المخرجات. ترسم اللوحة (canvas) وعارض HTML وملف PDF الأسطر والإطار كما أُخرجت. ويحتفظ عارض HTML بالمسافات (white-space: pre)، فينسخ التحديد القائمة بإزاحتها وبفاصل سطر بعد كل سطر من المصدر، بلا أرقام ولا علامات تتمة. وينضّد ملف PDF الموسوم كل قائمة فقرةً تضم عنصر Code، بمحارف مسافة حقيقية، وأرقامها وعلامات تتمتها عناصر زخرفية. ويكتب EPUB القابل لإعادة التدفق <pre><code class="language-…"> بألوان الرموز وبورقة أنماط مأخوذة من codeStyle؛ أما EPUB ثابت التخطيط فهو نسخة الطباعة.
  • الخطوط. يحمّل Sandbox وconfigFontFamilies خط الشيفرة حين يحتوي النص سورًا (أو حين يكون في الإعدادات قسم codeStyle)، بوزنيه العادي والعريض، قائمًا ومائلًا؛ ويضمّن ملف PDF الخطوط التي تستعملها الأسطر.

#أنماط الإطارات

تُعرِّف الخاصية calloutStyles أنماط الإطارات (callouts) المسمّاة التي يطبّقها المستند بالحاوية :::callout{type="…"}: الملاحظات والنصائح والتحذيرات وأهداف التعلّم، وكل محتوى يُفصل عن النص الجاري في إطار ملوّن الخلفية أو محاط بحدّ. يأتي افتراضيًا نمط محايد واحد هو note (خلفية رمادية فاتحة، بلا حدّ ولا شريط جانبي (stripe) ولا أيقونة ولا عنوان)، فتعمل :::callout دون أي إعداد؛ وتعريف calloutStyles يستبدل هذه القائمة الافتراضية.

const config: PostextConfig = {
  calloutStyles: [
    { id: 'note', name: 'Note' },
    {
      id: 'objectives',
      name: 'Learning objectives',
      title: 'Objectives',
      stripe: { enabled: true, side: 'left' },
      icon: { kind: 'glyph', glyph: '✓' },
      titleStyle: { textTransform: 'uppercase' },
      lists: { bulletChar: '–' },
    },
    {
      id: 'warning',
      title: 'Warning',
      backgroundEnabled: false,
      border: { enabled: true, color: { hex: '#AA0000', model: 'hex' }, width: { value: 1, unit: 'pt' } },
      borderRadius: { value: 1, unit: 'mm' },
      titleStyle: { color: { hex: '#AA0000', model: 'hex' } },
    },
  ],
};
:::callout{type="objectives"}
- Describe the parts of the lantern.
- Trim the wick at dusk.
:::
 
:::callout{type="warning" title="Do not touch the lens"}
The glass stays hot for an hour after the flame is out.
:::
الخاصيةالنوعالقيمة الافتراضيةالوصف
idstring—المعرّف الذي يختاره :::callout{type="…"}. والسياج (fence) الذي يحمل type غير معروف أو لا يحمله يستخدم أول نمط مُعرَّف (ويشير Sandbox إلى الأنواع غير المعروفة).
namestringidاسم مقروء للبشر (لواجهة المحرّر فقط).
titlestring''نص العنوان الافتراضي؛ والقيمة الفارغة تعني عدم وجود عنوان. وتتجاوزه السمة title في السياج لكل حالة على حدة.
span'column' | 'page' | 'side''column'الامتداد الأفقي: العمود، أو كامل عرض المحتوى، أو العمود الجانبي المخصّص للعناصر العائمة في تخطيط العمود ونصف العمود (layout.sideColumnRole: 'floats')، وعندئذ يغادر الإطار التدفق ويتراصّ في ذلك العمود بجانب النص الذي يقطعه. يمكن تجاوزه في كل حالة بالسمة span. وفي التخطيطات متعددة الأعمدة يصبح الإطار 'page' كتلة ممتدة (span block): يقسم الصفحة إلى نطاقات أعمدة (column bands) ويحتل عمودًا خاصًا به بكامل العرض (انظر قسم الحاوية أدناه). والإطار الجانبي الذي لا يتسع له العمود الجانبي لصفحته يأخذ العمود الجانبي للصفحة التالية؛ وإذا انتهى الفصل (أو المستند) قبل ذلك، وُضع كل إطار ما زال ينتظر في العمود الجانبي لصفحة بعد النص، بترتيب أسيجتها، ونبّه البناء إلى ذلك (afterText؛ حتى postext 1.24 كانت الإطارات التي بعد أولى هذه الصفحات تسقط).
columnsnumber1عدد الأعمدة المتجاورة التي يشغلها الإطار العائم (placement بالقيمة 'auto' أو 'top' أو 'bottom'، مع span: 'column')، كما يفعل placement.columns للشكل: إطار خبر يمتد على ثلاثة من أعمدة الجريدة الخمسة. وإذا بلغ عدد الأعمدة عدد أعمدة الصفحة أو زاد عليه صار إطارًا بعرض الصفحة. والإطار الموضوع في التدفق ('here') يبقى في عموده. يمكن تجاوزه لكل نسخة بالسمة columns. منذ postext 1.18.
placement'here' | 'auto' | 'top' | 'bottom' | 'fixed''here'موضع الإطار. 'here' يضعه داخل التدفق؛ و'top' / 'bottom' يعوّمانه كما يُعوَّم المورد (و'auto' يأخذ أول نطاق يخلو، في رأس الصفحة أو في قدمها): يغادر التدفق حيث يرد ويأخذ أول نطاق حرّ عند تلك النقطة أو بعدها (قدم الصفحة الحالية، أو رأس الصفحة التالية التي يفتحها التدفق أو قدمها)، ويملأ النص الذي يليه الصفحة من حوله؛ و'fixed' يثبّته عند إحداثيات في الصفحة عبر fixed أدناه، خارج تدفق الأعمدة. انظر قسم الحاوية للتفاصيل. يمكن تجاوزه في كل حالة بالسمة placement.
sideAtColumnEnd'before' | 'after''before'موضع الإطار الجانبي (span: 'side') حين لا يستمر النص الذي يلي سياجه في العمود نفسه: إما لأن العمود لم يبقَ فيه متسع له، وإما لأن قواعد الفصل تنقله (فقرة تنقلها قواعد الأسطر الأرامل (widows) والأسطر اليتيمة (orphans) كاملة، أو عنوان يُبقى مع نصه). 'before' يبقيه عند سياجه، في تلك الصفحة، بجانب النص الذي قبله، ويرتفع من قدم العمود إن لم يتسع له ما تحت السياج: وهو موضع الشرح المكتوب بعد المقطع الذي يشرحه. و'after' يضعه بمحاذاة السطر الأول من النص الذي يلي السياج، في العمود الجانبي للصفحة التي يستمر فيها ذلك النص: وهو موضع رقم السطر أو العنوان الهامشي المكتوب قبل سطره. وحين يستمر النص في العمود نفسه، يضع كلاهما الإطار عند سياجه. والإطار الذي لا يليه شيء في فصله يبقى مع النص الذي قبله في الحالتين، والإطارات الجانبية المتتالية تحافظ على ترتيبها. حتى postext 1.4 كان كل إطار جانبي يتصرف كما في 'before'، وهي القيمة الافتراضية الباقية: فنمط الشروح يُبقي إطاراته في صفحة المقطع الذي تشرحه.
fixedموضع الإطار 'fixed': مرساة ElementAnchor (to: 'container' = منطقة محتوى الصفحة، معكوسة في الصفحات الزوجية؛ 'page' = صندوق حدّ القص؛ 'bleed' = صندوق النزف؛ edge: إحدى حواف الحاوية التسع) مع إزاحة اختيارية offset (بُعدا x / y).
floatBarrierbooleanfalseيجعل الإطار حاجزًا للعناصر العائمة: كل شكل أو جدول أُشير إليه قبله يوضع قبله (في الخانات الحرّة من الصفحة، وإلا ففي صفحات تُفتح قبل الإطار)، فلا يفلت أي عنصر عائم إلى ما بعد الإطار الذي يختم الفصل (ملخّص «النقاط الرئيسية» عادةً). وصفحات افتتاح الفصول و:::part ونهاية المستند حواجز دائمًا.
الإطار span: 'page' في صفحة متعددة الأعمدة يقطع النطاق تحت النص الذي يليه؛ والشكل الممتد بكامل العرض المشار إليه قبله يأخذ ذلك القطع أولًا: يُسوّى النص، ويقع الشكل حيث انتهى تمامًا، ويستمر الإطار تحته (أو ينتقل إلى الصفحة التالية إن لم يعد يتسع). والشكل الأطول من أن يلي النص المسوّى يفتح الصفحة التالية بدلًا من ذلك، والإطار بعده، ويبقى النطاق الذي تركه منتهيًا بأعمدة مستوية. والإطار القابل للتقسيم (keepTogether: false) يبدأ تحت النص والشكل بما يتسع من عناصره، ويستمر الباقي في الصفحة التالية.
width'fill' | 'auto''fill''fill' يمتد على العرض المتاح؛ و'auto' يضيق على قدر العنوان (للاستعمال كشارة) ويتجاهل العناصر الأبناء.
backgroundEnabled / backgroundboolean / ColorValuetrue / #f4f4f4تعبئة الإطار.
border{ enabled, color, width }false، #cccccc، 0.5ptحدّ الإطار، يُرسم داخل حافته كما يُرسم حدّ عنصر الصندوق (انظر عناصر الصندوق).
borderRadiusDimension0نصف قطر زوايا الخلفية / الحدّ (لا يتجاوز نصف عرض الإطار ونصف ارتفاعه). ويتبعه الشريط الجانبي: في الإطار مستدير الزوايا يُقصّ الشريط على حدود الإطار المستديرة، كما تقصّ CSS الخاصية border-left على border-radius. ويحتفظ لسان label بزوايا قائمة.
padding{ top, right, bottom, left }0.75em لكلٍّ منهاالمسافة الداخلية بين حافة الإطار ومحتواه. وقيم em نسبية إلى حجم نص الإطار.
stripe{ enabled, side, width, color }false، 'left'، 1.5em، اللون الرئيسيشريط مصمت على طول إحدى الحواف. الشريط 'left' / 'right' يضيّق المحتوى؛ والشريط 'top' يدفعه إلى الأسفل. 'left' و'right' جانبان من تدفق النص (في الكتاب المكتوب من اليمين إلى اليسار يكون 'left' يمين الورقة)؛ أما 'start' و'end' فيتبعان اتجاه الإطار نفسه، فالإطار :::callout{dir=ltr} في كتاب عربي يضع الشريط 'start' على يساره. وفي الإطار ذي borderRadius تُدوَّر زواياه الخارجية مع زوايا الإطار (حتى postext 1.4 كانت تبقى قائمة وتبرز خارج التدوير).
icon{ kind, glyph, resourceId, fontFamily, fontWeight, size, width, color, align, position, cornerSide }'none'، خط العناوين، 400، 1.5em، اللون الرئيسي، 'top'، 'inline'، 'right'رمز نصي (kind: 'glyph') أو مورد نقطي / SVG (kind: 'resource' + resourceId) بجانب المحتوى. مع شريط جانبي تتوسّط الأيقونة الشريط؛ وإلا فإنها تحجز عمودًا خاصًا بها (size + titleStyle.gap). وalign: 'center' يوسّطها عموديًا على المحتوى. وتُوضع صورة المورد داخل المربع مع الحفاظ على نسبة أبعادها، أو داخل صندوق width × size عند تعيين width (شريط عريض من الأيقونات)؛ والأيقونة الأطول من المحتوى تُطيل الإطار ليتسع لها (ومع align: 'center' يُوسَّط المحتوى عليها). وposition: 'corner' يعلّق الأيقونة على زاوية علوية كشارة، نصفها خارج الحدّ، دون أن تأخذ من مساحة المحتوى؛ والأيقونة العريضة (width) تُوسَّط على الزاوية بحسب العرض الذي تُرسم به، وعلى الزاوية اليسرى يبدأ العنوان بعد نصفها الداخلي (حتى postext 1.4 كانت توضع بحسب ارتفاعها، فيتدلّى الشريط العريض خارج الإطار وفوق العنوان)؛ وcornerSide يختار الزاوية: 'right' / 'left'، أو 'outer' / 'inner' اللتان تتبعان زوجية الصفحة في الهوامش المعكوسة (الخارجية = اليمنى في الصفحة الفردية، واليسرى في الصفحة الزوجية).
marker{ kind, glyph, resourceId, fontFamily, fontWeight, size, color, align, gap, rule }'none'، خط العناوين، 400، 1.5em، اللون الرئيسي، 'center'، 0.5em، الخط الفاصل معطّل (0.5pt، اللون الرئيسي، الطول 0)أيقونة ثانية تُرسم خارج الإطار، في عمود على يساره، مع خط عمودي اختياري rule بينها وبين الإطار: اليد التي تقول «اضغط هنا» بجانب شارة التقييم الذاتي. يصبح الإطار [marker][rule][gap][box] بارتفاع أطول الثلاثة؛ وalign يوسّطها بعضها على بعض أو يحاذيها من الأعلى. وrule.length حدّ أدنى: يمتد الخط دائمًا على ارتفاع الإطار على الأقل.
titleStyle{ fontFamily, fontSize, fontWeight, italic, color, textTransform, gap, letterSpacing, indent, lineHeight }خط العناوين، حجم النص، 700، false، اللون الرئيسي، 'none'، 0.5em، 0، 0، 1.2emالتنسيق الطباعي للعنوان. gap هي المسافة بين العنوان وأول عنصر ابن (وفاصل عمود الأيقونة). وlineHeight هو تباعد أسطر العنوان، وتُحسب em فيه بحجم العنوان نفسه؛ ويقع خط الأساس عند 0.8 منه نزولًا في كل سطر، كما في النص الجاري، فالعنوان المضبوط على تباعد أسطر النص (lineHeight: 12pt على شبكة 12 pt) يُبقي الإطار عددًا صحيحًا من الأسطر وعنوانه على الشبكة، في حين تضيف القيمة الافتراضية 1.2 em كسرًا من سطر إلى كل إطار. وtextTransform: 'uppercase' لا يغيّر طول النص. وletterSpacing يضبط تتبّع العنوان (letterSpacing في canvas / Tc في PDF)؛ وindent يدفعه يمينًا بعيدًا عن الحافة الداخلية للإطار. والشارة المعلّقة على زاوية في جهة العنوان (الزاوية اليسرى) تحجز مكانها أولًا (نصفها الداخلي مضافًا إليه gap) فلا يصطدم بها العنوان في أي صفحة وقع؛ وindent لا يضيف إلا ما يتجاوز ذلك.
body{ fontFamily, fontSize, lineHeight, color, boldColor, italicColor, fontWeight, boldFontWeight, italic, smallCaps, textAlign, hyphenation, paragraphSpacing, firstLineIndent, tabStops, tabInterval }يرث bodyText؛ italic / smallCaps falseالتنسيق الطباعي للفقرات وعناصر القوائم داخل الإطار. كل حقل غير مُعيَّن يرث قيمة نص المتن؛ وitalicColor يحدّد لون المقاطع المائلة (اقتباس بارز مائل بلون الإطار). وfontWeight / boldFontWeight يحدّدان وزنَي المقاطع العادية والعريضة؛ وitalic يجعل نص الإطار مائلًا، فتستقيم مقاطع …؛ وsmallCaps يجعله بحروف كبيرة مصغّرة (small caps)؛ وtabStops وtabInterval يستبدلان بقيم المتن داخل الإطار (انظر مواضع الجدولة). انظر التنسيق الطباعي داخل الإطار لمعرفة ما يأخذه نص الإطار أيضًا.
lists{ bulletChar, color, indent, gap, itemSpacing, bulletFontSize, bulletFontWeight }يرث unorderedListsالتنسيق الطباعي للقوائم داخل الإطار (وتنطبق color وindent وgap وitemSpacing على القوائم المرقّمة أيضًا). وbulletFontSize / bulletFontWeight يرسمان رمز التعداد بخط نص الإطار بذلك الحجم والوزن (نقطة تعداد ملوّنة ثقيلة).
label{ fontFamily, fontSize, fontWeight, color, background, position, height, paddingX, offset, inset, icon, rule }غير مُعيَّن (بلا لسان)لسان على الحافة العليا للإطار يطبع سمة label من السياج: رقم الإطار المرقّم («BOX 1-1»). يلتصق بالزاوية position ('top-right' / 'top-left')، بإزاحة داخلية قدرها inset، ويرتفع offset فوق أعلى الإطار (وهذه المساحة جزء من الكتلة، فوق marginTop، فيحتفظ بها اللسان في رأس العمود أيضًا)، ويبلغ ارتفاعه height مع paddingX على جانبي النص، ويمكن أن يحمل بجانبه مورد أيقونة icon ({ resourceId, width, gap }، في الجهة البعيدة عن الزاوية) وخطًا rule ({ enabled, color, width }) على طول الحافة العليا من الزاوية البعيدة حتى اللسان. القيم الافتراضية: خط العناوين، حجم النص، 700، أبيض على اللون الرئيسي، ارتفاع 1.4em، حشوة 0.6em. واللسان شكل قائم بذاته فوق الإطار، فيحتفظ بزواياه القائمة أيًّا كان borderRadius الإطار.
columnGapDimension1.5emالفاصل بين أعمدة مجموعة :::columns داخل الإطار (انظر قسم الحاوية أدناه).
marginTop / marginBottomDimension0.75em / 0.75emالمسافة فوق الإطار (تندمج مع هامش الكتلة السابقة) والحدّ الأدنى للمسافة تحته (المسافة الدقيقة مع snapToGrid: false). والإطار العائم (placement: 'top' أو 'bottom' أو 'auto') يُبقي فاصل العناصر العائمة، وهو سطر واحد من النص، بين نطاقه والنص؛ وmarginBottom الأوسع من ذلك يحدّد المسافة تحت الإطار في نطاق علوي، وmarginTop الأوسع يحدّد المسافة فوق الإطار في نطاق سفلي، مقرّبةً إلى الأعلى على الشبكة مع النطاق. حتى postext 1.4 كان الإطار العائم يتجاهل هوامشه.
snapToGridbooleantrueمع true يعود التدفق بعد الإطار إلى شبكة خطوط الأساس، فتكون المسافة تحته marginBottom مقرّبةً إلى الأعلى إلى أسطر شبكة كاملة. ومع false يحتفظ الإطار بقيمة marginBottom الدقيقة، التي تندمج مع الهامش العلوي للكتلة التالية (فالإطاران المتتاليان من هذا النمط تفصل بينهما max(marginBottom, marginTop) تمامًا)، وقد يقع النص الذي يليه خارج الشبكة حتى نقطة الالتقاط التالية (عنوان، أو نهاية قائمة)، كما بعد عنوان ذي headings.snapToGrid: false. وهو مخصّص للمستندات المؤلفة من إطارات متراصّة (أوراق العمل، الاستمارات). ينطبق على الإطارات داخل التدفق؛ أما الإطارات الممتدة على الصفحة في التخطيط متعدد الأعمدة، والإطارات العائمة والثابتة والجانبية، فتبقى على الشبكة، لأن نطاقات الأعمدة ومناطق العناصر العائمة تُخرَج عليها. ولا تتغيّر أدوات موازنة الأعمدة: الإطار الذي يختم عمودًا يُدفع مع ذلك إلى آخر خانة في شبكة العمود.
keepTogetherbooleantrueمع true يُبقى الإطار كاملًا: الإطار الذي لا تتسع له المساحة المتبقية ينتقل كاملًا إلى العمود أو الصفحة التالية. ولا يتعذّر إبقاء الإطار كاملًا إلا إذا كان أطول من عمود فارغ كامل (أو من صفحة كاملة للإطار span: 'page'): عندئذ يُقسَم وفق قواعد false أدناه بدلًا من أن يفيض، بدءًا من موضع وروده، ثم تنتقل كاملةً التتمةُ التي يتسع لها عمود؛ والإطار العائم (placement: 'top' | 'bottom' | 'auto') بهذا الطول لا يطفو بل يبقى في التدفق حيث يرد. ومع false يمكن لأي إطار أن ينقسم بين كتله الأبناء أو بين أسطر فقرة أو عنصر قائمة: أعمق قطع يتسع يختم العمود الحالي (أو الصفحة، في الإطار span: 'page'، محاذيًا لأسفل الأعمدة) ويستمر الباقي في أعلى العمود التالي في إطار خاص به (بالحدّ والشريط نفسيهما، بلا أيقونة، وبلا عنوان ما لم يكرّره repeatTitle)، وينقسم مجددًا إن ظلّ أطول مما ينبغي. ويحتفظ نص كل جزء بالعمود الذي تأخذه الأيقونة المضمّنة في الجزء الأول، فارغًا، فيكون للإطار عرض سطر واحد في كل صفحة. والقطع داخل عنصر قائمة يترك نقطة تعداده مع الجزء الأول. ويتشارك إطار كل جزء contentIndex / containerId الخاصين بالسياج ويسجّل callout.part / callout.continued. استخدمه في إطار «النقاط الرئيسية» الطويل الذي يختم الفصل مع headings.balancing.beforeSpan، أو في نمط ملاحظات يجب ألا تدفع إطاراته شكلًا خارج الصفحة أبدًا. والإطار المتداخل (:::callout داخل إطار آخر) عنصر ابن واحد لأبيه: قد يقع القطع قبله أو بعده، ولا يقع داخله إلا إذا سمح نمطه بالتقسيم (keepTogether: false، أو كان أطول من عمود كامل)، وفق splitMinLines الخاص به.
splitMinLinesnumber2أقل عدد من أسطر النص يحتفظ به كل جزء من الإطار المقسوم (keepTogether: false، أو إطار يُبقى كاملًا وهو أطول من عمود كامل) على جانبي القطع. وهو يحمي النص فقط: الجانب الذي يضم شكلًا أو جدولًا أو صيغة منفصلة أو إطارًا متداخلًا واحدًا على الأقل مقبول أيًّا كان عدد أسطره، فقد يترك إطار من الصور صورة واحدة في صفحة. والقطع داخل فقرة أو عنصر قائمة يظل يعدّ كل الأسطر على كل جانب (ويُعدّ الشكل أو الصيغة هناك سطرًا واحدًا)، ويترك أيضًا layout.boxChildSplitMinLines سطرًا على الأقل من تلك الفقرة أو العنصر على كل جانب (سطرين افتراضيًا؛ أو هذا الحدّ الأدنى نفسه إن كان أقل، فالقيمة 1 تسمح بسطر واحد). ومع القيم الافتراضية لا يُقسم عنصر من سطرين أو ثلاثة أبدًا، ولا يُقسم عنصر من أربعة أسطر إلا سطرين وسطرين. ومع القيمة الافتراضية لا ينقسم أي إطار تاركًا سطر نص وحيدًا في قدم عمود أو في رأس العمود التالي؛ وحين لا يحقّق أي قطع الحدّ الأدنى ينتقل الإطار كاملًا. (قبل postext 1.5 كان القطع داخل الفقرة يتحقّق فقط من أسطر الجانب كله، فقد ينقسم عنصر من سطرين سطرًا وسطرًا حين تكمل أسطر أخرى من الإطار الحدّ الأدنى.)
repeatTitlebooleanfalseيكرّر العنوان في رأس كل تتمة للإطار المقسوم، متبوعًا بـcontinuedSuffix («Key points (cont.)»). ويأخذ العنوان المكرَّر نمط العنوان. والإطار الذي لا عنوان له لا يكرّر شيئًا. انظر علامات الإطار المقسوم.
continuedSuffixstring'(cont.)'النص الذي يلي العنوان المكرَّر، بلغة المستند (locale، وإلا فلغة تقسيم الكلمات بالواصلة)، كما في الجدول المقسوم، ويُوصل بالعنوان كما يُوصل في الجدول.
continuesMarkerEnabledbooleanfalseيضع continuesMarker تحت السطر الأخير من كل جزء من الإطار المقسوم له تتمة، داخل الإطار.
continuesMarkerstring'Continued' / 'Continúa'نص تلك العلامة («(MORE)» في السيناريو)، بخط نص الإطار وحجمه، بحسب لغة المستند.
continuesMarkerAlign'left' | 'center' | 'right''right'موضع العلامة ضمن العرض الداخلي للإطار.
continuesMarkerItalicbooleantrueيجعل العلامة مائلة.
numbering{ label, counter, numberingTemplate, resetOn, counterFormat, placement, bold, italic, suffix }غير مُعيَّنيعدّ إطارات هذا النمط عبارات مرقّمة: مبرهنات وتوطئات وتعريفات. انظر المبرهنات المرقّمة والبراهين.
endMarkstring''علامة تُصفّ محاذاةً إلى اليمين في آخر السطر الأخير من الإطار، كما يُختم البرهان بـ'∎' أو '□': على السطر الأخير إن اتسعت له بعد مسافة، وإلا ففي سطر مستقل. والإطار الذي ينتهي بصيغة منفصلة لا رقم لها يجعل العلامة وسمًا للصيغة. عند تفعيل الرياضيات تُرسم المربعات (∎ □ ■ ▪ ◻ ▫) بحروف TeX نفسها، فتظهر حتى لو خلا منها الخط (ملفات latin في Fontsource)؛ وعند تعطيلها تُنضَّد بخط متن الإطار.

#الحاوية :::callout

يفتح السطرُ :::callout{type="<id>"} الإطار، ويغلقه سطر فيه ::: وحدها. يقبل السياج خمس سمات: type (معرّف النمط)، وtitle (يتجاوز عنوان النمط)، وspan وplacement وcolumns (تتجاوز قيم النمط)؛ ويُخرَج المحتوى الواقع بينهما داخل الإطار: عنوان اختياري، ثم الفقرات أو القوائم أو الاقتباسات الكتلية أو الصيغ أو الموارد المضمّنة، وكلٌّ منها يُنضَّد بتنسيق body / lists من النمط (وتحتفظ العناوين بأنماطها المعتادة). تندمج الهوامش بين العناصر الأبناء كما في النص الجاري؛ ويخرج داخل الإطار عن شبكة خطوط الأساس، ثم يعود التدفق إليها بعد الإطار بمسافة لا تقل عن marginBottom تحته (الأولوية للشبكة، والهامش حدّ أدنى، وهو العرف نفسه الذي تتبعه الموارد). أما النمط ذو snapToGrid: false فيحتفظ بقيمة marginBottom الدقيقة بدلًا من ذلك، ويبقى النص الذي يلي الإطار خارج الشبكة حتى العنوان التالي أو نهاية القائمة. والعنوان الذي يسبق الإطار مباشرةً يبقى معه.

حدود هذا الإصدار:

  • يُبقى الإطار كاملًا ما لم يحدّد نمطه keepTogether: false. فإن لم تتسع له المساحة المتبقية في العمود انتقل كاملًا إلى العمود أو الصفحة التالية، وكذلك يخرج من عمود فارغ قصّرته نطاقات العناصر العائمة أو حدّ أقصى للنطاق (band cap)، ما دام عمود كامل يتسع له. أما الإطار الأطول من عمود كامل فيُقسم بدلًا من ذلك، كالإطار القابل للتقسيم؛ ولا يوضع رغم ذلك ويفيض إلا الإطار الذي لا يقسمه أي قطع (شكل أو جدول أو مجموعة :::columns أطول من العمود، أو splitMinLines لا يحقّقه أي قطع)؛ وعندئذ يسجّل الإخراج تحذير calloutOverflow (VDTDocument.warnings) يعرضه Sandbox. والإطار القابل للتقسيم يترك الجزء الذي يتسع (عناصر أبناء كاملة، أو أسطر فقرة بما لا يقل عن splitMinLines على كل جانب، ويكفي الشكل أو الجدول أو الصيغة المنفصلة وحده لجانب) ثم يستمر في إطار بلا أيقونة في العمود أو الصفحة التالية، بلا عنوان ما لم يكرّره النمط، ومع علامة اختيارية تحت الجزء الذي يتركه (انظر علامات الإطار المقسوم).
  • تُفسح العناصر العائمة المجال للإطار غير القابل للتقسيم. فحين تكون الكتلة التي تلي الإشارة إلى شكل مباشرةً إطارًا keepTogether، لا تُؤخذ الخانة التي لا تترك للإطار عمودًا من النطاق الحالي يستقر فيه (العمود الذي يحوي الإشارة أو عمود فارغ بعده، وكان يتسع له قبل العنصر العائم): ينتقل الشكل إلى خانته التالية، وهي عادةً الصفحة التالية، ويبقى الإطار في التدفق، كما يضعه المنضِّد، بدلًا من دفع الإطار خارج الصفحة وترك العمود للشكل وحده.
  • في التخطيط متعدد الأعمدة يجعل span: 'page' الإطارَ كتلة ممتدة (span block): يُخرَج بكامل عرض المحتوى ويقسم الصفحة إلى نطاقات أعمدة، فتُغلق أعمدة النص فوقه عند خط القطع، ويأخذ الإطار عمودًا خاصًا به بكامل العرض، ويُفتح تحته نطاق جديد من أعمدة النص، فيستمر التدفق تحت الإطار في كل الأعمدة. وحيث تكون الأعمدة مستوية (في أعلى الصفحة، أو مباشرةً تحت عنوان افتتاحي span: 'page'، أو مباشرةً تحت كتلة ممتدة أخرى، أو مباشرةً تحت نطاق عائم علوي) يقطع الإطار هناك ببساطة. أما إذا ورد في منتصف الصفحة والأعمدة غير متساوية، فيُوضع كما يضعه المنضِّد: يُقطع النص فوقه قطعًا مستويًا عبر كل الأعمدة (يعيد المحرّك تنفيذ التوزيع وقد قُصّرت أعمدة النطاق إلى العدد نفسه من أسطر الشبكة، فيفيض النص من عمود إلى عمود على نحو طبيعي وتظل كل قواعد الأسطر اليتيمة والأرامل والإبقاء مع التالي سارية)، ويمتد الإطار على الصفحة، وتُستأنف الأعمدة تحته. ويتطلب القطع جولتين إضافيتين من التوزيع؛ وحين لا يترك خط القطع متسعًا للإطار مع الحدّ الأدنى لأسطر الأرملة من النص تحته، أو لا يتسع أي ترتيب بعد بضع محاولات، ينتقل الإطار إلى أعلى الصفحة التالية. ويلتزم النص فوقه بالقطع: الفقرة التي لا يمكن أن تبدأ في الأسطر القليلة التي يحتفظ بها عمود تحت شكل فوق القطع تنتقل إلى العمود التالي (فيقف الشكل وحده في عموده)، وحين تظل كتلة ما تتجاوز القطع، يُؤخذ القطع أدنى بسطر بدلًا من موضع انتهاء تلك الكتلة. والإطار المقسوم الذي يفتح النطاق يُقطع هناك أيضًا، فلا تتجاوز بقيته القطع أبدًا. ومع headings.balancing.beforeSpan (القيمة الافتراضية) يُقطع النطاق الذي يتركه خلفه قطعًا مستويًا، كالنطاق الذي يختم الفصل، وحين يسمح النمط بالتقسيم (keepTogether: false) يختم جزءُ الإطار الذي يتسع تحت الأعمدة المسوّاة الصفحةَ ويفتح الباقي الصفحة التالية؛ ومع beforeSpan: false تُوازن الصفحة التي يتركها كالمعتاد، دون فرض فاصل صفحة. والعنوان الذي يسبق الكتلة الممتدة مباشرةً لا ينتقل معها. وفي التخطيطات أحادية العمود يكون span: 'page' ببساطة داخل التدفق.
  • placement: 'fixed' يُخرج الإطار من التدفق: يُخرَج الإطار (width: 'auto' يضيق على قدر العنوان، و'fill' يأخذ عرض عمود النص تحت نقطة الإرساء) ويُثبَّت في الصفحة التي يرد فيها ضمن التدفق، في الموضع الذي يصفه fixed.anchor / fixed.offset، وهو افتراضيًا الزاوية السفلية اليسرى من منطقة المحتوى. وتتخلى أعمدة النص التي يغطيها عن تلك المنطقة (تُقطع من الأسفل، أو من الأعلى إن كان العمود لا يزال فارغًا)، تمامًا كنطاق العناصر العائمة؛ وحين تكون المنطقة مشغولة بنص أو عنصر عائم أو كتلة ممتدة، ينتقل الإطار إلى الصفحة التالية. والإطار الثابت الذي يختم الفصل (أي تكون الكتلة التالية صفحة افتتاح فصل، أو :::part، أو إطارًا حاجزًا للعناصر العائمة، أو نهاية المستند) يسوّي أولًا الأعمدة فوقه (headings.balancing.trailing)، فتنتهي الصفحة الختامية القصيرة مستويةً مع الشارة تحتها. ويقع الإطار وأبناؤه في page.floats ويُرسمون خارج قصّ الأعمدة في كل مُخرِج.
  • placement: 'top' | 'bottom' يعوّم الإطار كما يُعوَّم المورد: يغادر التدفق حيث يرد ويأخذ أول نطاق حرّ بعد تلك النقطة (قدم الصفحة الحالية مع 'bottom'، أو رأس الصفحة التالية التي يفتحها التدفق أو قدمها) بعرض العمود (span: 'column') أو بكامل عرض المحتوى (span: 'page')؛ ويملأ النص الذي يليه الصفحة التي غادرها. ويذهب إطاره وأبناؤه إلى page.floats، كما في الإطار الثابت. والإطار العائم الذي يتصدّر صفحة جديدة يوضع قبل الأشكال المنتظرة لتلك الصفحة، والشكل المذكور في صفحة سابقة الذي يتسع بعدئذ تحته يأخذ بقية تلك الصفحة حتى لو بقي أقل من ثلاثة أسطر نص (صفحة معرض: إطار وشكل، بلا نص بينهما). والإطار span: 'side' لا يطفو أبدًا: يتراصّ بجانب النص أيًّا كان موضعه. ومع columns أكبر من 1 (في النمط أو سمةً في السياج، منذ postext 1.18) يشغل الإطار span: 'column' هذا العدد من الأعمدة المتجاورة: رأس سلسلة من الأعمدة الفارغة التي تبدأ على مستوى واحد، أو أسفل العمود الحالي والأعمدة الفارغة التي تليه، كما في :::callout{placement="top" columns="2"}.
  • width: 'auto' يضيق على قدر العنوان فقط، ويتجاهل العناصر الأبناء.
  • :::callout المتداخل داخل إطار آخر إطار مستقل: يُخرَج بنمطه الخاص (الخلفية، والحدّ، ونصف قطر الزوايا، والحشوة، والشريط الجانبي، والعنوان، والأيقونة، والعلامة، واللسان، والتنسيق الطباعي) بكامل العرض الداخلي لأبيه ويتراصّ عنصرًا ابنًا واحدًا فيه، وتندمج marginTop / marginBottom الخاصة به مع جيرانه. ويُتجاهل span وplacement الخاصان به (من السياج أو من النمط)، فالإطار المتداخل يجري دائمًا داخل أبيه، ويُتجاهل كذلك floatBarrier وsnapToGrid. وتتداخل الإطارات إلى أي عمق، ويمكن أن تقع داخل مجموعة :::columns (كلٌّ منها كاملًا في عمود واحد). وحين ينقسم الأب، يقع القطع قبل الإطار المتداخل أو بعده، أو داخله إن سمح النمط المتداخل بالتقسيم؛ ويعيد كل جزء رسم الإطارات التي يقطعها، والإطار المتداخل المستمر من الجزء السابق يُسقط عنوانه وأيقونته، كتتمة الإطار في المستوى الأعلى.
  • مجموعة :::columns{count=N} … ::: بين العناصر الأبناء تُخرج تلك العناصر في N أعمدة متساوية العرض، يفصل بينها columnGap، داخل الإطار: تُقطع السلسلة عند حدود الكتل أو الأسطر التي تسوّي الأعمدة على أفضل وجه (الفقرة أو عنصر القائمة المقطوع في منتصفه يستمر في رأس العمود التالي بلا نقطة تعداده)، ويبدأ كل عمود من أعلى المجموعة ويكون ارتفاع المجموعة بارتفاع أطول أعمدتها؛ وتعود العناصر التي تليها إلى كامل العرض. والإطار الذي ينقسم (keepTogether: false، أو الأطول من عمود) يقطع داخل المجموعة أيضًا، بين أعمدتها: فالمجموعة المتعرّجة (snake) تملأ أعمدتها واحدًا بعد آخر وتستمر في الجزء التالي، والمتوازية (breaks) تستمر تيارًا تيارًا (منذ postext 1.25؛ انظر صيغة المستند › :::columns). وتحلّ gap في السياج محلّ columnGap لتلك المجموعة، وترسم rule خطًا على طول كل فاصل بين الأعمدة. استخدمها لملخّص من عمودين للنقاط الرئيسية، أو لوضع جداول إطار عريض جنبًا إلى جنب.
  • السمة السادسة للسياج، label، تُطبع على لسان التسمية في النمط (انظر label أعلاه): :::callout{type="box" label="BOX 1-1" title="The octet rule"}؛ ومن دون label في النمط تُتجاهل السمة.

في VDT يكون الإطار كتلة إطار type: 'callout' تقع زخرفته (الخلفية، والشريط الجانبي، والأيقونة، والعنوان) في designOverlay، تليها كتلها الأبناء في العمود نفسه؛ ويحمل الإطار وكل ابن containerId الخاص بالسياج. والإطار المتداخل كتلة إطار type: 'callout' مستقلة بين الأبناء، تليها كتلها؛ وهي تحتفظ بـcontainerId الخاص بسياج المستوى الأعلى (فيظل التوزيع والموازنة يريان وحدة واحدة) وتضيف calloutPath، أي معرّفات حاويات الأسيجة المتداخلة المحيطة بها، من الخارج إلى الداخل (ومعرّف الإطار المتداخل نفسه هو آخر مدخل). ويعطي ملف PDF الموسوم كل إطار متداخل عنصر Div داخل عنصر أبيه. وتُحلّ صور الأيقونات كما تُحلّ صور الموارد: سجل الصور في canvas، والخيار resourceImageUrl في HTML، ومزوّد resourceBytes في PDF.

const resolved = resolveCalloutStylesConfig(config.calloutStyles, resolvedBodyText, resolvedHeadings, resolvedUnorderedLists, config.locale);
// => every inherited field filled from the resolved sections; the optional
//    locale picks the language of the continuation strings
 
const minimal  = stripCalloutStylesDefaults(config.calloutStyles);
// => undefined for the built-in `note` default; static defaults dropped

#المبرهنات المرقّمة والبراهين

النمط الذي فيه numbering يعدّ إطاراته، كما تعدّ الحزمة amsthm في LaTeX بيئات المبرهنات (منذ postext 1.19). يطبع كل إطار تسميته ورقمه، «Theorem 2.» في أول فقرته الأولى، ويلي title السياج الرقمَ بين قوسين: يبدأ :::callout{type="theorem" title="Bradley–Terry"} بـ«Theorem 2 (Bradley–Terry).». والإطار الذي يُفتح بمعرّف ({#thm:main}) هدفٌ للإحالات، فتطبع «Theorem 2» (:ref{id="thm:main"})، ويطبع \ref{thm:main} أو style=number الرقم 2.

الخاصيةالنوعالقيمة الافتراضيةالوصف
labelstring—الكلمة التي تسبق الرقم: 'Theorem'، 'Lemma'، 'Definición'.
counterstring | falseid النمطالعدّاد الذي تزيده الإطارات. والأنماط التي تسمّي عدّادًا واحدًا تتقاسمه، كما يفعل \newtheorem{lemma}[theorem]: Theorem 1، Lemma 2، Theorem 3. والقيمة 'equation' تعدّ مع المعادلات التي تحمل تسمية. أما false فتطبع التسمية بلا رقم («Proof.» في البرهان).
numberingTemplate / resetOn / counterFormatstring / ResourceCounterReset / ResourceCounterFormat'{n}' / 'never' / 'decimal'كما في نوع المورد: '{h1}.{n}' مع resetOn: 'h1' يرقّم Theorem 2.1، 2.2… بحسب الفصل، و'{h1}.{h2}.{n}' مع 'h2' بحسب القسم. والعدّاد الذي تتقاسمه عدة أنماط يواصل العدّ على ما تطبعه قوالبها، أيًّا كان.
placement'runIn' | 'title''runIn''runIn' يفتتح الفقرة الأولى من الإطار بالتسمية (والإطار الذي يبدأ بقائمة أو صيغة أو إطار آخر يُعطى فقرة لها)؛ و'title' يجعل التسمية عنوان الإطار، بتنسيق titleStyle الخاص به: «Theorem 2 (Bradley–Terry)».
bold / italicbooleantrue / falseهيئة التسمية المدمجة في الفقرة ولاحقتها، أيًّا كان متن الإطار: فالمتن المائل (body.italic) يُبقي التسمية القائمة قائمةً. ويُنضَّد العنوان الذي بين القوسين قائمًا بالوزن العادي.
suffixstring'.'يُنضَّد بعد التسمية المدمجة في الفقرة وعنوانها.

البرهان نمطٌ تسميته بلا رقم وله علامة ختام:

calloutStyles: [
  { id: 'theorem', numbering: { label: 'Theorem' }, body: { italic: true } },
  { id: 'lemma', numbering: { label: 'Lemma', counter: 'theorem' }, body: { italic: true } },
  { id: 'definition', numbering: { label: 'Definition' } },
  { id: 'proof', backgroundEnabled: false, endMark: '□',
    numbering: { label: 'Proof', counter: false, bold: false, italic: true } },
]

وفي كتاب يُخرَج فصلًا فصلًا تستمر العدّادات من الفصل السابق (LayoutContinuation.statementCounters، التي تملؤها continuationAfter)، ويعطي مخطّط الكتاب مرساة كل إطار مرقّم تسميتها (OutlineEntry.numberLabel)، فتطبعها الإحالة من فصل آخر.

#التنسيق الطباعي داخل الإطار

ينضّد الإطار محتواه بتنسيق body وlists الخاص به؛ وكل ما عدا ذلك يحتفظ بأنماط المستند:

  • الفقرات تأخذ body الخاص بالإطار: الخط، والحجم، وتباعد الأسطر، واللون، وألوان التوكيد، والأوزان، وitalic، وsmallCaps، والمحاذاة، وتقسيم الكلمات بالواصلة، والإزاحة البادئة، والتباعد بين الفقرات. والحقل غير المُعيَّن يرث bodyText. ولون التوكيد الموروث يحتفظ بارتباطه بلوحة الألوان، فيتغيّر النص العريض والمائل وتسميات :ref داخل الإطار مع colorPalette كما تتغيّر خارجه. (حتى postext 1.4 كان النص العريض في الإطار يبقى #295AA3 أيًّا كان اللون الرئيسي.)
  • القوائم النقطية تأخذ lists الخاص بالإطار (رمز التعداد، واللون، وحجم الرمز ووزنه، والإزاحة، والفاصل، والتباعد بين العناصر) فوق unorderedLists، ونصّها هو نص الإطار. وlists.bulletChar أو lists.color المختلف عن قيمة المستند (unorderedLists) يستبدل رمز التعداد أو اللون في كل المستويات؛ أما المكرِّر لقيمة المستند أو غير المُعيَّن فيترك لكل مستوى قيمته (unorderedLists.levels)، فتبقى الشرطات المتداخلة في الإطار.
  • القوائم المرقّمة تأخذ lists.indent وgap وitemSpacing، وتأخذ lists.color متى حدّده النمط، حتى لو كان لون رموز التعداد في المستند؛ والنمط الذي لا يحدّده يُبقي الأرقام بلون orderedLists.color. (حتى postext 1.4 لم يكن اللون يصل إلى الأرقام إلا إذا اختلف عن unorderedLists.color، فلم يكن لتعيينه على ذلك اللون نفسه أي أثر.) أما الرقم نفسه (خطه وحجمه وفاصله) فيأتي من orderedLists العام، لأن lists لا يضم إلا حقول رموز التعداد: نسّق أرقام الإطار هناك.
  • :::paragraphs داخل الإطار تستخدم نمط الفقرة الخاص بها، وكذلك في الإطارات المتداخلة. والحقول التي لا يحدّدها النمط ترث bodyText الخاص بالمستند، لا body الخاص بالإطار (ولا ميله ولا أحرفه الكبيرة الصغيرة).
  • مجموعات :::columns لا نمط خاصًا بها: تتشارك الأعمدة كلها تنسيق نص الإطار وقوائمه، ويحدّد columnGap الفاصل بينها.
  • الاقتباسات الكتلية تأخذ خط نص الإطار وحجمه وأوزانه (مائلة ورمادية، كما في النص الجاري)، وأحرفه الكبيرة الصغيرة. والعناوين تحتفظ بأنماط العناوين؛ والصيغ المنفصلة بإعدادات الرياضيات.
  • الأشكال والجداول تحتفظ بأنماط التعليقات والجداول في المستند، بالعرض الداخلي للإطار؛ ويتبع وزناها العادي والعريض أوزانَ body في الإطار.
  • الشارات (chips) تحتفظ بنمط الشارة الخاص بها؛ ويُقرأ حجم em نسبةً إلى حجم نص الإطار.
  • :::space يُقاس بأسطر نص الإطار (انظر :::space لمعرفة المواضع التي يُسقط فيها).
  • الإطار المتداخل يأخذ نمطه الخاص كاملًا؛ ويُتجاهل span وplacement وfloatBarrier وsnapToGrid الخاصة به.

#علامات الإطار المقسوم

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

  • repeatTitle: true يكرّر العنوان في رأس كل تتمة، متبوعًا بـcontinuedSuffix، فيكون افتراضيًا «Key points (cont.)». ويأخذ العنوان المكرَّر نمط العنوان، فمع textTransform: 'uppercase' يعطي «HAMLET (CONT'D)» كما في السيناريو. وتبقى الأيقونة ولسان التسمية في الجزء الأول.
  • continuesMarkerEnabled: true يضع continuesMarker («Continued»، أو «Continúa» في مستند إسباني) تحت السطر الأخير من كل جزء له تتمة، داخل الإطار، بخط نص الإطار وحجمه: مائلًا ما لم يكن continuesMarkerItalic مساويًا false، ومحاذيًا لليمين ما لم يحدّد continuesMarkerAlign القيمة 'left' أو 'center'. وتأخذ العلامة مساحة في الجزء الذي تختمه، ويُختار القطع بحيث تتسع لها.
calloutStyles: [{
  id: 'speech',
  keepTogether: false,
  titleStyle: { textTransform: 'uppercase' },
  repeatTitle: true,
  continuedSuffix: "(CONT'D)",
  continuesMarkerEnabled: true,
  continuesMarker: '(MORE)',
  continuesMarkerAlign: 'center',
  continuesMarkerItalic: false,
}],
:::callout{type="speech" title="Hamlet"}
A speech long enough to run over the foot of the page…
:::

ينتهي الجزء الذي يختم الصفحة بـ«(MORE)»، وتبدأ الصفحة التالية بـ«HAMLET (CONT'D)». وكلاهما من لوازم ترقيم الصفحات: في ملف PDF الميسَّر هما عنصران زخرفيان (artifacts)، وفي HTML يُخفيان عن التقنيات المساعدة، فيُقرأ العنوان مرة واحدة. وفي VDT هما كتلتا نص في designOverlay تحملان العلامة artifact: true.

#الأجزاء

تضبط الخاصية parts صفحات فواصل الأجزاء التي يفتحها المستند بالحاوية :::part{number="…" title="…"}، أي صفحة «الجزء الأول: الأسس» التي تجمع سلسلة من الفصول. ويشغل الجزء دائمًا صفحة خاصة به: تنتقل الحاوية إلى صفحة جديدة بالزوجية المضبوطة، وتحوّلها إلى صفحة أحادية العمود تأتي منطقة متنها من parts.margins، وتضع تصميم الافتتاح على الصفحة كلها، ثم تنتقل مجددًا بعد السياج الختامي فيبدأ الفصل التالي (بـbreakBefore.parity الخاص به) من صفحة نظيفة؛ ومع إعدادات H1 الافتراضية ينتج ذلك الترتيب التقليدي: صفحة الجزء فردية، تليها صفحة زوجية فارغة، ثم الفصل في الصفحة الفردية التالية.

const config: PostextConfig = {
  parts: {
    breakBefore: { parity: 'odd' },
    breakAfter: { enabled: true, parity: 'any' },
    margins: { top: { value: 9, unit: 'cm' }, left: { value: 3, unit: 'cm' }, right: { value: 3, unit: 'cm' } },
    design: {
      elements: [
        {
          kind: 'text', id: 'number', content: 'Part {numberRoman}',
          fontSize: { value: 12, unit: 'pt' }, fontWeight: 600, align: 'left',
          placement: { anchor: { to: 'page', edge: 'top-left' }, offset: { x: { value: 3, unit: 'cm' }, y: { value: 5, unit: 'cm' } }, size: { width: 'auto', height: 'auto' } },
        },
        {
          kind: 'text', id: 'title', content: '{titleText}',
          fontSize: { value: 28, unit: 'pt' }, fontWeight: 700, align: 'left', overflow: 'wrap',
          placement: { anchor: { to: '#number', edge: 'below' }, size: { width: { value: 15, unit: 'cm' }, height: 'auto' } },
        },
      ],
    },
    bodyStyle: { fontSize: { value: 11, unit: 'pt' }, numberColor: { hex: '#AA0000', model: 'hex' } },
  },
};
:::part{number="I" title="Foundations"}
1. The lantern and its parts
2. Trimming the wick
3. Reading the weather
:::
 
# The lantern and its parts
الخاصيةالنوعالقيمة الافتراضيةالوصف
pagebooleantrueهل تفتح :::part صفحة فاصلة. مع false لا تُفتح صفحة ولا يُنضَّد متن السياج: يسري رقم الجزء وعنوانه ولوحة ألوانه بدءًا من المحتوى التالي، دون فاصل خاص بها. الاستعمال المعتاد: htmlViewer.overrides.parts.page: false، أي نسخة للشاشة بلا فواصل أقسام.
breakBefore.parityHeadingBreakParity'odd'زوجية الصفحة التي يبدأ فيها الجزء. القيم نفسها وقواعد ملكية الصفحات الفارغة نفسها كما في breakBefore للعناوين: الصفحة الفارغة المُدرجة لبلوغ الزوجية تتبع الجزء (فـ فيها يشير بالفعل إلى الجزء الجديد)؛ أما الفاصل الإلزامي في 'always-*' فيتبع المحتوى السابق.
breakAfter.enabledbooleantrueينقل المحتوى الذي يلي السياج الختامي إلى صفحة جديدة. ومع false يستمر في العمود الوحيد لصفحة الجزء.
breakAfter.parityHeadingBreakParity'any'زوجية تلك الصفحة الجديدة. اتركها على 'any' ودع breakBefore.parity الخاص بالفصل التالي يقرّر هل تليها صفحة زوجية فارغة. ويُطبَّق الفاصل عند وضع الكتلة التالية، فالجزء الذي يختم المستند لا يترك صفحة فارغة في آخره.
marginsPageMarginsهوامش الصفحةمنطقة المتن في صفحة الجزء، أي العمود الوحيد الذي تجري فيه الكتل الواقعة داخل السياج. كل جانب غير مُعيَّن يرث هامش الصفحة؛ وmirror يبادل الداخلي والخارجي في الصفحات الزوجية تمامًا كهوامش الصفحة.
designDesignSlotفارغتصميم الافتتاح. حاويته هي صندوق حدّ القص للصفحة، فتتطابق مراسي الحاوية ومراسي 'page'، ويمتد 'bleed' حتى النزف حين تكون خطوط القص مفعّلة. زخرفي بحت: لا يحجز أي مساحة من المتن، فارفع margins.top لإبعاد المتن عنه. وحين يكون فارغًا، يُولَّد نص افتراضي بتنسيق H1 في أعلى يسار منطقة المتن، مع numberSeparator الخاص بـH1 بين الرقم والعنوان.
versoDesignDesignSlotفارغتصميم الصفحة الزوجية الفارغة التي تلي صفحة الجزء (ظهر الورقة الفاصلة): الحاوية والعناصر النائبة نفسها كما في design. اتركه فارغًا لصفحة زوجية خالية. ولا يُرسم إلا حين تبقى الصفحة التي تلي صفحة الجزء فارغة، وهذا يتطلب فاصلًا بزوجية محددة: انظر تصميم الصفحة الزوجية أدناه.
bodyStyle.fontFamily، fontSize، lineHeight، color، textAlignكما في bodyTextترث bodyTextالتنسيق الطباعي للفقرات والاقتباسات الكتلية وعناصر القوائم داخل السياج. وتأتي الأوزان وألوان التوكيد وتقسيم الكلمات بالواصلة من نص المتن.
bodyStyle.bulletColorColorValueunorderedLists.colorلون رموز التعداد في القوائم النقطية داخل الجزء.
bodyStyle.numberColorColorValueorderedLists.colorلون الأرقام في القوائم المرقّمة داخل الجزء. وتُنضَّد الأرقام دائمًا بالوزن العريض لنص المتن، فتُقرأ قائمة الفصول كجدول محتويات.
bodyStyle.unorderedListsUnorderedListsConfig—تجاوزات جزئية تُطبَّق فوق unorderedLists الخاص بالمستند داخل الجزء، بعد bulletColor. والقيم التي تخص القائمة كلها تسري إلى المستويات التي ورثتها؛ ومدخلات levels تنطبق على مستواها فقط.
bodyStyle.orderedListsOrderedListsConfig—تجاوزات جزئية تُطبَّق فوق orderedLists الخاص بالمستند داخل الجزء، بعد numberColor والوزن العريض، مثل separator قيمته '•' مع separatorFontFamily وseparatorColor خاصين به لقائمة الفصول في صفحة افتتاح الجزء.

#العناصر النائبة في تصميم الجزء

تحلّ خانة التصميم مجموعة العناصر النائبة (placeholders) الخاصة بالعناوين بقيم الجزء نفسه: {titleText} هو title السياج؛ و{number} هو number كما كُتب تمامًا؛ و{numberDecimal} و{numberRoman} و{numberRomanLower} و{numberAlpha} و{numberAlphaLower} تعيد تنسيقه: يُحلَّل الرقم على أنه عدد عشري أو رقم روماني أو أرقام صينية، مع الكلمات التي تحيط بها أو دونها ("IV" و"iv" و"4" و"4" و"四" و"卷四" و"第四卷" كلها تعطي {numberDecimal} = 4)، وتُحَلّ إلى '' في أي حالة أخرى. وتتوفّر أيضًا {partTitle} / {partNumber}، و{chapterTitle} / {chapterNumber} (الفصل الذي يسبق الجزء)، و{pageNumber}، و{totalPages}، و{bookTotalPages}، والعناصر النائبة للبيانات الوصفية. و{attr.<key>} يقرأ سمات H1 للفصل الحالي.

#تصميم الصفحة الزوجية

يزيّن versoDesign الصفحة التي تلي صفحة الجزء مباشرةً حين لا تحمل محتوى: ظهر الورقة الفاصلة. والجزء نفسه لا يترك تلك الصفحة فارغة أبدًا. فالقيمة الافتراضية لـbreakAfter.parity هي 'any'، لذا يبدأ المحتوى الذي يلي السياج في الصفحة التالية مباشرةً ما لم يطلب شيء زوجية محددة:

  • عنوان الفصل التالي. قيمة breakBefore الافتراضية لـH1 هي 'always-odd'، و'odd' تفعل الشيء نفسه بعد صفحة جزء فردية: ينتقل الفصل إلى الصفحة الفردية التالية وتبقى الزوجية فارغة. فيُرسم تصميم الصفحة الزوجية.
  • parts.breakAfter: { enabled: true, parity: 'odd' }. يطلب الجزء بنفسه الصفحة الفردية التالية، أيًّا كان ما يفعله العنوان التالي. استخدمه حين يمكن أن تبدأ الفصول في أي من الجانبين (breakBefore.parity: 'any'، أو breakBefore.enabled: false).

ومن دون أيٍّ منهما يبدأ الفصل في الصفحة الزوجية ولا يُرسم تصميمها. ومع breakAfter.enabled: false يستمر المحتوى في صفحة الجزء نفسها. وتأخذ الصفحة الزوجية لوحة ألوان الجزء، فالسمة palette="band=#…" في السياج تعيد تلوينها أيضًا.

parts: {
  breakBefore: { parity: 'odd' },
  breakAfter: { enabled: true, parity: 'odd' },   // always a blank verso to paint
  versoDesign: {
    elements: [{
      kind: 'box', id: 'field',
      style: { backgroundColor: { hex: '#b07d2b', model: 'hex', paletteId: 'band' } },
      placement: { anchor: { to: 'page', edge: 'top-left' }, size: { width: 'fill', height: 'fill' } },
    }],
  },
}

جزء يختم فصله. في كتاب يُخرَج فصلًا فصلًا (Sandbox، وbuildBundle) يمكن أن يكون السياج :::part فصلًا قائمًا بذاته، أو نهاية فصل. فتكون صفحة الجزء عندئذ آخر صفحات الفصل، ويتولى الفصل التالي ما بقي على الجزء: يطبّق breakAfter قبل كتلته الأولى ويرسم versoDesign في صفحته الأولى حين تبقى فارغة. فتخرج الصفحات كما لو كان الكتاب كله في مستند واحد. ولا يجوز أن يلي السياج إلا التوجيهات التي لا تضع شيئًا (:::numbering، :::space)؛ وكل ما عداها محتوى من الفصل، فيأخذ الفاصل بنفسه. والفصل الفارغ الذي يلي الجزء مباشرةً صفحة قائمة بذاتها: وتلك الصفحة هي الزوجية. والمضيف الذي يُخرج الفصول بنفسه يحصل على ذلك من continuationAfter()، التي تُبلغ afterPartPage: true للفصل الذي ينتهي بجزء؛ مرّرها في continuation الخاص بالفصل التالي.

#الحاوية :::part

يفتح السطر :::part{number="…" title="…"} الجزء، ويغلقه ::: وحدها؛ والسمتان اختياريتان (قيمتهما الافتراضية ''). تجري الكتل الواقعة بينهما (قائمة الفصول عادةً) في العمود الوحيد لصفحة الجزء بتنسيق bodyStyle، بدءًا من margins.top؛ والمتن الأطول من الصفحة يستمر في صفحات عادية. وتُصنَّف الصفحة role: 'part' (ويحمل VDTPage.partInfo الرقم والعنوان)، فيمكن لعناصر الترويسة والتذييل أن تستهدفها أو تتخطاها بـpages: 'part' / pages: 'body'؛ ويضيف مُخرِج PDF الجزء إلى المخطط (outline) فوق فصوله. والمتن الفارغ (:::part{…} يليه ::: مباشرةً) هو الحالة الشائعة، وهو ينتج الصفحة مع ذلك، فالأجزاء المتتالية لا تتشارك صفحة أبدًا. و:::part المتداخل في جزء آخر يُدمج في الجزء الخارجي.

وتعطي سمة ثالثة، palette="<id>=<hex>[, <id>=<hex>…]"، الجزءَ ألوانه الخاصة: في صفحة الجزء وفي كل صفحة تليها حتى الجزء التالي، يأخذ كل لون تصميم (الترويسة، والتذييل، ونطاق الافتتاح، وتصميما الجزء والصفحة الزوجية) مرتبط بأحد معرّفات لوحة الألوان هذه قيمةَ الجزء بدلًا من قيمة لوحة ألوان المستند. بهذا تعيد أقسام الكتاب تلوين لسان الزاوية ونقطة الترويسة ونطاق صفحة افتتاح الفصل دون تصميم ثانٍ: :::part{number="II" title="…" palette="band=#f6c297"}. ويتبعها تدفق النص أيضًا: في الصفحات نفسها، كل لون في التدفق يساوي القيمة الأساسية لمدخل متجاوَز في لوحة الألوان يأخذ قيمة الجزء، وذلك في ألوان العناوين والنص العريض والمائل والإحالات، ورموز التعداد وأرقام القوائم، وتسميات التعليقات وأشرطتها، ونص الجداول وخطوطها وتعبئاتها (الرأس، والمتن، والصفوف المتناوبة، وتعبئة الخلية الخاصة)، وإطارات callout (الخلفية، والحدّ، والشريط الجانبي، والعنوان)، والشارات (التعبئة، والحدّ الخارجي، والنص)؛ فالخاصية headings.levels[1].color المرتبطة بـband تجعل عناوين كل قسم بلونه الخاص. وتحتفظ عيّنات الألوان المضمّنة باللون المكتوب فيها. وتُفصل الأزواج بفواصل أو فواصل منقوطة أو مسافات، ويربط = أو : بين المعرّف واللون، و# اختيارية. ويظل الجزء ساريًا بعد إغلاق سياجه: يتبع {partTitle} و{partNumber} ولوحة الألوان التدفقَ إلى الفصول التي تليه، ومن خلال continuation.part الذي تُبلغ عنه continuationAfter() إلى الفصول التي تُخرَج منفردة، فيُظهر الفصل الثاني من القسم القسمَ في ترويساته تمامًا كما يفعل الأول.

قد يتشارك مدخلان من لوحة الألوان قيمة أساسية واحدة ويأخذان مع ذلك قيمتين مختلفتين في جزء ما، حين يتجاوز الجزء أحدهما دون الآخر أو يعطيهما لونين مختلفين. والقيمة وحدها لا تدل على المدخل الذي جاء منه لون التدفق، لذا يُطابَق كل لون في التدفق مع الإعدادات التي يمكن أن يأتي منها، ويأخذ القيمة التي ترتبط بها تلك الإعدادات. ويُميَّز بين ما يلي:

  • ألوان نص الكتلة: لون النص، وألوان النص العريض والمائل والإحالات، وعلامة القائمة (رمز تعداد أو رقم) والفاصل الذي يلي الرقم. فإذا كان bodyText.color مرتبطًا بـink وbodyText.boldColor مرتبطًا بـaccent، وكلاهما #1a1a1a، فإن الجزء ذا palette="accent=#b8413d" يعيد تلوين المقاطع العريضة ويترك النص؛ وإذا كان unorderedLists.color هو المرتبط بـaccent، فإنه يعيد تلوين رموز التعداد ويترك نص العناصر؛
  • كل مستوى من مستويات العناوين، وكل نمط عنوان يحدّد لونًا؛
  • نص صف المحتويات، ورقمه، ورقم صفحته وعنوانه الفرعي؛
  • في كل نمط إطار: التعبئات (الخلفية، والشريط الجانبي، ولسان التسمية)، والحدّ، والخطوط (خط العلامة وخط التسمية)، والنص (العنوان، والأيقونة، ورمز العلامة، والتسمية)؛
  • كل لون في كل نمط جدول وشارة وتعليق. ونمط الجدول المسمّى منفصل عن tableStyle، ونمط تعليق نوع المورد منفصل عن captionStyle. وتعبئة الخلية الخاصة تتبع ارتباطها الخاص.

تبقى حالة واحدة تُحسم بالقيمة: إعدادات في أماكن مختلفة تحدّد اللون نفسه لكتلة ما. فـbodyText.color وbodyText.blockquote.color وcolor في نمط الفقرة وbody.color في نمط الإطار كلها تحدّد لون نص الكتلة، مثلًا. وحين يرتبط اثنان منها بمدخلين يتشاركان قيمة أساسية ويفرّق الجزء بينهما، يأخذ اللون القيمة المتجاوِزة (وآخرهما كتابةً إن تُجووز كلاهما). أعطِ هذه المدخلات قيمًا أساسية خاصة بها.

const resolved = resolvePartsConfig(config.parts, resolvedPage, resolvedBodyText, resolvedUnorderedLists, resolvedOrderedLists);
// => margins filled from the page, bodyStyle from the body / list configs
 
const minimal = stripPartsDefaults(config.parts);
// => undefined when only static defaults remain

#أنماط العناوين

تُعرِّف الخاصية headingStyles أنماطًا مسمّاة يطبّقها المستند على عنوان بالصيغة # Title {style="<id>"}. ويفعل النمط أمرين. فهو يتجاوز تنسيق مستوى العنوان وتصميمه وترقيمه، أي كل حقل من مدخل المستوى ما عدا level (الخط، والحجم، واللون، وbreakBefore، وspan، وadvancedDesign، وtextTransform، وhidden، وnumberingTemplate…)، ويحكم القسم الذي يفتحه العنوان: تأخذ صفحاته، حتى العنوان التالي من المستوى نفسه أو مستوى أعلى، ترويسات النمط وهندسة صفحاته وتنسيق متنه ولوحة ألوانه. بهذا تقع الصفحات التمهيدية للكتاب (تمهيد في عمود عريض واحد بأرقام صفحات رومانية ونطاقات زرقاء) في دليل من عمودين مرقّم بأرقام عشرية، دون إعداد ثانٍ.

const config: PostextConfig = {
  headingStyles: [
    {
      id: 'front-matter',
      numbered: false,
      breakBefore: { enabled: true, parity: 'odd' },
      span: 'page',
      advancedDesign: { enabled: true, minHeight: { value: 52, unit: 'mm' }, slot: { elements: [/* bands, `{titleText}` */] } },
      header: { elements: [/* folio | rule | `{title}. {subtitle}` */] },
      margins: { left: { value: 50, unit: 'mm' }, right: { value: 17, unit: 'mm' } },
      layout: { layoutType: 'single' },
      bodyStyle: { fontSize: { value: 10.5, unit: 'pt' }, textAlign: 'justify' },
      palette: { band: '#547396' },
    },
  ],
};
# Preface {style="front-matter"}
الخاصيةالنوعالقيمة الافتراضيةالوصف
idstring—المعرّف الذي يُشار إليه بـ في سطر العنوان. والمعرّف غير المعروف يترك العنوان على حاله.
namestringidاسم مقروء للبشر (لواجهة المحرّر فقط).
numberedbooleantrueهل يُحتسب العنوان: يزيد عدّاد مستواه (أرقام numberingTemplate، و في أرقام الموارد)، والترتيب التسلسلي للفصل الذي يقوم عليه ، والرقم المطبوع في المحتويات. false للتمهيد، أو قائمة المؤلفين، أو الفهرس الأبجدي: يبقى أول فصل مرقّم بعدها الفصل 1، ويكون فارغًا في صفحاتها.
tocbooleantrueهل يُدرج :::toc العنوان. ويتجاوزه العنوان بـ / .
runningChapterbooleantrueهل يصبح عنوان المستوى الأول من هذا النمط الفصلَ الجاري: الفصل الذي تسمّيه و و وصيغها …AtTop في صفحته والصفحات التي تليها. false للوحة مصوّرة (plate) أو خريطة أو غلاف منضَّد كعنوان H1 داخل فصل: تتخطاه الترويسات، في صفحته أيضًا، وتواصل تسمية الفصل الذي يقطعه؛ ولا يحدّد كذلك كلمةً دليلية h1. ويظل العنوان يُحتسب حين يكون numbered (فتصميمه يقرأ الخاص به) ويظل :::toc يُدرجه حين يكون toc. ومع toc: false أيضًا لا يحصل على علامة مرجعية في PDF: فاللوحة المصوّرة للفصل في الصفحة التي تسبق صفحة افتتاحه تترك العلامات المرجعية للفصول. وعناوين المستويات الأخرى تتجاهله. ومع القيمة الافتراضية تطبع الصفحات التي تلي اللوحة المصوّرة عنوانها. والتمهيد أو الاستهلال ذو numbered: false يظل فصلًا قائمًا بذاته ويحتفظ بالقيمة الافتراضية. ولا يغيّر هذا الخيار إلا الفصل الذي تسمّيه العناصر النائبة: فالنمط يظل يفتح قسمًا خاصًا به، كما يفعل كل نمط عنوان، فتأخذ الصفحات حتى عنوان المستوى الأول التالي خانات الترويسة وهوامش نمط اللوحة المصوّرة وأعمدته ونمط متنه ولوحة ألوانه (وقيم المستند حيث لا يحدّد النمط شيئًا)، لا تلك التي لقسم منسَّق فتحه الفصل المقطوع. وفي الكتاب الذي يُخرَج فصلًا فصلًا، لا تنتقل الترويسات من ملف فصل إلى الذي يليه، فاللوحة المصوّرة التي تفتح ملفًا تُظهر عناصر نائبة فارغة للفصل حتى أول عنوان فصل في الملف.
حقول المستوىكما في headings.levels[]قيم المستوىfontFamily، fontSize، lineHeight، fontWeight، italic، color، marginTop، marginBottom، snapToGrid، breakBefore، span، advancedDesign، textTransform، letterSpacing، lineSpan، indent، firstLineIndent، jidori، dropCap، hidden: كلٌّ منها، إذا عُيِّن، يحلّ محلّ قيمة مستوى العنوان في عناوين هذا النمط (وdropCap: false يُسقط الحرف الاستهلالي الذي يضبطه المستوى). وbreakBefore يُدمج حقلًا حقلًا فوق قيمة المستوى: النمط الذي لا يحدّد إلا parity يحتفظ بقيمة enabled الخاصة بالمستوى، والذي لا يحدّد إلا enabled: true يحتفظ بزوجية المستوى (حتى postext 1.4 كان الحقل الناقص يأتي بدلًا من ذلك من القيمة الافتراضية التي لا فاصل فيها).
numberingTemplatestringقيمة المستوىالقالب الذي تُرقَّم به عناوين النمط بدلًا من قالب مستواها (الرموز نفسها كما في levels[].numberingTemplate). ويبقى العدّاد عدّاد المستوى: نمط الملاحق ذو 'Appendix ' بعد خمسة فصول سيطبع Appendix F، لذا أعد بدء العدّ بـ في أول ملحق. و'' لا يطبع رقمًا مع أن العنوان يظل يُحتسب: ولا حتى الترتيب التسلسلي للفصل الذي تُظهره المحتويات و لعنوان من المستوى الأول بلا قالب. ويظهر الرقم في التدفق، وفي لتصميم النمط، وفي المحتويات، وفي .
header، footerDesignSlotقيم المستندترويسات صفحات القسم، تحلّ هناك محلّ header / footer (وتظل مرشحات parity وpages للعناصر سارية). والخانة الفارغة تزيلها.
marginsPageMarginsهوامش الصفحةمنطقة المتن في صفحات القسم؛ كل جانب غير مُعيَّن يرث هامش الصفحة، بما في ذلك mirror. ويسري على الصفحات التي يفتحها القسم، فاقرنه بـbreakBefore.
layoutLayoutConfiglayoutتخطيط أعمدة صفحات القسم (layoutType، gutterWidth…): عمود عريض واحد لتمهيد منضَّد في كتاب من عمودين. ويُرسم columnRule الخاص به في صفحات القسم، وكل حقل لا يحدّده يأخذ قيمة layout.columnRule من المستند، فالقسم الذي لا يغيّر إلا أعمدته يحتفظ بالخط الفاصل للمستند (انظر الخط الفاصل بين الأعمدة).
bodyStylePartsBodyStyleConfigترث bodyTextالتنسيق الطباعي للفقرات والاقتباسات الكتلية والقوائم في القسم، بالحقول نفسها كما في parts.bodyStyle.
paletteRecord<string, string>تجاوزات لوحة الألوان (المعرّف ← قيمة hex) لصفحات القسم، فوق تجاوزات الجزء الحالي: الآلية نفسها التي تتبعها السمة palette في الجزء، وبالمدى نفسه. فهي لا تشمل خانات التصميم المُخرَجة في تلك الصفحات وحدها (الترويسات، ونطاق الافتتاح، وكل لون مرتبط بمعرّف متجاوَز)، بل تشمل تدفق النص أيضًا، بالقيمة: كل لون في التدفق يساوي القيمة الأساسية لمدخل متجاوَز يأخذ قيمة القسم، كما تحت الجزء، وذلك في ألوان العناوين والنص العريض والمائل والإحالات، ورموز التعداد وأرقام القوائم، وتسميات التعليقات وأشرطتها، ونص الجداول وخطوطها وتعبئاتها، وإطارات callout (الخلفية، والحدّ، والشريط الجانبي، والعنوان)، والشارات (التعبئة، والحدّ الخارجي، والنص)، بما في ذلك قاعدة المدخلين اللذين يتشاركان قيمة أساسية (انظر الحاوية :::part). وتحتفظ عيّنات الألوان المضمّنة باللون المكتوب فيها. ويتبعها لون الصفحة أيضًا: إذا كان page.backgroundColor مرتبطًا بمدخل مُستبدَل (أو كانت قيمته، دون ربط، هي القيمة الأساسية لذلك المدخل)، تُطلى صفحات القسم بقيمة القسم، فتُطبع الصفحات الاقتصادية في الصحيفة على لون السلمون وتبقى الصفحات الأخرى بيضاء. منذ postext 1.18.

يُغلق القسم عند العنوان التالي من المستوى نفسه أو مستوى أعلى: العنوان # غير المنسَّق بعد عنوان منسَّق يعيد ترويسات المستند وهندسته؛ والعنوان المنسَّق يفتح قسمه الخاص. والصفحات التي تركها القسم فارغة لأجل الزوجية تتبعه، كما تتبع عناوينَ الفصول.

فاصل الصفحة لا يحلّ محلّ فاصل العنوان نفسه. يرث النمط breakBefore الخاص بمستواه (القيمة الافتراضية للمستوى الأول { enabled: true, parity: 'always-odd' })، ويطبّقه العنوان أينما وقع، حتى بعد :::pagebreak مباشرةً. يفتح فاصل الصفحة صفحة جديدة، ثم يظل العنوان يطلب جهته من الصفحتين المتقابلتين. مع parity: 'odd'، الفاصل الذي يقع على صفحة زوجية تليه صفحة فارغة، فيبدأ العنوان في الصفحة الفردية التالية. ومع 'always-odd' تأتي الصفحة الفارغة الفاصلة أيضًا، ولا يغيّر فاصل الصفحة شيئًا، لأن العنوان كان سيفتح تلك الصفحة على أي حال. والنمط الذي يُراد أن يبدأ في الصفحة التي يفتحها فاصل يدوي، كصفحة المحتويات بعد صفحة العنوان، يعطّل فاصله الخاص:

headingStyles: [
  // Starts where the text puts it: on the page the `:::pagebreak` before it opened.
  { id: 'contents', numbered: false, toc: false, breakBefore: { enabled: false } },
],

ولإبقاء صفحة خاصة به دون اختيار جهة، اضبط breakBefore: { parity: 'any' } بدلًا من ذلك واحذف :::pagebreak.

إلى أي قسم تنتمي الصفحة. تُختار الترويسات ولوحة الألوان لكل صفحة، لا لكل عنوان. وتأخذ الصفحة القسم الساري بعد آخر تغيير للقسم فيها: حيث ينتهي قسم ويبدأ آخر في الصفحة نفسها (حرفان قصيران من معجم، مثلًا) تحمل الصفحة ترويسات الثاني ولوحة ألوانه؛ وحيث ينتهي قسم منسَّق في منتصف الصفحة عند عنوان غير منسَّق، تعود الصفحة إلى قيم المستند. و{chapterTitle} يتبع القاعدة نفسها: الصفحة التي يلتقي فيها فصلان تُظهر عنوان الأخير منهما. والصفحات الفارغة تتبع قاعدة عناوين الفصول: الصفحة الفارغة لأجل الزوجية (blankForParity) تتبع القسم الذي يُفتح بعدها، والصفحة الفاصلة التي يضيفها فاصل 'always-odd' / 'always-even' (blankForForce) تتبع القسم الذي قبلها. وفاصل الجزء يُغلق القسم المفتوح.

# A {style="letter"}
 
Aardvark, abacus.
 
# B {style="letter"}
 
Babble, badger… (runs on to the next page)

يبدأ الحرفان كلاهما في الصفحة 1، فتأخذ الصفحة 1 ترويسات القسم B: لسان الإبهام (thumb tab) المضبوط في ترويسة النمط يقرأ «B» هناك، ولا تحمل أي صفحة لسان «A». أعطِ كل قسم صفحة خاصة به (breakBefore) حين يحتاج كلٌّ منها إلى لسانه. ملاحق مرقّمة بالحروف بعد فصول مرقّمة بالأرقام، وصفحة إهداء تُدرجها المحتويات والعلامات المرجعية في PDF لكن الصفحة نفسها لا تحمل عنوانها:

headingStyles: [
  { id: 'appendix', numberingTemplate: 'Appendix {1:A}' },
  { id: 'silent', hidden: true, numbered: false },
],
# Dedication {style="silent"}
 
For M., who read every draft.
 
# Method
 
…
 
# Survey instrument {style="appendix" startAt=1}
 
# Raw data {style="appendix"}

مع numberingTemplate: '{1}.' في المستوى الأول تطبع الفصول 1. و2.…، والملاحق Appendix A وAppendix B. ويفتح الإهداء صفحته (بـbreakBefore الخاص بمستواه)، ولا يطبع إلا فقرته، ويظهر مع ذلك باسم Dedication في :::toc وفي ترويسات {chapterTitle} وفي مخطط PDF؛ أضف toc: false إلى النمط لإخراجه من المحتويات. واللوحة المصوّرة أو الخريطة المنضَّدة كعنوان H1 في منتصف فصل تحتاج عكس ما يحتاجه الإهداء: النمط ذو runningChapter: false (عادةً مع numbered: false وtoc: false) يُبقي الترويسات على الفصل الذي تقطعه.

const resolved = resolveHeadingStylesConfig(config.headingStyles, resolvedPage, resolvedBodyText, resolvedUnorderedLists, resolvedOrderedLists);
// => level overrides normalised, margins filled from the page, bodyStyle from the body
 
const minimal = stripHeadingStylesDefaults(config.headingStyles);
// => undefined when no style remains