跳转到主要内容

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 TypeTITLE(1)、BODY(2)、OBJECT(7) 等类型
内容区域Content Area自定义内容可以安全放置的区域边界
布局索引Layout Index每个布局在模板中的编号(从 0 开始)
元技能Meta-Skill用于创建其他技能的技能
自包含Self-ContainedSKILL.md 包含所有必要信息,不依赖外部参考
EMUEnglish Metric UnitPowerPoint 的内部度量单位,914400 EMU = 1 英寸

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

案例背景

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

模板分析

步骤 1:提取模板信息
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”。
# 查找 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 关键内容示例:
# [投行名] 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" | 右下脚注(页码/日期) |

工作流程

1

用户提供模板

接受 .pptx.potx 格式的模板文件。关键确认: 这个模板是否是公司的官方标准模板?是否有多个模板变体(如”Pitch Book 模板”和”IC Memo 模板”)?
2

分析模板

提取所有布局、占位符位置和幻灯片尺寸。使用 Python 代码精确测量:
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)
  • 内容区域:副标题和页脚之间的空间
3

确定内容起始位置

这是最关键的步骤。 内容区域并不总是紧接在副标题之后开始。查找 OBJECT 类型的占位符(type=7),它的 y 坐标才是内容真正应该开始的位置:
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” 是模板中的装饰线/间距 —— 不要在这里放内容
4

初始化 Skill 结构

创建 Skill 目录:
[公司名]-ppt-template/
├── SKILL.md          # 包含精确坐标的完整说明
└── assets/
    └── template.pptx # 模板文件
5

生成 SKILL.md

写入完整的说明文件,包含:
  • 模板尺寸和布局数量
  • 每个布局的占位符映射(idx、type、坐标)
  • 内容区域边界(精确的 x、y、width、height)
  • 创建演示文稿的代码示例
  • 填充内容的代码示例(包括多级层次结构)
关键要求: SKILL.md 必须是自包含的 —— 包含所有必要信息,不依赖外部参考文档。读者只看这一个文件就能完全理解和使用模板。
6

用示例验证

生成一份样例演示文稿来确认 Skill 正常工作:
  • 封面页(标题 + 副标题)
  • 内容页(标题 + 多级要点)
  • 表格页(在内容区域内放置表格)
  • 图表页(在内容区域内放置图表)
验证要点:
  • 内容是否在正确的区域内?
  • 标题是否对齐?
  • 页脚是否正确显示?
  • 内容是否与模板装饰元素重叠?
7

打包交付

将 Skill 打包交付给用户。提供安装说明和使用示例。

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

创建演示文稿

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])

填充内容(多级层次结构)

# 不要手动添加项目符号字符
# 使用 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

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

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
)

常见错误与避坑指南

后果: 自定义内容(表格、图表)与模板中的装饰线条或间距区域重叠,看起来不专业。正确做法: 使用 OBJECT 占位符(type=7)的 y 坐标作为内容起始位置,而非副标题占位符的底部。
后果: 代码中写 p.text = "• 要点内容",但模板的 Slide Master 已经定义了项目符号样式。结果是出现双重项目符号或样式不一致。正确做法: 使用 paragraph.level 控制层次结构。Slide Master 会自动应用正确的项目符号样式。
后果: 模板文件中通常包含示例幻灯片。如果不先删除,新创建的内容会追加在示例幻灯片后面。正确做法: 创建新演示文稿时,先用循环删除所有现有幻灯片,然后再添加新的。
后果: SKILL.md 写了”详见公司品牌手册第 15 页”或”参考 meta-skill 文档”。但 Claude 在使用 Skill 时可能无法访问这些外部文档。正确做法: SKILL.md 必须自包含 —— 所有必要的信息(坐标、布局映射、代码示例)都嵌入文件中。
后果: 代码中用 placeholder.name == "Title" 来查找占位符。但不同的模板可能给占位符起不同的名字,而 idx 值是稳定的。正确做法: 使用 placeholder_format.idxplaceholder_format.type 来定位占位符。idx 值是模板特定的,必须从实际文件中提取。
后果: 模板是 16:9(13.33” x 7.50”),但 SKILL.md 中的坐标假设了 4:3(10.00” x 7.50”)。所有自定义内容的位置都偏移了。正确做法: 从模板文件中读取 prs.slide_widthprs.slide_height,而非假设标准尺寸。所有坐标都从实际模板提取。
后果: 表格或图表延伸到了页脚占位符的区域,遮住了来源标注和免责声明。正确做法: 内容高度 = 页脚 y 坐标 - 内容起始 y 坐标 - 适当间距。在 SKILL.md 中明确标注内容区域的最大高度。
后果: 模板的封面有中英文双语标题区域,但 SKILL.md 只记录了一个标题占位符。结果是英文标题覆盖了中文标题的位置。正确做法: 中国金融机构的模板通常有双语设计。仔细检查是否有多个标题/副标题占位符用于不同语言。在 SKILL.md 中明确标注每个占位符的用途(中文标题 / 英文标题)。
后果: 模板有自动页码功能(通常在页脚区域),但自定义内容覆盖了页码占位符的位置。正确做法: 识别并记录页码占位符的位置。确保自定义内容不与之重叠。在 SKILL.md 中标注页码占位符。
后果: SKILL.md 中记录的坐标可能有误差,或代码示例可能有 bug。如果没有生成样例 PPT 来验证,这些问题会在实际使用中暴露。正确做法: 始终在最后一步生成一份样例演示文稿,包含封面、内容页、表格页。视觉验证所有元素的位置是否正确。

日常工作场景

场景 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. 验证双语内容的排版效果

练习题

题目: 以下是一个模板分析的输出结果。回答问题:
尺寸: 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. 内容区域的可用高度是多少?
题目: 基于上面的模板分析结果,编写 SKILL.md 的关键部分:
  1. Key Layouts 表格
  2. Placeholder Mapping(每个布局)
  3. Content Area Boundaries
  4. 封面页的代码示例
  5. 内容页的代码示例(包含多级层次结构)
题目: 用户报告以下问题。诊断可能的原因并给出修复建议:
  1. “表格总是与标题下方的蓝色线条重叠”
  2. “生成的 PPT 中有空白的示例幻灯片”
  3. “项目符号出现了两个点 —— 一个圆点后面跟着一个破折号”
  4. “封面的中文标题位置正确,但英文副标题覆盖了 Logo”
  5. “在 4:3 的模板上,表格超出了右边界”

如何添加到本地环境

# 安装插件
claude plugin install financial-analysis@financial-services-plugins
定制建议:
## 模板定制

### 中国金融机构常见模板特点
- 封面通常包含中英文双语标题
- 页脚包含"保密"或"仅供内部使用"(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 中记录模板版本
此技能创建的是 Skill(技能),不是演示文稿。如果你想使用已有的模板 Skill 创建演示文稿,直接描述你需要的内容,Claude 会自动使用对应的模板。