Best Practices
Template Organization
Use Subfolders
Organize templates by project or report type:
templates/
├── academy/
│ ├── enrolled-by-career.typ
│ └── students-by-condition.typ
└── hr/
├── employee-card.typ
└── salary-report.typMetadata Files
Always include a JSON metadata file alongside templates:
json
{
"title": "Employee Card",
"description": "Individual employee summary card",
"exampleData": {
"name": "John Doe",
"department": "Engineering",
"role": "Senior Developer"
}
}Data Handling
Validate Data Early
typst
#let data = json.decode(sys.inputs.at("data"))
#let title = data.at("title", default: "Untitled Report")
#let items = data.at("items", default: ())Use Descriptive Variable Names
typst
// Good
#let studentName = data.name
#let enrollmentDate = data.enrolledAt
// Avoid
#let n = data.name
#let d = data.dateTypst Performance
- Avoid deeply nested loops for large datasets
- Use
#tablefor tabular data instead of manual alignment - Precompute expensive operations outside loops
- Use
#setrules for global styling instead of repeating styles
Design Consistency
- Define a color palette at the top of your template
- Use consistent font sizes for headings, body text, and captions
- Set margins and page size explicitly for predictable output
- Test with different data lengths to ensure layouts don't break
Error Handling
typst
#if data == none {
[No data provided]
} else {
// Render template
}Version Control
- Store templates in version control alongside your data
- Use meaningful commit messages for template changes
- Test templates after updating Typst versions