# 设计规则 — 金融报告级 PPT 标准

> 来源：投行级研报 77页逐页分析 + 用户反馈迭代。
> 本文档定义"专业"的具体标准。所有金融/投资报告类 PPT 必须遵守。

---

## 核心原则

1. **信息密度优先** — 每页至少 2 个数据元素（图表、表格、KPI）。一图一页是浪费。
2. **零装饰** — 无 emoji、无花哨装饰。视觉层次靠字号+粗细+颜色。
3. **克制用色** — 每张图表最多 2-3 种颜色。主色60%、辅助色30%、强调色10%。
4. **每页有来源** — 底部 8pt 灰色脚注，标明数据来源。

---

## 页面结构模板（固定框架）

投行级研报每页均有固定结构，ppt-station 应遵循：

```
[标题 16pt 粗体]                                    [页码/章节标记]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  (全宽 1pt 细线)
[左图/左内容 50%]              [右图/右内容 50%]

[来源: Bloomberg, Wind]                          [公司/品牌名]
```

### 精确坐标（由 Design Tokens 控制）

| 元素 | x | y | w | h | 字号 | 颜色 | Token |
|------|---|---|---|---|------|------|-------|
| 页面标题 | 0.60 | 0.25 | 12.133 | 0.50 | 16pt | text_dark | `page_title_size`, `header_y` |
| 全宽分隔线 | 0.60 | 0.80 | 12.133 | 0.015 | — | primary | `divider_y`, `divider_h` |
| 内容区 | 0.60 | 1.00 | 自动 | 5.80 | — | — | `content_y`, `content_w`（= slide_w - 2*margin） |
| 来源脚注 | 0.60 | 7.10 | 10.0 | 0.30 | 8pt | text_muted | `footer_y`, `footer_size` |

**注意**：标题用 16pt（不是 26-28pt），全宽细线（不是 2" 短装饰线）。

**现已自动化**：`add_page_header()` 和 `add_page_footer()` 自动处理页眉/页脚，注册布局无需手动编写。

---

## 布局选择 — 50/50 双图是默认

投行级研报 58% 的内容页使用 50/50 左右双图。

### 应该合并为一页的组合

| 左图 | 右图 | 为什么 |
|------|------|--------|
| 股价走势 | 累计收益率 | 同一标的的价格+回报 |
| 营收/利润柱图 | 利润率/ROE折线 | 规模+效率双视角 |
| 费用结构 | 现金流 | 投入+产出 |
| 当年收益柱图 | 成立以来累计 | 短期+长期 |
| PE/PB范围 | PE历史走势 | 估值概览+趋势 |

### 什么时候用上下双图（`two_charts_vertical`）

- 共享日期轴的趋势对比（如收入增速 vs 利润增速）
- 需要最大化时间轴跨度（上下图均使用全宽）
- 数据量大、需要高分辨率的时间序列

### 什么时候用图表+表格（`chart_table`）

- 趋势图 + 截面数据快照组合（如走势图 + 最新财务指标表）
- 需要同时展示可视化和精确数值

### 什么时候用全页单图

- 超长时间序列（20年+，需要全宽展示）
- 多系列散点图/气泡图
- 复杂堆叠图（5+系列）

### 什么时候不需要 section_divider

投行级研报没有分隔页。章节区分靠：
- 左侧竖色标（0.15" × 0.4"，章节颜色）
- 页面标题前缀（如"走势分析 — 股价趋势"）

如果报告超过 20 页，可以用 1 个 section_divider。10-15 页报告不需要。

---

## 排版规范

### 字号体系（克制）

| 元素 | 投行级标准 | 不要超过 |
|------|---------------|---------|
| 页面标题 | 16pt Bold | 18pt |
| 封面标题 | 36pt Bold | 40pt |
| 图表副标题 | 11pt | 14pt |
| 数据标签 | 7-9pt Bold | 10pt |
| 图例 | 9pt | 10pt |
| 轴标签 | 9pt | 10pt |
| 来源脚注 | 8pt | 9pt |
| KPI 大数字 | 28-32pt | 32pt |

