微信公众号纯文字 Zine 排版
把 Markdown 排成一份安静的欧洲古典文学杂志:全衬线、居中刊头、罗马数字章节、首字下沉、点线目录、花饰收尾。主题只控制视觉,模块控制章节节奏,篇幅控制阅读密度。同一文章可以混用多种章节骨架,但正文段落始终保持同一种正文外观。输出专为微信公众号后台粘贴设计:只使用普通段落与内联样式,粘贴后样式不丢、不乱码。
工作流
- 读取完整 Markdown,保持源文件不变。
- 读取 references/design-system.md。
- 需要指定主题、密度或章节模块时,按 references/config-schema.md 创建配置。
- 生成单篇:
bash
python3 scripts/render_zine.py <input.md> --config <config.json> [--theme <theme-id>]
- 用户未指定主题时不追问:按可见字符数自动选择主题与密度;每章再按内容特征选择模块。
- 用户要求比较时生成双轴预览:
bash
python3 scripts/render_zine.py <input.md> --config <config.json> --preview-all
- 检查原文零缺失、模块多样性、手机宽度和公众号兼容性。
三层系统
- 视觉主题:
mimeo、feuilleton、kraft、herbier。只改变纸色、墨色与专色;全部为全衬线气质。 - 阅读密度:
compact、balanced、longread、reference。按全文篇幅控制段距、章节距和目录。 - 章节模块:
manifesto、numbered-essay、quote-led、checklist、field-notes、margin-notes、split-argument、closing。
运行 python3 scripts/render_zine.py --list-themes 或 --list-modules 查看清单。详细选择规则见 references/design-system.md。
选择优先级
- 主题:
--theme> 配置theme> 全文篇幅自动选择。 - 密度:配置
density> 全文篇幅自动选择。 - 章节模块:配置
section_modules> 章节语义自动选择。
自动编排必须尽量让三章以上文章出现至少两种模块、五章以上出现至少三种模块;有明确语义的引文、清单、材料和结语优先,不为多样而破坏内容逻辑。
编辑边界
- 保留首个 H1 作为文章标题,正文不重复显示。
- 不改写标题、正文、引文、列表和内容顺序。
deck、pull_note、作者和版权只有原文或用户提供时才使用。- Markdown 图片只保留轻量位置提示,不参与视觉主题或篇幅选择。
- 只有 Markdown blockquote 才能显示为居中细线引文;不得把普通段落视觉化为引用、旁注、卡片或材料。
- 所有 H2 小标题必须使用同一标题骨架:居中罗马数字、衬线标题、居中短细线完全一致;模块只能改变标题之后的正文结构。
- 每章最多一个正文视觉动作;差异来自正文版心、首字下沉、首段、清单、材料和留白,不来自满篇框线与反色块。
- 文章正文不显示模块 ID、选择理由或
NOTE、ARGUMENT等技术标签。 - 不使用远程字体、外链 CSS、脚本、动画、伪元素或
float。 - 不使用
<blockquote>、<table>、<aside>标签:引文用带data-text-role="quote"的普通段落、清单台账与目录用悬挂缩进段落实现,避免微信后台粘贴时覆盖样式或拆散结构。 - 关键样式写在元素
style属性中。
输出
- 单篇:
公众号HTML输出/原文件名_zine-theme-id_微信公众号版.html - 双轴预览:
公众号HTML输出/原文件名_zine主题预览/00_Zine主题总览.html - 模块目录:同目录
01_Zine版式模块目录.html - 清单:同目录
manifest.json,记录主题、密度、每章模块和选择原因。 - 指定目录:
--output-dir <目录>。
禁止覆盖已有文件;存在时使用 -v2、-v3。
质量门槛
python3 scripts/render_zine.py --self-test
再确认:
- 四个主题使用同一章节编排,证明主题与结构已分离。
- 八种模块均能独立渲染,自动编排不会整篇单一骨架。
- 全文所有
data-text-role="section-title"的style属性完全相同。 - 所有普通段落都带
data-text-role="body",且不在blockquote内、不带卡片背景和粗左边线。 data-text-role="quote"的数量与 Markdown blockquote 数量一致;配置的 pull quote 只能使用明确的原文句子。balanced篇幅不因章节多就强行插入目录;只有longread与reference显示目录。- 1200、3000、5000 字密度边界和主题边界正确。
- 原文标题、正文、章节、引文和列表零缺失。
- 390px 手机宽度无横向溢出。
- 无脚本、远程资源、外链字体、
float、伪元素,以及<blockquote>/<table>/<aside>标签。 - 最终仍需在微信公众号后台手机预览。