跳到主要内容

章 12.3 · 篇 III · 实践

沙盒:书、Word文件与保存

书与章、编辑漫画页、导入和导出Word文档,以及沙盒怎样保存、导出和导入你的作品

更新于 2026-10-1624分钟所属章节: 12 沙盒enescadefritptzhjaar

简单来说

本页讲在沙盒里怎样整理和保存你的作品。一个项目就是一本由若干章组成的书。漫画页有自己的分格和台词工具。你可以导入一个Word文件,选择它的样式对应哪些Postext样式,也可以把书再导出为Word文件。你的作品会随时保存在你自己的浏览器里,你也可以把它下载成一个文件,以后再打开。

#书与章

在沙盒中打开的一切都是一本书,就像InDesign的书籍文件把每章的文档编成一组:配置、自定义字体和资源集由全书共用,每一章是一个独立的Markdown文档。长篇作品(比如一本五百页的教材)可以一章一章地编辑,而编号、交叉引用和导出看到的仍是一个整体文档。

  • 结构在章节面板和正文面板的章节切换器里管理:添加、重命名(双击某一行)、调整顺序、按一级标题把一章拆成多章、把一章并入前一章、删除。每一章都有自己的撤销历史和光标位置。
  • 一次一章。默认情况下,各预览排的是当前章,并接续在它之前的各章之后:它的起始页码紧接上一章的最后一页;一级标题继续计数(第4章编号为4,其中的图为4.1、4.2……);{chapterNumber}和{chapterTitle}书眉随之更新;左右页的奇偶关系保持不变(章首页补空白页的方式与在全书中间时完全一样);指向第1章首次提到的图的:ref也保留原来的编号。前面各章的页数取自上次显示该章时的版面;从未打开过(或打开后又改过)的章会在后台依次排版,排好之前章节列表显示页码待定。对于从新的一页开始的章(默认如此),页码范围是准确的;如果某章的正文本应接着上一页往下排,它会改为从自己那一页的顶部开始。
  • 整本书。Canvas、HTML预览和PDF标签页可以把整本书显示为一个连续的文档:在标签栏左侧的选择器中选整本书(有多于一章的书才有此项)。这时Canvas会按顺序排出每一章,每章接在前面各章的页数之后,并把这些文档拼接起来显示。修改某一章只会重排这一章;它之后的各章只有在起始页变化时才重排。章节列表、永久链接中的chapter=和page=部分以及编辑器同步都跟随当前页所在的章。这个选择随书保存(短篇小说适合作为一个整体阅读,教材适合一次一章),预设也可以通过清单的view.canvasScope以这种方式打开。HTML预览与Canvas共用这一选择,并从第一页起把整本书排成一个文档,目录行和URL片段跟随每页所在的章;PDF标签页有自己的选择器。
  • 长篇书。一本120章的书和短书用起来一样。正文面板标题栏里的章节菜单在窗口内滚动,打开时定位到当前章,可以用方向键从这里移动。分篇的书(章中有:::part围栏)在菜单和章节面板里把各章列在所属的篇下面,在菜单中点击某一篇会打开它的第一章。超过30章时,菜单顶部有一个搜索框,可以匹配章号(27)以及标题和篇名中的词(埋香、卷三);按Enter打开第一个匹配项。输入法正在组字时(注音、仓颉、拼音、假名),Enter和方向键归输入法使用:Enter确认转换,不会打开任何章。示例书的章文件每次加载八个;在后台为各章分页期间,章节面板会显示进度(正在分页34/120)。超过200章的书,无论书本身或其清单如何要求,Canvas和HTML预览都一次只显示一章:同时排出每一章需要把整本书都放在内存里。低于这个数量的书可以整本打开:《紅樓夢》(129章,约2,000页)在Canvas上大约需要25秒和100 MB内存。PDF标签页仍然可以整本导出任何书。
  • 前置部分。第一章的前置部分就是整本书的前置部分(书名、作者……)。其他章顶部的前置部分块会被忽略,检查面板会给出提示。buildBundle遵循同样的规则,所以一本书在沙盒里和在你自己的程序里渲染结果相同。
  • 页数。每一章都作为独立文档排版,因此{totalPages}统计的是本章的页数。{bookTotalPages}统计整本书:所有章的页数都已知后,各预览会用这个总数重新排每一章(只在页眉、页脚或版面设计打印它时才这样做)。在那之前,一章打印的是截至本章末尾的页数。PDF标签页的整本书统计的是它实际排出的页数,因此文件里打印的始终是全书的真实总页数。
  • 章首页。章与章之间不会强制分页:第一个块是一级标题的章,通过该标题自身的前置分页设置另起一页,与文档中间开始的章完全一样。
  • 同步。在Canvas或HTML预览中点击任意一章的段落,编辑器就会切换到那一章并放置光标;无论该章位于书中何处,编辑器的光标都会在预览中高亮显示。警告会注明所在的章。
  • 已有文档会作为只有一章的书打开;在添加第二章之前一切照旧。

