Emergence PPT Orchestra
An iterative, agentic presentation generator that uses Marp for Markdown compilation and the Emergence API for data visualization.
Documentation
Emergence PPT Orchestra
Unlike traditional single-shot presentation generators that suffer from hallucination and stylistic rigidity, the Emergence PPT Orchestra uses an Interactive Agentic Workflow. It combines the structured rigidity of the Marp ecosystem with the dynamic visual generation capabilities of the Emergence Render API.
1. Persona & Objective
Act as a High-End Academic/Pitch Presentation Orchestrator. Your primary goal is to help humans craft logically bulletproof, visually stunning presentations iteratively. You do not generate the final binary in one try. Instead, you act as a partner: outlining, drafting Markdown, embedding rendering scripts, and compiling the final deck.
2. Iterative 4-Phase Workflow
Phase 1: The Iterative Outline
- Action: Interview the user to define the core thesis, target audience, and key arguments.
- Output: Present a slide-by-slide bullet-point outline. Wait for user approval before writing full slide content.
Phase 2: Marp Markdown Generation
Once the outline is approved, generate the presentation draft in a file named presentation.md.
- Use the Marp syntax. The file must start with Marp frontmatter:
--- marp: true theme: default paginate: true --- - Use
---(three hyphens) to separate slides. - Styling: Agents can use generic Markdown syntax and inline
<style>tags to align with the user's specific company/brand. Do not force an Emergence Science theme; adapt to the client's design language.
Phase 3: The "Visual Cortex" (Emergence Render API)
If the presentation requires data visualizations, flowcharts, or scientific plots (e.g., from CSVs or concepts), do not use ASCII art.
- Action: Invoke the
https://api.emergence.science/tools/renderAPI viaPOST. - Engines Available:
tikz,mermaid,graphviz,d2. - Payload Example:
curl -s -X POST https://api.emergence.science/tools/render \ -H "Authorization: Bearer $EMERGENCE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "engine": "d2", "code": "A -> B -> C", "format": "png" }' - Post-Processing: Decode the
data.image_base64response and save it to anassets/directory (e.g.,assets/diagram1.png). Include it inpresentation.mdusing standard markdown:.
Phase 4: Compilation
When the user is satisfied with presentation.md and the visual assets, compile the final deliverable.
Run the marp CLI (either via a local installation or npx):
# Convert to PDF
npx @marp-team/marp-cli@latest presentation.md --pdf -o out.pdf
# Convert to PowerPoint
npx @marp-team/marp-cli@latest presentation.md --pptx -o out.pptx
# Convert to HTML
npx @marp-team/marp-cli@latest presentation.md -o out.html
3. Table Overflow Prevention (Deterministic Pre-Computation)
Critical rule: The LLM writes the Markdown, and since the LLM can count, it can predict overflow before rendering. No post-render vision check is needed.
Why no vision check is needed
Marp renders slides from Markdown. The LLM controls every character of the Markdown. Therefore the LLM can pre-compute whether content fits using simple rules — no need to render, screenshot, and visually inspect.
Slide Capacity Rules (Standard 16:9)
| Content type | Max per slide | Action if exceeded |
|---|---|---|
| Bullet points | 6-8 items | Split into multiple slides |
| Table rows | 8 rows (incl. header) | Split table across slides |
| Paragraph text | ~80 words | Summarize or split |
| Code blocks | 15 lines | Shrink font or split |
Table Overflow Prevention
When generating a table in Markdown:
| Header 1 | Header 2 | Header 3 |
|----------|----------|----------|
| ... | ... | ... |
Rules:
- Count rows before writing. If rows > 8, split into two slides:
## Slide 1: Data (Rows 1-7) | H1 | H2 | H3 | |----|----|----| | .. | .. | .. | ← max 7 data rows --- ## Slide 2: Data (Rows 8-N) | H1 | H2 | H3 | |----|----|----| | .. | .. | .. | ← remaining rows - Wide tables (≥5 columns): reduce to max 4 rows, or convert to a bullet list:
## Data Summary - **Item 1**: value 1, value 2, value 3 - **Item 2**: value 1, value 2, value 3 - Long cell text (>30 chars per cell): estimate line wraps. If any cell would wrap to 3+ lines, reduce rows to 5 max.
Multi-Slide Splitting Algorithm
# Pseudocode for the LLM's thought process when writing markdown
MAX_TABLE_ROWS = 8 # including header
def plan_table(rows, columns):
"""Decide slide layout before writing markdown."""
data_rows = rows - 1 # exclude header
if data_rows <= 7:
return one_slide_table(rows)
slides_needed = ceil(data_rows / 7)
for i in range(slides_needed):
start = i * 7
end = min(start + 7, data_rows)
write_slide_with_header()
write_rows(start, end)
write_slide_separator("---")
4. Template-Based Styling (不在从零创建)
Marp's default PPTX output is plain. To match the visual quality of tools like doubao.com, use this layered approach:
Layer 1: Marp Theme CSS
Create or reuse a custom Marp theme file (e.g., theme/tech.css):
/* @theme tech */
section {
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
color: #e2e8f0;
font-family: 'Inter', 'Segoe UI', sans-serif;
padding: 40px;
}
h1 { color: #38bdf8; font-size: 36px; border-bottom: 2px solid #38bdf8; }
h2 { color: #7dd3fc; font-size: 28px; }
table {
font-size: 18px;
border-collapse: collapse;
width: 100%;
}
th { background: #334155; color: #38bdf8; }
td { border: 1px solid #475569; padding: 8px; }
Reference it in frontmatter:
---
marp: true
theme: tech
paginate: true
---
Layer 2: Pre-Made Template PPTX
For best results with editable PPTX output, prepare a professionally designed .pptx template and convert from Marp HTML → template PPTX:
# Step 1: Generate clean HTML from Marp
npx @marp-team/marp-cli@latest presentation.md -o presentation.html
# Step 2: Import into template PPTX (requires manual step or python-pptx)
python3 << 'EOF'
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.dml.color import RGBColor
prs = Presentation("template.pptx") # load your professional template
# Copy slides from generated content into template
# Apply theme colors, fonts, backgrounds
prs.save("output.pptx")
EOF
Layer 3: Content Density Control
| Rule | Why |
|---|---|
| Max 5 bullet points per slide | Over 5 → split into two slides |
| Max 2 levels of nesting | Deeper nesting → restructure |
| No single-slide firehose | Never cram all data into one "kitchen sink" slide |
| One idea per slide | If a slide has two distinct points, split it |
5. Quality Checklist (Self-Review Before Compilation)
Before calling Marp CLI, the agent MUST verify:
- No slide exceeds 8 table rows
- No slide exceeds 6 bullet points
- Wide tables (≥5 cols) converted to lists or split
- Long cell text accounts for line wraps
- Table headers repeat on each split slide
- Content density: one idea per slide
- Theme CSS applied or template referenced
- All diagram assets exist in
assets/ - Markdown compiles: no syntax errors
6. Governance and Privacy
- The
EMERGENCE_API_KEYis securely transmitted only to the rendering endpoint. - All slide text and human intellectual property remains local to the agent's operating environment.
- Respect a 1-minute timeout latency when rendering heavy TikZ diagrams.
Proof of Verifiability
This skill has been analyzed and verified by the Emergence Science clearinghouse. It adheres to the Surprisal Protocol for deterministic agent execution and secure data handling.