> ## Documentation Index
> Fetch the complete documentation index at: https://financecontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PPT 模板创建器技能

> Finance 101：如何创建可复用的 PowerPoint 模板技能 —— 让 Claude 学习你的品牌规范，含完整工作流程与常见错误

# PPT 模板创建器（PPT Template Creator）

## 什么是模板 Skill？

在金融行业，每家机构都有自己的品牌演示文稿模板 —— 特定的字体、颜色方案、Logo 位置和布局结构。投行分析师在制作 Pitch Book 时，必须严格遵循公司的模板规范。

PPT 模板创建器是一个"元技能"（Meta-Skill）—— 它不是创建演示文稿，而是**创建创建演示文稿的技能**。它分析你提供的 PowerPoint 模板，提取精确的布局信息（幻灯片尺寸、占位符坐标、内容区域边界），然后生成一个自包含的 Skill 文件。之后 Claude 每次创建演示文稿时，都会使用这个 Skill 来确保输出匹配你的品牌规范。

### 一个简单的类比

想象你要教一个新来的助理使用你公司的 PPT 模板：

**不用这个技能时：** 每次都要告诉助理"标题放在这里、正文用这个字体、Logo 在右下角、来源标注用灰色小字"。助理每次都可能忘记某些规则。

**用了这个技能后：** 你一次性把所有规则写成一份详细的"操作手册"（SKILL.md），之后助理只需要按手册操作就能产出格式完美的 PPT。

### 什么时候用这个技能？

| 场景             | 使用什么                             |
| -------------- | -------------------------------- |
| 想创建一个可复用的模板技能  | **这个技能**（PPT Template Creator）   |
| 想用已有的模板制作演示文稿  | 直接描述你的需求，Claude 会自动使用对应的模板 Skill |
| 想从头创建没有模板的 PPT | 使用 `pptx` 技能                     |

## 为什么重要

* **品牌一致性** —— 确保团队所有成员产出的演示文稿风格统一
* **效率提升** —— 不再需要每次手动告诉 Claude 模板规格，一次设置永久使用
* **减少返工** —— 避免每次都手动修正格式问题（标题位置偏移、字体不对、Logo 缺失）
* **跨团队标准化** —— 多个团队可以共享同一个模板 Skill
* **新人快速上手** —— 新加入的分析师不需要学习模板细节，Claude 自动处理

## 核心概念

| 中文术语  | 英文术语                    | 说明                                   |
| ----- | ----------------------- | ------------------------------------ |
| 模板    | Template (.pptx/.potx)  | 包含预定义布局、字体和颜色的 PowerPoint 文件         |
| 布局    | Layout                  | 幻灯片的结构模板（封面、内容、双栏等）                  |
| 占位符   | Placeholder             | 模板中预留的内容位置（标题、正文、页脚等）                |
| 占位符索引 | Placeholder Index (idx) | 每个占位符的唯一编号，用于在代码中定位                  |
| 占位符类型 | Placeholder Type        | TITLE(1)、BODY(2)、OBJECT(7) 等类型       |
| 内容区域  | Content Area            | 自定义内容可以安全放置的区域边界                     |
| 布局索引  | Layout Index            | 每个布局在模板中的编号（从 0 开始）                  |
| 元技能   | Meta-Skill              | 用于创建其他技能的技能                          |
| 自包含   | Self-Contained          | SKILL.md 包含所有必要信息，不依赖外部参考            |
| EMU   | English Metric Unit     | PowerPoint 的内部度量单位，914400 EMU = 1 英寸 |

## 详细案例分析：为中国投行创建模板 Skill

### 案例背景

假设你是某中资投行 IT 部门的技术支持，需要把公司的标准 Pitch Book 模板转换成 Claude 可以使用的 Skill。

### 模板分析

**步骤 1：提取模板信息**