#编辑漫画

含有漫画页(:::page)或漫画条(:::strip)的章,可以直接在页面上编辑:Canvas标签页、HTML标签页以及书页标签页的选择文本模式都可以。排在栏中、浮动到页首或横跨整页的漫画条,比所跨宽度窄或排在题注下方的漫画条,也都能用同样的工具编辑,修改写进漫画条自己的围栏行。每次修改都像手动输入一样写进这一章的Markdown,所以编辑器的撤销能把它退回去。标记和嵌字规则见漫画。

  • 分格线。 指针移到两个分格之间的格间距上,会变成调整大小的光标。拖动它就能移动分格线;松开时,新的百分比写入页面的split属性(页面没有这个属性时,会把它加到围栏行上),页面随即重新排版。按住Shift时,分格线以5%为步长吸附;按住Alt时只移动离指针较近的一端,使分格线倾斜;任何分格都不会窄于5%。拖动过程中,画面将无法让安全区留在视野内的分格会被标出,并附有提示。每条分格线也是一个可以获得焦点的分隔条:方向键每次移动1%(按住Shift为5%),Enter写入位置,Escape恢复原位。
  • 分割与合并。 分格上方的小工具栏提供用水平线分割、用垂直线分割(紧接在这一格之后,为新格子加一个空的::panel行)和与下一格合并:两格之间的分格线去掉,合并后的分格保留第一格的画面,并接收两格的全部台词行。也可以用Tab键到达各个分格:获得焦点的分格会显示轮廓,按H用水平线分割,按V用垂直线分割,按M与下一格合并;页面重新排版后,焦点仍留在这一格上。按Enter打开工具栏,按Escape从工具栏回到分格。
  • 对白框。 拖动对白框就能固定它的位置:松开时,它的台词行得到at="x% y%",即以分格画面的百分比表示的点(分格没有画面时以格子为准),所以无论怎样裁切、拖动分格线或换成译本,固定点都留在画稿的同一位置。相连的一组对白框作为整体移动,由组中第一个对白框固定。获得焦点的对白框可以用方向键每次微移1%(按住Shift为5%);双击已固定的对白框会删去它的at,把它交回自动排放。单击对白框会把编辑器的光标放到它的台词行上。
  • 溢出提示。 对白框移动时,无论用指针还是方向键,预览都会检查它将落在哪里。如果它会盖住脸或避让区,或者会比现在更多地伸出分格,移动中的轮廓变成橙色,分格中的脸和避让区以虚线画出,提示框说明原因:“放在这里会遮住人脸。”“放在这里会遮住图片中需要留空的区域。”“放在这里会超出分格。”带break的台词行不会因伸出分格而被标出。这个提示不预测分格中其他对白框会怎样移动来让出位置。
  • 尾巴。 指针移到尾巴尖端上会变成十字准星。把尖端拖到尾巴应当指向的地方:松开时,台词行得到to="x% y%",即以分格画面的百分比表示的点,尾巴转向这个点,并像在嘴前那样在到达之前停住。Escape取消拖动;双击尖端会删去to,尾巴重新指向说话人。用键盘时,在获得焦点的对白框上按T转到它的尾巴:方向键把所指的点每次移动1%(按住Shift为5%),Enter写入,Escape恢复原位,Delete删去to,再按T回到对白框。
  • 说话人与避让区。 在资源面板的图片上,安全区与嵌字一栏打开一个有三种模式的对话框。安全区标出图片中必须留在视野内的部分。角色为每个人物放一个点:在图片上单击,就在那里添加一个说话人,并让它的id获得焦点,这个id必须是脚本使用的说话人键(maya: …);再把它的嘴、头(心声的气泡指向这里)和脸(不会被任何对白框遮挡)拖到位。避让区是对白框不得遮挡的矩形,在图片上拖动即可画出。同一模式也标出不说话的人的脸(添加不说话者的脸,或区域那一行上的是一张脸开关):任何对白框都不会盖住这样的脸,而一格里别无他处时,避让区会让步。每个标记都可以用方向键移动(按住Shift步长更大),按Delete删除;对话框有自己的撤销,安全区以外的说话人会被标出。
  • 设置。 版面设计面板的漫画组包含漫画配置:阅读方向和画面翻转、画框与格间距、默认分格与命名分格样式、嵌字,以及对白框样式,每种对白框样式都附有轮廓预览。
  • 编辑器与检查。 文本编辑器为:::page、:::strip、::panel行以及台词行的键和属性着色。检查面板在相关的行列出漫画警告(无法读取的切分、分格数与格子数不符、放不下的对白框……);见漫画 › 漫画警告。

