perfect-presentation

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Perfect Presentation Skill

完美演示文稿制作技能

Core Rules (NEVER break these)

核心规则(绝对不可违反)

  1. Output is Python code only — never write slide content as plain text, only as
    python-pptx
    code
  2. ≥15 slides — always
  3. Language — match the language the user specifies; default to English
  4. Academic & technical — highly professional, specific, no filler content
  5. Citations mandatory — cite sources at the bottom of every slide AND in notes
  6. Speaker notes 800–2000 words — explain every bullet point in depth
  7. Popular-science + empathetic tone in notes — ideal for beginner students
  8. Never use placeholder text — all content must be real, researched, specific

  1. 仅输出Python代码 — 永远不要将幻灯片内容写为纯文本,仅输出
    python-pptx
    代码
  2. 始终保证≥15页幻灯片
  3. 语言 — 匹配用户指定的语言,默认使用英文
  4. 学术&技术风格 — 高度专业、内容具体,无填充内容
  5. 强制引用来源 — 每张幻灯片底部以及备注中都要标注来源
  6. 演讲者备注800-2000字 — 深入解释每个要点
  7. 备注采用科普+共情的语气 — 适合初学者理解
  8. 绝不使用占位符文本 — 所有内容必须是真实、经调研的具体内容

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 TypeContent Focus
1Title SlideTopic, subtitle, presenter, institution, date
2AgendaNumbered sections with brief descriptions
3Executive Summary3–4 key takeaways from the entire presentation
4Context & RelevanceWhy this topic matters now; problem statement
5Historical BackgroundTimeline of key developments
6Key Statistics3–4 large-format data callouts with sources
7Core Concept IFirst major deep-dive topic
8Core Concept I — DetailSupporting evidence, examples, data
9Core Concept IISecond major deep-dive topic
10Core Concept II — InfographicChart, diagram, or process flow
11Current Trends3–5 active trends with evidence
12Trend DataChart or comparison supporting trends
13Case StudyReal-world example: context → action → result
14Challenges & RisksSpecific obstacles with citations
15OpportunitiesForward-looking recommendations
16Future OutlookPredictions, scenarios, roadmap
17Key TakeawaysTop 5 insights from the entire deck
18ReferencesFull bibliography (APA or similar)
19Q&A / Thank YouClosing 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
undefined

DARK 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 RGBColor
python
from pptx.util import Pt
from pptx.dml.color import RGBColor

Title 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
undefined
FONT_BODY = "Calibri" # 或 "Arial" SIZE_BODY = Pt(14) SIZE_SMALL = Pt(11) SIZE_CITATION = Pt(9) SIZE_STAT = Pt(52) # 用于大幅数据标注
undefined

Layout 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_R

python
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_R

Phase 4 — Python Code Structure

第四阶段:Python代码结构

Required Setup

所需安装依赖

python
pip install python-pptx
python
pip install python-pptx

Boilerplate: 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 copy
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 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 slide
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)

    # 强调线(水平居中)
    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 slide

Pattern 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 slide
python
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 slide

Pattern 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 slide
python
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 slide

Pattern 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 slide
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)

    # 标题栏
    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 slide

Pattern 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 slide
python
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 slide

Pattern 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 slide
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)

    # 标题栏
    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 slide

Pattern 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 slide

python
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 slide

Phase 6 — Speaker Notes Requirements

第六阶段:演讲者备注要求

MANDATORY Standards

强制标准

StandardRequirement
Length800–2000 words per slide
TonePopular-science + empathetic (accessible to beginners)
ContentExplain every bullet point on the slide in detail
CitationsInclude full source citations in notes
StructureOpening → Key points → Evidence → Transition
TransitionEvery 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)

规则(强制)

  1. Every content slide must have at least one citation
  2. Citation on slide: small footer text (9pt, italic, muted color) — author + year or URL
  3. Citation in notes: full APA citation
  4. References slide: collects all citations from the entire presentation
  1. 每个内容页必须至少有一个引用
  2. 幻灯片上的引用:小型页脚文本(9pt、斜体、muted灰色)—— 作者+年份或URL
  3. 备注中的引用:完整APA格式引用
  4. 参考文献页:汇总整个演示文稿的所有引用

Citation Formats

引用格式

python
undefined
python
undefined

On-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
undefined
python
undefined

presentation.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
undefined
bash
undefined

Install 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') "
undefined
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') "
undefined