mcpField
P
powerpoint-slides

powerpoint-slides

github.com/noi1r文档处理13087 次安装32 周前更新
代码仓库

关于 powerpoint-slides

用于学术 PowerPoint 演示文稿全流程制作的技能,覆盖创建、编译、审阅、润色和验证。它通过 PptxGenJS 脚本生成演示文稿,并提供内容教学质量、版式和视觉检查流程。

主要功能

  1. 01从主题创建演示文稿
  2. 02执行脚本并生成 PPTX
  3. 03检查语法、排版与教学质量
  4. 04逐页审查视觉布局
  5. 05验证文件和演示文稿指标

适用场景

  1. 01根据论文制作学术演示文稿
  2. 02编译 PptxGenJS 脚本
  3. 03校对并检查幻灯片布局
  4. 04验证幻灯片并进行视觉检查

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/noi1r/powerpoint-skill --skill powerpoint-slides

安装后在 Claude Code 中输入/powerpoint-slides确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

diagram-rendering.md
formula-rendering.md
pptxgenjs-reference.md
references/
themes.md
scripts/
check_overlaps.py
inject_omml.py
render_diagrams.py
render_latex.py
soffice.py
thumbnail.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. 硬性规则(不可妥协)

  1. 先讲动机,再讲形式化内容 — 每个概念都先回答“为什么?”,再回答“是什么?”。定义必须放在具体背景中。
  2. 定义后 2 张幻灯片内给出完整示例 — 每个定义都必须在引入后的 2 张幻灯片内配上具体的完整示例。
  3. 电报式风格 — 使用关键词组,而非完整句子。幻灯片是演讲提示,而非讲稿。例外:每张幻灯片可用一句引导句来交代背景。
  4. 每张幻灯片都要物有所值 — 至少包含一个实质性内容(公式、图示、表格、定理、算法、图表)。如果一张幻灯片只有 3 条简短要点,没有其他内容,就必须合并或充实。
  5. 每张幻灯片最多 2 个强调卡片 — 过多会削弱重点。强调卡片是彩色框、标注形状或高亮区域。优先级较低的内容改为普通文本。
  6. 参考文献幻灯片 — 倒数第二张幻灯片(致谢页之前)必须列出重要引用文献。包括主要论文和 3–5 篇最相关的参考文献。
  7. 色盲友好型配色 — 优先使用蓝色 + 橙色;二元对比中绝不使用红色 + 绿色。文本与背景的 WCAG AA 对比度 ≥ 4.5:1。主题中需定义语义颜色。
  8. 字体大小层级 — F 常量对象定义默认基准值:封面 48pt、章节 36pt、标题栏 22pt、正文 15pt、小字 12pt、图注 11pt、卡片标题 18pt、表头 13pt、表格单元格 12pt。字号不得低于 10pt。当卡片或区域内容稀疏(文本占可用区域 <50%)时,在 QA 修正阶段将字号调大 2–4pt。
  9. 备用幻灯片 — 致谢页之后放置 3–5 张,用附录分隔页隔开。用于回答可能提出的问题:详细证明、扩展对比、补充数据。
  10. 每项任务完成后都要验证 — 执行 JS → soffice → PDF → 图像检查。未经视觉验证,任务就不算完成。
  11. 禁止使用 AI 标志性强调线 — 标题下方不得直接放置装饰线。这是 AI 生成幻灯片的典型特征,看起来不专业。
  12. 布局多样化 — 连续 3 张或更多幻灯片不得使用相同布局类型。在以下布局中交替使用:全宽、双栏、公式居中、数据强调、图标网格、时间线、表格、图表等。
  13. 公式渲染 — 展示型和行内公式默认使用 OMML(PowerPoint 原生数学格式)。段落式公式使用 600DPI PNG 或 SVG 作为回退方案。不得使用模糊的图片公式。
  14. 16:9 布局,0.5" 页边距 — 使用 LAYOUT_16x9(10" x 5.625")。四边均保留 0.5" 的留白。内容区域:9" x 4.625"。
  15. 不得重复使用 PptxGenJS 选项对象 — 该库会原地修改对象(例如,将阴影值转换为 EMU)。每次调用都必须创建新对象。使用工厂函数:const makeShadow = () => ({...})。
  16. 十六进制颜色值前不得加 # — 使用 "FF0000",而不是 "#FF0000"。前缀 # 会在不报错的情况下损坏输出文件。
  17. 保持视觉主题一致 — 所选配色方案应全局应用于幻灯片背景、文本颜色、公式前景色、图表颜色、强调卡片填充色和分隔线。不得使用偏离主题的颜色。
  18. 不得使用 Unicode 数学近似符号 — 卡片或文本框中的纯文本不得使用 Unicode 下标(₀、₁)、上标(ᵖᵉ)或特殊数学符号(∑、∏、∈、∀、∝)。所有数学符号——包括行内公式、带下标的变量、公式中的希腊字母——都必须使用 OMML(首选)或 LaTeX 图像管线(段落模式)渲染。卡片正文混排文本和数学符号时,使用 OMML 占位符表示单个公式,或将整个正文渲染为一张 LaTeX 图像。唯一例外:简单的单个拉丁字母(x、y、n)和不含运算符的普通数字。
  19. 纵向分布内容 — 标题栏下方的内容必须覆盖 CH 垂直空间的 ≥75%。如果所有元素都集中在上半部分,说明布局有问题:增大卡片高度、增加间距、放大字号,或在底部添加总结/洞察卡片。每张内容幻灯片都应显得“充实”——最后一个元素下方不得留有大片空白。
  20. 内容密度下限 — 只有 ≤3 条简短纯文本要点(没有公式、图示、表格或卡片)的幻灯片过于稀疏——应与相邻幻灯片合并,或加入视觉元素充实内容。纯文本幻灯片不得超过整个幻灯片组的 20%。每张卡片都必须有足够文本,填满其内部区域的 ≥40%;否则应将字号调大 2–4pt,或合并卡片。
  21. 边界验证 — 每个元素都必须满足 y + h ≤ SH - M(5.125")。生成脚本时,务必在脑中核对每个元素的底边位置。常见陷阱:在表格下方堆叠卡片时未考虑表格渲染高度;addCardFormula 中的公式图像高于卡片正文区域;双行卡片布局中第二行超出边界。使用 addCardFormula 时,公式高度参数 fH 必须 ≤ cardH - 0.75(标题区域)。如果内容无法放入,应缩小卡片高度、减小公式的 targetH,或拆分到两张幻灯片。视觉 QA Agent 必须特别标出任何底边被幻灯片边界裁切的元素。
  22. 参考文献幻灯片格式 — 严格采用单栏布局。将 CH 平均分配给 N 条参考文献,每条垂直居中于其所在行。使用 F.body.size 字号(条目较多时使用 F.small.size)。不加分隔线和装饰元素——仅使用均匀分布、填满页面的文本行。每页参考文献超过 8 条时,续排到第二张参考文献幻灯片。参考文献幻灯片必须分布均匀,不得在顶部或底部留有大片空白。
  23. 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 倍来计算间距。
  24. 图示引擎选择 — 结构/流程图(架构、依赖、对比、树形图)使用 Graphviz。行为/时序图(序列、状态、甘特图、ER 图)使用 Mermaid。仅在数学内容密集或需要忠实复现论文时使用 TikZ。不要用 Graphviz 绘制序列图,也不要用 Mermaid 绘制复杂节点布局。
  25. 图示主题一致性 — 所有渲染的图示都必须使用当前主题的颜色。节点填充色 = 对应的 cardFill,边框 = ac.pos,文本 = tx.pri。最终输出中不得出现 Graphviz/Mermaid 的默认颜色(蓝色/黑色)。将 --theme 传给 render_diagrams.py。
  26. 防止文本溢出并留足内边距 — 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 行简短文本。需要更多文本时,增大卡片高度或拆分内容。
  27. 图示来源标注 — 从论文中提取的图示必须通过 addFigure() 图注注明来源(Source: Author et al., Year)。宽度 <800px 时,必须提醒用户投影显示可能模糊。不得提取表格;应使用 PptxGenJS addTable() 重新制作。
  28. 视觉优先规划 — 受众通过视觉锚点理解结构,而非项目符号列表。在阶段 2 中,针对每张幻灯片都要自问:“受众能否仅凭文本在 10 秒内理解内容?”如果不能,就需要添加视觉元素(图示、表格、图表或图片)。常见信号:多步流程、组件关系、数据对比、层级结构、数值趋势——这些内容几乎总是需要视觉呈现,而不是文字说明。阶段 2 自检:每个章节至少有 ≥1 个非公式视觉元素;零视觉元素(没有图示、表格、图表或图片)的幻灯片不得超过整个幻灯片组的 30%。
  29. 表格单元格公式 — 表格单元格中的数学符号(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: {}}。
  30. 长表格分页 — 超过每张幻灯片行数限制(8–10 行数据)的表格必须拆分到多张幻灯片。每张续页都要重复表头,并通过 addTableCont() 在幻灯片标题后添加 " (cont'd)"。在有意义的行组边界处拆分(例如算法系列、指标类别、数据集分组之间)——绝不得在组内拆分。最后一页至少应有 ≥3 行数据;如果不足,则与前一页合并。如果不同子集讲述不同内容,每页都应有自己的图注/要点。
  31. 根据图片宽高比设计布局 — 嵌入从论文中提取的图片时,根据其宽高比(取自清单元数据或测量尺寸)选择布局:宽高比 > 1.6(宽图)→ 使用 addFigure() 居中、全宽放置。宽高比 ≤ 1.6(常规/高图)→ 使用 addFigureWithText(),图片置左、文本置右。不得拉伸或裁切图片以适应布局——始终保持原始宽高比。根据清单计算 figRatio:PNG 使用 width_px / height_px,SVG 使用 width_pt / height_pt。并排布局中,图片宽度上限为 CW 的 60%,以便为说明要点留出空间。
  32. 保持对齐一致 — 同一张幻灯片上的同类元素(例如多个卡片、多个要点、多个公式)应使用相同的 x 坐标和一致的宽度。偏差不得超过 ≤0.05"。在阶段 5 运行的 check_overlaps.py 对齐检查会标出错位元素。常见问题:卡片列的 x 偏移略有不同、公式图像未对齐到同一中心轴、项目符号列表的左边距不一致。使用 cols2() 或手动定位列时,始终根据同一个常量推导 x 坐标,不得估算。
  33. 演讲者备注(可选) — 如果用户要求添加演讲者备注,或演示场合适合使用备注(例如读书会、答辩),则使用 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 的分析制定。

必问问题(始终提问):

  1. 时长 — 演示需要多长时间?
  2. 听众水平 — 听众是谁?(专家、研究生、普通学术听众)
  3. 先修知识 — 列出阶段 0 中具体的技术依赖项。询问听众了解其中哪些内容。
  4. 内容范围 — 将论文的实际组成部分作为选项提供。哪些内容需要重点强调、跳过或简要提及?
  5. 深度与广度 — 如果论文既有概述,也有详细构造,询问用户的偏好。
  6. 视觉风格 — 选择哪种主题?
    • A) 学术浅色 — 白色/浅灰色,简洁精准(默认)
    • B) 午夜 — 全程深色,科技感/高端感
    • C) 海洋 — 蓝色调,专业学术风格
    • D) 森林 — 自然绿色调
    • E) 三明治 — 深色标题/结论页 + 浅色内容页
  7. 演讲者备注(可选)— 是否需要在演示者视图窗格中添加演讲者备注?适用于期刊俱乐部、答辩或排练。如果需要,将为每张幻灯片生成电报式要点。