#Word文档

书稿通常以Word文件的形式交来。正文面板可以直接导入.docx,不需要AI智能体,也不需要安装任何东西,样式的对应方式与InDesign的置入相同。导入Word文档在浏览器中读取文件(文件不会上传),并打开一个对话框;只有按下导入,书才会改变。不是Word文档的文件,例如旧的二进制.doc,会被拒绝,并显示一条说明原因的消息;请先在Word中另存为.docx。

对话框包含以下几部分,每一部分都可以折叠:

  • 原稿质量。 对书稿准备情况的判断:样式规范(可以干净地转换)、部分使用样式(有些段落的格式是手动设置的)或没有样式(全部为Normal(正文),文字将作为普通段落导入)。下面列出各项计数(段落数、其中使用Normal以外样式的段落数、图片、表格、注释)和发现的情况,每一项都附有出现该情况的几个段落的开头几个字:手动设置格式的段落(字体、字号、颜色、对齐;这些格式不导入,由版面设计决定)、看起来像手动输入标题的加粗短段落、手动输入的编号或项目符号(而不是Word列表)、手动换行符、手动分页符、用来留出间距的空段落、制表符和连续两个空格、修订(保留插入的内容,删除的内容不导入;请先在Word中接受或拒绝)、批注(不导入)、文本框(每个文本框的文字接在其锚定的段落之后)、公式(转换为TeX;请检查)、隐藏文字,以及浏览器无法显示的格式的图片(EMF、WMF、TIFF)。
  • 导入模板。 当前使用的对应方式:自动(按样式名称)、一个已保存的模板,或者对于从沙盒导出的文件,保存在本文档中。另存为新模板会要求输入名称,并把对应方式(包括本文档的所有样式)保存在浏览器中;保存修改更新所选模板;下载按钮把模板写成.json文件,上传按钮载入这样的文件,这样整个团队可以共用同一个模板。删除模板前会要求确认。下一次导入时,上次使用的模板排在最前面。
  • 段落样式。 文档使用的每一种段落样式,显示使用它的段落数和其中一段的开头几个字,以及它转换成什么:正文、标题(1到6级中的一级;版面设计中有标题样式时,还可以选择其中之一)、段落样式(版面设计中的某个段落样式;连续使用它的段落组成一个:::paragraphs组)、标注框(连续的段落组成一个该类型的标注框)、标注框标题(开始一个以该段文字为标题的标注框)、引用、相邻图片或表的题注、新一章的开始、Postext Markdown,按原样保留(文字原样复制,用于在Word中输入的指令)或不导入。Word编号列表和项目符号列表中的段落,无论使用什么样式,都会变成Postext列表,并保留编号和嵌套层级。诗(:::verse,逐行)把该样式的段落排成一首:::verse诗,也可以指定设计中的某个段落样式:Shift+Enter断开一行诗,一个段落是一个诗节,连续的单行段落合成一个诗节,空段落分隔诗节;名为Verse、Poem、诗或诗歌的样式会自动推断为这一项。
  • 字符样式。 字符样式也是如此:纯文字、粗体、斜体、粗斜体、小型大写字母、上标、下标、行内标签(版面设计中的某个行内标签样式)、Postext Markdown,按原样保留或不导入。
  • 选项。 手动换行符(Shift+Enter)保留为段落内的换行(在Markdown行末写反斜杠,为默认设置),或用空格连接,或另起一段;手动设置的粗体、斜体、小型大写字母和上下标保留或不导入;加粗的短段落保持为段落,或转为某一级标题;手动分页符不导入(由版面设计决定分页),或保留为:::pagebreak;图片和表格是否作为资源添加。
  • Markdown预览,随对应方式的改变而更新。

对话框底部选择文字的去向:替换本章、在本章之后新建章或替换整本书;后两种在每个一级标题处开始新的一章。图片(PNG、JPEG、GIF、WebP、SVG)成为图资源,表格成为表资源(保留表头行、合并单元格、列宽和单元格底色),每个资源都以::resource{id="…"}放在原来的位置,并以相邻的题注段落作为题注;题注中手动输入的标签(图3.)不导入,因为Postext会自己给资源编号。脚注和尾注成为Postext脚注([^1]),Word索引项(XE域)成为:index标记,链接保持为链接,公式成为$…$ / $$…$$。正文中的制表符变成带有Word为它所设制表位的:tab(:tab{at=432pt align=end leader="."});段落对应到本书中自带制表位的段落样式时,则变成单独的:tab。Word的点、连字符和中点前导符变成.、-和·,下划线和粗线前导符变成一条线。标题、表格单元格或注释中的制表符变成空格。

