
Pptgen Drawio
- 127 installs
- 2.5k repo stars
- Updated July 19, 2026
- xstongxue/best-skills
Use pptgen-drawio for development tasks
About
pptgen-drawio: A skill skill for development. This skill provides functionality for development workflows.
- pptgen-drawio
Pptgen Drawio by the numbers
- 127 all-time installs (skills.sh)
- +2 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #2,771 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/xstongxue/best-skills --skill pptgen-drawioAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 127 |
|---|---|
| repo stars | ★ 2.5k |
| Last updated | July 19, 2026 |
| Repository | xstongxue/best-skills ↗ |
What it does
Use pptgen-drawio for development tasks
Files
PPT 多页 Draw.io 生成(论文答辩 + 通用汇报)
本 skill 支持两种模式,共用 ppt_template/、scripts/、reference/ 目录,以及 Step 0 自定义模板、Step 1 确定内容与风格、Step 3 & 4 输出与导出 全流程。
---
模式识别
| 模式 | 使用时机 | 内容来源 | 默认页序 | 输出文件 |
|---|---|---|---|---|
| 论文答辩 | 学位论文答辩、开题、预答辩 | paper-write 结构化提取 | 封面→目录→背景→现状→方法→创新点→实验→结论→致谢→Q&A | paper-defense.drawio |
| 通用汇报 | 工作汇报、产品介绍、演讲 | 用户消息提取/生成 | 封面→目录→节标题→内容页→总结→致谢→Q&A | general-presentation.drawio |
---
Step 0:用户自定义模板(可选,两种模式共用)
若用户提供了自己的 .pptx 模板文件:
1. 模板放置:将 .pptx 放入 ppt_template/ 目录 2. 运行样式提取:在 skill 根目录下执行:
python scripts/analyze_pptx.py ppt_template/xxx.pptx reference/style-custom.md3. 读取 reference/style-custom.md 作为「自定义风格」继续
目录约定:ppt_template/ 存放模板、scripts/analyze_pptx.py 样式提取、reference/ 风格文件
---
Step 1:确定内容与风格(两种模式共用)
1.1 确定内容
- 论文答辩:若用户只有论文全文:先调用 paper-write 的「结构化信息提取」;若已提供结构化信息:从消息中提取【论文题目】【学科方向】【答辩时长】【论文结构/目录】【各章核心内容】【创新点/贡献】等,缺失则追问
- 通用汇报:从用户消息中提取幻灯片大纲及内容,或根据核心需求扩展为完整结构
1.2 选择风格
两种模式均可选择以下风格之一,读取对应 reference 文件获取配色、字体、版式规则与 XML 样式片段:
| # | 风格 | 主色 | 强调色 | reference 文件 |
|---|---|---|---|---|
| 1 | 经典学术 / 商务严谨 | #1B2A4A | #C9A84C | reference/style1-classic-academic.md |
| 2 | 现代极简 / 大字报感 | #231F20 | #F5C638 | reference/style2-minimal-bigtype.md |
| 3 | 暖色学术 / 亲和力 | #2C5160 | #B7472A | reference/style3-warm-academic.md |
| 4 | 科技明快 / 现代前沿 | #0170C1 | 同主色 | reference/style4-tech-modern.md |
| 5 | 自定义 | 从 style-custom.md 提取 | reference/style-custom.md |
- 论文答辩:用户未指定时默认风格 1
- 通用汇报:用户选择或根据语境自动推荐
---
Step 2:生成多页 Draw.io XML
必须先读取所选风格的 reference 文件,基于该风格生成 XML。
- 画布:16:9(pageWidth=1920,pageHeight=1080)
- 页序:按模式识别表中的默认页序
- 页数:10 分钟约 10–12 页,15 分钟约 14–18 页
- 含节标题过渡页(每章独立一页引入)时,10 分钟约 11 页;无过渡页时约 9 页
- 节标题过渡页风格:大号数字 + 章节名,可参考 style2 风格或 style4(无过渡页)
2.1 论文答辩模式默认页序(23 页,四种风格共享)
当用户选择论文答辩模式、且未另行指定页数时,所有风格(style1–4)默认采用统一的 23 页结构:
1. 封面 2. 目录 3. 01 研究背景与意义(节标题) 4–6. 01. 研究背景与意义(内容 3 页) 7. 02 国内外研究现状(节标题) 8–9. 02. 国内外研究现状(内容 2 页) 10. 03 方法总览(节标题) 11–13. 03. 方法总览(内容 3 页) 14. 04 实验结果(节标题) 15–16. 04. 实验结果(内容 2 页) 17. 05 系统设计(节标题) 18–19. 05. 系统设计与实现(内容 2 页) 20. 06 总结与展望(节标题) 21. 06. 总结与展望(内容 1 页) 22. 已有成果 23. 致谢 / Q & A
各 reference/styleX-.md 只定义样式与版式*(颜色、字体、组件布局),不再重复定义页序;如需修改默认页序,应在本 SKILL 中统一调整。
2.2 文件命名与交付(建议,Windows 兼容)
- 推荐命名(生成/导出阶段):优先使用 ASCII 文件名(英文字母/数字/中划线),减少 PowerShell/编码环境下中文文件名乱码、命令找不到文件等问题。
- 推荐:
defense-style4-tech.drawio、defense-style4-tech.pptx - 如必须中文名:建议先用 ASCII 名完成导出,再在资源管理器里重命名为中文
- 交付顺序(推荐流程):先提供
.drawio(源文件)→ 执行命令导出.pptx(交付文件)→ 校验页数 - 交付依赖:接收方只需打开
.pptx(必要时附.drawio),不需要安装 Python;脚本/代码仅用于生成端自动写 XML(可选)。
⚠️ 已知坑清单(生成前逐条过)
生成每一页 XML 前,按下面 checklist 快速自检(只保留高频致命项):
✅ 必过 checklist(10 条)
1. 多页结构:根节点必须是 <mxfile>,且每页一个 <diagram>(否则导出会变 1 页)。 2. 每页坐标系:每个 <diagram> 内 x 从 0 开始;背景矩形 x=0,y=0,w=1920,h=1080;每页都有 mxCell id="0" 与 mxCell id="1" parent="0"。 3. ID 唯一:全文件内所有 mxCell id 必须唯一;每个 <diagram id="..."> 也必须唯一。 4. 一次性写入:.drawio 必须一次写完整(不要多次覆盖/拼接 XML)。 5. 页数校验:drawio2pptx 输出的 (N slides) 必须等于 <diagram> 数量。 6. 每页 cell 数量:封面 ≥ 12、节标题 ≥ 8、内容页 ≥ 15(避免“空页”)。 7. 换行只用真实换行:在生成 XML 时,正文多行必须写成真实换行符(代码里用 \n 拼接,再一次性写入文件),禁止在 value="..." 中写 
 / <br> / <font>/<b>,也禁止通过 Shell 将 &#xa; 替换成字面量 ` n `;文本 style 必含 whiteSpace=wrap;html=1;。 8. **白字不要误替换**:顶栏/深色块文字保持 fontColor=#FFFFFF;背景色替换优先改 fillColor,不要全局替换所有 #FFFFFF`。 9. 遮挡检查:带底色的装饰块不要跨越正文区域;两列卡片之间不要放有底色标签(会压住字)。 10. 高度预算:多行正文的卡片/容器宁可偏高留白,避免裁字(正文行高约 \(1.4\times\) 字号)。