幻灯片数量估算(每 1.5–2 分钟约 1 张幻灯片):

时长幻灯片总数引言/动机方法/背景核心内容总结
5 分钟(闪电演讲)5-71-20-12-31
10 分钟(短讲)8-1221-24-51
15 分钟(会议演讲)10-152-32-35-71-2
20 分钟(研讨会)13-1832-36-92
45 分钟(主题演讲)22-304-55-710-142-3
90 分钟(讲座)45-605-68-1225-353-4

演讲类型提示 — 不同形式需要不同策略。误判形式是糟糕演示的头号原因:

演讲类型重点常见错误
闪电演讲(5 分钟)一个核心信息,不讲背景把完整演讲硬塞进 5 分钟
会议演讲(10-20 分钟)1-2 个关键结果,快速概述方法技术细节过多,缺少全局视角
研讨会(45 分钟)可以深入探讨,但需要视觉节奏满屏公式,没有示例
答辩/学位论文展示掌握程度,系统全面地讲解跳过动机,匆忙讲结果
期刊俱乐部批判性分析,促进讨论只做总结,不做评价
基金申请陈述重要性 → 可行性 → 影响技术性太强,没有充分说明“为何重要”

节奏原则:将 40-50% 的时间用于核心内容(结果/技术)。连续讲解理论内容的幻灯片最多不超过 3-4 张,之后应加入演示示例或视觉休息——听众在连续听 5 分钟左右的形式化内容后就会失去兴趣。

