跳到主要内容

章 6 · 篇 II · 工艺

配置:注释与引用

脚注、行号、交叉引用与引用,目录和书末索引

更新于 2026-10-104分钟enescaptzhjaar

简单来说

本页讲书中指向别处的那些部分的设置。脚注排在页面底部,行号排在页边。交叉引用指向某张图、某一节或某一页,引用指向你提到的文献。目录列出各章,书末的索引列出词条和它们所在的页码。每一节说明这些部分的样子和编号方式。

#脚注

footnotes属性设置以[^id]引用的注释放在哪里、如何编号、外观如何。标记写法见文档格式。

interface FootnotesConfig {
  placement?: 'column' | 'chapterEnd' | 'spread'; // 引用所在栏的栏底、章末,或跨页正文旁。
  numbering?: 'chapter' | 'document' | 'page' | 'column' | 'spread'; // 每章重新开始、连续编号,或每页/每栏/每个跨页重新开始。
  numberFormat?: string;      // decimal、lower-roman、circled-decimal(①)……
  symbols?: string[];         // numberFormat: 'symbols' 所用的注释符号。
  markerPosition?: 'auto' | 'superscript' | 'inline' | 'side' | 'right'; // 上标、排在基线上、排在词旁,或排在竖排行的右侧。
  markerSize?: Dimension;     // 行内、词旁或右侧注码的字号;em指所在正文。
  numberGap?: 'en' | 'em';    // 注文编号之后的空白。
  chapterEndAlign?: 'foot' | 'text';   // chapterEnd:注释排在栏底,或紧接正文之下。
  fontSize?: Dimension;       // 注释字号;em为正文字号。
  lineHeight?: Dimension;     // 注释行距;em为注释字号。
  color?: ColorValue;         // 注释颜色;未设置时为正文颜色。
  textAlign?: TextAlign;      // 未设置时为正文的对齐方式。
  hangingIndent?: Dimension;  // 注释转行的缩进。
  spaceBetween?: Dimension;   // 两条注释之间的间距。
  spaceAbove?: Dimension;     // 正文与分隔线之间的间距;em为正文字号。
  spaceBelowRule?: Dimension; // 分隔线与第一条注释之间的间距。
  separator?: {
    enabled?: boolean;        // 画出分隔线。
    width?: number;           // 分隔线长度,占栏宽的比例。
    lineWidth?: Dimension;    // 分隔线粗细。
    color?: ColorValue;       // 未设置时为注释颜色。
  };
}
属性类型默认值说明
placement'column' | 'chapterEnd' | 'spread''column'(日文竖排书:'chapterEnd')'column'把每条注释排在引用它的那一行所在栏的栏底,上面有一条短分隔线;单栏版面中就是页面底部。'chapterEnd'把一章的所有注释按引用顺序排在该章最后一个块之后。'spread'(傍注,仅用于竖排)把一个跨页两页上引用的注释排在其奇数页(右侧装订的书中的左页)的末尾、分隔线之下:偶数页上引用的注释等待奇数页;某条注释会让奇数页剩下不足一行正文时,它连同其后的注释留在偶数页的下端;在偶数页结束的章把等待中的注释留在那一页。横排时它退回为'column',并给出unknownConfigValue警告。从postext 1.16起提供。
numbering'chapter' | 'document' | 'page' | 'column' | 'spread''chapter'(日文横排书:'page';使用placement: 'spread'时:'spread';栏脚注使用numberFormat: 'symbols'时:'page')'chapter'在每个一级标题下和每个文档开头从1重新编号。'document'在整个文档中连续编号;逐章排版的书中,也从一章延续到下一章(continuationAfter把最后一个编号记为continuation.footnoteNumber带过去)。'page'每页从1重新编号,'column'每栏重新编号,按版面中注文实际所在的位置计数(同一页的各栏按阅读顺序):这就是中文书常见的页下注。文档先排版,再按注文落在的位置编号,然后重新排版,直到编号不再变化(最多再排三次)。二者只适用于栏脚注:placement: 'chapterEnd'时按章编号。'spread'在每个跨页(第2–3页、4–5页……)按引用顺序重新编号,用于placement: 'spread'。
numberFormatstring'decimal'编号的写法,可用编号设置接受的任何写法:'decimal'、'lower-roman'、'lower-alpha'、'circled-decimal'(或'①')、'cjk-decimal'、'一'……正文注码和注文开头的编号都用它。circled-decimal超过50的编号写成阿拉伯数字。名称无法识别时按阿拉伯数字编号,并给出unknownNumberFormat警告。'symbols'(或'*')用参见符号标注,依次取symbols中的符号:* † ‡ § ‖ ¶,用完后成对(** †† ‡‡……)、再三个重复;此时除非设置了numbering,注释每页重新计数。postext 1.19 起。
symbolsstring[]['*', '†', '‡', '§', '‖', '¶']numberFormat: 'symbols'所用的符号序列,用完后成对、再三个重复。Google Fonts 与 Fontsource 的拉丁文件含有 * † § ¶(剑号在latin-ext中),但没有 ‡ 和 ‖,PDF 会以该字体的.notdef字形绘制,并给出missingGlyph警告:使用这类字体时,请去掉这两个符号(['*', '†', '§', '¶']),或用含有它们的字体排注文。空字符串会被忽略,空列表保留默认序列。postext 1.19 起。
markerPosition'auto' | 'superscript' | 'inline' | 'side' | 'right''auto''superscript'把正文注码和注文开头的编号缩小并升高,排成上标。'inline'把它们排在基线上:注码用markerSize,注文编号与注文同大;竖排时,行内带圈注码在自己的格子里直立。'right'把缩小的注码排在竖排行的右侧并与之对齐,日文竖排书的(1)就是这样排的;横排时为上标。'side'(合印)把小号注码排在被注词旁边、其注音一侧,结束于该词最后一个字结束的地方;它不占行内空间,行的断行和两端对齐都当它不存在;行间空隙容不下它时报为rubyExceedsLeading。'auto'在circled-decimal时为行内,日文竖排书中为'right',其他情况为上标。无论哪种,注码都随前一个字符,不会出现在行首。
markerSizeDimension1em;'side'为0.6em,'right'为0.7em行内、词旁或右侧注码的字号;em指所在正文的字号(常见的缩小值为0.75em)。对上标注码无效。
numberGap'en' | 'em''en'(日文章末注:'em')注文开头的编号之后的空白:半个字宽的空格,或一个注文字号的整字宽(编号或注文含CJK文字时为全角空格),从不伸缩,也不在此断行。从postext 1.16起提供。
markerTemplatestring'{n}'(日文竖排书:'({n})')注释编号的写法,{n}代表按编号格式和文档数字写出的编号:'({n})'得到阿拉伯文书籍的带括号注码「(١)」。正文注码和注文开头的编号都按它写。不含{n}的模板按默认值处理。
noteNumberPosition'auto' | 'superscript' | 'inline''auto'注文开头编号的位置:上标,或以注文字号排在行内。'auto'跟随markerPosition。阿拉伯文书籍把正文注码排成上标,注文自己的编号排在行内。
chapterEndAlign'foot' | 'text''foot'与placement: 'chapterEnd'配合使用:'foot'把收尾一栏的注释排在栏底,剩余的空行留在正文和注释之间,与栏底注释的位置一样。'text'把它们紧接正文排。
fontSizeDimension0.8em注释文字的字号。em和rem指正文字号。注释使用正文的字体和字重。
lineHeightDimension1.25em注释文字的行距;em指注释字号。注释不在基线网格上:它们从栏底向上堆叠,上面的正文保持在网格上。
colorColorValue正文颜色注释文字的颜色。
textAlignTextAlign正文的对齐方式注释文字的对齐方式。
hangingIndentDimension0注释第二行及以后各行的缩进,使它们对齐到编号之后。
spaceBetweenDimension0两条注释之间的间距。
spaceAboveDimension0.5em最后一行正文与分隔线之间的间距;em指正文字号。使用'chapterEnd'和chapterEndAlign: 'text'时,spaceAbove + spaceBelowRule就是正文与第一条注释之间的间距。
spaceBelowRuleDimension0.4em分隔线与第一条注释之间的间距。
separator.enabledbooleantrue在每栏的注释上方画分隔线。设为false时,上方的间距保留。
separator.widthnumber0.3分隔线长度,占栏宽的比例(0–1),从栏的左边缘起算。
separator.lineWidthDimension0.5pt分隔线的粗细。
separator.colorColorValue注释颜色分隔线的颜色。
footnotes: {
  fontSize: { value: 7.5, unit: 'pt' },
  lineHeight: { value: 9.5, unit: 'pt' },
  hangingIndent: { value: 0.8, unit: 'em' },
  separator: { width: 0.25, lineWidth: { value: 0.4, unit: 'pt' } },
}

