pptx
This Claude Code skill handles PowerPoint presentations in all forms: creating slide decks from scratch using a structured template system, reading and extracting text from existing .pptx files, and editing or combining presentations. Use it whenever the user references presentations, decks, slides, or .pptx files. The skill provides both a recommended generator script workflow for assembling multi-slide presentations with automatic table of contents and cover slides, plus direct pptxgenjs access for custom creations, with critical emphasis on writing slide content as separate text files and assembling them via Python rather than embedding text directly in code.
git clone --depth 1 https://github.com/AgentTeam-TaichuAI/ScienceClaw /tmp/pptx && cp -r /tmp/pptx/ScienceClaw/backend/builtin_skills/pptx ~/.claude/skills/pptxSKILL.md
# PPTX Skill
## Quick Reference
| Task | Approach |
|------|----------|
| Read/analyze content | `python3 -m markitdown presentation.pptx` |
| **Generate structured presentation** | **Use `generate_report.js` — see below** |
| Create custom from scratch | Use pptxgenjs directly (see pptxgenjs section) |
---
## Generating Presentations (Recommended)
For structured presentations with cover slide, auto-generated TOC, content slides, and closing, use the pre-built template:
### Step 1: Copy the generator script
```bash
cp /builtin-skills/pptx/scripts/generate_report.js ./generate_pptx.js
```
### Step 2: Build `slides_data.json` via Python script
**Two phases: write slide content files, then assemble into JSON.**
**CRITICAL**: NEVER write or edit `.json` files directly. Use a Python script with `json.dump()` to guarantee valid JSON output.
**Phase 1 — Write each slide's content as a plain text file** using `write_file`:
For each major topic, `read_file` the relevant research data, then `write_file` the slide content directly:
```
read_file("research_data/literature.md") # refresh data in context
write_file("slides/slide_01_intro.txt", "...") # write slide body
write_file("slides/slide_02_analysis.txt", "...") # next slide
...
```
Each content slide body should be concise but substantive (3-6 bullet points or 2-4 sentences with specific data and citations).
**NEVER write a Python script that contains slide text as string literals.** The slide content goes directly into .txt files via `write_file`, not into Python code.
**Language (CRITICAL):**
- All presentation content (title, subtitle, slide headings, body text, chart labels, speaker notes) MUST be written in the **user's configured language** as specified in the system prompt's `## Language` section.
- If the user's language is Chinese (`zh`), write the entire presentation in Chinese; if English (`en`), write in English. Do NOT mix languages unless quoting a proper noun or technical term that has no standard translation.
**Phase 2 — Assemble into JSON** using a standard assembler script:
```python
import json, glob, os
SLIDES_DIR = "slides"
TITLE = "Presentation Title"
SUBTITLE = "Subtitle or tagline"
# Slide config: (file_pattern, type, title, extra_fields_or_None)
SLIDE_MAP = [
("slide_01_*.txt", "section", "Introduction", None),
("slide_02_*.txt", "bullets", "Key Findings", None),
("slide_03_*.txt", "content", "Market Overview", {"layout": "text-image", "image": "chart.png"}),
("slide_04_*.txt", "stat", "Key Metrics", {
"stats": [
{"value": "25%", "label": "Revenue Growth"},
{"value": "15%", "label": "Cost Reduction"},
{"value": "32%", "label": "Market Share"},
]
}),
("slide_05_*.txt", "content", "Trend Analysis", None),
(None, "chart_pie", "Distribution", {
"labels": ["Type A", "Type B", "Type C", "Other"],
"values": [35, 30, 20, 15],
}),
(None, "chart_line", "Yearly Trends", {
"x_labels": ["2020", "2021", "2022", "2023", "2024"],
"series": [{"name": "Metric", "values": [40, 55, 62, 70, 78]}],
}),
]
data = {
"title": TITLE, "subtitle": SUBTITLE,
"author": "ScienceClaw", "date": "2026-03-09",
"theme": "midnight", "toc": True, "slides": [],
}
for entry in SLIDE_MAP:
pattern, stype, title, extra = entry
slide = {"type": stype, "title": title}
if pattern:
matches = sorted(glob.glob(os.path.join(SLIDES_DIR, pattern)))
if matches:
body = open(matches[0], encoding="utf-8").read().strip()
if stype == "bullets":
slide["items"] = [line.strip() for line in body.split("\n") if line.strip()]
else:
slide["body"] = body
if extra:
slide.update(extra)
data["slides"].append(slide)
# Closing slide
data["slides"].append({"type": "closing", "title": "Thank You", "subtitle": "Questions?"})
with open("slides_data.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"Generated slides_data.json ({len(data['slides'])} slides)")
```
### Step 3: Generate the PPTX
```bash
python3 build_slides_data.py # outputs slides_data.json
node generate_pptx.js slides_data.json output.pptx
```
### Supported slide types
| Type | Required Fields | Optional Fields |
|------|----------------|-----------------|
| `title` | (auto from top-level) | `title`, `subtitle`, `author`, `date` |
| `agenda` | `items` (string array) | `title` (default: "Agenda") |
| `section` | `title` | `subtitle` |
| `content` | `title` | `body`, `layout`, `image` |
| `bullets` | `title`, `items` | `subtitle` |
| `two_column` | `title`, `left`, `right` | each column: `{heading, body}` or `{heading, items}` |
| `table` | `title`, `headers`, `rows` | `caption` |
| `stat` | `title`, `stats` | stats: `[{value, label}]` (2-4 items) |
| `image` | `title`, `image` | `caption` |
| `chart_bar` | `title`, `categories`, `series` | series: `[{name, values}]` |
| `chart_pie` | `title`, `labels`, `values` | — |
| `chart_line` | `title`, `x_labels`, `series` | series: `[{name, values}]` |
| `quote` | `text` | `author`, `title` |
| `closing` | `title` | `subtitle`, `contact` |
**Chart types for data visualization (use 2-4 per presentation, mix types):**
- `chart_bar` — for comparisons, rankings (e.g. drug efficacy scores)
- `chart_pie` — for proportions, distributions (e.g. mutation type breakdown)
- `chart_line` — for trends over time (e.g. yearly incidence rates)
### Top-level JSON keys
| Key | Required | Description |
|-----|----------|-------------|
| `title` | Yes | Presentation title (cover slide) |
| `subtitle` | No | Subtitle on cover slide |
| `author` | No | Author name |
| `date` | No | Date string |
| `theme` | No | Color theme (see below) |
| `toc` | No | Auto-generate Table of Contents slide (default: true) |
| `slides` | Yes | Array of slide objects |
### Available themesUse this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.
自动配置飞书机器人应用。当用户要求配置飞书、创建飞书机器人、接入 Lark/飞书、设置飞书 app_id/app_secret、或询问如何配置飞书 IM 时触发此 skill。该 skill 通过 sandbox 内置浏览器自动完成飞书开放平台上的应用创建、权限配置、事件订阅和发布,用户仅需扫码登录。
MANDATORY: When a user asks to install, find, search, or add ANY skill (e.g. 'install hello-world skill', 'find a skill for X', 'add a skill'), you MUST first run `skills find <query>` to search the skills ecosystem. NEVER create a skill from scratch without searching first. Even if the name sounds simple, always search — it may already exist as a published skill.
Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
Create new skills, modify and improve existing skills, and measure skill performance. MANDATORY: Use this skill whenever the user wants to create a custom skill from scratch, design a workflow as a skill, write their own SKILL.md, update or optimize an existing skill, run evals to test a skill, benchmark skill performance, or asks questions like 'how do I make a skill', 'create a skill for X', 'turn this into a skill', 'I want to build a skill'. Even if the user doesn't use the word 'skill' explicitly, trigger this if they want to capture a reusable workflow or set of instructions for the agent.
Create new tools or upgrade existing tools for the agent. MANDATORY: Use this skill whenever the user wants to create a custom tool, convert a script into a reusable tool, write a new tool function, upgrade or modify an existing tool, test and improve a tool in the sandbox, or asks things like 'make a tool for X', 'create a tool that does Y', 'improve the X tool', 'upgrade my tool', 'turn this script into a tool'. Even if the user doesn't use the word 'tool' explicitly, trigger this if they want to add a new callable capability to the agent or modify an existing one.
Access 1000+ scientific tools through ToolUniverse for drug discovery, protein analysis, genomics, literature search, clinical data, ADMET prediction, molecular docking, and more. Use when the user needs biomedical or scientific research capabilities.
Use this skill any time a spreadsheet file is the primary input or output. This means any task where the user wants to: open, read, edit, or fix an existing .xlsx, .xlsm, .csv, or .tsv file (e.g., adding columns, computing formulas, formatting, charting, cleaning messy data); create a new spreadsheet from scratch or from other data sources; or convert between tabular file formats. Trigger especially when the user references a spreadsheet file by name or path — even casually (like \"the xlsx in my downloads\") — and wants something done to it or produced from it. Also trigger for cleaning or restructuring messy tabular data files (malformed rows, misplaced headers, junk data) into proper spreadsheets. The deliverable must be a spreadsheet file. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration, even if tabular data is involved.