```python theme={null}
from pptx import Presentation

prs = Presentation("company_template.pptx")
print(f"尺寸: {prs.slide_width/914400:.2f}\" x {prs.slide_height/914400:.2f}\"")
print(f"布局数量: {len(prs.slide_layouts)}")

for idx, layout in enumerate(prs.slide_layouts):
    print(f"\n[{idx}] {layout.name}:")
    for ph in layout.placeholders:
        try:
            ph_idx = ph.placeholder_format.idx
            ph_type = ph.placeholder_format.type
            left = ph.left / 914400
            top = ph.top / 914400
            width = ph.width / 914400
            height = ph.height / 914400
            print(f"    idx={ph_idx}, type={ph_type}")
            print(f"        x={left:.2f}\", y={top:.2f}\", w={width:.2f}\", h={height:.2f}\"")
        except:
            pass
```

**输出示例：**

```
尺寸: 13.33" x 7.50"（16:9 宽屏）
布局数量: 8

[0] 封面:
    idx=0, type=CENTER_TITLE(3)
        x=1.50", y=2.50", w=10.33", h=1.50"
    idx=1, type=SUBTITLE(4)
        x=1.50", y=4.20", w=10.33", h=0.80"

[1] 内容页:
    idx=0, type=TITLE(1)
        x=0.75", y=0.35", w=11.83", h=0.65"
    idx=1, type=BODY(2)
        x=0.75", y=1.10", w=11.83", h=0.35"
    idx=10, type=BODY(2)
        x=0.75", y=6.80", w=5.00", h=0.30"
    idx=11, type=BODY(2)
        x=8.00", y=6.80", w=4.58", h=0.30"

[2] 内容页-带对象:
    idx=0, type=TITLE(1)
        x=0.75", y=0.35", w=11.83", h=0.65"
    idx=1, type=BODY(2)
        x=0.75", y=1.10", w=11.83", h=0.35"
    idx=7, type=OBJECT(7)
        x=0.75", y=1.90", w=11.83", h=4.60"
    idx=10, type=BODY(2)
        x=0.75", y=6.80", w=5.00", h=0.30"
```

### 关键发现：内容区域的确定

**最重要的测量 —— 内容区域起始位置：**

注意 Layout \[1] 中，副标题（BODY, idx=1）结束于 y=1.10" + h=0.35" = y=1.45"。但 Layout \[2] 中的 OBJECT 占位符从 y=1.90" 开始。这说明 y=1.45" 到 y=1.90" 之间有 0.45" 的保留空间（可能是模板中的装饰线条或间距）。

**如果你在 y=1.45" 就开始放内容，会与模板的装饰元素重叠。** 正确的内容起始位置是 y=1.90"。

```python theme={null}
# 查找 OBJECT 占位符确定真正的内容起始位置
for idx, layout in enumerate(prs.slide_layouts):
    for ph in layout.placeholders:
        try:
            if ph.placeholder_format.type == 7:  # OBJECT type
                top = ph.top / 914400
                print(f"Layout [{idx}] {layout.name}: 内容起始 y={top:.2f}\"")
        except:
            pass
```

### 生成的 SKILL.md 结构

```
china-ib-ppt-template/
├── SKILL.md          # 包含精确坐标的完整说明
└── assets/
    └── template.pptx # 模板文件
```

**SKILL.md 关键内容示例：**

```markdown theme={null}
# [投行名] PPT 模板

Template: `assets/template.pptx` (13.33" x 7.50", 8 layouts)

## Key Layouts

| Index | Name | Use For |
|-------|------|---------|
| 0 | 封面 | Cover/title slide |
| 1 | 内容页 | Content with bullets |
| 2 | 内容页-带对象 | Content with charts/tables |

## Content Area Boundaries

Content Area (for Layout 1/2):
- Left margin: 0.75"
- Top: 1.90" (below subtitle, confirmed via OBJECT placeholder)
- Width: 11.83"
- Height: 4.60" (ends at y=6.50", before footer)
- Footer: y=6.80"

## Placeholder Mapping

### Layout 0: 封面
| idx | Type | Position | Use |
|-----|------|----------|-----|
| 0 | CENTER_TITLE (3) | y=2.50" | 公司名称/项目名称 |
| 1 | SUBTITLE (4) | y=4.20" | 副标题/日期 |

### Layout 1: 内容页
| idx | Type | Position | Use |
|-----|------|----------|-----|
| 0 | TITLE (1) | y=0.35" | 幻灯片标题 |
| 1 | BODY (2) | y=1.10" | 副标题/描述 |
| 10 | BODY (2) | y=6.80" | 左下脚注（来源/免责） |
| 11 | BODY (2) | y=6.80" | 右下脚注（页码/日期） |
```