### 字体

| 场景 | 标题 | 正文/图表 |
|------|------|----------|
| 金融报告 | 黑体 Bold | 黑体 |
| 通用商务 | 微软雅黑 Bold | 微软雅黑 |

---

## 配色规范

### 背景

- 内容页：**纯白 `FFFFFF`**（不要浅色系背景）
- 标题页/结论页：**深色 `bg_dark`**

### 图表

- 主系列（柱/面积）：用色板色1（偏浅），大面积不刺眼
- 次系列（折线）：用色板色2（深色），细线需高对比度
- 参考线/均值线：用 `accent` 色 + 虚线
- **同一张图表最多 3 种颜色**（投行级标准）

### 正负色

- 正向（增长/超额）：`positive` 绿
- 负向（下跌/不足）：`negative` 红
- 中性：`text_muted` 灰

---

## 表格规范（投行级，自动启用）

`add_table()` 默认 `ib_style=True`：
- **无垂直边框** — 仅保留表头上下 + 表格底部水平线（表头 1pt primary 色，数据行 0.5pt `#E2E8F0`）
- **数值列自动右对齐** — 检测超过 50% 数值的列，自动右对齐
- **首列左对齐** — 标签/名称列
- **斑马纹** — 偶数行 `table_zebra_even`，奇数行 `table_zebra_odd`

## 图表规范（ChartJunkCleaner 自动执行）

`ChartBuilder.build()` 后自动清洗：
- 图表外边框 → 移除
- Y 轴网格线 → 极浅灰色虚线 (`#E8E8E8`, 0.5pt, dot)
- 刻度线 → none
- 图例边框/填充 → 移除
- plotArea 边框 → 移除

---

## 绝对禁止

1. **禁止 emoji** — 金融报告不使用任何 emoji。用编号（"01"、"02"）或色块替代图标。
2. **禁止每图一页** — 默认使用 `two_charts` 布局把相关图表并排。
3. **禁止大字号标题** — 页面标题不超过 18pt（DeckLinter 会报 WARN）。
4. **禁止纯文字页** — 每页至少一个数据可视化元素。
5. **禁止没有来源的图表** — 用 `data["footnote"]` 传入（DeckLinter 会检查 footer 存在性）。
6. **禁止花哨配色** — 单图不超过 3 色，全 PPT 不超过 5 色。
7. **禁止无分隔线** — 标题下方是全宽分隔线（`add_page_header` 自动处理）。
8. **禁止手写标题+分隔线** — 使用 `add_page_header()` 或注册布局自动处理。

---

## 对比示例

### 不专业（之前安克报告的模式）

```
Page 1:  title_dark
Page 2:  kpi_cards（4个指标）
Page 3:  bullet_points（3个要点 + emoji ⚡🏠🎧）
Page 4:  section_divider "走势分析"        ← 浪费一页
Page 5:  股价走势图（独占整页）            ← 信息密度低
Page 6:  累计收益率（独占整页）            ← 应与 Page 5 合并
Page 7:  kpi_cards（风险指标）
Page 8:  section_divider "财务分析"        ← 又浪费一页
Page 9:  营收利润（独占整页）              ← 信息密度低
Page 10: 利润率趋势（独占整页）            ← 应与 Page 9 合并
...
= 18 页，只有 5 个图表
```

### 专业（投行研报模式）

```
Page 1:  title_dark
Page 2:  kpi_cards（6个指标）+ 来源脚注
Page 3:  two_charts — 左:股价走势 / 右:累计收益率
Page 4:  two_charts — 左:营收利润 / 右:利润率趋势
Page 5:  two_charts — 左:费用结构 / 右:现金流
Page 6:  two_charts — 左:竞争对比柱图 / 右:ROE趋势对比
Page 7:  comparison_table（竞争格局数据表）+ 来源脚注
Page 8:  bullet_points（竞争壁垒，用编号代替emoji）
Page 9:  conclusion_dark
= 9 页，10 个图表 + 1 表 + 1 KPI
```

**同样的信息量，后者只用一半的页数，但每页都高密度。**
