zgs-ppt:职规赛展示 PPT 的框架与成稿
把"选手的一堆材料"变成一份每页只讲一个论点、且撑得住追问的展示 PPT。先出大纲,人点头,自检通过,再出 .pptx。
设计原则(三条,贯穿全程)
- 大纲先行,一次只改一处:内容质量在大纲阶段解决,渲染只做视觉翻译。用户的修改意见永远落回
outline.json再重跑,不直接改 pptx——改了 pptx 下次重跑就丢。 - 每页撑得住一次追问:页面是答辩的靶子,不是排版的容器。一页如果答不出"所以呢"和"凭什么",这页就不该存在。
- 阅读型,不是演讲型:评委自己翻也能读完论点与证据;口播只做导引。任何一页脱离口播就读不懂,必须改,不能靠讲。
0 产物与文件索引
| 产物 | 说明 |
|---|---|
outline.json |
唯一事实源。字段见 references/slide-types.md,脚本只认它 |
<姓名>-<赛道>展示-大纲.md |
人读视图:逐页论点、文案、证据位、口播要点、风险 |
<姓名>-<赛道>展示.pptx |
16:9 可编辑,17 种页型,3 套主题,可套学校模板,15–20 页 |
同名 .pdf |
由 LibreOffice 转换(有 soffice 时) |
<输出名>-audit.md |
紧度/溢出/页数/维度覆盖/信息量/素材缺口 |
不做的:不打分(zgs-review)、不出题库(zgs-qa)、不写逐字稿正文(只给每页口播要点)、不代写生涯发展报告与简历。
文件索引——何时读哪一份:
| 文件 | 用途 | 何时读 |
|---|---|---|
references/material-intake.md |
18 字段材料清单 | Step 1 材料不全时 |
references/page-skeletons.md |
三套 15–20 页骨架 + 每页常见错误 | Step 2 排页前 |
references/awarded-cases.md |
上届 7 个金奖案例与 7 条结构规律 | Step 2 排页前 |
references/platform-frameworks.md |
五套平台框架 + 12 条共性 + 新旧评分口径 | Step 2 校验漏项 |
references/slide-types.md |
17 种页型的字段与字数上限 | Step 3 写 JSON 时手边放 |
scripts/extract_content.py |
材料转文本(带页码锚点) | Step 1 |
scripts/build_pptx.py |
审计 + 渲染 | Step 5、Step 6 |
scripts/verify_pptx.py |
渲染级复核(越界/压字/过小字号) | Step 7 |
scripts/check_deck.py |
文件级复核(页数/尺寸/备注) | Step 7 |
1 输入:先判断材料够不够
| 情况 | 表现 | 做法 |
|---|---|---|
| A 有完整材料 | 报告/简历/旧 PPT/证书齐 | 直接抽取,进 Step 2 |
| B 只有零散信息 | 口头讲了几句,没文件 | 按 references/material-intake.md 的 18 字段当面问,缺的记进 gaps |
| C 只有目标 | "我想做新能源方向的 PPT" | 先问 5 个决定性问题:组别、目标岗位(岗位名+单位类型+地域)、三条硬证据、一次亲身经历、备选岗位 |
材料是 PDF/DOCX/PPTX/MD/TXT 时,先跑:
python3 scripts/extract_content.py <材料文件> <输出.txt>
抽取结果带页码锚点(P 3 / 幻灯片 5),写大纲时用它标"证据出自哪一页",方便回查。
提取失败就停,不要假装材料里没有内容:
| 症状 | 含义 | 处置 |
|---|---|---|
报 ModuleNotFoundError / 找不到命令 |
依赖缺失 | 按 §12 给安装命令,停在这一步,不改用网页工具 |
| 输出几乎没有汉字 | 扫描件,无文字层 | 告知"该 PDF 没有文字层,请提供可复制文本或先 OCR",停 |
| 文本与文件名对不上 | 拿错文件 | 报出路径与首行内容,请用户确认,停 |
2 定组别与页数预算
页数由组别决定,不由材料多少决定。所有组别 15–20 页(下限 15,上限 20):
| 组别 | 陈述 | 页数 | 页均口播 | 重心 |
|---|---|---|---|---|
| Z1 成长·高教 / Z2 成长·职教 | 7′ | 16–18(区间 15–20) | ≈23–26″ | 目标缘起 + 行动递进 + 复盘调整 |
| Z3 就业·本科 / Z4 就业·研究生 | 6′ | 15–17(区间 15–20) | ≈21–24″ | 岗位胜任力 + 证据 + 发展潜力 |
| Z5 就业·职教 | 6′ | 16–18(区间 15–20) | ≈20–23″ | 实操胜任力 + 安全规范 + 带人 |
页数上调的代价要讲清楚:7 分钟 17 页每页只有 25 秒,6 分钟 16 页只有 22 秒——这已经不是"演讲"的节奏,而是"评委自己看、你只做导引"的节奏。
页数上调后多出来的 3–5 页,优先补这四类(不是把每页拉长,而是补此前被挤掉的页):
- 岗位调研实录(拆了几份 JD、访谈了几人、得出什么结论)——评委最爱追问,也最容易被省;
- 人岗匹配度(匹配进度图,含未达标项)——主动认缺口的落点;
- 二次证据页(证书墙/台账/现场照,把硬证据集中放一处);
- 风险预案(竞争、技术迭代、家庭约束 + 对策)——就业赛道的"发展潜力"、成长赛道的"优化改进"都靠它落地。
若组别是职教(Z2/Z5),另加"安全与规范"独立页;若选手目标是海外/驻外岗,另加"家庭与地域约束"页。
3 写大纲:outline.json 是唯一事实源
3.1 单一源纪律(最容易出错的一步)
outline.json 与 -大纲.md 不是两份稿件,是一份内容的两个视图:
outline.json |
-大纲.md |
|
|---|---|---|
| 谁读 | build_pptx.py |
人(用户、评委、写逐字稿的人) |
| 地位 | 唯一事实源 | 它的视图 |
| 什么时候改 | 所有内容修改 | 只跟着 JSON 同步,不独立增删页 |
于是有三条硬规矩:
- 改内容只改 JSON,然后重跑 build 看审计,再同步 md——反过来(只改 md)会在下次渲染时静默丢失;
- 改结构(加/删/换页)只改 JSON,md 整段重写,不要在两处各改一半;
- 交付前必须核一遍两边页序与标题,这是唯一能发现漂移的办法(比对 md 里的「页面标题」字段):
python3 - <<'PY'
import json, re
d = json.load(open("outline.json", encoding="utf-8"))
md = open([f for f in __import__("glob").glob("*-大纲.md")][0], encoding="utf-8").read()
sl = d["slides"]
content = re.findall(r"^- \*\*页面标题\*\*:(.+?)(一级)\s*(.+?)(重点句)$", md, re.M)
mains = re.findall(r"^- \*\*主标题\*\*:(.+)$", md, re.M)
print(f"JSON {len(sl)} 页 | 大纲:封面封底主标题 {len(mains)}、内容页 {len(content)}")
bad = []
if len(mains) == 2:
if sl[0]["title"] != mains[0].strip():
bad.append(f"P1「{mains[0].strip()}」")
if sl[-1]["title"] != mains[1].strip():
bad.append(f"P{len(sl)}「{mains[1].strip()}」")
for i, (dim, title) in enumerate(content, 2):
if sl[i - 1].get("dim") != dim.strip():
bad.append(f"P{i} 维度「{dim.strip()}」")
if sl[i - 1]["title"] != title.strip():
bad.append(f"P{i} 标题「{title.strip()}」")
print("全部对齐" if not bad else "需修:" + ";".join(bad))
PY
它一次核三件事:封面与封底的主标题是否等于 JSON 首末页的 title、内容页「(一级)」的维度是否等于 dim、「(重点句)」是否等于 title。预期输出「全部对齐」;若有差异,说明某页改过但只改了一边,同样要修。真正抓不到的是"只改了详细内容里的措辞",那种只能靠规矩:改内容一律先改 JSON。
3.2 写大纲时守住五条
- 一页一个论点:标题写论点("我原本不该选这条路"),不写栏目名("自我认知")。
- 数字要有口径:每个数字能在追问时说出"谁统计、什么范围、什么时候"。
- 证据位写死:这一页放哪份证书、哪张照片、哪条数据,没有就写"待补"并进 gaps。
- 维度要有落点:给每页标
dim,成长用「职业目标 / 学习实践行动 / 优化改进」,就业用「职业目标 / 岗位胜任力 / 发展潜力」。三页全标同一个维度,说明结构偏了。 - 每页能独立读懂:标题是论点,正文有 2–6 条可读信息,关键数字用小字
note标口径。
3.3 阅读型的三个具体动作
- 加小字:
bullets每条可带note(时间/出处/口径),timeline每个节点可带detail,kpi每张卡可带note; - 一页装两个层次:论点在上,证据/说明在下(
detail、cards、twocol都是为这个设计的); - 别怕满,怕乱:每页 90–320 字是舒适区,超过 520 字审计会提示拆页。
3.4 顶层四件事必填
group(Z1–Z5)、group_label(页脚文字)、theme(主题)、gaps(缺口数组)。gaps 里把缺的素材写成句子("缺企业实习证明""缺岗位招聘公告截图"),会进审计报告,也是答辩前要补的清单。
人读版按三部分写,字段固定:
| 部分 | 页 | 字段 |
|---|---|---|
| 封面 | P1 | 主标题 / 副标题 / meta 四行(组别、学校专业年级、姓名、目标岗位) |
| 内容页 | P2 起 | 页面标题 / 核心观点 / 详细内容 / 证据 |
| 封底 | 末页 | 主标题 / 口号 |
封面与封底的主标题不带层级标注(它们不属于任何评分维度);内容页的页面标题按两层写(见下)。
### P3 三个劝退我的理由 · bullets
- **页面标题**:职业目标(一级) 三个劝退我的理由(重点句)
- **核心观点**:我一开始的退缩来自不了解,不是来自判断——所以还能改。
- **详细内容**:
1. 学院的专业预警名单里有它,我看过那张表(2025.09)。
2. 行业出清的说法传了两届,没人给出处。
3. 家里希望我考公,稳定、能回家。
- **证据**:教育部就业质量报告(P12)、2024 校招公告(P3)。
> 追问:第②条的数据哪来的?→ 备好口径,说不清就删掉这条。
页面标题按两层写:维度(一级) 论点句(重点句)。括号是层级标注,供排结构、核维度用,不进页面——页面上只渲染论点句本身(即 JSON 的 title)。页头因此不再重复 · 维度:xxx。
四项里只有两项上版面:
| 字段 | 上版面 | 用途 |
|---|---|---|
| 页面标题 | 是(只渲染重点句) | 页面唯一的大字 |
| 详细内容 | 是 | 页面的 3–6 条正文 |
| 核心观点 | 否 | 口播第一句、整页的判断——讲的时候说,不写进页面 |
| 证据 | 否 | 答辩备查的出处与原件位置,不占版面 |
页脚的「追问」同样不上版面,供押题用。本文档不写口播逐字稿与秒数——口播内容放在 outline.json 的 notes 里,渲染时进 pptx 备注栏。
四项各自的写法:
| 字段 | 写什么 | 常见错误 |
|---|---|---|
| 页面标题 | 维度+论点句,论点与 JSON 的 title 逐字一致 |
写成栏目名("自我认知") |
| 核心观点 | 这一页要让评委记住的那一句判断,含"所以" | 复述标题,等于没写 |
| 详细内容 | 3–6 条具体事实,每条能独立成句,带时间与数字 | 抽象概括、形容词堆叠 |
| 证据 | 出处/原件/编号,缺就写"待补"并进 gaps | 写"查阅了资料" |
4 卡点:一次问清三件事
不要分三次问,用户会被打断到烦。把三件事放进一次提问:
| 问什么 | 为什么必须现在问 |
|---|---|
| 页序与每页论点认可吗 | 大纲改一页是改一段话,PPTX 改一页要重排版面、重算字号 |
| 主题用哪套(见下表,给推荐) | 换主题等于重刷全部配色,渲染后再换成本翻倍 |
| 要不要套学校模板 | 有模板就得先拿到文件,否则渲染完再套等于重排 |
> 模板句:「这 18 页的顺序和每页论点你认可吗?主题我建议 tech(工科气质),如果学校有规定模板请发我。确认后我再出 PPTX。」
用户说"你先出个版本我看看"可以出,但要提前说明"版面按大纲锁定,改结构需要重跑"。
主题按岗位气质选,别按喜好选:
| 主题 | 适合 | 观感 |
|---|---|---|
academic(学术蓝) |
成长赛道、教育/科研/公共管理 | 稳、可信 |
tech(青绿+琥珀) |
工科、信息、制造、军工 | 干净、硬朗 |
warm(暖褐+橄榄) |
医护、师范、社工、基层 | 有温度、不油 |
5 自检:先审后渲(必做,不能跳)
渲染之前先跑一次纯审计。这一步三十秒,能挡掉大部分返工:
python3 scripts/build_pptx.py outline.json --audit-only
读 -audit.md,按这张表逐条处理:
| 信号 | 含义 | 动作 |
|---|---|---|
| 文字紧度 >100% | 缩到下限仍溢出 | 必删字(删 20%),不要靠再缩字号 |
告警 bullets-tiny |
要点被压到 16pt 以下 | 拆页或删字 |
告警 cards-overflow |
卡片正文过长 | 每卡 body 压到 60 字以内 |
告警 image-missing |
图片路径不存在 | 补图或改 image → bullets |
结构 dim-missing |
某评分维度没有页 | 补一页或改某页 dim |
结构 page-count |
页数不在 15–20 | 不足 15:按 §2 补四类页;超 20:合并同类页 |
结构 page-thin |
内容页 < 90 字 | 加 note 补口径,或换 detail/cards |
结构 page-dense |
内容页 > 520 字 | 拆成"论点页 + 证据页" |
material-gap |
素材缺口 | 逐条进交付清单,告诉用户答辩前要补 |
| 备注口播 ≠ 1750–1900 字(7′)/ 1500–1650(6′) | 口播超时或不足 | 按页重写备注,不要机械截断 |
只要还有 E 级错误或紧度 >100%,不许进 Step 6。 带着溢出渲染,只会在 Step 7 被同一个问题挡回来,而那时候修的是字号和版面,比改文案贵得多。
6 渲染成 PPTX
# 标准(默认中文字体:微软雅黑,Windows 放映最稳)
python3 scripts/build_pptx.py outline.json -o "张三-成长赛道展示.pptx" --pdf
# 用学校模板(只借母版/背景/主题,占位符会清掉)
python3 scripts/build_pptx.py outline.json -o out.pptx --template 学校模板.pptx --pdf
# 这台机器只用来预览、想更好看时换本机字体
python3 scripts/build_pptx.py outline.json -o out.pptx --font "PingFang SC"
关于 PDF:--pdf 调用本机 LibreOffice。如果本机没装 pptx 里写的字体(默认微软雅黑),脚本会自动挑一个本机有的中文字体重建预览件再转 PDF——但预览件的字体仍不是最终字体,只用来查版式和页数;要直接交 PDF,就在装有目标字体的机器上导出。
7 复检:渲染级 + 文件级
估算用的是"字宽≈字号"的近似,字体替换、数字混排会偏乐观。两项都要过:
# 渲染级:越界 / 压字 / 过小字号
python3 scripts/verify_pptx.py "张三-成长赛道展示.pptx" --expect-pages 18
# 文件级:页数 / 尺寸 / 每页是否有备注
python3 scripts/check_deck.py "张三-成长赛道展示.pptx" --expect 18
verify_pptx.py 查三件事:越界(文字压到页边 20pt 以内)、压字(两个词框交叠 >26% 且两个方向都 >3.5pt)、过小字号(渲染高度 <9pt)。输出逐页表,有问题会指出第几页的哪两个词。
两个工具的关系:build_pptx.py 的审计防"写的时候就超载",verify_pptx.py 防"算对了但渲染出来不对"。两个都过,才算这版能交。
改完重跑,最多两轮;两轮还不干净,通常是论点太多,回到 Step 3 砍页,而不是继续调脚本。
8 交付清单(缺一项都不算交付完)
按这个顺序说,不要只说"做好了":
.pptx(可编辑)+.pdf(预览/投屏备份);- 大纲 md(含每页口播要点,可直接拿去写逐字稿);
- 审计 md(build 估算审计 + verify 渲染复核,明确是"全过"还是"仍有 WARN");
- 素材缺口逐条(来自
gaps)——这是答辩前要补的清单,不能只给个数量; - 示例口径标注:哪些数字是占位、替换后要重跑;
- 一句提醒:封面 meta、页脚组别、证书照片的打码是提交前必查项;
- 若用了
--pdf:说明 PDF 是预览件,最终外观请在装有目标字体的机器上用 PowerPoint 确认。
9 页型速查
| 想表达 | 用哪个页型 | 别用 |
|---|---|---|
| 一个判断、一句标语 | quote / closing |
bullets(会稀释) |
| 三条并列理由(每条要带口径) | bullets(≤6 条,带 note) |
table |
| 一次经历教我的几个判断 | detail(导语 + 2–4 块) |
bullets |
| 岗位一天在做什么 / 四个要点 | cards(2–4 张) |
长段落 |
| 三到四组硬数据 | kpi |
bullets(数字被埋) |
| 证据清单(可逐条核) | evidence(编号—证据—证明什么—出处) |
证书堆图 |
| 成长轨迹、发展路径 | timeline(3–5 节点,带 detail) |
长段落 |
| 接下来怎么补、分几步 | process(3–5 步,每步带验收标准) |
timeline |
| 我强在哪、弱在哪 | matrix(2×2) |
两页 bullets |
| 要求 vs 现状、主目标 vs 备选 | compare |
两页 bullets |
| 两条路 / 左文右图 | twocol |
compare(元素太多时) |
| 多岗位/多方案对比 | table(≤6×6) |
堆图 |
| 现场、作品、工单 | image 或 twocol(文+图) |
拼图墙 |
| 材料怎么读 | agenda(2–6 项) |
空页 |
| 章节切换 | section |
空页 |
三个版式陷阱(实测踩过,写大纲时就避开):
twocol的栏高是固定的,4 条单行要点只占一半、下方必留四成空白,加字也填不满(单条上限 30 字≈一行)→ 换table(信息更硬)或bullets(带小字)。compare中间有橙色 VS 圆标,只适合真正对立的两栏(招聘要求 vs 现状);并列关系用它会出现不合语义的 VS → 换bullets。cards三卡会被撑到全高、文字只占三成,明显空 → 补成四卡(宁可加一个反向人物),别留空壳。
10 红线
- 不虚构:不编实习单位、不编证书、不编数据、不拿网图当现场照。素材缺就写"待补",进 gaps。
- 职规赛特有的不能写:就业赛道的"发展潜力"页不谈考研、出国、考公上岸;备选路径必须是同领域的相邻岗位,不能写"考公兜底";成长赛道不把"保研"当阶段性目标。这三条是评委最容易当场判定"目标不真"的地方。
- 口径不写旧版:成长 25/50/25、就业 10/40/40/10;不写第三届的成长 30/50/20 与就业 10/80/10;不提已取消的课程教学赛道。
- 不越界:不代写生涯发展报告/简历正文,只做展示页。
- 不承诺结果:不说"这样排版就能获奖";审计报告只说结构与版面事实。
- 隐私:他人正脸、患者、未成年人、涉密设备一律打码或换图,标注"已获授权";单位名可脱敏为"某电池厂""某三甲医院";学号、身份证号、家庭收入、父母职业不上版,家庭约束只写"家里对驻外有保留"这类可公开表述。
- 模板版权:用户自带模板时只借用其母版与主题,不复制他人设计稿内容。
- 图片纪律:证书/合同/工单用
contain不裁切;缺图画灰位[待配图];不把本地图片路径写进 pptx 正文;不用 AI 生成图冒充实拍证据。
11 失败时怎么办
脚本报错、[FAIL]、主题 id 不存在、模板路径不对时:把脚本原句告诉用户,停在那一步。
- 不要手改 pptx 绕过 JSON——下次重跑就丢;
- 不要把 Python 堆栈收成"生成失败"四个字——用户没法据此行动;
- 不要为了跑通而删检查(比如跳过 verify)——检查是这技能的价值所在;
- 依赖缺失就照 §12 给命令,不改用网页工具或在线转换补齐。
12 环境依赖
| 用途 | 依赖 | 缺了怎么装 |
|---|---|---|
| 渲染 pptx | python-pptx(≥0.6.21) |
pip install python-pptx |
| 导出 PDF | LibreOffice(soffice) |
macOS brew install --cask libreoffice;Win 装官网包 |
| 渲染级复核 | PyMuPDF + pdftoppm(poppler) |
pip install pymupdf;brew install poppler |
| 材料抽取 | python-docx、python-pptx、pdfminer.six |
pip install python-docx pdfminer.six |
本技能不带 requirements.txt,按上表逐项装即可。
用哪个解释器:脚本需要 python-pptx,务必用装了它的解释器跑(本机为 ~/.workbuddy/binaries/python/envs/default/bin/python)。managed python 常缺这个包,会 ModuleNotFoundError。
13 与其他技能的分工
| 需求 | 用 | 产出 |
|---|---|---|
| 材料打分与整改 | zgs-review |
评审报告 |
| 现场问答题库 | zgs-qa |
Z1-QA–Z5-QA |
| 陈述逐字稿 | 金牌陈述逆向工程(七段式框架) | 分段稿 + 预埋问答 |
| 展示 PPT | 本技能 | 大纲 + PPTX + 审计 |
| 已有 PPT 美化/换版 | pptx / office-pptx |
版式级改造 |
| 国创赛/互联网+ PPT | cxds-ppt |
详案 + 网评 PPTX |
推荐顺序:陈述稿定调 → 本技能出页 → 逐页口播要点回填陈述稿 → zgs-qa 押题 → zgs-review 打分。反过来(先做 PPT 再配词)最容易出现"页很满、话很空"。
14 失败模式与对策
| 症状 | 常见原因 | 对策 |
|---|---|---|
| 大纲像报告目录 | 按材料章节抄结构 | 改成"论点句"标题,一页一个判断 |
| md 与 json 对不上 | 在 md 里直接改了文案 | 回 §3.1:改 JSON 再重跑,交付前跑一致性检查 |
| 页数不足 15 | 只写了"主线",没写证据与诊断 | 按 §2 四类补页:调研实录 → 匹配度 → 二次证据 → 风险预案 |
| 页面只有一行大字 | 按演讲型在做 | 加 note、换 cards/detail,让页面能独立读懂 |
| 生成的页面很挤 | 长句 + 6 条要点 | 单条 ≤48 字,超了就拆页 |
| 大纲像行业报告 | 抄了政策与趋势 | 趋势压到一页背景,其余写"我"的动作与判断 |
| 评委追问答不上 | 大纲没写"风险"行 | 每页补一行"最可能被追问什么" |
| 两轮改不干净 | 论点太多,不是排版问题 | 回 Step 3 砍页,别继续调字号 |