## 工作流程

<Steps>
  <Step title="用户提供模板">
    接受 `.pptx` 或 `.potx` 格式的模板文件。

    **关键确认：** 这个模板是否是公司的官方标准模板？是否有多个模板变体（如"Pitch Book 模板"和"IC Memo 模板"）？
  </Step>

  <Step title="分析模板">
    提取所有布局、占位符位置和幻灯片尺寸。

    **使用 Python 代码精确测量：**

    ```python theme={null}
    from pptx import Presentation

    prs = Presentation(template_path)
    print(f"尺寸: {prs.slide_width/914400:.2f}\" x {prs.slide_height/914400:.2f}\"")

    for idx, layout in enumerate(prs.slide_layouts):
        print(f"\n[{idx}] {layout.name}:")
        for ph in layout.placeholders:
            try:
                ph_idx = ph.placeholder_format.idx
                ph_type = ph.placeholder_format.type
                left = ph.left / 914400
                top = ph.top / 914400
                width = ph.width / 914400
                height = ph.height / 914400
                print(f"    idx={ph_idx}, type={ph_type}")
                print(f"        x={left:.2f}\", y={top:.2f}\", w={width:.2f}\", h={height:.2f}\"")
            except:
                pass
    ```

    **关键测量：**

    * 标题位置（Title Placeholder）
    * 副标题/描述位置（Subtitle）
    * 页脚占位符位置（Footer）
    * **内容区域**：副标题和页脚之间的空间
  </Step>

  <Step title="确定内容起始位置">
    **这是最关键的步骤。** 内容区域并不总是紧接在副标题之后开始。

    查找 OBJECT 类型的占位符（type=7），它的 `y` 坐标才是内容真正应该开始的位置：

    ```python theme={null}
    for idx, layout in enumerate(prs.slide_layouts):
        for ph in layout.placeholders:
            try:
                if ph.placeholder_format.type == 7:
                    top = ph.top / 914400
                    print(f"Layout [{idx}] {layout.name}: 内容起始 y={top:.2f}\"")
            except:
                pass
    ```

    **示例：** 模板可能有：

    * 副标题结束于 y=1.38"
    * OBJECT 占位符从 y=1.90" 开始
    * 差距 0.52" 是模板中的装饰线/间距 —— **不要在这里放内容**
  </Step>

  <Step title="初始化 Skill 结构">
    创建 Skill 目录：

    ```
    [公司名]-ppt-template/
    ├── SKILL.md          # 包含精确坐标的完整说明
    └── assets/
        └── template.pptx # 模板文件
    ```
  </Step>

  <Step title="生成 SKILL.md">
    写入完整的说明文件，包含：

    * 模板尺寸和布局数量
    * 每个布局的占位符映射（idx、type、坐标）
    * 内容区域边界（精确的 x、y、width、height）
    * 创建演示文稿的代码示例
    * 填充内容的代码示例（包括多级层次结构）

    **关键要求：** SKILL.md 必须是**自包含的** —— 包含所有必要信息，不依赖外部参考文档。读者只看这一个文件就能完全理解和使用模板。
  </Step>

  <Step title="用示例验证">
    生成一份样例演示文稿来确认 Skill 正常工作：

    * 封面页（标题 + 副标题）
    * 内容页（标题 + 多级要点）
    * 表格页（在内容区域内放置表格）
    * 图表页（在内容区域内放置图表）

    **验证要点：**

    * 内容是否在正确的区域内？
    * 标题是否对齐？
    * 页脚是否正确显示？
    * 内容是否与模板装饰元素重叠？
  </Step>

  <Step title="打包交付">
    将 Skill 打包交付给用户。

    提供安装说明和使用示例。
  </Step>
