
Slide Generation
- 1 installs
- 255 repo stars
- Updated February 27, 2026
- lingzhi227/claude-research-skills
This is a copy of slide-generation by lingzhi227 - installs and ranking accrue to the original listing.
Helps with ai & agent building tasks.
About
slide-generation is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted development.
- slide-generation
- AI & Agent Building
- AI-coding skill
Slide Generation by the numbers
- 1 all-time installs (skills.sh)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/lingzhi227/claude-research-skills --skill slide-generationAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 255 |
| Last updated | February 27, 2026 |
| Repository | lingzhi227/claude-research-skills ↗ |
What it does
Helps with ai & agent building tasks.
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()