跳到主要内容

章 3.12 · 篇 II · 工艺

配置:标注框

:::callout标注框的命名样式:边框、底色、色条、标题、图标和框外标记,编号的命题,框内排版,以及跨页拆分的框

更新于 2026-10-1618分钟所属章节: 3 配置enescadefritptzhjaar

简单来说

本页讲把提示、技巧、警告或学习目标与正文分开的框。你给每种框起一个名字,并设定它的样子:底色、边框、一条彩色色条、标题和图标。框可以带编号,就像教科书里的定理或例题。你可以选择框内的字体。一个长框延续到下一页时,你可以选择用什么标出断开的地方。

#标注框样式

calloutStyles属性声明一组具名的框样式,文档用:::callout{type="…"}容器来套用:注释、提示、警告、学习目标,以及任何需要用底色框或描边框与正文区分开的内容。默认只带一种中性样式note(浅灰底色,无边框、无色条、无图标、无标题),所以不做任何配置也能使用:::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="…"}选用的标识符。type未知或缺失的围栏使用配置中的第一种样式(沙盒会标出未知类型)。
namestringid便于阅读的名称(仅用于编辑器界面)。
titlestring''默认标题文字;为空表示没有标题。围栏上的title属性可逐个覆盖它。
span'column' | 'page' | 'side''column'水平范围:一栏、整个版心宽度,或一栏半版式中只放浮动体的侧栏(layout.sideColumnRole: 'floats');后一种情况下,框离开文字流,叠放在侧栏中,紧挨着它所打断的正文。可用span属性逐个覆盖。在多栏版式中,'page'框会成为通栏块:它把页面切分成若干栏带,自己占一个通栏宽的栏(见下文容器一节)。本页侧栏放不下的侧栏框排进下一页的侧栏;如果所在章(或文档)先结束,每个仍在等待的框按围栏的先后排进正文之后页面的侧栏,排版会报告(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')在围栏之后的正文没有在同一栏接着排时的位置:栏里已经放不下,或断行规则把正文送走(被段首孤行、段末孤行规则整段移走的段落,与正文保持同栏的标题)。'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-radius裁切border-left一样。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时则适配到width × size的框内(一长条图标)。比内容高的图标会把框撑高以容纳它(配合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倍行距处。所以标题采用正文行距(12 pt网格上设lineHeight: 12pt)时,框的高度保持整数行、标题落在网格上;默认的1.2 em则会给每个框多出零点几行。textTransform: 'uppercase'不改变文字长度。letterSpacing调整标题的字距(canvas的letterSpacing / PDF的Tc);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把它排成小型大写字母;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行(默认两行;splitMinLines更低时取它,所以设为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自带的字形绘制,因此即使字体中没有这些字符(如Fontsource的latin文件)也能印出;关闭数学公式时,则用框正文的字体排出。

#:::callout容器

:::callout{type="<id>"}一行打开框,单独一行:::关闭它。围栏接受五个属性:type(样式id)、title(覆盖样式的标题)、span、placement和columns(覆盖样式中的值);两者之间的内容排在框内:先是可选的标题,然后是段落、列表、引文块、公式或资源嵌入,各自按样式的body / lists排版(标题保留它们平常的样式)。子块之间的外边距像正文中一样合并;框内部脱离基线网格,框之后文字流回到网格上,框下方至少留出marginBottom(以网格为准,外边距是最小值,资源遵循的也是这一约定)。snapToGrid: false的样式则保持精确的marginBottom,框之后的正文一直偏离网格,直到下一个标题或列表结尾。紧挨在标注框之前的标题与框保持同栏。

本版本的限制:

  • 标注框保持完整,除非其样式设置了keepTogether: false。栏中剩余空间放不下时,它整个移到下一栏或下一页;一个被浮动区带或区带上限截短的空栏,只要完整的一栏能容纳它,框也会从中移出。比一整栏还高的框改为拆分,与可拆分的框一样;只有任何切口都拆不开的框(比栏还高的图或表,或没有切口能满足的splitMinLines)才会照排并溢出;此时版面记录一条calloutOverflow警告(VDTDocument.warnings),沙盒会列出它。:::columns组像它外面的框一样切开,切口落在子栏之间(自postext 1.25起);只有设置了layout.flowColumns: false或位于嵌套框内时,它才保持完整,并可能以同样的方式溢出。可拆分的框留下能放下的部分,即完整的子块,或段落的若干行,每侧不少于splitMinLines行(单独一个图、表或独立公式就足以构成一侧),然后在下一栏或下一页的一个不带图标的框中继续,除非样式重复标题,否则也不带标题,还可以在它留下的部分下方加一个标记(见拆分框的标记)。
  • 浮动体让位于不可拆分的框。当图的引用之后紧接的块是keepTogether标注框时,如果某个位置会让这个框在当前栏带中无栏可落(引用所在的栏,或它之后的空栏,在浮动之前本可容纳它),就不采用这个位置:图移到它的下一个位置,通常是下一页,框留在文字流中。这正是排版工人的做法:不会把框挤出页面,只在栏里留下那张图。
  • 在多栏版式中,span: 'page'让框成为通栏块:它按整个版心宽度排布,把页面切分成栏带。它上方的各栏文字在切线处结束,框自己占一个通栏宽的栏,下方新开一组文字栏,文字流在每一栏中都从框下继续。在各栏平齐的地方,即页面顶端、span: 'page'的章首标题正下方、另一个通栏块正下方,或顶部浮动区带正下方,框直接在那里切开。如果它在页面中部出现、各栏参差不齐,就按排版工人的方式处理:它上方的正文在所有栏中齐平切断(引擎把该栏带的各栏缩短到相同的网格行数后重新排布,于是文字自然地从一栏流向下一栏,所有段首孤行、段末孤行和与下文同栏的规则照样生效),框横跨整页,各栏在它下方继续。切断要多跑几遍排布;如果切线下方放不下框加上段首孤行(widow)规则所需的最少正文行数,或者尝试几次后仍没有合适的排法,框就移到下一页顶端。上方的正文遵守这条切线:一栏在图下方只剩几行、放不下一个段落的开头时,该段落移到下一栏(图于是单独占据那一栏);当某个块仍会越过切线时,切线下移一行,而不是移到那个块结束的地方。开启栏带的拆分框也在那里切断,所以它的其余部分不会越过切线。在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'框从不浮动:无论placement如何,它都叠放在正文旁边。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,或比一栏还高的框)也会在组内部、各栏之间切开:蛇形组依次填满各栏,接到下一个片段;平行组(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,即包围它们的各层嵌套围栏的容器id,由外到内排列(嵌套框形自己的id是最后一项)。带标签的PDF为每个嵌套框在其父框的Div内生成一个Div。图标图片与资源图片的解析方式相同:canvas图片注册表、HTML的resourceImageUrl选项和PDF的resourceBytes提供器。

const resolved = resolveCalloutStylesConfig(config.calloutStyles, resolvedBodyText, resolvedHeadings, resolvedUnorderedLists, config.locale);
// => 每个继承字段都从已解析的各节中填入;可选的
//    locale决定接续字符串的语言
 
const minimal  = stripCalloutStylesDefaults(config.calloutStyles);
// => 对内置的`note`默认值返回undefined;去掉静态默认值

#编号的命题与证明

带numbering的样式为它的框计数,就像LaTeX的amsthm为定理环境计数(postext 1.19起)。每个框印出它的标签和编号,即第一段开头的“定理2.”,围栏的title以括号跟在编号之后::::callout{type="theorem" title="Bradley–Terry"}以“定理2(Bradley–Terry).”开头。以标识符打开的框({#thm:main})可以作为交叉引用的目标,引用印出“定理2”(:ref{id="thm:main"}),\ref{thm:main}或style=number印出2。

属性类型默认值说明
labelstring—编号前面的词:'定理'、'Lemma'、'Definición'。
counterstring | false样式的id框所推进的计数器。指定同一个计数器的样式共用它,如同\newtheorem{lemma}[theorem]:定理1、引理2、定理3。'equation'与带标签的公式一起计数。false只印标签,不印编号(证明的“证明.”)。
numberingTemplate / resetOn / counterFormatstring / ResourceCounterReset / ResourceCounterFormat'{n}' / 'never' / 'decimal'与资源类型中的相同:'{h1}.{n}'配合resetOn: 'h1'按章编号为定理2.1、2.2……;'{h1}.{h2}.{n}'配合'h2'按节编号。几种样式共用的计数器照常递增,不论各样式的模板印出什么。标记可以像资源类型的模板那样在冒号后写样式:'{h1:A}.{n}'在字母编号的附录里印出定理 A.1。
placement'runIn' | 'title''runIn''runIn'把标签排在框第一段的开头(以列表、公式或另一个框开始的框,会为标签另起一段);'title'把标签作为框的标题,按其titleStyle排出:“定理2(Bradley–Terry)”。
bold / italicbooleantrue / false段首标签及其后缀的字形,不受框正文的影响:正文为斜体(body.italic)时,直立的标签仍保持直立。括号中的标题以常规字重直立排出。
suffixstring'.'排在段首标签及其标题之后。

证明就是一个标签不编号、带结束记号的样式:

calloutStyles: [
  { id: 'theorem', numbering: { label: '定理' }, body: { italic: true } },
  { id: 'lemma', numbering: { label: '引理', counter: 'theorem' }, body: { italic: true } },
  { id: 'definition', numbering: { label: '定义' } },
  { id: 'proof', backgroundEnabled: false, endMark: '□',
    numbering: { label: '证明', 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字重。
  • 行内标签保留自己的标签样式;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中它们是artifact,在HTML中对辅助技术隐藏,所以标题只被朗读一次。在VDT中,它们是标记为artifact: true的designOverlay文本块。