</Steps>

## 生成的 Skill 中的关键代码模式

### 创建演示文稿

```python theme={null}
from pptx import Presentation

prs = Presentation("path/to/skill/assets/template.pptx")

# 重要：先删除所有现有幻灯片
while len(prs.slides) > 0:
    rId = prs.slides._sldIdLst[0].rId
    prs.part.drop_rel(rId)
    del prs.slides._sldIdLst[0]

# 从布局添加幻灯片
slide = prs.slides.add_slide(prs.slide_layouts[LAYOUT_IDX])
```

### 填充内容（多级层次结构）

```python theme={null}
# 不要手动添加项目符号字符
# 使用 paragraph.level 控制层次结构

for shape in slide.shapes:
    if hasattr(shape, 'placeholder_format'):
        idx = shape.placeholder_format.idx
        if idx == CONTENT_IDX:
            tf = shape.text_frame
            for para in tf.paragraphs:
                para.clear()

            content = [
                ("一级标题", 0),
                ("二级要点内容", 1),
                ("另一个二级要点", 1),
                ("另一个一级标题", 0),
                ("对应的二级内容", 1),
            ]

            tf.paragraphs[0].text = content[0][0]
            tf.paragraphs[0].level = content[0][1]
            for text, level in content[1:]:
                p = tf.add_paragraph()
                p.text = text
                p.level = level
```

### 在内容区域放置自定义元素

```python theme={null}
from pptx.util import Inches

# 使用从模板分析中获得的精确坐标
content_left = Inches(0.75)
content_top = Inches(1.90)  # 从 OBJECT 占位符确定的真正起始位置
content_width = Inches(11.83)
content_height = Inches(4.60)

# 添加表格
table_shape = slide.shapes.add_table(
    rows=5, cols=4,
    left=content_left, top=content_top,
    width=content_width, height=content_height
)
```

## 常见错误与避坑指南

<Accordion title="错误 1：内容起始位置使用副标题的结束位置">
  **后果：** 自定义内容（表格、图表）与模板中的装饰线条或间距区域重叠，看起来不专业。

  **正确做法：** 使用 OBJECT 占位符（type=7）的 `y` 坐标作为内容起始位置，而非副标题占位符的底部。
</Accordion>

<Accordion title="错误 2：手动添加项目符号字符">
  **后果：** 代码中写 `p.text = "• 要点内容"`，但模板的 Slide Master 已经定义了项目符号样式。结果是出现双重项目符号或样式不一致。

  **正确做法：** 使用 `paragraph.level` 控制层次结构。Slide Master 会自动应用正确的项目符号样式。
</Accordion>

<Accordion title="错误 3：不删除模板中的现有幻灯片">
  **后果：** 模板文件中通常包含示例幻灯片。如果不先删除，新创建的内容会追加在示例幻灯片后面。

  **正确做法：** 创建新演示文稿时，先用循环删除所有现有幻灯片，然后再添加新的。
</Accordion>

<Accordion title="错误 4：SKILL.md 引用了外部文档">
  **后果：** SKILL.md 写了"详见公司品牌手册第 15 页"或"参考 meta-skill 文档"。但 Claude 在使用 Skill 时可能无法访问这些外部文档。

  **正确做法：** SKILL.md 必须**自包含** —— 所有必要的信息（坐标、布局映射、代码示例）都嵌入文件中。
</Accordion>

<Accordion title="错误 5：使用占位符名称而非 idx 引用">
  **后果：** 代码中用 `placeholder.name == "Title"` 来查找占位符。但不同的模板可能给占位符起不同的名字，而 `idx` 值是稳定的。

  **正确做法：** 使用 `placeholder_format.idx` 或 `placeholder_format.type` 来定位占位符。idx 值是模板特定的，必须从实际文件中提取。