日文书。 日文文档(locale: 'ja',从postext 1.16起)为未设置的字段取JLReq §4.2的值。竖排书把注释排在章末(placement: 'chapterEnd',後注),按章编号,注码({n})排在行的右侧(markerPosition: 'right',数字按cjk.uprightDigits直立);横排书把注释排在页面下端,按页编号,注码为上标。两者的分隔线都是行长的三分之一(separator.width: 1/3),章末注取numberGap: 'em'和两个字的悬挂缩进。明确设置的值优先,并在保存时保留(stripFootnotesDefaults与文档自己的默认值比较);中文、阿拉伯文和拉丁文文档的解析结果与过去相同。footnoteDocumentDefaults(locale, writingMode, placement?)返回这些值。把注码写在句末的。之前(先生[^1]。):它跟随前一个字符,而。从不出现在行首。见日文排版 › 注释。

栏底注释的排版方式:

  • 注释与引用同栏。放置一行之前,版面会加上这一行首次引用的注释的高度(如果是该栏的第一条注释,还要加上分隔线)。一行的注释在它下面排不下时,这一行连同段落的其余部分移到下一栏,并遵守段首孤行和段末孤行规则。栏的文字区域缩小注释所占的高度,所以各栏齐底和章末收尾区域只计算正文。
  • 多条注释在同一栏中按引用顺序堆叠在一条分隔线下。后面再次引用的注释保持原编号,不再重复排出。
  • 底部浮动体。注释排好之后才占据栏底的图,放在注释上方;图之后排的注释放在图的上方。
  • 框。在标注框(行内、浮动或固定)中引用的注释,放在框后正文继续的那一栏的栏底,通常就是同一栏。收尾整个文档的框,把它的注释留在正文结束那一栏的栏底。
  • 限制。注释从不拆分:比一栏还高的注释会溢出。题注、表格单元格和标题中的标记不会被识别(按原样打印)。
  • 输出。Canvas、HTML和PDF都会绘制注释、标记(上标数字)和分隔线。在PDF中,每个标记链接到对应的注释;带标签的PDF把每条注释设为Note元素,带有唯一的/ID,列在结构树的/IDTree中(PDF/UA-1)。注释是设置了footnoteNote的VDTBlock,位于page.floats中;分隔线位于page.footnoteAreas中。
  • 警告。undefinedFootnote(标记没有定义:编号印在一条空注释上)和unusedFootnote(没有标记引用的定义:不会排出)。

