Version 0.13.0 (February 19, 2025)
Highlights
- There is now a distinction between proper paragraphs and just inline-level content. This is important for future work on accessibility and means that first line indent can now be enabled for all paragraphs instead of just consecutive ones.
- The
outlinehas a better out-of-the-box look and is more customizable - The new
curvefunction (that supersedes thepathfunction) provides a simpler and more flexible interface for creating Bézier curves - The
imagefunction now supports raw pixel raster formats for generating images from within Typst - Functions that accept file paths now also accept raw bytes, for full flexibility
- WebAssembly plugins are more flexible and automatically run multi-threaded
- Fixed a long-standing bug where single-letter strings in math (
$"a"$) would be displayed in italics - You can now specify which charset should be covered by which font family
- The
pdf.embedfunction lets you embed arbitrary files in the exported PDF - HTML export is currently under active development. The feature is still very incomplete, but already available for experimentation behind a feature flag.
Model
- There is now a distinction between proper paragraphs and just
inline-level content (Breaking change)
- All text at the root of a document is wrapped in paragraphs. Meanwhile, text in a container (like a block) is only wrapped in a paragraph if the container holds any block-level content. If all of the content is inline-level, no paragraph is created.
- In the laid-out document, it's not immediately visible whether text became
part of a paragraph. However, it is still important for accessibility, HTML
export, and for properties like
first-line-indent. - Show rules on
parnow only affect proper paragraphs - The
first-line-indentandhanging-indentproperties also only affect proper paragraphs - Creating a
par[..]with body content that is not fully inline-level will result in a warning - The default show rules of various built-in elements like lists, quotes, etc. were adjusted to ensure they produce/don't produce paragraphs as appropriate
- Removed support for booleans and content in
outline.indent
- The
outlinefunction was fully reworked to improve its out-of-the-box behavior (Breaking change)- Outline entries are now blocks and are thus affected by block spacing
- The
autoindentation mode now aligns numberings and titles outline-wide for a grid-like look - Automatic indentation now also indents entries without a numbering
- Titles wrapping over multiple lines now have hanging indent
- The page number won't appear alone on its own line anymore
- The link now spans the full entry instead of just the title and page number
- The default spacing between outline leader dots was increased
- The
fillparameter was moved fromoutlinetooutline.entryand can thus be configured through show-set rules - Removed
bodyandpagefields from outline entry - Added
indented,prefix,inner,body, andpagemethods on outline entries to simplify writing of show rules
- Added configuration to
par.first-line-indentfor indenting all paragraphs instead of just consecutive ones - Added
formparameter toreffunction. Setting the form to"page"will produce a page reference instead of a textual one. - Added
document.descriptionfield, which results in corresponding PDF and HTML metadata - Added
enum.reversedparameter - Added support for Greek numbering
- When the
linkfunction wraps around a container like a block, it will now generate only one link for the whole block instead of individual links for all the visible leaf elements. This significantly reduces PDF file sizes when combininglinkandrepeat. - The
linkfunction will now only strip one prefix (likemailto:ortel:) instead of multiple - The link function now suppresses hyphenation via a built-in show-set rule rather than through its default show rule
- Displaying the page counter without a specified numbering will now take the page numbering into account
Visualization
- Added new
curvefunction that supersedes thepathfunction and provides a simpler and more flexible interface. Thepathfunction is now deprecated. - The
imagefunction now supports raw pixel raster formats. This can be used to generate images from within Typst without the need for encoding in an image exchange format. - Added
image.scalingparameter for configuring how an image is scaled by PNG export and PDF viewers (smooth or pixelated) - Added
image.iccparameter for providing or overriding the ICC profile of an image - Renamed
patterntotiling. The namepatternremains as a deprecated alias. - Added
gradient.center,gradient.radius,gradient.focal-center, andgradient.focal-radiusmethods - Fixed interaction of clipping and outset on
boxandblock - Fixed panic with
pathof infinite length - Fixed non-solid (e.g. tiling) text fills in clipped blocks
- Fixed a crash for images with a DPI value of zero
- Fixed floating-point error in
gradient.repeat - Auto-detection of image formats from a raw buffer now has support for SVGs
Scripting
- Functions that accept file paths now also accept raw
bytes
image,cbor,csv,json,toml,xml, andyamlnow support a path string or bytes and their.decodevariants are deprecatedplugin,bibliography,bibliography.style,cite.style,raw.theme, andraw.syntaxesnow accept bytes in addition to path strings. These did not have.decodevariants, so this adds new flexibility.- The
pathargument/field ofimageandbibliographywas renamed tosourceandsources, respectively (Minor breaking change)
- Improved WebAssembly plugins
- The
plugintype is replaced by apluginfunction that returns a module containing normal Typst functions. This module can be used with import syntax. (Breaking change) - Plugins now automatically run in multiple threads without any changes by plugin authors
- A new
plugin.transitionAPI is introduced which allows plugins to run impure initialization in a way that doesn't break Typst's purity guarantees
- The
- The variable name bound by a bare import (no renaming, no import list) is now
determined statically and dynamic imports without
asrenaming (e.g.import "ot" + "her.typ") are a hard error (Breaking change) - Values of the
argumentstype can now be added with+and joined in curly-braced code blocks - Functions in an element function's scope can now be called with method syntax,
bringing elements and types closer (in anticipation of a future full
unification of the two). Currently, this is only useful for
outline.entryas no other element function defines methods. - Added
calc.normfunction - Added support for 32-bit floats in
float.from-bytesandfloat.to-bytes - The
decimalconstructor now also accepts decimal values - Improved
reprof symbols, arguments, and types - Duplicate symbol variants and modifiers are now a hard error (Breaking change)
Math
- Fixed a bug where single letter strings in math (
$"a"$) would be displayed in italics - Math function calls can now have hyphenated named arguments and support argument spreading
- Better looking accents thanks to support for the
flac(Flattened Accent Forms) anddtls(Dotless Forms) OpenType features - Added
lcmtext operator - The
boldfunction now works with ϝ and Ϝ - The
italicfunction now works with ħ - Fixed a bug where the extent of a math equation was wrongly affected by internal metadata
- Fixed interaction of
lrand context expressions - Fixed weak spacing being unconditionally ignored in
lr - Fixed sub/superscripts sometimes being in the wrong position with
lr - Fixed multi-line annotations (e.g. overbrace) changing the math baseline
- Fixed merging of attachments when the base is a nested equation
- Fixed resolving of contextual (em-based) text sizes within math
- Fixed spacing around up tacks (⊥)
Bibliography
- Prose and author-only citations now use editor names if the author names are unavailable
- Some non-standard but widely used BibLaTeX
editortypes likeproducer,writer,scriptwriter, andnone(defined by widespread stylebiblatex-chicagoto mean performers withinmusicandvideoentries) are now recognized - CSL styles can now render affixes around the bibliography
- For BibTeX entries with
eprinttype = {pubmed}, the PubMed ID will now be correctly processed - Whitespace handling for strings delimiting initialized names has been improved
- Uppercase spelling after apostrophes used as quotation marks is now possible
- Fixed bugs around the handling of CSL delimiting characters
- Fixed a problem with parsing multibyte characters in page ranges that could prevent Hayagriva from parsing some BibTeX page ranges
- Updated CSL APA style
- Updated CSL locales for Finnish, Swiss German, Austrian German, German, and Arabic
Text
- Added support for specifying which charset should be covered by which font family
- Added
allparameter tosmallcapsfunction that also enables small capitals on uppercase letters - Added basic i18n for Basque and Bulgarian
- Justification does not affect raw blocks anymore
- CJK-Latin-spacing does not affect raw text anymore
- Fixed wrong language codes being used for Greek and Ukrainian
- Fixed default quotes for Croatian and Bulgarian
- Fixed crash in RTL text handling
- Added support for
rawsyntax highlighting for a few new languages: CFML, NSIS, and WGSL - New font metadata exception for New Computer Modern Sans Math
- Updated bundled New Computer Modern fonts to version 7.0.1
Layout
- Fixed various bugs with footnotes
- Fixed footnotes getting lost when multiple footnotes were nested within another footnote
- Fixed endless loops with empty and overlarge footnotes
- Fixed crash with overlarge footnotes within a floating placement
- Fixed sizing of quadratic shapes (
squareandcircle) - Fixed
block.stickynot working properly at the top of a container - Fixed crash due to consecutive weak spacing
- Fixed crash when a block or text have negative sizes
- Fixed unnecessary hyphenations occurring in rare scenarios due to a bad interaction between padding and paragraph optimization
- Fixed lone citations in
alignnot becoming their own paragraph
Syntax
- Top-level closing square brackets that do not have a matching opening square bracket are now a hard error (Minor breaking change)
- Adding a space between the identifier and the parentheses in a set rule is not allowed anymore (Minor breaking change)
- Numbers with a unit cannot have a base prefix anymore, e.g.
0b100000ptis not allowed anymore. Previously, it was syntactically allowed but always resolved to a value of zero. (Minor breaking change) - Using
isas an identifier will now warn as it might become a keyword in the future - Fixed minor whitespace handling bugs
- in math mode argument lists
- at the end of headings
- between a term list's term and description
- Fixed parsing of empty single line raw blocks with 3+ backticks and a language tag
- Fixed minor bug with parentheses parsing in math
- Markup that can only appear at the start of the line (headings, lists) can now also appear at the start of a list item
- A shebang
#!at the very start of a file is now ignored
PDF export
- Added
pdf.embedfunction for embedding arbitrary files in the exported PDF - Added support for PDF/A-3b export
- The PDF timestamp will now contain the timezone by default
HTML export
Note: HTML export is currently under active development. The feature is still very incomplete, but already available for experimentation behind a feature flag.
- Added HTML output support for some (but not all) of the built-in elements
- Added
html.elemfunction for outputting an arbitrary HTML element - Added
html.framefunction for integrating content that requires layout into HTML (by embedding an SVG) - Added
targetfunction which returns either"paged"or"html"depending on the export target
Tooling and Diagnostics
- Autocompletion improvements
- Added autocompletion for file paths
- Smarter autocompletion of variables: Completing
rect(fill: |)will now only show variables which contain a valid fill (either directly or nested, e.g. a dictionary containing a valid fill) - Different functions will now autocomplete with different brackets (round vs square) depending on which kind is more useful
- Positional parameters which are already provided aren't autocompleted again anymore
- Fixed variable autocompletion not considering parameters
- Added autocompletion snippets for common figure usages
- Fixed autocompletion after half-completed import item
- Fixed autocompletion for
citefunction
- Added warning when an unconditional return in a code block discards joined content
- Fixed error message when accessing non-existent label
- Fixed handling of nested imports in IDE functionality
Command Line Interface
- Added
--featuresargument andTYPST_FEATURESenvironment variable for opting into experimental features. The only feature so far ishtml. - Added a live reloading HTTP server to
typst watchwhen targeting HTML - Fixed self-update not being aware about certain target architectures
- Fixed crash when piping
typst fontsoutput to another command - Fixed handling of relative paths in
--make-depsoutput - Fixed handling of multipage SVG and PNG export in
--make-depsoutput - Colons in filenames are now correctly escaped in
--make-depsoutput
Symbols
- New
inter,inter.and,inter.big,inter.dot,inter.double,inter.sq,inter.sq.big,inter.sq.double,integral.interasymp,asymp.notmapsto,mapsto.longdivides.not.rev,divides.struckinterleave,interleave.big,interleave.struckeq.triple.not,eq.dots,eq.dots.down,eq.dots.upsmt,smt.eq,lat,lat.eqcolon.tri,colon.tri.opdagger.triple,dagger.l,dagger.r,dagger.invhourglass.stroked,hourglass.filleddie.six,die.five,die.four,die.three,die.two,die.oneerrorbar.square.stroked,errorbar.square.filled,errorbar.diamond.stroked,errorbar.diamond.filled,errorbar.circle.stroked,errorbar.circle.fillednumero
- Renamed (Breaking change)
ohm.invtoOmega.inv
- Changed codepoint (Breaking change)
angle.l.doublefrom《to⟪angle.r.doublefrom》to⟫angstromfrom U+212B (Å) to U+00C5 (Å)
- Deprecated
sectand all its variants in favor ofinterintegral.sectin favor ofintegral.inter
- Removed (Breaking change)
degree.cin favor of°C($upright(°C)$or$upright(degree C)$in math)degree.fin favor of°F($upright(°F)$or$upright(degree F)$in math)kelvinin favor of just K ($upright(K)$in math)ohmin favor ofOmega
Deprecations
- The
pathfunction in favor of thecurvefunction - The name
patternfor tiling patterns in favor of the new nametiling image.decode,cbor.decode,csv.decode,json.decode,toml.decode,xml.decode,yaml.decodein favor of the top-level functions directly accepting both paths and bytes- The
sectand its variants in favor ofinter, andintegral.sectin favor ofintegral.inter - The compatibility behavior of type/str comparisons (e.g.
int == "integer") which was temporarily introduced in Typst 0.8 now emits warnings. It will be removed in Typst 0.14.
Removals
- Removed
stylefunction andstylesargument ofmeasure, use a context expression instead (Breaking change) - Removed
state.displayfunction, usestate.getinstead (Breaking change) - Removed
locationargument ofstate.at,counter.at, andquery(Breaking change) - Removed compatibility behavior where
counter.displayworked without context (Breaking change) - Removed compatibility behavior of
locate(Breaking change)
Development
- The
typst::compilefunction is now generic and can return either aPagedDocumentor anHtmlDocument typst-timingnow supports WebAssembly targets viaweb-syswhen thewasmfeature is enabled- Increased minimum supported Rust version to 1.80
- Fixed linux/arm64 Docker image