阶段 2:结构计划(关卡 — 用户必须批准)

按章节制定详细提纲:

  • 章节标题
  • 分配的幻灯片数量
  • 每张幻灯片的关键内容要点(1-2 行)
  • 每张幻灯片的布局类型(来自第 2.4 节的布局池)
  • 计划中的图示/图表(简要说明)
  • 将要引入的符号

提交计划前的阶段 2 自检:

  • 每个章节至少包含 1 个非公式视觉元素(示意图、表格、图表或图片)
  • 没有视觉元素的幻灯片 ≤30%(R29)
  • 每个多步骤流程、组件关系或数据比较都计划了视觉呈现,而不只是列出要点

提交计划并询问:结构是否合适?用户必须批准后才能继续。

阶段 3:公式准备
  1. 扫描阶段 2 的结构,将所有公式收集到列表中。包括表格单元格中的数学公式(R30):扫描每个规划的表格,找出含有下标、希腊字母、运算符或复杂度符号的单元格——每个单元格都要在 formulas.json 中单独创建一个 "render": "omml" 条目。
  2. 编写 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"}
    ]
    
  3. 运行渲染器(仅渲染图像条目;OMML 条目仅生成清单元数据):
    python ~/.claude/skills/powerpoint-slides/scripts/render_latex.py formulas.json formulas/
    
  4. 检查 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:图表准备
  1. 扫描阶段 2 的结构,找出需要渲染的图表和视觉元素。
  2. 将每项分类到 5 层处理流程中:
    • graphviz — 架构图、流程图、依赖关系图、神经网络图、树形图、对比图(DOT 语言)
    • mermaid — 时序图、甘特图、饼图、状态图、ER 图
    • tikz — 数学密集型图表、几何构造图、忠实还原论文的复刻图
    • shapes — 简单的注释、箭头、高亮(PptxGenJS 原生图形——在阶段 4 中处理,不在此处处理)
    • extract — 从论文 PDF 中提取图表(extract-figures 工作流)
  3. 编写 diagrams.json(架构说明见 diagram-rendering.md)。
  4. 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。
  5. 运行渲染器:
    python ~/.claude/skills/powerpoint-slides/scripts/render_diagrams.py diagrams.json diagrams/ --theme <theme_name>
    
  6. 检查 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 行的表格,使用条纹行(通过 addTable helper)提高可读性