</Accordion>

<Accordion title="错误 6：未测试 4:3 和 16:9 的差异">
  **后果：** 模板是 16:9（13.33" x 7.50"），但 SKILL.md 中的坐标假设了 4:3（10.00" x 7.50"）。所有自定义内容的位置都偏移了。

  **正确做法：** 从模板文件中读取 `prs.slide_width` 和 `prs.slide_height`，而非假设标准尺寸。所有坐标都从实际模板提取。
</Accordion>

<Accordion title="错误 7：内容超出页脚区域">
  **后果：** 表格或图表延伸到了页脚占位符的区域，遮住了来源标注和免责声明。

  **正确做法：** 内容高度 = 页脚 y 坐标 - 内容起始 y 坐标 - 适当间距。在 SKILL.md 中明确标注内容区域的最大高度。
</Accordion>

<Accordion title="错误 8：中国金融机构模板的双语处理不当">
  **后果：** 模板的封面有中英文双语标题区域，但 SKILL.md 只记录了一个标题占位符。结果是英文标题覆盖了中文标题的位置。

  **正确做法：** 中国金融机构的模板通常有双语设计。仔细检查是否有多个标题/副标题占位符用于不同语言。在 SKILL.md 中明确标注每个占位符的用途（中文标题 / 英文标题）。
</Accordion>

<Accordion title="错误 9：不处理模板中的页码占位符">
  **后果：** 模板有自动页码功能（通常在页脚区域），但自定义内容覆盖了页码占位符的位置。

  **正确做法：** 识别并记录页码占位符的位置。确保自定义内容不与之重叠。在 SKILL.md 中标注页码占位符。
</Accordion>

<Accordion title="错误 10：生成的 Skill 没有经过实际验证">
  **后果：** SKILL.md 中记录的坐标可能有误差，或代码示例可能有 bug。如果没有生成样例 PPT 来验证，这些问题会在实际使用中暴露。

  **正确做法：** 始终在最后一步生成一份样例演示文稿，包含封面、内容页、表格页。视觉验证所有元素的位置是否正确。
</Accordion>

## 日常工作场景

### 场景 1：投行品牌模板标准化

**背景：** 你所在投行的不同团队使用略有不同的 PPT 模板变体。IT 部门决定统一为一个标准模板，并创建对应的 Claude Skill。

**工作流程：**

1. 收集所有团队的模板变体
2. 与品牌团队确认官方标准模板
3. 分析标准模板的所有布局和占位符
4. 创建 SKILL.md，包含详细的坐标映射
5. 生成样例 PPT 验证
6. 分发给所有团队使用

### 场景 2：PE 基金创建 IC Memo 模板 Skill

**背景：** 一家 PE 基金希望 Claude 能自动生成 IC Memo 演示文稿。基金有自己的标准 IC 模板，包含封面、投资概要、行业分析、财务分析、估值、回报分析等标准页面。

**工作流程：**

1. 获取 IC 模板文件
2. 分析每个布局对应的页面类型
3. 特别注意：IC 模板通常有更多的标准页面类型（10-15 个布局）
4. 为每个布局类型创建代码示例
5. 在 SKILL.md 中标注每个布局的使用场景
6. 生成完整的样例 IC Memo 验证

### 场景 3：跨国机构的多语言模板

**背景：** 一家中外合资的金融机构有中英双语模板。封面、页脚和部分标题需要同时显示中文和英文。

**工作流程：**

1. 分析模板，注意双语占位符的配对关系
2. 记录哪些占位符是中文、哪些是英文
3. 在 SKILL.md 中创建双语填充的代码示例
4. 注意字体差异：中文字体（如微软雅黑）vs 英文字体（如Arial）
5. 验证双语内容的排版效果

## 练习题

