Typst
Generate professional PDF documents using the Typst typesetting system. Use when the user asks to create a PDF, write a document, generate a report, typeset a paper, build a presentation, or make a resume / CV / cover letter / letter / invoice / thesis / handout / poster — even when they do not say "Typst" explicitly. Especially trigger when the user mentions one-page CV, two-column resume, academic paper with bibliography, or any CJK (Chinese / Japanese / Korean) document.From its SKILL.md
npx -y skills add ChanMeng666/typst-claude-skill --skill typstAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.5 KB, as published. Nobody here has run it
Typst Document Generation Skill
Trigger me when the user wants any of: PDF · CV · résumé · cover letter · academic paper · report · invoice · slides · poster · 简历 · 学术论文 · 报告 · 发票 · 幻灯片 · Typst — even if they did not say "Typst" explicitly.
You are an expert Typst typesetter. Generate professional PDF, PNG, SVG, or HTML documents using Typst.
Decision Tree — pick a template before writing
Ask, in this order, before writing any .typ:
-
What is the artefact?
- Resume / CV →
references/typst-templates.md§ Simple Resume or Typographic Resume - Cover letter / formal letter → § Letter
- Academic / research paper → § Academic Paper (two-column, abstract, bibliography)
- Internal report / whitepaper → § Technical Report
- Slide deck → § Presentation
- Bill / receipt → § Invoice
- Anything else → § General Document
- Resume / CV →
-
Is the language CJK (Chinese / Japanese / Korean)? If yes, always layer the CJK font setup from § CJK Document on top of the chosen template — missing this is the #1 source of "tofu" (□) bugs.
-
Does the user have a JSON / CSV data source? If yes, generate a
.typthat calls#let data = json("path.json")(orcsv(...)) and loops over it — do not hardcode values from the data into the template.
Quick Reference
| Task | Code / Command |
|---|---|
| Compile to PDF | typst compile doc.typ |
| Compile to PNG | typst compile doc.typ --format png --ppi 300 |
| Compile & open | typst compile doc.typ --open |
| Set page | #set page(paper: "a4", margin: 2.5cm) |
| Set font | #set text(font: "Linux Libertine", size: 11pt) |
| CJK font | #set text(lang: "zh", font: ("Source Han Serif SC", "SimSun", "Microsoft YaHei")) |
| Heading | = Title / == Subtitle / === Sub-subtitle |
| Math | $ integral_0^infinity e^(-x^2) dif x = sqrt(pi) / 2 $ |
| Import package | #import "@preview/cetz:0.3.4": canvas, draw |
| Load data | #let data = json("data.json") or csv("data.csv") |
| Evaluate expression | typst eval "1 + 2" |
| Conditional format | #if target() == "html" { ... } else { ... } |
| List fonts | typst fonts |
Workflow
1. Verify the environment
typst --version
For a deeper check (CJK fonts available, write permissions, version ≥ 0.14), run the bundled script from this skill's directory:
bash scripts/verify-typst.sh
If typst is not installed:
- Windows:
winget install --id Typst.Typst - macOS:
brew install typst - Any platform with Rust:
cargo install --locked typst-cli
2. Create the .typ source file
- Use the Decision Tree above to pick a template from
references/typst-templates.md - Consult
references/typst-language-reference.mdfor syntax - For advanced layouts, see
references/typst-design-patterns.md - Write the
.typfile to the user's desired location
3. Compile to output
typst compile document.typ # PDF (default)
typst compile document.typ --format png --ppi 300 # High-res PNG
typst compile document.typ output.svg # SVG
See references/typst-cli-reference.md for all options.
4. Iterate
Read compilation errors, consult the Recovery Recipes below, fix the .typ file, and recompile.
Gotchas / Common Mistakes
| Mistake | Fix |
|---|---|
| CJK glyphs missing or tofu (□) | Set lang AND provide a CJK font fallback chain: #set text(lang: "zh", font: ("Source Han Serif SC", "SimSun")) |
Windows path errors in #image() / #include() | Use forward slashes: image("images/photo.jpg"), not backslashes |
| Font not found | Run typst fonts to list available fonts; bundle custom fonts with --font-path ./fonts |
context errors in Typst v0.14+ | Accessing counter(), state(), or text.fill requires wrapping in a context block |
show rules leaking to other sections | Wrap scoped show rules in a block { ... } to limit their effect |
| Multi-page PNG/SVG produces single file | Use {p} placeholder in output: typst compile doc.typ "page-{p}.png" |
| Package download fails | First compile with a new @preview package requires internet; check --package-cache-path |
| Paragraph spacing looks wrong | Set #set par(justify: true, leading: 0.8em) explicitly; defaults vary |
| Math script styles not working | Use scr(), cal(), frak(), bb() — not LaTeX \mathscr, \mathcal |
typst compile works locally but the PDF is blank from a Vercel / serverless function | The Vercel runtime does not include the Typst CLI. Either ship a static prebuilt binary in the deploy bundle (vercel.json includeFiles) or call a separate compile service (Fly.io / Railway). See references/typst-design-patterns.md § Serverless. |
Recovery Recipes
When typst compile fails, paste stderr's first line into this lookup before guessing:
| stderr starts with | Most likely cause | First thing to try |
|---|---|---|
error: file not found (...) image(...) | wrong relative path | cd to the .typ file's directory; use forward slashes |
error: unknown variable: <name> | typo or missing #let <name> | grep the file for the symbol; check that imports use the right alias |
error: failed to load package | offline / firewall blocks @preview | retry with internet; or vendor the package locally and import by path |
error: cannot apply fill to ... (context error) | v0.14 introspection requires context | wrap the access in context { ... } |
error: type mismatch: expected ..., found ... | passed wrong shape from JSON to a function | log the data with #repr(data) once, inspect, then narrow the access |
When NOT to use
- Existing LaTeX projects — use LaTeX directly for
.texfiles - Simple plain-text documents — Markdown is simpler
- Spreadsheet / tabular data output — use CSV or Excel tools
- Interactive web pages — use HTML/CSS directly (Typst HTML export available via
--features htmlbut limited)
Reference Documentation
Read these files on demand (not all at once):
| Reference | Path | Content |
|---|---|---|
| CLI Reference | references/typst-cli-reference.md | All CLI commands, options, environment variables |
| Language Reference | references/typst-language-reference.md | Complete syntax, functions, and features |
| Templates | references/typst-templates.md | Ready-to-use templates (general, CJK, academic, resume, letter, report, slides, invoice) |
| Design Patterns | references/typst-design-patterns.md | Advanced patterns (themes, layouts, components, PDF capabilities) |
Output Formats
| Format | Extension | Notes |
|---|---|---|
.pdf | Default. Supports PDF/A standards and tagged PDF. | |
| PNG | .png | One image per page. Use --ppi for resolution (default 144). |
| SVG | .svg | One file per page. Vector graphics. |
| HTML | .html | Experimental. Use --features html. |