| name | academic-pptx-dengxian |
| description | 白底等线学术 PPT 生成器。适用于开题、中期、答辩等场景的 极简学术汇报幻灯片。设计原则:白底黑字、等线字体、零装饰、 左文右图双栏布局。触发词:白底/学术PPT/等线/DengXian/ 左文右图/开题风格/白底黑字/无装饰PPT/学术汇报版/答辩白底版。
|
| user-invocable | true |
白底等线学术 PPT Skill
零、设计哲学
本 Skill 的核心信念只有一条:排版即论证。
在学术汇报中,审稿人和导师的注意力是有限资源。任何不传递信息的视觉元素(横线、色块、装饰图案、渐变背景)都是在消耗观众对论证本身的注意力。
具体原则:
- 等级靠字号,不靠线条:16pt 大标题 vs 13pt 正文本身就是层次,不需要横线分隔
- 对比靠颜色深浅,不靠色块:
#1E1E2E 标题 vs #666666 节标签是轻微对比,不是色彩展示
- 白底 = 投影机友好:任何深色背景在劣质投影机下细节全失;白底才是真正的通用底色
- 留白是设计,不是浪费:右侧空白优先放图,无图时保持留白,不用文字填满
一、配色规范(7 色,无 C_LINE)
C_BG = RGBColor(0xFF, 0xFF, 0xFF)
C_TITLE = RGBColor(0x1E, 0x1E, 0x2E)
C_BODY = RGBColor(0x33, 0x33, 0x33)
C_LABEL = RGBColor(0x66, 0x66, 0x66)
C_CAPTION = RGBColor(0x88, 0x88, 0x88)
C_PH = RGBColor(0xEE, 0xEE, 0xEE)
C_PH_TXT = RGBColor(0xAA, 0xAA, 0xAA)
颜色角色对应表:
| 颜色变量 | Hex | 用途 | 禁止用于 |
|---|
C_BG | #FFFFFF | 幻灯片背景 | 任何文字 |
C_TITLE | #1E1E2E | 主标题、小节大字 | 正文段落 |
C_BODY | #333333 | 正文、要点 | 标题、节标签 |
C_LABEL | #666666 | 节编号+名称 | 正文主体 |
C_CAPTION | #888888 | 图注说明 | 正文 |
C_PH | #EEEEEE | 无图时占位框底 | 正文区域 |
C_PH_TXT | #AAAAAA | 占位框内提示文字 | 任何非占位场景 |
二、字体规范
F_MAIN = "等线"
F_BOLD = "等线 Bold"
等线 (DengXian) 选型理由:
- 几何无衬线,与学术内容的理性感吻合
- Windows 10+ 内置,无字体嵌入/缺字风险
- 比"微软雅黑"更轻盈,适合大量正文阅读
- 不同于"黑体"的笔触感,整体更现代
备用字体(等线不可用时):
思源黑体 CN(Adobe/Google 开源)
微软雅黑(Windows 内置,略重)
三、字号规范
| 位置 | 字号 | 粗体 | 颜色 |
|---|
| 封面主标题 | 30pt | ✅ Bold | C_TITLE |
| 封面副标题(第1行) | 14pt | ❌ | C_LABEL |
| 封面副标题(其余行) | 12pt | ❌ | C_LABEL |
| 内容页节标签("01 背景") | 11pt | ❌ | C_LABEL |
| 内容页大标题(小节名) | 16pt | ✅ Bold | C_TITLE |
| 内容页次级标题 | 14pt | ✅ Bold | C_TITLE |
| 内容页正文 | 13pt | ❌ | C_BODY |
| 图注 | 10pt | ❌ | C_CAPTION |
| 致谢页单句 | 26pt | ✅ Bold | C_TITLE |
字号原则:任意两级文字之间的字号差不小于 2pt;不要靠横线分隔,靠字号差实现视觉层次。
四、布局锚点(16:9,13.333" × 7.5")
SW = Inches(13.333)
SH = Inches(7.500)
L_TXT = Inches(0.55)
T_TXT = Inches(0.55)
W_TXT = Inches(5.35)
H_TXT = Inches(6.20)
L_IMG = Inches(6.25)
T_IMG = Inches(0.55)
W_IMG = Inches(6.75)
H_IMG = Inches(5.65)
T_CAP = T_IMG + H_IMG + Inches(0.10)
H_CAP = Inches(0.30)
布局比例说明:
- 左栏到右栏留 0.35" 的视觉间隙(6.25 - (0.55+5.35) = 0.35")
- 右图区高度略小于左文字栏,视觉上更舒适
- 图注紧贴图区底部(0.10" 间距),与正文区不重叠
五、核心函数模板
5.1 基础工具
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def new_slide(prs):
"""纯白空白幻灯片(layout[6] = 通常是 Blank)"""
return prs.slides.add_slide(prs.slide_layouts[6])
def txb(slide, left, top, width, height):
"""添加无边框透明文本框"""
b = slide.shapes.add_textbox(left, top, width, height)
b.fill.background()
b.line.fill.background()
return b
def run(para, text, size, bold=False, color=C_BODY, fname=F_MAIN):
"""添加一个 run(带格式的文本片段)"""
r = para.add_run()
r.text = text
r.font.size = Pt(size)
r.font.bold = bold
r.font.color.rgb = color
r.font.name = fname
return r
def add_para(tf, text, size, bold=False, color=C_BODY, fname=F_MAIN,
space_before=0, align=PP_ALIGN.LEFT):
"""向文本框追加一段,复用首段(避免多出空行)"""
if len(tf.paragraphs) == 1 and tf.paragraphs[0].text == "":
p = tf.paragraphs[0]
else:
p = tf.add_paragraph()
p.alignment = align
if space_before:
p.space_before = Pt(space_before)
run(p, text, size, bold=bold, color=color, fname=fname)
return p
5.2 左文字栏
def build_text_col(slide, section_label, body_blocks):
"""
section_label : "01 研究背景"(11pt 灰色节标签)
body_blocks : [(文字, 字号, bold, 颜色), ...]
"""
t = txb(slide, L_TXT, T_TXT, W_TXT, H_TXT)
tf = t.text_frame
tf.word_wrap = True
add_para(tf, section_label, 11, color=C_LABEL)
for text, size, bold, color in body_blocks:
add_para(tf, text, size, bold=bold, color=color, space_before=4)
5.3 右图区
from pathlib import Path
def build_image(slide, img_path, caption="", label=""):
"""
img_path 存在时插入图片,否则显示灰色占位框。
caption : 图注文字(居中,10pt 浅灰)
label : 占位框内说明(如 "图3-1 耦合机制示意图")
"""
if img_path and Path(img_path).exists():
slide.shapes.add_picture(str(img_path), L_IMG, T_IMG, W_IMG, H_IMG)
else:
ph = slide.shapes.add_shape(1, L_IMG, T_IMG, W_IMG, H_IMG)
ph.fill.solid()
ph.fill.fore_color.rgb = C_PH
ph.line.fill.background()
if label:
pt = txb(slide,
L_IMG + Inches(0.2),
T_IMG + (H_IMG - Inches(0.4)) / 2,
W_IMG - Inches(0.4), Inches(0.4))
p = pt.text_frame.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
run(p, label, 10, color=C_PH_TXT)
if caption:
cap = txb(slide, L_IMG, T_CAP, W_IMG, H_CAP)
p = cap.text_frame.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
run(p, caption, 10, color=C_CAPTION)
5.4 封面
def build_cover(prs, title_lines, sub_lines):
"""
title_lines : ["研究题目第一行", "第二行(可选)"],30pt Bold
sub_lines : ["汇报人:XX", "导师:XX", "2026年X月"],14/12pt
零装饰:无横线,字号差即分隔。
"""
slide = new_slide(prs)
title_top = SH * 0.26
t = txb(slide, Inches(1.5), title_top,
SW - Inches(3.0), Inches(len(title_lines) * 1.0 + 0.3))
tf = t.text_frame
tf.word_wrap = True
for line in title_lines:
add_para(tf, line, 30, bold=True, color=C_TITLE,
align=PP_ALIGN.CENTER)
sub_top = title_top + Inches(len(title_lines) * 1.0 + 0.4)
for i, line in enumerate(sub_lines):
sb = txb(slide, Inches(2.0), sub_top + i * Inches(0.55),
SW - Inches(4.0), Inches(0.50))
p2 = sb.text_frame.paragraphs[0]
p2.alignment = PP_ALIGN.CENTER
run(p2, line, 14 if i == 0 else 12, color=C_LABEL)
return slide
5.5 致谢页
def build_thanks(prs, text="感谢各位老师!"):
"""
整页只有一句话 + 大量留白。
26pt Bold,居中。零装饰。
"""
slide = new_slide(prs)
t = txb(slide,
Inches(1.5), (SH - Inches(1.0)) / 2,
SW - Inches(3.0), Inches(1.0))
p = t.text_frame.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
run(p, text, 26, bold=True, color=C_TITLE)
return slide
5.6 标准内容页(组合调用)
def build_content_page(prs, section_label, body_blocks,
img_path=None, caption="", img_label=""):
"""标准内容页 = 左文字栏 + 右图区"""
slide = new_slide(prs)
build_text_col(slide, section_label, body_blocks)
build_image(slide, img_path, caption=caption, label=img_label)
return slide
六、正文块规范(body_blocks 格式)
body_blocks = [
("研究问题", 16, True, C_TITLE),
("现有研究对窗的通透性缺乏系统性要素分析框架。", 13, False, C_BODY),
("研究假设", 14, True, C_TITLE),
("· 空间要素决定通透性的方向与层次", 13, False, C_BODY),
("· 交互要素决定通透性的感知深度", 13, False, C_BODY),
("· 构造要素决定通透性的实现边界", 13, False, C_BODY),
]
正文块注意事项:
space_before=4 是各行默认间距(在 build_text_col 内自动设置)
- 长文本填满左栏后不会溢出(
word_wrap=True),但不会自动缩小字号
- 超出
H_TXT=6.20" 的内容会被截断,注意控制每页文字量(建议 ≤ 200 字)
七、完整脚本骨架
"""
gen_pptx_academic.py
白底等线学术 PPT 生成脚本
"""
from pathlib import Path
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
SLIDES = [
{
"label": "01 研究背景",
"blocks": [
("研究问题", 16, True, C_TITLE),
("窗的通透性要素缺乏系统分析框架...", 13, False, C_BODY),
],
"img": None,
"caption": "图1 研究框架示意",
},
]
def main():
prs = Presentation()
prs.slide_width = SW
prs.slide_height = SH
build_cover(prs,
title_lines=["窗的通透性要素研究", "中期答辩"],
sub_lines=["汇报人:邓扬", "导师:XX 教授", "2026年4月"])
for s in SLIDES:
build_content_page(prs,
section_label=s["label"],
body_blocks=s["blocks"],
img_path=s.get("img"),
caption=s.get("caption", ""),
img_label=s.get("label", ""))
build_thanks(prs, "感谢各位老师!")
OUTPUT = Path("中期答辩PPT.pptx")
prs.save(str(OUTPUT))
print(f"已生成:{OUTPUT}({OUTPUT.stat().st_size // 1024} KB)")
if __name__ == "__main__":
main()
八、反模式(必须避免)
| ❌ 反模式 | ✅ 正确做法 | 原因 |
|---|
定义 C_LINE 颜色常量 | 从配色中彻底删除 | 有常量就会被"顺手"用到 |
用 add_shape 画横线分隔 | 字号差实现层次 | 横线是信息噪音 |
| 用色块做章节背景 | 白底统一到底 | 色块抢夺对内容的注意力 |
用 导航栏 占用左/上侧空间 | 节标签嵌入内容页 | 导航栏浪费可用内容区域 |
| 渐变背景/纹理 | 纯白 C_BG | 投影机下渐变层次全失 |
| 中文字体混用雅黑+宋体 | 统一等线 | 字体混用破坏整体感 |
| 正文字号 < 12pt | ≥ 13pt | 投影距离 5m 以上 12pt 以下难辨 |
| 每页文字 > 250 字 | ≤ 200 字 + 右侧图示 | 密度过高观众无法跟上 |
九、与其他 Skill 的关系
| Skill | 异同 |
|---|
thesis-ppt-style-dengyang | 同:零装饰、白底;异:字体为微软雅黑、字号更小(10pt),适合精读版 |
jobs-presentation-style | 同:零横线,字号差=层次;异:深色背景,更强视觉冲击,适合公开演讲 |
academic-pptx-dengxian(本 Skill) | 白底等线,学术汇报最优解,导师/委员会审阅场景 |
十、参考实现
本 Skill 提炼自:
gen_midterm_pptx_academic.py
输出:01-thesis/新版本/答辩准备/中期答辩PPT-白底等线版-20260407.pptx
规格:14 slides,49 KB,16:9
Python要求:python-pptx 1.0.x,等线字体(Windows 10+内置)
如需重新生成或修改内容,编辑 SLIDES 列表即可;布局锚点和函数无需改动。