Thesis Defense PPTX Builder
zouchenzhen/thesis-defense-pptx-skill
Builds an editable thesis defense PowerPoint from a thesis PDF or LaTeX project while preserving a supplied university or lab template, then runs a visual quality check.
Create visually rich PowerPoint (.pptx) presentations from academic papers, research notes, or any content the user wants in slide format.
$ npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Noi1r/powerpoint-skill powerpoint-slides --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Noi1r/powerpoint-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/powerpoint-slides .claude/skills/powerpoint-slides && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "powerpoint-slides" agent skill from https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slides into .claude/skills/powerpoint-slides/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "powerpoint-slides", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slidesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Noi1r/powerpoint-skill powerpoint-slides --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Noi1r/powerpoint-skill.git skills-src && mkdir -p .agents/skills && cp -r skills-src/powerpoint-slides .agents/skills/powerpoint-slides && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "powerpoint-slides" agent skill from https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slides into .agents/skills/powerpoint-slides/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "powerpoint-slides", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Noi1r/powerpoint-skill powerpoint-slides --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Noi1r/powerpoint-skill.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/powerpoint-slides .cursor/skills/powerpoint-slides && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "powerpoint-slides" agent skill from https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slides into .cursor/skills/powerpoint-slides/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "powerpoint-slides", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Noi1r/powerpoint-skill.git --path powerpoint-slides--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Noi1r/powerpoint-skill powerpoint-slides --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Noi1r/powerpoint-skill.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/powerpoint-slides .gemini/skills/powerpoint-slides && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "powerpoint-slides" agent skill from https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slides into .gemini/skills/powerpoint-slides/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "powerpoint-slides", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Noi1r/powerpoint-skill powerpoint-slidesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Noi1r/powerpoint-skill.git skills-src && mkdir -p .github/skills && cp -r skills-src/powerpoint-slides .github/skills/powerpoint-slides && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "powerpoint-slides" agent skill from https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slides into .github/skills/powerpoint-slides/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "powerpoint-slides", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Noi1r/powerpoint-skill powerpoint-slides --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Noi1r/powerpoint-skill.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/powerpoint-slides .opencode/skills/powerpoint-slides && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "powerpoint-slides" agent skill from https://github.com/Noi1r/powerpoint-skill/tree/main/powerpoint-slides into .opencode/skills/powerpoint-slides/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "powerpoint-slides", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
powerpoint-slidesCreate visually rich PowerPoint (.pptx) presentations from academic papers, research notes, or any content the user wants in slide format.
Powerpoint Slides is an agent skill from Noi1r/powerpoint-skill. Create visually rich PowerPoint (.pptx) presentations from academic papers, research notes, or any content the user wants in slide format. Uses PptxGenJS + LaTeX formula rendering. Always use this skill when the user wants PPT/PPTX output instead of Beamer/LaTeX slides. Trigger on: powerpoint, pptx, PPT, make a ppt, 做PPT, 做幻灯片, make slides (non-LaTeX), prepare a presentation (when context implies PPT), 做个报告, presentation slides, help me prepare a talk (when not Beamer), convert paper to slides (when PPT implied)…
Its SKILL.md is about 12k tokens, which your agent loads only when the skill is triggered. The skill folder holds 12 other files, including scripts and reference files (for example `diagram-rendering.md`, `formula-rendering.md` and `pptxgenjs-reference.md`).
It sits in Documents & Office, covering PowerPoint presentations, Slides and decks and LaTeX. It works with Microsoft PowerPoint, LaTeX and python-pptx. The repository describes itself as: AI coding assistant skill for creating visually rich PowerPoint (.pptx) presentations with native OMML math, LaTeX formulas, and Graphviz/Mermaid/TikZ diagrams. The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a39cd8c. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditBashGrepGlobAgentAskUserQuestionTaskCreateTaskUpdate…and 2 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
Ships 6 files in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
pythonnpmpdftoppmpipmarkitdownbrewnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm and pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Powerpoint Slides loads about 12k tokens when it runs, and up to ~18k if it reads all its reference files. Until then it costs about 201 tokens; SKILL.md has 5,631 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Write, Edit, Bash, Grep, Glob, Agent, AskUserQuestion, TaskCreate, TaskUpdate, TaskList, TaskGAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from Noi1r/powerpoint-skill at commit a39cd8c, republished under its MIT licence (© Noi1r). 5,631 words, ~12,491 tokens.
.claude/skills/powerpoint-slides/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.Academic PowerPoint presentation skill. Full lifecycle: create → compile → review → polish → verify.
Execution model: Claude writes a PptxGenJS (Node.js) script → executes → .pptx.
Math formulas: OMML (native math, default) or LaTeX → PNG/SVG pipeline (paragraph-mode fallback).
| Task | Command | Description |
|---|---|---|
| Create from paper | create [topic] | Full Phase 0-5 pipeline |
| Execute JS script | compile [file.js] | Run script, produce .pptx |
| Proofread | review [file.pptx] | Grammar, typos, consistency |
| Visual audit | audit [file.pptx] | Per-slide layout inspection |
| Teaching quality | pedagogy [file.pptx] | 13 pedagogical patterns |
| Full review | excellence [file.pptx] | 5 parallel agent review |
| Visual check | visual-check [file.pptx] | PDF→image systematic check |
| Validate metrics | validate [file.pptx] [duration] | Slide count, file size |
| Extract figures | extract-figures [file.pdf] [pages] | Extract paper figures for slides |
Parse $ARGUMENTS to determine which action to run. If no action specified, ask.
F constant object defines default baselines: cover 48pt, section 36pt, title bar 22pt, body 15pt, small 12pt, caption 11pt, cardTitle 18pt, tblHead 13pt, tblCell 12pt. Never go below 10pt. When a card or region has sparse content (text fills <50% of available area), scale up by 2-4pt in the QA fix pass.soffice → PDF → image inspection. No task is complete without visual verification.LAYOUT_16x9 (10" x 5.625"). Maintain 0.5" breathing room on all four sides. Content area: 9" x 4.625".const makeShadow = () => ({...})."FF0000" not "#FF0000". The # prefix corrupts the output file silently.CH vertically. If all elements end in the upper half, something is wrong: increase card heights, add spacing, scale up fonts, or add a summary/insight card at the bottom. Every content slide should feel "filled" — no large empty patches below the last element.y + h ≤ SH - M (5.125"). During script generation, mentally verify each element's bottom edge before writing it. Common traps: stacking cards below a table without accounting for table rendered height; addCardFormula with a formula image taller than the card body area; two-row card layouts where the second row overshoots. When using addCardFormula, the formula height parameter fH must be ≤ cardH - 0.75 (title area). If content cannot fit, reduce card height, shrink formula targetH, or split across two slides. The visual QA agent must specifically flag any element whose bottom edge is clipped by the slide boundary.CH equally among N references, each entry vertically centered in its row. Use F.body.size font (or F.small.size if many entries). No divider lines, no decorative elements — just evenly distributed text rows filling the page. If references exceed 8 per page, continue on a second reference slide. The reference slide must look evenly filled — no large blank patches at top or bottom.inject_omml.py to replace {{MATH:id}} placeholders with native OMML math. Verify zero residual {{MATH: placeholders in the output. OMML formulas display as blank or distorted in LibreOffice — this is expected and not a bug. Only check image formula clarity in visual QA. CRITICAL OMML sizing rule: OMML formulas render at the text box's font size and do NOT respect the text box height constraint — tall constructs like \sqrt{}, \frac{}{}, \sum, \prod will visually overflow the text box. To prevent overlap: (a) never place an OMML formula directly above or below a card/table with tight spacing — leave ≥0.15" extra vertical gap per level of nesting (fractions, roots, large operators); (b) for complex formulas with roots, fractions, or stacked operators, prefer image rendering ("render": "image" in formulas.json) which respects exact pixel dimensions; (c) when using addMathText with F.body.size (15pt), expect the rendered height to be ~0.4" for simple formulas but up to 0.7" for formulas with \sqrt{} or \frac{}{}; (d) when an OMML formula must appear between two elements, compute spacing as if the formula is 1.5–2× the targetH parameter.cardFill equivalent, borders = ac.pos, text = tx.pri. Graphviz/Mermaid default colors (blue/black) must never appear in final output. Pass --theme to render_diagrams.py.shrinkText: true on ALL text boxes (maps to <a:normAutofit/>). NEVER use autoFit: true — it maps to <a:spAutoFit/> which expands the shape. (b) Card text uses const px = x + 0.25, pw = w - 0.4 — giving 0.19" clear of accent bar and 0.15" from right edge. Title: (px, y+0.1, pw, 0.4), body: (px, y+0.48, pw, h-0.62) with margin: [2, 0, 8, 0]. (c) Vertical gap discipline: every element placed below another must start ≥0.1" after the previous element's bottom. Use gap() helper to verify at script-generation time. Standalone addText calls between cards/formulas are the #1 source of overlap bugs — always compute y from the preceding element's known bottom, never approximate. Content limit: card body should have ≤4 short lines per inch of body height. If more text is needed, increase card height or split content.Source: Author et al., Year) via addFigure() caption. Width <800px requires warning to user about projection blur. Never extract tables — rebuild with PptxGenJS addTable().O(n), ε, ∑_{i}, etc.) must use OMML placeholders ({{MATH:id}}), never Unicode approximations or plain text. Add each cell formula to formulas.json with "render": "omml". OMML inherits the cell's font size (F.tblCell.size = 12pt) automatically. For complex constructs (fractions, large operators, stacked expressions) that would overflow cell height, use image rendering ("render": "image") with targetH ≤ rowH - 0.08. Pass cell objects to addTable for OMML cells: {text: "{{MATH:f42}}", options: {}}.addTableCont(). Split at logical row group boundaries (e.g., between algorithm families, metric categories, dataset groups) — never mid-group. The last page should have ≥3 data rows; if fewer, merge with the previous page. Each page gets its own caption/takeaway if the subset tells a different story.addFigure(). Ratio ≤ 1.6 (normal/tall) → figure-left + text-right via addFigureWithText(). Never stretch or crop figures to fit — always preserve original aspect ratio. Compute figRatio from manifest: width_px / height_px (PNG) or width_pt / height_pt (SVG). Cap figure width at 60% of CW in side-by-side layout to leave room for explanation bullets.check_overlaps.py alignment check (run in Phase 5) flags misalignment. Common violations: card columns with slightly different x-offsets, formula images that aren't centered on the same axis, bullet lists at inconsistent left margins. When using cols2() or manual column positioning, always derive x from the same constant — never approximate.addNotes(slide, text). Notes should be telegraphic talking points (3-5 per slide), not full scripts. Include: key message, transition to next slide, potential audience questions. Notes are embedded in the .pptx Notes pane — visible in Presenter View. This is opt-in: only generate when user explicitly requests or when asked during Phase 1.5 themes: Academic Light (default), Midnight, Ocean, Forest, Sandwich.
Read references/themes.md for full theme JSON blocks, slide master definitions, typography table, semantic colors, script template, and scoring rubric. These are needed in Phase 4 (script generation) and Phase 5 (QA scoring).
Key points (always in context):
TITLE_SLIDE, SECTION_SLIDE, CONTENT_SLIDE, THANK_YOU0173B2, negative=DE8F05, emphasis=029E73, neutral=8C8C8C| Layout | Use Case |
|---|---|
title | Cover slide |
section-divider | Chapter transition |
text-left-image-right | Concept + illustration (55/45 split) |
two-column | Comparison / parallel content |
formula-centered | Formula-dominant slide |
formula-with-annotation | Formula + side annotations |
stat-callout | Big number / key conclusion |
icon-grid | Multiple points with colored shapes |
timeline | Process / history flow |
table | Data comparison |
table-with-insight | Table + key finding card below |
table-continuation | Long table split page with " (cont'd)" |
chart | Chart/graph display |
text-left-diagram-right | Text + diagram side-by-side (55/45 split) |
full-diagram | Full-width diagram |
chart-centered | Chart + caption |
figure-with-text | Extracted figure + explanation bullets (aspect-ratio-aware) |
full-image | Full-bleed image + overlay |
references | Bibliography |
thank-you | Closing slide |
backup | Backup/appendix slides |
create [topic] — Full Pipeline (Phase 0-5)Collaborative, iterative presentation creation. Strict phase gates — never skip ahead.
Read first, ask later. Must understand the content before asking meaningful questions.
Do NOT present results or ask questions yet — proceed directly to Phase 1.
Conduct a content-driven interview via AskUserQuestion. Questions are informed by Phase 0 analysis.
Required questions (always ask):
Slide count heuristic (~1 slide per 1.5-2 minutes):
| Duration | Total slides | Intro/Motivation | Methods/Background | Core content | Summary |
|---|---|---|---|---|---|
| 5min (lightning) | 5-7 | 1-2 | 0-1 | 2-3 | 1 |
| 10min (short) | 8-12 | 2 | 1-2 | 4-5 | 1 |
| 15min (conference) | 10-15 | 2-3 | 2-3 | 5-7 | 1-2 |
| 20min (seminar) | 13-18 | 3 | 2-3 | 6-9 | 2 |
| 45min (keynote) | 22-30 | 4-5 | 5-7 | 10-14 | 2-3 |
| 90min (lecture) | 45-60 | 5-6 | 8-12 | 25-35 | 3-4 |
Talk-type tips — different formats demand different strategies. Misjudging the format is the #1 cause of bad presentations:
| Talk type | Key emphasis | Common mistake |
|---|---|---|
| Lightning (5min) | One core message, no background | Cramming a full talk into 5 minutes |
| Conference (10-20min) | 1-2 key results, fast methods overview | Too much technical detail, no big picture |
| Seminar (45min) | Deep dive OK, but need visual rhythm | Wall-to-wall formulas without examples |
| Defense/Thesis | Demonstrate mastery, systematic coverage | Skipping motivation, rushing results |
| Journal club | Critical analysis, facilitate discussion | Summarizing without evaluating |
| Grant pitch | Significance → feasibility → impact | Too technical, not enough "why it matters" |
Pacing principle: spend 40-50% of time on core content (results/techniques). Max 3-4 consecutive theory-heavy slides before a worked example or visual break — audiences disengage after ~5 minutes of uninterrupted formalism.
Detailed outline per section:
Phase 2 self-check before presenting:
Present the plan. Ask: structure OK? User must approve before proceeding.
formulas.json entry with "render": "omml".formulas.json with render field ("omml" | "image" | "auto"; default "auto" → paragraph→image, else→omml):[
{"id": "f01-entropy", "latex": "H(X) = -\\sum_{x} p(x) \\log p(x)", "mode": "display"},
{"id": "p01-body", "latex": "\\begin{minipage}{8cm}...", "mode": "paragraph", "fg_color": "1A1A2E"}
]python ~/.claude/skills/powerpoint-slides/scripts/render_latex.py formulas.json formulas/formulas/manifest.json for errors. Fix LaTeX or fall back to plain text.Sandwich theme: OMML formulas inherit text color automatically — no dual rendering needed. Only image-rendered formulas (paragraph mode) need two variants:
[
{"id": "p01-light", "latex": "...", "fg_color": "2D3436", "mode": "paragraph"},
{"id": "p01-dark", "latex": "...", "fg_color": "FFFFFF", "mode": "paragraph"}
]Math-heavy paragraphs (MANDATORY — Hard Rule 18): scan every card body and text box planned in Phase 2. If ANY of these appear, the text MUST be rendered as a LaTeX image (not Unicode approximations):
For isolated formulas (display/inline): use OMML (default render:"auto" handles this). For card bodies with mixed text+math: render the entire paragraph as a single LaTeX image using \text{} for non-math words — add to formulas.json with "mode": "paragraph" (auto-routes to image). In Phase 4, embed via addFormula() / addCardFormula() — helpers auto-route based on manifest.
Error recovery: if render_latex.py reports errors in manifest ("error": "..."), fix the LaTeX source, re-run. Fallback: render as plain text in PptxGenJS.
Phase 3-4 iteration: if Phase 4 discovers additional formulas needed, append to formulas.json and re-run incrementally.
diagrams.json (see diagram-rendering.md for schema).type: "extract" entries without crop):
For each such entry, try MCP extraction before running the batch renderer:mcp__pdf-mcp__pdf_extract_images(path=SOURCE_PDF, pages=PAGE, output_dir="diagrams")diagrams/ as PNG files (original resolution, zero token cost).width * height).mv diagrams/page3_img0.png diagrams/<id>.pngrender_diagrams.py fallback.crop always skip MCP (page-region extraction needs pdftoppm)..png already exists on disk.python ~/.claude/skills/powerpoint-slides/scripts/render_diagrams.py diagrams.json diagrams/ --theme <theme_name>diagrams/manifest.json for errors. Fix DOT/Mermaid syntax or degrade to PptxGenJS shapes.DOT writing guide: max ~15 nodes, rankdir=LR for horizontal flows / rankdir=TB for vertical hierarchies, subgraph cluster_* for grouping.
Mermaid guide: actor/participant ≤6, supported types: sequenceDiagram, gantt, pie, stateDiagram-v2, erDiagram.
Read diagram-rendering.md for full 5-layer architecture docs, diagrams.json schema, theme color mapping, and troubleshooting.
Write a complete PptxGenJS script. Install dependencies first:
npm ls pptxgenjs 2>/dev/null || npm install pptxgenjsRead references/themes.md → "Script Template" section for the full starter template with theme constants (T), typography constants (F), layout constants (SW/SH/M/CW/CY/CH), slide masters, addFormula() helper, diagram helpers (addDiagram, addDiagramAt, addFigure), chart helper (addChart), and semantic helpers (sTitle, sectionSlide, addBullets, addCard, addTable, addNumCard, addFlow, cols2). Also read pptxgenjs-reference.md → "Layout Code Patterns" for 9 ready-to-use code blocks (including diagram and chart layouts), formula-rendering.md for the LaTeX pipeline, and diagram-rendering.md for the diagram pipeline.
Use F object for all font sizes, cols2() for two-column layouts, and helper functions for common patterns. Never hardcode font sizes — always reference F.body.size, F.title.size, etc.
User-provided images (logos, photos, screenshots): embed directly via slide.addImage({ path: "image.png", ... }). Calculate aspect ratio from original dimensions. Center with x: (SW - w) / 2. No special pipeline needed — just verify the file exists.
Key rules for script generation:
# prefix on hex colorsbreakLine: true between text array itemsbullet: true for list items, never unicode "•"margin: 0 on text boxes that need precise alignment with shapesicon-grid layout: use simple colored rectangles/circles as visual markers (shapes, not icon images)Math-heavy slides should follow one of these structural templates — they prevent the common trap of dumping a formula with no context:
Definition slide:
[Framing sentence: why this definition matters]
[Formal definition — display formula or card]
[Key properties / immediate consequences — 2-3 bullet items]Construction/Algorithm slide:
[One-line goal statement]
[Core equation / algorithm steps]
[Complexity or performance: prover cost, verifier cost, soundness]Comparison slide:
[Side-by-side table or two-column: prior work vs this work]
[1-2 lines highlighting the key difference]Theorem → Proof slide (two slides, never one):
Slide A: [Informal statement] → [Formal theorem in card] → [Why it matters]
Slide B: [Proof sketch — key steps only, ≤5 lines. Full proof in backup.]Insight/Remark slide:
[Observation the paper doesn't emphasize, or connection to related work]
[Why this matters / what it implies]Every math slide must have a clear takeaway — the one thing the audience should remember from that slide.
Lower bounds are in R4/R20. Upper bounds prevent cognitive overload — a slide with too much is worse than one with too little, because the audience retains nothing:
Density self-check after each batch:
Layout & alignment:
Cell content:
formulas.json with "render": "omml". Pass {text: "{{MATH:id}}", options: {}} to addTableinject_omml.py handles mixed runscolspan/rowspan in cell options for grouped headers (e.g., "Complexity" spanning "Time" and "Space" columns). Keep merge depth ≤2 levels — deeper nesting harms readabilityHighlighting & emphasis:
ac.pos color — draw the eye to the resultaddTable helper) for readability in tables with >5 rowsLong table pagination (R31):
addTableCont()Table + insight combo:
F.small.size caption line belowac.pos background colorBatching: if >20 slides, write script in batches of 8-10 slides. Self-check density and layout diversity per batch. Final script is one file executed once.
Opening strategies (pick one):
Closing strategies:
Re-read the completed JS script and verify before running node. Catching issues here avoids wasting a QA round:
Structure:
Content density:
Layout & positioning:
y + h ≤ SH - M (R21)shrinkText: true on all multi-line text boxes (R27)F constants used for all font sizes — no hardcoded numbersNotation:
┌─→ 5a. Execute JS script → .pptx
│ 5b. soffice → PDF → pdftoppm → slide images
│ 5c. Subagent visual inspection (per-slide)
│ 5d. markitdown text extraction → content verification
│ 5e. Score (apply rubric)
│ 5f. Fix (edit JS and/or re-render formulas → re-execute)
└── score < 90 AND round < 3: loop back to 5a
score ≥ 90 OR round = 3: report to user5a. Execute + OMML injection:
node generate_slides.js
# If manifest has any render:"omml" entries, inject OMML math:
python ~/.claude/skills/powerpoint-slides/scripts/inject_omml.py output.pptx formulas.json output.pptx5b. Convert to images:
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir . output.pptx
pdftoppm -png -r 200 output.pdf /tmp/slideQuick thumbnail grid (optional — for rapid overview before detailed inspection):
python ~/.claude/skills/powerpoint-slides/scripts/thumbnail.py output.pptx thumbnails --cols 45c. Visual inspection (via Agent subagents):
Slide images at 200 DPI are ~1-2MB each. Reading images accumulates in context — reading more than ~7 images in the main conversation or a single agent will exceed the 20MB limit. NEVER read slide images directly in the main conversation.
Strategy: dispatch parallel Agent subagents, each assigned 3-5 slides. Each agent reads its slides one at a time, inspects them, and returns a text-only report. The main conversation only receives text, keeping context clean.
Total slides: N
Agents: ceil(N/5) agents, each reading up to 5 consecutive slide images
All agents run in parallelEach agent prompt:
"Read slide images [start]-[end] from /tmp/slide-{NN}.png, ONE image per Read call. For each slide check: overflow, overlap, font legibility, formula clarity, contrast, layout clutter, content density, bottom-edge clipping.
CRITICAL — content density measurement: judge blank space by the RENDERED PIXELS in the slide image, NOT by assumed text box boundaries. A text box can be 3" tall but render only 2 lines of text occupying 0.5" — that is 2.5" of visual blank space. Look at the actual slide image: where does visible content (text, shapes, images, formulas) END vertically? The gap from there to the slide bottom is the true blank space. Flag if visible content occupies <75% of the area below the title bar (R19).
CRITICAL — bottom-edge overflow (R21): check if any card, table, formula, or text is clipped at the slide bottom edge. Signs: text cut mid-line, card shadow missing at bottom, table rows disappearing. This is the #1 most common layout bug. Also check if a card title overlaps with its body content (title text running into body text below it — usually caused by long wrapped titles at large font sizes).
Diagram check: labels readable, edges distinguishable, no node overlap, colors match slide theme (no Graphviz default blue/black), diagram fits within content area without cropping. Extracted figures have source caption.
OMML note: OMML formulas display as blank in LibreOffice/PDF preview. This is a known limitation, not a bug. Only check image formula clarity.
Return a TEXT report only — list issues by slide number + description + severity. If no issues found for a slide, report 'OK'."
Merge all agent reports into a single issues list.
5a-post. XML validation (after OMML injection): verify no residual {{MATH: placeholders:
python -c "
import zipfile, sys
with zipfile.ZipFile('output.pptx') as z:
for n in z.namelist():
if n.startswith('ppt/slides/') and n.endswith('.xml'):
if b'{{MATH:' in z.read(n):
print(f'RESIDUAL PLACEHOLDER in {n}'); sys.exit(1)
print('OK: no residual placeholders')
"5a-post2. Overlap & boundary check (after OMML injection):
python ~/.claude/skills/powerpoint-slides/scripts/check_overlaps.py output.pptxIf exit code is non-zero (critical/major issues found), fix the JS script and re-run. The checker is card-aware: it groups card internals (container rect + accent bar + title + body) to avoid false positives. It detects: element overlaps, bottom-edge overflow, and tight gaps.
5d. Content verification:
pip install -q "markitdown[pptx]" 2>/dev/null
markitdown output.pptx > content.mdRead content.md to verify text content, notation consistency, spelling.
5e. Quality Scoring: Apply rubric from references/themes.md → "Quality Scoring Rubric". Thresholds: ≥90 deliver, 80-89 warnings, <80 must fix.
5f. Fix: edit JS script to fix issues. Re-render formulas if color/DPI problems. Re-execute and re-score. Max 3 rounds.
[ ] JS script executes without errors, .pptx generated
[ ] OMML injection successful, zero residual {{MATH:}} placeholders
[ ] QA score ≥ 90
[ ] Every definition has motivation + worked example within 2 slides
[ ] No slide exceeds density upper bounds (7 bullets, 2 formulas, 5 symbols, 2 cards)
[ ] No sparse slides (all slides have substantive content)
[ ] Diagrams use theme colors (no default blue/black)
[ ] Tables fit within content area, key cells highlighted, cell math uses OMML (R30)
[ ] Long tables split with header repeat and "(cont'd)" marker (R31)
[ ] Notation consistent throughout — same symbol = same meaning
[ ] References slide present (second-to-last, before Thank You)
[ ] Slide images visually inspected (at least spot-check 3-5 slides via QA agents)compile [file.js]Execute an existing PptxGenJS script to generate .pptx.
npm ls pptxgenjs 2>/dev/null || npm install pptxgenjs
node FILE.jsPost-compile checks:
review [file.pptx]Read-only proofreading report. No file edits.
Extract text:
pip install -q "markitdown[pptx]" 2>/dev/null
markitdown FILE.pptx > content.md4 check categories:
| Category | Checks |
|---|---|
| Grammar | Subject-verb agreement, articles, prepositions, tense consistency |
| Typos | Spelling errors, search-replace artifacts, duplicate words, unreplaced placeholders ([name], [TODO]) |
| Consistency | Citation format, notation, terminology, color usage across slides |
| Academic quality | Informal contractions, unsupported claims, ambiguous abbreviations |
Report format per issue:
### Issue N: [Brief description]
- **Location:** [slide number or title]
- **Current:** "[exact text]"
- **Proposed:** "[fix]"
- **Category / Severity:** [Category] / [High|Medium|Low]audit [file.pptx]Visual layout audit via image conversion. Read-only report.
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx
pdftoppm -png -r 200 /tmp/FILE.pdf /tmp/audit-slidePer-slide visual checklist:
Via Agent subagents: dispatch parallel agents, each assigned 3-5 slides. Each agent reads its slides one at a time via Read tool and returns a text-only report. Never read slide images in the main conversation — images accumulate in context and exceed the 20MB limit after ~7 slides.
Report per issue with slide number, description, severity, and fix recommendation.
pedagogy [file.pptx]Pedagogical review. Read-only report.
13 teaching patterns to validate:
| # | Pattern | Red Flag |
|---|---|---|
| 1 | Motivation before formalism | Definition without context |
| 2 | Incremental notation introduction | 5+ new symbols on one slide |
| 3 | Concrete examples after definitions | 2 consecutive definitions, no example |
| 4 | Progressive complexity | Advanced concept before prerequisite |
| 5 | Fragment reveal (problem → solution) | Dense theorem revealed all at once |
| 6 | Signpost slides at pivots | Abrupt topic jump, no transition |
| 7 | Two-slide strategy for dense theorems | Complex theorem crammed in 1 slide |
| 8 | Semantic color usage | Binary contrasts in same color |
| 9 | Card/box hierarchy | Wrong accent type for content |
| 10 | Card fatigue avoidance | 3+ accent cards on one slide |
| 11 | Socratic embedding | Zero questions in entire deck |
| 12 | Visual-first for complex concepts | Notation before visualization |
| 13 | Side-by-side comparison | Sequential slides for related definitions |
Deck-level checks:
excellence [file.pptx]Comprehensive multi-dimensional review. Dispatch 5 parallel Agent calls.
Visual audit agent — dispatch parallel Agent subagents, each assigned 3-5 slides. Each agent reads its slide images ONE at a time via Read tool, checks for overlap, font consistency, card fatigue, spacing issues, layout diversity, content density. Returns text-only report per slide with severity. Never read slide images in the main conversation.
Pedagogy review agent — "Extract text from the .pptx. Validate 13 pedagogical patterns and deck-level checks (narrative arc, pacing, visual rhythm, notation consistency). Report pattern-by-pattern."
Proofreading agent — "Extract text from the .pptx. Check grammar, spelling, citation consistency, notation consistency, academic quality. Report per issue with location and fix."
Formula quality agent — dispatch Agent subagents to check formula slide images (3-5 slides per agent, one image per Read call). Check: DPI adequate (not blurry), color matches slide theme, alignment correct, sizing consistent. Returns text-only report.
Domain review agent (optional — enabled with --domain flag or when paper is math/theory-heavy) — "Verify substantive correctness: assumptions stated, derivations valid, citation fidelity, claims supported. Report per issue with severity."
After all agents return, synthesize a combined report:
# Excellence Review: [Filename]
## Overall Quality: [EXCELLENT / GOOD / NEEDS WORK / POOR]
| Dimension | Critical | Major | Minor |
|-----------|----------|-------|-------|
| Visual/Layout | | | |
| Pedagogical | | | |
| Proofreading | | | |
| Formula Quality | | | |
| Domain (if run) | | | |
### Critical Issues (Immediate Action Required)
### Major Issues (Next Revision)
### Recommended Next StepsQuality score mapping: Excellent (0-2 critical, 0-5 major), Good (3-5 critical, 6-15 major), Needs Work (6-10 critical, 16-30 major), Poor (11+ critical, 31+ major).
visual-check [file.pptx]PDF → image systematic visual review.
Workflow:
Convert:
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx
pdftoppm -png -r 200 /tmp/FILE.pdf /tmp/vc-slideDispatch parallel Agent subagents for visual inspection, each assigned 3-5 slides. Each agent reads its slides one at a time via Read tool, runs the per-slide checklist, and returns a text-only report. Never read slide images in the main conversation — images accumulate in context and exceed 20MB after ~7 slides. Systematic per-slide checklist:
Report per issue:
### Slide N: [slide title]
- **Issue:** [description]
- **Severity:** Critical / Major / Minor
- **Fix:** [specific recommendation]extract-figures [file.pdf] [pages]Extract figures from a paper PDF for use in slides. MCP extraction first, pdftoppm fallback.
pdf_get_toc / pdf_read_pages to locate. If unsure, ask user.mcp__pdf-mcp__pdf_extract_images(path=PDF_PATH, pages=PAGES, output_dir="diagrams")diagrams/ as PNG files (original resolution, zero token cost).{page, index, width, height, format, file_path} — use file_path directly.mv diagrams/page3_img0.png diagrams/<id>.pngdiagrams.json with type: "extract" entries (include crop coordinates if needed).python ~/.claude/skills/powerpoint-slides/scripts/render_diagrams.py diagrams.json diagrams/diagrams/manifest.json with extracted image metadata.Rules:
Source: Author et al., Year) unless it's the user's own paperaddTable() for crisp renderingcropvalidate [file.pptx] [duration]Automated quantitative validation. Checks measurable properties.
Checks:
Slide count vs duration (if duration provided):
python ~/.claude/skills/powerpoint-slides/scripts/soffice.py --headless --convert-to pdf --outdir /tmp FILE.pptx
pdfinfo /tmp/FILE.pdf | grep "Pages:"Compare against timing table. Flag if outside range.
File size:
Content extraction:
markitdown FILE.pptx > content.md[TODO], [XXX])Formula images (if formulas/ directory exists):
"error" fieldReport format:
# Validation Report: [Filename]
| Check | Result | Status |
|-------|--------|--------|
| Slide count | N slides / Xmin | OK / WARNING |
| File size | X.X MB | OK / WARNING |
| Empty slides | N found | OK / WARNING |
| Placeholder text | N found | OK / CRITICAL |
| Formula images | N/M valid | OK / WARNING |
Overall: PASS / PASS WITH WARNINGS / FAILEvery task ends with verification. Non-negotiable.
[ ] JS script executes without errors (node exit code 0)
[ ] .pptx file generated and non-empty (>10KB)
[ ] soffice converts to PDF successfully
[ ] Slide images visually inspected (at least spot-check 3-5 slides)
[ ] Text content verified via markitdown (no garbled text, placeholders)
[ ] Score ≥ 90 (for create action) or issues documented (for review actions)| Problem | Fix |
|---|---|
Cannot find module 'pptxgenjs' | npm install pptxgenjs in working directory |
| Formula images missing / manifest errors | Check LaTeX syntax in formulas.json (double-escape \\), re-run render_latex.py. Fallback: plain text |
| soffice hangs or fails | pkill -f soffice, retry with --headless flag |
| Colors wrong in .pptx | Remove # prefix from hex. Use 6-char hex only. Transparency via transparency property |
| Shapes misaligned after multiple adds | Use factory functions — PptxGenJS mutates option objects in-place |
dot: command not found | brew install graphviz |
| Diagram has default blue/black colors | Pass --theme flag to render_diagrams.py matching slide theme |
| Extracted figure blurry | Source PDF may be low-res; try higher DPI or find vector source |
pdfinfo: command not found | brew install poppler (provides pdfinfo, pdftoppm) |
Node.js: npm install pptxgenjs
Python: pip install Pillow lxml "markitdown[pptx]"
System: node, pandoc (OMML conversion), xelatex, pdfcrop, pdftoppm (Poppler), soffice (LibreOffice), pdfinfo (Poppler), dot (Graphviz — brew install graphviz), mmdc (Mermaid CLI — npm install -g @mermaid-js/mermaid-cli, optional)
© Noi1r, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 10 other files (scripts, references) in powerpoint-slides of Noi1r/powerpoint-skill.
Open the folder on GitHubat commit a39cd8c
Powerpoint Slides next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Powerpoint Slides this skillNoi1r/powerpoint-skill | 124 | — | ~12k | Automated safety check: Notes | MIT | |
| Thesis Defense PPTX Builderzouchenzhen/thesis-defense-pptx-skill | 266 | — | ~2.4k | Automated safety check: Pass | Apache-2.0 | |
| BeamerNoi1r/beamer-skill | 364 | — | ~13k | Automated safety check: Notes | MIT | |
| Explorable Deckclaesbackman/AI-research-feedback | 495 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Conference Talk Slides from PapersOrchestra-Research/AI-Research-SKILLs | 13k | — | ~2.5k | Automated safety check: Pass | MIT | |
| Oleafly Slides And PostersOleafly/Oleafly | 212 | — | ~2.4k | Automated safety check: Pass | MIT |
zouchenzhen/thesis-defense-pptx-skill
Builds an editable thesis defense PowerPoint from a thesis PDF or LaTeX project while preserving a supplied university or lab template, then runs a visual quality check.
Noi1r/beamer-skill
Beamer LaTeX slide workflow: create, compile, review, and polish academic presentations.
claesbackman/AI-research-feedback
Build a Quarto reveal.js slide deck in the explorable-explanation style (Nicky Case) — one idea per slide, assertion titles, a concrete running example, run-time SVG stages the presenter drives…
Orchestra-Research/AI-Research-SKILLs
Generates Beamer LaTeX PDF and editable PPTX slides from a compiled paper, with speaker notes and an optional talk script, sized to four talk lengths.
Oleafly/Oleafly
Turn the manuscript in the open project into a talk deck or a conference poster and compile it in place.
AI4Scientist/nano-scientist
Generate conference presentation slides (beamer LaTeX → PDF + editable PPTX) from a compiled paper, with speaker notes and full talk script.
Works with
Categories
Create visually rich PowerPoint (.pptx) presentations from academic papers, research notes, or any content the user wants in slide format. Powerpoint Slides is an agent skill from Noi1r/powerpoint-skill.pptx) presentations from academic papers, research notes, or any content the user wants in slide format.
Powerpoint Slides fits situations like: the user wants PPT/PPTX output instead of Beamer/LaTeX slides; make slides (non-LaTeX); prepare a presentation (when context implies PPT); presentation slides.
Run `npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a claude-code`. Or copy the skill folder (powerpoint-slides in Noi1r/powerpoint-skill) into .claude/skills/powerpoint-slides in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a codex`. Or copy the skill folder (powerpoint-slides in Noi1r/powerpoint-skill) into .agents/skills/powerpoint-slides in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Noi1r/powerpoint-skill --skill powerpoint-slides -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/powerpoint-slides, .gemini/skills/powerpoint-slides, .github/skills/powerpoint-slides and .opencode/skills/powerpoint-slides in your project.
Going by SKILL.md and its folder, Powerpoint Slides needs Python for the scripts in its folder and the command-line tools its instructions call (python, npm, pdftoppm, pip, markitdown and brew). Our summary lists: Python 3; Node.js. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash, Grep, Glob, Agent, AskUserQuestion, TaskCreate, TaskUpdate, TaskList, TaskGet.
SKILL.md contains no URLs. Its commands use npm and pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Powerpoint Slides is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 12k tokens (SKILL.md is roughly 50k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.2k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Powerpoint Slides: Thesis Defense PPTX Builder (zouchenzhen/thesis-defense-pptx-skill, 266 stars), Beamer (Noi1r/beamer-skill, 364 stars), Explorable Deck (claesbackman/AI-research-feedback, 495 stars) and Conference Talk Slides from Papers (Orchestra-Research/AI-Research-SKILLs, 13k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Noi1r (a GitHub user) maintains it in Noi1r/powerpoint-skill, which has 124 GitHub stars. The repository was last updated on March 17, 2026.
Source: Noi1r/powerpoint-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.