Back to skills
SKILL.md
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
Security analysis
100/100npx -y skills add EtherealMingo/university-teacher-skills --skill lecture-slides --agent claude-codeAre you the author of Lecture Slides?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/etherealmingo-lecture-slides)---
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
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.