解析函数和精简函数与其他部分一致:

import { DEFAULT_FOOTNOTES_CONFIG, resolveFootnotesConfig, stripFootnotesDefaults, footnoteDocumentDefaults } from 'postext';
 
resolveFootnotesConfig(config.footnotes, 'ja', 'vertical-rl'); // 未设置的字段取日文竖排的默认值

#行号

lineNumbers属性在页边、紧挨着行的位置印出每第五行(或每第N行)的行号,校勘本、诗选、法律文本和教学版本都这样做。它数:::verse诗的诗行,或正文的所有行。默认关闭。每个行号都画在所属行的基线上,用自己的字号,从不移动任何一行:页面的排版与没有行号时完全相同。自postext 1.23起。

interface LineNumbersConfig {
  enabled?: boolean;        // 默认关闭。
  count?: 'verse' | 'all';  // 诗的诗行,或正文的所有行。
  interval?: number;        // 印出N的倍数。
  numberFirst?: boolean;    // 每次重新计数后的第一行也印出行号。
  restart?: 'document' | 'chapter' | 'section' | 'page' | 'poem'; // 在哪里重新计数。
  startAt?: number;         // 重新计数后第一行的行号。
  position?: 'outer' | 'inner' | 'left' | 'right' | 'start' | 'end' | 'side';
  multiColumn?: 'each' | 'gutter' | 'outer-edges'; // 两栏或多栏的页面。
  gap?: Dimension;          // 从正文到行号的距离;em为行号的字号。
  align?: 'auto' | 'left' | 'right';
  fontFamily?: string;      // 未设置时用正文字体家族。
  fontSize?: Dimension;     // em为正文字号。
  fontWeight?: number;      // 未设置时用正文字重。
  italic?: boolean;
  color?: ColorValue;       // 未设置时用正文颜色。
  format?: string;          // decimal、lower-roman、arabic-indic、一…
}
属性类型默认值说明
enabledbooleanfalse印出行号。竖排文档(layout.writingMode: 'vertical-rl')不标行号,在其中设为true会报告lineNumbersUnsupported。
count'verse' | 'all''verse''verse'数:::verse诗的诗行,每个诗行数一次:比版心宽的诗行转到下一行的部分不编号,诗节之间的空白也不计数。按古典阿拉伯排法排的诗每联数一行;错开排的联,其第二行不计数。'all'按阅读顺序数正文段落、列表项、引文和诗的每一行:逐页、逐栏、从上到下。
intervalnumber5印出行号为该数倍数的行(5、10、15…)。第一行为37的诗印出40、45…。诗的开始标记可以设定自己的间隔(interval=N)。
numberFirstbooleanfalse每次重新计数后,第一个计入的行也印出行号。
restart'document' | 'chapter' | 'section' | 'page' | 'poem'count: 'verse'时为'poem',count: 'all'时为'page'在哪里重新计数:从不('document',贯穿一本书的各章),每个一级标题处('chapter'),每个一级或二级标题处('section'),每一页('page'),或每首:::verse诗('poem')。诗的lineStart=N和:::numbering指令的lines=N可以在任何位置重新计数,不论哪种模式。
startAtnumber1重新计数后第一行的行号。
position'outer' | 'inner' | 'left' | 'right' | 'start' | 'end' | 'side''outer'行号所在的一侧。'outer'是远离书脊的一侧:奇数页的右边、偶数页的左边,右侧装订的书则相反。'inner'是书脊一侧。'left'和'right'在每一页都一样。'start'和'end'跟随文档的方向:在从右到左的书中,'start'是右边。'side'把行号放进'oneAndHalf'版式(layout.sideColumnRole: 'floats')的侧栏,贴齐侧栏靠正文的一边(不使用gap);没有侧栏的页面上退回'outer'。
multiColumn'each' | 'gutter' | 'outer-edges''outer-edges'并排有两栏或更多正文栏的页面。'outer-edges'把第一栏的行号放在其左边,最后一栏的放在其右边;中间各栏按'each'处理。'gutter'把行号放在栏间:第一栏的在其右边,其余各栏的在其左边。'each'把每一栏的行号都放在position指定的一侧。
gapDimension1em从栏边到行号的距离;em为行号自身的字号。
align'auto' | 'left' | 'right''auto''auto'让每个行号靠向正文:在左边页边中右对齐,在右边页边中左对齐。'left'和'right'在本页最宽行号的宽度内对齐。
fontFamilystring正文字体家族行号的字体。与其他字体家族一样加载和嵌入。
fontSizeDimension0.8em行号的字号;em为正文字号。
fontWeightnumber正文字重行号的字重。
italicbooleanfalse用斜体排行号。
colorColorValue正文颜色行号的颜色。链接到调色板的颜色会跟随篇和章节的调色板。
formatstring十进制行号的写法,可用任何一种编号格式写法('lower-roman'、'arabic-indic'、'一'…)。十进制行号用文档的数字(numerals)书写。未知的名称按十进制编号,并给出unknownNumberFormat警告。
lineNumbers: {
  enabled: true,
  count: 'verse',
  interval: 5,
  restart: 'document',          // 整本书连续计数
  position: 'outer',
  fontSize: { value: 0.75, unit: 'em' },
  italic: true,
}