在按名称匹配样式之前,自动对应会识别Word自身的角色,无论界面是什么语言(标题 1–6、标题、引用、题注;目录、索引、页眉和页脚段落不导入),也会识别版面设计中的样式:Word样式的名称与本书的某个段落样式、标注框类型、标题样式或行内标签样式相同时(按id或名称,不区分大小写和重音符号),就对应到该样式。

导出为Word把当前打开的章或整本书下载为.docx,供他人在Word中编辑。同一个模板反向应用:标题使用Word的标题样式;段落样式、标注框、引用和行内标签使用各自的Word样式(以版面设计中的样式命名,如标注框: 注释、标签: 按键);列表变成Word列表,脚注变成Word脚注,链接保持为链接。:tab变成Word制表符,带自己制表位的:tab{…}按原样保留;段落样式中以长度设定的制表位变成其Word样式的制表位,使用Word中最接近的前导符(位于'end'或百分比处的制表位取决于Word排文字的页面,因此略去)。Word无法显示的内容(前置元数据、围栏行、指令、:ref、公式、:index标记、资源行)以灰色的Postext Markup样式按原样保留。导出整本书时,每一章开头有一个Postext Chapter段落。模板随文件一起保存,所以编辑后的文档再次导入时使用同样的对应方式;文档中有章段落时,就作为整本书导入。灰色文字保持不动,文字就会按导出时的样子回来;脚注标签会重新编号([^1]、[^2]……),印出来没有区别,_italic_会变成*italic*。

本对话框不处理的转换(PDF、PowerPoint、EPUB或IDML原稿,或重现原稿的版式规则),请使用智能体技能。

#持久化

