# 沙盒：模板页

> 在页面上直接编辑页面模板和框，框样式库，所有版本中模板页的检查，把文字移到 Markdown，以及一键修正一个框

- HTML版本: https://postext.dev/zh/docs/sandbox-composed-pages
- 最后更新: 2026-10-17
- 阅读时间: 9分钟
- 其他语言: [en](https://postext.dev/en/docs/sandbox-composed-pages.md), [es](https://postext.dev/es/docs/sandbox-composed-pages.md), [ca](https://postext.dev/ca/docs/sandbox-composed-pages.md), [de](https://postext.dev/de/docs/sandbox-composed-pages.md), [fr](https://postext.dev/fr/docs/sandbox-composed-pages.md), [it](https://postext.dev/it/docs/sandbox-composed-pages.md), [pt](https://postext.dev/pt/docs/sandbox-composed-pages.md), [ja](https://postext.dev/ja/docs/sandbox-composed-pages.md), [ar](https://postext.dev/ar/docs/sandbox-composed-pages.md)

## 简单来说

本页汇集沙盒为模板页提供的功能。模板页的文字灌进由页面模板排好的框里。模板里的框可以直接在页面上画出和移动，框样式则收在一个样式库里。检查面板会告诉你，书的每种语言里哪些模板页的文字放不下，并给出一键修正一个框的按钮。在有模板页之前做的书，可以一次把各页的文字移进 Markdown。

本页汇集版面设计面板和检查面板中与模板页有关的部分（用 `::::page` 写成的页，内容灌入页面模板的框里）。两个面板的其余部分见[沙盒：版面设计面板与检查面板](https://postext.dev/zh/docs/sandbox-design-checks.md)，模板页怎么写见[模板页](https://postext.dev/zh/docs/composed-pages.md)。

## 页面模板

**版面设计 › 页面与分栏 › 页面模板**用来编辑 `pageTemplates`，即组合页面（`::::page{template="…"}`）把内容灌入的版式，无须打开配置文件。

- **列表**列出每个模板：框的示意图、id、书中使用它的页数（跨页算两页），以及它所**基于**的模板。**新建**创建一个带有一个框的模板，该框接收页面上未指定插槽的正文；**复制**复制当前打开的模板；**将版面存为模板**把所选的组合页面（或第一个已排出的组合页面）变成新模板：各个框留在实际排出的位置，尺寸以毫米固定，样式和其他字段照旧保留。
- **编辑范围**决定字段改动作用于何处：*所有页面*（模板本身）、*奇数页（右页）*或*偶数页（左页）*（`variants.recto`、`variants.verso`）。该范围未设置的字段以淡色显示继承来的值，重置按钮可把它恢复为继承值。**跨页**模板及其**订口**按两页合成的一整张绘制，并标出书脊条带；跨页模板没有奇偶页变体。从右向左排和竖排的书里，页面按自己的排版流读取版面：跨页的第一页是右页，对页的区域和书脊带画在引擎排出它们的那一侧（postext 1.40起）。
- **模板**：id（重命名时，书中所有引用它的页面块会一并改写）、名称、**基于**（`extends`）、跨页开关、**框的度量基准**（`area`）、**追加页使用**（`overflowTemplate`：框的内容接续到的追加页所用的模板，见[文字续排时](https://postext.dev/zh/docs/composed-pages.md#文字续排时)）、网格，以及**删除模板**（会说明有多少页引用它；基于它的模板保留已继承的内容）。
- **框**：每个框一个按钮、**添加框**，以及所选框的属性：名称（插槽）和**可以留空**；位置（锚定到模板区域、成品页面、出血范围或另一个框、分组，并设边位和偏移）或网格单元；宽度和高度（*固定*、*区域比例*、*随内容*、*延伸到边缘*）及其上下限；框样式、图层、旋转、内容位置、栏数、各边内边距；**接收页面上的自由正文**（`flow`）、**接收第一个标题**（`takes`）、**放不下的文字接续到**（`next`）、**其他框的文字绕排**（`exclude: "push"`），开启后还有**推开方式**：*外框*或*沿轮廓*（`wrap`，按框内图片的形状）；适配（`fit`）；分组中的伸展、收缩、优先级和固定；续排（`overflow.continueIn`、`overflow.mark`、`overflow.fromMark`）：**放不下的内容转到** 可选不续排、下一页、另一个框、另一个模板，以及书中每个带 `id` 的页面围栏（`page:<id>`）；*按 id 指定后面的页面…* 可输入 `{attr.sigue}` 或 `p47#resto` 这样的值。每个字段都有说明和重置按钮。
- **分组**：名称、上下堆叠或横排一行、框间距、多余空间的去处，以及按页面顺序排列的组内框。有**自身的框**的分组会分配多余空间，组内的框也会在其中让出空间；没有它，分组就是各框之框的合集。
- **书眉与页脚**（*沿用全书*、*隐藏*、*单独设计*）和**装饰**，编辑方式与全书的书眉页脚相同；装饰中的文字可读取页面属性（`{attr.名称}`）。

**在页面上：设计模式。** 把预览上方的开关切到**版面设计**（或在本节打开**在页面上编辑框**），组合页面会显示版心边距、网格、跨页的订口，以及每条串接的箭头。点按一个框即选中它并打开其属性；拖动可移动；所选框的八个控制点可改变大小；在空白处拖动可绘制新框。框会吸附到版心边距、网格以及其他框的边和中线（按住 Alt 可自由放置；按 Esc 取消拖动）。框的位置以毫米写回：锚定在另一个框上的框保留锚点，只改偏移。若还有其他页面使用该模板，页面会询问修改保存到哪里：**修改模板**（并显示页数），或**只改此页**——为这一页新建一个基于原模板的模板，并让该页的页面块改为引用它。旋转后的框可在页面上移动，大小在字段中设置。拖动能做的一切，都可以通过字段用键盘完成。

## 框样式库

**版面设计 › 标注框 › 框样式库**把标注框样式（`calloutStyles`）当作一个样式库来展示。页面模板里的框用的也是这些样式（`frames[].style`），所以同一种样式既可以给正文里的`:::callout`标注框用，也可以给模板页上的框用。

- **每种样式**都由引擎配一段示例文字画出来；样式带标签时，还会画出一个示例标签。画法与框使用它时相同：宽80毫米（内边距让版心不足40毫米时会更宽），放在正文流中，不带标注框样式可能给框指定的固定位置。基于另一种样式（`extends`）的样式，会带着从基础样式继承来的外观画出，与页面上的画法一致（postext 1.40起）。名称下方写着书中用到它的地方：模板框、用这些模板排的模板页，以及正文里的标注框。展开后列出每个框（**打开**跳到“页面模板”中的该框）和每一章及其中的标注框（**查看**在“文本”面板中选中下一个标记；没有写`type`的标记算作第一种样式，引擎就是这样给它分配样式的），**编辑样式**会在原处打开标注框样式编辑器。**显示**用来筛选列表：*模板中*（只要有模板用到样式，默认显示这一项）、*正文中*、*未使用*、*全部*。
- **合并建议**把几乎相同的样式归到使用最多的那一种名下：“这 3 种样式只在内边距上不同，要合并吗？”。比较的是引擎解析后的样式，逐项比较，不计id和名称。长度相差不到0.5毫米、颜色相差不到ΔE 2视为相同，内边距的四条边算作一项，**允许不同的设置项**（默认2）决定最多可以有几项不同。
- 正文中`:::callout`标注框的位置（放置方式、固定位置、跨栏宽度、上下间距）必须一致，否则合并会让框移位。打开**只比较外观**就不再比较位置，查看时会说明有多少个框会移动；关闭时，本节会说明打开后还能再合并多少种样式。只被模板框使用的样式始终只比较外观，因为框的位置由模板决定。
- **每个框留在原位**（与 *只比较外观* 一起显示，默认开启）：框位置与保留样式不同的样式不会被完全合并。它只保留自己的位置（放置方式、固定位置、跨栏宽度、上下间距），并基于保留样式（`extends`），所以它的框采用保留样式的外观，位置不变；审阅会说明有多少样式这样保留。
- **查看**列出每种将被删除的样式、它与保留样式的不同之处，以及会被改写的章节和框。**合并到**（或**合并全部建议**）把每个模板框（包括变体）的`style`和每一章每个标记的`type`都改成保留的样式，删除其余样式，并把保留的样式放到这一组中排在最前的样式原来的位置，这样没有写`type`的标记外观不变。合并在沙盒的撤销历史中记为每个被改写的章节一步，再加样式和模板一步。只要合并之后没有别的改动，本节的**撤销**会一次撤回整个合并；按 Cmd/Ctrl+Z 则逐步撤回，先撤回样式，因此中间的每一步引用的样式都存在。
- 在*标注框样式*中给样式改名时，每个标记和每个模板框里的名称也会一起改。

合并只改写当前打开的版本中的章节：书的其他语言版本另存为草稿或单独的项目，保留各自的样式。智能体可以通过`sandbox_frame_styles`和`sandbox_merge_styles`使用同一个样式库（见[WebMCP](https://postext.dev/zh/docs/webmcp.md)）。

## 所有版本中的模板页

书中有页面模板（`pageTemplates`）时，面板最上方是**模板页**：书中每一章每个模板页的检查项，覆盖书所带的每个版本。一个含西班牙语、英语和加泰罗尼亚语的包，屏幕上显示其中一个版本时，三个版本都会检查。未显示的版本在后台排版，每个版本的读取方式与打开它时相同：编辑过的读其草稿，否则读包中该语言的文本。控件下方的一行说明哪些版本正在排版，全部完成后列出已检查的版本。

这一节列出：

- *框内放不下文字*（`frameOverflow`），附上逐级重排尝试过的步骤，以及能让框放下内容的修改；
- *追加页之后文字仍放不下*（`frameContinuationLimit`）：框的内容已接续到模板页最多可追加的页数，仍放不下；
- *文章转到的页面不在其后*（`continueTargetMissing`）：后面没有哪个页面围栏带有框的`continueIn`所指的id；
- *标注指向不存在的锚点*和*锚点缺少标注*（`labelAnchorUnknown`、`anchorUnlabelled`），归在排这幅图的框下；
- *标注超出了它的宽度*和*标注相互重叠*（`labelOverflow`、`labelOverlap`），归在同一个框下：每个版本的标注用它自己的文字来测量，所以词更长的语言会在别的语言不超出的地方超出；
- *槽位没有对应的框*、*空框*、*未知的页面模板*、*模板页只写了三个冒号*和*跨页标记与模板不符*（`slotUnknown`、`slotEmpty`、`templateUnknown`、`pageFenceLength`、`spreadMismatch`）；
- *目录分组跨栏拆分*（`tocGroupSplit`）；
- 页面模板本身的警告（不存在的框样式或锚点、相互矛盾的尺寸、首尾相连的链），以及存放书中内容的设计文字（`contentInConfig`）。

这些条目不会在下面的分组里重复出现。

**页面**、**框**、**语言**分别按模板页（各版本中的同一页，不论它在各版本里的页码）、按框或按版本分组。下方三个菜单可只保留一种语言、一页或一个框。每个条目标出版本代号（*CA*）、该版本中的页码和框名。

点击条目即转到它所在版本的那个框。若屏幕上是另一个版本，书会切换到条目的语言，随后打开该章和该页，页面上会选中该框（预览底部显示它的路径），光标落在**正文**面板中该槽位的开头。模板本身的警告会打开用该模板排的第一页，并选中相应的框；含内容的设计文字会打开**版面设计**面板。

从多语言文件包导入的本地项目会保留全部语言，所以它的合成页和示例书一样会在每种语言中检查；点击另一种语言里的检查项，会把项目切换到那种语言并带你过去。只有一种语言的书只有一个版本，控件下方那一行会说明。活动栏上的徽标只统计屏幕上这个版本中当前章节的警告。大型的书会等你发出请求：章数乘以版本数超过48时，面板只检查屏幕上的这一章，并给出**检查所有版本**，点击后在后台排出其余部分（postext 1.40起）。`sandbox_get_composed_checks`工具（见[WebMCP](https://postext.dev/zh/docs/webmcp.md)）不用面板就能列出所有版本的合成页检查。

## 把文字移到 Markdown

在模板页出现之前做的书，可能把整页的文字放在标题样式里：每页一个隐藏标题，它的页眉把几十段文字、色块和图片放到印刷页上原来的位置。这时检查面板会列出*配置中存放的正文*，并在顶部提供**把文字移到 Markdown**。从书库面板导入这样的书时，导入一结束就会打开同一个对话框。

对话框先说明会做什么，然后才动手：

- 每个页面设计变成一个页面模板（`pageTemplates`）。每段文字在原来的位置变成一个框；外观相同、上下排列、间距一致的文字块合成一个框。色块、线条和图片进入模板的装饰，装饰画在页面正文之上，和原来的页眉一样；铺满整页的图片变成页面的 `background` 属性，由装饰读取（`{attr.background}`）。
- 章节的每一页变成一个模板页 `::::page{template="…"}`，里面是这一页的标题和正文，每个框一个 `:::frame{slot="…"}`，放着它的文字。粗体和斜体保留；设计里的换行保留为强制换行。
- 每段文字的字体、字号、字重、颜色、对齐和行距组成一个段落样式：书中已有完全相同的就用它，否则新建一个，以字体和字号命名。粗体字下面的彩色色块变成书中同色的标签样式，没有就新建一个。
- 框位置相同的页面共用一个模板（`page-base`），各页自己的模板继承它（`extends`）；没有增加内容的页面直接使用它。
- 去掉页眉后变得相同的标题样式合并为一个（`tema--p04`、`tema--p05` → `tema`），标题里的样式名随之改写；只用来切换页眉的隐藏标题被删去。原来以要求奇数页或偶数页的标题开头的页面，在它的围栏前加一个 `:::pagebreak{parity="…"}`。

**会有哪些变化**中的数字是：移走的文字段数和字符数、写出的页面、建议的模板、前后的标题样式数、新建的样式、配置的大小，以及前后的*配置中存放的正文*警告数。

**前后对比**用 Sandbox 自己的排版把每一章排两遍，把每个有变化的页面并排画出，旧的在新的旁边。旁边的列表说明哪些页面看起来不同，以及已知的原因：文字自身的底框、描边或首字下沉、不知道在左还是在右的页面、现在排在模板流文框里的正文。**用红色标出变化的地方**会把不同的像素涂成红色。

选项有：**框位置相同的页面共用一个模板**、**粗体字下面的高亮色块变成标签**，以及有这种样式时的**删除没有标题使用、但含有文字的标题样式**。

选中**图片上的文字变成该图片的标注**（当设计在书中的图片上放了短词，例如地图上的名称、示意图上的数字时才会出现）后，这些词会变成 `:::figure` 的 `::label` 行，图片自己占一个框，它的资源得到这些锚点。摘要会统计注记、图片、锚点和注记样式的数量。此选项默认关闭，因为这些页面变化最大：注记会用本书的字体重新排版，请把它们和旧页面对照着看。锚点写入图片的资源，每个算一步撤销，位于文字和设计之间；**撤销**和**把书恢复原样**也会一并撤回它们。

**移动文字**把这次修改写进书的撤销历史：每改写一章是一步，设计再占一步。Cmd/Ctrl+Z 先撤回设计，再撤回各章；只要这些步骤还是最近的，对话框里的**撤销**会一次全部撤回。此外，原来的书也会一直保存，重新加载后也在，直到在检查面板中选择**保留这次修改**；在那之前，**把书恢复原样**会把原来的设计和文字写回去，这些步骤同样可以撤销。

留在配置中的内容列在**留在配置中的内容**下：文字和占位符混在一起的文字（`第 {pageNumber} 页`）、挂在页眉自身的框或另一个元素上的文字，以及标题设计中的文字（那不是页面）。放进框里的标题在框里保留它的设计（带框标题的标签、画在标题周围的色带；见[提示框与文框中的标题](https://postext.dev/zh/docs/configuration-headings.md#提示框与文框中的标题)）。对比度检查读取框里的文字时，以框自己的色块或其下装饰中的色块为底，因此彩色色块上的白色标签按那块颜色测量（见[检查哪些内容](https://postext.dev/zh/docs/configuration-fonts-colors-viewers.md#检查哪些内容)）。

同样的迁移也是引擎的一个函数 `moveTextToMarkdown({ config, chapters, metadata }, options)`，它返回新的配置、章节和对话框显示的报告。参见[模板页](https://postext.dev/zh/docs/composed-pages.md#迁移文字放在样式里的书)。

## 一键修正一个框

在*框内放不下文字*下面，重排阶梯为这个框算出的修正办法以按钮形式列出，用的是警告本身的措辞：

- *允许文字缩到60 %* 设置框的`fit.minScale`（如果`fit.shrinkText`是关闭的，同时打开它）；
- *把maxHeight提高到66 mm* 设置它的`maxHeight`；
- *把……的minHeight降到……* 降低同组另一个框的最小高度；
- *在下一页接续* 把`overflow.continueIn`设为`next-page`，放不下的部分接续到这一页之后新增的页面；
- *改用模板……排这一页* 改写正文里这一页`::::page`围栏的`template`；
- *删去约626个字符* 不做任何改动：它在**正文**面板中选中这个框的文字，并说明要删去多少字符。

其他按钮会改变书的版式，所以每个按钮都会先询问，说出要改的设置和值（*tema-fija › dinero › maxHeight = 66 mm*），或这一页将改用的模板。版面设计的修改对使用该模板的每一页都有效。点击**修改**后，这项修改作为撤销历史中的一步完成：Cmd/Ctrl+Z，或“内容”和“版面设计”旁的撤销按钮，可以撤回。页面会重新排版，警告随之消失，或换成修改后留下的问题（下面某个框现在放不下了）。

画布上的**移动了什么，为什么**面板里，同样的按钮也跟在这个框下面。不在屏幕上的版本发出的警告，会提供打开那个版本的按钮，在那里执行修正。如果排版提出修正办法之后书又改过了（模板被编辑过，或围栏写了另一个模板），按钮会说明这一点，不做任何改动。智能体用`sandbox_apply_proposal`执行同样的修正（[WebMCP](https://postext.dev/zh/docs/webmcp.md)）。