哪些行计数,哪些不计:

  • 从不计数:标题、题注、表格和图片、独立公式、版面设计文字(章首、页眉)、脚注和章末注、目录、索引和参考文献的条目,以及空白页。
  • 标注框和散文。 标注框中的文字不计数;count: 'verse'时散文也不计数,除非排它所用的段落样式写了lineNumbers: true;设了lineNumbers: false的样式从不计数(见段落样式)。
  • 单首诗。 诗的开始标记可以写numbered=false(它的诗行不计数)、lineStart=N(它的第一行为N,并从这里重新计数)和interval=N。:::numbering{lines=N}让下一个计入的行编为N,不论它在哪里。见文档格式 › :::verse和:::numbering。

逐章排版的书中,restart: 'document'通过continuation.lineNumber把计数从一章带到下一章。continuationAfter根据文本数诗行;count: 'all'时计数取决于排版结果,所以宿主程序要传入上一章文档的lastLineNumber,沙盒就是这样做的。

position: 'side'时,行号与侧栏中的框、题注和图共用侧栏。与其中之一重叠的行号照样画出,两者都不移动,排版会给出指向该编号行的内容警告lineNumberOverlap。

输出。 Canvas、PDF、HTML查看器和固定版式EPUB都会画出行号。在带标签的PDF中,行号是版面artifact,每个都带一个空的/ActualText,所以复制或提取出的文字从一行接到下一行,不含行号。HTML输出对辅助技术(aria-hidden)、选择和复制的文字都隐藏行号。流式EPUB的行由阅读系统排,只保留诗行的行号:在诗节起始一侧的页边放一个pt-line-number span(同样aria-hidden),紧挨着印刷版中带行号的每个诗行。在VDT中,行号是每页的一个设计槽位(page.lineNumbers,其中的文字块标记为artifact)和一张标记列表(page.lineNumberMarks:number、label、columnIndex、blockId、lineIndex);文档记录lastLineNumber。