沙盒会自动把你的工作保存到浏览器中:

  • 书和配置——章、当前章和Canvas范围自动保存到localStorage的postext-sandbox-book下(早期版本保存的单个文档会从postext-sandbox-markdown读出,作为只有一章的书,并在第一次保存时迁移);配置在停止操作1秒后保存,默认值会被去掉,只存储你改过的部分,同时保存其版本号(postext-sandbox-config-version);在有版本号之前保存的配置,按下文postext 1.4及更早版本保存的标题分页所述方式读取
  • 界面状态——当前面板和视图标签页、侧边栏宽度、版面设计面板中展开的分组(postext-sandbox-settings-group)、其显示全部说明开关(postext-sandbox-settings-help)和各区块的展开状态、隐藏的示例书、Canvas的缩放/适应/视图模式、HTML的字体缩放和分栏模式、EPUB标签页的版式(postext-sandbox-epub-layout),以及工具栏的固定状态,都保存在localStorage中
  • 打开的书——你自己的书(项目)中当前打开那本的id保存在localStorage的postext-sandbox-project下;项目本身(章、配置和资源记录;记录为version: 9,即引擎的CONFIG_VERSION,工作配置和导出的postext-config.json也带有这个版本号,因此引擎规则改变时每一项只迁移一次;早期版本的单文档记录在读取时迁移;版本3之前记录的标题分页、版本4之前记录的公式字号、版本5之前记录的行内图下方间距、版本6之前记录的框内行内图上下间距、标题中的标记、首字下沉字号、冒号行下方空间和框的断开,版本7之前记录的破折号处断行和不齐行文字的断行,以及版本8之前记录的标题下拆分、复合词连字符处断行和:::paragraphs容器下方的间距,都按下文所述方式固定下来)存放在沙盒IndexedDB数据库的projects存储中,其二进制数据与工作文档共用blob和字体存储。当工作文档和所有项目都不再引用某项数据时,它会被垃圾回收
  • 编辑过的示例书——你修改过的示例书(它的章、当前章、Canvas范围、配置和资源记录,以及打开时示例所应用的内容)保存在沙盒IndexedDB数据库的presetDrafts存储中,每个示例和内容语言一条记录;其文件与项目的文件一样不会被垃圾回收清掉。恢复原版会删除这条记录
  • 示例书封面——对于没有附带缩略图的示例书,取自其第一页的封面保存在沙盒IndexedDB数据库的presetCovers存储中,每个示例和内容语言一条记录(见书库面板)。你自己的书把封面保存在其项目记录中。
  • 离开时保存——页面被隐藏或关闭时、通过链接(标志)离开沙盒时,以及打开另一本书之前,待保存的修改会立即写入,而不是等1秒的停顿
  • 打开的示例书——最后加载的预设的id保存在localStorage的postext-sandbox-preset下,因此各面板的重置按钮在不同会话之间都会恢复这个预设(不再提供的预设会显示为不可用)。该预设应用过的内容(它的文件包指纹,加上Markdown、配置和资源集的哈希值)保存在postext-sandbox-preset-applied下,下次访问时据此区分未改动的文档和编辑过的文档
  • 资源和字体——资源记录、它们的二进制blob(位图和SVG)以及自定义字体文件保存在IndexedDB中;IndexedDB不可用时(例如某些隐私浏览模式),检查面板中会出现存储不可用警告(在浏览器下)
  • 永久链接——URL片段标明屏幕上显示的内容,因此重新加载、书签或发给别人的链接都会在同一个查看器中打开同一本书的同一页:#preset=bioquimica-feduchi&lang=es&view=canvas&chapter=1&page=7会在Canvas标签页上打开西班牙语的Bioquímica预设,定位到第1章第7页(页面上印的页码)。view可以是canvas、pdf、folio、html或epub;在书页标签页上,页是打开的跨页中右侧那一页。本地项目用project=ID表示,即它的存储id,所以只有保存该项目的浏览器才能打开这样的链接。你切换书、标签页和章以及滚动时,沙盒会随时更新这个片段。省略的部分表示保持现状(没有页:该章第一页;没有书:上次打开的那本),浏览器打不开的书会被跳过。在已打开的沙盒的地址栏中粘贴链接,会就地打开它。如果打开页面时用的链接指向的书与上次打开的不同,沙盒会一直显示加载状态,直到链接的书加载完毕,而不会先显示之前那本。宿主还可以用hashBundles属性链接到自己的书(见属性):网站用#recipe=<slug>&lang=es打开一份排版食谱中的食谱。第一次访问会把食谱的.postext文件导入为你的一本书。之后再访问同一链接,会先询问(你已有这本书):打开我的副本打开那本书,包括你的修改;替换为已发布版本重新导入食谱(它此后可能已经修正),新书打开后删除你的副本;按Escape则保留你的副本。片段随后改为标明该项目。界面语言保留在路径中(/en/sandbox、/es/sandbox);lang是双语文件包的内容语言,可以是任何BCP 47标签,以规范大小写保存(lang=zh-hant读作zh-Hant)。文件包没有列出的标签会打开适用于它的版本:zh-TW和zh-HK打开繁体中文版(zh-Hant),zh和zh-CN打开简体中文版(zh-Hans),en-GB打开英文版。只有当文件包没有读者所用文字的版本时,才会读取另一种中文文字:指向一本有zh-Hans和英文版本的书的zh-TW链接会打开简体中文文本,而不是英文。不带lang的链接打开文件包的openLocale(如果指定了的话),否则打开界面语言对应的版本。链接中的章和页作用于它打开的版本,之后片段会用该版本自己的标签来标明它(lang=zh-TW&chapter=28变为lang=zh-Hant&chapter=28)。

postext 1.4及更早版本保存的标题分页。在postext 1.4及之前,带有headings对象的配置在排一级标题时不分页,除非它明确设置了H1的前置分页开关(而且保存时会丢掉关闭的H1分页);不完整的H1分页设置,缺少的字段取自不分页的默认值;标题样式的分页也是如此,而不是合并到其所在级别的设置上。现在引擎保留每一级的默认值(H1从新的右页开始,即always-odd),并把不完整的分页设置合并到默认值上。为了让当时保存的书保持原来的页面,沙盒在读取版本3之前的项目记录或没有版本号的工作配置时,会把这些分页设置写出来:原先分页关闭的,在H1上写enabled: false;在H1和标题样式上,于未指定奇偶的enabled: true旁边写parity: 'any'。版面设计面板随后显示的就是排版时实际使用的分页设置。自postext 1.5起,文件也会记录版本:清单中没有configVersion的.postext文件,以及没有版本号的postext-config.json,都是postext 1.4或更早版本写出的,导入或打开时按同样方式读取(见postext 1.4及更早版本写出的文件包)。

