Present-Paper Skill
SkillDocs & knowledgeAcademic presentation preparation — paper-driven (journal club, grand rounds, seminar) and lecture/teaching decks (course material, workshop slides, conference talks). Analyzes source material, finds supporting references, drafts audience-adapted speaker scripts, generates or augments PPTX with speaker notes, and prepares Q&A.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Present-Paper Skill skill
What this skill tells your AI
The instructions your AI receives, as published by aperivue/medsci-skills in skills/present-paper/SKILL.md and read by ahel’s review.
Purpose
Prepare a polished academic presentation from a research paper. The skill walks through a 5-phase pipeline: paper analysis, supporting research, script writing, slide note injection, and Q&A preparation.
Use it when:
- preparing a journal club or seminar presentation
- presenting a paper for a graduate course
- preparing grand rounds or conference talks based on a published paper
- building speaker notes for an existing slide deck
Communication Rules
- Communicate with the user in their preferred language.
- Use English for medical, statistical, and methodological terminology.
- Add pronunciation guides for drug names and technical abbreviations in the user's language.
- Be direct about paper limitations, but frame them constructively.
Phase 0: Init & Outline
Step 0a — Load design references (read before drafting outline)
Three of these are read now, in full — they change what you produce. The rest are read when the answer to Q0 tells you which one you need, because a talk has one venue and one style, and reading the others costs roughly seven thousand tokens to learn nothing you will use.
Read now (always):
A. references/ai_slide_tells.md — the marks a generated deck leaves. Read all of it, first.
The complaint about AI decks is not that they are ugly — templates solved ugly. It is that they
stop communicating, because they were built to make the maker comfortable rather than to serve the
audience. This file is why the deck does not need catching later; scripts/check_slide_tells.py
catches it after (Step 3.6). It overrules older guidance where they conflict — in particular the
eyebrow-on-every-slide and brand-footer rules this project used to mandate, which are the single
most-cited visual tell.
B. references/presentation_archetypes.md — the skeleton, chosen by where the speaker is
standing: conference oral, journal-club critique, case-anchored grand rounds, didactic lecture,
defence, keynote (Duarte's sparkline, the Jobs STAR moment, Takahashi/Lessig), lay talk, decision
brief (Minto's pyramid, action titles, Kawasaki's 10/20/30). A deck has two independent choices
and conflating them is why talks fail: the archetype is what the talk has to do; the visual
style is what it looks like. A conference oral in a keynote's skeleton dies (no data on the
slides); a keynote in a conference oral's skeleton dies harder. The skin is a preference; the
skeleton is not. Its mechanical half is scripts/check_deck_budget.py.
C. references/presentation_design_guidelines.md — the enforceable rules (assertion headlines,
24-pt floor, negative space, ≤3 colours, colourblind-safe palettes, redraw-don't-screenshot,
animation discipline) plus the G1–G10 self-check the Phase 3.5 critic scores against.
Read on demand — after Q0/Q2 tell you which one:
| File | Read it when | Cost if read blindly |
|---|---|---|
references/medical_presentation_templates.md | the venue is one of the five medical ones — then read that section only | ~3,700 tokens, of which you use a fifth |
references/slide_visual_styles/CATALOG.md → one style file | Q2 has chosen a style | ~2,300 tokens per style |
references/slide_design_principles.md | you are stuck on why a slide is not landing — Reynolds / Duarte / Knaflic / Tufte, the theory under the rules in C | ~2,600 tokens of theory you mostly already applied |
references/generated_illustrations.md | you are about to generate any image for a slide, or a text-only slide keeps failing the critic | ~1,300 tokens; the first rule (never generate a medical image) is not optional |
references/spoken_notes_and_bilingual.md | you are drafting speaker notes, or the deck is not monolingual | ~1,700 tokens; both halves are about delivery, not design |
These mirror the entry-point pattern used in
make-figures/references/design_principles.md (Step 1 "Specify"). Both skills share
the same Reynolds / Knaflic / Tufte foundations — slide-level (this skill) and
figure-level (make-figures) are companions, not duplicates.
Required Inputs
Before starting, collect these from the user:
| Input | Why |
|---|---|
| Paper | PDF path, DOI, or PMID |
| Presentation time | Determines depth and slide count |
| Target audience | Specialty mix, knowledge level — controls terminology depth |
| Context | Course name, conference, journal club format, prior session topics |
| Template / visual style | Institutional template (.pptx/.potx) to fill, or a visual style to generate in. Default: ask (Step 0b) |
| Extension section | Optional topic to include (e.g., AI directions, clinical implications). Default: none |
Step 0b — Template & visual style selection
After collecting the inputs above and before drafting the outline, settle how the
deck will look. Ask the user two questions (use AskUserQuestion; skip a question if the
user already answered it in their request):
Q0 — "Where are you standing, and for how long?" (venue + minutes)
This decides the archetype — the skeleton — before any question about looks. Map the answer with
the selector table in references/presentation_archetypes.md, and carry archetype + minutes
forward: Step 3.6 checks the built deck against them. A 40-word slide is an ordinary academic slide
and a catastrophic keynote slide; there is no universal answer to "how much text is too much", only
an answer for this room.
If the user gives only a topic and no venue, ask. Do not guess: a deck built for no particular room comes out generic in exactly the way every reviewer can see.
Q1 — "Do you have an institutional or branded template to use?"
- Yes → the user supplies a
.pptx/.potx. Switch to Mode C (Phase 3, "Fill an institutional template"): runscripts/inspect_pptx_template.py <file>to list its layouts/placeholders/theme, then fill by placeholder index, preserving the master and logo. Seereferences/slide_visual_styles/institutional_brand.md. Do not also ask Q2 — the template's theme is the style. - No / none → ask Q2.
Q2 — "Which visual style should I generate in?" Offer the CATALOG.md menu with a
one-line preview each (make the recommended option first and label it):
| Option | One-line preview |
|---|---|
| Nature / Lancet (recommended for medical academic talks) | White, navy + coral accent, hairline dividers, Inter/Pretendard — restrained editorial-academic |
| Clinical Blue | White/light-blue, navy-teal, calm and trustworthy, colorblind-safe — grand rounds / CME |
| Editorial Mono | High-contrast black-on-white, oversized type, one accent — single big-message keynote |
| Dark Modern | Deep-slate background, off-white text, electric accent — AI / method / tech talks |
| Other | Describe a palette/feel, or name a journal/brand to emulate |
Record the choice; pass the matching style spec to Phase 3. If the user has no
preference and the talk is a medical academic talk, default to Nature / Lancet
(~/.claude/rules/academic-lecture-style.md). Style choice does not change the outline,
script, or Q&A — only Phase 3 rendering.
Q3 — conference decks only: is slide 1 a submission requirement? Many societies require the
title slide to carry the title, authors, affiliations and country exactly as entered in the
abstract submission. Those fields are not yours to improve. A crowded title slide is a real
temptation to shorten an affiliation to its institution, and doing so breaks the requirement while
satisfying the density check — which is the one place in this skill where a gate and a rule point in
opposite directions. The requirement wins. Read the fields off the submission portal, copy them,
and record SLIDE_TOO_DENSE on slide 1 as consciously overruled with that reason.
Paper Analysis
Read the paper and produce a structured analysis:
## Paper Analysis
### Citation
[Full citation with DOI]
### Background
- What gap does this paper address?
- What was known vs. unknown before this study?
### Study Design
- Type: [RCT / cohort / case series / meta-analysis / etc.]
- Subjects: [n, inclusion/exclusion]
- Methods: [key methodological choices]
- Primary outcome: [what was measured]
### Key Results
1. [Finding 1 with effect size and CI/p-value]
2. [Finding 2]
3. [Finding 3]
### Patient/Case Summary Table
[If applicable — structured table of individual cases or subgroups]
### Limitations
1. [Limitation 1]
2. [Limitation 2]
### Significance
- Why does this matter?
- What changes because of this paper?
Slide Outline
Create a slide-by-slide outline with time allocation:
## Slide Outline ([N] slides, [M] minutes)
| # | Title | Time | Key Content |
|---|-------|------|-------------|
| 1 | Title slide | 0:30 | Paper citation, presenter |
| 2 | Context / Prior sessions | 1:00 | How this connects to prior knowledge |
| 3 | Background | 1:30 | The gap this paper fills |
| ... | ... | ... | ... |
| N | Take-home messages | 0:30 | 3-5 key points |
Gate: User approves outline before proceeding.
Phase 1: Supporting Research
Search Strategy
Find references that strengthen the presentation:
- Follow-up studies — Has the main finding been replicated or extended?
- Clinical trial data — Large-scale data that contextualizes the findings
- Review articles — Authoritative summaries that frame the topic
- Contradicting evidence — Important for balanced Q&A preparation
Efficiency rule: Limit supporting references to 5-8 total. Only search categories that the approved outline (Phase 0) actually requires. Skip categories not needed for the presentation type (e.g., skip clinical trials for a methods-focused paper).
Selection Criteria
Do NOT summarize every paper found. Extract only:
- Specific data points needed for slides (incidence rates, OR/HR, AUC values)
- Findings that directly support or challenge the main paper
- Context that helps the audience understand significance
Output
## Verified References
### Main Paper
1. [Citation] — PMID: XXXXX, DOI: XX.XXXX/XXXXX
### Supporting References
2. [Citation] — PMID: XXXXX
→ Used for: [specific data point or context]
3. [Citation] — PMID: XXXXX
→ Used for: [specific data point or context]
### Key Data for Slides
- [Statistic 1]: [value] — Source: [Ref #]
- [Statistic 2]: [value] — Source: [Ref #]
Every reference must have a verified DOI or PMID. Mark unverified references with [UNVERIFIED].
Phase 2: Script & Content
Speaker Script
Draft a complete speaker script with these requirements:
- Language: User's preferred language for narration; English for technical terms
- Audience adaptation: Adjust explanation depth based on Phase 0 audience profile
- For mixed audiences: add one-line plain-language explanations for specialty-specific terms
- Example: "FLAIR sequence — an MRI technique that suppresses fluid signal to highlight edema"
- Pronunciation guide: Include native-language pronunciation for drug names, abbreviations
- Example: "lecanemab (leh-KAN-eh-mab)" or local equivalent
- Timing markers: Note approximate time per slide
- Transition phrases: Connect each slide to the narrative arc
Those five govern what the notes contain. How the sentences are built — which is a separate and
more common failure, because notes are spoken and not read — is in
references/spoken_notes_and_bilingual.md, together with the language split for a deck that is not
monolingual. Read it before drafting if either applies.
Structure
## Speaker Script
### Slide 1: Title (0:30)
"[Opening — introduce yourself and the paper]"
### Slide 2: Context (1:00)
"[Connect to prior knowledge or clinical relevance]"
...
### Slide N: Take-home Messages (0:30)
"[Summarize 3-5 key points. Thank audience. Invite questions.]"
Extension Section (Optional)
Only include if user requested in Phase 0. Examples:
- AI/computational research directions stemming from the paper
- Clinical practice implications
- Policy or guideline implications
- Connections to the user's own research
Gate: User reviews script before proceeding.
Phase 3: Slides & Notes
Three Modes
Mode A = generate a new deck in a chosen visual style. Mode B = add notes to an existing deck. Mode C = fill the user's institutional/branded template (chosen at Step 0b). Pick the mode from the Step 0b answer.
Mode A: Generate new slide deck
Generate a fully-editable PPTX from structured inline data using python-pptx. Two
canonical template libraries:
${CLAUDE_SKILL_DIR}/references/generate_pptx_templates.py— generic T_lead / T_text / T_table / T_image_right / etc. templates with smoke-testedmain(). Use for journal club, grand rounds, conference talk, and short paper talks.${CLAUDE_SKILL_DIR}/templates/build_pptx_nature_lancet.py— Nature/Lancet visual style (white + navy + coral, Inter/Pretendard, 47-slide academic lecture proven). Use for academic lecture multi-paper survey (template #5). Functions:new_presentation,add_title_slide,add_toc_slide,add_section_divider,add_transition_slide,add_content_slide,add_glossary_slide,add_closing_slide, plusfix_app_xml()helper. Style spec:references/slide_visual_styles/nature_lancet.md.
For lecture decks pulling figures from PDFs (rather than from /make-figures
output), use ${CLAUDE_SKILL_DIR}/scripts/extract_pdf_figures.py — pdftoppm + PIL
crop with normalized (0–1) box coordinates. Supports both single-crop CLI and YAML
batch config.
After raw extraction, run ${CLAUDE_SKILL_DIR}/scripts/trim_caption.py to
auto-remove journal headers / figure captions / surrounding whitespace so
that only the figure body remains — the Adobe-Acrobat-crop equivalent in
automation. The script uses horizontal-projection segmentation plus
text-band detection (height + density + gap + line-pattern signature) and
preserves multi-panel figures intact:
python3 "${CLAUDE_SKILL_DIR}/scripts/trim_caption.py" \
--in-dir figures/extracted \
--out-dir figures/cropped
Handles four common journal layouts: top running-head bar, bottom multi-line
caption (sparse text), bottom caption fused with figure body (no clear gap,
detected via narrow dark/light alternation), and multi-row tables with
footnotes (footnote cut, table rows preserved). No tesseract / OCR
dependency — Pillow + numpy only. Verified on 12-figure academic deck
(80–95% height retention; captions, journal banners, and CellPress-style
headers all removed). When the deck slot expects only the figure body
(default for build_pptx_nature_lancet.py), point FIG_DIR at the cropped
output dir.
Word-boundary aware markdown parser (mandatory for HLA-rich decks)
When the build script parses inline **bold** / *italic* markers in slide
body or speaker notes, the italic rule must use word-boundary lookahead /
lookbehind so asterisk-bearing scientific tokens (HLA alleles like
DRB1*07:01, HLA-A*02:01, SNP IDs, footnote markers) are not eaten as
italic delimiters:
import re
pattern = re.compile(
r"(\*\*(?:(?!\*\*).)+?\*\*" # bold; inner single * allowed
r"|(?<![A-Za-z0-9])\*[^*\n]+?\*(?![A-Za-z0-9]))" # italic (word-boundary)
)
Two regex tricks together:
- Italic with boundary:
(?<![A-Za-z0-9])and(?![A-Za-z0-9])reject*adjacent to alphanumerics, soDRB1*07:01is left intact. - Bold tolerates inner single
*:(?:(?!\*\*).)+?allows**DRB1*04:02**(HLA allele inside bold) to match as a single bold span.
Without these, a naive \*[^*]+\* italic pattern silently corrupts every
HLA allele in the deck. Add the regex to add_styled() (or equivalent) in
every Nature/Lancet-style build script.
Pronunciation auto-augment for non-native presenters
For decks where the presenter is uncomfortable with English pronunciation of
acronyms, author names, drug names, or gene symbols, append a per-slide
[ Pronunciation ] section to the speaker notes (audience sees nothing —
only Presenter View). Use
${CLAUDE_SKILL_DIR}/scripts/inject_pronunciation_notes.py:
python3 "${CLAUDE_SKILL_DIR}/scripts/inject_pronunciation_notes.py" \
input.pptx output.pptx \
--dict pron_dict.yaml \
--header "[ 발음 ]" # or any header you like
The script:
- Loads a YAML/JSON
PRON_DICT(term → [reading, full_name]) supplied by the caller. The dict is domain-specific — assemble it for your audience (Korean readings, French readings, Spanish readings, etc.). - Uses word-boundary regex
(?<![A-Za-z0-9_]) … (?![A-Za-z0-9_])so short acronyms (e.g.AE,OR) only match when standalone, never inside other words. - Recognizes allele-style tokens via a separate regex
(
\b(?:HLA-)?[A-Z]{1,5}[0-9]?\*[0-9]{2}:[0-9]{2}\bby default) and synthesizes their reading from the base allele entry in the dict. - Skips slides that already contain the header (idempotent — safe to re-run).
Realistic yield on a 47-slide academic deck: ~38 slides receive a section, ~300 total term entries, 5–10 per annotated slide. Transition and divider slides have empty notes and are auto-skipped.
Speaker notes statistics density
When the slide body already shows exact OR / 95% CI / p-value, the notes should NOT repeat the same numbers — the presenter ends up reading statistics aloud and the audience cannot keep up. Notes should be a narrative (key anchors + one-line "see the slide body for the exact numbers" reminder), not a numeric listing.
Quick measurement to spot dense slides during QC:
import re
text = slide.notes_slide.notes_text_frame.text.split(pron_header)[0]
n_char = len(text)
n_stat = len(re.findall(r"\b(?:OR|p|CI)\s*[=<>]?\s*\d|\d+\.\d+|\d+%|×10", text))
needs_compression = n_char > 1000 and n_stat >= 5
Rule of thumb: 700–1,000 chars + 0–2 stat tokens is fine (30–60-second narrative). >1,000 chars + ≥5 stat tokens → compress to narrative tone and point at the slide body. Exact numbers belong in the slide body and footnotes (SSOT), not the notes.
Numbers in the notes are numbers you will say out loud
Everything the rest of this toolkit enforces about figures in the slide body applies to the notes, because the notes are what the speaker reads at the microphone. Two failures, both observed:
- A quoted benchmark typed from memory. "95% of 152 models were rated high risk" — the source said 87%, of 148 of 171; a second note said "98% of 62 oncology models" where the source said 84% and 62 was the number of papers, not models. The papers were cited correctly in the reference list. Only the digits were remembered. Every external number in the notes is checked against the source, exactly like a number in the body.
- An injected value hand-typed during a rewrite. When a build script draws numbers from an
artifact —
f"{N['primary']}"— compressing the prose is where they get flattened into literals. Twelve of them went that way in one 14-minute-to-9-minute pass. The slide body was gated and the notes were not, so the deck would have said one number while the speaker said another. When you edit generated text, the count of injection expressions must not fall. Before and after:
import re
len(re.findall(r"\{N\[", src)) # must not decrease across a rewrite
Pull the hand-typed numbers out for checking with the same regex, inverted — anything numeric that is not inside an injection expression is a literal somebody typed.
Sharing-ready notes-stripped variant
After the presentation, when the deck is shared with the audience (e.g. a
professor asking for the slides), the speaker notes typically contain
presenter-only material — second-language narrative, pronunciation hints,
self-referential reminders ("Prof. ○○ will likely ask about …"). Stripping
notes is mandatory before circulation. Use
${CLAUDE_SKILL_DIR}/scripts/strip_notes_for_sharing.py:
python3 "${CLAUDE_SKILL_DIR}/scripts/strip_notes_for_sharing.py" \
presenter_v9.pptx share/<topic>_<initials>.pptx
The script:
- Clears every slide's
notes_text_frame(idempotent, slide body and figures untouched). - Re-writes
docProps/app.xmlwith the correctSlides=andNotes=counts so PowerPoint Mac does not show its repair dialog (see also the app.xml canonical fix inpptx-mac-compatibility.md§5). - Verifies that zero notes characters remain.
Recommended 3-file sharing package (filename pattern <topic>_<initials>):
<topic>_<initials>.pptx— notes-stripped variant for slide reuse<topic>_<initials>.pdf— same deck, PDF for environment-agnostic preview (LibreOffice--convert-to pdfautomatically drops the cleared notes pages)<topic>_<initials>_references.zip— optional bundle of the reference PDFs; if it exceeds the email attachment limit, send a Google Drive link.
In the cover email, mention the PPTX is included specifically so the recipient can reuse individual slides if useful.
The companion documents leave with the deck — check them too
_qa_prep.md, _quick_review.md and any handout are drafted from the same working material as the
notes, and they travel further. Three things to check before any of them goes out:
- Retired numbers. A gate on the deck is not a gate on its siblings. In one talk the slides said
26.3% and the last-minute review sheet still said 54.1% — the deck was right and the document the
speaker would answer questions from was wrong, which is the worse way round. Sweep the sibling
.mdfiles for the superseded values whenever the deck's numbers move. Where an old figure is deliberately quoted, fence it (<!-- superseded-quotation -->) rather than exempting the file. - Operator material in an audience document. A brief written to prepare you for a meeting carries the register it was written in — "the point they will push back on", "the fallback position", a minute-by-minute plan. Handed to the person it describes, it reads as a strategy for managing them. When one document has to serve both purposes, it is two documents: an internal one with the contingencies, and a neutral one with the findings and what you are asking them to confirm. This is the same rule as stripping the speaker notes, applied to the files beside them.
- Live-only devices, and what points at them. A redistributed deck is read at a desk, not attended: a break slide, a timer, "as we just saw in the exercise" mean nothing there, and another speaker's break is their own decision. Remove them — and then grep the whole deck, bodies and notes, for the sentences that referred to them, because those are left dangling by the deletion. While you are there, re-verify anything the material asserts about an upstream project (install commands, counts, versions) against that project's own source rather than against the copy you wrote months ago: an exact number with a date stays accurate longer than a vague one, which drifts silently and cannot be checked.
Architecture
inline structured data (lists/dicts in build_*_slides())
↓ template functions (T_lead / T_text / T_table / ...)
editable PPTX with native text frames (selectable, restyleable in PowerPoint)
Three rules that keep slides stable:
- No markdown parsing. Every slide is a function call with explicit inline data.
- No
cur_topcumulative position tracking. Use the fixed coordinate zones below —cur_topaccumulates rounding errors and breaks layout after ~10 slides. - No Marp. Marp renders to images; the deck becomes uneditable and reviewers cannot copy text or restyle.
Slide-type templates
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 297
- Forks
- 71
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
present-paper- Source
- github.com/aperivue/medsci-skills