不支持:竖排文字中的行号、印出某一行行号的交叉引用、按行号自动对应的注释,以及表格单元格、题注或代码清单各行的行号。

在沙盒中,这些设置是版面设计面板中的行号一节。解析函数和精简函数与其他部分一致;字体、字重和颜色取自正文:

import { DEFAULT_LINE_NUMBERS_CONFIG, resolveLineNumbersConfig, stripLineNumbersDefaults } from 'postext';
 
resolveLineNumbersConfig(config.lineNumbers, resolvedBodyText); // 未设置的字体、字重和颜色跟随正文

#交叉引用

crossRefs属性设定交叉引用在编号或页码前后印出的文字,以及未设style的:ref采用的样式。每个模板用{n}表示编号的位置;没有{n}的模板,编号放在文字之后,中间用不换行空格("§"印为*§ 3.2*)。未设定的模板随文档语言:中文为第{n}章 / 第{n}节 / 第{n}页,英文为chapter / section / p.,西班牙文为capítulo / sección / pág.,法文、德文、意大利文、葡萄牙文、加泰罗尼亚文和荷兰文亦各有默认文字。

interface CrossRefsConfig {
  chapter?: string;  // Words around a level-1 heading's number: "chapter {n}".
  section?: string;  // Around any other heading's number: "section {n}".
  page?: string;     // Around a page number: "p. {n}".
  defaultStyle?: 'default' | 'number' | 'title' | 'page'; // A :ref without style=.
}
属性类型默认值说明
chapterstring随语言指向一级标题的引用:"第{n}章"。编号模板已含文字的标题(第{1:一}章、Chapter {1})照原样印出。
sectionstring随语言指向二至六级标题的引用:"第{n}节"、"§ {n}"。
pagestring随语言页码引用(style=page):"第{n}页"、"p. {n}"。
defaultStyle'default' | 'number' | 'title' | 'page''default'指向标题或锚点、未设style=的:ref印出的内容。'default':有编号的标题印名称和编号,无编号的印标题,锚点印其文字。已设style的引用保持不变,指向图表的引用不受影响。

引用的颜色、粗细和斜体与所有引用相同(bodyText.referenceColor、referenceBold、referenceItalic)。

#引用

citations属性选择引用样式,并决定引用和参考文献表的外观。标记语法见引用与参考文献;样式由postext-citeproc包执行。

interface CitationsConfig {
  style?: string;          // 'apa', 'ieee', 'chicago-notes-bibliography'… or 'custom'
  customStyle?: string;    // a whole CSL style (.csl XML), used with style: 'custom'
  locale?: string;         // CSL locale; the document language when unset
  link?: boolean;          // citations link to their entries
  marker?: 'style' | 'brackets' | 'parentheses' | 'superscript' | 'corner';
  collapseRanges?: boolean;
  notes?: 'footnote' | 'warichu';
  numbering?: 'book' | 'chapter';
  bibliography?: {
    title?: string;        // unset: the document language's word; '' or ' ': none
    scope?: 'book' | 'chapter';
    auto?: boolean;
    fontSize?: Dimension;
    lineHeight?: Dimension;
    hangingIndent?: Dimension;
    entrySpacing?: Dimension;
    labelWidth?: Dimension;
    labelAlign?: 'left' | 'right';
    doi?: 'link' | 'text' | 'hide';
    includeUncited?: boolean;
    groupByLanguage?: boolean;
  };
}
属性类型默认值说明
stylestring'apa'内置样式的id(见样式)或'custom'。样式决定引用和条目的内容:姓名、日期、顺序、标点,以及引用是否为注释。
customStylestring—完整的CSL样式(.csl文件的XML),在style为'custom'时使用。Sandbox可从文件加载。
localestring文档语言样式用词的CSL语言环境(zh-CN、zh-TW、ja-JP、en-US等)。日文文档按ja-JP处理:叙述式引用用と连接两位作者,更多作者缩写为ほか。
linkbooleantrue引用链接到参考文献表中的条目(PDF链接、HTML锚点、Sandbox点击)。
marker'style' | 'brackets' | 'parentheses' | 'superscript' | 'corner''style'顺序编码样式的引用标记:按样式、[1]、(1)、上标,或〔1〕(竖排中直立)。位置写在编号之后。
collapseRangesbooleantrue连续编号合并为范围:自定标记写作1–3,IEEE自身的标记写作[2]–[4]。设为false则逐个列出。
notes'footnote' | 'warichu''footnote'注释体样式放置引用的方式:脚注(按footnotes设置)或行内双行夹注。
numbering'book' | 'chapter''book'引用在全书连续处理,或每章单独处理(每个文档,以及引用之后的每个一级标题):顺序编码制每章从 1 编号,两章都引用的文献在各章取各自的编号;注释样式在每章第一次引用时写出完整著录。与bibliography.scope: 'chapter'配合使用,章内列表随之采用本章的编号。
bibliography.titlestring随语言列表上方的标题(粗体段落)。留空则不印。自定义的标题写在:::bibliography之上。
bibliography.scope'book' | 'chapter''book'全书一份列表,或每章一份,只列该章引用的文献。一个文档含多章时,每个H1开始新的一章列表;开启auto时,没有放:::bibliography的章在章末得到自己的列表。
bibliography.autobooleantrue没有:::bibliography时,把列表放在正文之后(全书列表放在最后一章之后)。
bibliography.fontSizeDimension0.9em条目字号;em为正文字号。
bibliography.lineHeightDimension正文行距条目行距。
bibliography.hangingIndentDimension2em无编号条目续行的缩进。
bibliography.entrySpacingDimension0.3em条目之间的间距。
bibliography.labelWidthDimension最长编号编号列表中编号栏的宽度:每条文献的正文首行与转行都从这里开始,9. 与 10. 共用同一栏。编号仍是条目文本的一部分。
bibliography.labelAlign'left' | 'right''left'编号在栏内的位置:靠栏的左边,或靠正文(9. 与 10. 末端对齐)。
bibliography.doi'link' | 'text' | 'hide''link'DOI和网址作为链接、作为文字或不显示。
bibliography.includeUncitedbooleanfalse列出全部参考文献,无论是否被引用(相当于nocite: "@*")。
bibliography.groupByLanguagebooleanfalse中、日、韩文文献在前,其他在后。仅用于著者-出版年和著者-页码体系:顺序编码的列表保持编号顺序。