postext 1.5之前保存的公式字号。在postext 1.4及之前,每个公式都比其缩放比例所规定的大1.131倍(见公式字号)。为了让当时保存的书保持原来的页面,沙盒在读取以下内容时会固定这个字号:版本4之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 4的.postext文件,或在此之前导出的postext-config.json。缩放比例变为保存的比例×1.1312,以em为单位的独立公式边距除以1.1312,这样公式及其周围的空白都保持原样。章中没有$的书保持不变(postext-config.json不含章,所以只要启用了公式就会固定字号),关闭了启用LaTeX的书也不变。公式区块随后显示排版时使用的值;把缩放比例、独立公式上边距和独立公式下边距重置,即可按现在的字号排版。固定只写一次:记录以当前版本重新保存,此后按原样读取。当时应用后从未编辑过的预设仍算作未改动(沙盒会与固定后的值比较,标题分页的固定也是如此):重新加载它或切换书时,不会要求你放弃从未做过的修改,而预设的新版本(例如内置指南的新版本)仍会替换它。

postext 1.5之前保存的行内图。在postext 1.4及之前,在正文中行内放置的图或表(位置为行内(此处))只在上方保留一行空白:其后的正文在下一条网格线处继续,不管它离得多近。现在下方也保留同样的一行(分栏→行内图的上下间距,上方和下方)。为了让当时保存的书保持原来的页面,沙盒在读取版本5之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 5的.postext文件,或在此之前导出的postext-config.json时,如果书中有一行嵌入了资源(单独占一行的::resource{id="…"},而不是正文中的提及),就把行内图的上下间距设为仅上方。postext-config.json不含章,所以只要文件较旧就会这样设置。选择上方和下方即可按现在的间距排版。

postext 1.5之前保存的框内行内图。在postext 1.4及之前,框内行内放置的图或表紧贴其周围的框内文字。现在它上方保留一行框内文字的空白,选择上方和下方时下方也保留(分栏→框内图的上下间距)。为了让当时保存的书保持原来的页面,沙盒在读取版本6之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 6的.postext文件,或在此之前导出的postext-config.json时,如果书中有框在单独一行上嵌入了资源,就关闭框内图的上下间距。postext-config.json不含章,所以只要文件较旧就会关闭。打开它即可按现在的间距排版。

postext 1.5之前保存的标题标记和首字下沉。在postext 1.4及之前,标题中*italic*、**bold**等标记里的词按标题自身的普通样式打印;没有设置字号的首字下沉与它所跨的所有行等高,顶部高出第一行。现在标题会呈现其中的标记(标题→标题中的行内标记),首字下沉的顶部与第一行大写字母的顶部齐平。为了让当时保存的书保持原来的页面,沙盒在读取版本6之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 6的.postext文件,或在此之前导出的postext-config.json时,如果书中有标题带有标记,就关闭标题中的行内标记(postext-config.json不含章,所以只要文件较旧就会关闭);并把每个首字下沉当时的字号写入其首字字号。打开这个开关,或清除字号,即可按现在的规则排版。注意,整个标题都用*…*标记的斜体标题届时会变成正体。

postext 1.5之前保存的冒号后列表。在postext 1.4及之前,冒号行随列表只要冒号结尾的那一行下方还有一行空间,就认为足够放列表,所以如果第一项有两行、按段首孤行和段末孤行规则必须保持完整,它就会移到下一栏,把冒号行单独留在栏底。现在它要求第一项所需的空间(字体排印→正文→孤行与短行→冒号行下方空间,第一项所需)。为了让当时保存的书保持原来的页面,沙盒在读取版本6之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 6的.postext文件,或在此之前导出的postext-config.json时,如果书中有列表跟在以冒号结尾的行之后,就把冒号行下方空间设为一行(1.4)。postext-config.json不含章,所以只要文件较旧就会这样设置。选择第一项所需即可按现在的规则排版。

postext 1.5之前保存的框断开。在postext 1.4及之前,在段落或列表项内部断开的框,只要框的每一侧都保留了拆分时每侧保留的行数,就可能在某一侧只留下该段落或列表项的一行。现在断开处每一侧至少留下段落或列表项的两行(分栏→框断开处段落的行数)。为了让当时保存的书保持原来的页面,沙盒在读取版本6之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 6的.postext文件,或在此之前导出的postext-config.json时,如果书中有章使用了:::callout,就把框断开处段落的行数设为1。postext-config.json不含章,所以只要文件较旧就会这样设置。把它改回2即可按现在的规则排版。

