参考稿风格 PPT 制作与改造流程
> 技能名:风格镜像(ppt-style-mirror)· 版本 1.1.0
> 一句话:拿一份参考稿,镜像出它的视觉体系;此后换风格只换「风格层」,内容一个字不动。
何时使用
- 用户提供一份参考 PPT(或说"参考某某的调性""按刚才那个风格"),要求做一份新的。
- 用户要求把已有的 PPT / deck 换一套视觉风格("下次我修改风格就按照这个来")。
- 用户要求多轮改造同一份 deck(改版式、改色彩、改署名、加页删页)。
- 需要让成稿的动效/转场与参考稿一致。
不适用:只做内容梳理不做视觉定制、或用户已有明确设计规范文件的情形。
核心心智模型:三层分离
整个流程成立的前提是把一件事拆成三层,各层只改自己的文件:
| 层 | 载体 | 内容 | 什么时候改 |
|---|---|---|---|
| 意图层 | STORY.md §① |
受众、场合、时长、内容边界(必讲/不讲/禁碰) | 只在需求变化时改 |
| 内容层 | STORY.md §②③ |
页面骨架、契约核对、逐页大纲与 anti_pattern | 只在内容变化时改 |
| 风格层 | DESIGN.md |
画布/色/字/版式/密度/配图/转场/母题 | 改风格只改这里 |
外加执行层:slides/NN.slide(每页一个 DSL 文件)。执行层同时含内容与样式,
所以改风格时改的是各页的样式属性(背景、字号、颜色、母版坐标),保留文案与信息结构。
> 不做这个分离的后果:改一次风格要把全部内容重写一遍,
> 且第二次改风格时已经找不到原始的内容结构了。
> 一旦分开,"换风格"就退化成"重写 DESIGN.md + 批量替换样式属性",内容一个字都不用动。
标准流程(八阶段)
Phase 0 · 立意图 —— 先写 STORY.md §①,再动任何设计
在写第一行 DSL 之前,把这几项落成文字(缺的用合理假设补齐并写明):
- 受众(年龄/身份/认知水平)—— 直接决定字数和句长。
- 场合与讲述时长 —— 直接决定页数与单页信息密度。
- 讲完后听众记住哪 2–3 件事 —— 写成行为句,不写"介绍 XX 知识"。
- 内容边界:必讲 / 不讲 / 禁碰。这一栏最能防止后期跑偏。
模板见 references/story-md-template.md §①。
Phase 1 · 拆参考稿基因 —— 跑脚本,不要靠肉眼
python scripts/extract_style.py "<参考稿.pptx>"
脚本输出八节:画布 / 主题色板 / 颜色使用排行(含页覆盖率)/ 字体 / 字号分布 /
转场与动画 / 几何母题 / 逐页文本量与图片数。这些数据直接对应 DESIGN.md 的各章节。
读报告的三个关键判据:
- 颜色排行看"页覆盖率":覆盖率 >0.8 的是页面底色;0.2–0.6 且次数高的是主文字色;
次数低但集中的是强调色(通常 2–4 个)。 - 转场那一节决定"有没有动效":
含 Morph 页数 == 总页数→ 参考稿用 Morph;
时长看durations_ms(常见 2000ms);含对象级动画的页 == 0→
成稿也不要加对象级动画,讲述节奏交给讲者。 - 字数中位数(不是最大值)→ 内容页字数上限的量级参考。
Phase 2 · 写两份规范
按 references/design-md-template.md 写 DESIGN.md(九节),
按 references/story-md-template.md 写 STORY.md(三节)。
规范里每个数字都要能追溯到参考稿或一场实际核对:写"珊瑚红约占 15%"而不是"用一点红";
写"标题 38px"而不是"标题大一些"。含糊的规范在执行时必然跑偏。
三件事在规范里必须显式写明,否则后期一定出事:
- 字体替换理由:参考稿字体本机没装时,写清"用 X 替换 Y,理由是性格等价",
不要静默换默认字体 —— 那是风格走样的第一大来源。 - 配图来源与版权:题材是具体作品/实物真迹时不可用生成式图像(会产出与事实不符的画面),
用公有领域高清扫描图并注明依据;带水印的素材写明避让矩形坐标。 - anti_pattern:逐页写"这一页不许出现什么",写具体可判定的,不写"要好看一点"。
Phase 3 · 内容确认(用户在环,不要跳过)
若用户需要先挑内容(选作品、选案例、选章节),先给候选让用户确认,再开始做。
不要替用户决定内容后一口气做完 —— 返工成本远高于问一句。
提问时一次只问最关键的 1–2 项,不要列一张问卷。用户赶时间时,
给"推荐方案 + 一句理由"比给五个选项更受欢迎。
Phase 4 · 逐页产出
- 一页一个
.slide文件,命名01.slide…NN.slide。 - 每页写完立刻
lint,要求ok: true, diagnostics: []:
bash slidep lint <deck.pptx> --dsl-file slides/NN.slide --page-index <N-1> - 版式坐标从既有配方里选,不要每页新发明:
references/layout-recipes.md§3 的七种页型。 - 全篇共用同一套 A/B/C 三区母版(
layout-recipes.md§1),标题与页码位置全程不变。 - 用 slidep / SlideDSL 落地时,先读
slidep-dsl-pitfalls技能:
<Text>在 flex row 里异常换行、容器高度系数、upsert-dsl的追加/替换语义、
媒体路径前缀等工具级硬坑都在那里,本技能不重复。
Phase 5 · 审阅 —— 自查通过不等于用户看得见
没有 MS Office 时,用自制链路渲染成 PNG 后逐页肉眼核对:
pptx --(zipfile 解析)--> SVG --(无头 Chrome)--> PNG。
必须按 references/layout-recipes.md §4.2 的缺陷清单逐页扫,重点五项:
图片边缘裁切、文字被拆列、兄弟元素重叠、child-containment 超界、渐变位置发暗。
再拼一张 contact sheet(3×4 网格)总览 —— 相邻页版式是否雷同、rhythm 有没有塌,
只有看拼版才能一眼发现。
留白页(元素少的页)还要做像素级核对:元素少,位置差 10px 肉眼就能看出来。
Phase 6 · 补转场(★ 必须是最后一步)
python scripts/add_transition.py "<deck.pptx>" # 默认 2000ms Morph
python scripts/add_transition.py "<deck.pptx>" --check # 只体检
顺序铁律:所有 upsert-dsl → 最后 跑一次转场脚本。
中间任何一次 upsert 都会重建 pptx 并把转场清空。
参考稿若用 Morph,写转场时命名空间一字都不能错:
p159 命名空间 = http://schemas.microsoft.com/office/powerpoint/2015/09/main
(不是 .../powerpoint/2015/main/9)
mc:Choice Requires="p159" (不是 "p14")
p159 声明在 mc:AlternateContent 上;p14 声明在 p:transition 上
写错时 XML 依然合法(能解析、lint 也过、字符串自查也命中),但 Office 会把
p159:morph 当未知元素静默丢弃 → 现象是「文件里明明有 morph,打开却一个动效都没有」。
最稳的做法是从参考稿里整段复制那段 XML,只改 dur。
校验三件套(脚本已内置,任一失败即回滚):
① 所有 .xml/.rels 可解析;② 含 morph 的页数 == 总页数;③ 每页 <p:transition 计数恰好 == 2。
Phase 7 · 交付与留痕
- 用
present_files交付成稿 + 拼版预览图。 - 同步更新:
DESIGN.md(页面映射表、页数、署名)、STORY.md(大纲、改造记录)、
工作区 memory(本轮改了什么、为什么)。 - 每轮用户反馈都要在 STORY.md 留痕(第几轮、原话、改了什么、为什么),
否则同一件事会被来回改。 - 若本轮发现了可复用的新坑或新做法,写回本技能或
slidep-dsl-pitfalls技能。
定向流程:只改风格
用户说"换个风格""按这份新参考稿的调性改一下"时走这条,内容一个字都不动:
- 对新参考稿跑
scripts/extract_style.py。 - 对比新旧基因表,只改
DESIGN.md:色板、字体、字号层级、版心坐标、密度门禁、
装饰母题、转场参数。STORY.md的 §②③ 保持不动。 - 逐页改
.slide的样式属性:背景色、字体栈、字号、颜色、母版坐标、装饰元素。
文案、信息结构、页面顺序、anti_pattern 全部保留。 - lint → upsert → 渲染审阅 → 最后补转场。
若新风格是"编辑式"(用户说"不要框框""要大厂方案"),
按 references/layout-recipes.md §2 的替换表逐项改:删除卡片容器 → 改细线分组,
强调色收敛到 ≤6 处真锚点,并列序号改墨色低对比数字。
若新风格换了配图来源,记得同步 DESIGN.md §5 的配图清单与版权依据 —— 版权信息不能丢。
定向流程:只改内容
- 只改
STORY.md§③ 的大纲,同步DESIGN.md§6 映射表的那一行。 - 改对应页的
.slide—— 样式属性全部照抄原有页面,只替换文案与信息块数量。 - 若页数变化:更新每一页的页码字符串(
NN / 总页数),漏改会在中间某页露出旧分母。 - lint → upsert → 审阅 → 补转场。
铁律清单
- 规范先于产出:
DESIGN.md没写完,不要动任何.slide。 - 顺序铁律:所有
upsert-dsl跑完 → 最后补转场。中间任何 upsert 都会清空全篇 morph。 - 命名空间照抄,不要凭记忆拼:涉及 OOXML 扩展元素时,从参考稿整段复制再改值。
"自查字符串命中" ≠ "Office 能识别"。 - 自查 ≠ 用户看得见:
lint过、XML 合法、字符串能搜到,都不能替代渲染后肉眼核对。 - 改风格不动内容:改风格只重写
DESIGN.md与各页样式层;内容层保持稳定。 - 每一页都要核对,不能抽查:用户会翻页;12 页里有 1 页没改署名,就是事故。
- 重复信息宁可删掉一行:兄弟元素重叠时,先看那句是不是和上面重复,是就直接删。
- 改造留痕:每轮反馈记进
STORY.md;新坑写回技能。
常见失败模式
| 现象 | 根因 | 对策 |
|---|---|---|
| 改了风格,内容也被迫重写 | 没有分离内容层与风格层 | 先建 STORY.md / DESIGN.md 双规范(本技能核心) |
| 用户打开完全没有动效 | 转场命名空间写错,被 Office 静默丢弃 | add_transition.py;命名空间从参考稿整段复制 |
| 转场只对最后几页生效 | 补转场后又跑了 upsert-dsl |
顺序铁律:upsert 全跑完再补转场 |
| 成稿比参考稿"土" | 每个信息块都套了圆角卡片容器 | 换编辑式:删容器、改细线、强调色收敛 |
| 页码露出旧分母 | 加了页但没改全部页的 NN / 总页数 |
批量改,逐页核对 |
| 署名/logo 换了宽度后版面破了 | 只改了元素本身,没改承载它的容器 | 见 layout-recipes.md §4.3 连锁改动清单 |
| 封面看着还行,翻到第 5 页版式崩了 | 只抽查了前几页 | 逐页渲染 + contact sheet 总览 |
| 结尾页很"满"却显得多余 | 收尾页又放了大图 + 要点罗列 + 道别 | 收尾页走纯留白(layout-recipes.md §3.7) |
| 字挤在一起 / 被拆成两列 | 中文长句里夹了半角空格 | 去空格 + 拆短句(layout-recipes.md §4.2-2) |
随附资源
scripts/extract_style.py—— 参考稿风格基因提取(只读参考稿,输出八节报告)。scripts/add_transition.py—— 幂等补写 Morph 转场,含孤儿媒体清理与三件套校验。references/design-md-template.md—— 风格层规范骨架(九节)。references/story-md-template.md—— 内容层规范骨架(三节)。references/layout-recipes.md—— 坐标级版面配方(三区母版 + 编辑式 + 七种页型 + 缺陷清单)。
配套技能:slidep-dsl-pitfalls(slidep / SlideDSL 工具级硬坑与无 Office 审阅链路)。