LCD 是 Lantern 漫画作品的结构协议。本文解释稳定的产品语义、对象归属和写入不变量,不承担源码导航或实现说明。
LCD 保存一话漫画已经确认或正在编辑的作品事实,供工作台编辑、候选预览、阅读、导出、保存快照和复制漫画共同使用。
故事层:StoryboardBeat(讲什么)
作品层:PresentationUnit → PageSurface → Frame(怎样组织给读者看)
画面层:Frame → Layer → Element(画格里怎样呈现)
工作流层:Candidate / AgentDraft → ChangeSet → ChangeProposal → WorkingRevision / SavedSnapshot
这些层可以互相引用,不能互相替代。LCD 不保存对话消息、任务进度、选择状态、临时预览、画布图片卡摆放或签名资源 URL。
| 用户概念 | 协议对象 | 规则 |
|---|---|---|
| 单格画面 / 分镜条目 | StoryboardBeat |
叙事计划,保存简短标题和自然语言描述,不是页面元素。 |
| 展示单元 | PresentationUnit |
一次共同阅读与编排的坐标空间。 |
| 纸面 | PageSurface |
最终导出的一张物理页或条漫切片。 |
| 画格 | Frame |
页面上的漫画格容器,拥有形状、位置、层级、阅读关系和格内图层。 |
| 格内成稿 | ArtElement |
固定资产版本在画格中的视觉实例,拥有局部变换与取景。 |
| 对白 | Dialogue |
谁说什么的语义事实。 |
| 气泡 | BalloonElement |
对白在画面中的视觉实例。 |
| 文字 | TextElement |
旁白、说明和拟声字等独立文字实例。 |
一个 StoryboardBeat 可以尚未进入页面、被多个画格表现,或与其他条目共同进入蒙太奇画格。一个 Frame 最多有一个 primary 叙事引用,并可带多个连续性引用。对白独立于 StoryboardBeat 和气泡,因此修改台词不破坏气泡位置,移动气泡也不改写叙事内容。
ComicDocument
├─ reading
├─ resources[]
├─ dialogues[]
└─ units[]
├─ surfaces[]
├─ frames[]
│ └─ layers[]
│ └─ elements[]
├─ overlayLayers[]
└─ readingSequence[]
PresentationUnit、PageSurface 和 Frame 分别解决共同阅读空间、最终输出切片和画格容器,不能合并成一个通用 Canvas。
- 单页:一个展示单元包含一张纸面。
- 真正双页:一个共享坐标空间包含左右两张纸面。跨页对象只保存一次,导出时按纸面裁切。
- 条漫段:使用纵向长画布;相邻普通段可合并为包含多个
segment纸面的复合滚动段。跨段对象在共享坐标空间只保存一次,各物理段仍可独立导出。 - 固定四格:复用页面、画格和阅读顺序协议,不建立另一套元素模型,也不纳入产品推进与验收范围。
展示单元可以保存可选名称;名称为空时,界面根据类型和阅读顺序生成默认名称。修改条漫段比例只改变画布与纸面的底部高度,不缩放或移动既有内容;目标高度不能裁掉任何 Frame。删除展示单元同时删除其阅读顺序项,但一话至少保留一个展示单元。
阅读器把两个相邻单页并排显示只是查看方式,不会自动制造真正双页。真正双页在任何查看模式下都保持完整;相邻普通页和滚动段只有经过显式合并,才获得共享坐标空间。页面角色为 story、cover 或 interlude:封面至多一个且固定在一话首位,不占用正文物理页码并保持单页;只有同角色的正文页或过场页可合并为真正双页,角色创建后不可更改。
Frame 是格内内容的父容器。每个 Frame 可以包含:
- ArtLayer:成稿、背景、前景、人物和道具图片。
- TextLayer:气泡、旁白、说明和拟声文字。
- EffectLayer:速度线、网点、聚焦和其他画格内效果。
图层具有明确的 zIndex、显示、锁定和 overflow 语义;元素只能进入与类型匹配的图层。画格形状、边框、遮罩与内容分离,无框、矩形、多边形和椭圆都不需要改变格内元素结构。
页边出血仍是普通 Frame。bleedEdges 分别记录上、右、下、左是否延伸到所属 PageSurface 边界;开启某边时 geometry 覆盖至该边界,mask.mode 为 bleed,格内内容继续按画格形状裁切,仅省略对应页边的边框。四边可独立组合,未开启的边保持原边框;真双页的普通画格以所属 surface 为边界,跨页格以完整展示单元为边界。
普通矩形画格可以直接调整为四角多边形。四个点按左上、右上、右下、左下顺时针保存为 Frame.shape.points,使用画格包围盒内的归一化坐标;Frame.geometry 始终保存实际四边形的包围盒。一次角点调整只沿横轴或纵轴移动一个点,向外移动时重新计算包围盒并归一化其他点,不改写格内元素、阅读顺序或层级。格内裁切、边框、工作台、预览和导出都读取同一形状。
展示单元还可以拥有 Unit Overlay。它用于不属于普通格内裁切的对象:
- Frame 锚定:对象跟随画格移动,但在展示单元层合成,用于人物破框或气泡破框。
- Unit 锚定:对象属于整页或双页共同空间;
page_content承载无格图和纸面对白,narration承载不绑定 Frame 或单一 PageSurface 的纸面旁白,其他用途区分跨格、跨页、全页效果和装饰。
漫画对象不使用任意嵌套树解释视觉关系,而是分别声明归属、锚定、合成、裁切和顺序。归属决定对象属于 Frame 还是 PresentationUnit;锚定决定对象随画格还是随展示单元移动;合成决定对象进入格内图层还是 Unit Overlay;裁切决定对象受画格、纸面或不受局部边界裁切;Frame 与 Unit Overlay 的 zIndex 共享同一视觉层级空间,格内图层只决定画格内部顺序;视觉 zIndex 与阅读顺序始终独立。
PageSurface 只定义最终输出切片,不建立新的对象父子层级。普通画格的 surfaceScope 默认为 surface,显式设为 unit 时成为跨页格;Unit 锚定的普通纸面对象用可选 surfaceId 声明移动与缩放边界,cross_page 和 cross_segment 不设置 surfaceId。标准状态如下:
| 状态 | 归属与合成规则 |
|---|---|
| 画格 | 属于 PresentationUnit,使用 Unit 坐标;默认完整位于一个 PageSurface,画格遮罩只作用于其格内元素。 |
| 跨页格 | 只存在于真正双页,surfaceScope: unit 允许画格跨越中缝;其主图仍属于 Frame 并按画格遮罩裁切。 |
| 普通格内图片、气泡、文字或效果 | 属于并锚定 Frame,在 Frame 内合成,按画格规则裁切。 |
| 破格对象 | 属于并锚定来源 Frame,在 Unit Overlay 合成,不受来源画格裁切。 |
| 绑定真出格前景 | 是 Frame 锚定的 breakout 图片投影,通过 projection 引用来源 Frame 内的一张图片;透明前景在画格外合成,取景和局部变换由源图统一控制。 |
| 无格图、纸面对白、旁白或装饰 | 属于并锚定 PresentationUnit,在 Unit Overlay 合成。 |
| 跨格对象 | 在 Unit Overlay 合成;需要跟随来源画格时使用 Frame 锚点,否则使用 Unit 锚点。 |
| 跨页对象 | 只存在于真正双页的共享 PresentationUnit;跨页图片和气泡位于 cross_page 覆盖层,保存一次并由左右 PageSurface 分别裁切。 |
| 跨段对象 | 只存在于复合滚动段的共享 PresentationUnit,保存一次并由各 segment PageSurface 分别裁切。 |
narration 是 Unit 锚定的 TextElement,不设置 surfaceId、不关联 Dialogue,也不持久化对象编号;它统一承载旁白、说明字与无气泡对白,具体语义由文案和使用位置表达。编辑器按当前展示单元顺序派生两位编号。它可以跨越画格、纸面中缝或滚动段边界,视觉合成固定高于普通画格和覆盖对象;拆分复合展示单元时,跨越分隔线的旁白与其他跨面对象一样阻止无损拆分。拆分以实际几何范围为准:完整位于单一 PageSurface 的 cross_page 或 cross_segment 对象随该纸面拆出并转为普通 page_content,不因原有用途标签单独阻塞。基础样式为透明背景、20 号黑字和白色描边,横排默认约 6 字 × 1 行。切换横竖排时直接对调当前文字框的宽高并保持中心位置,因此默认竖排约为 1 列 × 6 字;列内从上到下,存在多列时从右到左,数字和英文逐字正立。
| 叠格 | Frame 仍是同级对象,只改变重叠许可与 zIndex,不形成父子关系。 |
无框画面仍是 Frame,只是边框为 none;无格图才是直接属于 PresentationUnit 的图片对象。自由分组、嵌套画格和完整图层树属于专业能力,不能成为普通破格、跨格或叠格的前置条件。
Frame.geometry使用展示单元坐标。- Frame 内元素使用相对画格的局部坐标;
0,0,1,1表示填满画格。 - Unit 锚定的覆盖元素使用展示单元坐标;Frame 锚定的覆盖元素保持相对画格的稳定关系。
- 移动画格只修改 Frame,不同步改写任何格内元素。
- 调整格内取景只修改
ArtElement.crop。 - 在格内移动人物或道具只修改元素的局部
transform。
普通移动只修改当前坐标空间内的位置,不能隐式改变归属、锚点、合成层或裁切。跨层变化必须使用显式能力;Frame 锚定对象提升到 Unit Overlay、收回 Frame 或改为 Unit 锚定时必须保持视觉位置,并作为一次可撤销变更提交。
绑定真出格使用两份不可变图片版本表达同一构图:Frame 内源图提供完整画面,覆盖层前景提供透明主体。前景 ArtElement.projection.kind 为 frame_image_breakout,sourceElementId 必须指向锚定 Frame 内的图片;前景只允许使用 PNG 或 WebP,不能复用源图版本。源图与前景的像素尺寸在资源尺寸可知时必须相同,前景保留完整画布原点,不允许为了减小文件而裁紧主体。
绑定期间,前景的 transform 和 crop 必须与源图一致。移动或缩放画格由共同 Frame 锚点自然同步;调整源图局部变换或取景时原子更新前景。前景不能独立修改这两项属性,替换源图前必须先移除绑定;删除源图同时删除所绑定前景。把前景显式转换为普通纸面图片时,先固化当时的变换与取景并清除 projection,之后它才成为独立对象。LCD 不保存抠图选区、生成参数或临时遮罩,透明通道属于固定前景资源本身。
画格默认保持在纸面内且禁止重叠;允许叠格时必须显式改变布局策略并确定 zIndex。不得通过复制对象、同步两套绝对坐标或 CSS 偏移伪造破格、叠格和跨页关系。两个相邻单页的并排查看不是共享坐标空间,不能承载一个跨页对象。
reading.unitOrder 是展示单元顺序,PresentationUnit.readingSequence 是画格顺序,画格内的 textOrder 可以进一步确定气泡与文字顺序。
数组位置、视觉坐标和 zIndex 都不能代替阅读顺序。日漫从右到左、不规则页面、叠格和跨页仍使用同一套显式序列。跨页画格只出现一次,不在左右纸面复制 ID。
漫画级默认阅读方向只用于初始化新建一话;一话创建后,以该话 LCD 的 reading.direction 为实际阅读与导出依据。修改漫画默认值不会静默改写已有工作稿或保存快照。
页漫双页查看按 unitOrder 自动分组:封面独立显示且不参与计算;其后的第一张 story 或 interlude 单页独立显示,随后相邻的 story 或 interlude 单页两两成组。双页分组中被真正双页、封面或章节结尾切断的普通单页,附带一个虚拟补位页;它只辅助工作台编排,不写入 LCD、快照或导出。每个非末尾展示组的末页是阅读器的自动翻页点;该点不改变页面坐标、对象或单页导出,也不限制真正双页合并。真正双页始终作为独立展示组。
LCD 只保存稳定的素材与版本标识、媒体类型和必要尺寸,不保存临时访问地址或代理路径。工作台读取时再把协议与短期有效的资源地址组合。
独立 LCD JSON 仍然只表达作品协议,不嵌入图片二进制。完整 LCD 归档是 LCD 之外的一话传输容器:它固定组合一个 SavedSnapshot 的 LCD、分镜条目、资源清单和 LCD 引用的图片文件。导入时资源与分镜标识重新映射到目标创作空间,所有引用必须同时更新并重新通过 LCD 校验;归档不能成为另一份运行时作品事实源。完整归档的导出与导入共用同一格式版本、清单结构和校验规则;LCD 对象、分镜、固定资源版本或媒体类型变化时,必须在同一次交付中同步两个方向,导出端不得生成当前导入端无法完整接受的归档。
工作稿、候选、保存快照、导出和复制漫画都必须固定资源版本。资源产生新版本时,不自动替换其他画格、章节、候选或快照已经引用的版本。
BalloonElement 和 TextElement 可以通过可选 appearance 引用一个已经声明的图像资源版本,用于表现型气泡轮廓和复杂拟声字。引用只包含稳定的资产与版本标识,不保存 SVG 路径、生成提示词或编辑器参数。缺少外观引用时按原生形状与文字样式渲染;存在引用时,气泡仍保留 Dialogue、位置和文字样式,文字仍保留内容与角色语义。编辑、预览、导出、快照和复制必须读取同一个固定版本。
原生切角对白使用 shape: cut_corner,并在 cutCorners 中保存四个角沿水平和垂直方向的八个归一化基础参数,视觉投影使用其两倍切入幅度。每次主动切换到该形状时生成一组新的参数,随后不随文字、字号、边框、缩放、保存或重新渲染变化;主体固定为无尾八边形,并保留足够长的上下左右边,不把矩形压缩成菱形。
画布图片卡属于工作台辅助层,不进入 LCD。把图片放入成稿时,必须在目标 Frame 图层或 Unit Overlay 中创建元素并固定引用资源版本。
所有作品修改都通过 WorkspaceCommand,不开放任意 JSON Patch。写入词汇按对象层级分为:
- 展示单元与编排:新增展示单元、替换当前单元布局、替换章节布局或完整呈现。
- 画格:新增、删除、移动、缩放、调整样式和层级。
- 格内内容:设置取景与变换,增删、复制元素和调整图层顺序。
- 对白与气泡:修改对白内容、气泡形状、位置、尾巴、样式和可选外观引用。
- 文字外观:为语义文字设置或清除固定版本的视觉外观。
- 叙事条目:创建并绑定单格画面,更新或替换 StoryboardBeat。
页面重排只能改变展示结构,并按稳定 Frame ID 保留既有图层、成稿和对白。新增或删除画格必须显式表达;只有完整呈现替换才能替换格内内容。
手动界面和 AI 协作调用同一组命令与校验语义。一次 WorkspaceChangeSet:
- 固定
baseRevision; - 包含一组同源命令;
- 全部成功才推进其所属的 WorkingRevision 或 AgentDraft revision;
- 任一命令失败则不写入;
- 作为一次 Undo / Redo 的原子单位。
确定性手动编辑可以直接提交 ChangeSet。AI 生成、结构调整、多对象操作和其他高风险结果先成为 Candidate,记录基准 revision、影响范围和命令,不能静默覆盖工作稿。
候选预览组合“当前工作稿 + Candidate”,允许在适用时切换工作稿与候选结果、应用或取消预览。预览本身不创建 revision;应用后只创建一次原子 ChangeSet。Candidate 基于旧 revision 且无法安全应用时必须标记过期并拒绝写入。
SavedSnapshot 是用户显式保存后不可变的阅读和导出基线,后续编辑不能原地改写。回到历史版本通过复制其内容创建新的 WorkingRevision 与 SavedSnapshot,历史只向前增长;用户确认删除某个 SavedSnapshot 时,仅可回收已证明不再被任何作品版本、草稿、画布、资产或封面引用的固定图片版本。
外部 Agent 对一话的连续编辑属于独立 AgentDraft,不直接推进正式 WorkingRevision。AgentDraft 固定一个正式基线,并以不可变草稿 revision 保存每次 ChangeSet;任务完成后冻结为 ChangeProposal。ChangeProposal 不是 LCD 对象,也不是正式版本,只固定审查所需的草稿 revision、基线和资源引用。用户接受方案时,Lantern 在一个事务中创建新的正式 WorkingRevision 与 SavedSnapshot,并把冻结方案标记为已应用后继续保留,不能因生成正式版本而删除。当前工作稿已偏离基线时,方案标记为过期且不得静默合并;用户查看差异并确认覆盖风险后,仍可显式应用冻结的方案内容。正式 SavedSnapshot 只形成线性历史。
- 所有作品对象 ID 在文档内唯一。
unitOrder与readingSequence完整且无重复,引用对象必须存在。- 画格必须位于有效展示单元;重叠由
layoutPolicy明确允许或禁止。 - 图层与元素类型匹配,层级、显示、锁定和 overflow 值有效。
- 图片和元素外观引用已声明的资源版本;外观必须是图像资源,气泡引用已声明的 Dialogue。
- 真正双页恰好拥有左右纸面;复合滚动段只包含 segment 纸面;跨页和跨段对象都只有一个事实来源。
- 局部坐标、Unit 坐标和纸面裁切不能混用。
- 命令只能影响声明的协议层、对象与作用范围。
- 编辑、预览和导出对同一文档得到一致的对象数量、层级、裁切、可见性和边框。
| 场景 | 协议表达 |
|---|---|
| 普通页漫 | 单页展示单元 + 显式画格阅读顺序 |
| 双页大图 | 双页展示单元 + 一个跨越两张纸面的 Frame 或 Unit Overlay 元素 |
| 条漫 | 多个纵向展示单元,以 unitOrder 连接 |
| 跨段长图 | 复合滚动段 + 一个 cross_segment Unit Overlay 图片 |
| 无框画面 | Frame 边框为 none,内容仍属于 Frame |
| 无格图 | Unit 锚定的 Unit Overlay 图片元素 |
| 人物破框 | Frame 锚定的 Unit Overlay 元素 |
| 纸面对白或旁白 | Unit 锚定的 BalloonElement 或 TextElement |
| 跨格拟声字 | Unit 锚定的文字或效果元素 |
| 叠格 | 同级 Frame + 显式重叠许可 + 独立 zIndex 和阅读顺序 |
| 表现型气泡 | BalloonElement 保留对白语义并引用固定版本的视觉外观 |
| 复杂拟声字 | TextElement 保留文字语义并引用固定版本的视觉外观 |
| 格内取景 | 修改 ArtElement.crop |
| 页面重排 | 替换布局并按 Frame ID 保留格内内容 |
LCD 不定义笔刷、像素级绘制、复杂矢量编辑、实时协作算法或完整出版印前规范。它只提供稳定的漫画结构、版本引用、确定性写入和渲染边界,使人类编辑、AI 候选、阅读与导出共享同一作品事实。