Generate conference presentation slides (beamer LaTeX → PDF + editable PPTX) from a compiled paper, with speaker notes and full talk script. Use when user says "做PPT", "做幻灯片", "make slides", "conference talk", "presentation slides", "生成slides", "写演讲稿", or wants beamer slides for a conference talk.
This skill runs after Workflow 3 (/paper-writing). It takes a compiled paper and generates a presentation slide deck for conference oral talks, spotlight presentations, or poster lightning talks.
Unlike posters (single page, visual-first), slides tell a temporal story: each slide builds on the previous one, with progressive revelation of the research narrative. A good talk makes the audience understand why this matters before showing what was done.
Lets the user steer the talk's structural rhythm (story beats, theorem density, figure density inherited from the source paper) toward a reference paper. Default OFF — when the user does not pass — style-ref, do nothing differently from before.
Only when — style-ref: <source> appears in $ARGUMENTS, run the helper FIRST:
if [ ! -f tools/extract_paper_style.py ]; then
echo "error: tools/extract_paper_style.py not found — re-run 'bash tools/install_aris.sh' to refresh the '.aris/tools' symlink (added in #174), or copy the helper manually from the ARIS repo" >&2
exit 1
fi
CACHE=$(python3 tools/extract_paper_style.py --source "<source>")
case $? in
0) ;; # use $CACHE/style_profile.md as structural guidance
2) echo "warning: style-ref skipped (missing optional dep)" >&2 ;;
3) echo "error: --style-ref source failed; aborting slides" >&2 ; exit 1 ;;
*) echo "error: helper failed unexpectedly; aborting slides" >&2 ; exit 1 ;;
esac
Sources accepted: local TeX dir / file, local PDF, arXiv id, http(s) URL. Overleaf URLs/IDs are rejected — clone via /overleaf-sync setup <id> first and pass the local clone path.
Strict rules (full contract in tools/extract_paper_style.py docstring):
Use style_profile.md to align section-budget tendency and theorem-environment density. Talk-type slide count above still takes precedence.
Never copy speaker-note prose, slide titles, or examples from anything reachable through the cache. The talk content is from the user's paper, not the reference.
Never pass — style-ref (or the cache contents) to the GPT-5.4 reviewer sub-agent — the reviewer must judge the talk's clarity on its own merits.
Talk Type → Slide Count
Talk Type
Duration
Slides
Content Depth
poster-talk
3-5 min
5-8
Problem + 1 method slide + 1 result + conclusion
spotlight
5-8 min
8-12
Problem + 2 method + 2 results + conclusion
oral
15-20 min
15-22
Full story with motivation, method detail, experiments, analysis
invited
30-45 min
25-40
Comprehensive: background, related work, deep method, extensive results, discussion
Venue Color Schemes
Same as /paper-poster:
Venue
Primary
Accent
Background
Text
NeurIPS
#8B5CF6
#2563EB
#FFFFFF
#1E1E1E
ICML
#DC2626
#1D4ED8
#FFFFFF
#1E1E1E
ICLR
#059669
#0284C7
#FFFFFF
#1E1E1E
CVPR
#2563EB
#7C3AED
#FFFFFF
#1E1E1E
GENERIC
#334155
#2563EB
#FFFFFF
#1E1E1E
State Persistence (Compact Recovery)
Persist state to slides/SLIDES_STATE.json after each phase:
If page count differs significantly from outline (>2 slides off), investigate.
State: Write SLIDES_STATE.json with phase: 4.
Phase 5: Codex MCP Review
Send the slide outline + selected LaTeX frames to GPT-5.4 xhigh:
mcp__codex__codex:
config: {"model_reasoning_effort": "xhigh"}
prompt: |
Review this [TALK_TYPE] presentation ([TALK_MINUTES] min) for [VENUE].
Evaluate using these criteria (score 1-5 each):
1. **Story arc** — Does the talk build a compelling narrative? (Problem → insight → method → evidence → takeaway)
2. **Slide density** — Any slides with too much text? (Max 6 lines, 8 words/line)
3. **Time budget** — Is [N] slides realistic for [TALK_MINUTES] minutes?
4. **Figure visibility** — Will figures be readable on a projector?
5. **Opening hook** — Do slides 2-3 grab attention? (Not "In this paper, we...")
6. **Takeaway** — Is the final message clear and memorable?
7. **Progressive build** — Are complex ideas revealed gradually?
Slide outline:
[PASTE SLIDE_OUTLINE.md]
Selected frames (LaTeX):
[PASTE KEY FRAMES]
Provide:
- Score for each criterion
- Top 3 actionable fixes
- Overall: Ready to present? (Yes / Needs revision / Major issues)
Apply fixes. Recompile if LaTeX was changed.
⚠️ If mcp__codex__codex is not available (no OpenAI API key), skip external review and proceed to Phase 6. Note the skip in SLIDES_STATE.json.
Save review to slides/SLIDES_REVIEW.md.
State: Write SLIDES_STATE.json with phase: 5.
Phase 6: Speaker Notes
For each slide, ensure a \note{} block exists with:
What to say (2-3 complete sentences, conversational tone)
Transition phrase to the next slide (e.g., "So how do we actually implement this? Let me show you...")
Also generate slides/speaker_notes.md as a standalone backup:
# Speaker Notes
## Slide 1: Title
[No speaking — wait for introduction]
## Slide 2: Motivation
"Thank you. So let me start with the problem we're trying to solve..."
[Time: 1.5 min]
## Slide 3: Problem Statement
"Specifically, the challenge is..."
→ Transition: "To address this, our key insight is..."
[Time: 1 min]
...
Creates a PPTX with correct aspect ratio (16:9 → 13.33" x 7.5"; 4:3 → 10" x 7.5")
For each beamer frame:
Creates a slide with matching layout
Title in venue primary color, bold
Bullet points with venue accent color markers
Figures embedded as images (from slides/figures/)
Speaker notes transferred to PPTX notes field
Title slide with special formatting (centered, larger title)
Thank You slide with centered text
Applies venue color scheme throughout
cd slides && python3 generate_pptx.py
# Output: slides/presentation.pptx
⚠️ If python-pptx is not installed, skip with a note: "Install pip install python-pptx to enable PowerPoint export."
State: Write SLIDES_STATE.json with phase: 7.
Phase 8: Full Talk Script
Generate slides/TALK_SCRIPT.md — a complete, word-for-word script for the talk.
This is different from speaker notes (brief reminders). The talk script is a full manuscript that can be read aloud or used for practice.
# Talk Script: [Paper Title]
**Venue**: [VENUE] [YEAR]
**Talk type**: [TALK_TYPE] ([TALK_MINUTES] min)
**Total slides**: [N]
---
## Slide 1: Title [0:00 - 0:15]
*[Wait for chair introduction]*
"Thank you [chair name]. I'm [author] from [affiliation], and today I'll be talking about [short title]."
---
## Slide 2: Motivation [0:15 - 1:30]
"Let me start with the problem. [Describe the real-world motivation in accessible terms]. This matters because [impact statement].
The current state of the art approaches this with [brief existing approach]. But there's a fundamental limitation: [gap statement]."
→ *Transition*: "So what's our key insight?"
---
## Slide 3: Key Insight [1:30 - 2:30]
"Our key observation is that [core insight in one sentence].
This leads us to propose [method name], which [one-sentence description]."
→ *Transition*: "Let me walk you through how this works."
---
## Slide 4-N: [Continue for each slide...]
...
---
## Slide [N]: Thank You [TALK_MINUTES:00]
"To summarize: we've shown that [main result]. The key takeaway is [memorable final message].
The paper and code are available at the QR code on screen. I'm happy to take questions."
---
## Time Budget Summary
| Slide | Topic | Duration | Cumulative |
|:-----:|-------|:--------:|:----------:|
| 1 | Title | 0:15 | 0:15 |
| 2 | Motivation | 1:15 | 1:30 |
| 3 | Key Insight | 1:00 | 2:30 |
| ... | ... | ... | ... |
| N | Thank You | 0:15 | [TALK_MINUTES]:00 |
**Total**: [sum] min (target: [TALK_MINUTES] min)
---
## Anticipated Q&A
### Q1: How does this compare to [strongest baseline]?
**A**: "[Specific comparison with numbers]. Our advantage is particularly clear in [specific scenario], where we see [X%] improvement."
### Q2: What are the main limitations?
**A**: "[Honest answer]. We see this as [future work direction]."
### Q3: How computationally expensive is this?
**A**: "[Training/inference cost]. Compared to [baseline], our method requires [comparison]."
### Q4: Does this generalize to [related domain]?
**A**: "[Answer based on paper's discussion section]."
### Q5: What's the most surprising finding?
**A**: "[Interesting insight from the experiments]."
### Q6: How sensitive is the method to [hyperparameter/design choice]?
**A**: "[Reference ablation study if available]."
### Q7: What's the next step for this research?
**A**: "[Future work from conclusion]."
### Q8: [Domain-specific question]
**A**: "[Answer]."
Final Output Summary
📊 Slide generation complete:
- Talk type: [TALK_TYPE] ([TALK_MINUTES] min) for [VENUE]
- Files:
slides/
├── main.tex # Beamer LaTeX source
├── main.pdf # Compiled slides (primary output)
├── presentation.pptx # Editable PowerPoint
├── SLIDE_OUTLINE.md # Slide-by-slide outline
├── SLIDES_REVIEW.md # GPT-5.4 review feedback
├── speaker_notes.md # Per-slide speaker notes
├── TALK_SCRIPT.md # Full word-for-word talk script + Q&A
├── SLIDES_STATE.json # State persistence
├── generate_pptx.py # PPTX generation script
└── figures/ # Symlinked from paper/figures/
Next steps:
1. Practice with TALK_SCRIPT.md (read aloud, time yourself)
2. Edit presentation.pptx for visual tweaks (animations, custom graphics)
3. Review Anticipated Q&A section before the talk
4. Do a dry run with a colleague
State: Write SLIDES_STATE.json with phase: 8, status: "completed".
Recommended Follow-up: /slides-polish
After this skill produces the initial Beamer + PPTX, the typical drift is
typography proportion + per-slide layout, not content. Run
/slides-polish as a focused post-generation polish phase: it does
per-page Codex review against a reference visual (e.g., a prior academic
talk), bumps PPTX fonts to projector-readable sizes, fixes text-frame
overflow, and applies a fix-pattern catalog (italic style leaks, em-dash
spacing, image aspect ratio, Chinese-font hints, anonymity placeholders).
/slides-polish is read-only on content (no claim / number / citation
edits) and preserves speaker notes verbatim. Invocation:
Skip it for short decks (< 5 slides) or when a complete redesign is
needed (re-run /paper-slides instead).
Key Rules
Large file handling: If the Write tool fails due to file size, immediately retry using Bash (cat << 'EOF' > file) to write in chunks. Do NOT ask the user for permission — just do it silently.
One message per slide. If a slide has two ideas, split it into two slides.
Do NOT fabricate data. All numbers must come from paper/sections/*.tex.
Bullet points only — never full sentences on slides. Sentence fragments are fine.
Figure slides: figure ≥60% of slide area. The figure IS the content.
Progressive disclosure: Use \pause or \onslide for complex method slides.
De-AI polish: Remove watch words from all slide text and talk script.
Do NOT hallucinate citations. Reference only papers cited in the paper.
Opening hook matters: Never start with "In this paper, we..." — start with the problem or a provocative question.
Font size minimums: Title ≥28pt, body ≥20pt, footnotes ≥14pt.
Feishu notifications are optional. If ~/.claude/feishu.json exists, send notifications. If absent, skip.