perfect-presentation
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePerfect Presentation Skill
完美演示文稿制作技能
Core Rules (NEVER break these)
核心规则(绝对不可违反)
- Output is Python code only — never write slide content as plain text, only as code
python-pptx - ≥15 slides — always
- Language — match the language the user specifies; default to English
- Academic & technical — highly professional, specific, no filler content
- Citations mandatory — cite sources at the bottom of every slide AND in notes
- Speaker notes 800–2000 words — explain every bullet point in depth
- Popular-science + empathetic tone in notes — ideal for beginner students
- Never use placeholder text — all content must be real, researched, specific
- 仅输出Python代码 — 永远不要将幻灯片内容写为纯文本,仅输出代码
python-pptx - 始终保证≥15页幻灯片
- 语言 — 匹配用户指定的语言,默认使用英文
- 学术&技术风格 — 高度专业、内容具体,无填充内容
- 强制引用来源 — 每张幻灯片底部以及备注中都要标注来源
- 演讲者备注800-2000字 — 深入解释每个要点
- 备注采用科普+共情的语气 — 适合初学者理解
- 绝不使用占位符文本 — 所有内容必须是真实、经调研的具体内容
Phase 1 — Deep Research (MANDATORY before writing any code)
第一阶段:深度调研(编写代码前必须完成)
Before writing a single line of Python, research the topic thoroughly.
在编写任何Python代码之前,要对主题进行全面调研。
Research Checklist
调研清单
□ Core definition and scope (with authoritative source)
□ Historical background and key milestones (with years)
□ Key statistics and quantitative data (with source + year)
□ Major current trends (with evidence)
□ Key organizations, researchers, or companies involved
□ Challenges and open problems
□ Future outlook and predictions
□ At least 2 real case studies with measurable outcomes
□ Expert quotes or frameworks (cited)
□ Contrasting viewpoints or debates in the field□ 核心定义和范围(附权威来源)
□ 历史背景和关键里程碑(附年份)
□ 核心统计数据和定量数据(附来源+年份)
□ 当前主要趋势(附证据)
□ 涉及的核心机构、研究人员或企业
□ 挑战和待解决问题
□ 未来展望和预测
□ 至少2个有可衡量结果的真实案例研究
□ 专家引述或框架(标注来源)
□ 领域内的不同观点或争议Source Citation Format
来源引用格式
Use this format for citations on slides and in notes:
On slide (bottom footer): [Author/Org, Year] or [URL shortened]
In notes (full citation): Author, A. (Year). Title. Publisher/URL. DOI if available.If a source is not available online, cite:
[Title of Document, Organization, Year]幻灯片和备注中的引用使用以下格式:
幻灯片上(底部页脚):[作者/机构, 年份] 或 [短链URL]
备注中(完整引用):Author, A. (Year). Title. Publisher/URL. 如有DOI请标注如果来源无线上版本,引用格式为:
[文档标题, 机构, 年份]Phase 2 — Slide Architecture (≥15 slides)
第二阶段:幻灯片架构(≥15页)
| # | Slide Type | Content Focus |
|---|---|---|
| 1 | Title Slide | Topic, subtitle, presenter, institution, date |
| 2 | Agenda | Numbered sections with brief descriptions |
| 3 | Executive Summary | 3–4 key takeaways from the entire presentation |
| 4 | Context & Relevance | Why this topic matters now; problem statement |
| 5 | Historical Background | Timeline of key developments |
| 6 | Key Statistics | 3–4 large-format data callouts with sources |
| 7 | Core Concept I | First major deep-dive topic |
| 8 | Core Concept I — Detail | Supporting evidence, examples, data |
| 9 | Core Concept II | Second major deep-dive topic |
| 10 | Core Concept II — Infographic | Chart, diagram, or process flow |
| 11 | Current Trends | 3–5 active trends with evidence |
| 12 | Trend Data | Chart or comparison supporting trends |
| 13 | Case Study | Real-world example: context → action → result |
| 14 | Challenges & Risks | Specific obstacles with citations |
| 15 | Opportunities | Forward-looking recommendations |
| 16 | Future Outlook | Predictions, scenarios, roadmap |
| 17 | Key Takeaways | Top 5 insights from the entire deck |
| 18 | References | Full bibliography (APA or similar) |
| 19 | Q&A / Thank You | Closing slide |
For complex/technical topics: expand to 20–25 slides with additional deep-dives
| 序号 | 幻灯片类型 | 内容核心 |
|---|---|---|
| 1 | 标题页 | 主题、副标题、演讲者、机构、日期 |
| 2 | 议程 | 带编号的章节及简要说明 |
| 3 | 执行摘要 | 整个演示文稿的3-4个核心要点 |
| 4 | 背景与相关性 | 该主题当下的重要性;问题说明 |
| 5 | 历史背景 | 关键发展时间线 |
| 6 | 核心统计数据 | 3-4个大幅展示的数据标注及来源 |
| 7 | 核心概念I | 第一个深度讲解的主题 |
| 8 | 核心概念I — 细节 | 支撑证据、案例、数据 |
| 9 | 核心概念II | 第二个深度讲解的主题 |
| 10 | 核心概念II — 信息图 | 图表、示意图或流程图 |
| 11 | 当前趋势 | 3-5个有证据支撑的活跃趋势 |
| 12 | 趋势数据 | 支撑趋势的图表或对比 |
| 13 | 案例研究 | 真实案例:背景 → 行动 → 结果 |
| 14 | 挑战与风险 | 附引用来源的具体障碍 |
| 15 | 机遇 | 前瞻性建议 |
| 16 | 未来展望 | 预测、场景、路线图 |
| 17 | 核心要点 | 整个演示文稿的5大洞察 |
| 18 | 参考文献 | 完整参考书目(APA或类似格式) |
| 19 | 问答/致谢 | 收尾页 |
针对复杂/技术主题:可扩展到20-25页,增加更多深度讲解内容
Phase 3 — Design System
第三阶段:设计系统
Color Palette: Academic High-Contrast
配色方案:学术高对比度
Use a dark header / light body "sandwich" structure for maximum legibility:
python
undefined使用深色头部/浅色主体的“三明治”结构保证最大可读性:
python
undefinedDARK elements (headers, title slides, section dividers)
深色元素(头部、标题页、章节分隔页)
DARK_BG = "1C2B3A" # Deep navy — main dark background
DARK_TEXT = "F0F4F8" # Near-white text on dark backgrounds
ACCENT = "2E86AB" # Professional blue accent
DARK_BG = "1C2B3A" # 深海军蓝 — 主深色背景
DARK_TEXT = "F0F4F8" # 深色背景上的近白色文本
ACCENT = "2E86AB" # 专业蓝色强调色
LIGHT elements (content slides)
浅色元素(内容页)
LIGHT_BG = "FAFBFC" # Off-white slide body
LIGHT_TEXT = "1A1A2E" # Near-black text on light backgrounds
LIGHT_MUTED = "5A6A7A" # Muted gray for captions, citations
LIGHT_BG = "FAFBFC" # 米白色幻灯片主体
LIGHT_TEXT = "1A1A2E" # 浅色背景上的近黑色文本
LIGHT_MUTED = "5A6A7A" # 用于说明文字、引用的 muted 灰色
Highlight / callout
高亮/标注
HIGHLIGHT = "E8F4FD" # Very pale blue for card backgrounds
RULE_COLOR = "2E86AB" # Accent lines, borders
**Topic-based palette alternatives:**
| Domain | DARK_BG | ACCENT | Use when |
|--------|---------|--------|----------|
| Medical/Health | `1B3A2F` | `27AE60` | Biology, medicine, environment |
| Technology/AI | `1A1A2E` | `6366F1` | CS, AI, engineering |
| Economics/Business | `1C2B3A` | `D4AF37` | Finance, economics, management |
| Social Sciences | `2C1654` | `9B59B6` | Psychology, sociology, law |
| Default Academic | `1C2B3A` | `2E86AB` | General / mixed topics |HIGHLIGHT = "E8F4FD" # 卡片背景用淡蓝色
RULE_COLOR = "2E86AB" # 强调线、边框颜色
**基于主题的备选配色:**
| 领域 | DARK_BG | ACCENT | 适用场景 |
|--------|---------|--------|----------|
| 医疗/健康 | `1B3A2F` | `27AE60` | 生物学、医学、环境 |
| 技术/AI | `1A1A2E` | `6366F1` | 计算机科学、AI、工程 |
| 经济/商业 | `1C2B3A` | `D4AF37` | 金融、经济、管理 |
| 社会科学 | `2C1654` | `9B59B6` | 心理学、社会学、法律 |
| 默认学术风格 | `1C2B3A` | `2E86AB` | 通用/混合主题 |Typography: Serif Titles + Sans-serif Body
排版:衬线字体标题 + 无衬线字体正文
python
from pptx.util import Pt
from pptx.dml.color import RGBColorpython
from pptx.util import Pt
from pptx.dml.color import RGBColorTitle fonts (serif — scholarly authority)
标题字体(衬线 — 体现学术权威性)
FONT_TITLE = "Georgia" # or "Palatino Linotype"
SIZE_TITLE = Pt(36)
SIZE_H1 = Pt(28)
SIZE_H2 = Pt(22)
FONT_TITLE = "Georgia" # 或 "Palatino Linotype"
SIZE_TITLE = Pt(36)
SIZE_H1 = Pt(28)
SIZE_H2 = Pt(22)
Body fonts (sans-serif — clean legibility)
正文字体(无衬线 — 清晰易读)
FONT_BODY = "Calibri" # or "Arial"
SIZE_BODY = Pt(14)
SIZE_SMALL = Pt(11)
SIZE_CITATION = Pt(9)
SIZE_STAT = Pt(52) # For large stat callouts
undefinedFONT_BODY = "Calibri" # 或 "Arial"
SIZE_BODY = Pt(14)
SIZE_SMALL = Pt(11)
SIZE_CITATION = Pt(9)
SIZE_STAT = Pt(52) # 用于大幅数据标注
undefinedLayout Dimensions (python-pptx uses EMU — use Inches/Cm helpers)
布局尺寸(python-pptx使用EMU单位 — 可使用英寸/厘米辅助工具)
python
from pptx.util import Inches, Cm, Pt
SLIDE_W = Inches(13.33) # Widescreen 16:9
SLIDE_H = Inches(7.5)
MARGIN_L = Inches(0.6)
MARGIN_R = Inches(0.6)
MARGIN_TOP = Inches(0.5)
CONTENT_W = Inches(12.1) # SLIDE_W - MARGIN_L - MARGIN_Rpython
from pptx.util import Inches, Cm, Pt
SLIDE_W = Inches(13.33) # 16:9宽屏
SLIDE_H = Inches(7.5)
MARGIN_L = Inches(0.6)
MARGIN_R = Inches(0.6)
MARGIN_TOP = Inches(0.5)
CONTENT_W = Inches(12.1) # SLIDE_W - MARGIN_L - MARGIN_RPhase 4 — Python Code Structure
第四阶段:Python代码结构
Required Setup
所需安装依赖
python
pip install python-pptxpython
pip install python-pptxBoilerplate: Every presentation starts with this
模板代码:所有演示文稿都从以下内容开始
python
from pptx import Presentation
from pptx.util import Inches, Pt, Cm
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.oxml.ns import qn
from pptx.util import Emu
import copypython
from pptx import Presentation
from pptx.util import Inches, Pt, Cm
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.oxml.ns import qn
from pptx.util import Emu
import copy── Presentation setup ────────────────────────────────────────
── 演示文稿设置 ────────────────────────────────────────
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
blank_layout = prs.slide_layouts[6] # Blank layout — always use this
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
blank_layout = prs.slide_layouts[6] # 始终使用空白布局
── Design tokens ─────────────────────────────────────────────
── 设计变量 ─────────────────────────────────────────────
C_DARK_BG = RGBColor(0x1C, 0x2B, 0x3A)
C_DARK_TEXT = RGBColor(0xF0, 0xF4, 0xF8)
C_ACCENT = RGBColor(0x2E, 0x86, 0xAB)
C_LIGHT_BG = RGBColor(0xFA, 0xFB, 0xFC)
C_LIGHT_TEXT = RGBColor(0x1A, 0x1A, 0x2E)
C_MUTED = RGBColor(0x5A, 0x6A, 0x7A)
C_HIGHLIGHT = RGBColor(0xE8, 0xF4, 0xFD)
C_WHITE = RGBColor(0xFF, 0xFF, 0xFF)
FONT_TITLE = "Georgia"
FONT_BODY = "Calibri"
C_DARK_BG = RGBColor(0x1C, 0x2B, 0x3A)
C_DARK_TEXT = RGBColor(0xF0, 0xF4, 0xF8)
C_ACCENT = RGBColor(0x2E, 0x86, 0xAB)
C_LIGHT_BG = RGBColor(0xFA, 0xFB, 0xFC)
C_LIGHT_TEXT = RGBColor(0x1A, 0x1A, 0x2E)
C_MUTED = RGBColor(0x5A, 0x6A, 0x7A)
C_HIGHLIGHT = RGBColor(0xE8, 0xF4, 0xFD)
C_WHITE = RGBColor(0xFF, 0xFF, 0xFF)
FONT_TITLE = "Georgia"
FONT_BODY = "Calibri"
── Core helper: set paragraph text with full formatting ──────
── 核心工具:设置带完整格式的段落文本 ──────
def add_text_box(slide, text, left, top, width, height,
font_name=FONT_BODY, font_size=Pt(14),
bold=False, italic=False, color=None,
align=PP_ALIGN.LEFT, word_wrap=True):
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
tf.word_wrap = word_wrap
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = font_name
run.font.size = font_size
run.font.bold = bold
run.font.italic = italic
if color:
run.font.color.rgb = color
return txBox
def add_text_box(slide, text, left, top, width, height,
font_name=FONT_BODY, font_size=Pt(14),
bold=False, italic=False, color=None,
align=PP_ALIGN.LEFT, word_wrap=True):
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
tf.word_wrap = word_wrap
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = font_name
run.font.size = font_size
run.font.bold = bold
run.font.italic = italic
if color:
run.font.color.rgb = color
return txBox
── Helper: add a filled rectangle ───────────────────────────
── 工具:添加填充矩形 ───────────────────────────
def add_rect(slide, left, top, width, height, fill_color, line_color=None):
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
if line_color:
shape.line.color.rgb = line_color
else:
shape.line.fill.background() # no border
return shape
def add_rect(slide, left, top, width, height, fill_color, line_color=None):
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
if line_color:
shape.line.color.rgb = line_color
else:
shape.line.fill.background() # 无边框
return shape
── Helper: set slide background color ───────────────────────
── 工具:设置幻灯片背景色 ───────────────────────
def set_bg(slide, color: RGBColor):
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = color
def set_bg(slide, color: RGBColor):
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = color
── Helper: add speaker notes ────────────────────────────────
── 工具:添加演讲者备注 ────────────────────────────────
def add_notes(slide, notes_text: str):
"""Add speaker notes to a slide. notes_text must be 800–2000 words."""
notes_slide = slide.notes_slide
tf = notes_slide.notes_text_frame
tf.text = notes_text
def add_notes(slide, notes_text: str):
"""为幻灯片添加演讲者备注,notes_text必须为800-2000字。"""
notes_slide = slide.notes_slide
tf = notes_slide.notes_text_frame
tf.text = notes_text
── Helper: add citation footer ──────────────────────────────
── 工具:添加引用页脚 ──────────────────────────────
def add_citation(slide, citation_text: str):
"""Add a small citation line at the bottom of the slide."""
add_text_box(
slide, f"Source: {citation_text}",
left=Inches(0.6), top=Inches(7.05),
width=Inches(12.1), height=Inches(0.35),
font_name=FONT_BODY, font_size=Pt(8),
italic=True, color=C_MUTED,
align=PP_ALIGN.LEFT
)
def add_citation(slide, citation_text: str):
"""在幻灯片底部添加小型引用行。"""
add_text_box(
slide, f"Source: {citation_text}",
left=Inches(0.6), top=Inches(7.05),
width=Inches(12.1), height=Inches(0.35),
font_name=FONT_BODY, font_size=Pt(8),
italic=True, color=C_MUTED,
align=PP_ALIGN.LEFT
)
── Helper: add left accent bar (visual motif) ───────────────
── 工具:添加左侧强调条(视觉标识) ───────────────
def add_accent_bar(slide):
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(0.1), height=Inches(7.5),
fill_color=C_ACCENT
)
def add_accent_bar(slide):
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(0.1), height=Inches(7.5),
fill_color=C_ACCENT
)
── Helper: add slide number ─────────────────────────────────
── 工具:添加幻灯片页码 ─────────────────────────────────
def add_slide_number(slide, number: int, total: int):
add_text_box(
slide, f"{number} / {total}",
left=Inches(12.0), top=Inches(7.1),
width=Inches(1.2), height=Inches(0.3),
font_name=FONT_BODY, font_size=Pt(8),
color=C_MUTED, align=PP_ALIGN.RIGHT
)
---def add_slide_number(slide, number: int, total: int):
add_text_box(
slide, f"{number} / {total}",
left=Inches(12.0), top=Inches(7.1),
width=Inches(1.2), height=Inches(0.3),
font_name=FONT_BODY, font_size=Pt(8),
color=C_MUTED, align=PP_ALIGN.RIGHT
)
---Phase 5 — Slide Patterns (python-pptx)
第五阶段:幻灯片模板(python-pptx)
Pattern 1: Title Slide (dark background)
模板1:标题页(深色背景)
python
def build_title_slide(prs, title, subtitle, presenter, institution, date):
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_DARK_BG)
# Accent line (horizontal, centered)
add_rect(slide,
left=Inches(0.6), top=Inches(3.9),
width=Inches(12.1), height=Inches(0.04),
fill_color=C_ACCENT
)
# Main title
add_text_box(
slide, title,
left=Inches(0.8), top=Inches(1.2),
width=Inches(11.7), height=Inches(1.8),
font_name=FONT_TITLE, font_size=Pt(40),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.LEFT
)
# Subtitle
add_text_box(
slide, subtitle,
left=Inches(0.8), top=Inches(3.1),
width=Inches(11.7), height=Inches(0.7),
font_name=FONT_BODY, font_size=Pt(18),
color=C_ACCENT, align=PP_ALIGN.LEFT
)
# Presenter + institution + date
add_text_box(
slide, f"{presenter} | {institution} | {date}",
left=Inches(0.8), top=Inches(4.1),
width=Inches(11.7), height=Inches(0.4),
font_name=FONT_BODY, font_size=Pt(12),
color=C_MUTED, align=PP_ALIGN.LEFT
)
add_notes(slide, """[TITLE SLIDE NOTES — 800+ words]
Introduce yourself and your credentials relevant to this topic. Explain why this presentation matters right now and what the audience will gain. State the central question the presentation answers. Outline the structure briefly. Set the tone: this is a rigorous but accessible exploration of [TOPIC].
Mention: How long will this take? Will there be Q&A? Where can they access the slides?
Transition: "Let's begin with an overview of what we'll cover today."
Sources for this slide: [none — title slide]""")
return slidepython
def build_title_slide(prs, title, subtitle, presenter, institution, date):
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_DARK_BG)
# 强调线(水平居中)
add_rect(slide,
left=Inches(0.6), top=Inches(3.9),
width=Inches(12.1), height=Inches(0.04),
fill_color=C_ACCENT
)
# 主标题
add_text_box(
slide, title,
left=Inches(0.8), top=Inches(1.2),
width=Inches(11.7), height=Inches(1.8),
font_name=FONT_TITLE, font_size=Pt(40),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.LEFT
)
# 副标题
add_text_box(
slide, subtitle,
left=Inches(0.8), top=Inches(3.1),
width=Inches(11.7), height=Inches(0.7),
font_name=FONT_BODY, font_size=Pt(18),
color=C_ACCENT, align=PP_ALIGN.LEFT
)
# 演讲者 + 机构 + 日期
add_text_box(
slide, f"{presenter} | {institution} | {date}",
left=Inches(0.8), top=Inches(4.1),
width=Inches(11.7), height=Inches(0.4),
font_name=FONT_BODY, font_size=Pt(12),
color=C_MUTED, align=PP_ALIGN.LEFT
)
add_notes(slide, """[TITLE SLIDE NOTES — 800+ words]
Introduce yourself and your credentials relevant to this topic. Explain why this presentation matters right now and what the audience will gain. State the central question the presentation answers. Outline the structure briefly. Set the tone: this is a rigorous but accessible exploration of [TOPIC].
Mention: How long will this take? Will there be Q&A? Where can they access the slides?
Transition: "Let's begin with an overview of what we'll cover today."
Sources for this slide: [none — title slide]""")
return slidePattern 2: Content Slide (light background, standard layout)
模板2:内容页(浅色背景,标准布局)
python
def build_content_slide(prs, title, bullets, citation, notes_text,
slide_num, total_slides):
"""
bullets: list of strings — each becomes one bullet point
citation: str — source shown at bottom
notes_text: str — 800–2000 words
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# Title bar (dark background strip)
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.LEFT
)
# Bullet points
txBox = slide.shapes.add_textbox(
Inches(0.7), Inches(1.25),
Inches(11.9), Inches(5.5)
)
tf = txBox.text_frame
tf.word_wrap = True
for i, bullet in enumerate(bullets):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.text = f"• {bullet}"
p.space_after = Pt(8)
run = p.runs[0]
run.font.name = FONT_BODY
run.font.size = Pt(14)
run.font.color.rgb = C_LIGHT_TEXT
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidepython
def build_content_slide(prs, title, bullets, citation, notes_text,
slide_num, total_slides):
"""
bullets: 字符串列表 — 每个元素对应一个要点
citation: 字符串 — 底部展示的来源
notes_text: 字符串 — 800-2000字
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# 标题栏(深色背景条)
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.LEFT
)
# 要点列表
txBox = slide.shapes.add_textbox(
Inches(0.7), Inches(1.25),
Inches(11.9), Inches(5.5)
)
tf = txBox.text_frame
tf.word_wrap = True
for i, bullet in enumerate(bullets):
if i == 0:
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.text = f"• {bullet}"
p.space_after = Pt(8)
run = p.runs[0]
run.font.name = FONT_BODY
run.font.size = Pt(14)
run.font.color.rgb = C_LIGHT_TEXT
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidePattern 3: Statistics Infographic Slide
模板3:统计信息图页
python
def build_stats_slide(prs, title, stats, citation, notes_text,
slide_num, total_slides):
"""
stats: list of dicts:
[{"number": "87%", "label": "Adoption Rate", "context": "by 2025 (McKinsey, 2023)"}]
Max 4 stats recommended.
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_DARK_BG)
add_accent_bar(slide)
# Title
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.15),
width=Inches(12.7), height=Inches(0.8),
font_name=FONT_TITLE, font_size=Pt(28),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.LEFT
)
# Stat boxes
n = len(stats)
box_w = (12.1 - 0.3 * (n - 1)) / n
start_x = 0.6
for i, stat in enumerate(stats):
x = start_x + i * (box_w + 0.3)
# Card background
add_rect(slide,
left=Inches(x), top=Inches(1.2),
width=Inches(box_w), height=Inches(5.8),
fill_color=RGBColor(0x25, 0x3C, 0x50)
)
# Big number
add_text_box(
slide, stat["number"],
left=Inches(x + 0.1), top=Inches(1.5),
width=Inches(box_w - 0.2), height=Inches(2.0),
font_name=FONT_TITLE, font_size=Pt(56),
bold=True, color=C_ACCENT,
align=PP_ALIGN.CENTER
)
# Label
add_text_box(
slide, stat["label"],
left=Inches(x + 0.1), top=Inches(3.6),
width=Inches(box_w - 0.2), height=Inches(0.7),
font_name=FONT_BODY, font_size=Pt(15),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.CENTER
)
# Context / source
add_text_box(
slide, stat["context"],
left=Inches(x + 0.1), top=Inches(4.4),
width=Inches(box_w - 0.2), height=Inches(0.6),
font_name=FONT_BODY, font_size=Pt(10),
italic=True, color=C_MUTED,
align=PP_ALIGN.CENTER
)
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidepython
def build_stats_slide(prs, title, stats, citation, notes_text,
slide_num, total_slides):
"""
stats: 字典列表:
[{"number": "87%", "label": "Adoption Rate", "context": "by 2025 (McKinsey, 2023)"}]
建议最多放4个统计项
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_DARK_BG)
add_accent_bar(slide)
# 标题
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.15),
width=Inches(12.7), height=Inches(0.8),
font_name=FONT_TITLE, font_size=Pt(28),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.LEFT
)
# 统计卡片
n = len(stats)
box_w = (12.1 - 0.3 * (n - 1)) / n
start_x = 0.6
for i, stat in enumerate(stats):
x = start_x + i * (box_w + 0.3)
# 卡片背景
add_rect(slide,
left=Inches(x), top=Inches(1.2),
width=Inches(box_w), height=Inches(5.8),
fill_color=RGBColor(0x25, 0x3C, 0x50)
)
# 大数字
add_text_box(
slide, stat["number"],
left=Inches(x + 0.1), top=Inches(1.5),
width=Inches(box_w - 0.2), height=Inches(2.0),
font_name=FONT_TITLE, font_size=Pt(56),
bold=True, color=C_ACCENT,
align=PP_ALIGN.CENTER
)
# 标签
add_text_box(
slide, stat["label"],
left=Inches(x + 0.1), top=Inches(3.6),
width=Inches(box_w - 0.2), height=Inches(0.7),
font_name=FONT_BODY, font_size=Pt(15),
bold=True, color=C_DARK_TEXT,
align=PP_ALIGN.CENTER
)
# 上下文/来源
add_text_box(
slide, stat["context"],
left=Inches(x + 0.1), top=Inches(4.4),
width=Inches(box_w - 0.2), height=Inches(0.6),
font_name=FONT_BODY, font_size=Pt(10),
italic=True, color=C_MUTED,
align=PP_ALIGN.CENTER
)
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidePattern 4: Two-Column Slide
模板4:双列布局页
python
def build_two_col_slide(prs, title, left_header, left_points,
right_header, right_points,
citation, notes_text, slide_num, total_slides):
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# Title bar
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
# Divider line between columns
add_rect(slide,
left=Inches(6.9), top=Inches(1.2),
width=Inches(0.04), height=Inches(5.8),
fill_color=C_ACCENT
)
col_w = Inches(5.9)
for col_x, header, points in [
(Inches(0.5), left_header, left_points),
(Inches(7.1), right_header, right_points),
]:
# Column header
add_text_box(
slide, header,
left=col_x, top=Inches(1.25),
width=col_w, height=Inches(0.5),
font_name=FONT_BODY, font_size=Pt(16),
bold=True, color=C_ACCENT
)
# Bullets
txBox = slide.shapes.add_textbox(col_x, Inches(1.85), col_w, Inches(5.0))
tf = txBox.text_frame
tf.word_wrap = True
for i, pt in enumerate(points):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.text = f"• {pt}"
p.space_after = Pt(7)
run = p.runs[0]
run.font.name = FONT_BODY
run.font.size = Pt(13)
run.font.color.rgb = C_LIGHT_TEXT
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidepython
def build_two_col_slide(prs, title, left_header, left_points,
right_header, right_points,
citation, notes_text, slide_num, total_slides):
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# 标题栏
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
# 列分隔线
add_rect(slide,
left=Inches(6.9), top=Inches(1.2),
width=Inches(0.04), height=Inches(5.8),
fill_color=C_ACCENT
)
col_w = Inches(5.9)
for col_x, header, points in [
(Inches(0.5), left_header, left_points),
(Inches(7.1), right_header, right_points),
]:
# 列标题
add_text_box(
slide, header,
left=col_x, top=Inches(1.25),
width=col_w, height=Inches(0.5),
font_name=FONT_BODY, font_size=Pt(16),
bold=True, color=C_ACCENT
)
# 要点
txBox = slide.shapes.add_textbox(col_x, Inches(1.85), col_w, Inches(5.0))
tf = txBox.text_frame
tf.word_wrap = True
for i, pt in enumerate(points):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.text = f"• {pt}"
p.space_after = Pt(7)
run = p.runs[0]
run.font.name = FONT_BODY
run.font.size = Pt(13)
run.font.color.rgb = C_LIGHT_TEXT
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidePattern 5: Timeline Slide
模板5:时间线页
python
def build_timeline_slide(prs, title, events, citation, notes_text,
slide_num, total_slides):
"""
events: [{"year": "2017", "title": "...", "desc": "..."}]
Max 6 events recommended.
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# Title bar
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
# Horizontal timeline line
line_y = Inches(4.0)
add_rect(slide,
left=Inches(0.8), top=line_y,
width=Inches(11.7), height=Inches(0.06),
fill_color=C_ACCENT
)
n = len(events)
step = 11.7 / (n - 1) if n > 1 else 11.7
for i, ev in enumerate(events):
x = 0.8 + i * step
is_top = (i % 2 == 0)
# Dot
dot = slide.shapes.add_shape(
9, # OVAL
Inches(x - 0.12), line_y - Inches(0.12),
Inches(0.24), Inches(0.24)
)
dot.fill.solid()
dot.fill.fore_color.rgb = C_ACCENT
dot.line.fill.background()
# Year label
add_text_box(
slide, ev["year"],
left=Inches(x - 0.5), top=line_y + (Inches(0.2) if is_top else -Inches(0.55)),
width=Inches(1.0), height=Inches(0.35),
font_name=FONT_BODY, font_size=Pt(11),
bold=True, color=C_ACCENT,
align=PP_ALIGN.CENTER
)
# Event title
add_text_box(
slide, ev["title"],
left=Inches(x - 0.75),
top=line_y + (Inches(0.55) if is_top else -Inches(1.8)),
width=Inches(1.5), height=Inches(1.2),
font_name=FONT_BODY, font_size=Pt(11),
color=C_LIGHT_TEXT,
align=PP_ALIGN.CENTER
)
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidepython
def build_timeline_slide(prs, title, events, citation, notes_text,
slide_num, total_slides):
"""
events: [{"year": "2017", "title": "...", "desc": "..."}]
建议最多放6个事件
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# 标题栏
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
# 水平时间线
line_y = Inches(4.0)
add_rect(slide,
left=Inches(0.8), top=line_y,
width=Inches(11.7), height=Inches(0.06),
fill_color=C_ACCENT
)
n = len(events)
step = 11.7 / (n - 1) if n > 1 else 11.7
for i, ev in enumerate(events):
x = 0.8 + i * step
is_top = (i % 2 == 0)
# 圆点
dot = slide.shapes.add_shape(
9, # OVAL
Inches(x - 0.12), line_y - Inches(0.12),
Inches(0.24), Inches(0.24)
)
dot.fill.solid()
dot.fill.fore_color.rgb = C_ACCENT
dot.line.fill.background()
# 年份标签
add_text_box(
slide, ev["year"],
left=Inches(x - 0.5), top=line_y + (Inches(0.2) if is_top else -Inches(0.55)),
width=Inches(1.0), height=Inches(0.35),
font_name=FONT_BODY, font_size=Pt(11),
bold=True, color=C_ACCENT,
align=PP_ALIGN.CENTER
)
# 事件标题
add_text_box(
slide, ev["title"],
left=Inches(x - 0.75),
top=line_y + (Inches(0.55) if is_top else -Inches(1.8)),
width=Inches(1.5), height=Inches(1.2),
font_name=FONT_BODY, font_size=Pt(11),
color=C_LIGHT_TEXT,
align=PP_ALIGN.CENTER
)
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidePattern 6: Case Study Slide
模板6:案例研究页
python
def build_case_study_slide(prs, title, org, context, action, result,
lesson, citation, notes_text,
slide_num, total_slides):
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# Title bar
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
# Org badge
add_rect(slide,
left=Inches(0.5), top=Inches(1.2),
width=Inches(3.5), height=Inches(0.55),
fill_color=C_ACCENT
)
add_text_box(
slide, org,
left=Inches(0.5), top=Inches(1.2),
width=Inches(3.5), height=Inches(0.55),
font_name=FONT_BODY, font_size=Pt(14),
bold=True, color=C_WHITE,
align=PP_ALIGN.CENTER
)
sections = [
("Context", context, Inches(1.85)),
("Action", action, Inches(3.05)),
("Result", result, Inches(4.25)),
("Lesson", lesson, Inches(5.45)),
]
for label, text, y in sections:
add_rect(slide,
left=Inches(0.5), top=y,
width=Inches(1.1), height=Inches(0.9),
fill_color=C_HIGHLIGHT
)
add_text_box(
slide, label,
left=Inches(0.5), top=y + Inches(0.25),
width=Inches(1.1), height=Inches(0.4),
font_name=FONT_BODY, font_size=Pt(11),
bold=True, color=C_ACCENT,
align=PP_ALIGN.CENTER
)
add_text_box(
slide, text,
left=Inches(1.75), top=y + Inches(0.1),
width=Inches(11.0), height=Inches(0.75),
font_name=FONT_BODY, font_size=Pt(13),
color=C_LIGHT_TEXT
)
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidepython
def build_case_study_slide(prs, title, org, context, action, result,
lesson, citation, notes_text,
slide_num, total_slides):
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# 标题栏
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, title,
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
# 机构标识
add_rect(slide,
left=Inches(0.5), top=Inches(1.2),
width=Inches(3.5), height=Inches(0.55),
fill_color=C_ACCENT
)
add_text_box(
slide, org,
left=Inches(0.5), top=Inches(1.2),
width=Inches(3.5), height=Inches(0.55),
font_name=FONT_BODY, font_size=Pt(14),
bold=True, color=C_WHITE,
align=PP_ALIGN.CENTER
)
sections = [
("Context", context, Inches(1.85)),
("Action", action, Inches(3.05)),
("Result", result, Inches(4.25)),
("Lesson", lesson, Inches(5.45)),
]
for label, text, y in sections:
add_rect(slide,
left=Inches(0.5), top=y,
width=Inches(1.1), height=Inches(0.9),
fill_color=C_HIGHLIGHT
)
add_text_box(
slide, label,
left=Inches(0.5), top=y + Inches(0.25),
width=Inches(1.1), height=Inches(0.4),
font_name=FONT_BODY, font_size=Pt(11),
bold=True, color=C_ACCENT,
align=PP_ALIGN.CENTER
)
add_text_box(
slide, text,
left=Inches(1.75), top=y + Inches(0.1),
width=Inches(11.0), height=Inches(0.75),
font_name=FONT_BODY, font_size=Pt(13),
color=C_LIGHT_TEXT
)
add_citation(slide, citation)
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, notes_text)
return slidePattern 7: References Slide
模板7:参考文献页
python
def build_references_slide(prs, references, slide_num, total_slides):
"""
references: list of full citation strings (APA format recommended)
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# Title bar
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, "References",
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
txBox = slide.shapes.add_textbox(
Inches(0.7), Inches(1.25),
Inches(11.9), Inches(5.9)
)
tf = txBox.text_frame
tf.word_wrap = True
for i, ref in enumerate(references):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.text = ref
p.space_after = Pt(5)
run = p.runs[0]
run.font.name = FONT_BODY
run.font.size = Pt(11)
run.font.color.rgb = C_LIGHT_TEXT
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, "This slide lists all sources cited throughout the presentation. Encourage the audience to consult these references for deeper study. Mention that the slide deck with clickable links will be shared after the session.")
return slidepython
def build_references_slide(prs, references, slide_num, total_slides):
"""
references: 完整引用字符串列表(推荐APA格式)
"""
slide = prs.slides.add_slide(prs.slide_layouts[6])
set_bg(slide, C_LIGHT_BG)
add_accent_bar(slide)
# 标题栏
add_rect(slide,
left=Inches(0), top=Inches(0),
width=Inches(13.33), height=Inches(1.1),
fill_color=C_DARK_BG
)
add_text_box(
slide, "References",
left=Inches(0.3), top=Inches(0.1),
width=Inches(12.7), height=Inches(0.9),
font_name=FONT_TITLE, font_size=Pt(26),
bold=True, color=C_DARK_TEXT
)
txBox = slide.shapes.add_textbox(
Inches(0.7), Inches(1.25),
Inches(11.9), Inches(5.9)
)
tf = txBox.text_frame
tf.word_wrap = True
for i, ref in enumerate(references):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.text = ref
p.space_after = Pt(5)
run = p.runs[0]
run.font.name = FONT_BODY
run.font.size = Pt(11)
run.font.color.rgb = C_LIGHT_TEXT
add_slide_number(slide, slide_num, total_slides)
add_notes(slide, "This slide lists all sources cited throughout the presentation. Encourage the audience to consult these references for deeper study. Mention that the slide deck with clickable links will be shared after the session.")
return slidePhase 6 — Speaker Notes Requirements
第六阶段:演讲者备注要求
MANDATORY Standards
强制标准
| Standard | Requirement |
|---|---|
| Length | 800–2000 words per slide |
| Tone | Popular-science + empathetic (accessible to beginners) |
| Content | Explain every bullet point on the slide in detail |
| Citations | Include full source citations in notes |
| Structure | Opening → Key points → Evidence → Transition |
| Transition | Every note ends with a bridge to the next slide |
| 标准 | 要求 |
|---|---|
| 长度 | 单页800-2000字 |
| 语气 | 科普+共情(适合初学者理解) |
| 内容 | 详细解释幻灯片上的每个要点 |
| 引用 | 备注中包含完整的来源引用 |
| 结构 | 开篇 → 核心要点 → 证据 → 过渡 |
| 过渡 | 每个备注末尾都要有衔接下一页的内容 |
Notes Template (copy for each slide)
备注模板(每页复制使用)
SLIDE [N]: [TITLE]
─────────────────────────────────────────────────────
OPENING:
[2–3 sentences that introduce this slide's theme and connect to the previous one]
EXPLANATION OF EACH POINT:
▸ [Bullet point 1 — exact text from slide]:
[3–5 sentences explaining what this means, why it matters, and how it connects
to the broader topic. Use an analogy or real-world example for clarity.
Mention any nuance or debate in the field.]
▸ [Bullet point 2 — exact text from slide]:
[Same format: explanation + example + nuance]
▸ [Bullet point 3]:
[Same format]
KEY INSIGHT:
[1–2 sentences synthesizing what these points collectively tell us]
COMMON MISCONCEPTION (if applicable):
[Address something students often get wrong about this topic]
REAL-WORLD CONNECTION:
[A concrete example, news story, or application that makes this tangible]
SOURCES CITED ON THIS SLIDE:
- [Full APA citation for source 1]
- [Full APA citation for source 2]
- [URL if applicable]
TRANSITION:
"Having established [summary of this slide], we can now turn to [next slide topic]..."SLIDE [N]: [TITLE]
─────────────────────────────────────────────────────
OPENING:
[2–3 sentences that introduce this slide's theme and connect to the previous one]
EXPLANATION OF EACH POINT:
▸ [Bullet point 1 — exact text from slide]:
[3–5 sentences explaining what this means, why it matters, and how it connects
to the broader topic. Use an analogy or real-world example for clarity.
Mention any nuance or debate in the field.]
▸ [Bullet point 2 — exact text from slide]:
[Same format: explanation + example + nuance]
▸ [Bullet point 3]:
[Same format]
KEY INSIGHT:
[1–2 sentences synthesizing what these points collectively tell us]
COMMON MISCONCEPTION (if applicable):
[Address something students often get wrong about this topic]
REAL-WORLD CONNECTION:
[A concrete example, news story, or application that makes this tangible]
SOURCES CITED ON THIS SLIDE:
- [Full APA citation for source 1]
- [Full APA citation for source 2]
- [URL if applicable]
TRANSITION:
"Having established [summary of this slide], we can now turn to [next slide topic]..."Phase 7 — Citations
第七阶段:引用规范
Rules (MANDATORY)
规则(强制)
- Every content slide must have at least one citation
- Citation on slide: small footer text (9pt, italic, muted color) — author + year or URL
- Citation in notes: full APA citation
- References slide: collects all citations from the entire presentation
- 每个内容页必须至少有一个引用
- 幻灯片上的引用:小型页脚文本(9pt、斜体、muted灰色)—— 作者+年份或URL
- 备注中的引用:完整APA格式引用
- 参考文献页:汇总整个演示文稿的所有引用
Citation Formats
引用格式
python
undefinedpython
undefinedOn-slide citation (brief):
幻灯片上的简短引用:
"McKinsey Global Institute, 2023"
"OECD (2022). https://doi.org/..."
"Nature, Vol. 612, 2022"
"McKinsey Global Institute, 2023"
"OECD (2022). https://doi.org/..."
"Nature, Vol. 612, 2022"
In notes (full APA):
备注中的完整APA引用:
"McKinsey Global Institute. (2023). The state of AI in 2023. McKinsey & Company. https://www.mckinsey.com/..."
"OECD. (2022). Artificial Intelligence in Society. OECD Publishing. https://doi.org/10.1787/eedfee77-en"
---"McKinsey Global Institute. (2023). The state of AI in 2023. McKinsey & Company. https://www.mckinsey.com/..."
"OECD. (2022). Artificial Intelligence in Society. OECD Publishing. https://doi.org/10.1787/eedfee77-en"
---Phase 8 — QA Checklist
第八阶段:质量检查清单
Before saving the file, verify:
CONTENT
□ ≥15 slides generated
□ Every slide has real, specific content (no "Lorem ipsum" or vague text)
□ Every slide has at least one citation
□ References slide includes all cited sources
□ Topic stays focused — no off-topic tangents
DESIGN
□ Title/section slides use dark background (C_DARK_BG)
□ Content slides use light background (C_LIGHT_BG)
□ All titles use FONT_TITLE (Georgia/Palatino)
□ All body text uses FONT_BODY (Calibri/Arial)
□ Accent bar on every content slide
□ Slide numbers on all slides except title
□ No text overflow — all text boxes have sufficient height
SPEAKER NOTES
□ Every slide has notes
□ Every notes section is 800–2000 words
□ Every bullet on every slide is explained in notes
□ Full citations in notes
□ Transition phrase at end of every notes section
PYTHON CODE
□ Code runs without errors: python presentation.py
□ Output file is valid .pptx
□ All slides render correctly保存文件前,请确认:
内容检查
□ 生成≥15页幻灯片
□ 每页内容真实具体(无"Lorem ipsum"或模糊内容)
□ 每页至少有一个引用
□ 参考文献页包含所有引用来源
□ 主题聚焦,无无关内容
设计检查
□ 标题/章节页使用深色背景(C_DARK_BG)
□ 内容页使用浅色背景(C_LIGHT_BG)
□ 所有标题使用FONT_TITLE(Georgia/Palatino)
□ 所有正文使用FONT_BODY(Calibri/Arial)
□ 每个内容页都有左侧强调条
□ 除标题页外所有页面都有页码
□ 无文本溢出,所有文本框高度足够
演讲者备注检查
□ 每页都有备注
□ 每个备注部分为800-2000字
□ 每页的每个要点都在备注中得到解释
□ 备注中包含完整引用
□ 每个备注末尾都有过渡语句
Python代码检查
□ 代码可无错误运行:python presentation.py
□ 输出文件是有效的.pptx文件
□ 所有幻灯片渲染正常Phase 9 — Final Code Template
第九阶段:最终代码模板
python
undefinedpython
undefinedpresentation.py
presentation.py
Topic: [TOPIC]
Topic: [TOPIC]
Language: [LANGUAGE]
Language: [LANGUAGE]
Generated with: python-pptx
Generated with: python-pptx
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
[paste all helpers from Phase 4]
[粘贴第四阶段的所有工具函数]
[paste all pattern functions from Phase 5]
[粘贴第五阶段的所有模板函数]
TOTAL_SLIDES = 19 # update to actual count
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
TOTAL_SLIDES = 19 # 更新为实际页数
prs = Presentation()
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
── Slide 1: Title ────────────────────────────────────────────
── 第1页:标题 ────────────────────────────────────────────
build_title_slide(prs,
title="[FULL TOPIC TITLE]",
subtitle="[DESCRIPTIVE SUBTITLE]",
presenter="[NAME]",
institution="[INSTITUTION / COURSE]",
date="[DATE]"
)
build_title_slide(prs,
title="[完整主题标题]",
subtitle="[描述性副标题]",
presenter="[姓名]",
institution="[机构/课程]",
date="[日期]"
)
── Slide 2: Agenda ───────────────────────────────────────────
── 第2页:议程 ───────────────────────────────────────────
build_content_slide(prs,
title="Agenda",
bullets=[
"1. Context & Background",
"2. Core Concepts",
"3. Current Trends & Data",
"4. Case Study",
"5. Challenges & Opportunities",
"6. Future Outlook",
"7. Key Takeaways & References"
],
citation="[no external source]",
notes_text="""[Full notes 800+ words]""",
slide_num=2, total_slides=TOTAL_SLIDES
)
build_content_slide(prs,
title="Agenda",
bullets=[
"1. Context & Background",
"2. Core Concepts",
"3. Current Trends & Data",
"4. Case Study",
"5. Challenges & Opportunities",
"6. Future Outlook",
"7. Key Takeaways & References"
],
citation="[无外部来源]",
notes_text="""[800字以上完整备注]""",
slide_num=2, total_slides=TOTAL_SLIDES
)
... continue for all 15–19 slides ...
... 继续完成所有15-19页幻灯片 ...
── Save ──────────────────────────────────────────────────────
── 保存 ──────────────────────────────────────────────────────
prs.save("presentation.pptx")
print("✅ Presentation saved: presentation.pptx")
---prs.save("presentation.pptx")
print("✅ Presentation saved: presentation.pptx")
---Quick Reference: Running the Result
快速参考:运行生成的代码
bash
undefinedbash
undefinedInstall dependency
安装依赖
pip install python-pptx
pip install python-pptx
Generate presentation
生成演示文稿
python presentation.py
python presentation.py
Verify output
验证输出
python -c "
from pptx import Presentation
prs = Presentation('presentation.pptx')
print(f'Slides: {len(prs.slides)}')
for i, slide in enumerate(prs.slides, 1):
notes = slide.notes_slide.notes_text_frame.text
print(f' Slide {i}: {len(notes)} chars in notes')
"
undefinedpython -c "
from pptx import Presentation
prs = Presentation('presentation.pptx')
print(f'Slides: {len(prs.slides)}')
for i, slide in enumerate(prs.slides, 1):
notes = slide.notes_slide.notes_text_frame.text
print(f' Slide {i}: {len(notes)} chars in notes')
"
undefined