章 3.12 · 篇 II · 工艺
配置:标注框
:::callout标注框的命名样式:边框、底色、色条、标题、图标和框外标记,编号的命题,框内排版,以及跨页拆分的框
简单来说
本页讲把提示、技巧、警告或学习目标与正文分开的框。你给每种框起一个名字,并设定它的样子:底色、边框、一条彩色色条、标题和图标。框可以带编号,就像教科书里的定理或例题。你可以选择框内的字体。一个长框延续到下一页时,你可以选择用什么标出断开的地方。
#标注框样式
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.
:::| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
id | string | — | 由:::callout{type="…"}选用的标识符。type未知或缺失的围栏使用配置中的第一种样式(沙盒会标出未知类型)。 |
name | string | id | 便于阅读的名称(仅用于编辑器界面)。 |
title | string | '' | 默认标题文字;为空表示没有标题。围栏上的title属性可逐个覆盖它。 |
span | 'column' | 'page' | 'side' | 'column' | 水平范围:一栏、整个版心宽度,或一栏半版式中只放浮动体的侧栏(layout.);后一种情况下,框离开文字流,叠放在侧栏中,紧挨着它所打断的正文。可用span属性逐个覆盖。在多栏版式中,'page'框会成为通栏块:它把页面切分成若干栏带,自己占一个通栏宽的栏(见下文容器一节)。本页侧栏放不下的侧栏框排进下一页的侧栏;如果所在章(或文档)先结束,每个仍在等待的框按围栏的先后排进正文之后页面的侧栏,排版会报告(afterText;在postext 1.24及以前,第一个这样的页面之后的框会丢失)。 |
columns | number | 1 | 浮动框(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尺寸)。 |
floatBarrier | boolean | false | 把框设为浮动体屏障:在它之前被引用的每个图或表都排在它之前(放进本页的空闲位置,否则放在框之前新开的页面上),这样浮动体不会越过一章的收尾框(通常是“要点”小结)。章首页、:::part和文档末尾始终是屏障。 |
多栏页面上的span: 'page'框会在它所跟随的正文下方切断栏带;在它之前引用的通栏图先占用这个切口:正文被拉齐,图紧接在正文结束处,框排在图的下面(放不下时移到下一页)。图太高、无法跟在拉齐的正文后面时,图改到下一页开头,框跟在它后面,被离开的栏带仍然齐底结束。可拆分的框(keepTogether: false)在正文和图的下方开始,放进尽可能多的条目,其余接续到下一页。 | |||
width | 'fill' | 'auto' | 'fill' | 'fill'占满可用宽度;'auto'按标题收缩宽度(用作徽标),忽略子内容。 |
backgroundEnabled / background | boolean / ColorValue | true / #f4f4f4 | 框的底色。 |
border | { enabled, color, width } | false、#cccccc、0.5pt | 框的轮廓线,与框元素的边框一样描在框边缘的内侧(见框元素)。 |
borderRadius | Dimension | 0 | 底色 / 边框的圆角半径(上限为框宽和框高的一半)。色条随之变化:在圆角框上,色条被裁切到圆角框形之内,就像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如何,它都保持直角。 |
columnGap | Dimension | 1.5em | 框内:::columns组的栏间距(见下文容器一节)。 |
marginTop / marginBottom | Dimension | 0.75em / 0.75em | 框上方的间距(与前一个块的外边距合并),以及框下方的最小间距(设snapToGrid: false时为精确间距)。浮动的框(placement: 'top'、'bottom'或'auto')在它的区带与正文之间保持浮动间距,即一行正文;比这更大的marginBottom决定顶部区带中框下方的间距,更大的marginTop决定底部区带中框上方的间距,并随区带一起向上取整到网格。postext 1.4及以前,浮动的框忽略自己的外边距。 |
snapToGrid | boolean | true | 为true时,框之后的文字流回到基线网格上,因此框下方的间距是marginBottom向上取整到整数网格行。为false时,框保持精确的marginBottom,并与下一个块的上外边距合并:这种样式的两个相邻框之间恰好相距max(marginBottom, marginTop);框之后的正文可能偏离网格,直到下一个对齐点(标题、列表结尾),与headings.的标题之后一样。适用于由一个个框叠成的文档(练习册、表单)。它只作用于文字流中的框;多栏版式中的通栏框,以及浮动框、固定框和侧栏框都保持网格,因为栏带和浮动区都是在网格上排布的。各栏齐底的调节手段不变:收尾某一栏的框仍会被推到该栏最后一个网格位置。 |
keepTogether | boolean | true | 为true时,框保持完整:剩余空间放不下的标注框整个移到下一栏或下一页。只有比一整个空栏还高的框(对span: 'page'框来说是一整页)无法保持完整:它从出现处开始,按下文false的规则拆分,而不是溢出;能放进一栏的接续部分随后整体移动。这么高的浮动框(placement: 'top' | 'bottom' | 'auto')不浮动,而是留在文字流中的原位。为false时,任何框都可以在子块之间、或段落和列表项的行与行之间断开:能放下的最深切口结束当前栏(对span: 'page'框来说结束当前页,与各栏底部齐平),其余部分在下一栏开头的一个独立框中继续,框形和色条相同,不带图标,也不带标题(除非repeatTitle重复它),仍然太高时再次拆分。每个片段的文字都保留行内图标在首段所占的那一栏(留空),因此框在每一页上的行长都相同。切口落在列表项内部时,项目符号留在切口之前的片段。每个片段的框形都共用围栏的contentIndex / containerId,并记录callout.part / callout.continued。可以把它用在一章末尾很长的“要点”框上,配合headings.;也可以用在绝不能把图挤出页面的注释样式上。嵌套的框(另一个框里的:::callout)是其父框的一个子块:切口可以落在它之前或之后;只有它自己的样式允许拆分时(keepTogether: false,或比一整栏还高),才会按它自己的splitMinLines在它内部断开。 |
splitMinLines | number | 2 | 拆分框(keepTogether: false,或比一整栏还高的保持完整框)的片段在切口两侧至少各保留几行文字。它只约束文字:只要某一侧有至少一个图、表、独立公式或嵌套框,无论行数多少都可以接受,所以一个全是图片的框可以只在一页上留下一张图。切口落在段落或列表项内部时,仍然计算两侧的全部行数(其中的图或公式计为一行),并且在每一侧至少留下该段落或列表项的layout.行(默认两行;splitMinLines更低时取它,所以设为1就允许留一行)。按默认值,两三行的列表项绝不拆分,四行的只能拆成两行加两行。按默认值,任何框都不会在栏底或下一栏开头留下孤零零的一行文字;没有切口能满足最小值时,框整体移动。(postext 1.5之前,段落内部的切口只检查整个一侧的行数,所以当框里其他行凑够最小值时,两行的列表项可能被拆成一行加一行。) |
repeatTitle | boolean | false | 在拆分框每个接续部分的开头重复标题,后接continuedSuffix(“Key points (cont.)”)。重复的标题采用标题样式。没有标题的框不重复任何内容。见拆分框的标记。 |
continuedSuffix | string | '(cont.)' | 重复标题之后的文字,使用文档语言(locale,否则为断词语言),与拆分表格的做法相同,并像表格那样接在标题后面。 |
continuesMarkerEnabled | boolean | false | 在拆分框每个还要接续的部分的最后一行下方、框内,排出continuesMarker。 |
continuesMarker | string | 'Continued' / 'Continúa' | 该标记的文字(剧本里的“(MORE)”),使用框的正文字体和字号,随文档语言而定。 |
continuesMarkerAlign | 'left' | 'center' | 'right' | 'right' | 标记在框内宽度中的位置。 |
continuesMarkerItalic | boolean | true | 把标记排成斜体。 |
numbering | { label, counter, numberingTemplate, resetOn, counterFormat, placement, bold, italic, suffix } | 未设置 | 把这种样式的框作为编号的命题计数,如定理、引理、定义。见编号的命题与证明。 |
endMark | string | '' | 在框最后一行末尾右对齐排出的记号,就像证明以'∎'或'□'结束:空一格后放得下时排在最后一行上,否则单独占一行。以不带编号的独立公式结束的框,把它作为该公式的标签排出。启用数学公式时,方块(∎ □ ■ ▪ ◻ ▫)用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。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
label | string | — | 编号前面的词:'定理'、'Lemma'、'Definición'。 |
counter | string | false | 样式的id | 框所推进的计数器。指定同一个计数器的样式共用它,如同\newtheorem{lemma}[theorem]:定理1、引理2、定理3。'equation'与带标签的公式一起计数。false只印标签,不印编号(证明的“证明.”)。 |
numberingTemplate / resetOn / counterFormat | string / 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 / italic | boolean | true / false | 段首标签及其后缀的字形,不受框正文的影响:正文为斜体(body.italic)时,直立的标签仍保持直立。括号中的标题以常规字重直立排出。 |
suffix | string | '.' | 排在段首标签及其标题之后。 |
证明就是一个标签不编号、带结束记号的样式:
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文本块。