ADR-0109:正文连续分栏使用可保存的语义容器
- 状态:接受。
- 日期:2026-11-02。
背景
Java 组件 ContinuousColumns 能生成多栏 PDF,但离线 XML 模板和设计器不能直接保存、编辑其连续正文。学术文章还需要在多栏正文中插入通栏图表,再从同页剩余区域恢复多栏。把多栏模拟成表格或固定坐标,会丢失连续内容及修改后重新分页的语义。
决策
模型层新增不可变 ColumnFlow,保存 ID、有序子块、栏数、pt 栏距、平衡及可选宽度比例。模板层新增 DocumentTemplate.Columns 与正文 <columns>,编译/绑定/保存只依赖模型。布局层负责跨物理栏与页面继续内容,后端只消费最终绘制指令。
布局沿用真实 ParagraphFragment/TableFragment,保留子块 ID、原文 UTF-16 和宿主根索引;额外的无绘制容器片段提供设计器几何。来源树递归收集真实后代,使字段、链接及来源预算不依赖把宿主直接强制转换成段落/表格。
通栏图表作为两个 ColumnFlow 之间的普通根级块。前段在实际最高栏结束后交回正文,后段使用当前页剩余高度;不足时正常续页。设计器通过拆分容器插入通栏对象,复制全部栏设置、生成唯一 ID 并避免空段;动态节点只允许在完整节点边界拆分。
首版仅接受 1~3 栏的 Paragraph/Table 语义,不支持嵌套分栏、格内/页区分栏及列内显式分页或 keep-with-next 链。平衡试排、预算和取消有界。不可靠的组合明确拒绝,不静默降为普通正文。
DOCX/Web 原生多栏不在本批次。直接导出拒绝,统一转换为 COLUMN_FLOW 显式 DEGRADE 时展平内容并报告真实布局损失。源码 ZIP 保留完整分栏结构;有损输出不夹带源副本冒充原生支持。
结果与边界
连续文章、多栏与通栏的交替、编辑后重排和 XML/ZIP 往返使用同一语义模型。现有 ContinuousColumns 不改变其 Java 组件边界。
本决定不新增通用栅格容器。任意跨若干栏的区域、自由图文并排和栅格分页应独立建模,再与连续分栏组合;不把连续文章强行拆成固定网格,也不将既有 GridTable 或 CSS Grid 子集称为完整设计器栅格系统。