zcbot/skills/ppt/references/design_principles.md

161 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# PPT 设计硬规则
> 出稿前过一遍。**这些不是建议,是工程约束** —— 模型生成 PPT 最常见的失败模式都是违反这些规则。
## 0. 画布 (默认 16:9)
| 用途 | 比例 | 宽×高 (英寸) | python-pptx |
|-----|------|------------|------------|
| **现代商务汇报** ⭐ 默认 | 16:9 | 13.33 × 7.5 | `Inches(13.33), Inches(7.5)` |
| 老投影 / 教学 | 4:3 | 10 × 7.5 | `Inches(10), Inches(7.5)` |
| 手机 / 视频号 | 9:16 | 7.5 × 13.33 | `Inches(7.5), Inches(13.33)` |
| 小红书 | 3:4 | 7.5 × 10 | `Inches(7.5), Inches(10)` |
| A4 横 / 竖 | √2:1 | 11.69 × 8.27 / 反 | 同左 |
不知道选哪个 → **16:9**。安全边距统一:左右 0.7 in,上下 0.5 in。**画布定了不要中途改**,后续坐标全按这个尺寸算。画布超 16:9 默认尺寸时所有字号 × `(实际宽 / 13.33)`
## 1. 字号 (16:9 标准)
| 元素 | 字号 (Pt) | 备注 |
|-----|----------|------|
| 主标题 (封面) | 44-54 | 单行不换行 |
| 标题 (内页) | 28-36 | 中文常用 32 |
| 副标题 / 章节小标题 | 20-24 | |
| 正文 / bullet | 18-22 | 低于 18 投影看不清 |
| 注释 / 数据来源 | 12-14 | 灰色,弱化 |
| 页脚页码 | 10-12 | 弱化处理 |
**底线**: 投影到 100 寸大屏,后排看得清最小字号是 18pt。**绝不能小于 14pt**,除非是数据来源等弱化信息。
## 2. 配色
### 三色制
- **主色 (Primary)** —— 标题、强调、关键数据。占视觉权重 60%
- **辅色 (Secondary)** —— 副标题、次要图形元素。占 30%
- **强调色 (Accent)** —— 关键数据点、CTA、警告。占 10%,不要泛滥
- 其他全部用灰阶 (#1F1F1F / #555 / #888 / #CCC / #F5F5F5)
### 推荐配色对照 (红色主题为默认)
| 风格 | 主色 | 辅色 | 强调色 | 备注 |
|-----|------|------|-------|------|
| **商务红** ⭐ 默认 | #C00000 | #E15554 | #FFC107 | 党政/年终/路演通用 |
| 中国红 | #8B0000 | #B22222 | #FFD700 | 民族/国货/红色文化主题 |
| 现代红 | #B91C1C | #DC2626 | #F59E0B | 新消费/科技产品发布 |
| 暖朱红 | #C73E1D | #E76F51 | #F4A261 | 学术汇报/行业会议 |
| 商务蓝 | #1F4E79 | #2E75B6 | #FFC000 | 金融/保险/政企 |
| 学术灰 | #2F2F2F | #595959 | #C00000 | 严肃论文/答辩 |
| 现代简约 | #2D3748 | #4A5568 | #38B2AC | 互联网/SaaS |
| 科技深色 | #0A192F | #112240 | #64FFDA | 黑客松/技术大会 |
### 禁忌
- 红配绿、紫配黄等高对比互补色不要直接用
- 渐变只用在 accent 上,正文/标题不要渐变
- 一份 deck 主色不要换。封面是 A 色、内页变 B 色 —— 这是大忌
## 3. 留白
- 标题与上边距 ≥ 0.4 英寸
- bullet 之间行距 1.3-1.5 倍
- 一页内容占满 70% 即可,**不要塞到边缘**
- 边距统一 (左右 0.7 寸,上下 0.5 寸常用值)
## 4. 信息密度
| 页类型 | 字数上限 | 图表 |
|-------|---------|-----|
| 封面 | 30 字 | 可选装饰图 |
| 目录 | 每条 ≤ 15 字 | 不要图 |
| 分章页 | ≤ 20 字 | 大号数字 + 章节名 |
| 要点页 | bullet ≤ 5 条,每条 ≤ 25 字 | 可选小图标 |
| 数据页 | 标题 + 一句结论 | **必须有图表** |
| 图片页 | ≤ 15 字标题 + 1-2 行说明 | 主体是图 |
## 4.1 字数预算 (避免溢出)
> 这是**布局超界的根因表**。bullet 写超了会顶到下一页元素;标题写超了会换行顶下来。开写前查这张表,而不是写完看 quality_check 报错。
公式: `每行字数 ≈ 框宽(in) × 72 / 字号(pt)`
| 字号 | 框宽 11.93 in (整宽) | 框宽 5.5 in (双栏单边) | 框宽 4.6 in (图片页文字区) |
|-----|--------------------|----------------------|--------------------------|
| 44 pt (主标题) | ≤ 19 字 | — | — |
| 36 pt (大标题) | ≤ 23 字 | — | — |
| 32 pt (内页标题) | ≤ 26 字 | — | — |
| 22 pt (要点) | ≤ 39 字 | ≤ 18 字 | ≤ 15 字 |
| 18 pt (正文) | ≤ 47 字 | ≤ 22 字 | ≤ 18 字 |
| 14 pt (注释) | ≤ 61 字 | ≤ 28 字 | ≤ 23 字 |
**英文字符按中文 0.5 个换算** (即英文每行约 2× 中文字数)。
### 行高估算
每行高度 ≈ `字号 × 1.4 / 72` (英寸)
| 字号 | 单行高 | 1 行框高 | 2 行框高 | 3 行框高 |
|-----|-------|---------|---------|---------|
| 32 pt | 0.62 in | 0.7 in | 1.3 in | 1.9 in |
| 22 pt | 0.43 in | 0.5 in | 0.9 in | 1.3 in |
| 18 pt | 0.35 in | 0.4 in | 0.8 in | 1.1 in |
| 14 pt | 0.27 in | 0.3 in | 0.6 in | 0.9 in |
**用法**: bullet 字数预计超表上限就拆条,不要试图靠 `auto_size` 收缩字号兜底 —— 会出现一页里字号大小不一,反而难看。
## 5. 文字层级
- 一页最多 3 级层级 (标题 / 正文 / 子项)
- 子项缩进 0.3-0.5 英寸
- 子项字号比父级小 2-4pt
- 不要四级以上嵌套
## 6. 图片规则
- **分辨率**: 投影建议 150 dpi 以上,印刷 300 dpi
- **占位**: 图片占满指定区域,不要拉伸变形 —— 用 `width=``height=` 单一参数让 python-pptx 等比缩放
- **背景**: 透明 PNG 优先;白底 JPG 在深色页上要做底色匹配
- **数量**: 一页最多 2 张图,3 张以上是网格图,按九宫格摆
## 7. 图表规则 (matplotlib)
- 颜色用 spec 里定的主/辅/强调三色,**不要用 matplotlib 默认色板**
- 字号: 标题 16,坐标轴 12,刻度 10
- 去掉上方和右方边框 (`ax.spines['top'/'right'].set_visible(False)`)
- 数据标签直接标在柱子/点上,优先于看坐标
- 中文字体: `plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']`
- 负号: `plt.rcParams['axes.unicode_minus'] = False`
```python
# 示例:符合规则的柱状图 (默认红色主题)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig, ax = plt.subplots(figsize=(10, 5), dpi=150)
bars = ax.bar(["Q1","Q2","Q3","Q4"], [12,18,25,31],
color=["#C00000","#C00000","#C00000","#FFC107"]) # 末尾突出
for bar, v in zip(bars, [12,18,25,31]):
ax.text(bar.get_x()+bar.get_width()/2, v+0.5, str(v),
ha='center', fontsize=11)
ax.set_title("季度营收 (亿元)", fontsize=16)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
fig.savefig("chart.png", bbox_inches="tight", dpi=150)
```
## 8. 一致性 (跨页)
- 标题位置不要跳来跳去 —— 所有内页标题都在同一像素位置
- 页脚 (页码 / logo / 标题) 在所有内页位置一致
- 字体在同 deck 内不要换 —— 中文一种字体,英文一种,够了
- 配色不变,字号梯度不变
## 9. 反模式速查
| 症状 | 原因 | 修法 |
|-----|------|-----|
| 一页字密密麻麻 | 没拆页 | 拆 2-3 页或转图表 |
| 投影看不清 | 字号 < 18 | 加大字号或拆页 |
| 颜色花 | 用了超过 5 种色 | 退回三色制 |
| bullet 是完整段落 | 把演讲稿当 bullet | 提炼关键词,完整句留给口述 |
| 图表默认配色 | 没改 matplotlib 色板 | spec 主色 |
| 图标/图片随意找的 | 没统一风格 | 同一来源 / 同一风格 |
| 标题在每页位置都不一样 | 没用统一版式 | layouts.md,固定模板 |