关于 present-paper
present-paper 是用于制作研究论文演示的 Claude 技能,面向有明确受众和场合的报告准备。它涵盖论文分析、提纲确认、参考资料核验、讲稿撰写,以及可编辑幻灯片制作或演讲备注添加。
主要功能
- 01分析论文并制定限时提纲
- 02按受众和场合调整内容
- 03核验补充参考文献
- 04撰写带时间标记的讲稿
- 05制作可编辑幻灯片或添加备注
适用场景
- 01根据论文准备学术会议报告
- 02制作期刊俱乐部评议幻灯片
- 03为现有演示文稿添加演讲备注
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aperivue/ medsci-skills --skill present-paper安装后在 Claude Code 中输入/present-paper确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/ai_slide_tells.mdgenerate_pptx_templates.pygenerated_illustrations.mdmedical_presentation_templates.mdpresentation_archetypes.mdpresentation_design_guidelines.mdslide_design_principles.mdspoken_notes_and_bilingual.mdworkflow-checklist.mdreferences/critic_rubrics/slide.mdreferences/slide_visual_styles/CATALOG.mdclinical_blue.mddark_modern.mdeditorial_mono.mdinstitutional_brand.mdnature_lancet.mdscripts/check_deck_budget.pycheck_diagram_edges.pycheck_font_portability.pycheck_slide_tells.pyscripts/check_deck_budget_challenge/make_fixtures.pyverify.shscripts/check_diagram_edges_challenge/make_fixtures.pyverify.shscripts/check_font_portability_challenge/make_fixtures.pyverify.shscripts/check_slide_tells_challenge/make_fixtures.pyverify.shscripts/check_text_overflow_challenge/make_fixtures.pyverify.sh详细介绍
Present-Paper Skill
阶段 0:初始化与大纲
步骤 0a — 加载设计参考资料(起草大纲前阅读)
现在完整阅读三个文件。只有当 Q0/Q2 的答案告诉你需要哪个文件时,才阅读其余文件——一次演讲只有一个场合和一种风格,阅读其他文件并无用处。
现在阅读(始终如此):
A. references/ai_slide_tells.md — 生成式幻灯片会留下的痕迹。首先完整阅读。以此为依据制作,幻灯片就无需事后补救;scripts/check_slide_tells.py 会检查遗漏之处(步骤 3.6)。如果其他参考资料与之冲突,以此文件为准。每张幻灯片上的眉题标签和品牌页脚,是最常被指出的视觉痕迹。
B. references/presentation_archetypes.md — 骨架,根据演讲者所处的场合选择:会议口头报告、期刊俱乐部评论、以病例为核心的大查房、教学讲座、答辩、主题演讲(Duarte 的火花线、Jobs 的 STAR 时刻、Takahashi/Lessig)、面向普通听众的演讲、决策简报(Minto 的金字塔、行动型标题、Kawasaki 的 10/20/30)。演讲类型(演讲需要完成什么)与视觉风格(演讲看起来如何)是相互独立的选择。**外观是偏好;骨架则不可随意改变。**其机制部分见 scripts/check_deck_budget.py。
C. references/presentation_design_guidelines.md — 可执行的规则(论断式标题、字号不小于 24 pt、留白、≤3 种颜色、色盲友好型调色板、重新绘制而非截图、动画规范),以及供第 3.5 阶段的评审者评分使用的 G1–G10 自查表。
按需阅读——在 Q0/Q2 告知你需要哪个文件后:
| 文件 | 阅读时机 |
|---|---|
references/medical_presentation_templates.md | 场合属于五种医学场合之一时——只阅读对应章节 |
references/slide_visual_styles/CATALOG.md → 一个风格文件 | Q2 已选定风格时 |
references/slide_design_principles.md | 不确定幻灯片为何没有效果时——了解 C 中规则背后的 Reynolds / Duarte / Knaflic / Tufte 理论 |
references/generated_illustrations.md | 准备为幻灯片生成任何图像时,或纯文字幻灯片持续无法通过评审时;其第一条规则(绝不生成医学图像)不可违背 |
references/spoken_notes_and_bilingual.md | 起草演讲者备注时,或幻灯片不是单语时 |
必需输入
开始前收集以下信息。确定目标受众前不要起草。
| 输入 | 原因 |
|---|---|
| 论文 | PDF 路径、DOI 或 PMID |
| 演讲时长 | 决定内容深度和幻灯片数量 |
| 目标受众 | 专业构成、知识水平——决定术语深度 |
| 背景 | 课程名称、会议、期刊俱乐部形式、此前的会议主题 |
| 模板 / 视觉风格 | 要填充的机构模板(.pptx/.potx),或用于生成的视觉风格。默认:询问(步骤 0b) |
| 扩展部分 | 可选主题,例如 AI 方向、临床意义。默认:无 |
步骤 0b — 模板与视觉风格选择
起草大纲前,先确定演示文稿的外观。提问(使用 AskUserQuestion;如果用户已在请求中回答过某个问题,则跳过该问题):
Q0 —“您将在什么场合演讲,时长多久?”(场合 + 分钟数)
在询问外观之前,先据此确定演讲类型——也就是演示文稿的骨架。根据 references/presentation_archetypes.md 中的选择表映射答案,并将 archetype + minutes 保留到第 3.6 步:该步骤会根据它们检查制作完成的演示文稿。
如果用户只给出主题,没有说明场合,请提问。不要猜测:没有针对特定场合制作的演示文稿会显得千篇一律,任何审阅者都能看出来。
Q1 —“您是否有要使用的机构或品牌模板?”
- 有 → 用户提供
.pptx/.potx。切换到模式 C(第 3 阶段,“填充机构模板”)。不要再询问 Q2 —— 模板的主题就是风格。 - 没有 / 无 → 询问 Q2。
Q2 —“您希望采用哪种视觉风格?” 提供 CATALOG.md 中的选项,每项附上一行预览(先列推荐选项,并标注为推荐):
| 选项 | 一行预览 |
|---|---|
| Nature / Lancet(推荐用于医学学术演讲) | 白色、海军蓝 + 珊瑚色点缀、极细分隔线、Inter/Pretendard —— 克制的编辑式学术风格 |
| Clinical Blue | 白色/浅蓝色、海军蓝-蓝绿色,沉稳可信、色盲友好 —— 大查房 / CME |
| Editorial Mono | 黑白高对比、超大字号、单一强调色 —— 单一核心信息主题演讲 |
| Dark Modern | 深石板色背景、米白色文字、电光色点缀 —— AI / 方法 / 技术主题演讲 |
| 其他 | 描述配色/感觉,或指定要仿效的期刊/品牌 |
记录所选风格,并将对应的风格规范传递给第 3 阶段。若用户没有偏好且演讲属于医学学术类,默认采用 Nature / Lancet。风格只影响第 3 阶段的呈现,不影响大纲、讲稿或问答。
Q3 — 仅限会议演示文稿:第 1 张幻灯片是否有投稿要求? 许多学会要求标题页上的标题、作者、所属机构和国家必须与摘要投稿时填写的内容完全一致。不要为了满足密度检查而缩短内容 —— 投稿要求优先。从投稿门户复制这些字段,并在第 1 张幻灯片上记录 SLIDE_TOO_DENSE,注明这是有意覆盖该项检查及其原因。
论文分析
阅读论文并生成结构化分析:
## Paper Analysis
### Citation
[Full citation with DOI]
### Background
- What gap does this paper address?
- What was known vs. unknown before this study?
### Study Design
- Type: [RCT / cohort / case series / meta-analysis / etc.]
- Subjects: [n, inclusion/exclusion]
- Methods: [key methodological choices]
- Primary outcome: [what was measured]
### Key Results
1. [Finding 1 with effect size and CI/p-value]
2. [Finding 2]
### Patient/Case Summary Table
[If applicable — structured table of individual cases or subgroups]
### Limitations
1. [Limitation 1]
### Significance
- Why does this matter? What changes because of this paper?
幻灯片大纲
创建逐张幻灯片的大纲,并分配时间:
## Slide Outline ([N] slides, [M] minutes)
| # | Title | Time | Key Content |
|---|-------|------|-------------|
| 1 | Title slide | 0:30 | Paper citation, presenter |
| 2 | Context / Prior sessions | 1:00 | How this connects to prior knowledge |
| ... | ... | ... | ... |
| N | Take-home messages | 0:30 | 3-5 key points |
关卡:用户批准大纲后方可继续。
第 1 阶段:补充研究
补充参考资料限定为 5–8 篇,并且只搜索已获批大纲所需的类别:后续研究(是否重复验证或扩展?)、为研究结果提供背景的大型临床试验数据、为主题提供框架的综述文章,以及相互矛盾的证据(用于平衡问答)。不要总结找到的每篇论文 —— 只提取幻灯片所需的数据点(发生率、OR/HR、AUC)、支持或质疑主要论文的研究发现,以及说明其重要性的背景信息。
通过 /search-lit 核实每条参考资料(确认 DOI 或 PMID)。无法核实的资料标记为 [UNVERIFIED - NEEDS MANUAL CHECK]。
## Verified References
### Main Paper
1. [Citation] — PMID: XXXXX, DOI: XX.XXXX/XXXXX
### Supporting References
2. [Citation] — PMID: XXXXX
→ Used for: [specific data point or context]
### Key Data for Slides
- [Statistic 1]: [value] — Source: [Ref #]
第 2 阶段:讲稿与内容
演讲稿
起草一份完整的演讲稿:
- 语言:用户偏好的讲述语言;技术术语使用英语。
- 受众适配:根据第 0 阶段的受众画像设定内容深度。面向混合受众时,为专业术语添加一句通俗解释(“FLAIR 序列——一种抑制液体信号以突出水肿的 MRI 技术”)。
- 发音指南:用用户的语言标注药物名称和缩写的发音(“lecanemab(leh-KAN-eh-mab)”)。
- 时间标记:为每张幻灯片标注时间。演讲稿长度必须与分配的时长相符(学术演讲约为每分钟 130–150 个单词)。
- 过渡语:连接各张幻灯片,串联叙述脉络。
切勿编造临床定义、诊断标准或指南建议;对不确定的内容标注 [VERIFY] 并询问用户。
关于句子的组织方式——备注应当用于口头讲述,而不是照稿朗读——以及非单语演示文稿的语言划分,请参阅 references/spoken_notes_and_bilingual.md。如果上述任一情况适用,起草前请先阅读该文件。
## Speaker Script
### Slide 1: Title (0:30)
"[Opening — introduce yourself and the paper]"
### Slide N: Take-home Messages (0:30)
"[Summarize 3-5 key points. Thank audience. Invite questions.]"
扩展部分(可选)
仅当用户在第 0 阶段提出要求时才添加,例如 AI/计算方向、临床实践或政策影响,以及与用户自身研究的联系。
关卡:用户审核演讲稿后,才能继续。
第 3 阶段:幻灯片与备注
三种模式
模式 A=按选定的视觉风格生成新演示文稿。模式 B=为现有演示文稿添加备注。模式 C=填充用户所在机构的/品牌模板(在步骤 0b 中选择)。根据步骤 0b 的回答选择模式。
模式 A:生成新的幻灯片演示文稿
使用 python-pptx,根据结构化的内联数据生成完全可编辑的 PPTX。提供两个模板库:
${CLAUDE_SKILL_DIR}/references/generate_pptx_templates.py— 通用 T_lead / T_text / T_table / T_image_right / … 模板(其文档字符串列出了这些模板;build_demo_slides()会逐一演示)。适用于期刊俱乐部、全院查房、会议演讲和短篇论文演讲。${CLAUDE_SKILL_DIR}/templates/build_pptx_nature_lancet.py— Nature/Lancet 风格(规范:references/slide_visual_styles/nature_lancet.md)。适用于多篇论文综述型学术讲座(模板 #5)。函数包括:new_presentation、add_title_slide、add_toc_slide、add_section_divider、add_transition_slide、add_content_slide、add_glossary_slide、add_closing_slide,以及apply_fonts(prs, en=..., ko=...)和fix_app_xml()。
Nature/Lancet 模板的默认设置为正文、字幕和术语表条目使用 20 pt 字号。简洁的内容适用于 conference_oral、critique、case_anchored、didactic 和 defence 预算配置。keynote、lay_talk 和 decision_brief 需要使用更大的字号并调整版式;在检查器中选择配置不会自动重新设置演示文稿的样式。容量上限不保证内容密度适宜或内容能够完全放入版面——请渲染实际内容并进行检查。
对于从 PDF 提取的图表(而非 /make-figures 的输出),请使用 ${CLAUDE_SKILL_DIR}/scripts/extract_pdf_figures.py(pdftoppm + PIL 裁剪,使用归一化的 0–1 坐标框;支持单次裁剪命令行或 YAML 批量配置),然后用 trim_caption.py 去除期刊页眉、图注和周围空白,同时保留多面板图和表格行:
python3 "${CLAUDE_SKILL_DIR}/scripts/trim_caption.py" \
--in-dir figures/extracted \
--out-dir figures/cropped
当版面预期只放置图表主体时(build_pptx_nature_lancet.py 的默认设置),请将 FIG_DIR 指向裁剪后的输出目录。
感知单词边界的 Markdown 解析器(HLA 丰富型演示文稿必需)
若构建脚本会解析幻灯片正文或备注中的行内 **粗体** / *斜体*,则必须使用带单词边界的环视断言;否则,包含星号的科学标记(DRB1*07:01、HLA-A*02:01、SNP ID、脚注标记)会被误当成斜体分隔符,从而导致演示文稿中的每个等位基因都被悄然破坏:
import re
pattern = re.compile(
r"(\*\*(?:(?!\*\*).)+?\*\*" # bold; inner single * allowed
r"|(?<![A-Za-z0-9])\*[^*\n]+?\*(?![A-Za-z0-9]))" # italic (word-boundary)
)
粗体规则允许内部包含一个 *,因此 **DRB1*04:02** 会保持为一个完整的粗体片段。请将此正则表达式添加到每个 Nature/Lancet 风格构建脚本的 add_styled()(或等效函数)中。
面向非母语演讲者的发音自动补充
如果演讲者不方便读出首字母缩略词、作者姓名、药名或基因符号,请在每张幻灯片的备注中添加 [ Pronunciation ] 小节(仅在演讲者视图中显示):
python3 "${CLAUDE_SKILL_DIR}/scripts/inject_pronunciation_notes.py" \
input.pptx output.pptx \
--dict pron_dict.yaml \
--header "[ 발음 ]" # or any header you like
提供一份 YAML/JSON 字典(术语 → [读音, 全名]),根据听众使用的语言编写。匹配按词边界进行,因此较短的缩略词(AE、OR)只有在单独出现时才会匹配;等位基因标记的读音会根据其基础等位基因条目合成。已包含该标题的幻灯片会被跳过,因此可以安全地重复运行。
演讲者备注中的统计数据密度
如果幻灯片正文已显示确切的 OR / 95% CI / p 值,备注中就不要重复这些数据——否则演讲者会把统计数据读出来,听众也跟不上。备注应采用叙述形式,并用一句话说明“确切数字请见幻灯片正文”;确切数字放在正文和脚注中。超过 1,000 个字符且包含 ≥5 个统计数据标记时 → 压缩。测量片段见 references/spoken_notes_and_bilingual.md 第 D 部分 §8。
备注中的数字都是你会大声读出来的数字
- 备注中的每个外部数字都要对照来源核查,方式与正文中的数字完全相同。 凭记忆输入的基准数据(“152 个模型中有 95% 被评为高风险”,而来源说的是 171 个中的 148 个,占 87%)即使配有正确引用的参考文献列表,也依然会保留下来——只是记错了数字。
- 编辑生成的文本时,注入表达式的数量不得减少。 如果构建脚本从产物中提取数字(
f"{N['primary']}"),压缩文字时就可能把它们压平成字面值——正文仍经过校验,而备注中的数字却会悄然与正文不一致。 修改前后:
import re
len(re.findall(r"\{N\[", src)) # must not decrease across a rewrite
对同一个正则表达式取反,找出所有未包含在注入表达式中的数字——这些是有人手动输入的字面值,需要进行核查。
可直接分享的去备注版本
演示文稿流转前,必须删除备注(例如教授索要幻灯片时),因为备注中包含仅供演讲者查看的内容——第二语言叙述、发音提示、自我提醒(“Prof. ○○ 可能会问到……”):
python3 "${CLAUDE_SKILL_DIR}/scripts/strip_notes_for_sharing.py" \
presenter_v9.pptx share/<topic>_<initials>.pptx
该操作会清除每张备注页上所有形状的文本(不只是备注占位符),移除审阅评论,清空 docProps/core.xml 中的作者 / 最后修改者 / 评论字段,同步 docProps/app.xml 中的计数,并根据写入文件的原始 XML 验证以上所有内容(正文和图表不受影响)。如果演示文稿包含隐藏幻灯片,操作会以退出码 2 停止,直到你选择 --drop-hidden(从共享副本中移除隐藏幻灯片)或 --keep-hidden。分享 <topic>_<initials>.pptx(在封面邮件中说明该文件可用于重复使用幻灯片)、<topic>_<initials>.pdf(LibreOffice 的 --convert-to pdf 会移除已清除的备注页),以及可选的 <topic>_<initials>_references.zip(如果超过附件大小限制,则改用 Drive 链接)。
配套文档会随演示文稿一起发出——也要检查它们
_qa_prep.md、_quick_review.md 和任何讲义都根据与备注相同的材料起草,
而且会传播得更广。在发出任何一份之前:
- 已废弃的数字。 对演示文稿的检查不等于对配套文档的检查——幻灯片曾写着 26.3%,
而演讲者用来回答问题的审阅表上仍写着 54.1%。每当演示文稿中的数字变动时,都要检查配套的
.md文件,找出已被取代的数值。若要有意引用旧数字,请用 `` 将其括起来,而不是将该文件排除在检查之外。 - 面向听众的文档中包含操作人员的内部材料。 一份为你准备的简报(“他们会反驳的要点”“备选立场”、按分钟安排的计划),交到它所描述的对象手中时,会显得像是在制定应对他们的策略。应将其拆成两份文档:一份内部文档,包含各种应对方案;另一份中立文档,说明调查结果以及需要对方确认的事项。
- 仅限现场使用的内容,以及指向这些内容的文字。 重新分发的演示文稿会在办公桌前阅读:移除休息页、计时器、“正如我们刚才在练习中所见”——然后对整份演示文稿进行 grep,检查正文和备注中是否还有引用这些内容的句子。 对材料中有关上游项目的任何断言(安装命令、数量、版本),都要依据该项目自己的源文件重新核实,而不是依据你几个月前保存的副本。
架构
每张幻灯片都是一个模板函数调用,带有明确的内联数据,并生成原生、可编辑的文本框架。以下三条规则可确保幻灯片保持稳定:
- 不解析 markdown。 自动将 markdown 解析为幻灯片,会导致每次重新生成时版式都发生变化。
- 不使用
cur_top累积位置跟踪。 使用generate_pptx_templates.py顶部定义的固定坐标区域——cur_top会累积舍入误差,并在约 10 张幻灯片后破坏版式。 - 不使用 Marp。 Marp 会渲染成图像;这样一来,演示文稿将无法编辑,审阅者也无法复制文本或重新设置样式。
图表源格式(使用 /make-figures 输出时)
- 首选:使用
add_picture()插入 ≥300 dpi 的 PNG。设置img_pct(T_image_right),使图表在 13.33 × 7.5 英寸的版式中占据 ≥40% 的幻灯片宽度。 - 矢量源文件:插入前,将 PDF 转换为目标 DPI 的 PNG(
pdftoppm -r 300 input.pdf out_prefix);在不同 PowerPoint 版本中嵌入 PDF 的可靠性不高。 - 禁止使用:TIFF(Mac 版 PowerPoint 会静默丢弃);用于线稿的 JPEG(对角线会出现伪影);原始 SVG(Mac 版 PowerPoint 对其处理不一致)。
- 图注:面向注意力只有 5–10 秒的听众重新撰写,不要直接使用期刊图注。
- 把论点写在幻灯片上,而不是栅格图像里。 如果将结论或醒目的数字直接画进 PNG,那么上方的项目符号一旦编辑,它们就会与演讲内容脱节,而且文本搜索也无法找到它们。数字和结论应放在幻灯片自身的文本中。
- 生成的插图:只能表现概念和场景,绝不能让人误以为是测量结果——不得生成 CT、MRI、组织学或 X 光片,即使标注为“插图”也不行。首次编写提示词前,请阅读
references/generated_illustrations.md。
图表和绘图应以代码绘制,再插入(而非用自动形状绘制)
硬性规则,也是这项技能中收益最高的规则。 用 PPT 工具拼装 Agent 生成的幻灯片几乎总会失败;用广为人知的工具通过代码绘制图表和绘图,再插入结果,才是可行的方法。
| 内容 | 使用工具绘制 | 绝不要 |
|---|---|---|
| 任何图表 | matplotlib / R(/make-figures) | 手动放置形状来冒充图表 |
| 流程、机制、管线、层级结构 | matplotlib;如果图本身就是重点,则使用 Graphviz DOT | python-pptx 自动形状 |
| 研究流程(STROBE/PRISMA) | /make-figures 流程构建器 | 逐个绘制方框 |
然后使用 add_picture() 插入渲染后的 PNG(≥300 dpi)。
插入前先检查渲染后的 PNG。 绘制在图边界上的描边在渲染时会被切掉一半,放到幻灯片上看起来就像是缺了一条边的方框:
python3 scripts/check_diagram_edges.py diagrams/ --json qc/diagram_edges.json
DIAGRAM_EDGE_CLIP 会报告距离图像边框仅几像素的墨迹,并忽略铺满整个画面的图像。应在 savefig 后立即运行;修复方法是在内部留出边距,并使用 bbox_inches="tight" 和填充量——PNG 一旦生成,裁剪就无法恢复被切掉的描边。
为什么要禁止。 自动形状图表会同时呈现两个 AI 痕迹:完全相同的圆角矩形(SHAPE_MONOTONY)由没有标注的箭头连接(ARROW_NO_SEMANTICS)。在 Graphviz 中,边会写明它所表达的含义:
digraph mechanism {
rankdir=LR; node [shape=box, fontname="Inter"];
catheter -> tract [label="seeds along"];
tract -> nodule [label="grows into"]; // an arrow that says what it means
}
箭头表达一种关系——导致、变成、流入、与……比较、预测。如果不标注,房间里的每个人都会自行补上不同的动词。参见 references/ai_slide_tells.md §4–5。
唯一的例外:将单个、精心设计且带有标注的形状用作点缀(例如说明框或高亮框)。使用一个形状是有意的选择;使用八个一模一样的形状就是生成器的产物。
字体是交付决策,而非审美决策
演示设备上缺少某款字体时,系统会悄然替换:字体度量发生变化,换行随之改变,原本适配的文本框也不再适配——在创作设备上看不出来,投影时却一目了然。
python3 scripts/check_font_portability.py output/presentation.pptx --json qc/font_portability.json
FONT_NOT_PORTABLE 会列出仅捆绑于一种操作系统、另一种操作系统上却没有的字体,并按字体统计数量。它是一份禁止清单,而非许可清单(不涉及授权品牌字体);不会将演示文稿嵌入的字体列为问题;对于主题级默认字体,在演示文稿包含该占位符对应文字脚本的文本之前,也视为不起作用。检查通过不代表已验证字体是否安装或渲染器是否进行了替换。对于 Nature/Lancet 构建器,请在添加幻灯片后、保存前调用 apply_fonts,以选择已安装的拉丁字体和东亚字体(它不会嵌入字体,也不会处理图像、表格或图表内部的字体)。除了布局之外,也要检查导出 PDF 中的字体。
确保字体可用有两种方法:
- 嵌入字体(PowerPoint:保存 > 在文件中嵌入字体)。须遵守许可证规定。
- 同时提供 PDF——但PDF 会丢弃嵌入的视频,因此包含视频片段的演示文稿还必须单独提供 MP4 文件。
构建脚本的职责
从零开始生成的脚本必须:
- 通过相对于演示文稿目录的路径引用每个输入,并将生成产物所需的所有输入都保存在该目录内。 会话临时目录或临时文件夹下周就可能消失,届时也无法修正已经嵌入图表的标签。将图表生成脚本保存在演示文稿旁边。
- 一次性设置全部四个占位符坐标(步骤 3.7)。
- 在调用
add_picture之前将 TIFF 图像转换为 PNG,并对 iPhone 照片执行 EXIF 转置(否则图像会旋转 90°)。 - 插入或删除幻灯片后,将
docProps/app.xml(<Slides>、<Notes>、HeadingPairs、TitlesOfParts)同步为实际数量,否则在 Mac 上打开 PowerPoint 时会弹出恢复对话框。 - 从另一份演示文稿中原样复制
<a:srcRect>——值的单位为百分之一百分比(上限为 100000),绝不是 EMU。此处的单位换算错误会导致图像有 99% 被裁切到幻灯片外。 - 在最后打印幻灯片数量、备注数量、文件大小和可编辑性检查结果。
修补而非重建——编辑现有 PPTX
对于提供的演示文稿进行精细修改(文本框宽度、图像裁剪、字体替换、移除 sp3d),应使用正则表达式或 sed 修补解压后的 XML,而不是用 python-pptx 重新生成。从头重建会丢失 <a:srcRect> 裁剪、刻意保留的 <a:sp3d> / <a:scene3d>、母版/版式/主题详情,以及 app.xml / core.xml 元数据。
unzip -q original.pptx -d /tmp/work
python3 -c "
from pathlib import Path
p = Path('/tmp/work/ppt/slides/slide23.xml')
p.write_text(p.read_text().replace('cx=\"9504720\"', 'cx=\"11200000\"'))
"
cd /tmp/work && zip -rq ../patched.pptx . -x '*.DS_Store'
python-pptx 仅用于(a)通过上述模板创建全新演示文稿,以及(b)通过 slide.notes_slide.notes_text_frame.text 添加演讲者备注。scripts/inject_speaker_notes.py 是(b)的标准示例。默认情况下,它会将行内 **bold** / *italic* 解析为运行级样式(python-pptx 会原样存储文本,因此否则这些标记会在演示者视图中直接显示);对于旧版纯文本,请传入 --no-markdown。每个备注文本运行都会以 --font-pt 指定的字号写入(默认为 18);若不指定,备注将继承备注母版的 12 pt。可复现的检查位于 tests/test_speaker_notes_markdown.py。
输出
保存到 output/presentation.pptx。演讲者备注仅写入备注窗格——添加备注时切勿修改幻灯片设计。
第 3.5 步——幻灯片评审(交付演示文稿前运行)
导出 PPTX 后,按照 references/critic_rubrics/slide.md 对每张幻灯片评定为 PASS / PARTIAL / FAIL,并在将演示文稿视为可交付之前,为每个 FAIL 或 PARTIAL 项目提出具体修改。
演示文稿层面的 Mac PowerPoint 检查(评分标准 F 节:无 TIFF、无 <a:sp3d>、已同步 app.xml 计数、无大于 100000 的 srcRect 值)均为必需项;评分标准提供了每项检查的检测命令和修复方法。请同时在 PDF 导出文件和 Mac PowerPoint 中验证——单独使用任一项都无法发现全部四类问题;PDF 无法发现 sp3d 轮廓和 srcRect 损坏。
在 _quick_review.md 中记录 critic_pass: yes | partial | no 和 refine_rounds: N。
第 3.6 步 — AI 痕迹审查(确定性检查;在构建好的幻灯片上运行,而不是在构建脚本上运行)
python3 scripts/check_slide_tells.py output/presentation.pptx --json qc/slide_tells.json
python3 scripts/check_deck_budget.py output/presentation.pptx --json qc/deck_budget.json \
--archetype <from Q0> --minutes <from Q0>
将 --json 写入项目自己的 qc/ 目录,而不只是输出到终端:只存在于滚动记录中的判定日后无法计数,而检查触发的频率是唯一能证明它值得保留的证据。
check_deck_budget.py 是这一原型的机械检查部分:幻灯片数量是否超出时间限制(DECK_OVER_BUDGET)、每张幻灯片的字数是否超过本次听众能接受的范围(SLIDE_TOO_DENSE),以及后排观众能否看清文字(TYPE_TOO_SMALL)。--list 会打印预算。它还会报告 ZERO_AREA_TEXT,用于判断另外三项是否有意义——参见第 3.7 步。表格文字会和其他文字一起测量;图表和 SmartArt 的文字存放在各自的部件中,不会测量。计时会在遇到第一条以 "Backup"、"Appendix"、"Q&A"、"Reserve" 或 "Supplementary" 开头的简短标题时停止,输出会指出停止计时的幻灯片;如果备份内容并非从该处开始,请传入 --backup-from N。
**已知限制:**如果某条简短发现以这些词之一开头("Appendix perforation in children"),它仍会被视为备份部分分隔页,并在此处停止计时;请检查打印出的 clock: stops at slide N 行,如果位置不对,请传入 --backup-from N。
六项幻灯片痕迹判定,每一项都是审阅者一眼就能发现的标记。每一项都必须消除,或在充分考虑后决定保留,并写下理由:
| 判定 | 检查结果 | 修复方法 |
|---|---|---|
CHROME_ON_EVERY_SLIDE | ≥60% 的幻灯片带有眉题标签/品牌页脚 | 保留页码和分隔页。删除其余内容。 |
SCAFFOLD_PHRASE | 幻灯片(或备注)在叙述自身的构造过程——"总而言之","The key takeaway is…" | 删除这句话,直接表达它所指的内容。 |
TOPIC_TITLE | 内容页标题写着 "Results",而没有陈述结果 | 改成断言式标题:"辅助消融使局部复发率减半(12% 对比 26%)。" |
SHAPE_MONOTONY | 同一个框以相同尺寸重复八次 | 并列观点 → 改用一个表格。非并列观点 → 改用不同形状。 |
DEAD_SPACE_BAND | 幻灯片大部分为空,且中间有一块空洞 | 补充内容,或用大字突出一个观点。 |
ARROW_NO_SEMANTICS | ≥2 个箭头,但没有任何标注 | 为每个箭头添加标注,或添加图例。箭头代表一项主张。 |
检测器仅使用标准库,可读取任意 .pptx,包括同事发给你的幻灯片。它不是风格评判,也不会检测「是否使用了 AI」:把 AI 当作助推器使用,不会留下这些痕迹;把 AI 当作按钮使用,则会留下所有这些痕迹。
第 3.7 步 — 占位符继承几何属性:要么赋值全部四个坐标,要么一个都不赋
布局占位符从布局继承位置和尺寸。只赋值其中一项——
title.width = Inches(11.5) # ← and nothing else
——python-pptx 就会生成一个 <a:xfrm> 来保存该值,并将其余值记录为零或缺失,而不是继承。文本框会以没有高度或没有宽度的状态渲染:文本存在于文件中,却不会显示在幻灯片上。
shape.left, shape.top, shape.width, shape.height = ( # all four, together
Inches(0.8), Inches(0.6), Inches(11.5), Inches(1.0))
此类形状也没有 <a:off>,因此幻灯片读取器会将其丢弃,其文字和字号也不会传入 check_deck_budget——曾有一张标题页带有 69 个词、字号为 11.5 pt,以这种方式通过了预算检查。ZERO_AREA_TEXT 会首先报告此问题。如果发现此问题,请修正几何属性并重新运行检查;对于首次运行中其他检查的无结果,应视为尚未读取,而非已通过。
第 3.8 步 —— 是否合适?测量渲染结果;切勿估算
python-pptx 会写入超出文本框显示容量的内容,却不会给出任何提示。导出 PDF(这也是 Mac 兼容性检查和便携式备用方案的组成部分),然后进行测量:
soffice --headless --convert-to pdf output/presentation.pptx
python3 scripts/check_text_overflow.py output/presentation.pptx --pdf output/presentation.pdf \
--json qc/text_overflow.json
OFF_SLIDE 表示一条线的末端落在幻灯片底部的保留区域;CARD 表示一条线的底部超出了其所在填充块的底部。两者都会报告测得的距离(0.03 in 和 0.6 in 分别需要不同的修复方式)。UNRENDERED 表示某个段落(含 12 个或更多字母或数字)在所属幻灯片页面上没有显示开头——整行被推到幻灯片之外时,没有矩形可供测量。没有渲染结果时,检查会以状态码 2 退出——无法测量,而不是报告通过。
它使用 pdftotext -bbox-layout 提取行矩形,不会验证所有相交情况、顶部/右侧裁切,或被其他形状遮挡的文本——请对照幻灯片源检查渲染结果,包括较长的标题和说明文字。
不要用算术计算(字号 × 行距 × 行数)来代替测量:这种方法两个方向都不可靠。行高常数 1.42 会让 CJK 正文溢出到页脚(渲染结果测得为 1.60);将其提高到 1.62,又会拒绝约 290 段实际渲染正常的内容;而忽略 PowerPoint 添加的约 1.2 倍行距,则会把一个 21 行的列表计算为 4.1 in,实际需要 5.1 in。
模式 B:为现有幻灯片添加备注(更常见)
在修改演示文稿之前,先对收到的演示文稿运行第 3.6 步中的两项检查,并报告检查结果。“只要修正样式”并不是诊断:SLIDE_TOO_DENSE、TYPE_TOO_SMALL、SCAFFOLD_PHRASE 和 TOPIC_TITLE 能在几秒钟内回答“这是内容问题还是设计问题?”。先把答案告知用户,再让他们选择要处理的内容。设计往往本来就没有问题。
然后:
- 阅读现有 PPTX,了解幻灯片结构和数量
- 将演讲稿各部分映射到对应幻灯片
- 生成针对该演示文稿定制的
inject_notes.py脚本
备注注入脚本
参照 ${CLAUDE_SKILL_DIR}/scripts/inject_speaker_notes.py 中的模式,生成定制的 inject_notes.py。生成的脚本应仅包含为该演示文稿定制的 notes 字典,以及模板中的主注入循环。
关键规则
演讲者备注会直接注入,不会修改幻灯片的设计、布局、文字或图像。 脚本只会操作备注窗格。通过比较前后的幻灯片内容进行验证。
模式 C:填充机构/品牌模板
如果用户在步骤 0b 提供了 .pptx/.potx,请填充模板,不要重新设计。从头创建一个
Presentation() 会丢弃机构的母版、主题和徽标(参见上文的“修补优于重建”)。
代码示例、无可用正文版式时的回退方案以及验证详情,见
references/slide_visual_styles/institutional_brand.md。
- 检查:
python3 ${CLAUDE_SKILL_DIR}/scripts/inspect_pptx_template.py <template>会列出每个 版式(索引、名称)及其占位符(idx、类型、尺寸),还会列出主题字体/颜色。模板中已经绘制了内容:学会的版式通常带有通栏背景图,其色带就是页眉;母版上也可能已有标题框。删除占位符并自行绘制文本框,会导致标题一半落在色带上,另一半悬在外面。找到现有的设计区域——占位符矩形,或已绘制页眉的颜色变化处——并将文字放在其中。 - 映射:将大纲中的每张幻灯片映射到模板现有的某个版式(标题/标题+内容/章节标题/结束页)。不要自行创建版式。
- 填充:通过
placeholder_format.idx填充,以继承机构的字体、字号和徽标——切勿添加自由文本框作为标题/正文。 - 备注:照常使用
scripts/inject_speaker_notes.py注入备注。 - 验证:在 Mac PowerPoint 中打开(无修复对话框、每张幻灯片上都有徽标、字体完好);确认徽标媒体仍已嵌入;添加/删除幻灯片后同步更新
docProps/app.xml。
品牌模板内部仍须遵循内容规则(presentation_design_guidelines.md)——每张幻灯片一个要点、重新绘制表格、颜色不超过 3 种,且限于机构的配色方案。
第 4 阶段:问答准备
问题生成
从四个角度生成问题:方法学批评者(“为什么采用这种设计?为什么不……?”)、领域专家(深入的技术问题)、通才(“这对临床实践意味着什么?”)以及学生/受训人员(澄清不熟悉的概念)。
答案结构
Acknowledge → Evidence → Conclude
"That's an important limitation. [Acknowledge the concern honestly.]
However, [cite specific supporting evidence — author, year, finding].
So while [restate limitation], [conclude with the paper's contribution despite it]."
快速复习单
供最后一刻复习的一页参考资料:
## Quick Review
### Must-Know Numbers
| Metric | Value | Source |
|--------|-------|--------|
| [Key stat 1] | [value] | [Ref] |
### Common Pitfalls
- Don't confuse [X] with [Y]
- [Classification A] and [Classification B] are independent frameworks
- Slide says [rounded value], precise value is [exact value]
### Key Takeaways (memorize these)
1. [Point 1]
2. [Point 2]
3. [Point 3]
输出文件结构
所有输出均放在用户的演示文稿目录中:
{presentation_dir}/
├── _analysis.md # Phase 0: Paper analysis + outline
├── _references.md # Phase 1: Verified references + key data
├── _script.md # Phase 2: Speaker script
├── _qa_prep.md # Phase 4: Expected Q&A
├── _quick_review.md # Phase 4: Pre-presentation review sheet + critic_pass record
├── _slide_critic.md # Phase 3.5: Slide rubric scores per slide
├── inject_notes.py # Phase 3: Tailored note injection script
├── figures/ # Extracted paper figures (if needed)
└── reference/ # Supporting paper PDFs (if downloaded)
跨技能集成
| 何时 | 使用 | 原因 |
|---|---|---|
| 需要在幻灯片中加入图表(ROC、森林图、KM、流程图) | 先使用 /make-figures,再嵌入图表 | 图表级与幻灯片级工具采用相同的 Reynolds/Knaflic/Tufte 基础原则 |
| 需要并行核对论文报告清单 | 对同一篇论文使用 /check-reporting | 论文演示常与手稿修订同步;报告指南中的缺漏会在问答中显现 |
| 视觉摘要/中央插图 | 使用 /make-figures 的视觉摘要模板 | 然后查看目标期刊的 AI 图像政策(JACC 禁止,Radiology 允许披露后使用) |
| 幻灯片中的参考文献 | 交付前使用 /verify-refs(仅审计) | 与手稿参考文献采用相同的防幻觉关卡 |