#目录

toc属性配置:::toc指令印出的内容(参见文档格式)。目录由文档的大纲汇编而成,大纲包含每个标题及其编号和页码标签,以及每个:::part,所以目录会跟着各章变化:给某章改名、把它移到另一篇、修改它的作者,条目都会随之改变。一个条目依次是:单独一栏的标题编号、标题、前导符、右边缘的页码标签,然后是可选的副标题行;篇则是由parts.design设计的一行。

const config: PostextConfig = {
  toc: {
    levels: [{ level: 1, fontWeight: 700, color: { hex: '#00507b', model: 'hex' }, numberWidth: { value: 7.4, unit: 'mm' } }],
    unnumbered: { color: { hex: '#000000', model: 'hex' } },
    pageNumber: { fontWeight: 400, width: { value: 8, unit: 'mm' } },
    leader: { char: '.', gap: { value: 1, unit: 'mm' } },
    subtitle: { enabled: true, attr: 'author', italic: true, fontSize: { value: 8.5, unit: 'pt' } },
    parts: {
      height: { value: 23, unit: 'pt' },
      marginTop: { value: 11.5, unit: 'pt' },
      design: { elements: [/* 一个色带框、'SECTION {number}'、'{titleText}'、'{pageNumber}' */] },
    },
  },
};
属性类型默认值说明
levelsTocLevelConfig[]一级列出的标题级别,每级带有条目的字体样式:fontFamily、fontSize、lineHeight(默认为正文行距,使目录落在网格上)、fontWeight、italic、color、indent(整个条目的缩进)、numberWidth / numberGap(编号栏的宽度和间隔,标题从编号栏之后开始;编号在栏内右对齐;某个编号比numberWidth宽时,如الفصل الحادي عشر或第十二章,该级的编号栏加宽到最宽的编号)、numberFontFamily、numberFontSize、numberFontWeight、numberColor、marginTop、marginBottom。未设置的字段继承正文。无论编号用什么字体和字号,它都落在标题第一行的基线上,Canvas、HTML和PDF中都是如此(postext 1.4及以前,编号像列表项目符号那样以x字高居中,所以展示字体或较大的字号会浮在标题上方)。自己编写的渲染器可以从条目块的bulletBaselineY取得这条基线;bulletY仍是编号em框的中点,与1.4相同,所以早于这个新字段的渲染器会把编号画在一直以来的位置。
unnumberedTocEntryStyleConfig—针对样式为numbered: false的标题(如序言)的覆盖:它们不印编号,从该级别的indent处齐头开始。
pageNumberobject一级条目的字体,正文字重页码标签的fontFamily、fontSize、fontWeight、italic、color,以及width(默认2em):右边缘为它预留的栏宽,页码在栏内右对齐。
leaderobjectchar在标题和页码之间的空当里重复排出,并且右对齐,使相邻条目的点对齐('. '会把点拉开);gap是标题和前导符之间至少保留的距离。前导符排入能放下的全部字符,按它所用字体把整串字符作为一个整体来测量,所以如果某种字体会把相邻句点的字偶距拉开,得到的是更少的点,而不是一直顶到页码的点。(postext 1.4及以前按单个点计数,在这类字体中前导符会从标题一直延伸进页码。)标题长到不给页码标签留位置时,会稍早一点换行。前导符至少排三个字符:只放得下一两个时,这一行不排前导符,因为页码前孤零零的一个点读起来像句号。在带标签的PDF中,这些点是版式工件,不出现在提取的文字中。正文在其制表位处排出同样的前导符。
subtitleobject条目下的第二行,取自标题属性(attr),比如章的作者,有自己的fontFamily、fontSize、fontWeight、italic(默认true)、color和额外的indent。这一行使用条目的行距,从不与标题分开。
parts.enabledbooleantrue篇隔页是否在目录中占一行。
parts.breakBeforebooleanfalse除第一篇外,每个篇行之前另起新页,使每一篇的各章单独列在一页上。
parts.designDesignSlot空篇行的设计;它的容器就是这一行(栏宽 × height)。占位符有、、…、和(篇隔页的页码标签;使用parts.page: false时不开篇隔页,取篇的内容开始的那一页,即书眉切换到这一篇的那一页;在逐章排版的书中,结束一章的篇容器指向下一章的第一张内容页)。链接到调色板的颜色采用篇自己的palette,所以每个部分的行都用各自的颜色。为空时,以一级条目的字体样式排出(中间是一级标题的numberSeparator)和页码。
parts.height、marginTop、marginBottomDimension2em、0、0行高及其上下的空白。em是正文字号,所以默认行高是正文字号的两倍,而不是两行正文:正文为9.5/13.5 pt时它是19 pt。要让一行占两行正文,就用pt给出高度(这里是27pt)。