长表格分页(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 调用。

  1. 视觉审查 Agent — 并行派发多个 Agent 子代理,每个负责 3-5 张幻灯片。每个 Agent 使用 Read 工具逐张读取幻灯片图像,检查内容重叠、字体一致性、卡片疲劳、间距问题、布局多样性和内容密度。按幻灯片返回纯文本报告,并标注严重程度。主对话中绝不读取幻灯片图像。

  2. 教学法审查 Agent — “从 .pptx 中提取文本。验证 13 种教学模式和整套幻灯片级别的检查项(叙事弧线、节奏、视觉韵律、符号一致性)。逐项报告模式检查结果。”

  3. 校对 Agent — “从 .pptx 中提取文本。检查语法、拼写、引文一致性、符号一致性和学术质量。逐项报告问题及其位置和修正建议。”

  4. 公式质量 Agent — 派发 Agent 子代理检查公式幻灯片图像(每个 Agent 负责 3-5 张幻灯片,每次 Read 调用读取一张图像)。检查:DPI 是否足够(图像是否模糊)、颜色是否与幻灯片主题匹配、对齐是否正确、大小是否一致。返回纯文本报告。

  5. 领域审查 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 → 图像系统性视觉审查。

工作流:

  1. 转换:

    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
    
  2. 并行派发 Agent 子代理进行视觉检查,每个负责 3-5 张幻灯片。每个 Agent 使用 Read 工具逐张读取幻灯片,按照逐页检查清单进行检查,并返回纯文本报告。主对话中绝不读取幻灯片图像 — 图像会累积在上下文中,约 7 张后就会超过 20MB。逐页系统性检查清单:

    • 所有边缘(顶部、底部、左侧、右侧)均无文字溢出
    • 元素之间无重叠
    • 在演示观看距离下,所有文字均清晰可读
    • 公式图像清晰(无模糊或像素化)
    • 表格未超出幻灯片宽度,单元格中的数学公式以 OMML 渲染
    • 长表格续页重复显示表头,标题包含“(cont'd)”
    • 类似幻灯片上的字体大小一致
    • 文字与背景对比度充足
    • 画面无杂乱元素
    • 主题颜色应用一致
    • 内容密度充足(文字占卡片/区域面积的 50% 以上)
  3. 逐项报告问题:

    ### Slide N: [slide title]
    - **Issue:** [description]
    - **Severity:** Critical / Major / Minor
    - **Fix:** [specific recommendation]
    

3.8 extract-figures [file.pdf] [pages]

从论文 PDF 中提取图片以用于幻灯片。优先使用 MCP 提取,失败时回退到 pdftoppm。

  1. 确定目标图片——使用 pdf_get_toc / pdf_read_pages 定位。不确定时,询问用户。
  2. 尝试使用 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
  3. 回退到 pdftoppm——当 MCP 未返回图片,或需要裁剪页面区域时使用:
    • 编写 diagrams.json,包含 type: "extract" 条目(如有需要,包含 crop 坐标)。
    • 运行渲染器:
      python ~/.claude/skills/powerpoint-slides/scripts/render_diagrams.py diagrams.json diagrams/
      
  4. 使用提取的图片元数据更新或创建 diagrams/manifest.json。

规则:

  • 必须注明来源(Source: Author et al., Year),除非这是用户自己的论文
  • 分辨率检查:任一维度 <800px → 提醒用户投影时可能模糊
  • 切勿提取表格——使用 addTable() 重建,以确保渲染清晰
  • 包含多张图片的页面:MCP 可能会为每张图片返回单独的图片对象;如果多张图片融合为一张,请使用 pdftoppm + crop
3.9 validate [file.pptx] [duration]

自动化定量验证。检查可测量的属性。

检查项:

  1. 幻灯片数量与时长(如果提供了时长):

    python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx
    pdfinfo /tmp/FILE.pdf | grep "Pages:"
    

    对照时间表检查。超出范围时标记。

  2. 文件大小:

    • >50 MB:警告(分享速度较慢)
    • >100 MB:严重问题(可能包含未压缩的图片)
  3. 内容提取:

    markitdown FILE.pptx > content.md
    
    • 统计无文本的幻灯片数量 → 标记空白幻灯片
    • 检查占位文本([TODO]、[XXX])
  4. 公式图片(如果存在 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,可选)

评论

支持 Markdown