--- name: ppt description: 生成 PowerPoint 演示文稿 (.pptx)。当用户要求做汇报 PPT、把材料/会议纪要/方案转为幻灯片、生成演示稿时使用。 --- # PPT 把材料变成可演示的 .pptx。**先定调,再出稿,再验收** —— 不要一口气把整份 deck 丢出去。 ## 资源 - `references/design_principles.md` —— 画布尺寸 + 字号/配色/留白/字数预算等硬规则 - `references/layouts.md` —— 9 种版式的 python-pptx 起手代码 + 安全区/越界保护 + `apply_brand` 品牌条 - `references/icons.md` —— 业务图标两层:Iconify (在线/本地缓存) / unicode 字形兜底 - `assets/icons/` —— 本地图标缓存 (Iconify 拉过的图存这,见 `INDEX.md` 推荐清单) - `scripts/source_to_md.py` —— PDF/DOCX/PPTX/URL → 干净 Markdown - `scripts/fetch_icon.py` —— 从 Iconify CDN 拉 SVG/PNG (染主题色,缓存本地) - `scripts/render_icon.py` —— unicode 字形 → 透明 PNG (Iconify 没有时兜底) - `scripts/quality_check.py` —— 产物 .pptx 验收 (越界 / 文本溢出 / 颜色一致) ## 默认主题 — 商务红 (硬约束) **主色 `#C00000` / 辅色 `#E15554` / 强调色 `#FFC107`。** ⛔ **不允许擅自换色**。除非满足以下任一条件,否则 spec_lock 必须填这套红色: - 用户在请求里**明确**点名其它配色 (例:"做成蓝色"、"用我们公司的紫色") - 用户提供素材里有明确的 brand guideline / 配色卡 **禁止的自我合理化**(都属违规): - "这个场景蓝色更专业" / "学术汇报红色不合适" / "财务用蓝更稳重" - "我觉得 XX 主题更适合" 要换色,**先问用户**,不要在 spec_lock 里塞自己的偏好。其它备选见 `design_principles.md §2`。 ## 两阶段工作流 ### 阶段一: 策略 (Strategist) — 八条对齐 产物:`spec_lock.md` —— 整个 deck 的"宪法",阶段二每页前都要重读。 按下表**一次性给出推荐方案**,然后 ⛔ **BLOCKING:等用户确认/修改后才能进阶段二**。不要一条一条问。 | # | 项 | 默认值 | |---|----|-------| | 1 | 画布 | **16:9** (13.33×7.5 in) | | 2 | 页数 | **封面 + 5-8 页正文 + 尾页(Q&A)** = 共 7-10 页。**封面 / 尾页强制必有**,不在 5-8 页预算里 | | 3 | 受众 | 看材料推断:领导汇报 / 同行评审 / 客户 pitch | | 4 | 风格 | **现代简约** (白底 + 细线 + 留白) | | 5 | 配色 | **商务红** `#C00000` `#E15554` `#FFC107` (见上"默认主题") | | 6 | 字体 | **微软雅黑 + Arial** | | 7 | 图标 | **Iconify `tabler` 集** (描边商务图标,主色染色;`fetch_icon.py` 拉到 `assets/icons/` 缓存) | | 8 | 图表 | 数据 ≥ 3 个点的页用 matplotlib 配图 | 把这 8 项写进 `spec_lock.md`,以表格形式给用户预览,问一句"按这个开干?"。**spec_lock 写定后不再改**,有冲突回头跟用户重新对齐。 ### 阶段二: 执行 (Executor) — 逐页生成 每页前 **必须 read 一次 `spec_lock.md`**,只用里面定的颜色/字体/图标 —— **不允许凭记忆或临时发挥**。这条规则是为了对抗长 deck 中的上下文漂移。 每页流程: 1. 读 `spec_lock.md` (即使刚读过) 2. **图标先于版式**: 这一页要用什么概念图标? 先 `glob skills/ppt/assets/icons/` 看本地有没有,没有就 `python skills/ppt/scripts/fetch_icon.py --set tabler --color C00000 --size 128 -o skills/ppt/assets/icons/...` 拉一个;`add_picture` 嵌入。**几何形状(圆点/徽章/装饰线)不算图标,走 layouts.md helper 即可** 3. 写一个 `run_python` block,用 python-pptx 添加这一页 (载入已有 .pptx → append slide → save) 4. 报这一页:版式、标题、要点条数、用了哪些图标 5. 用户确认 / 微调后再下一页 **为什么逐页?** 一次性出全 deck 中途改方向就要全推翻;逐页能让用户在第 2 页就发现问题。 **例外**: 用户明确说"别问,直接全做了" —— 一次跑完,但跑完必须用 `quality_check.py` 验收。 ### 阶段三: 验收 ```bash python scripts/quality_check.py --spec spec_lock.md ``` 不通过的项,回头 edit 对应页。 ## 设计原则 (硬规则速查) - **每页一个核心信息**: 一页讲一件事,塞两件就拆页 - **bullet ≤ 5 条**: 超过就拆页或改成图表/双栏 - **正文不写完整段落**: 列要点;长句留给演讲者口述 - **数据 ≥ 3 个点应有图表**: 用 matplotlib 生成 .png 嵌入 - **中文标题 ≤ 30 字** - **配色三色封顶**: 主 + 辅 + 强调,其他用灰阶 - **少用大色块,多用细线 + 图标 + 留白** - **图标走 MSO_SHAPE**: 矢量、可编辑;复杂图标走 `render_icon.py` - **Shape 不能越界**: `layouts.md` 起手代码用 `assert_inside` 在生成时即报错 - **字数按预算来**: 写 bullet 前查 `design_principles.md §4.1` 字数预算表 - 详细规则见 `references/design_principles.md` ## 工作目录约定 下文 `` = system prompt 里「task_dir」给的**绝对路径**(形如 `…/workspace/tasks//`)。**所有产物都写到 task_dir 下**,不要写到 cwd / `skills/` / repo 根;`assets/icons/` 是 skill 自带的图标缓存,继续走 `skills/ppt/assets/icons/`。 ``` / ├── source.md # source_to_md.py 转出的素材 ├── spec_lock.md # 八条对齐落定 ├── slides/ │ └── chart_p3.png # 各页用到的图片素材 └── .pptx # 最终产物 (按主题命名) ``` ## 反模式 - 用户没给材料就开始硬编内容 - 八条没对齐就跑 python-pptx - **基于"场景判断"自行换配色**(见上"默认主题"违规清单) - **缺封面 / 缺尾页(Q&A)** —— 两端都是强制项,不算在正文页数预算内 - **裸白纸版式** —— 所有版式起手都必须 `apply_brand(slide, kind)`,见 layouts.md - **业务概念页只用几何形状** —— 比如"战略目标"页只摆圆点 bullet 没有 `target` 图标,视觉太单薄;按 §阶段二第 2 步先拉 Iconify 图标再做页 - 一个 `run_python` 出整 deck (中途改方向就要全推翻) - 跑完不做 `quality_check.py` 就交付 - 起名 `output.pptx` / `untitled.pptx` —— 务必按主题给文件名 ## 输出 完成后告诉用户:文件路径、页数、用到的版式列表、是否有未满足的 spec 项。问一句要不要再改。