页码标签就是文档实际印出的那些。buildDocument()会用上一遍的标签重新排版带:::toc的文档,直到标签稳定(最多额外三遍);逐章排版整本书的宿主程序则改为以PostextContent.outline提供全书大纲,大纲由contentOutline()(只从文字得出的标题和篇)和outlineFromDoc()(同样的条目,带上某次排版的页码标签)汇编而成,每当该大纲的outlineKey()变化时就重新排版目录所在的章。每个标题条目都带有目录印出的number;编号标题还带有counter,即该级别在任何startAt之后的累计数,与模板印出什么无关,宿主程序在自己的列表中标在章旁的就是它。

#索引

index属性配置:::index指令印出的内容(参见文档格式):正文中用:index[…]和:index{term="…"}标记的词条,经过排序,按首字母分组(中文按拼音首字母或笔画数分组,日文按五十音行分组,参见groupBy),每条附上它所在的页码。一个条目由词条、分隔符和页码组成;其下的子条目逐级缩进一步,折行按turnoverIndent悬挂缩进,因此不会与子条目对齐。

const config: PostextConfig = {
  headingStyles: [
    // 索引排成两栏,放在它自己的标题下。
    { id: 'index', numbered: false, layout: { layoutType: 'double', gutterWidth: { value: 6, unit: 'mm' } } },
  ],
  index: {
    fontSize: { value: 8.5, unit: 'pt' },
    lineHeight: { value: 11, unit: 'pt' },
    rangeFormat: 'chicago',
    groups: { fontFamily: 'Source Sans 3', fontWeight: 700, color: { hex: '#8a1c1c', model: 'hex' } },
  },
};
属性类型默认值说明
fontFamily、fontSize、lineHeight、fontWeight、color—正文的设置条目的字体样式。索引的每一行(包括字母标题)都按lineHeight排;索引保持自己的节奏,不对齐基线网格。
indentDimension1em每一级子条目的缩进。
turnoverIndentDimension2em条目折行在其所在级别之外的额外缩进。
entrySpacingDimension0每个主条目上方的空白。
separator、locatorSeparator、rangeSeparatorstring', '、', '、'–';阿拉伯文字中前两项为'، '分别印在词条与第一个页码之间、两个页码之间,以及页码范围两端之间的内容。
mergeRangesbooleantrue把同一编号格式的连续页码合并成范围:12, 13, 14印作12–14。主要页码从不合并。
rangeFormat'full' | 'chicago''full'页码范围中第二个数字的写法:写全(234–237),或按The Chicago Manual of Style(9.64)的要求省去与第一个数字相同的位:71–72、100–104、101–8、321–28、1496–500。罗马数字标签总是写全。
main粗体主要页码(标记上带main)的排法。
see按语言,斜体(阿拉伯文字为正体)参见项前面的引导词。未设置时随文档语言而定:See / See also、Véase / Véase también、Voir / Voir aussi、见 / 另见(繁体中文为見 / 另見)等。中文索引把参见项放在句号之后,不加空格:贾琏 12。见贾政。
localestring文档的语言按哪种语言的字母顺序给条目排序(BCP 47标签,由Intl.Collator读取)。在西班牙语中,ñ排在n之后,并单独成组;重音符号从不影响顺序。
groupBy'auto' | 'letter' | 'pinyin' | 'stroke' | 'gojuon' | 'kana' | 'none''auto'组标题是什么。'letter':排序键的首字母。'pinyin':以汉字开头的条目归入其拼音读音的拉丁首字母之下(贾宝玉归入J),拉丁字母的排序键归入其字母,排在该字母的中文条目之后(排序器把拉丁字母排在汉字之后):sort="jia mu"排在J组末尾。'stroke':按第一个字的笔画数分组,一畫、二畫…(简体中文为一画…)。'gojuon':假名条目归入其五十音行,あ行、か行 … わ行;'kana'则归入其首个假名(片假名与平假名共用组标题);两者都按日文索引的JIS X 4061顺序排序:依据读音(标记的yomi,否则用其注音的假名读音,否则用sort,否则用文字本身),片假名按平假名排,小假名按大假名排,ー按它前面的元音排,清音在浊音前,浊音在半浊音前;符号在最前,然后是按数值排序的数字,然后是按字母分组的拉丁词,最后是假名;仍以汉字开头的条目报为indexReadingMissing,排在假名之后,不归入任何组。'none':不设组标题;符号、数字和词语之间只用groups.marginTop隔开。'auto'让日文索引(ja、ja-*)按五十音行分组,简体中文索引(zh、zh-Hans、zh-CN)按拼音分组,繁体中文索引(zh-Hant、zh-TW、zh-HK)按笔画分组,其他语言按字母分组。条目按组标题所依据的排序规则排序:按拼音分组的zh-Hant索引按拼音排序。读音和笔画数来自排序器(CLDR);遇到它读错的字(把重阳的重读作zhòng,把行业的行读作xíng),就给标记一个sort键,用只有你想要的读音的字来写,它会排在正确的位置:重阳用sort="崇阳",行业用sort="航业"。没有中文排序数据的浏览器排出的拼音或笔画索引不带组标题。
ignoreArticleboolean阿拉伯文为true阿拉伯文词条排序和分组时视同没有开头的冠词ال(ٱل):البصرة归入ب,排在بدر和بغداد之间,印出时保持原样。الله保留冠词;自带sort键的词条按该键原样排序。无论此项如何,阿拉伯文索引都忽略元音符号和延长符(tatweel),把أ إ آ ٱ归入ا,并把ؤ按و、ئ和ى按ي、ة按ه排序。
groups.enabledbooleantrue在每组条目上方印一个组标题(A、B…或笔画数,数字为0–9,其余为Symbols;中文为数字 / 數字和符号 / 符號)。
groups.fontFamily、fontSize、fontWeight、italic、color—条目的设置,字重700字母标题的字体。它按条目的行距排。
groups.marginTopDimension索引的一行每组上方的空白,不论有没有组标题;第一组上方没有(它与标题的距离由标题决定),栏顶也没有。
groups.symbolsLabel、numbersLabelstring按语言;'0–9',中文为'数字' / '數字'以符号开头和以数字开头的条目的组标题。

页码与目录一样来自全书大纲:computeOutline()和contentOutline()把一段文字中的索引标记列为'indexMark'类型的条目(带有indexMark.path、sort、see、seeAlso、main、range和index),outlineFromDoc()给每个条目加上它落在的页,这些页由排版过程记录在doc.indexMarks中(每个标记一个{ sourceStart, pageIndex })。buildDocument()会重新排版印出自身索引的文档,直到页码稳定;逐章排版整本书的宿主程序把全书大纲作为PostextContent.outline交给包含:::index的章。tocOutline()和indexOutline()把大纲拆成目录和索引各自读取的部分,宿主程序可以据此给每一章设定与其印出内容相应的键:沙盒只在某个标记移动时重新排版索引章,只在某个标题移动时重新排版目录章。contentOutline()还会说明一段文字是否印出索引(hasIndex)。