postext 1.5之前保存的破折号和不齐行文字。在postext 1.4及之前,最优断行从不在两词之间紧排的长破折号或短破折号(say—that’s)之后结束一行,不齐行文字也总是逐行排,每行排满再排下一行。现在一行可以在这样的破折号之后结束(字体排印→正文→段落→破折号后断行),不齐行的正文也用Knuth-Plass断行(不齐行文字最优断行)。为了让当时保存的书保持原来的页面,沙盒在读取版本7之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 7的.postext文件,或在此之前导出的postext-config.json时,如果书中有章使用了这样的破折号,就关闭破折号后断行(postext-config.json不含章,所以只要文件较旧就会关闭);如果配置把某些连续正文设为不齐行,即正文、某个段落样式、框的正文、篇的正文或章节样式的正文,就关闭不齐行文字最优断行。打开它们即可按现在的规则排版。

postext 1.5之前保存的标题下拆分。在postext 1.4及之前,位于栏底的标题下方的段落,在那里能放下多少行就保留多少行,不管移到下一栏的有多少。现在它还要满足段末孤行(orphan)的最少行数,否则标题会随它一起移走(标题与目录→标题→标题下的拆分)。为了让当时保存的书保持原来的页面,沙盒在读取版本8之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 8的.postext文件,或在此之前导出的postext-config.json时,如果书中有章包含标题(postext-config.json不含章,所以只要文件较旧就会这样设置),并且配置开启了与下文同栏和段末孤行控制,就把标题下的拆分设为填满本栏。把它设为按规则即可按现在的规则排版。

postext 1.5之前保存的段落容器。在postext 1.4及之前,:::paragraphs容器下方的间距取样式自身的值(段间距和下外边距中较大者),加在最后一行下面,之后正文才回到网格上;标题在自身上方保留的间距加在它下面,而正文的段间距不计入。于是标题离参考文献比离段落更远,一组紧凑条目之后的段落离它们又比离其他任何内容都近。现在这个间距与下一个块自身的间距合并,并且至少等于正文的段间距(字体排印→段落样式→容器下方间距,折叠)。为了让当时保存的书保持原来的页面,沙盒在读取版本8之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 8的.postext文件,或在此之前导出的postext-config.json时,如果配置声明了段落样式,并且书中有章使用了:::paragraphs容器,就把容器下方间距设为相加(1.4)。postext-config.json不含章,所以只要文件较旧并且声明了段落样式,就会这样设置。选择折叠即可按现在的规则排版。

postext 1.5之前保存的复合词。在postext 1.4及之前,在没有粗体、斜体或其他格式的段落里,最优断行从不在复合词(well-known)的连字符之后结束两端对齐的行,而在带格式的段落里却会。现在每个段落都可以在那里断行(字体排印→正文→段落→连字符后断行)。为了让当时保存的书保持原来的页面,沙盒在读取版本8之前的项目记录、以更旧版本号(或无版本号)保存的工作配置、清单版本早于configVersion: 8的.postext文件,或在此之前导出的postext-config.json时,如果书中有章在两个字母之间使用了连字符,就关闭连字符后断行(postext-config.json不含章,所以只要文件较旧就会关闭)。打开它即可按现在的规则排版。

