
Slide Generation
- 1.2k installs
- 255 repo stars
- Updated February 27, 2026
- lingzhi227/agent-research-skills
slide-generation is an agent skill that generates research presentation slides from paper sections, figures, and key results.
About
The slide-generation skill creates research talk slides from existing paper content, figures, and tables produced by upstream agent-research-skills. It maps one idea per slide, uses concise bullets, preserves citation markers, and highlights key results or diagrams without dumping full paper paragraphs. Agents choose layouts for title, motivation, method, results, ablation, and conclusion slides while keeping speaker-note optional detail separate. Output targets LaTeX beamer or Markdown slide decks depending on project conventions. Use when preparing conference presentations after paper sections and figures exist.
- Builds research slides from existing sections, figures, and tables.
- One-idea-per-slide structure with concise bullets and citations.
- Supports method, results, ablation, and conclusion layouts.
- Keeps speaker notes separate from sparse on-slide text.
- Downstream of paper-writing and figure-generation skills.
Slide Generation by the numbers
- 1,234 all-time installs (skills.sh)
- +37 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #227 of 1,879 Documentation skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
slide-generation capabilities & compatibility
- Capabilities
- one idea per slide structuring · figure and table inclusion · citation preserving bullets · method and results layouts · speaker note separation
- Use cases
- presentations · documentation
What slide-generation says it does
slide-generation
npx skills add https://github.com/lingzhi227/agent-research-skills --skill slide-generationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.2k |
|---|---|
| repo stars | ★ 255 |
| Security audit | 3 / 3 scanners passed |
| Last updated | February 27, 2026 |
| Repository | lingzhi227/agent-research-skills ↗ |
How do I turn this paper content into a concise research talk slide deck?
Generate research presentation slides from paper sections, figures, and key results.
Who is it for?
Researchers preparing conference talks after paper sections and figures are drafted.
Skip if: Skip for generating paper PDFs or experimental tables from raw logs.
When should I use this skill?
User needs research slides, beamer deck, or talk outline from existing paper assets.
What you get
A slide deck with title, method, results, and conclusion slides citing figures and key metrics.
- Beamer .tex slide deck
- Conference frame templates
Files
Slide Generation
Convert a completed paper into presentation slides or poster.
Input
$0— Paper LaTeX file (main.tex) or paper directory
References
- Slide templates and layout patterns:
~/.claude/skills/slide-generation/references/slide-templates.md
Scripts
Extract paper elements for slides
python ~/.claude/skills/slide-generation/scripts/extract_paper_elements.py --tex main.tex --output slides_skeleton.tex
python ~/.claude/skills/slide-generation/scripts/extract_paper_elements.py --tex main.tex --format json --output elements.json
python ~/.claude/skills/slide-generation/scripts/extract_paper_elements.py --tex main.tex --output slides.tex --theme metropolisParses .tex, extracts title/authors/sections/equations/figures/tables, generates Beamer skeleton.
Workflow
Step 1: Extract Key Content
From the paper, extract: 1. Title, authors, affiliations 2. Core contribution (1-3 bullet points from abstract) 3. Key figures (all \includegraphics paths) 4. Key tables (simplified versions) 5. Key equations (numbered equations from Methods) 6. Main results (best numbers from Results section)
Step 2: Design Slide Structure
Standard oral presentation flow (~15-20 slides):
| Slide # | Content | Source Section |
|---|---|---|
| 1 | Title slide | Title/Authors |
| 2 | Motivation / Problem | Introduction |
| 3 | Why existing solutions fail | Related Work |
| 4-5 | Our approach (high-level) | Methods |
| 6-8 | Technical details + equations | Methods |
| 9 | Experimental setup | Experiments |
| 10-13 | Results (figures + tables) | Results |
| 14 | Ablation study | Results |
| 15 | Limitations & Future work | Discussion |
| 16 | Conclusion | Conclusion |
| 17 | Thank you + Q&A | — |
Step 3: Generate Beamer LaTeX
\documentclass[aspectratio=169]{beamer}
\usetheme{metropolis}
\title{Paper Title}
\author{Authors}
\date{Venue Year}
\begin{document}
\maketitle
\begin{frame}{Motivation}
\begin{itemize}
\item Problem statement
\item Why it matters
\end{itemize}
\end{frame}
% ... more frames
\end{document}Step 4: Simplify for Presentation
- Tables: reduce to essential rows/columns
- Equations: show only the key insight, not full derivation
- Figures: use largest versions, add annotations
- Text: bullet points only, no paragraphs
Step 5: Generate Poster Layout (Optional)
For poster sessions, use a multi-column layout:
- Column 1: Introduction + Motivation
- Column 2: Methods + Key Equations
- Column 3: Results + Figures
- Column 4: Conclusions + References
Rules
- Maximum 1 key message per slide
- Figures should be large and readable
- No more than 6 bullet points per slide
- Equations should be simplified versions
- Include slide numbers
- Use consistent color scheme matching the paper's figures
- Presentation should be self-contained (understandable without reading the paper)
Related Skills
- Upstream: paper-compilation, figure-generation
- See also: self-review, paper-assembly
Slide Generation Templates
Beamer LaTeX templates and layout patterns for research presentations.
Full Beamer Template
\documentclass[aspectratio=169]{beamer}
\usetheme{metropolis}
\usepackage{appendixnumberbeamer}
\usepackage{booktabs}
\usepackage{amsmath,amssymb}
\usepackage{graphicx}
\usepackage{xcolor}
% Custom colors
\definecolor{primaryblue}{HTML}{2C3E50}
\definecolor{accentorange}{HTML}{E67E22}
\setbeamercolor{frametitle}{bg=primaryblue}
\title{Paper Title Here}
\subtitle{Conference Name, Year}
\author{Author 1 \and Author 2}
\institute{University / Lab}
\date{\today}
\begin{document}
\maketitle
\begin{frame}{Outline}
\tableofcontents
\end{frame}
% --- MOTIVATION ---
\section{Motivation}
\begin{frame}{Problem Statement}
\begin{itemize}
\item What is the problem?
\item Why does it matter?
\item What are the challenges?
\end{itemize}
\end{frame}
\begin{frame}{Existing Approaches Fall Short}
\begin{columns}[T]
\column{0.5\textwidth}
\textbf{Method A}
\begin{itemize}
\item Pro: ...
\item Con: ...
\end{itemize}
\column{0.5\textwidth}
\textbf{Method B}
\begin{itemize}
\item Pro: ...
\item Con: ...
\end{itemize}
\end{columns}
\vspace{1em}
\textcolor{accentorange}{\textbf{Gap:}} Neither handles ...
\end{frame}
% --- METHOD ---
\section{Our Approach}
\begin{frame}{Key Idea}
\begin{center}
\includegraphics[width=0.8\textwidth]{figures/method_overview.png}
\end{center}
\end{frame}
\begin{frame}{Formulation}
\begin{equation}
\mathcal{L} = \mathcal{L}_{\text{task}} + \lambda \mathcal{L}_{\text{reg}}
\end{equation}
where:
\begin{itemize}
\item $\mathcal{L}_{\text{task}}$: task-specific loss
\item $\mathcal{L}_{\text{reg}}$: regularization term
\item $\lambda$: trade-off parameter
\end{itemize}
\end{frame}
% --- RESULTS ---
\section{Results}
\begin{frame}{Main Results}
\begin{table}
\centering
\begin{tabular}{lcc}
\toprule
Method & Dataset A & Dataset B \\
\midrule
Baseline 1 & 42.3 & 38.7 \\
Baseline 2 & 44.1 & 40.2 \\
\textbf{Ours} & \textbf{48.9} & \textbf{45.3} \\
\bottomrule
\end{tabular}
\end{table}
\end{frame}
\begin{frame}{Visualization}
\begin{center}
\includegraphics[width=0.7\textwidth]{figures/results_plot.png}
\end{center}
\end{frame}
\begin{frame}{Ablation Study}
\begin{table}
\centering
\begin{tabular}{lc}
\toprule
Variant & Accuracy \\
\midrule
Full model & \textbf{48.9} \\
w/o Component A & 45.2 \\
w/o Component B & 46.7 \\
w/o Component C & 44.8 \\
\bottomrule
\end{tabular}
\end{table}
\end{frame}
% --- CONCLUSION ---
\section{Conclusion}
\begin{frame}{Summary}
\begin{itemize}
\item \textbf{Contribution 1}: ...
\item \textbf{Contribution 2}: ...
\item \textbf{Contribution 3}: ...
\end{itemize}
\vspace{1em}
\textbf{Limitations \& Future Work:}
\begin{itemize}
\item Limitation 1 → Future direction
\item Limitation 2 → Future direction
\end{itemize}
\end{frame}
\begin{frame}[standout]
Thank You!
\vspace{1em}
\small{Code: \url{https://github.com/...}}
\end{frame}
\end{document}Slide Layout Patterns
Two-Column with Figure
\begin{frame}{Title}
\begin{columns}[T]
\column{0.45\textwidth}
\begin{itemize}
\item Point 1
\item Point 2
\item Point 3
\end{itemize}
\column{0.55\textwidth}
\includegraphics[width=\textwidth]{figure.png}
\end{columns}
\end{frame}Full-Width Figure with Caption
\begin{frame}{Method Overview}
\begin{center}
\includegraphics[width=0.85\textwidth]{overview.png}
\end{center}
\vspace{-0.5em}
\small{Our method consists of three stages: encoding, processing, and decoding.}
\end{frame}Equation Highlight Box
\begin{frame}{Key Equation}
\begin{block}{Main Result}
\begin{equation}
f(x) = \sum_{i=1}^{N} \alpha_i K(x, x_i)
\end{equation}
\end{block}
\textbf{Intuition:} The output is a weighted combination of kernel evaluations.
\end{frame}Before/After Comparison
\begin{frame}{Improvement}
\begin{columns}[T]
\column{0.5\textwidth}
\centering
\textbf{Before}
\includegraphics[width=0.9\textwidth]{before.png}
\column{0.5\textwidth}
\centering
\textbf{After (Ours)}
\includegraphics[width=0.9\textwidth]{after.png}
\end{columns}
\end{frame}Poster Template (a0poster)
\documentclass[a0,portrait]{a0poster}
\usepackage{multicol}
\usepackage{graphicx}
\usepackage{booktabs}
\begin{document}
% Title
\begin{center}
{\VeryHuge \textbf{Paper Title}} \\[1cm]
{\Large Author 1, Author 2 — University}
\end{center}
\begin{multicols}{3}
% Column 1: Introduction
\section*{Introduction}
Problem description and motivation...
\section*{Related Work}
Key prior work...
% Column 2: Methods
\section*{Method}
\includegraphics[width=\columnwidth]{method.png}
Key equation:
$$\mathcal{L} = \mathcal{L}_{\text{task}} + \lambda \mathcal{L}_{\text{reg}}$$
% Column 3: Results
\section*{Results}
\includegraphics[width=\columnwidth]{results.png}
\begin{tabular}{lcc}
\toprule
Method & Acc & F1 \\
\midrule
Baseline & 42.3 & 40.1 \\
\textbf{Ours} & \textbf{48.9} & \textbf{46.5} \\
\bottomrule
\end{tabular}
\section*{Conclusion}
Summary of contributions...
\section*{References}
\small{[1] Author et al., Title, Venue, Year.}
\end{multicols}
\end{document}Content Extraction Rules
From the paper, extract for slides:
1. Title, authors, affiliations → Title slide
2. Abstract sentences 1-2 → Motivation
3. Contribution bullet points → Summary slide
4. Method figure (if exists) → Method overview slide
5. Key equations (numbered) → Formulation slide (simplify if needed)
6. Main results table → Results slide (reduce columns if > 5)
7. Best result figures → Visualization slides
8. Ablation table → Ablation slide
9. Limitations paragraph → Conclusion slide
10. Future work paragraph → Conclusion slidePresentation Tips
- 1 minute per slide (15 slides for 15-min talk)
- Max 6 bullet points per slide
- Max 30 words per slide (excluding equations/tables)
- Figures should fill at least 50% of the slide
- Use animations sparingly
- Include slide numbers
- Consistent color scheme
- Font size: title ≥ 24pt, body ≥ 18pt, caption ≥ 14pt#!/usr/bin/env python3
"""Extract paper elements for slide generation.
Parses a .tex file and extracts title, authors, sections, equations,
figure paths with captions, tables, and generates a Beamer skeleton.
Self-contained: uses only stdlib.
Usage:
python extract_paper_elements.py --tex main.tex --output slides_skeleton.tex
python extract_paper_elements.py --tex main.tex --format json --output elements.json
python extract_paper_elements.py --tex main.tex --output slides.tex --theme metropolis
"""
import argparse
import json
import os
import re
import sys
def load_tex(path: str) -> str:
"""Load .tex file, resolving \\input{} directives."""
with open(path, encoding="utf-8", errors="replace") as f:
content = f.read()
base_dir = os.path.dirname(path)
def resolve_input(match):
fname = match.group(1)
if not fname.endswith(".tex"):
fname += ".tex"
fpath = os.path.join(base_dir, fname)
if os.path.exists(fpath):
with open(fpath, encoding="utf-8", errors="replace") as f:
return f.read()
return match.group(0)
content = re.sub(r"\\input\{([^}]+)\}", resolve_input, content)
return content
def extract_title(tex: str) -> str:
"""Extract paper title."""
m = re.search(r"\\title(?:\[.*?\])?\{(.+?)\}", tex, re.DOTALL)
return m.group(1).strip().replace("\n", " ") if m else ""
def extract_authors(tex: str) -> list[str]:
"""Extract author names."""
m = re.search(r"\\author(?:\[.*?\])?\{(.+?)\}", tex, re.DOTALL)
if not m:
return []
author_text = m.group(1)
# Clean up LaTeX formatting
author_text = re.sub(r"\\[a-zA-Z]+\{[^}]*\}", "", author_text)
author_text = re.sub(r"\\\\", ",", author_text)
author_text = re.sub(r"\s+", " ", author_text)
authors = [a.strip() for a in author_text.split(",") if a.strip()]
# Filter out affiliations (typically shorter or contain numbers)
return [a for a in authors if len(a) > 3 and not re.match(r"^\d", a)]
def extract_abstract(tex: str) -> str:
"""Extract abstract text."""
m = re.search(r"\\begin\{abstract\}(.*?)\\end\{abstract\}", tex, re.DOTALL)
return m.group(1).strip() if m else ""
def extract_sections(tex: str) -> list[dict]:
"""Extract section names and their content."""
sections = []
parts = re.split(r"(\\(?:sub)?section\*?\{[^}]+\})", tex)
current_name = None
current_text = ""
current_level = 0
for part in parts:
sec_match = re.match(r"\\(sub)?section\*?\{([^}]+)\}", part)
if sec_match:
if current_name:
sections.append({
"name": current_name,
"level": current_level,
"text": current_text.strip()[:500],
})
is_sub = sec_match.group(1) is not None
current_name = sec_match.group(2).strip()
current_level = 2 if is_sub else 1
current_text = ""
else:
current_text += part
if current_name:
sections.append({
"name": current_name,
"level": current_level,
"text": current_text.strip()[:500],
})
return sections
def extract_figures(tex: str) -> list[dict]:
"""Extract figure paths and captions."""
figures = []
fig_envs = re.finditer(
r"\\begin\{figure\*?\}.*?\\end\{figure\*?\}", tex, re.DOTALL
)
for fig in fig_envs:
fig_text = fig.group()
path_match = re.search(r"\\includegraphics(?:\[.*?\])?\{([^}]+)\}", fig_text)
caption_match = re.search(r"\\caption\{(.+?)\}", fig_text, re.DOTALL)
label_match = re.search(r"\\label\{([^}]+)\}", fig_text)
figures.append({
"path": path_match.group(1) if path_match else "",
"caption": caption_match.group(1).strip()[:200] if caption_match else "",
"label": label_match.group(1) if label_match else "",
})
return figures
def extract_equations(tex: str) -> list[str]:
"""Extract key equations."""
equations = []
# Numbered equations
for m in re.finditer(r"\\begin\{equation\*?\}(.*?)\\end\{equation\*?\}", tex, re.DOTALL):
equations.append(m.group(1).strip())
# Align environments
for m in re.finditer(r"\\begin\{align\*?\}(.*?)\\end\{align\*?\}", tex, re.DOTALL):
equations.append(m.group(1).strip())
return equations
def extract_tables(tex: str) -> list[dict]:
"""Extract table captions and labels."""
tables = []
for m in re.finditer(r"\\begin\{table\*?\}.*?\\end\{table\*?\}", tex, re.DOTALL):
table_text = m.group()
caption_match = re.search(r"\\caption\{(.+?)\}", table_text, re.DOTALL)
label_match = re.search(r"\\label\{([^}]+)\}", table_text)
tables.append({
"caption": caption_match.group(1).strip()[:200] if caption_match else "",
"label": label_match.group(1) if label_match else "",
})
return tables
def generate_beamer(elements: dict, theme: str = "metropolis") -> str:
"""Generate a Beamer LaTeX skeleton from extracted elements."""
lines = [
f"\\documentclass[aspectratio=169]{{beamer}}",
f"\\usetheme{{{theme}}}",
f"\\title{{{elements['title']}}}",
]
if elements["authors"]:
lines.append(f"\\author{{{', '.join(elements['authors'][:4])}}}")
lines.extend([
"\\date{\\today}",
"",
"\\begin{document}",
"\\maketitle",
"",
])
# Outline slide
lines.extend([
"\\begin{frame}{Outline}",
"\\tableofcontents",
"\\end{frame}",
"",
])
# Motivation / Introduction
if elements["abstract"]:
abstract_bullets = elements["abstract"][:300].split(". ")[:3]
lines.append("\\begin{frame}{Motivation}")
lines.append("\\begin{itemize}")
for bullet in abstract_bullets:
bullet = bullet.strip()
if bullet and len(bullet) > 10:
lines.append(f" \\item {bullet}.")
lines.append("\\end{itemize}")
lines.append("\\end{frame}")
lines.append("")
# Section slides
for sec in elements["sections"]:
if sec["level"] > 1:
continue # Skip subsections
sec_name = sec["name"]
if any(skip in sec_name.lower() for skip in ["acknowledge", "appendix"]):
continue
lines.append(f"\\section{{{sec_name}}}")
lines.append(f"\\begin{{frame}}{{{sec_name}}}")
lines.append("\\begin{itemize}")
lines.append(" \\item TODO: Key points")
lines.append("\\end{itemize}")
lines.append("\\end{frame}")
lines.append("")
# Figure slides
for fig in elements["figures"][:6]:
if fig["path"]:
lines.append(f"\\begin{{frame}}{{{fig['caption'][:50] or 'Results'}}}")
lines.append("\\centering")
lines.append(f"\\includegraphics[width=0.8\\linewidth]{{{fig['path']}}}")
if fig["caption"]:
lines.append(f"% {fig['caption'][:100]}")
lines.append("\\end{frame}")
lines.append("")
# Key equations
for eq in elements["equations"][:3]:
lines.append("\\begin{frame}{Key Equation}")
lines.append("\\begin{equation*}")
lines.append(f" {eq}")
lines.append("\\end{equation*}")
lines.append("\\end{frame}")
lines.append("")
# Thank you slide
lines.extend([
"\\begin{frame}",
"\\centering",
"{\\Large Thank You!}",
"",
"\\vspace{1em}",
"Questions?",
"\\end{frame}",
"",
"\\end{document}",
])
return "\n".join(lines) + "\n"
def main():
parser = argparse.ArgumentParser(description="Extract paper elements for slides")
parser.add_argument("--tex", required=True, help="Main .tex file")
parser.add_argument("--output", "-o", help="Output file")
parser.add_argument("--format", choices=["beamer", "json"], default="beamer",
help="Output format (default: beamer)")
parser.add_argument("--theme", default="metropolis", help="Beamer theme (default: metropolis)")
args = parser.parse_args()
if not os.path.exists(args.tex):
print(f"Error: {args.tex} not found", file=sys.stderr)
sys.exit(1)
tex = load_tex(args.tex)
elements = {
"title": extract_title(tex),
"authors": extract_authors(tex),
"abstract": extract_abstract(tex),
"sections": extract_sections(tex),
"figures": extract_figures(tex),
"equations": extract_equations(tex),
"tables": extract_tables(tex),
}
print(f"Extracted from {args.tex}:", file=sys.stderr)
print(f" Title: {elements['title'][:60]}", file=sys.stderr)
print(f" Authors: {len(elements['authors'])}", file=sys.stderr)
print(f" Sections: {len(elements['sections'])}", file=sys.stderr)
print(f" Figures: {len(elements['figures'])}", file=sys.stderr)
print(f" Equations: {len(elements['equations'])}", file=sys.stderr)
print(f" Tables: {len(elements['tables'])}", file=sys.stderr)
if args.format == "json":
output = json.dumps(elements, indent=2, ensure_ascii=False)
else:
output = generate_beamer(elements, theme=args.theme)
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(output)
print(f"Written to {args.output}", file=sys.stderr)
else:
print(output)
if __name__ == "__main__":
main()
Related skills
Forks & variants (2)
Slide Generation has 2 known copies in the catalog totaling 13 installs. They canonicalize to this original listing.
- lingzhi227 - 12 installs
- lingzhi227 - 1 installs
FAQ
What slide structure does slide-generation use?
Title, motivation, method, results, ablation, and conclusion layouts with one idea per slide.
Does it paste full paper paragraphs on slides?
No. It uses concise bullets and preserves citations without dumping full text.
Which upstream skills feed it?
paper-writing-section and figure-generation outputs in the agent-research-skills pipeline.
Is Slide Generation safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.