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 customizableThe new
curvefunction (that supersedes thepathfunction) provides a simpler and more flexible interface for creating Bézier curvesThe
imagefunction now supports raw pixel raster formats for generating images from within TypstFunctions 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 italicsYou can now specify which charset should be covered by which font family
The
pdf.embedfunction lets you embed arbitrary files in the exported PDFHTML 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 paragraphsThe
first-line-indentandhanging-indentproperties also only affect proper paragraphsCreating a
{par[..]}with body content that is not fully inline-level will result in a warningThe 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
{auto}indentation mode now aligns numberings and titles outline-wide for a grid-like lookAutomatic 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 rulesRemoved
bodyandpagefields from outline entryAdded
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 onesAdded
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 metadataAdded
enum.reversedparameterAdded 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 multipleThe 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 imageRenamed
patterntotiling. The namepatternremains as a deprecated alias.Added
gradient.center,gradient.radius,gradient.focal-center, andgradient.focal-radiusmethodsFixed interaction of clipping and outset on
boxandblockFixed panic with
pathof infinite lengthFixed 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.repeatAuto-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 variable name bound by a bare import (no renaming, no import list) is now determined statically and dynamic imports without
{as}renaming (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 blocksFunctions 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.normfunctionAdded support for 32-bit floats in
float.from-bytesandfloat.to-bytesThe
decimalconstructor now also accepts decimal valuesImproved
reprof symbols, arguments, and typesDuplicate 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 italicsMath 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 featuresAdded
lcmtext operatorThe
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 expressionsFixed weak spacing being unconditionally ignored in
lrFixed sub/superscripts sometimes being in the wrong position with
lrFixed 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 recognizedCSL styles can now render affixes around the bibliography
For BibTeX entries with
eprinttype = {pubmed}, the PubMed ID will now be correctly processedWhitespace 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 lettersAdded 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 WGSLNew 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 containerFixed 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 futureFixed 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 PDFAdded 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 elementAdded
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 HTMLFixed self-update not being aware about certain target architectures
Fixed crash when piping
typst fontsoutput to another commandFixed handling of relative paths in
--make-depsoutputFixed handling of multipage SVG and PNG export in
--make-depsoutputColons 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 thecurvefunctionThe name
patternfor tiling patterns in favor of the new nametilingimage.decode,cbor.decode,csv.decode,json.decode,toml.decode,xml.decode,yaml.decodein favor of the top-level functions directly accepting both paths and bytesThe
sectand its variants in favor ofinter, andintegral.sectin favor ofintegral.interThe 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 anHtmlDocumenttypst-timingnow supports WebAssembly targets viaweb-syswhen thewasmfeature is enabledIncreased minimum supported Rust version to 1.80
Fixed linux/arm64 Docker image