postext 1.23之前保存的诗和悬挂缩进样式。在postext 1.22及之前,各行不含||的:::verse诗按单独的半句排,每行居中;段落样式的悬挂缩进会取代其首行缩进。现在这样的诗逐行排(字体排印→正文→诗歌→无分隔符的诗,逐行),同时设置两种缩进的样式,首行从首行缩进开始。为了让当时保存的书保持原来的页面,沙盒在读取版本低于9的项目记录、工作配置或标记低于9的postext-config.json导出,且其章节中有这样的诗时,把无分隔符的诗设为按半句(1.22),并去掉同时设置了悬挂缩进的样式的首行缩进。章节中有行以反斜杠结尾或有后跟空格的\\时(在postext 1.22及以前它们会照样印出),沙盒还会关闭强制换行(字体排印→正文→段落);postext-config.json导出不带章节,所以总会关闭。章节中有```或~~~围栏时(在postext 1.22及以前,其中的行按Markdown读取),沙盒还会关闭代码围栏(字体排印→代码);对导出文件则总会关闭。

用postext 1.23保存的诗。在postext 1.23中,逐行排的诗里比版心宽的诗行,哪怕只宽一点也会转行。现在它先收紧词间距(不小于最小词距),够用时保持一行(字体排印→正文→诗歌→先收紧再转行)。为了让当时保存的书保持原有页面,沙盒在读取版本不高于9、且章节中有逐行排的诗的项目记录、工作配置或postext-config.json导出文件时,会关闭先收紧再转行(导出文件不含章节,因此总是关闭)。

用postext 1.23保存的版式文字。在postext 1.23及之前,标题版式或篇章页中未设置溢出的文字元素会被截成一行并加省略号。现在它会折成多行,添加文字也把溢出交给所在位置决定。为了让当时保存的书保持原来的页面,沙盒在读取标记为9或更早的项目记录、工作配置、.postext文件或postext-config.json导出文件时,会把这些元素的溢出设为末尾省略(…)。

用postext 1.24保存的行内表和分栏。在postext 1.24及之前,排在here、放不进本栏剩余空间的表整体移到下一栏,框外的:::columns围栏被忽略,框也从不在:::columns组内切开。现在这样的表在行与行之间切开,组则把其中的块排成若干栏,并接到下一栏或下一页。为了让当时保存的书保持原来的页面,沙盒在读取标记低于11的项目记录、工作配置或postext-config.json导出时,如果其章节嵌入了资源,就关闭同样用于排在正文中的表(表格);如果其章节含有:::columns围栏,就关闭正文中的分栏,以及可拆分的分栏组(栏)。导出文件不含章节,所以两项总是关闭。

这些固定措施挡住的是上述每项规则变化会造成的移动。1.5版还修复了一些排版错误,而修复没有对应的固定措施,所以在以下情形中,保存的书仍可能出现页面变动:没有版面设计的通栏章标题所在的横带、标题版面设计中的首字下沉、框中的段落、被齐底操作拉开的松散段落、外边距宽于一行的浮动框、带字距的居中或右对齐书眉、通栏章首下方的第二栏、取自在连字符后断开的标题的书眉、比行还宽的词在其自身连字符旁被截断、比行还宽的词的剩余部分(现在保留自己的断点),以及嵌套在另一个列表中的列表之后的那一项(清单见公式字号)。

存储在各界面语言之间共享。未经改动的默认文档会在语言切换时换成当前语言的默认Markdown,并重新放入示例资源,所以打开西班牙语沙盒会显示西班牙语示例。用户的任何编辑都会让文档退出这一行为。当配置没有指定语言时(既没有断词语言,也没有locale),所有预览都会从界面语言推导出断词语言。

#导出与导入

一整本书以.postext文件的形式传递:这是一个zip压缩包,其结构与预设文件包目录完全相同,即preset.json、chapters/*.md、resources/*和fonts/*(见预设文件包格式)。压缩包还以layouts.json携带书的分页信息:每章的页数和编号,并标记了生成时所用的引擎版本、配置和资源,因此导入的书打开时已经分好页,只有这些标记不再能担保的部分才重新排版。多语言文件包为每种语言使用各自的配置,所以可以改为每种语言带一个layouts.<locale>.json(layouts.zh-Hant.json),它先于layouts.json读取。当前文档导出它持有的分页;从某一行导出的项目或预设,带的是它上次作为工作书时记录的分页。封面图作为清单的thumbnail写入,因此往返之后仍然保留。书库面板的新建菜单(打开.postext文件…)把文件导入为一本新书;每一行的⋯菜单都有自己的下载(.postext),当前打开的书导出的是工作文档。早期版本写出的文件(版本1清单,只有一个document.md)导入为只有一章的书。单一语言的书无论界面语言是什么,都保留该语言的图和表标签:从/en/sandbox打开的西班牙语文件打印Figura和Tabla,除非其配置指定了其他资源类型。这个语言是文件指定的语言;文件没有指定时,取其配置所设的语言(先看locale,再看断词语言)。导入时接受位于压缩包根目录或某个顶层文件夹下的文件(直接压缩文件夹本身就会是后一种情况;__MACOSX条目和点文件会被忽略)。字体作为单独的文件写入,从不放在config.customFonts里;导入和导出时都会跳过.woff字体并给出警告,缺少字节数据的资源也是如此。把导出的文件解压到<presets-root>/<dir>/,并添加一条index.json条目,即可把它作为预设提供。

postext包读写的也是这些文件(openBundle、createBundle、buildBundle;见文件包)。在这里导出的书可以在你自己的程序中打开,你的程序写出的书也可以在这里打开。这样,沙盒就成了检查和微调程序排版结果的地方:从程序中导出,在这里导入,借助实时预览修改,再次导出,然后载回程序。智能体技能交付的移植结果也是.postext文件。

正文和版面设计也可以分别从正文面板和版面设计面板的标题栏导出。

版面设计面板的标题栏会下载去掉默认值的postext-config.json:

{
  "type": "postext-config",
  "version": 1,
  "config": { ... }
}

正文面板的标题栏把当前章下载为普通的.md文件,它的导入按钮用一个.md文件的内容替换当前章。版面设计面板的导入按钮会打开文件选择器,选取.json文件,并按预期的type和version进行校验;无效文件会被静默忽略。早期版本的postext-markdown.json包装格式和合并的postext-sandbox.json格式已不再存在。