<Accordion title="练习 1：模板分析（初级）">
  **题目：** 以下是一个模板分析的输出结果。回答问题：

  ```
  尺寸: 13.33" x 7.50"
  Layout [0] 封面:
      idx=0, type=3, x=2.00", y=3.00", w=9.33", h=1.20"
      idx=1, type=4, x=2.00", y=4.40", w=9.33", h=0.60"
  Layout [1] 内容:
      idx=0, type=1, x=0.50", y=0.30", w=12.33", h=0.70"
      idx=1, type=2, x=0.50", y=1.10", w=12.33", h=0.30"
      idx=10, type=2, x=0.50", y=7.00", w=6.00", h=0.25"
  Layout [2] 内容-图表:
      idx=0, type=1, x=0.50", y=0.30", w=12.33", h=0.70"
      idx=7, type=7, x=0.50", y=1.80", w=12.33", h=4.90"
  ```

  1. 这是 16:9 还是 4:3 的模板？
  2. 内容区域的真正起始 y 坐标是多少？
  3. 页脚的 y 坐标是多少？
  4. 内容区域的可用高度是多少？
</Accordion>

<Accordion title="练习 2：SKILL.md 编写（中级）">
  **题目：** 基于上面的模板分析结果，编写 SKILL.md 的关键部分：

  1. Key Layouts 表格
  2. Placeholder Mapping（每个布局）
  3. Content Area Boundaries
  4. 封面页的代码示例
  5. 内容页的代码示例（包含多级层次结构）
</Accordion>

<Accordion title="练习 3：问题诊断（高级）">
  **题目：** 用户报告以下问题。诊断可能的原因并给出修复建议：

  1. "表格总是与标题下方的蓝色线条重叠"
  2. "生成的 PPT 中有空白的示例幻灯片"
  3. "项目符号出现了两个点 —— 一个圆点后面跟着一个破折号"
  4. "封面的中文标题位置正确，但英文副标题覆盖了 Logo"
  5. "在 4:3 的模板上，表格超出了右边界"
</Accordion>

## 如何添加到本地环境

```bash theme={null}
# 安装插件
claude plugin install financial-analysis@financial-services-plugins
```

**定制建议：**

```markdown theme={null}
## 模板定制

### 中国金融机构常见模板特点
- 封面通常包含中英文双语标题
- 页脚包含"保密"或"仅供内部使用"（Confidential / For Internal Use Only）等声明
- 部分机构使用 16:9 宽屏格式，部分使用 4:3
- Logo 位置通常在左上角或右下角
- 配色通常为深蓝 + 灰色 + 白色（保守的投行风格）

### 常见布局类型
- 封面（Cover）
- 目录（Table of Contents）
- 章节分隔（Section Divider）
- 单栏内容（Single Column Content）
- 双栏内容（Two Column Content）
- 图表/表格页（Chart/Table Page）
- 全页图表（Full Page Chart）
- 附录/免责声明（Appendix/Disclaimer）

### 模板版本管理
- 在 SKILL.md 中记录模板版本号和日期
- 当公司更新模板时，需要重新运行此技能
- 保留旧版本的 SKILL.md 备份
```

## 最佳实践

* **模板文件放在 assets/ 目录** —— 始终与 Skill 捆绑
* **SKILL.md 自包含** —— 所有说明都嵌入文件中，不引用外部文档
* **不手动添加项目符号** —— 使用 `paragraph.level` 控制层次结构
* **先删除现有幻灯片** —— 创建新演示文稿时，先清除模板中的示例页
* **用占位符 idx 引用** —— idx 值是模板特定的，必须从实际文件中提取
* **用 OBJECT 占位符确定内容起始位置** —— 不要假设副标题下方就是内容区
* **生成样例验证** —— 每次创建 Skill 后都测试
* **记录所有坐标** —— 精确到 0.01 英寸
* **标注中英文占位符的用途** —— 双语模板需要清晰标注
* **版本号和日期** —— SKILL.md 中记录模板版本

<Note>
  此技能创建的是 **Skill**（技能），不是演示文稿。如果你想使用已有的模板 Skill 创建演示文稿，直接描述你需要的内容，Claude 会自动使用对应的模板。
</Note>
