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

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

الإعدادات: الإطارات

الأنماط المسمّاة لإطارات :::callout: الحدّ والخلفية والشريط الجانبي والعنوان والأيقونة والعلامة الخارجية، والمبرهنات المرقّمة، والتنسيق الطباعي داخل الإطار، والإطارات المقسومة بين الصفحات

آخر تحديث 2026-10-1626 دقيقةضمن الفصل 3 الإعداداتenescadefritptzhjaar

باختصار

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

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

تُعرِّف الخاصية 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)، ما دام عمود كامل يتسع له. أما الإطار الأطول من عمود كامل فيُقسم بدلًا من ذلك، كالإطار القابل للتقسيم؛ ولا يوضع رغم ذلك ويفيض إلا الإطار الذي لا يقسمه أي قطع (شكل أو جدول أطول من العمود، أو splitMinLines لا يحقّقه أي قطع)؛ وعندئذ يسجّل الإخراج تحذير calloutOverflow (VDTDocument.warnings) يعرضه Sandbox. ومجموعة :::columns تُقطع كالإطار الذي يحيط بها، بين أعمدتها الفرعية (منذ postext 1.25)؛ ولا تبقى كاملة، فتفيض بالطريقة نفسها، إلا مع layout.flowColumns: false أو داخل إطار متداخل. والإطار القابل للتقسيم يترك الجزء الذي يتسع (عناصر أبناء كاملة، أو أسطر فقرة بما لا يقل عن 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' بحسب القسم. والعدّاد الذي تتقاسمه عدة أنماط يواصل العدّ على ما تطبعه قوالبها، أيًّا كان. ويقبل الرمز نمطًا بعد نقطتين، كما في قالب نوع المورد: '{h1:A}.{n}' يطبع مبرهنة A.1 في ملحق مرقّم بالحروف.
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.