关于 powerpoint-slides
用于学术 PowerPoint 演示文稿全流程制作的技能,覆盖创建、编译、审阅、润色和验证。它通过 PptxGenJS 脚本生成演示文稿,并提供内容教学质量、版式和视觉检查流程。
主要功能
- 01从主题创建演示文稿
- 02执行脚本并生成 PPTX
- 03检查语法、排版与教学质量
- 04逐页审查视觉布局
- 05验证文件和演示文稿指标
适用场景
- 01根据论文制作学术演示文稿
- 02编译 PptxGenJS 脚本
- 03校对并检查幻灯片布局
- 04验证幻灯片并进行视觉检查
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ noi1r/ powerpoint-skill --skill powerpoint-slides安装后在 Claude Code 中输入/powerpoint-slides确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
diagram-rendering.mdformula-rendering.mdpptxgenjs-reference.mdreferences/themes.mdscripts/check_overlaps.pyinject_omml.pyrender_diagrams.pyrender_latex.pysoffice.pythumbnail.py详细介绍
PowerPoint 幻灯片工作流
学术 PowerPoint 演示文稿技能。完整生命周期: 创建 → 编译 → 审阅 → 润色 → 验证。
执行模式:Claude 编写 PptxGenJS(Node.js)脚本 → 执行 → .pptx。
数学公式:OMML(原生数学格式,默认)或 LaTeX → PNG/SVG 流程(段落模式回退方案)。
0. 快速参考
| 任务 | 命令 | 描述 |
|---|---|---|
| 根据论文创建 | create [topic] | 完整的 Phase 0-5 流程 |
| 执行 JS 脚本 | compile [file.js] | 运行脚本,生成 .pptx |
| 校对 | review [file.pptx] | 语法、错别字、一致性 |
| 视觉审查 | audit [file.pptx] | 逐张检查幻灯片布局 |
| 教学质量 | pedagogy [file.pptx] | 13 种教学模式 |
| 全面审查 | excellence [file.pptx] | 5 个并行 Agent 审查 |
| 视觉检查 | visual-check [file.pptx] | 系统检查 PDF→图像 |
| 验证指标 | validate [file.pptx] [duration] | 幻灯片数量、文件大小 |
| 提取图片 | extract-figures [file.pdf] [pages] | 提取论文图片用于幻灯片 |
解析 $ARGUMENTS 以确定要运行的操作。如果未指定操作,请询问。
1. 硬性规则(不可妥协)
- 先讲动机,再讲形式化内容 — 每个概念都先回答“为什么?”,再回答“是什么?”。定义必须放在具体背景中。
- 定义后 2 张幻灯片内给出完整示例 — 每个定义都必须在引入后的 2 张幻灯片内配上具体的完整示例。
- 电报式风格 — 使用关键词组,而非完整句子。幻灯片是演讲提示,而非讲稿。例外:每张幻灯片可用一句引导句来交代背景。
- 每张幻灯片都要物有所值 — 至少包含一个实质性内容(公式、图示、表格、定理、算法、图表)。如果一张幻灯片只有 3 条简短要点,没有其他内容,就必须合并或充实。
- 每张幻灯片最多 2 个强调卡片 — 过多会削弱重点。强调卡片是彩色框、标注形状或高亮区域。优先级较低的内容改为普通文本。
- 参考文献幻灯片 — 倒数第二张幻灯片(致谢页之前)必须列出重要引用文献。包括主要论文和 3–5 篇最相关的参考文献。
- 色盲友好型配色 — 优先使用蓝色 + 橙色;二元对比中绝不使用红色 + 绿色。文本与背景的 WCAG AA 对比度 ≥ 4.5:1。主题中需定义语义颜色。
- 字体大小层级 —
F常量对象定义默认基准值:封面 48pt、章节 36pt、标题栏 22pt、正文 15pt、小字 12pt、图注 11pt、卡片标题 18pt、表头 13pt、表格单元格 12pt。字号不得低于 10pt。当卡片或区域内容稀疏(文本占可用区域 <50%)时,在 QA 修正阶段将字号调大 2–4pt。 - 备用幻灯片 — 致谢页之后放置 3–5 张,用附录分隔页隔开。用于回答可能提出的问题:详细证明、扩展对比、补充数据。
- 每项任务完成后都要验证 — 执行 JS →
soffice→ PDF → 图像检查。未经视觉验证,任务就不算完成。 - 禁止使用 AI 标志性强调线 — 标题下方不得直接放置装饰线。这是 AI 生成幻灯片的典型特征,看起来不专业。
- 布局多样化 — 连续 3 张或更多幻灯片不得使用相同布局类型。在以下布局中交替使用:全宽、双栏、公式居中、数据强调、图标网格、时间线、表格、图表等。
- 公式渲染 — 展示型和行内公式默认使用 OMML(PowerPoint 原生数学格式)。段落式公式使用 600DPI PNG 或 SVG 作为回退方案。不得使用模糊的图片公式。
- 16:9 布局,0.5" 页边距 — 使用
LAYOUT_16x9(10" x 5.625")。四边均保留 0.5" 的留白。内容区域:9" x 4.625"。 - 不得重复使用 PptxGenJS 选项对象 — 该库会原地修改对象(例如,将阴影值转换为 EMU)。每次调用都必须创建新对象。使用工厂函数:
const makeShadow = () => ({...})。 - 十六进制颜色值前不得加 # — 使用
"FF0000",而不是"#FF0000"。前缀#会在不报错的情况下损坏输出文件。 - 保持视觉主题一致 — 所选配色方案应全局应用于幻灯片背景、文本颜色、公式前景色、图表颜色、强调卡片填充色和分隔线。不得使用偏离主题的颜色。
- 不得使用 Unicode 数学近似符号 — 卡片或文本框中的纯文本不得使用 Unicode 下标(₀、₁)、上标(ᵖᵉ)或特殊数学符号(∑、∏、∈、∀、∝)。所有数学符号——包括行内公式、带下标的变量、公式中的希腊字母——都必须使用 OMML(首选)或 LaTeX 图像管线(段落模式)渲染。卡片正文混排文本和数学符号时,使用 OMML 占位符表示单个公式,或将整个正文渲染为一张 LaTeX 图像。唯一例外:简单的单个拉丁字母(x、y、n)和不含运算符的普通数字。
- 纵向分布内容 — 标题栏下方的内容必须覆盖
CH垂直空间的 ≥75%。如果所有元素都集中在上半部分,说明布局有问题:增大卡片高度、增加间距、放大字号,或在底部添加总结/洞察卡片。每张内容幻灯片都应显得“充实”——最后一个元素下方不得留有大片空白。 - 内容密度下限 — 只有 ≤3 条简短纯文本要点(没有公式、图示、表格或卡片)的幻灯片过于稀疏——应与相邻幻灯片合并,或加入视觉元素充实内容。纯文本幻灯片不得超过整个幻灯片组的 20%。每张卡片都必须有足够文本,填满其内部区域的 ≥40%;否则应将字号调大 2–4pt,或合并卡片。
- 边界验证 — 每个元素都必须满足
y + h ≤ SH - M(5.125")。生成脚本时,务必在脑中核对每个元素的底边位置。常见陷阱:在表格下方堆叠卡片时未考虑表格渲染高度;addCardFormula中的公式图像高于卡片正文区域;双行卡片布局中第二行超出边界。使用addCardFormula时,公式高度参数fH必须 ≤cardH - 0.75(标题区域)。如果内容无法放入,应缩小卡片高度、减小公式的targetH,或拆分到两张幻灯片。视觉 QA Agent 必须特别标出任何底边被幻灯片边界裁切的元素。 - 参考文献幻灯片格式 — 严格采用单栏布局。将
CH平均分配给 N 条参考文献,每条垂直居中于其所在行。使用F.body.size字号(条目较多时使用F.small.size)。不加分隔线和装饰元素——仅使用均匀分布、填满页面的文本行。每页参考文献超过 8 条时,续排到第二张参考文献幻灯片。参考文献幻灯片必须分布均匀,不得在顶部或底部留有大片空白。 - OMML 后处理与尺寸调整 — PptxGenJS 生成 .pptx 后,运行
inject_omml.py,将{{MATH:id}}占位符替换为原生 OMML 数学公式。验证输出中不存在残留的{{MATH:占位符。OMML 公式在 LibreOffice 中显示为空白或变形属于预期现象,不是错误。视觉 QA 只检查图像公式是否清晰。OMML 尺寸关键规则:OMML 公式按文本框字号渲染,且不受文本框高度限制——\sqrt{}、\frac{}{}、\sum、\prod等高大的结构会在视觉上溢出文本框。为避免重叠:(a) 不得将 OMML 公式直接放在间距紧凑的卡片/表格上方或下方;每增加一层嵌套(分数、根式、大型运算符),额外预留 ≥0.15" 的垂直间距;(b) 含有根式、分数或堆叠运算符的复杂公式优先使用图像渲染(在 formulas.json 中设置"render": "image"),以遵守精确的像素尺寸;(c) 使用addMathText和F.body.size(15pt)时,简单公式的预期渲染高度约为 0.4",含有\sqrt{}或\frac{}{}的公式则最高可达 0.7";(d) OMML 公式必须放在两个元素之间时,应按公式高度为targetH参数的 1.5–2 倍来计算间距。 - 图示引擎选择 — 结构/流程图(架构、依赖、对比、树形图)使用 Graphviz。行为/时序图(序列、状态、甘特图、ER 图)使用 Mermaid。仅在数学内容密集或需要忠实复现论文时使用 TikZ。不要用 Graphviz 绘制序列图,也不要用 Mermaid 绘制复杂节点布局。
- 图示主题一致性 — 所有渲染的图示都必须使用当前主题的颜色。节点填充色 = 对应的
cardFill,边框 =ac.pos,文本 =tx.pri。最终输出中不得出现 Graphviz/Mermaid 的默认颜色(蓝色/黑色)。将--theme传给render_diagrams.py。 - 防止文本溢出并留足内边距 — PptxGenJS 文本框不会裁切溢出内容——超出文本框的文本会显示在框外,并与下方元素重叠。必须采取以下三项防护措施:(a) 在所有文本框上设置
shrinkText: true(映射到<a:normAutofit/>)。绝不得使用autoFit: true——它会映射到<a:spAutoFit/>,导致形状扩张。(b) 卡片文本使用const px = x + 0.25, pw = w - 0.4——距强调条留出 0.19" 空隙,距右边缘留出 0.15" 空隙。标题:(px, y+0.1, pw, 0.4);正文:(px, y+0.48, pw, h-0.62),并设置margin: [2, 0, 8, 0]。(c) 严格控制垂直间距:每个元素都必须在前一个元素底部之后 ≥0.1" 处开始。使用gap()辅助函数在生成脚本时进行验证。卡片/公式之间独立的addText调用是导致重叠问题的首要原因——始终根据前一个元素已知的底边位置计算 y 值,切勿估算。内容限制:卡片正文每英寸高度最多容纳 4 行简短文本。需要更多文本时,增大卡片高度或拆分内容。 - 图示来源标注 — 从论文中提取的图示必须通过
addFigure()图注注明来源(Source: Author et al., Year)。宽度 <800px 时,必须提醒用户投影显示可能模糊。不得提取表格;应使用 PptxGenJSaddTable()重新制作。 - 视觉优先规划 — 受众通过视觉锚点理解结构,而非项目符号列表。在阶段 2 中,针对每张幻灯片都要自问:“受众能否仅凭文本在 10 秒内理解内容?”如果不能,就需要添加视觉元素(图示、表格、图表或图片)。常见信号:多步流程、组件关系、数据对比、层级结构、数值趋势——这些内容几乎总是需要视觉呈现,而不是文字说明。阶段 2 自检:每个章节至少有 ≥1 个非公式视觉元素;零视觉元素(没有图示、表格、图表或图片)的幻灯片不得超过整个幻灯片组的 30%。
- 表格单元格公式 — 表格单元格中的数学符号(
O(n)、ε、∑_{i}等)必须使用 OMML 占位符({{MATH:id}}),绝不得使用 Unicode 近似符号或纯文本。将每个单元格公式加入formulas.json,并设置"render": "omml"。OMML 会自动继承单元格字号(F.tblCell.size= 12pt)。对于复杂结构(分数、大型运算符、堆叠表达式),如果会超出单元格高度,则使用图像渲染("render": "image"),且targetH≤rowH - 0.08。对于包含 OMML 的单元格,向addTable传入单元格对象:{text: "{{MATH:f42}}", options: {}}。 - 长表格分页 — 超过每张幻灯片行数限制(8–10 行数据)的表格必须拆分到多张幻灯片。每张续页都要重复表头,并通过
addTableCont()在幻灯片标题后添加 " (cont'd)"。在有意义的行组边界处拆分(例如算法系列、指标类别、数据集分组之间)——绝不得在组内拆分。最后一页至少应有 ≥3 行数据;如果不足,则与前一页合并。如果不同子集讲述不同内容,每页都应有自己的图注/要点。 - 根据图片宽高比设计布局 — 嵌入从论文中提取的图片时,根据其宽高比(取自清单元数据或测量尺寸)选择布局:宽高比 > 1.6(宽图)→ 使用
addFigure()居中、全宽放置。宽高比 ≤ 1.6(常规/高图)→ 使用addFigureWithText(),图片置左、文本置右。不得拉伸或裁切图片以适应布局——始终保持原始宽高比。根据清单计算figRatio:PNG 使用width_px / height_px,SVG 使用width_pt / height_pt。并排布局中,图片宽度上限为 CW 的 60%,以便为说明要点留出空间。 - 保持对齐一致 — 同一张幻灯片上的同类元素(例如多个卡片、多个要点、多个公式)应使用相同的 x 坐标和一致的宽度。偏差不得超过 ≤0.05"。在阶段 5 运行的
check_overlaps.py对齐检查会标出错位元素。常见问题:卡片列的 x 偏移略有不同、公式图像未对齐到同一中心轴、项目符号列表的左边距不一致。使用cols2()或手动定位列时,始终根据同一个常量推导 x 坐标,不得估算。 - 演讲者备注(可选) — 如果用户要求添加演讲者备注,或演示场合适合使用备注(例如读书会、答辩),则使用
addNotes(slide, text)为每张幻灯片生成备注。备注应为电报式演讲要点(每张 3–5 条),而非完整讲稿。包括:关键信息、到下一张幻灯片的过渡、听众可能提出的问题。备注嵌入 .pptx 的“备注”窗格中,可在演示者视图中查看。此功能为可选:仅在用户明确要求,或在阶段 1 询问后用户提出要求时生成。
2. 配色主题与视觉系统
5 种主题:Academic Light(默认)、Midnight、Ocean、Forest、Sandwich。
请阅读 references/themes.md,了解完整的主题 JSON 代码块、幻灯片母版定义、字体排版表、语义颜色、脚本模板和评分标准。这些内容将在第 4 阶段(脚本生成)和第 5 阶段(QA 评分)中用到。
关键要点(始终在上下文中):
- 每种主题有 4 种幻灯片母版:
TITLE_SLIDE、SECTION_SLIDE、CONTENT_SLIDE、THANK_YOU - 字体排版:Georgia(标题)+ Calibri(正文)
- 语义颜色:positive=
0173B2、negative=DE8F05、emphasis=029E73、neutral=8C8C8C - Sandwich 主题有两组公式颜色(浅色背景 + 深色背景变体)
2.1 布局类型池
| 布局 | 用途 |
|---|---|
title | 封面幻灯片 |
section-divider | 章节过渡 |
text-left-image-right | 概念 + 插图(55/45 分栏) |
two-column | 比较 / 并列内容 |
formula-centered | 以公式为主的幻灯片 |
formula-with-annotation | 公式 + 侧边注释 |
stat-callout | 大数字 / 关键结论 |
icon-grid | 带彩色图形的多个要点 |
timeline | 流程 / 历史进程 |
table | 数据比较 |
table-with-insight | 表格 + 下方的关键发现卡片 |
table-continuation | 长表格拆分页,并加上“ (cont'd)” |
chart | 图表展示 |
text-left-diagram-right | 文本 + 并排示意图(55/45 分栏) |
full-diagram | 全宽示意图 |
chart-centered | 图表 + 说明文字 |
figure-with-text | 提取的图示 + 说明要点(适配宽高比) |
full-image | 全幅图片 + 叠加层 |
references | 参考文献 |
thank-you | 结束幻灯片 |
backup | 备用 / 附录幻灯片 |
3. 操作
3.1 create [topic] — 完整流程(第 0-5 阶段)
协作式、迭代式的演示文稿创建。严格遵守阶段门槛——绝不跳过阶段。
第 0 阶段:材料分析
先阅读,再提问。 必须先理解内容,才能提出有意义的问题。
- 全面阅读论文 / 材料
- 提取:核心贡献、关键技术、主要定理、与先前工作的比较
- 整理符号约定
- 确定逻辑结构和适合制作成幻灯片的部分
- 记录:先决知识、自然的章节边界、可跳过或扩展的内容
暂勿展示结果或提问——直接进入第 1 阶段。
阶段 1:需求访谈(必须)
通过 AskUserQuestion 开展以内容为导向的访谈。问题根据阶段 0 的分析制定。
必问问题(始终提问):
- 时长 — 演示需要多长时间?
- 听众水平 — 听众是谁?(专家、研究生、普通学术听众)
- 先修知识 — 列出阶段 0 中具体的技术依赖项。询问听众了解其中哪些内容。
- 内容范围 — 将论文的实际组成部分作为选项提供。哪些内容需要重点强调、跳过或简要提及?
- 深度与广度 — 如果论文既有概述,也有详细构造,询问用户的偏好。
- 视觉风格 — 选择哪种主题?
- A) 学术浅色 — 白色/浅灰色,简洁精准(默认)
- B) 午夜 — 全程深色,科技感/高端感
- C) 海洋 — 蓝色调,专业学术风格
- D) 森林 — 自然绿色调
- E) 三明治 — 深色标题/结论页 + 浅色内容页
- 演讲者备注(可选)— 是否需要在演示者视图窗格中添加演讲者备注?适用于期刊俱乐部、答辩或排练。如果需要,将为每张幻灯片生成电报式要点。
幻灯片数量估算(每 1.5–2 分钟约 1 张幻灯片):
| 时长 | 幻灯片总数 | 引言/动机 | 方法/背景 | 核心内容 | 总结 |
|---|---|---|---|---|---|
| 5 分钟(闪电演讲) | 5-7 | 1-2 | 0-1 | 2-3 | 1 |
| 10 分钟(短讲) | 8-12 | 2 | 1-2 | 4-5 | 1 |
| 15 分钟(会议演讲) | 10-15 | 2-3 | 2-3 | 5-7 | 1-2 |
| 20 分钟(研讨会) | 13-18 | 3 | 2-3 | 6-9 | 2 |
| 45 分钟(主题演讲) | 22-30 | 4-5 | 5-7 | 10-14 | 2-3 |
| 90 分钟(讲座) | 45-60 | 5-6 | 8-12 | 25-35 | 3-4 |
演讲类型提示 — 不同形式需要不同策略。误判形式是糟糕演示的头号原因:
| 演讲类型 | 重点 | 常见错误 |
|---|---|---|
| 闪电演讲(5 分钟) | 一个核心信息,不讲背景 | 把完整演讲硬塞进 5 分钟 |
| 会议演讲(10-20 分钟) | 1-2 个关键结果,快速概述方法 | 技术细节过多,缺少全局视角 |
| 研讨会(45 分钟) | 可以深入探讨,但需要视觉节奏 | 满屏公式,没有示例 |
| 答辩/学位论文 | 展示掌握程度,系统全面地讲解 | 跳过动机,匆忙讲结果 |
| 期刊俱乐部 | 批判性分析,促进讨论 | 只做总结,不做评价 |
| 基金申请陈述 | 重要性 → 可行性 → 影响 | 技术性太强,没有充分说明“为何重要” |
节奏原则:将 40-50% 的时间用于核心内容(结果/技术)。连续讲解理论内容的幻灯片最多不超过 3-4 张,之后应加入演示示例或视觉休息——听众在连续听 5 分钟左右的形式化内容后就会失去兴趣。
阶段 2:结构计划(关卡 — 用户必须批准)
按章节制定详细提纲:
- 章节标题
- 分配的幻灯片数量
- 每张幻灯片的关键内容要点(1-2 行)
- 每张幻灯片的布局类型(来自第 2.4 节的布局池)
- 计划中的图示/图表(简要说明)
- 将要引入的符号
提交计划前的阶段 2 自检:
- 每个章节至少包含 1 个非公式视觉元素(示意图、表格、图表或图片)
- 没有视觉元素的幻灯片 ≤30%(R29)
- 每个多步骤流程、组件关系或数据比较都计划了视觉呈现,而不只是列出要点
提交计划并询问:结构是否合适?用户必须批准后才能继续。
阶段 3:公式准备
- 扫描阶段 2 的结构,将所有公式收集到列表中。包括表格单元格中的数学公式(R30):扫描每个规划的表格,找出含有下标、希腊字母、运算符或复杂度符号的单元格——每个单元格都要在
formulas.json中单独创建一个"render": "omml"条目。 - 编写
formulas.json,添加render字段("omml"|"image"|"auto";默认"auto"→ 段落→图像,否则→OMML):[ {"id": "f01-entropy", "latex": "H(X) = -\\sum_{x} p(x) \\log p(x)", "mode": "display"}, {"id": "p01-body", "latex": "\\begin{minipage}{8cm}...", "mode": "paragraph", "fg_color": "1A1A2E"} ] - 运行渲染器(仅渲染图像条目;OMML 条目仅生成清单元数据):
python ~/.claude/skills/powerpoint-slides/scripts/render_latex.py formulas.json formulas/ - 检查
formulas/manifest.json中是否有错误。修正 LaTeX,或回退为纯文本。
Sandwich 主题:OMML 公式会自动继承文本颜色,无需双重渲染。仅渲染为图像的公式(段落模式)需要两个变体:
[
{"id": "p01-light", "latex": "...", "fg_color": "2D3436", "mode": "paragraph"},
{"id": "p01-dark", "latex": "...", "fg_color": "FFFFFF", "mode": "paragraph"}
]
数学内容较多的段落(强制要求——硬性规则 18):扫描阶段 2 中规划的每个卡片正文和文本框。如果出现以下任一内容,文本必须渲染为 LaTeX 图像(不能使用 Unicode 近似字符):
- 下标或上标(x_i、e^{ax}、H_0)
- 方程中的希腊字母(α、β、Σ、∏)
- 带操作数的运算符(∈、⊆、∝、≥)
- 分数、求和、乘积、积分
对于独立公式(块级/行内):使用 OMML(默认的 render:"auto" 会处理此情况)。对于混合文本和数学内容的卡片正文:使用 \text{} 表示非数学词语,将整个段落渲染为单张 LaTeX 图像——在 formulas.json 中添加 "mode": "paragraph"(会自动路由到图像)。在阶段 4 中,通过 addFormula() / addCardFormula() 嵌入——这些辅助函数会根据清单自动路由。
错误恢复:如果 render_latex.py 在清单中报告错误("error": "..."),请修正 LaTeX 源码并重新运行。回退方案:在 PptxGenJS 中将其渲染为纯文本。
阶段 3-4 迭代:如果阶段 4 发现还需要其他公式,请将其追加到 formulas.json 并增量重新运行。
阶段 3.5:图表准备
- 扫描阶段 2 的结构,找出需要渲染的图表和视觉元素。
- 将每项分类到 5 层处理流程中:
- graphviz — 架构图、流程图、依赖关系图、神经网络图、树形图、对比图(DOT 语言)
- mermaid — 时序图、甘特图、饼图、状态图、ER 图
- tikz — 数学密集型图表、几何构造图、忠实还原论文的复刻图
- shapes — 简单的注释、箭头、高亮(PptxGenJS 原生图形——在阶段 4 中处理,不在此处处理)
- extract — 从论文 PDF 中提取图表(extract-figures 工作流)
- 编写
diagrams.json(架构说明见diagram-rendering.md)。 - MCP 预提取(针对没有
crop的type: "extract"条目): 对于每个此类条目,在运行批量渲染器前尝试使用 MCP 提取:mcp__pdf-mcp__pdf_extract_images(path=SOURCE_PDF, pages=PAGE, output_dir="diagrams")- 图像会直接以 PNG 文件形式保存到
diagrams/中(原始分辨率,不消耗令牌)。 - 根据返回的元数据,选取目标页面中最大的图像(
width * height最大)。 - 将文件重命名为与图表 ID 匹配:
mv diagrams/page3_img0.png diagrams/<id>.png - 如果 MCP 未返回图像或执行失败 → 留给
render_diagrams.py作为回退方案。 - 有
crop的条目始终跳过 MCP(页面区域提取需要 pdftoppm)。 - 批量渲染器会自动跳过磁盘上已存在
.png文件的 ID。
- 图像会直接以 PNG 文件形式保存到
- 运行渲染器:
python ~/.claude/skills/powerpoint-slides/scripts/render_diagrams.py diagrams.json diagrams/ --theme <theme_name> - 检查
diagrams/manifest.json中是否有错误。修正 DOT/Mermaid 语法,或降级为 PptxGenJS 图形。
**DOT 编写指南:**节点数最多约 15 个;水平流程使用 rankdir=LR,垂直层级使用 rankdir=TB;使用 subgraph cluster_* 进行分组。
**Mermaid 指南:**参与者数量 ≤6;支持的类型:sequenceDiagram、gantt、pie、stateDiagram-v2、erDiagram。
阅读 diagram-rendering.md,了解完整的 5 层架构文档、diagrams.json 架构、主题颜色映射和故障排除方法。
第 4 阶段:生成 JS 脚本并执行
编写完整的 PptxGenJS 脚本。先安装依赖:
npm ls pptxgenjs 2>/dev/null || npm install pptxgenjs
阅读 references/themes.md →“Script Template”部分,获取完整的入门模板,其中包含主题常量(T)、排版常量(F)、布局常量(SW/SH/M/CW/CY/CH)、幻灯片母版、addFormula() 辅助函数、图示辅助函数(addDiagram、addDiagramAt、addFigure)、图表辅助函数(addChart)以及语义辅助函数(sTitle、sectionSlide、addBullets、addCard、addTable、addNumCard、addFlow、cols2)。另请阅读 pptxgenjs-reference.md →“Layout Code Patterns”,了解 9 个可直接使用的代码块(包括图示和图表布局);阅读 formula-rendering.md 了解 LaTeX 流程,以及 diagram-rendering.md 了解图示流程。
所有字体大小都使用 F 对象,双栏布局使用 cols2(),常见模式使用辅助函数。切勿将字体大小硬编码,始终引用 F.body.size、F.title.size 等。
用户提供的图片(徽标、照片、屏幕截图):直接通过 slide.addImage({ path: "image.png", ... }) 嵌入。根据原始尺寸计算宽高比。使用 x: (SW - w) / 2 居中。无需特殊流程,只需确认文件存在。
脚本生成的关键规则:
- 始终使用工厂函数创建阴影、填充和其他选项对象
- 十六进制颜色前不要加
# - 文本数组项之间使用
breakLine: true - 列表项使用
bullet: true,切勿使用 Unicode 字符“•” - 对需要与形状精确对齐的文本框设置
margin: 0 - 对于
icon-grid布局,使用简单的彩色矩形或圆形作为视觉标记(形状,而非图标图片)
4a. 数学幻灯片模式
数学内容较多的幻灯片应遵循以下结构模板之一,以避免常见的公式缺乏背景说明问题:
定义幻灯片:
[Framing sentence: why this definition matters]
[Formal definition — display formula or card]
[Key properties / immediate consequences — 2-3 bullet items]
构造/算法幻灯片:
[One-line goal statement]
[Core equation / algorithm steps]
[Complexity or performance: prover cost, verifier cost, soundness]
比较幻灯片:
[Side-by-side table or two-column: prior work vs this work]
[1-2 lines highlighting the key difference]
定理 → 证明幻灯片(两张,切勿合并为一张):
Slide A: [Informal statement] → [Formal theorem in card] → [Why it matters]
Slide B: [Proof sketch — key steps only, ≤5 lines. Full proof in backup.]
见解/备注幻灯片:
[Observation the paper doesn't emphasize, or connection to related work]
[Why this matters / what it implies]
每张数学幻灯片都必须有明确的要点——即观众应从该幻灯片中记住的唯一内容。
4b. 内容密度上限
R4/R20 中规定了下限。上限则用于避免认知超载——内容过多的幻灯片比内容过少的更糟,因为观众什么也记不住:
- 每张幻灯片的项目符号或条目不超过 7 个
- 每张幻灯片展示的公式不超过 2 个(更多时应拆分到多张幻灯片)
- 每张幻灯片引入的新符号不超过 5 个
- 每张幻灯片的重点卡片不超过 2 张(R5 已涵盖此项)
每批内容完成后的密度自查:
- 统计不含公式、图示或表格的幻灯片数量;若占比超过该批次的 30%,则标记
- 统计仅包含不超过 3 个简短条目且无数学内容的幻灯片;考虑将其合并
- 统计超过上限的幻灯片;拆分或重新分配内容
4c. 表格最佳实践
布局与对齐:
- 列对齐:数字右对齐,文本左对齐,简短标签居中
- 每张幻灯片最多 6-7 列、8-10 行数据。更多时 → 拆分到多张幻灯片(R31)或突出显示部分内容
- 数值精度:同一列中的小数点对齐;有效数字位数保持一致(例如,全部使用“XX.X%”或“X.XX”);千位分隔符可选,但必须保持一致
单元格内容:
- 单元格中的数学内容必须使用 OMML(R30)——逐个检查所有单元格中的下标、希腊字母、运算符和复杂度表示法。将每项添加到
formulas.json,并设置"render": "omml"。将{text: "{{MATH:id}}", options: {}}传递给addTable - 对于混合文本和数学内容的单元格(例如,“实现 {{MATH:f12}} 加速”),使用单个 OMML 占位符包裹数学部分——
inject_omml.py会处理混合文本段 - 合并单元格:在单元格选项中使用
colspan/rowspan设置分组表头(例如,“复杂度”跨越“时间”和“空间”列)。合并深度保持 ≤2 层——更深的嵌套会影响可读性
突出显示与强调:
- 使用粗体或
ac.pos颜色突出显示关键单元格——吸引视线关注结果 - 对于比较表:将每行/列中的最佳结果设为粗体
- 对于超过 5 行的表格,使用条纹行(通过
addTablehelper)提高可读性
长表格分页(R31):
- 超过 8-10 行数据的表格 → 使用
addTableCont()拆分到多张幻灯片 - 每张续页都重复完整的表头行,并在标题中标注“ (cont'd)”
- 在逻辑分组边界处拆分;最后一页必须至少有 3 行数据
- 如果子集呈现了不同的观点,每页都应有自己的图注/要点
表格 + 洞见组合:
- 优先采用双区块布局:表格位于上方 60%,洞见卡片或关键发现要点位于下方 40%
- 表格下方必须有要点——至少添加一行
F.small.size图注 - 对于复现“论文表 1”:先呈现忠实复现的表格,再单独制作一张洞见幻灯片,突出显示最重要的 2-3 行/单元格并加以说明
4d. 算法与代码展示
- 每张幻灯片上的伪代码 ≤ 10 行。更长时,拆分为“高层概览”和“关键子例程”幻灯片
- 使用
ac.pos背景色突出显示关键行 - 在顶部清晰注明输入/输出
- 变量使用斜体,函数使用常规字重——全文命名保持一致
- 对于实际代码(非伪代码):使用等宽字体,只展示相关片段——绝不贴出整个源文件
批处理:如果幻灯片超过 20 张,按每批 8-10 张编写脚本。逐批自检内容密度和布局多样性。最终脚本为单个文件,只执行一次。
开场策略(任选一种):
- 提出一个观众无法立即回答的挑衅性问题
- 给出一个挑战既有假设的惊人统计数据
- 从现实中的失败/问题切入 →“我们如何解决这个问题?”
- 视觉演示——先展示现象,再进行解释
结尾策略:
- 回扣开场——重新提出开场问题,并给出答案
- 3 个关键要点——编号、简洁,一张幻灯片
- 未来方向——提出一个开放问题,引出问答环节
- 结尾绝不能只有一句“谢谢”——倒数第二张内容幻灯片才是给人留下深刻印象的部分
4e. 脚本自检(执行前)
重新阅读已完成的 JS 脚本,并在运行 node 前进行检查。在此处发现问题,可避免浪费一轮 QA:
结构:
- 幻灯片数量符合阶段 2 计划(容差为 ±2)
- 逻辑流畅:动机 → 背景 → 技术 → 结果 → 总结
- 不存在连续超过 4 张公式密集型幻灯片且没有例题或视觉间隔的章节
- 各主要章节之间都有章节分隔幻灯片
内容密度:
- 没有仅包含 ≤3 条简短要点,且不含数学公式、图示或表格的幻灯片
- 没有幻灯片超过上限(7 条要点、2 个公式、5 个新符号、2 张强调卡片)
- 纯文本幻灯片不超过整套幻灯片的 20%
布局与定位:
- 每个元素都满足
y + h ≤ SH - M(R21) - 所有多行文本框均设置了
shrinkText: true(R27) - 没有连续 3 张或更多幻灯片使用相同的布局类型(R12)
- 所有字体大小均使用
F常量,不使用硬编码数字
符号表示:
- 所有幻灯片中同一符号的用法保持一致
- 每个符号都在首次使用前定义
阶段 5:QA 循环(必须执行)
┌─→ 5a. Execute JS script → .pptx
│ 5b. soffice → PDF → pdftoppm → slide images
│ 5c. Subagent visual inspection (per-slide)
│ 5d. markitdown text extraction → content verification
│ 5e. Score (apply rubric)
│ 5f. Fix (edit JS and/or re-render formulas → re-execute)
└── score < 90 AND round < 3: loop back to 5a
score ≥ 90 OR round = 3: report to user
5a. 执行 + OMML 注入:
node generate_slides.js
# If manifest has any render:"omml" entries, inject OMML math:
python ~/.claude/skills/powerpoint-slides/scripts/inject_omml.py output.pptx formulas.json output.pptx
5b. 转换为图像:
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir . output.pptx
pdftoppm -png -r 200 output.pdf /tmp/slide
快速缩略图网格(可选——在详细检查前快速浏览整体):
python ~/.claude/skills/powerpoint-slides/scripts/thumbnail.py output.pptx thumbnails --cols 4
5c. 视觉检查(通过 Agent 子 Agent):
分辨率为 200 DPI 的幻灯片图像每张约为 1–2 MB。读取图像会占用上下文——在主对话或单个 Agent 中读取超过约 7 张图像,就会超过 20 MB 的限制。切勿在主对话中直接读取幻灯片图像。
策略:并行派遣 Agent 子 Agent,每个 Agent 分配 3–5 张幻灯片。每个 Agent 一次读取一张幻灯片图像,进行检查并返回纯文本报告。主对话只接收文本,从而保持上下文整洁。
Total slides: N
Agents: ceil(N/5) agents, each reading up to 5 consecutive slide images
All agents run in parallel
每个 Agent 的提示词:
“读取 /tmp/slide-{NN}.png 中从 [start] 到 [end] 的幻灯片图像,每次 Read 调用只读取一张图像。 检查每张幻灯片是否存在:溢出、重叠、字体是否清晰易读、公式是否清晰、对比度、 布局是否杂乱、内容密度、底边裁切。
关键——内容密度测量:根据幻灯片图像中的实际渲染像素判断空白区域,不要根据假定的文本框边界判断。文本框可能高达 3 英寸,但实际只渲染了占据 0.5 英寸的两行文本——这意味着有 2.5 英寸的视觉空白。 查看实际幻灯片图像:可见内容(文本、形状、图像、公式)在垂直方向上到哪里结束?从那里到幻灯片底部的间隔才是真正的空白区域。 如果标题栏下方的可见内容占比不足 75%,请标记(R19)。
关键——底边溢出(R21):检查卡片、表格、公式或文本是否被幻灯片底边裁切。迹象包括:文本在行中间被截断、卡片阴影在底部缺失、表格行消失。这是最常见的布局错误。 还要检查卡片标题是否与正文内容重叠(标题文本与下方正文文本挤在一起——通常由大字号的长标题换行导致)。
图表检查:标签清晰易读,边缘可区分,没有节点重叠,颜色与幻灯片主题一致(没有 Graphviz 默认蓝色/黑色),图表完整位于内容区域内,没有裁切。提取的图表应带有来源说明。
OMML 说明:在 LibreOffice/PDF 预览中,OMML 公式显示为空白。这是已知限制,并非错误。只需检查图像公式是否清晰。
仅返回一份文本报告——按幻灯片编号列出问题、描述和严重程度。 如果某张幻灯片没有问题,请报告‘OK’。”
将所有 Agent 报告合并为一个问题列表。
5a-post. XML 验证(OMML 注入后):确认没有残留的 {{MATH: 占位符:
python -c "
import zipfile, sys
with zipfile.ZipFile('output.pptx') as z:
for n in z.namelist():
if n.startswith('ppt/slides/') and n.endswith('.xml'):
if b'{{MATH:' in z.read(n):
print(f'RESIDUAL PLACEHOLDER in {n}'); sys.exit(1)
print('OK: no residual placeholders')
"
5a-post2. 重叠与边界检查(OMML 注入后):
python ~/.claude/skills/powerpoint-slides/scripts/check_overlaps.py output.pptx
如果退出代码非零(发现严重/主要问题),请修复 JS 脚本并重新运行。 检查器能够识别卡片结构:它会将卡片内部元素(容器矩形 + 强调条 + 标题 + 正文)分组,以避免误报。它可检测元素重叠、底边溢出和间距过窄。
5d. 内容验证:
pip install -q "markitdown[pptx]" 2>/dev/null
markitdown output.pptx > content.md
阅读 content.md,验证文本内容、符号格式是否一致以及拼写是否正确。
5e. 质量评分:应用 references/themes.md → “质量评分标准”中的评分规则。阈值:≥90 可交付,80–89 提示警告,<80 必须修复。
5f. 修复:编辑 JS 脚本以修复问题。如果公式的颜色/DPI 有问题,则重新渲染公式。重新执行并重新评分。最多 3 轮。
创建后检查清单(向用户报告前的最终关卡)
[ ] JS script executes without errors, .pptx generated
[ ] OMML injection successful, zero residual {{MATH:}} placeholders
[ ] QA score ≥ 90
[ ] Every definition has motivation + worked example within 2 slides
[ ] No slide exceeds density upper bounds (7 bullets, 2 formulas, 5 symbols, 2 cards)
[ ] No sparse slides (all slides have substantive content)
[ ] Diagrams use theme colors (no default blue/black)
[ ] Tables fit within content area, key cells highlighted, cell math uses OMML (R30)
[ ] Long tables split with header repeat and "(cont'd)" marker (R31)
[ ] Notation consistent throughout — same symbol = same meaning
[ ] References slide present (second-to-last, before Thank You)
[ ] Slide images visually inspected (at least spot-check 3-5 slides via QA agents)
3.2 compile [file.js]
执行现有的 PptxGenJS 脚本以生成 .pptx。
npm ls pptxgenjs 2>/dev/null || npm install pptxgenjs
node FILE.js
编译后检查:
- 退出代码是否为 0?
- 输出的 .pptx 文件是否存在?
- 文件大小是否合理?(>10KB = 有内容,<50MB = 合理)
- 报告:输出路径、文件大小、成功/失败
3.3 review [file.pptx]
只读校对报告。不编辑文件。
提取文本:
pip install -q "markitdown[pptx]" 2>/dev/null
markitdown FILE.pptx > content.md
4 类检查:
| 类别 | 检查项 |
|---|---|
| 语法 | 主谓一致、冠词、介词、时态一致性 |
| 拼写错误 | 拼写错误、查找替换残留、重复词、未替换的占位符([name]、[TODO]) |
| 一致性 | 引用格式、符号表示、术语、幻灯片间的颜色使用 |
| 学术质量 | 非正式缩略形式、缺乏依据的论断、含义模糊的缩写 |
每个问题的报告格式:
### Issue N: [Brief description]
- **Location:** [slide number or title]
- **Current:** "[exact text]"
- **Proposed:** "[fix]"
- **Category / Severity:** [Category] / [High|Medium|Low]
3.4 audit [file.pptx]
通过图像转换进行视觉布局审计。只读报告。
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx
pdftoppm -png -r 200 /tmp/FILE.pdf /tmp/audit-slide
逐张幻灯片的视觉检查清单:
- 所有边缘均无文本溢出
- 无元素重叠(文字与文字、文字与图像、形状与形状)
- 所有文字清晰可读(等效字号 ≥10pt)
- 表格和公式均在内容区域内
- 类似类型的幻灯片字体大小一致
- 文字与背景之间对比度充足
- 无视觉杂乱(相互争抢注意力的元素过多)
- 每张幻灯片的强调卡片 ≤ 2 张
- 布局多样性(同类型布局不连续出现 3 张或更多)
通过 Agent 子 Agent 执行:并行分派 Agent,每个 Agent 负责 3-5 张幻灯片。每个 Agent 使用 Read 工具逐张读取幻灯片,并返回纯文本报告。切勿在主对话中读取幻灯片图像——图像会累积在上下文中,约 7 张幻灯片后便会超过 20MB 限制。
每个问题的报告应包含幻灯片编号、描述、严重程度和修复建议。
3.5 pedagogy [file.pptx]
教学法审查。只读报告。
需验证的 13 种教学模式:
| # | 模式 | 警示信号 |
|---|---|---|
| 1 | 先讲动机,再讲形式化内容 | 未提供背景就直接给出定义 |
| 2 | 逐步引入符号 | 一张幻灯片上出现 5 个或更多新符号 |
| 3 | 定义后给出具体示例 | 连续给出 2 个定义,却没有示例 |
| 4 | 难度逐步递增 | 尚未介绍前置概念就先讲高级概念 |
| 5 | 分步揭示内容(问题 → 解决方案) | 一次性展示密集的定理 |
| 6 | 在转折处设置引导页 | 主题突然跳转,没有过渡 |
| 7 | 密集定理采用两张幻灯片的讲解策略 | 将复杂定理塞进 1 张幻灯片 |
| 8 | 语义化使用颜色 | 在同一种颜色中表现二元对比 |
| 9 | 卡片/方框层级 | 内容使用了错误的强调类型 |
| 10 | 避免卡片疲劳 | 一张幻灯片上有 3 张或更多强调卡片 |
| 11 | 嵌入苏格拉底式提问 | 整套幻灯片中没有任何问题 |
| 12 | 复杂概念优先可视化 | 先讲符号,再进行可视化 |
| 13 | 并排比较 | 相关定义分散在连续的幻灯片中 |
整套幻灯片的检查项:
- 叙事弧线(动机 → 铺垫 → 高潮 → 收束)
- 节奏(示例或视觉间隔前,理论密集型幻灯片最多 3-4 张)
- 视觉节奏(每 5-8 张幻灯片设置章节分隔页)
- 全程符号表示一致
- 对学生前置知识的假设合理
3.6 excellence [file.pptx]
全面的多维度审查。并行派发 5 个 Agent 调用。
-
视觉审查 Agent — 并行派发多个 Agent 子代理,每个负责 3-5 张幻灯片。每个 Agent 使用 Read 工具逐张读取幻灯片图像,检查内容重叠、字体一致性、卡片疲劳、间距问题、布局多样性和内容密度。按幻灯片返回纯文本报告,并标注严重程度。主对话中绝不读取幻灯片图像。
-
教学法审查 Agent — “从 .pptx 中提取文本。验证 13 种教学模式和整套幻灯片级别的检查项(叙事弧线、节奏、视觉韵律、符号一致性)。逐项报告模式检查结果。”
-
校对 Agent — “从 .pptx 中提取文本。检查语法、拼写、引文一致性、符号一致性和学术质量。逐项报告问题及其位置和修正建议。”
-
公式质量 Agent — 派发 Agent 子代理检查公式幻灯片图像(每个 Agent 负责 3-5 张幻灯片,每次 Read 调用读取一张图像)。检查:DPI 是否足够(图像是否模糊)、颜色是否与幻灯片主题匹配、对齐是否正确、大小是否一致。返回纯文本报告。
-
领域审查 Agent(可选 — 使用
--domain标志启用,或在论文偏重数学/理论时启用)— “验证实质内容是否正确:假设是否明确、推导是否有效、引文是否忠实、论点是否有依据。逐项报告问题并标注严重程度。”
所有 Agent 返回结果后,综合生成一份报告:
# Excellence Review: [Filename]
## Overall Quality: [EXCELLENT / GOOD / NEEDS WORK / POOR]
| Dimension | Critical | Major | Minor |
|-----------|----------|-------|-------|
| Visual/Layout | | | |
| Pedagogical | | | |
| Proofreading | | | |
| Formula Quality | | | |
| Domain (if run) | | | |
### Critical Issues (Immediate Action Required)
### Major Issues (Next Revision)
### Recommended Next Steps
质量评分对应关系:优秀(0-2 个严重问题,0-5 个主要问题)、良好(3-5 个严重问题,6-15 个主要问题)、需要改进(6-10 个严重问题,16-30 个主要问题)、较差(11 个以上严重问题,31 个以上主要问题)。
3.7 visual-check [file.pptx]
PDF → 图像系统性视觉审查。
工作流:
-
转换:
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx pdftoppm -png -r 200 /tmp/FILE.pdf /tmp/vc-slide -
并行派发 Agent 子代理进行视觉检查,每个负责 3-5 张幻灯片。每个 Agent 使用 Read 工具逐张读取幻灯片,按照逐页检查清单进行检查,并返回纯文本报告。主对话中绝不读取幻灯片图像 — 图像会累积在上下文中,约 7 张后就会超过 20MB。逐页系统性检查清单:
- 所有边缘(顶部、底部、左侧、右侧)均无文字溢出
- 元素之间无重叠
- 在演示观看距离下,所有文字均清晰可读
- 公式图像清晰(无模糊或像素化)
- 表格未超出幻灯片宽度,单元格中的数学公式以 OMML 渲染
- 长表格续页重复显示表头,标题包含“(cont'd)”
- 类似幻灯片上的字体大小一致
- 文字与背景对比度充足
- 画面无杂乱元素
- 主题颜色应用一致
- 内容密度充足(文字占卡片/区域面积的 50% 以上)
-
逐项报告问题:
### Slide N: [slide title] - **Issue:** [description] - **Severity:** Critical / Major / Minor - **Fix:** [specific recommendation]
3.8 extract-figures [file.pdf] [pages]
从论文 PDF 中提取图片以用于幻灯片。优先使用 MCP 提取,失败时回退到 pdftoppm。
- 确定目标图片——使用
pdf_get_toc/pdf_read_pages定位。不确定时,询问用户。 - 尝试使用 MCP 提取(主要路径):
mcp__pdf-mcp__pdf_extract_images(path=PDF_PATH, pages=PAGES, output_dir="diagrams")- 直接将图片保存为
diagrams/中的 PNG 文件(原始分辨率,不消耗 token)。 - 返回
{page, index, width, height, format, file_path}——直接使用file_path。 - 对于每个目标页面,选择最大的图片(如果有多张,也可以让用户选择)。
- 如有需要,重命名为描述性名称:
mv diagrams/page3_img0.png diagrams/<id>.png
- 直接将图片保存为
- 回退到 pdftoppm——当 MCP 未返回图片,或需要裁剪页面区域时使用:
- 编写
diagrams.json,包含type: "extract"条目(如有需要,包含crop坐标)。 - 运行渲染器:
python ~/.claude/skills/powerpoint-slides/scripts/render_diagrams.py diagrams.json diagrams/
- 编写
- 使用提取的图片元数据更新或创建
diagrams/manifest.json。
规则:
- 必须注明来源(
Source: Author et al., Year),除非这是用户自己的论文 - 分辨率检查:任一维度 <800px → 提醒用户投影时可能模糊
- 切勿提取表格——使用
addTable()重建,以确保渲染清晰 - 包含多张图片的页面:MCP 可能会为每张图片返回单独的图片对象;如果多张图片融合为一张,请使用 pdftoppm +
crop
3.9 validate [file.pptx] [duration]
自动化定量验证。检查可测量的属性。
检查项:
-
幻灯片数量与时长(如果提供了时长):
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx pdfinfo /tmp/FILE.pdf | grep "Pages:"对照时间表检查。超出范围时标记。
-
文件大小:
- >50 MB:警告(分享速度较慢)
- >100 MB:严重问题(可能包含未压缩的图片)
-
内容提取:
markitdown FILE.pptx > content.md- 统计无文本的幻灯片数量 → 标记空白幻灯片
- 检查占位文本(
[TODO]、[XXX])
-
公式图片(如果存在
formulas/目录):- 所有清单条目都对应实际存在的文件
- 清单条目中没有
"error"字段 - 图片尺寸合理(宽度 > 100px)
报告格式:
# Validation Report: [Filename]
| Check | Result | Status |
|-------|--------|--------|
| Slide count | N slides / Xmin | OK / WARNING |
| File size | X.X MB | OK / WARNING |
| Empty slides | N found | OK / WARNING |
| Placeholder text | N found | OK / CRITICAL |
| Formula images | N/M valid | OK / WARNING |
Overall: PASS / PASS WITH WARNINGS / FAIL
4. 验证协议
每项任务都必须以验证结束。 不容妥协。
[ ] JS script executes without errors (node exit code 0)
[ ] .pptx file generated and non-empty (>10KB)
[ ] soffice converts to PDF successfully
[ ] Slide images visually inspected (at least spot-check 3-5 slides)
[ ] Text content verified via markitdown (no garbled text, placeholders)
[ ] Score ≥ 90 (for create action) or issues documented (for review actions)
5. 故障排除
| 问题 | 解决方法 |
|---|---|
Cannot find module 'pptxgenjs' | 在工作目录中运行 npm install pptxgenjs |
| 公式图片缺失 / 清单报错 | 检查 formulas.json 中的 LaTeX 语法(对 \\ 进行双重转义),重新运行 render_latex.py。回退方案:使用纯文本 |
| soffice 卡住或失败 | 运行 pkill -f soffice,然后使用 --headless 标志重试 |
| .pptx 中的颜色不正确 | 移除十六进制颜色的 # 前缀。仅使用 6 位十六进制值。通过 transparency 属性设置透明度 |
| 多次添加后形状未对齐 | 使用工厂函数——PptxGenJS 会原地修改选项对象 |
dot: command not found | 运行 brew install graphviz |
| 图表显示默认的蓝色/黑色 | 向 render_diagrams.py 传入与幻灯片主题匹配的 --theme 标志 |
| 提取的图片模糊 | 源 PDF 可能分辨率较低;请尝试更高的 DPI,或查找矢量源文件 |
pdfinfo: command not found | 运行 brew install poppler(提供 pdfinfo、pdftoppm) |
6. 依赖项
Node.js:npm install pptxgenjs
Python:pip install Pillow lxml "markitdown[pptx]"
系统:node、pandoc(OMML 转换)、xelatex、pdfcrop、pdftoppm(Poppler)、soffice(LibreOffice)、pdfinfo(Poppler)、dot(Graphviz — brew install graphviz)、mmdc(Mermaid CLI — npm install -g @mermaid-js/mermaid-cli,可选)