PDF Generation with Claude Code
PDF Generation with Claude Code
Section titled “PDF Generation with Claude Code”Confidence: Tier 2 — Based on production-tested workflow with Quarto/Typst stack.
Generate professional PDFs (documentation, whitepapers, reports) using Claude Code with modern typography and design.
Table of Contents
Section titled “Table of Contents”- TL;DR
- When to Use
- Stack Overview
- Setup
- Workflow
- Integration with Claude Code
- Customization
- Troubleshooting
- See Also
# Installbrew install quarto # macOS
# Generatequarto render document.qmd # → document.pdf
# Previewquarto preview document.qmd # Hot-reloadStack: Quarto (orchestration) + Typst (typography) + Pandoc (markdown)
When to Use
Section titled “When to Use”| Use Case | Good Fit | Alternative |
|---|---|---|
| Technical documentation | ✅ | — |
| Whitepapers / Reports | ✅ | — |
| API documentation | ⚠️ | OpenAPI + Redoc |
| Slides / Presentations | ⚠️ | Quarto Revealjs |
| Quick notes | ❌ | Plain Markdown |
| Collaborative editing | ❌ | Google Docs, Notion |
Best for: Long-form technical content requiring professional layout, version control, and reproducibility.
Stack Overview
Section titled “Stack Overview”┌─────────────────────────────────────────────────┐│ Your .qmd File ││ (Markdown + YAML frontmatter) │└─────────────────────────────────────────────────┘ │ ▼┌─────────────────────────────────────────────────┐│ Quarto ││ (Document rendering engine) ││ • Processes YAML metadata ││ • Handles extensions ││ • Manages output formats │└─────────────────────────────────────────────────┘ │ ┌─────────────┴─────────────┐ ▼ ▼┌─────────────────────┐ ┌─────────────────────┐│ Pandoc │ │ Typst ││ (MD → AST → ?) │ │ (Typography/PDF) ││ • Markdown parser │ │ • Modern engine ││ • AST transforms │ │ • Fast compilation ││ • Format bridges │ │ • No LaTeX needed │└─────────────────────┘ └─────────────────────┘ │ ▼┌─────────────────────────────────────────────────┐│ document.pdf ││ (Professional typography output) │└─────────────────────────────────────────────────┘Output Formats & Commands
Section titled “Output Formats & Commands” FORMAT COMMANDE SORTIE ────── ──────── ──────
PDF standard → quarto render doc.qmd doc.pdf --to typst (sans template custom)
PDF stylé ✅ → quarto render doc.qmd doc.pdf --to whitepaper-typst (~270K–1.7M, Bold Guy) (format custom via _extensions/)
EPUB → quarto render doc.qmd doc.epub --to epub
Preview → quarto preview doc.qmd hot-reload navigateurExtension Structure
Section titled “Extension Structure” _extensions/ └── whitepaper/ ├── _extension.yml ← déclare le format "whitepaper-typst" ├── typst-template.typ ← design system (couleurs, typo, callouts) └── typst-show.typ ← bridge Quarto → Typst
⚠️ Si tu maintiens des copies dans fr/ en/ et racine : garder les 3 fichiers typst-template.typ synchronisésTroubleshooting Rapide
Section titled “Troubleshooting Rapide” SYMPTÔME CAUSE FIX ──────── ───── ─── PDF petit (~80-190K), non stylé --to pdf au lieu de Utiliser --to whitepaper-typst --to whitepaper-typst
Erreur "bibliography" @ref dans titre callout Supprimer le @ du titre → interprété comme cit.
Table rendue comme code Backtick ``` non fermé Compter les ``` (doit être pair)
"Extension not found" Mauvais répertoire Vérifier _extensions/ path| Component | Version | Role |
|---|---|---|
| Quarto | ≥1.4.0 | Orchestration, extensions, multi-format |
| Typst | 0.13.0 | Modern typography (replaces LaTeX) |
| Pandoc | 3.x | Markdown parsing (bundled with Quarto) |
Installation
Section titled “Installation”macOS:
brew install quartoLinux (Debian/Ubuntu):
wget https://github.com/quarto-dev/quarto-cli/releases/download/v1.4.555/quarto-1.4.555-linux-amd64.debsudo dpkg -i quarto-1.4.555-linux-amd64.debWindows:
winget install Posit.QuartoVerify:
quarto --version # Should be ≥1.4.0Project Structure
Section titled “Project Structure”project/├── _extensions/ # Quarto extensions (templates)│ └── custom-template/│ ├── _extension.yml│ ├── typst-template.typ│ └── typst-show.typ├── documents/│ ├── guide.qmd # Source file│ └── guide.pdf # Generated output└── assets/ └── logo.png # Shared assetsMinimal Document
Section titled “Minimal Document”Create document.qmd:
---title: "My Document"author: "Author Name"date: 2026-01-17format: typst: toc: truelang: en---
# Introduction
Your content here...
## Section 1
More content with **bold** and `code`.
```bashecho "Code blocks work!"Section 2
Section titled “Section 2”| Column A | Column B |
|---|---|
| Data 1 | Data 2 |
Generate:```bashquarto render document.qmd # Creates document.pdfWorkflow
Section titled “Workflow”1. Content-First Approach
Section titled “1. Content-First Approach”1. Write content in Markdown (.qmd)2. Add YAML frontmatter for metadata3. Preview with hot-reload4. Generate final PDF5. Version control both source and PDF2. Available YAML Parameters
Section titled “2. Available YAML Parameters”| Parameter | Type | Description | Example |
|---|---|---|---|
title | string | Main title | "Technical Guide" |
subtitle | string | Secondary title | "v2.0 Edition" |
author | string/array | Author(s) | "John Doe" |
date | date | Document date | 2026-01-17 |
date-format | string | Display format | "MMMM YYYY" |
toc | boolean | Table of contents | true |
toc-depth | number | TOC levels (1-3) | 2 |
lang | string | Language | fr or en |
section-numbering | string | Number format | "1.1" |
3. Markdown Features
Section titled “3. Markdown Features”Page Breaks:
{{< pagebreak >}}Code Blocks (with syntax highlighting):
```typescriptfunction hello(): string { return "world";}```Tables:
| Feature | Supported ||---------|-----------|| Tables | ✅ || Images | ✅ || Links | ✅ |Images:
{width=50%}Integration with Claude Code
Section titled “Integration with Claude Code”Using the pdf-generator Skill
Section titled “Using the pdf-generator Skill”Invoke the skill for guided PDF generation:
/pdf-generatorThe skill provides:
- Template with YAML frontmatter
- Design system configuration
- Common troubleshooting fixes
- Generation commands
Prompt Examples
Section titled “Prompt Examples”Generate documentation:
Create a technical guide for our API as a Quarto document.Use the Typst format with a table of contents.Include sections for: Authentication, Endpoints, Error Codes.Convert existing Markdown:
Convert README.md to a professional PDF.Add a cover page with title and date.Use Quarto/Typst format.Create template:
Create a Quarto extension for our company's document style:- Logo in header- Custom colors: primary #0f172a, accent #6366f1- Inter font for body, JetBrains Mono for codeWith Plan Mode
Section titled “With Plan Mode”For complex documents:
[Press Shift+Tab to enter Plan Mode]
I need to create a series of 5 technical whitepapers.Plan the structure:1. Common template/extension2. Shared assets3. Build automation4. Version managementWith Hooks
Section titled “With Hooks”Auto-generate PDF after edits using a PostToolUse hook:
// In .claude/settings.json{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "command": "if echo \"$TOOL_INPUT\" | grep -q '.qmd'; then quarto render \"$FILE\"; fi" } ] }}Customization
Section titled “Customization”Custom Template Extension
Section titled “Custom Template Extension”Create _extensions/mytemplate/_extension.yml:
title: My Templateauthor: Your Nameversion: 1.0.0contributes: formats: typst: template: typst-template.typ template-partials: - typst-show.typTypst Template Variables
Section titled “Typst Template Variables”In typst-template.typ:
// Colors#let primary = rgb("#0f172a") // Dark text#let secondary = rgb("#334155") // Lighter text#let accent = rgb("#6366f1") // Highlights
// Typography#set text( font: ("Inter", "Helvetica Neue", "Arial"), size: 11pt,)
#set par( leading: 0.75em, // Line height justify: true,)
// Code blocks#show raw.where(block: true): it => { block( fill: rgb("#f8fafc"), stroke: (left: 3pt + accent), inset: 10pt, radius: 4pt, it, )}Callout Boxes
Section titled “Callout Boxes”Define in template:
#let info(title: "Note", body) = { block( fill: rgb("#E0F2FE"), stroke: (left: 3pt + rgb("#0284C7")), inset: 12pt, radius: 4pt, [*#title*: #body] )}
#let warning(title: "Warning", body) = { ... }#let success(title: "Success", body) = { ... }#let danger(title: "Danger", body) = { ... }Use in document:
#info[This is an informational note.]#warning(title: "Attention")[Check your configuration.]Troubleshooting
Section titled “Troubleshooting”Quick Checks
Section titled “Quick Checks”# Verify Quartoquarto --version
# Check extension existsls _extensions/*/
# Validate code block pairs (must be even)grep -c '^```' document.qmd
# Check encodingfile -i document.qmd # Should show utf-8Common Issues
Section titled “Common Issues”| Issue | Symptom | Fix |
|---|---|---|
| Nested code blocks | Content escapes block | Use 4+ backticks for outer block |
| Tables as code | Grey background | Check unmatched ``` above |
| Missing extension | ”Extension not found” | Verify _extensions/ path |
| Font warnings | ”unknown font family” | Normal; uses fallbacks |
| Special chars broken | ? or garbled | Convert to UTF-8 |
Nested Code Blocks
Section titled “Nested Code Blocks”Problem: Inner code block closes outer block prematurely.
Solution: Use more backticks for outer block:
````markdown# Outer block with 4 backticks
```bashecho "Inner block with 3 backticks"```
Outer block continues...````Validation Script
Section titled “Validation Script”#!/bin/bashfor f in *.qmd; do count=$(grep -c '^```' "$f") if [ $((count % 2)) -ne 0 ]; then echo "ERROR: $f has odd code block count ($count)" fidoneSee Also
Section titled “See Also”- Quarto Documentation
- Typst Documentation
- Quarto + Typst Guide
- examples/skills/pdf-generator.md — Skill template
- whitepapers/README.md — Production example