--- title: 0.13.0 description: Changes in Typst 0.13.0 --- # Version 0.13.0 (February 19, 2025) ## Highlights - There is now a distinction between [proper paragraphs]($par) and just inline-level content. This is important for future work on accessibility and means that [first line indent]($par.first-line-indent) can now be enabled for all paragraphs instead of just consecutive ones. - The [`outline`] has a better out-of-the-box look and is more customizable - The new [`curve`] function (that supersedes the `path` function) provides a simpler and more flexible interface for creating Bézier curves - The `image` function now supports raw [pixel raster formats]($image.format) for generating images from within Typst - Functions that accept [file paths]($syntax/#paths) now also accept raw [bytes], for full flexibility - WebAssembly [plugins]($plugin) 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]($text.font) by which font family - The [`pdf.embed`] function 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]($par) 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 `par` now only affect proper paragraphs - The `first-line-indent` and `hanging-indent` properties 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 [`outline`] function was fully reworked to improve its out-of-the-box behavior **(Breaking change)** - [Outline entries]($outline.entry) are now [blocks]($block) and are thus affected by block spacing - The `{auto}` indentation 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 [`fill`]($outline.entry.fill) parameter was moved from `outline` to `outline.entry` and can thus be configured through show-set rules - Removed `body` and `page` fields from outline entry - Added `indented`, `prefix`, `inner`, `body`, and `page` methods on outline entries to simplify writing of show rules - Added configuration to [`par.first-line-indent`] for indenting all paragraphs instead of just consecutive ones - Added [`form`]($ref.form) parameter to `ref` function. Setting the form to `{"page"}` will produce a page reference instead of a textual one. - Added [`document.description`] field, which results in corresponding PDF and HTML metadata - Added [`enum.reversed`] parameter - Added support for Greek [numbering] - When the [`link`] function 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 combining `link` and [`repeat`]. - The [`link`] function will now only strip one prefix (like `mailto:` or `tel:`) 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 [`curve`] function that supersedes the [`path`] function and provides a simpler and more flexible interface. The `path` function is now deprecated. - The `image` function now supports raw [pixel raster formats]($image.format). This can be used to generate images from within Typst without the need for encoding in an image exchange format. - Added [`image.scaling`] parameter for configuring how an image is scaled by PNG export and PDF viewers (smooth or pixelated) - Added [`image.icc`] parameter for providing or overriding the ICC profile of an image - Renamed `pattern` to [`tiling`]. The name `pattern` remains as a deprecated alias. - Added [`gradient.center`], [`gradient.radius`], [`gradient.focal-center`], and [`gradient.focal-radius`] methods - Fixed interaction of clipping and outset on [`box`] and [`block`] - Fixed panic with [`path`] of 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]($syntax/#paths) now also accept raw [bytes] - [`image`], [`cbor`], [`csv`], [`json`], [`toml`], [`xml`], and [`yaml`] now support a path string or bytes and their `.decode` variants are deprecated - [`plugin`], [`bibliography`], [`bibliography.style`], [`cite.style`], [`raw.theme`], and [`raw.syntaxes`] now accept bytes in addition to path strings. These did not have `.decode` variants, so this adds new flexibility. - The `path` argument/field of [`image`] and [`bibliography`] was renamed to `source` and `sources`, respectively **(Minor breaking change)** - Improved WebAssembly [plugins]($plugin) - The `plugin` type is replaced by a [`plugin` function]($plugin) 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.transition`] API 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 [`arguments`] type can now be added with `+` and [joined]($scripting/#blocks) 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.entry`] as no other element function defines methods. - Added [`calc.norm`] function - Added support for 32-bit floats in [`float.from-bytes`] and [`float.to-bytes`] - The [`decimal`] constructor now also accepts decimal values - Improved `repr` of [symbols]($symbol), [arguments], and [types]($type) - 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]($arguments/#spreading) - Better looking accents thanks to support for the `flac` (Flattened Accent Forms) and `dtls` (Dotless Forms) OpenType features - Added `lcm` [text operator]($math.op) - The [`bold`]($math.bold) function now works with ϝ and Ϝ - The [`italic`]($math.italic) function now works with ħ - Fixed a bug where the extent of a math equation was wrongly affected by internal metadata - Fixed interaction of [`lr`]($math.lr) and [context] expressions - Fixed weak spacing being unconditionally ignored in [`lr`]($math.lr) - Fixed sub/superscripts sometimes being in the wrong position with [`lr`]($math.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 `editortype`s like `producer`, `writer`, `scriptwriter`, and `none` (defined by widespread style `biblatex-chicago` to mean performers within `music` and `video` entries) 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]($text.font) by which font family - Added [`all`]($smallcaps.all) parameter to `smallcaps` function that also enables small capitals on uppercase letters - Added basic i18n for Basque and Bulgarian - [Justification]($par.justify) does not affect [raw] blocks anymore - [CJK-Latin-spacing]($text.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 [`raw`] syntax 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 ([`square`] and [`circle`]) - Fixed [`block.sticky`] not 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]($cite) in [`align`] not 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. `0b100000pt` is not allowed anymore. Previously, it was syntactically allowed but always resolved to a value of zero. **(Minor breaking change)** - Using `is` as 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.embed`] function 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.elem`] function for outputting an arbitrary HTML element - Added [`html.frame`] function for integrating content that requires layout into HTML (by embedding an SVG) - Added [`target`] function 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 `cite` function - 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 `--features` argument and `TYPST_FEATURES` environment variable for opting into experimental features. The only feature so far is `html`. - Added a live reloading HTTP server to `typst watch` when targeting HTML - Fixed self-update not being aware about certain target architectures - Fixed crash when piping `typst fonts` output to another command - Fixed handling of relative paths in `--make-deps` output - Fixed handling of multipage SVG and PNG export in `--make-deps` output - Colons in filenames are now correctly escaped in `--make-deps` output ## Symbols - New - `inter`, `inter.and`, `inter.big`, `inter.dot`, `inter.double`, `inter.sq`, `inter.sq.big`, `inter.sq.double`, `integral.inter` - `asymp`, `asymp.not` - `mapsto`, `mapsto.long` - `divides.not.rev`, `divides.struck` - `interleave`, `interleave.big`, `interleave.struck` - `eq.triple.not`, `eq.dots`, `eq.dots.down`, `eq.dots.up` - `smt`, `smt.eq`, `lat`, `lat.eq` - `colon.tri`, `colon.tri.op` - `dagger.triple`, `dagger.l`, `dagger.r`, `dagger.inv` - `hourglass.stroked`, `hourglass.filled` - `die.six`, `die.five`, `die.four`, `die.three`, `die.two`, `die.one` - `errorbar.square.stroked`, `errorbar.square.filled`, `errorbar.diamond.stroked`, `errorbar.diamond.filled`, `errorbar.circle.stroked`, `errorbar.circle.filled` - `numero` - Renamed **(Breaking change)** - `ohm.inv` to `Omega.inv` - Changed codepoint **(Breaking change)** - `angle.l.double` from `《` to `⟪` - `angle.r.double` from `》` to `⟫` - `angstrom` from U+212B (`Å`) to U+00C5 (`Å`) - Deprecated - `sect` and all its variants in favor of `inter` - `integral.sect` in favor of `integral.inter` - Removed **(Breaking change)** - `degree.c` in favor of `°C` (`[$upright(°C)$]` or `[$upright(degree C)$]` in math) - `degree.f` in favor of `°F` (`[$upright(°F)$]` or `[$upright(degree F)$]` in math) - `kelvin` in favor of just K (`[$upright(K)$]` in math) - `ohm` in favor of `Omega` ## Deprecations - The [`path`] function in favor of the [`curve`] function - The name `pattern` for tiling patterns in favor of the new name [`tiling`] - [`image.decode`], [`cbor.decode`], [`csv.decode`], [`json.decode`], [`toml.decode`], [`xml.decode`], [`yaml.decode`] in favor of the top-level functions directly accepting both paths and bytes - The `sect` and its variants in favor of `inter`, and `integral.sect` in favor of `integral.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 `style` function and `styles` argument of [`measure`], use a [context] expression instead **(Breaking change)** - Removed `state.display` function, use [`state.get`] instead **(Breaking change)** - Removed `location` argument of [`state.at`], [`counter.at`], and [`query`] **(Breaking change)** - Removed compatibility behavior where [`counter.display`] worked without [context] **(Breaking change)** - Removed compatibility behavior of [`locate`] **(Breaking change)** ## Development - The `typst::compile` function is now generic and can return either a `PagedDocument` or an `HtmlDocument` - `typst-timing` now supports WebAssembly targets via `web-sys` when the `wasm` feature is enabled - Increased minimum supported Rust version to 1.80 - Fixed linux/arm64 Docker image ## Contributors