最小可用多页模板(仅示意结构)
<mxfile host="app.diagrams.net">
<diagram id="p1" name="封面">
<mxGraphModel page="1" pageWidth="1920" pageHeight="1080">
<root>
<mxCell id="0"/><mxCell id="1" parent="0"/>
</root>
</mxGraphModel>
</diagram>
<diagram id="p2" name="目录">
<mxGraphModel page="1" pageWidth="1920" pageHeight="1080">
<root>
<mxCell id="0"/><mxCell id="1" parent="0"/>
</root>
</mxGraphModel>
</diagram>
</mxfile>---
Step 3 & 4:输出 Draw.io 并自动导出 PPT(两种模式共用)
Step 3:输出 Draw.io 文件
将生成的 XML 一次性 写入工作区 .drawio 文件(论文答辩用 paper-defense.drawio,通用汇报用 general-presentation.drawio),并简述每页概要。
写入方式需满足 checklist 第 4 条「一次性写入」与第 7 条「换行只用真实换行」的要求。
Step 4:自动导出 PPT(必执行)
生成 .drawio 后,执行导出(推荐在生成端完成导出后再交付):
1. 如未安装:pip install drawio2pptx -q 2. 切换到 .drawio 文件所在目录(必须先 cd/Set-Location,否则找不到文件):
Set-Location "d:\你的项目目录"
drawio2pptx <文件名>.drawio <文件名>.pptx3. 验证输出页数:输出中必须包含 Saved xxx.pptx (N slides),且 \(N\) 等于 <diagram> 数量(对应 checklist 第 5 条「页数校验」)
页数验证需满足 checklist 第 5 条「页数校验」。
导出失败排查(高频)
- Permission denied / 拒绝访问:目标
.pptx正在被 PowerPoint 占用。 - 解决:导出到新文件名(如
*-v2.pptx),或先关闭 PPT 再覆盖导出。 - 中文文件名乱码/找不到文件:终端编码导致路径解析异常。
- 解决:改用 ASCII 文件名生成与导出(见 2.2)。
其他注意事项
- 统一字号规则(所有风格):
- 内容页中文正文(段落 + 列表要点)统一使用 18 pt;
- 内容页章节标题一般为 30 pt,节标题页大号数字/章节名继续按各 styleX 中示例执行;
- 日期、页脚、小标签、图表表头等次要信息可保持 13–16 pt 之间的现有设计。
- 字体推荐:中文标题/正文优先使用 微软雅黑 或 宋体;数字、英文及公式使用 Times New Roman。各风格 reference 可在此基础上微调(如英文标题用 Georgia)。
- XML 标签正确闭合,特殊字符转义(
&→&,<→<) - 每页布局:背景全画布矩形、标题区 44–56pt、正文按照 18pt 行高预留空间、留白充足
- Windows 下不支持
tail命令,Shell 输出截断请用 PowerShell 的Select-Object -Last N替代
PPT 模板目录
将参考用的 .pptx 模板文件放入此目录。
- 预设模板:可放置
通用ppt模板1.pptx~通用ppt模板4.pptx等作为风格参考 - 自定义模板:用户提供的模板(如
my-template.pptx)也放于此,便于scripts/analyze_pptx.py统一分析
分析命令示例:
python scripts/analyze_pptx.py ppt_template/我的模板.pptx reference/style-custom.md风格一:经典学术 / 商务严谨(来源:答辩PPT.pptx)
真实样式数据来源
- 源文件:
答辩PPT.pptx(23 页,学位论文答辩终极版) - 画布:1920 × 1080(16:9)
- 幻灯片尺寸:20.0 × 11.25 英寸
---
页面数量与章节排版(必须严格遵守)
| 页码 | 页面类型 | 章节/内容 | 说明 |
|---|---|---|---|
| 1 | 封面 | 学校名、论文题目、汇报人、指导教师、学科专业、日期 | 主标题 33 pt,副标题 33 pt,封面不需要底部横线 |
| 2 | 目录 | 目录、01–06 章节目录项、CONTENTS、日期 | 目录标题 30 pt,目录项 24 pt,CONTENTS 60 pt |
| 3 | 节标题 | 01 研究背景与意义 | 大数字 90 pt,章节名 48 pt |
| 4–6 | 内容页 | 01. 研究背景与意义(研究背景、研究意义、应用场景) | 3 页,标题 30 pt,正文 18 pt |
| 7 | 节标题 | 02 国内外研究现状 | 大数字 90 pt,章节名 48 pt |
| 8–9 | 内容页 | 02. 国内外研究现状(EED 数据集、DLA-DETR-Light/Plus、三类问题) | 2 页,标题 30 pt,正文 18 pt |
| 10 | 节标题 | 03 方法总览 | 大数字 90 pt,副标题 21 pt |
| 11–13 | 内容页 | 03. 方法总览(基准模型不足、Light 改进、Plus 改进) | 3 页,标题 30 pt,子标题 18 pt,正文 18 pt |
| 14 | 节标题 | 04 实验结果 | 大数字 90 pt,副标题 21 pt |
| 15–16 | 内容页 | 04. 实验结果(定量分析、对比实验、消融实验) | 2 页,标题 30 pt,表题 16.5 pt |
| 17 | 节标题 | 05 系统设计 | 大数字 90 pt,副标题 21 pt |
| 18–19 | 内容页 | 05. 系统设计与实现(架构图、系统演示、功能特点) | 2 页,标题 30 pt,图题 16.5 pt,列表 18 pt |
| 20 | 节标题 | 06 总结与展望 | 大数字 90 pt,章节名 48 pt |
| 21 | 内容页 | 06. 总结与展望(工作总结、未来展望) | 1 页,标题 30 pt,小标题 19.5 pt,正文 18 pt |
| 22 | 内容页 | 已有成果(专利等) | 1 页,标题 30 pt,正文 24 pt |
| 23 | 致谢 | 感谢语、Q & A、汇报人信息 | 主句 39 pt,Q&A 60 pt,落款 16.5 pt |
合计:23 页
---
配色系统
参考预答辩 PPT 主题色与经典学术答辩审美,遵循 60-30-10 法则。
| 角色 | 色值 | 说明 |
|---|---|---|
| 主色 / 顶栏 / 大色块 | #1F497D | 深蓝(Office 主题色),权威、沉稳 |
| 备选主色 | #1B2A4A | 深海军蓝,顶级咨询风 |
| 辅色 / 分隔线 / 强调 | #C9A84C | 金铜色,高级感强调 |
| 备选强调色 | #C0504D | 深红(Office 主题),用于重点标注 |
| 页面背景 | #F7F8FA | 冷白/极浅灰 |
| 备选背景 | #EEECE1 | 浅米灰(Office 主题) |
| 正文文字 | #1A1A2E | 近黑深蓝 |
| 次级信息(日期/人名) | #4A5568 | 中性石板灰 |
| 内容页底部装饰条 | #E2E8F0 | 浅灰线 |
---
字体规范(按预答辩 PPT 实测)
| 用途 | 字体 | 字号 | 说明 |
|---|---|---|---|
| 封面主标题 | 微软雅黑 | 33 pt,加粗 | 论文题目主副两行 |
| 封面学校/类型 | 微软雅黑 | 默认 | XX大学、硕士学位论文预答辩 |
| 封面落款(汇报人/导师/专业) | 微软雅黑 | 默认 | 汇报人、指导教师、学科专业 |
| 封面日期 | 微软雅黑 | 15 pt | 2026 年 3 月 |
| 目录标题 | 微软雅黑 | 30 pt | 「目录」 |
| 目录项 | 微软雅黑 | 24 pt | 01–06 章节名 |
| 目录英文大字 | 微软雅黑 或 Arial | 60 pt | CONTENTS |
| 节标题数字 | 微软雅黑 | 90 pt | 01、02、03… |
| 节标题章节名 | 微软雅黑 | 48 pt | 研究背景与意义、国内外研究现状… |
| 内容页顶栏标题 | 微软雅黑 | 30 pt,白色 | 01. 研究背景与意义 |
| 内容页小标题 | 微软雅黑 | 24 pt | 研究背景、研究意义 |
| 内容页正文 | 微软雅黑 | 18 pt | 正文段落(所有风格统一) |
| 内容页列表/要点 | 微软雅黑 | 18 pt | bullets、编号列表(所有风格统一) |
| 图题/表题 | 微软雅黑 | 16.5 pt | 图 5-1、表 4-1 |
| 底部日期 | 微软雅黑 或 Calibri | 13.5 pt | 2026 年 3 月 |
| 致谢主句 | 微软雅黑 | 39 pt | 感谢各位老师的聆听与指导! |
| 致谢 Q&A | 微软雅黑 或 Arial | 60 pt | Q & A |
| 致谢落款 | 微软雅黑 | 16.5 pt | 汇报人、指导教师、日期 |
---
版式规则(Draw.io 实现要点)
封面页
- 顶部
#1F497D或#1B2A4A色块:全宽 × 120 px - 顶部色块下方:
#C9A84C金色细线分隔条(高度 6 px) - 主标题:
微软雅黑,33 pt 加粗,#1A1A2E,两行(题目主副) - 背景:
#F7F8FA - 落款区:汇报人、指导教师、学科专业、日期,左对齐或居中
- 封面底部不画装饰横线(底部细线仅用于各内容页)
目录页
- 左侧目录列表:01–06 章节,24 pt
- 右侧或中部:CONTENTS 大字 60 pt
- 底部日期:13.5 pt,
#4A5568
节标题(过渡)页
- 全宽
#1F497D或#1B2A4A大色块铺满整页 - 左侧或居中:大数字 90 pt(01、02…)
- 右侧或下方:章节名 48 pt,白色
- 可叠加半透明强调色数字水印
内容页
- 顶部
#1F497D或#1B2A4A色块(高 120 px)+#C9A84C金线(高 6 px) - 标题文字嵌入顶部色块内,左对齐,
微软雅黑,30 pt,白色 - 正文区:
微软雅黑,19.5–24 pt,#1A1A2E;关键词用#C9A84C强调 - 底部细线:
#E2E8F0,全宽 × 4 px(仅内容页使用,封面不需要) - 底部右侧:日期 13.5 pt,
#4A5568
致谢页
- 居中主句:39 pt
- Q & A:60 pt,醒目
- 底部:汇报人、指导教师、日期,16.5 pt
通用装饰
- 小方块:8 × 36 px 或 14 × 30 px,
fillColor=#C9A84C,段落标记 - 底部右侧:日期,13.5 pt,
#4A5568
---
文字换行要点(重要)
Draw.io 文字默认不换行,必须同时满足以下三条才能正常折行:
1. style 加 `whiteSpace=wrap`:所有含文字的 cell 都必须加 2. 容器高度要足够:正文行高约 1.4 倍字号,多行文字需预留 行数 × 字号 × 1.5 的高度 3. 不要用 `overflow=hidden`:会裁掉溢出文字
高度参考:单行 ≈ 字号×2,两行 ≈ 字号×3.5,三行 ≈ 字号×5,宁可偏大不要偏小。
换行约定(避免特殊字符):
- 在生成脚本里,只用真实 `\n` 做换行(例如"第 1 行\\n第 2 行"),不要在value="..."中写
、<br>等实体或 HTML 标签;
-whiteSpace=wrap;html=1;负责自动换行,value里只保留普通文字 +\n,否则导出到 PPT 时这些实体可能会原样显示成“特殊字符”。
---
Draw.io XML 关键样式片段
<!-- 页面背景(冷白) -->
<mxCell id="bg" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F7F8FA;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="0" width="1920" height="1080" as="geometry"/>
</mxCell>
<!-- 顶部深蓝色块(主色 #1F497D 或 #1B2A4A) -->
<mxCell id="topbar" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#1F497D;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="0" width="1920" height="120" as="geometry"/>
</mxCell>
<!-- 金色分隔线 -->
<mxCell id="line" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#C9A84C;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="120" width="1920" height="6" as="geometry"/>
</mxCell>
<!-- 内容页标题(30 pt,嵌入顶色块内) -->
<mxCell id="title" value=" 01. 研究背景与意义" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=30;fontStyle=1;fontColor=#FFFFFF;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="0" y="0" width="1920" height="120" as="geometry"/>
</mxCell>
<!-- 左侧小方块装饰(金铜色) -->
<mxCell id="badge" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#C9A84C;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="210" width="8" height="36" as="geometry"/>
</mxCell>
<!-- 正文内容(19.5–24 pt) -->
<mxCell id="body" value="正文第 1 行\n正文第 2 行" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;fontSize=20;fontColor=#1A1A2E;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="160" y="180" width="1680" height="720" as="geometry"/>
</mxCell>
<!-- 底部装饰细线 -->
<mxCell id="botline" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#E2E8F0;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="1040" width="1920" height="4" as="geometry"/>
</mxCell>
<!-- 底部日期(13.5 pt) -->
<mxCell id="footer" value="2026 年 3 月" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;fontSize=14;fontColor=#4A5568;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="1600" y="1044" width="300" height="36" as="geometry"/>
</mxCell>
<!-- 节标题页:大数字 90 pt -->
<mxCell id="section_num" value="01" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;fontSize=90;fontStyle=1;fontColor=#FFFFFF;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="200" y="350" width="400" height="150" as="geometry"/>
</mxCell>
<!-- 节标题页:章节名 48 pt -->
<mxCell id="section_title" value="研究背景与意义" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;fontSize=48;fontStyle=1;fontColor=#FFFFFF;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="600" y="400" width="800" height="80" as="geometry"/>
</mxCell>
<!-- 关键词强调(推荐做法) -->
<!-- 避免在同一文本框 value 里混用 HTML(如 <font>/<b>),否则导出 PPT 后容易出现“特殊字符”或续写样式不一致。
推荐做法:把关键词拆成独立的小文本框(fontColor=#C9A84C,fontStyle=1),与正文并排/叠放。 -->---
论文答辩模式默认页序
本风格沿用 pptgen-drawio/SKILL.md 中定义的 23 页通用页序(封面、目录、01–06 各章节标题 + 内容、已有成果、致谢 / Q&A),仅覆盖配色与版式实现细节。如需调整整体页数或章节排布,请在 SKILL 中统一修改。
风格二:现代极简 / 大字报感(来源:通用ppt模板2.pptx)
真实样式数据来源
- 源文件:
通用ppt模板2.pptx(24 页) - 画布:1920 × 1080(16:9)
---
论文答辩模式页序(通用)
本风格在论文答辩模式下沿用 pptgen-drawio/SKILL.md 中定义的 23 页通用页序(封面、目录、01–06 各章节标题 + 内容、已有成果、致谢 / Q&A),本文件仅定义配色/字体/版式实现细节。
---
换行约定(避免导出特殊字符)
- 只用真实 `\n` 做换行(脚本里写
"第 1 行\\n第 2 行") - 禁止在
value="..."中写
、<br>等实体或 HTML 标签 - 依靠
whiteSpace=wrap;html=1;实现自动换行;容器高度需预留足够空间
配色系统
| 用途 | 色值 | 说明 |
|---|---|---|
| 主色 / 大字标题 | Scheme 主题色(近似 #231F20 深灰黑) | 通过主题色系控制,无硬编码 RGB |
| 强调色块 | #F5C638 | 亮黄色,用于小角标方块、图标装饰 |
| 基础文字 | 继承主题色(近似 #231F20) | 深灰近黑 |
| 页面背景 | 主题浅色(近似 #F5F5F5 或 #FFFFFF) | 极简留白 |
注:模板2大量使用 Office 主题色(_SchemeColor),Draw.io 中以近似值#231F20替代主色,#F5C638替代强调色。
字体规范
- 整体与风格一保持一致:封面主标题、目录标题/条目、节标题数字与章节名、内容页标题/正文/列表、图表标题、底部日期、致谢页等,全部沿用风格一在
style1-classic-academic.md中给出的字体与字号配置(默认使用微软雅黑)。 - 本风格仅在视觉层面做“现代极简 / 大字报感”的微调,例如:某些节标题页可以将节号字号适当放大、在目录页叠加更大的英文单词,但不引入额外字体族或完全不同的字号体系。
版式规则(Draw.io 实现要点)
- 基础结构与风格一完全一致:封面、目录、节标题页、内容页、致谢页都采用“顶栏色块 120 px + 强调色细线 6 px + 底部细线、右下角日期”等布局,只是将主色/强调色替换为本风格的
#231F20/#F5C638。 - 下列规则仅作为在风格一版式基础上的装饰性增强建议,生成脚本可以按需选择使用:
封面页(可选增强)
- 在保持风格一封面结构的前提下,可将标题字号适当放大,营造“大字报”视觉冲击。
目录页(可选增强)
- 可在目录区域叠加一行超大字号英文单词(如
CONTENT),与中文「目录」形成视觉对比。
节标题(过渡)页(可选增强)
- 在原有 90 pt 节号基础上,允许略微放大节号,并保留大量留白以突出极简感。
内容页与装饰(可选增强)
- 可以在内容区域增加
fillColor=#F5C638的小角标色块或细横条,作为段落导航,不改变整体结构。
Draw.io XML 关键样式片段
<!-- 节标题页背景色块 -->
<mxCell id="bg" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#231F20;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="0" width="1920" height="1080" as="geometry"/>
</mxCell>
<!-- 超大节号数字 -->
<mxCell id="num" value="1" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=115;fontStyle=1;fontColor=#FFFFFF;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="120" y="300" width="400" height="300" as="geometry"/>
</mxCell>
<!-- 节标题中文 -->
<mxCell id="stitle" value="选题背景和意义" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=44;fontStyle=1;fontColor=#FFFFFF;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="120" y="620" width="800" height="80" as="geometry"/>
</mxCell>
<!-- 黄色导航角标 -->
<mxCell id="badge" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#F5C638;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="120" y="40" width="20" height="55" as="geometry"/>
</mxCell>
<!-- 目录条目示例 -->
<!-- value="第一部分 | 选题背景和意义",fontSize=28,fontFamily=微软雅黑 -->风格三:暖色学术 / 亲和力(来源:通用ppt模板3.pptx)
真实样式数据来源
- 源文件:
通用ppt模板3.pptx(11 页) - 画布:1920 × 1080(16:9)
---
论文答辩模式页序(通用)
本风格在论文答辩模式下沿用 pptgen-drawio/SKILL.md 中定义的 23 页通用页序(封面、目录、01–06 各章节标题 + 内容、已有成果、致谢 / Q&A),本文件仅定义配色/字体/版式实现细节。
---
换行约定(避免导出特殊字符)
- 只用真实 `\n` 做换行(脚本里写
"第 1 行\\n第 2 行") - 禁止在
value="..."中写
、<br>等实体或 HTML 标签 - 依靠
whiteSpace=wrap;html=1;实现自动换行;容器高度需预留足够空间
配色系统
| 用途 | 色值 | 说明 |
|---|---|---|
| 主色 / 色块 / 次标题 | #2C5160 | 深蓝灰,用于顶栏装饰、日期、汇报人等信息 |
| 强调 / 关键词 | #B7472A | 暖砖红/橙红,用于标题高亮、关键词 |
| 基础文字 | #000000 | 黑色,正文默认 |
| 页面背景 | #FFFFFF | 白色 |
与风格一的核心区别:两者共用#2C5160作为主色,但强调色由红色#FF0000换成暖砖红#B7472A,整体视觉更亲和、内敛。
字体规范
- 整体与风格一保持一致:封面、目录、节标题、内容页、致谢等所有基础文字,全部沿用风格一在
style1-classic-academic.md中给出的字体与字号配置(默认使用微软雅黑)。 - 如需在个别页面使用英文字体增强层次,可在局部引入
Arial等西文字体,但不改变整体中文字体体系和字号级别。
版式规则(Draw.io 实现要点)
- 基础结构与风格一完全一致:顶栏高度、金色分隔线、底部细线与日期区域等布局全部复用风格一,只是将主色/强调色替换为本风格的
#2C5160/#B7472A。 - 本风格的“暖色学术感”主要通过配色和少量小方块装饰实现,不改变整体版式结构。
通用装饰(可选增强)
- 右侧或段落旁可使用
fillColor=#2C5160的小方块(约 14 × 15 mm)作信息标注。 - 章节名、关键小标题可用
#B7472A暖色强调。
Draw.io XML 关键样式片段
<!-- 封面左侧小方块装饰 -->
<mxCell id="badge1" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#2C5160;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="1580" y="520" width="40" height="55" as="geometry"/>
</mxCell>
<!-- 封面主标题 -->
<mxCell id="title" value="软件项目质量管理" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=44;fontColor=#2C5160;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="120" y="300" width="1400" height="80" as="geometry"/>
</mxCell>
<!-- 内容页章节标题(Arial,暖红色强调) -->
<mxCell id="sec" value="1. 软件质量概述和控制" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=32;fontColor=#B7472A;fontFamily=Arial;" vertex="1" parent="1">
<mxGeometry x="120" y="160" width="1000" height="50" as="geometry"/>
</mxCell>
<!-- 正文内容 -->
<mxCell id="body" value="[正文内容...]" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=top;fontSize=22;fontColor=#000000;fontFamily=Times New Roman;" vertex="1" parent="1">
<mxGeometry x="120" y="240" width="1680" height="600" as="geometry"/>
</mxCell>
<!-- 汇报人信息行 -->
<mxCell id="info" value="汇报人:xxx 院系:xxx Date: 2024/01/01" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=20;fontColor=#2C5160;fontFamily=微软雅黑;" vertex="1" parent="1">
<mxGeometry x="120" y="820" width="1400" height="40" as="geometry"/>
</mxCell>风格四:科技明快 / 现代前沿(来源:通用ppt模板4.pptx)
真实样式数据来源
- 源文件:
通用ppt模板4.pptx(13 页) - 画布:1920 × 1080(16:9,原模板宽约 338 mm)
---
论文答辩模式页序(通用)
本风格在论文答辩模式下沿用 pptgen-drawio/SKILL.md 中定义的 23 页通用页序(封面、目录、01–06 各章节标题 + 内容、已有成果、致谢 / Q&A),本文件仅定义配色/字体/版式实现细节。
---
换行约定(避免导出特殊字符)
- 只用真实 `\n` 做换行(脚本里写
"第 1 行\\n第 2 行") - 禁止在
value="..."中写
、<br>等实体或 HTML 标签 - 依靠
whiteSpace=wrap;html=1;实现自动换行;容器高度需预留足够空间
配色系统
| 用途 | 色值 | 说明 |
|---|---|---|
| 主色 / 横条色块 | #0170C1 | 高饱和度科技蓝 |
| 基础文字 | 继承(黑色) | 正文 |
| 标题高亮 | #0170C1 | 页面标题文字用蓝色 |
| 页面背景 | #FFFFFF | 白色 |
字体规范
- 整体与风格一保持一致:封面主标题/副标题、目录标题与条目、节标题数字与章节名、内容页标题/正文/列表、图题/表题、底部日期、致谢等,统一沿用风格一在
style1-classic-academic.md中给出的微软雅黑字体与字号体系。 - 如需强调“科技感”,可以在个别英文单词或小标题上适度使用科技感强的西文字体(如
Century Gothic),但不改变整体中文字体与字号级别。
版式规则(Draw.io 实现要点)
- 基础结构与风格一完全一致:封面、目录、节标题页、内容页、致谢页等整体布局(顶栏 120 px + 强调色细线 6 px + 底部细线 + 右下角日期等)全部复用风格一,只是将主色替换为科技蓝
#0170C1(强调色仍可用#C9A84C,或按需要选用同色系浅/深蓝做强调)。 - “科技明快 / 现代前沿”主要通过配色和少量小装饰元素体现,不改变整体结构。
通用装饰(可选增强)
- 顶栏或正文区可增加
fillColor=#0170C1的小竖色块/细横条,作为导航与强调,不改变布局。 - 底部可叠加一条科技蓝细线作为装饰(与风格一底部细线并存或替换)。
Draw.io XML 关键样式片段
<!-- 顶部左小色块 -->
<mxCell id="tl" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0170C1;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="0" width="20" height="30" as="geometry"/>
</mxCell>
<!-- 顶部右延伸大横条 -->
<mxCell id="tr" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0170C1;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="40" y="0" width="1880" height="30" as="geometry"/>
</mxCell>
<!-- 底部横条 -->
<mxCell id="bot" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0170C1;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="1050" width="1920" height="30" as="geometry"/>
</mxCell>
<!-- 页面标题 -->
<mxCell id="ptitle" value="目录页" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=36;fontColor=#0170C1;fontFamily=方正尚酷简体;" vertex="1" parent="1">
<mxGeometry x="120" y="80" width="600" height="60" as="geometry"/>
</mxCell>
<!-- 英文副标题 -->
<mxCell id="en" value="CONTENTS" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=24;fontColor=#000000;fontFamily=Garage Gothic;" vertex="1" parent="1">
<mxGeometry x="120" y="150" width="400" height="40" as="geometry"/>
</mxCell>
<!-- 封面底部全宽横条(封面页用) -->
<mxCell id="cbot" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#0170C1;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="0" y="1040" width="1920" height="40" as="geometry"/>
</mxCell>
<!-- 封面主标题 -->
<mxCell id="ctitle" value="基于 XX 的系统设计与实现" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;fontSize=48;fontColor=#000000;fontFamily=方正尚酷简体;" vertex="1" parent="1">
<mxGeometry x="120" y="340" width="1400" height="100" as="geometry"/>
</mxCell>#!/usr/bin/env python3
"""
analyze_pptx.py - PPT 模板样式提取工具
用法:
python scripts/analyze_pptx.py ppt_template/模板.pptx reference/style-custom.md
python scripts/analyze_pptx.py ppt_template/模板.pptx # 打印到控制台
功能:
- 提取模板的配色、字体、字号、版式规则
- 输出可直接用于 pptgen-drawio SKILL 的 reference markdown 文件
- 若未指定 output.md,则打印到控制台
目录约定(pptgen-drawio skill):
- ppt_template/ : 存放参考 PPT 模板
- scripts/ : 本脚本所在目录
- reference/ : 样式提取结果输出目录
"""
import sys
import os
sys.stdout.reconfigure(encoding='utf-8')
try:
from pptx import Presentation
except ImportError:
print("错误:未安装 python-pptx,请先执行: pip install python-pptx")
sys.exit(1)
# ─────────────────────────────────────────────
# 辅助函数
# ─────────────────────────────────────────────
def rgb_hex(color_obj):
"""尝试取 RGB 十六进制,失败返回 None"""
try:
if color_obj.type is not None:
return f"#{color_obj.rgb}"
except Exception:
pass
return None
def analyze(path: str) -> dict:
prs = Presentation(path)
name = os.path.basename(path)
slide_w_mm = round(prs.slide_width / 914400 * 25.4)
slide_h_mm = round(prs.slide_height / 914400 * 25.4)
layouts = []
for master in prs.slide_masters:
for layout in master.slide_layouts:
if layout.name not in layouts:
layouts.append(layout.name)
fill_colors = {} # color -> count
font_names = {} # name -> count
font_sizes = []
font_colors = {} # color -> count
slide_samples = [] # [(page, shapes_summary)]
slides = list(prs.slides)
total = len(slides)
for sidx, slide in enumerate(slides):
page_info = {"page": sidx + 1, "fills": [], "texts": []}
for shape in slide.shapes:
# 填充色
try:
fill = shape.fill
if fill.type == 1:
c = rgb_hex(fill.fore_color)
if c:
fill_colors[c] = fill_colors.get(c, 0) + 1
page_info["fills"].append({
"color": c,
"x_mm": round(shape.left / 914400 * 25.4),
"y_mm": round(shape.top / 914400 * 25.4),
"w_mm": round(shape.width / 914400 * 25.4),
"h_mm": round(shape.height/ 914400 * 25.4),
})
except Exception:
pass
# 文字
if shape.has_text_frame:
for para in shape.text_frame.paragraphs:
for run in para.runs:
text = run.text.strip()
if not text:
continue
font = run.font
fname = font.name
fsize = round(font.size.pt) if font.size else None
fbold = font.bold
fcolor = rgb_hex(font.color) if font.color else None
if fname:
font_names[fname] = font_names.get(fname, 0) + 1
if fsize:
font_sizes.append(fsize)
if fcolor:
font_colors[fcolor] = font_colors.get(fcolor, 0) + 1
page_info["texts"].append({
"text": text[:40],
"font": fname or "继承",
"size": fsize,
"bold": fbold,
"color": fcolor,
})
if sidx < 8: # 只保存前8页详情
slide_samples.append(page_info)
# 排序统计
top_fills = sorted(fill_colors.items(), key=lambda x: -x[1])
top_fonts = sorted(font_names.items(), key=lambda x: -x[1])
top_fcolors= sorted(font_colors.items(), key=lambda x: -x[1])
size_min = min(font_sizes) if font_sizes else None
size_max = max(font_sizes) if font_sizes else None
size_avg = round(sum(font_sizes) / len(font_sizes), 1) if font_sizes else None
return {
"name": name,
"total_slides": total,
"slide_w_mm": slide_w_mm,
"slide_h_mm": slide_h_mm,
"layouts": layouts,
"top_fills": top_fills[:8],
"top_fonts": top_fonts[:8],
"top_fcolors": top_fcolors[:8],
"size_min": size_min,
"size_max": size_max,
"size_avg": size_avg,
"slide_samples": slide_samples,
}
def render_md(data: dict) -> str:
d = data
lines = []
lines.append(f"# PPT 模板样式提取:{d['name']}\n")
lines.append(f"> 源文件:`{d['name']}` 幻灯片数:{d['total_slides']} 画布:{d['slide_w_mm']} × {d['slide_h_mm']} mm\n")
lines.append("## 可用版式 (Layouts)\n")
for l in d["layouts"]:
lines.append(f"- {l}")
lines.append("")
lines.append("## 配色统计(形状填充色,按出现频次排序)\n")
lines.append("| 色值 | 出现次数 |")
lines.append("|------|---------|")
for color, cnt in d["top_fills"]:
lines.append(f"| `{color}` | {cnt} |")
lines.append("")
lines.append("## 字体统计(按出现频次排序)\n")
lines.append("| 字体名称 | 出现次数 |")
lines.append("|---------|---------|")
for fname, cnt in d["top_fonts"]:
lines.append(f"| `{fname}` | {cnt} |")
lines.append("")
lines.append("## 字色统计(按出现频次排序)\n")
lines.append("| 色值 | 出现次数 |")
lines.append("|------|---------|")
for color, cnt in d["top_fcolors"]:
lines.append(f"| `{color}` | {cnt} |")
lines.append("")
lines.append("## 字号范围\n")
lines.append(f"- 最小:{d['size_min']} pt")
lines.append(f"- 最大:{d['size_max']} pt")
lines.append(f"- 平均:{d['size_avg']} pt")
lines.append("")
lines.append("## 分页详细分析(前 8 页)\n")
for page in d["slide_samples"]:
lines.append(f"### 第 {page['page']} 页\n")
if page["fills"]:
lines.append("**形状填充色:**\n")
for f in page["fills"]:
lines.append(f"- `{f['color']}` 位置=({f['x_mm']}mm, {f['y_mm']}mm) 宽={f['w_mm']}mm 高={f['h_mm']}mm")
lines.append("")
if page["texts"]:
lines.append("**文字:**\n")
lines.append("| 内容 | 字体 | 字号 | 粗体 | 颜色 |")
lines.append("|------|------|------|------|------|")
for t in page["texts"]:
lines.append(f"| `{t['text']}` | {t['font']} | {t['size'] or '继承'} | {t['bold']} | {t['color'] or '继承'} |")
lines.append("")
lines.append("---\n")
lines.append("## 使用说明\n")
lines.append("本文件由 `scripts/analyze_pptx.py` 从 `ppt_template/` 中的模板提取生成。")
lines.append("放入 `reference/` 目录并在 SKILL.md 的风格表中注册后,即可通过「使用自定义模板」生成对应风格的 Draw.io PPT。")
return "\n".join(lines)
# ─────────────────────────────────────────────
# 入口
# ─────────────────────────────────────────────
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python scripts/analyze_pptx.py ppt_template/<模板.pptx> [reference/output.md]")
sys.exit(1)
pptx_path = sys.argv[1]
if not os.path.exists(pptx_path):
print(f"错误:找不到文件 {pptx_path}")
sys.exit(1)
print(f"正在分析 {pptx_path} ...", file=sys.stderr)
data = analyze(pptx_path)
md = render_md(data)
if len(sys.argv) >= 3:
out_path = sys.argv[2]
with open(out_path, "w", encoding="utf-8") as f:
f.write(md)
print(f"✅ 样式提取完成,已保存至 {out_path}", file=sys.stderr)
else:
print(md)