Skip to content
Back to skills

Lecture Slides

ASecurity

把教案、教材章节或知识点清单变成能直接上课的 PPT 课件:拆页 → 生成对应配色的 16:9 课件 → 批量写演讲者备注 → 用信息密度自检压掉太满的页。适用于高校日常授课课件,含新授课、复习课、习题课、实验课、导论课五类页面结构模板。本技能只做『讲课用的视觉呈现层』,教学目标与环节设计走 lesson-plan;学术汇报走 paper-to-slides,公众科普走 science-outreach。产出是初稿,图片素材需教师自备。 Triggers: 做课件、把这章做成 PPT、课件太满了帮我精简、给这节课配个课件、明天上课的 PPT 帮我做一下、这页字太多了拆一下、帮我写演讲者备注、按这个教案做个课件、复习课的课件怎么排、课件字号后排看不清。

  • 11 stars
  • 0 votes
  • 1 copy
  • 1 view
  • Added October 20, 2026
educationpythongobash

Security analysis

A100/100

Scanned October 20, 2026

npx -y skills add EtherealMingo/university-teacher-skills --skill lecture-slides --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Lecture Slides?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Lecture Slides
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/etherealmingo-lecture-slides/badge)](https://www.skillsdirectory.com/skills/etherealmingo-lecture-slides)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: lecture-slides
description: "把教案、教材章节或知识点清单变成能直接上课的 PPT 课件:拆页 → 生成对应配色的 16:9 课件 → 批量写演讲者备注 → 用信息密度自检压掉太满的页。适用于高校日常授课课件,含新授课、复习课、习题课、实验课、导论课五类页面结构模板。本技能只做『讲课用的视觉呈现层』,教学目标与环节设计走 lesson-plan;学术汇报走 paper-to-slides,公众科普走 science-outreach。产出是初稿,图片素材需教师自备。 Triggers: 做课件、把这章做成 PPT、课件太满了帮我精简、给这节课配个课件、明天上课的 PPT 帮我做一下、这页字太多了拆一下、帮我写演讲者备注、按这个教案做个课件、复习课的课件怎么排、课件字号后排看不清。"
---

# 日常课件制作

> **Goal**:把教师手上的教案 / 教材章节 / 知识点清单,变成一份**信息密度合格、备注齐全、可直接投屏上课**的 PPTX 初稿。
> 本技能只解决「讲的时候屏幕上显示什么」;「这节课怎么设计」是 `lesson-plan` 的事。
> **产出是初稿** —— 页序、例子、图片、时间分配都要教师按自己的授课风格过一遍。

## 何时使用

- 「做课件」「把这章做成 PPT」「给这节课配个课件」
- 「课件太满了,帮我精简」「这页字太多了」
- 「帮我给课件写演讲者备注」
- 已有课件要改版:字太小、太挤、重点不突出
- 按 `lesson-plan` 刚写好的教案配套出课件

**不适用**:

| 需求 | 走哪个技能 |
|---|---|
| 教案、教学设计、教学环节 | `lesson-plan` |
| 论文 → 组会/学术汇报 PPT | `paper-to-slides` |
| 给中学生/公众讲的科普 PPT | `science-outreach`(本技能的公众版) |
| 教学竞赛示范课(20 分钟节段) | `teaching-contest` |
| 出题、随堂测 | `quiz-generator`、`classroom-live` |

**判断口径**:屏幕上的字是给「台下正在听课的学生」看的 → 本技能;给「评委/同行」看的 → 不是。

## 底座(禁止重写)

| 路径 | 用途 |
|---|---|
| `skills/office-layer/SKILL.md` | 文件产出通道总说明,**先读它再动手** |
| `skills/office-layer/scripts/pptx_kit.py` | `build` / `notes` / `inspect` 三个命令,本技能的**唯一出片工具** |
| `skills/office-layer/bootstrap.sh` | 首次使用装依赖(python-pptx 等) |
| `skills/education-skills/edu-teaching-design/references/lesson-plan-generator.md` | 「引起動機 / 發展活動 / 綜合活動」三段式流程 —— 教案 → 课件的**页序映射依据** |
| `skills/education-skills/edu-teaching-design/references/differentiated-instruction.md` | 同一知识点分层(基础/中等/进阶)时的页面处理思路 |
| `skills/k12-teacher-skills/k12-lesson-prep/SKILL.md` | 备课时「先自己做一遍关键任务」的思路,用于决定哪些页要留白让学生动手 |
| `skills/awesome-benzi/references/LANGUAGE_MODEL.md` | 备注与正文的「AI 味与口水话」治理规则 |
| `skills/slides-polish/SKILL.md` | **仅在需要精美视觉时**:HTML/SVG → 无头 Chrome 截图 → PNG → 嵌入 pptx 的管线 |

**首次使用先装依赖**:

```bash
bash skills/office-layer/bootstrap.sh
```

**环境变量约定**(后文所有命令都用这个):

```bash
PY="skills/office-layer/.venv/bin/python"
```

受限环境下 matplotlib 需要可写缓存(本技能用不到 matplotlib,但同一 venv 被别的技能共用时仍建议先导出):

```bash
export MPLCONFIGDIR=/tmp/mplcache && mkdir -p /tmp/mplcache
```

**为什么必须用 pptx_kit**:它把中文字体写进了 `a:ea`(东亚字体)节点。手写 python-pptx 或让模型直接生成 XML,中文会掉回主题字体,PowerPoint 里标题变成等线,字重全丢。同时 `inspect` 的 220 字符密度口径与生成逻辑是配套的,绕过它就没法自检。

## 前置信息收集(intake,一次性问完)

按 `skills/awesome-benzi/references/INPUT_MODEL.md` 的「一次性问题」机制(`IN-QUESTION-001~005`),
把下面这些**合并成一次提问**,不要边做边问:

1. **课程与层次**:课程名、章节、学科;学生是本科低年级 / 高年级 / 研究生 / 高职
2. **课时**:本次几学时、总共多少分钟(决定页数)
3. **课件类型**:新授课 / 复习课 / 习题课 / 实验课 / 导论课
4. **输入材料**:`lesson-plan` 产出的教案(docx/md)、教材章节扫描、知识点清单、教师已有 PPT —— 有哪样给哪样
5. **教室条件**:投影幕大小、教室纵深、有没有黑板(决定字号与板书提示)
6. **模板要求**:学校/学院是否要求套统一模板(有则给文件)
7. **图片素材**:实验照片、示意图、数据图能否提供(**本技能不生成图片**)
8. **备注**:要不要演讲者备注;学生是否拿到课件(决定是否留白、是否放答案)
9. **考核相关**:本次课是否涉及平时分/评分标准(涉及则一律留人工确认位)

**信息不全时的安全默认值**(不要停下干等,先按默认往下走,并在交付说明里标注哪儿用了默认值):

| 缺什么 | 默认取值 |
|---|---|
| 课件类型 | 新授课 |
| 课时 | 2 学时(90 分钟)→ 20–26 页 |
| 图片素材 | 全部走 bullets + table,**spec 里完全不写 `image` 字段** |
| 学校模板 | 用 pptx_kit 默认学术配色,交付说明标注「未套用贵校模板」 |
| 是否要备注 | 默认写 |
| 教师姓名/院系/联系方式 | `【待补:教师姓名】`、`【待补:院系】`、`【待补:联系方式】` |

## 工作流

### 阶段一 · 讲稿拆页(教案 → 页面大纲)

**输入**:`lesson-plan` 产出的 `教案_<课程名>_<章节>.docx`(或 md 稿、知识点清单)+ 课时 + 课件类型

> `lesson-plan` 不是必需的:教师直接给「这章要讲哪几个知识点」也能起步。有教案时按下面的三段式映射页序;只有知识点清单时,按知识点逐个配「概念页 + 例题页」,再补上导入页与小结页。

**动作**:先出**页面大纲**(markdown 表格),不出 PPT。按三段式流程映射:

| 教案环节 | 时长 | 课件页数 | 页面内容 |
|---|---|---|---|
| 引起動機 | 5–10 min | 2–3 页 | 情境/现象/问题 → 本节要回答的问题 |
| 發展活動 | 25–30 min(每学时) | 每知识点 1–2 页 | 知识点页 + 例题页 |
| 綜合活動 | 5–10 min | 3–4 页 | 小结 → 课堂练习 → 作业/预习 |

**每页必须写成一个结论句**(见「课件设计规范」的 assertion-evidence 一节)。

**输出**:`页面大纲.md`,形如:

| 页 | 标题(结论句) | 形式 | 讲时 |
|---|---|---|---|
| 5 | 先序、中序、后序的区别只在「根」什么时候访问 | bullets | 8 min |
| 6 | 三种遍历只需改三行代码的位置 | table + bullets | 10 min |

**退出条件**:页面总数落在目标区间(90 分钟课 20–26 页),且每页标注了讲时、讲时之和 ≤ 课时。

> **90 分钟课的页数口径**:平均每页讲 3–4.5 分钟。低于 20 页说明内容太稀(学生会走神),超过 26 页说明你在赶进度(一定讲不完)。

### 阶段二 · 写 spec JSON

**输入**:`页面大纲.md`
**动作**:把大纲逐页翻成 pptx_kit 的 JSON 规格。**完整可用示例**(这份 spec 已实测跑通):

```json
{
  "meta": {
    "title": "二叉树的遍历",
    "subtitle": "《数据结构》第 6 章 · 第 2 讲 | 计算机学院 2024 级",
    "presenter": "授课教师:张老师 | 课时:2 学时(90 分钟)"
  },
  "slides": [
    {
      "title": "先序、中序、后序的区别只在「根」什么时候访问",
      "bullets": [
        {"text": "先序:根 → 左 → 右(进节点就访问)", "level": 0},
        {"text": "中序:左 → 根 → 右(左子树回来后访问)", "level": 0},
        {"text": "后序:左 → 右 → 根(子树都处理完才访问)", "level": 0},
        {"text": "遍历路径完全相同,只是访问时机不同", "level": 1}
      ],
      "notes": "【时间】8 min|【过渡】上节课讲完存储结构,这节课回答「怎么把树里的数据按顺序取出来」。\n【举例】让学生用同一棵树分别写出三种序列,对比差异。\n【易错】中序不是「左根右」的字面顺序,而是「左子树全部处理完再访问根」。\n【提问】先序序列的第一个元素一定是根吗?后序的最后一个呢?"
    },
    {
      "title": "三种遍历只需改三行代码的位置",
      "table": {
        "header": ["遍历方式", "visit 位置", "典型用途"],
        "rows": [
          ["先序", "进入节点时", "复制/序列化整棵树"],
          ["中序", "左子树返回后", "二叉排序树有序输出"],
          ["后序", "子树全部返回后", "释放内存、求树高"]
        ]
      },
      "bullets": [
        {"text": "递归函数的骨架三种遍历完全一致", "level": 0},
        {"text": "差异只在 visit(p) 这一行的位置", "level": 1}
      ],
      "notes": "【时间】10 min|【过渡】既然路径一样,那代码差别在哪?\n【板书】在黑板上画同一个递归骨架,用三种颜色标出 visit 的位置。\n【易错】学生容易漏掉空子树返回条件,导致死循环。\n【提问】如果要按层输出,递归还够用吗?(引出下一节层序遍历)"
    },
    {
      "title": "遍历顺序决定二叉排序树能否有序输出",
      "image": "/Users/teacher/课件素材/二叉树遍历示意.png",
      "bullets": [
        {"text": "二叉排序树:左 < 根 < 右", "level": 0},
        {"text": "中序遍历恰好得到升序序列", "level": 0},
        {"text": "先序/后序都拿不到有序结果", "level": 1}
      ],
      "notes": "【时间】12 min|【过渡】为什么教材反复强调中序?因为它是 BST 的「有序性出口」。\n【举例】给出一棵 BST,让学生写出中序序列并与排序结果对照。\n【课堂练习】插入 5 个数后输出中序,限时 3 分钟。"
    }
  ]
}
```

> 上面第 3 页的 `image` 路径是**示意占位**。真实使用时必须换成教师本地图片的**绝对路径**,文件不存在脚本会直接抛 `FileNotFoundError` 且不产出任何文件。**教师没给图,就把整个 `image` 字段删掉**,不要留假路径。

**spec 字段速查**(与 `skills/office-layer/SKILL.md` 一致,此处补充教学场景细节):

| 字段 | 层级 | 说明 |
|---|---|---|
| `meta.title` | 顶层 | 封面主标题,40pt 加粗,左侧有强调竖条 |
| `meta.subtitle` | 顶层 | 副标题,20pt 宋体,写「课程 · 章节 · 班级」 |
| `meta.presenter` | 顶层 | 16pt,写「授课教师 / 院系 / 课时」。**不留真实联系方式,用 `【待补:联系方式】`** |
| `slides[].title` | 每页 | 28pt 加粗,下方自动加强调色分隔线。**写成结论句** |
| `slides[].bullets` | 每页 | 数组;元素可以是字符串,也可以是 `{"text": "...", "level": 0}` |
| `bullets[].level` | — | `0` → 微软雅黑 18pt + `▍` 前缀;**非 0 → 宋体 15pt + `·` 前缀**。层级 2 与 3 视觉上一样,**本层只支持两级** |
| `slides[].table` | 每页 | `{"header": [...], "rows": [[...]], "left": 0.8, "top": 1.5, "width": 11.7}`;表头 14pt 加粗、正文 13pt,行高 0.42 英寸/行,**列宽由脚本均分** |
| `slides[].image` | 每页 | **绝对路径字符串**。固定放在 `left=8.5"`、`width=4.0"`,高度按原图比例;有图时正文栏自动收窄到 7.4" |
| `slides[].notes` | 每页 | 演讲者备注,直接写进备注页(也可事后用 `notes` 命令批量写) |

**退出条件**:spec JSON 通过 `python -c "import json; json.load(open('课件_spec.json'))"` 校验无误,且每页正文字符数按下方公式预估 ≤ 220。

### 阶段三 · 生成 PPTX

**输入**:`课件_spec.json`
**动作**:

```bash
PY="skills/office-layer/.venv/bin/python"
$PY skills/office-layer/scripts/pptx_kit.py build --spec 课件_spec.json --out 课件.pptx
```

`build` 完成后会**顺手把自己 `inspect` 的结果打到 stdout**,也就是一次生成自带一次自检。把上面那份 spec(图片换成真实存在的本地图)跑一遍,实测输出:

```json
{
  "slides": 4,
  "size": "12191695x6858000",
  "detail": [
    {"n": 1, "title": "二叉树的遍历", "chars": 67, "notes_chars": 0, "has_notes": false, "density_warn": false},
    {"n": 2, "title": "先序、中序、后序的区别只在「根」什么时候访问", "chars": 120, "notes_chars": 140, "has_notes": true, "density_warn": false},
    {"n": 3, "title": "三种遍历只需改三行代码的位置", "chars": 68, "notes_chars": 122, "has_notes": true, "density_warn": false},
    {"n": 4, "title": "遍历顺序决定二叉排序树能否有序输出", "chars": 70, "notes_chars": 105, "has_notes": true, "density_warn": false}
  ],
  "overdense": []
}
```

(为省篇幅,`detail` 每页压成了一行;字段名与工具原始输出一致。)

**逐字段读法**:

| 字段 | 含义 | 怎么判 |
|---|---|---|
| `slides` | 总页数 | 应等于「大纲页数 + 1」(+1 是封面) |
| `size` | 画布尺寸(EMU) | `12191695x6858000` = 13.333″×7.5″ = 16:9,正常 |
| `detail[].n` | 页序(1-based,**封面算第 1 页**) | 与 `notes` 的 key 同一口径 |
| `detail[].title` | 取了该页第一个文本的第一行,截断到 40 字符 | 用来确认页序没串 |
| `detail[].chars` | 该页**全部可见文字**的字数(含标题、含 `▍`/`·` 标记符) | **>220 就会进 `overdense`** |
| `detail[].notes_chars` | 备注字数 | `0` = 这页没备注 |
| `detail[].has_notes` | 是否有备注 | 应全为 `true` |
| `overdense` | 过密页的页码数组 | **交付前必须为空** |

**退出条件**:进程退出码为 0,`课件.pptx` 落盘,且 stdout 里 `overdense` 为空数组。

### 阶段四 · 批量写演讲者备注

**输入**:`课件.pptx` + 备注 JSON
**动作**:两种写法,按需选:

- **写法 A(推荐)**:备注直接写在 spec 的 `slides[].notes` 字段里,`build` 一次成型。
- **写法 B**:对已有 pptx(教师的老课件、或后续要单独改备注)批量补写。

```bash
cat > 备注.json <<'JSON'
{
  "1": "【开场 2 min】先问一句:上节课的树结构,大家还记得「度」的定义吗?停顿等学生回应。",
  "2": "【时间】8 min|【过渡】上节课讲完存储结构,这节课回答「怎么把树里的数据按顺序取出来」。|【易错】中序不是字面顺序。|【提问】先序序列的第一个元素一定是根吗?"
}
JSON

# 原地写入(覆盖原文件,最常用)
$PY skills/office-layer/scripts/pptx_kit.py notes --in 课件.pptx --notes 备注.json

# 另存一份(想保留无备注版时用)
$PY skills/office-layer/scripts/pptx_kit.py notes --in 课件.pptx --notes 备注.json --out 课件_含备注.pptx
```

**索引口径(关键)**:`notes` 的 key 是 **1-based 的页序,且第 1 页就是封面页**。封面页的备注用来写开场语。

**静默失败警告**:越界索引**不报错**,只是不出现在返回的 `written` 里。实测把 `{"99": "x"}` 传进一份 4 页的课件,返回:

```json
{"written": [], "total_slides": 4}
```

所以每次写完**必须核对 `written` 数组是否包含你要写的全部页码**,缺页说明页序数错了。

**顺带一个有用的行为**:`notes` 是**局部更新** —— 只覆盖 JSON 里列出的页,没列出的页保留原有备注。
实测:对一份 4 页课件(第 2–4 页已有备注)只写 `{"1": …, "2": …}`,返回 `written: [1, 2]`,第 3、4 页的备注原样保留(`notes_chars` 仍为 122、105)。
所以补写单页备注时,不用把全部备注重写一遍。

**备注该写什么**(详见「讲课节奏与备注」一节):不是把正文念一遍,而是写**过渡语、举例、时间提示、易错点提醒**。

**退出条件**:返回 JSON 的 `written` 长度 == 课件页数,或明确知道哪些页故意没写。

### 阶段五 · 信息密度自检与拆页

**输入**:`课件.pptx`
**动作**:

```bash
$PY skills/office-layer/scripts/pptx_kit.py inspect --in 课件.pptx > 课件_自检.json
```

**退出条件**:

- `overdense` 为空数组
- `detail` 中每一页 `has_notes` 为 `true`(封面页可只写开场语)
- `size` 为 `12191695x6858000`(即 16:9)
- 所有 `【待补:…】`、`【待教师确认:…】` 占位都还在(没被模型补全)

未通过则回到阶段二改 spec 重跑,**不要手改 pptx**。

**怎么读 `overdense` 并改进 —— 一个完整实例**:

第 1 步,跑 `inspect`,看到 `overdense` 非空,先定位是第几页:

```json
{"n": 2, "title": "什么是二叉树:每个节点最多有两个子节点,且左右子树有顺序之分",
 "chars": 250, "notes_chars": 0, "has_notes": false, "density_warn": true}
```
```json
"overdense": [2]
```

第 2 步,读出三件事:**第 2 页超了**(250 > 220)、**超了 30 字**(不是超一点,是超了半页的量)、**这页还没写备注**(`has_notes: false`、`notes_chars: 0`)。
注意 `chars` 已经把标题算进去了 —— 这个标题 30 个字,本身就吃掉 30。

第 3 步,按「拆页四条规则」动手。原来这一页塞了:定义 + 满二叉树 + 完全二叉树 + 左右不可交换 + 节点数性质 —— 这是 **5 个知识点挤一页**。
拆成两页:

- 第 2 页标题改成结论句「二叉树有两个硬约束:最多两个子节点、左右有序」,只留定义 + 左右不可交换;
- 第 3 页标题「满二叉树与完全二叉树是两种『整齐』的特殊形态」,两个形态走 `table`(`[表格 3x3]` 只占几个字符),节点数性质降为一条二级;
- 原来「第 i 层至多 2^(i-1) 个节点」这类性质,移到第 3 页的 `notes` 里口头讲。

第 4 步,重跑 `build`,实测结果:

```json
{"n": 2, "title": "二叉树有两个硬约束:最多两个子节点、左右有序", "chars": 85, "density_warn": false}
{"n": 3, "title": "满二叉树与完全二叉树是两种「整齐」的特殊形态", "chars": 52, "density_warn": false}
```
```json
"overdense": []
```

250 字 → 85 + 52 字,两页都不紧张,而且每页只剩下一个结论。

**如果拆不动,说明是课时问题不是排版问题**:准备的内容本来就多于课时能讲的量。这时候砍内容(把一部分移到下次课或作业),不要继续压字号和挤页面。

### 阶段六 · 交付

**输出**:ppt 文件 + spec + 备注 + 自检报告 + 素材清单,并附一句交付说明(见「产出物」)。

## 课件设计规范

### 1. 单页信息密度:220 字符红线与拆页方法

`inspect` 给每页算一个 `chars`,**超过 220 就把页码丢进 `overdense`**。注意 `chars` 的算法(已核对源码与实测):

```
chars = 标题字数 + 1
      + Σ(每条正文的标记符 + 正文文字)
      + (正文条数 − 1)
```

其中标记符:一级 `▍ ` 算 **2** 个字符,二级 `    · ` 算 **6** 个字符。
**标题也算在内**,页间还有 1 个换行符;如果这页有表格,还会多出 `[表格 4x3]` 这样的短占位串。

**可写预算公式**:

```
正文可写字数 ≈ 220 − 标题字数 − 1 − (2×一级条数 + 6×二级条数) − (条数 − 1)
```

举例:标题 20 字、4 条一级、2 条二级 → 扣掉 `20 + 1 + 20 + 5 = 46`,正文只剩 **174 字**。

**实测的过密页长什么样**:

```json
{"n": 2, "title": "什么是二叉树:每个节点最多有两个子节点,且左右子树有顺序之分",
 "chars": 250, "notes_chars": 0, "has_notes": false, "density_warn": true}
```
```json
"overdense": [2]
```

**拆页四条规则**(按优先级):

1. **一页只留一个结论**。把标题从「什么是二叉树」改成结论句,原本 4 个并列定义就已经是 4 页的量。
2. **定义/性质分家**。「定义 + 三个性质 + 一个注意点」→ 定义 1 页(带一个反例),性质 1 页(走表格)。
3. **表格救场**。并列的短条目(每个 ≤15 字)改写成 `table`,`[表格 4x3]` 只占几个字符,密度立刻降下来。
4. **长句下放备注**。句子里超过 30 字的解释性内容,删掉,移到该页 `notes` 的【举例】里口头讲。

**其他会顶出版面、但 `inspect` 不报的情况**(`inspect` 只数文字,不看版面,必须自己算):

正文文本框的起始高度 `top`(英寸):

```
无表格:top = 1.5
有表格:top = 1.5 + 0.42 × 表格总行数(含表头) + 0.25
```

可用高度 = `7.5 − top − 0.15`(留 0.15 英寸下边距)。行高估算:18pt 中文按 1.2–1.3 倍行距算,**每行约 0.30 英寸**;每条另加 10pt 段后距(0.139 英寸),
即**单行条目 ≈ 0.44 英寸,换行条目 ≈ 0.74 英寸**。

一行能放多少字:正文栏宽 **11.6 英寸**(无图)时一行约 **44 字**;有图时收窄到 **7.4 英寸**,一行只剩约 **27 字**。

| 自查项 | 口径 |
|---|---|
| 可用条目数(无表格、无换行) | 约 **13 条**一级正文 |
| 可用条目数(4 行表格 + 短条目) | 约 **8 条** |
| 换行折算 | 超过 44 字(有图时超 27 字)的条目**按 2 条算** |
| **竖版长图** | 图片固定宽 4.0 英寸,1:2 的竖图高 8 英寸,从 1.5 英寸处开始必然溢出页外 → **只用横版图(4:3 或 16:9)** |
| **表格列数** | 列宽由脚本均分,列一多中文被挤成竖排 → **最多 4 列** |

> 实际上一页条数很多时,通常是 **220 字符红线先触发**;上面这套估算是给「条数多但每条都很短」(比如 15 条四字短语)这种躲过字符检查的情况兜底。

### 2. 字号下限(投屏可读性)

pptx_kit 的字号是**写死在脚本里的**,这套数值就是本技能的**可读性下限**:

| 位置 | 字号 | 字体 | 说明 |
|---|---|---|---|
| 封面主标题 | 40pt 加粗 | 微软雅黑 | 固定 |
| 封面副标题 | 20pt | 宋体 | 固定 |
| 封面署名 | 16pt | 宋体 | 固定 |
| 内页标题 | 28pt 加粗 | 微软雅黑 | 固定,**不要在手改时调小** |
| 一级正文 | 18pt | 微软雅黑 | 本技能的字号地板 |
| 二级正文 | 15pt | 宋体 | **地板中的地板,大会场/直播慎用** |
| 表头 / 表格正文 | 14pt / 13pt | 微软雅黑 | 全篇最小的字,所以表格必须少而短 |

**教室纵深与字号的对应(经验值,非标准,请按自己教室实测微调)**:

| 教室规模 | 纵深参考 | 18pt 一级正文是否够 | 建议 |
|---|---|---|---|
| 小班研讨(≤30 人) | ≤ 6 m | 够,偏保守 | 直接用默认 |
| 普通教室(40–80 人) | 6–10 m | 够 | 直接用默认 |
| 阶梯教室(100–200 人) | 10–15 m | **偏小** | 减少每页条数,或在 PowerPoint 里全选正文放大到 24–28pt |
| 报告厅 / 直播录课 | > 15 m | 不够 | 一页一个结论,正文不超过 3 条,字号手动放大 |

> **诚实交代一个限制**:pptx_kit 不提供字号参数。要放大只能在 PowerPoint 里选中文本框改字号(中文字体设置会保留,因为是逐个 run 写进 `a:ea` 的),或者改用 `skills/slides-polish/` 的 HTML→PNG 路径自行控制排版。**第一次上课前请到最后一排坐一下,看一眼最下面那行字**,这是唯一可靠的验收方式。

**反面清单**:不要为了塞内容把字号调小;不要用 12pt 以下的字;不要在图片里嵌小字(截图里的代码按 1:1 贴上去一定看不清,宁可拆成两页放关键几行)。

### 3. 每页一个核心观点(assertion-evidence)

**标题写结论,正文给证据。** 标题是这一页要学生记住的那句话,不是这一页的「话题名」。

| ❌ 话题式标题(原教案常见) | ✅ 结论式标题(改成这个) |
|---|---|
| 二叉树的遍历 | 三种遍历的区别只在「根」什么时候访问 |
| 二叉排序树的性质 | 中序遍历是二叉排序树唯一的「有序出口」 |
| 实验步骤 | 先做空白对照,否则数据无法归因 |
| 误差分析 | 系统误差靠校准消掉,随机误差只能靠重复 |
| 本章小结 | 三个公式能解 90% 的题,先看单位挑哪一个 |
| 考试范围 | 这五类题必考,其余只考概念 |

**判定方法**:把标题单独读出来,如果它是一句能被学生复述、能被判对错的话,就是结论句;如果读完不知道这一页在说什么观点,就是话题名,重写。

**正文的三条纪律**:

- 正文只放**支撑这个结论的证据**:数据、对比、反例、适用条件。不相关的背景知识删掉。
- **一页一个结论**。发现一页里有两个「所以」,就是两页。
- 结论句不要超过 **20 字**(标题过长会挤掉正文预算,也会让 28pt 的字换行)。

### 4. 图表优于文字,对比优于罗列

本层**不生成图表**(`pptx_kit` 只做文字、表格、插图)。所以处理方式是:

| 内容形态 | 怎么做 |
|---|---|
| 3 个以上并列的短条目 | **改成 `table`**。表格是 `pptx_kit` 里密度最低的表达方式 |
| 两组事物的差异 | **对比表**,列为「维度 / A / B」,或「做法 / 后果 / 正确做法」 |
| 变化趋势、分布、比例 | 教师自备图表图片,用 `image` 字段插入;也可先用 `xlsx_kit.py analyze` 出 Excel 图表再自行导出 PNG |
| 流程、结构、关系 | 教师自备示意图(自己画或从教材取),或用 `skills/slides-polish/` 的 HTML/SVG 管线生成 |
| 一行公式 / 一句关键话 | 单独一页,只放这一句 |

**对比优于罗列的写法示例**(习题课、复习课最好用):

```
❌ 罗列:常见的错误有 ① 忘记判空 ② 混淆左右 ③ 递归无终止条件
✅ 对照表:
   header: ["错误做法", "出现的现象", "正确做法"]
   rows:   ["忘记判空",   "运行时空指针崩溃", "递归入口先判 p == null"]
           ["混淆左右",   "中序序列乱序",     "先画图确认左右子树"]
           ["无终止条件", "栈溢出",           "以空子树为基准情形"]
```

**能用图就别用字。** 一张示意图能省掉一页文字,但**图必须真实反映内容** —— 不要为了好看插入与知识点无关的装饰图;也不要写「如图 1 所示」却不给图(这种引用一律改成文字描述,或删掉这句)。

### 5. 配色(学术场景低饱和、投影不刺眼)

pptx_kit 的配色是固定的,也是本技能的配色规范:

| 用途 | 色值 | 说明 |
|---|---|---|
| 标题 | `#1F2D3D`(深墨蓝) | 比纯黑柔和,投影不刺眼 |
| 正文 | `#333333`(近黑灰) | 长时间阅读不累 |
| 强调 / 分隔线 / 封面竖条 | `#0B5C8A`(低饱和学术蓝) | 全篇唯一的强调色 |
| 二级正文 | `#555F6B`(灰蓝) | 弱于正文,形成层次 |
| 底色 | 白 | 教室投影最稳 |

**三条配色纪律**:

1. **全篇只有一个强调色**(`#0B5C8A`)。不要引入大红、荧光绿、橙黄来做「重点」。
2. **重点靠加粗和位置,不靠颜色**。一页里想强调的东西超过一个,说明这页该拆了。
3. **绝不使用高饱和撞色、渐变背景、投影阴影**。教室投影仪的对比度普遍偏低,浅底深字永远比深底浅字稳;红绿搭配在部分投影上会糊成同色(也存在色觉障碍问题)。

需要在 PowerPoint 里微调时,**只动这三四个色值**,不要新建配色方案。

## 讲课节奏与备注

### 用 `notes` 批量写

命令与索引口径见「阶段四」。要点重述一遍:**key 是 1-based 页序,第 1 页是封面**;越界索引静默丢弃,必须核对返回的 `written`。

### 备注写什么

备注是**给讲课时的自己看的提词**,不是讲稿。实测每条 60–160 字比较合适(对应 1–2 分钟的口头展开)。

**五段式模板**(能覆盖 90% 的页):

```
【时间】8 min(累计 23/90)|【过渡】上一页讲完 X,这一页回答 Y
【举例】用学生熟悉的 Z 举例
【易错】学生常把 A 当成 B
【提问】如果改成 C,结论还成立吗?
【板书】在黑板上同步画递归骨架
```

| 该写 | 不该写 |
|---|---|
| **过渡语**:从上一页到这一页的衔接句 | 正文的复述(屏幕上有,不用再抄一遍) |
| **举例**:举什么例子、用哪个学生熟悉的场景 | 逐字稿(讲课不是念稿) |
| **时间提示**:本页讲几分钟、累计到多少分钟 | 「本节课我们将学习……」「让我们一起来看……」这类空话 |
| **易错点**:学生历年在这个点上错在哪 | 与本页无关的扩展知识(那是下一节课的事) |
| **提问设计**:问什么、停顿多久、期待什么回答 | 对学生的评价性预设(「这里学生肯定不懂」) |
| **动手环节**:课堂练习的限时与巡场重点 | |
| **板书提示**:什么时候切到黑板、画什么 | |

**时间锚点必须闭合**:所有页的【时间】之和要等于课时。写完后自查一遍,超了就是内容多了,砍页;少了就是讲得太快,补例题。90 分钟的课建议每 4–5 页放一个累计时间锚点(如「累计 45/90,正好下课时点」)。

**备注的语言纪律**:按 `skills/awesome-benzi/references/LANGUAGE_MODEL.md` 的「AI 味与口水话」一节处理 —— 删掉「值得注意的是」「综上所述」「让我们」这类转承词,改成人真的会说的话(「这里停一下」「注意这一步」「上次作业错在这」)。

## 常见课件类型模板

五类课件的**页面骨架**如下。封面页由 `meta` 自动生成,所以下面的「第 1 页」都指第一个内容页。

### 1. 新授课(90 分钟 ≈ 20–26 页)

| 页序 | 页面 | 形式要点 |
|---|---|---|
| 封面 | 课程 · 章节 · 班级 · 教师 | meta |
| 1 | 上节回顾 + 本节定位 | bullets,一句话衔接 |
| 2 | 本节要回答的问题(不是「学习目标」列表) | 1 条一级 + 2 条二级 |
| 3 | 情境导入 / 现象 / 反例 | 尽量配图,无图则用提问 |
| 4–N | 知识点页,**一页一结论** | 每个知识点 1–2 页(概念页 + 例题页) |
| N+1 | 课堂练习(题面) | 只放题面,**答案单独下一页** |
| N+2 | 练习解答 | 分步骤,标注易错处 |
| N+3 | 小结(≤3 条,与前面标题一一对应) | bullets,每条 ≤15 字 |
| N+4 | 作业 / 预习任务 | 明确到题号与截止时间 |
| 末页 | 结束页 | 一句话,不要写「谢谢聆听」以外的内容 |

备注重点:过渡语 + 每 15 分钟一个时间锚点 + 每个知识点的易错点。

### 2. 复习课(90 分钟 ≈ 12–18 页)

| 页序 | 页面 | 形式要点 |
|---|---|---|
| 1 | **知识地图**:本章所有考点一张全景 | 无图时用两级 bullets 表达层级 |
| 2 | 考点频次 / 权重表 | **必须是 table**,数据由教师提供 |
| 3–6 | 易错点对照表,**一页一个易错点** | `["错误做法","后果","正确做法"]` |
| 7–N | 典型题:**题面页 / 思路页 / 解答页 分开** | 题面页只放题干与限时 |
| N+1 | 自测清单(学生自己勾) | bullets,10 条以内 |
| 末页 | 考试相关提醒 | 涉及范围/比例一律 `【待教师确认:…】` |

**关键差异**:新授课是「从无到有」,复习课是「把散点连成网」。所以复习课**一定要有第一页的全景图**,且后面每一页都能指回全景图上的某个点。

### 3. 习题课(90 分钟 ≈ 12–20 页)

| 页序 | 页面 | 形式要点 |
|---|---|---|
| 1 | 本次题目清单表 | table:题号 / 考点 / 难度 / 分值 |
| 2–N | 逐题三页组:**题干页 → 思路页 → 完整解答页** | 题干页只放题干 + 限时;思路页只放「从哪下手」 |
| 可选 | 变式页 | 改一个条件,让学生当场判断结论是否变化 |
| 末页 | 解题模板 / 检查清单 | bullets,可复用的固定步骤 |

**关键差异**:**题目与解答绝不能同页**。同页的话学生只抄答案不看思路,这节课就白讲了。
**红线**:题目来源(教材题号、真题年份、自编题)必须由教师提供,**不得虚构题号与出处**。

### 4. 实验课(90 分钟 ≈ 10–16 页)

| 页序 | 页面 | 形式要点 |
|---|---|---|
| 1 | 实验目的与原理 | 原理公式一页一行,不要堆 |
| 2 | **仪器与安全须知(独立一页,不能省)** | 用 `▍` 一级条目,危险操作单独加粗 |
| 3–N | 操作步骤,**图为主** | 图必须教师自备;无图时步骤文字每条 ≤25 字 |
| N+1 | 数据记录表模板 | **必须是 table**,列头与学生记录本一致 |
| N+2 | 数据处理与误差分析 | 公式 + 常见错误 |
| 末页 | 报告要求与评分标准 | 评分比例一律 `【待教师确认:评分标准】` |

**关键差异**:安全须知必须**独立成页**且放在操作步骤**之前**,不能并进「注意事项」里一笔带过。
**备注重点**:仪器易错操作、数据异常时的处理、巡场时重点看哪几组。

### 5. 导论课 / 第一堂课(90 分钟 ≈ 8–12 页)

| 页序 | 页面 | 形式要点 |
|---|---|---|
| 1 | 为什么学这门课(学科图景 / 现实问题) | 一个真实问题,不要讲课程重要性套话 |
| 2 | **课程地图**:全部章节及逻辑关系 | 一页讲清全学期结构,这是本类课最重要的页 |
| 3 | 考核方式与平时分构成 | 比例一律 `【待教师确认:考核比例】` |
| 4 | 教材与参考资料 | **只写教师提供的真实书目**,无则 `【待补:教材信息】` |
| 5 | 学习方法建议 | 3–4 条,具体到动作(「课前 10 分钟看提纲」) |
| 6 | 这门课能带给你什么 | 能力导向,不要空话 |
| 末页 | 联系方式与答疑安排 | `【待补:联系方式】`、`【待教师确认:答疑时间】` |

**关键差异**:导论课的功能是**建立预期**。课程地图比任何一页都重要;考核比例没有教师确认就不要写数字。

## 产出物

> **命名约定**:与 `lesson-plan` 保持一致,用 `课件_<课程名>_<章节>.pptx`,这样同一门课的材料能归到一起。
> 下面这张表和后文命令示例里为了好读,统一简写成 `课件.pptx` / `课件_spec.json`,实际交付时请换成带课程与章节的全名。

| 文件 | 内容 | 说明 |
|---|---|---|
| `课件_<课程名>_<章节>.pptx` | 16:9 课件本体,含演讲者备注 | **主交付物**,office-layer 生成 |
| `课件_<课程名>_<章节>_spec.json` | 生成用的完整规格 | 必须一起交付,教师改内容后可直接重跑 |
| `备注.json` | 演讲者备注(用写法 B 时) | 页序 1-based |
| `页面大纲.md` | 教案 → 逐页映射表(含讲时) | 阶段一产物,便于教师调整节奏 |
| `课件_自检.json` | `inspect` 的完整输出 | 密度自检留痕 |
| `素材清单.md` | 每页用了哪些图片、来源于哪里、哪几页还缺图 | **缺图清单要显眼**,便于教师补 |

**交付说明模板**(必须对教师说清):

> 这是课件**初稿**,请重点核对三处:① `【待补:…】` 与 `【待教师确认:…】` 占位;② 每页标题的结论是否符合你的讲法;③ 备注里的时间和举例。另外:本课件**未套用贵校模板**(如需要请提供模板文件),**所有图片需你自备**(见 `素材清单.md`),页序可按你的授课节奏调整。

## 红线

1. **不虚构数据与文献**。课件里的每个数字、图表、文献、教材页码、题号都必须来自教师提供的材料。没有就留 `【待补:数据来源】` / `【待补文献】`。课堂上一句话的错误数据,学生记一辈子。
2. **图片必须教师自备**。不生成图片、不从网络找图、不凭空写图片路径。
   - `image` 字段只写**真实存在的绝对路径**;
   - 教师没给图,就把 `image` 字段**整条删掉**(写空串、写占位路径都会让 `build` 报 `FileNotFoundError` 并**不产出任何文件**);
   - 不要写「如图 1 所示」却不给图;课件里引用的示意图内容必须与页面的知识点一致。
3. **课件是初稿,不是终稿**。页序、标题措辞、例子、时间分配都要教师按自己的授课风格过一遍。交付时必须说清「这是初稿,请核对 X/Y/Z」,不能用终稿口吻交付。
4. **不越界做教案**。本技能只做视觉呈现层。教学目标、教学环节、学情分析走 `lesson-plan`;本技能不重写教学设计。
5. **评价性内容留人工确认位**。平时分构成、考核比例、评分标准、实验报告要求涉及判断,一律 `【待教师确认:…】`,AI 不写具体数字。
6. **不生成、不写入学生个人信息**。课件的受众是全体学生,任何成绩、学号、姓名单都不进课件;敏感数据只在本机处理。
7. **不绕过 office-layer**。不用文本框拼伪表格,不手搓 OOXML,不用 python-pptx 直连绕过本层,不产出 markdown 冒充课件。
8. **改动脚本内置样式要慎重**。字号与配色是 `inspect` 密度口径的配套基准,擅自改动会让自检结论失效;要自定义视觉请走 `skills/slides-polish/`。

## 自检清单

交付前逐项过:

- [ ] 页数落在目标区间(90 分钟课 20–26 页,复习/实验/导论课按各自模板区间)
- [ ] 每一页的标题都是**结论句**,能被学生复述(不是话题名)
- [ ] 每页**只有一个**核心观点
- [ ] `inspect` 输出里 `overdense` 为空数组
- [ ] `size` 为 `12191695x6858000`(16:9)
- [ ] 每页 `has_notes` 为 `true`,且备注不是正文的复述
- [ ] 备注里的【时间】之和 ≤ 课时,且每 4–5 页有累计时间锚点
- [ ] `notes` 命令返回的 `written` 覆盖了所有要写的页码(越界索引会被静默丢弃)
- [ ] 所有 `image` 路径都是**真实存在的绝对路径**;缺图的页在 `素材清单.md` 里列出来了
- [ ] 版面溢出隐患逐页算过:竖版长图、条目数超可用高度、>4 列表格
- [ ] 表格用于并列与对比,而不是把长句塞进单元格
- [ ] 全篇只有 `#0B5C8A` 一个强调色,没有高饱和撞色
- [ ] 所有 `【待补:…】`、`【待教师确认:…】` 占位都还在,没有被模型补全
- [ ] 课件里没有出现学生姓名、学号、成绩
- [ ] PPTX 由 `skills/office-layer/scripts/pptx_kit.py` 生成(不是手搓 XML、不是 markdown)
- [ ] 交付说明写明了「初稿 + 未套用模板 + 图片需自备 + 请核对占位」

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.