--- description: | Learn what has changed in the latest Typst releases and move your documents forward. --- # Changelog ## Unreleased - Bibliography management - New bibliography engine based on [CSL](https://citationstyles.org/) (Citation Style Language). Ships with about 100 commonly used citation styles and can load custom `.csl` files. - Added new [`form`]($cite.form) argument to the `cite` function to produce different forms of citations (e.g. for producing a citation suitable for inclusion in prose) - The [`cite`]($cite) function now takes only a single label/key instead of allowing multiple. Adjacent citations are merged and formatted according to the citation style's rules automatically. This works both with the reference syntax and explicit calls to the `cite` function. (**Breaking change**) - The `cite` function now takes a [label]($label) instead of a string (**Breaking change**) - Added [`full`]($bibliography.full) argument to bibliography function to print the full bibliography even if not all works were cited - Bibliography entries can now contain Typst equations (wrapped in `[$..$]` just like in markup), this works both for `.yml` and `.bib` bibliographies - The hayagriva YAML format was improved. See its [changelog](https://github.com/typst/hayagriva/blob/main/CHANGELOG.md) for more details. (**Breaking change**) - A few bugs with `.bib` file parsing were fixed - Removed `brackets` argument of `cite` function in favor of `form` - Visualization - Gradients and colors (thanks to [@Dherse](https://github.com/Dherse)) - Added support for [gradients]($gradient) on shapes and text - Supports linear, radial, and conic gradients - Added support for defining colors in more color spaces, including [Oklab]($color.oklab), [Linear RGB(A)]($color.linear-rgb), [HSL]($color.hsl), and [HSV]($color.hsv) - Added [`saturate`]($color.saturate), [`desaturate`]($color.desaturate), and [`rotate`]($color.rotate) functions on colors - Added [`color.map`]($color/#predefined-color-maps) module with predefined color maps that can be used with gradients - Rename `kind` function on colors to [`space`]($color.space) - Removed `to-rgba`, `to-cmyk`, and `to-luma` functions in favor of a new [`components`]($color.components) function - Improved rendering of [rectangles]($rect) with corner radius and varying stroke widths - Added support for properly clipping [boxes]($box.clip) and [blocks]($block.clip) with a border radius - Added `background` parameter to [`overline`]($overline), [`underline`]($underline), and [`strike`]($strike) functions - Fixed inaccurate color embedding in PDFs - Fixed ICC profile handling for images embedded in PDFs - Text and Layout - Added support for automatically adding proper [spacing]($text.cjk-latin-spacing) between CJK and Latin text (enabled by default) - Added support for automatic adjustment of more CJK punctuation - Added [`quote`]($quote) element for inserting inline and block quotes with optional attributions - Added [`raw.line`]($raw.line) element for customizing the display of individual lines of raw text, e.g. to add line numbers while keeping proper syntax highlighting - Added support for per-side [inset]($table.inset) customization to table function - Added Hungarian and Romanian translations - Added support for Czech hyphenation - Added support for setting custom [smart quotes]($smartquote) - The default [figure separator]($figure.caption.separator) now reacts to the currently set language and region - Improved line breaking of links / URLs (especially helpful for bibliographies with many URLs) - Improved handling of consecutive hyphens in justification algorithm - Fixed interaction of justification and hanging indent - Fixed a bug with line breaking of short lines without spaces when justification is enabled - Fixed font fallback for hyphen generated by hyphenation - Fixed handling of word joiner and other no-break characters during hyphenation - Fixed crash when hyphenating after an empty line - Fixed line breaking of composite emoji like 🏳️‍🌈 - Fixed missing text in some SVGs - Fixed font fallback in SVGs - Fixed behaviour of [`to`]($pagebreak.to) argument on `pagebreak` function - Fixed `{set align(..)}` for equations - Fixed spacing around [placed]($place) elements - Fixed coalescing of [`above`]($block.above) and [`below`]($block.below) spacing if given in em units and the font sizes differ - Fixed handling of `extent` parameter of [`underline`]($underline), [`overline`]($overline), and [`strike`]($strike) functions - Fixed crash for [floating placed elements]($place.float) with no specified vertical alignment - Partially fixed a bug with citations in footnotes - Math - Added `gap` argument for [`vec`]($math.vec.gap), [`mat`]($math.mat.gap), and [`cases`]($math.cases.gap) function - Added `size` argument for [`abs`]($math.abs), [`norm`]($math.norm), [`floor`]($math.floor), [`ceil`]($math.ceil), and [`round`]($math.round) functions - Added [`reverse`]($math.cases.reverse) parameter to cases function - Added support for multinomial coefficients to [`binom`]($math.binom) function - Removed `rotation` argument on [`cancel`]($math.cancel) function in favor of a new and more flexible `angle` argument (**Breaking change**) - Added `wide` constant, which inserts twice the spacing of `quad` - Added `csch` and `sech` [operators]($math.op) - `↼`, `⇀`, `↔`, and `⟷` can now be used as [accents]($math.accent) - Added `integral.dash`, `integral.dash.double`, and `integral.slash` [symbols]($category/symbols/sym) - Added support for specifying negative indices for [augmentation]($math.mat.augment) lines to position the line from the back - Fixed default color of matrix [augmentation]($math.mat.augment) lines - Fixed attachment of primes to inline expressions - Math content now respects the text [baseline]($text.baseline) setting - Performance - Fixed a bug related to show rules in templates which would effectively disable incremental compilation in affected documents - Micro-optimized code in several hot paths, which brings substantial performance gains, in particular in incremental compilations - Improved incremental parsing, which affects the whole incremental compilation pipeline - Added support for incremental parsing in the CLI - Added support for incremental SVG encoding during PDF export, which greatly improves export performance for documents with many SVG - Tooling and Diagnostics - Improved autocompletion for variables that are in-scope - Added autocompletion for package imports - Added autocompletion for [labels]($label) - Added tooltip that show which variables a function captures (when hovering over the equals sign or arrow of the function) - Diagnostics are now deduplicated - Improved diagnostics when trying to apply unary `+` or `-` to types that only support binary `+` and `-` - Error messages now state which label or citation key isn't present in the document or its bibliography - Fixed a bug where function argument parsing errors where shadowed by function execution errors (e.g. when trying to call [`array.sorted`]($array.sorted) and passing the key function as a positional argument instead of a named one). - Export - Added support for configuring the document's creation [`date`]($document.date). If the `date` is set to `{auto}` (the default), the PDF's creation date will be set to the current date and time. - Added support for configuring document [`keywords`]($document.keywords) - Generated PDFs now contain PDF document IDs - The PDF creator tool metadata now includes the Typst version - Web app - Added version picker to pin a project to an older compiler version (with support for Typst 0.6.0+) - Fixed desyncs between editor and compiler and improved overall stability - The app now continues to highlight the document when typing while the document is being compiled - Command line interface - Added support for discovering fonts through fontconfig - Now clears the screen instead of resetting the terminal - Now automatically picks correct file extension for selected output format - Now only regenerates images for changed pages when using `typst watch` with PNG or SVG export - Miscellaneous Improvements - Added [`version`]($version) type and `sys.version` constant specifying the current compiler version. Can be used to gracefully support multiple versions. - The U+2212 MINUS SIGN is now used when displaying a numeric value, in the [`repr`]($repr) of any numeric value and to replace a normal hyphen in text mode when before a digit. This improves, in particular, how negative integer values are displayed in math mode. - Added support for specifying a default value instead of failing for [`remove`] function in [array]($array.remove) and [dictionary]($dictionary.remove) - Simplified page setup guide examples - Switched the documentation from using the word "hashtag" to the word "hash" where appropriate - Added support for [`array.zip`]($array.zip) without any further arguments - Fixed crash when a plugin tried to read out of bounds memory - Fixed crashes when handling infinite [lengths]($length) - Fixed introspection (mostly bibliography) bugs due to weak page break close to the end of the document - Development - Extracted `typst::ide` into separate `typst_ide` crate - Removed a few remaining `'static` bounds on `&dyn World` - Removed unnecessary dependency, which reduces the binary size - Fixed compilation of `typst` by itself (without `typst-library`) - Fixed warnings with Nix flake when using `lib.getExe` ## Version 0.8.0 (September 13, 2023) { #v0.8.0 } - Scripting - Plugins (thanks to [@astrale-sharp](https://github.com/astrale-sharp) and [@arnaudgolfouse](https://github.com/arnaudgolfouse)) - Typst can now load [plugins]($plugin) that are compiled to WebAssembly - Anything that can be compiled to WebAssembly can thus be loaded as a plugin - These plugins are fully encapsulated (no access to file system or network) - Plugins can be shipped as part of [packages]($scripting/#packages) - Plugins work just the same in the web app - Types are now first-class values (**Breaking change**) - A [type]($type) is now itself a value - Some types can be called like functions (those that have a constructor), e.g. [`int`]($int) and [`str`]($str) - Type checks are now of the form `{type(10) == int}` instead of the old `{type(10) == "integer"}`. [Compatibility]($type/#compatibility) with the old way will remain for a while to give package authors time to upgrade, but it will be removed at some point. - Methods are now syntax sugar for calling a function scoped to a type, meaning that `{"hello".len()}` is equivalent to `{str.len("hello")}` - Added support for [`import`]($scripting/#modules) renaming with `as` - Added a [`duration`]($duration) type - Added support for [CBOR]($cbor) encoding and decoding - Added encoding and decoding functions from and to bytes for data formats: [`json.decode`]($json.decode), [`json.encode`]($json.encode), and similar functions for other formats - Added [`array.intersperse`]($array.intersperse) function - Added [`str.rev`]($str.rev) function - Added `calc.tau` constant - Made [bytes]($bytes) joinable and addable - Made [`array.zip`]($array.zip) function variadic - Fixed bug with [`eval`]($eval) when the `mode` was set to `{"math"}` - Fixed bug with [`ends-with`]($str.ends-with) function on strings - Fixed bug with destructuring in combination with break, continue, and return - Fixed argument types of [hyperbolic functions]($calc.cosh), they don't allow angles anymore (**Breaking change**) - Renamed some color methods: `rgba` becomes `to-rgba`, `cmyk` becomes `to-cmyk`, and `luma` becomes `to-luma` (**Breaking change**) - Export - Added SVG export (thanks to [@Enter-tainer](https://github.com/Enter-tainer)) - Fixed bugs with PDF font embedding - Added support for page labels that reflect the [page numbering]($page.numbering) style in the PDF - Text and Layout - Added [`highlight`]($highlight) function for highlighting text with a background color - Added [`polygon.regular`]($polygon.regular) function for drawing a regular polygon - Added support for tabs in [`raw`]($raw) elements alongside [`tab-width`]($raw.tab-size) parameter - The layout engine now tries to prevent "runts" (final lines consisting of just a single word) - Added Finnish translations - Added hyphenation support for Polish - Improved handling of consecutive smart quotes of different kinds - Fixed vertical alignments for [`number-align`]($page.number-align) argument on page function (**Breaking change**) - Fixed weak pagebreaks after counter updates - Fixed missing text in SVG when the text font is set to "New Computer Modern" - Fixed translations for Chinese - Fixed crash for empty text in show rule - Fixed leading spaces when there's a linebreak after a number and a comma - Fixed placement of floating elements in columns and other containers - Fixed sizing of block containing just a single box - Math - Added support for [augmented matrices]($math.mat.augment) - Removed support for automatic matching of fences like `|` and `||` as there were too many false positives. You can use functions like [`abs`]($math.abs) or [`norm`]($math.norm) or an explicit [`lr`]($math.lr) call instead. (**Breaking change**) - Fixed spacing after number with decimal point in math - Fixed bug with primes in subscript - Fixed weak spacing - Fixed crash when text within math contains a newline - Tooling and Diagnostics - Added hints when trying to call a function stored in a dictionary without extra parentheses - Fixed hint when referencing an equation without numbering - Added more details to some diagnostics (e.g. when SVG decoding fails) - Command line interface - Added `typst update` command for self-updating the CLI (thanks to [@jimvdl](https://github.com/jimvdl)) - Added download progress indicator for packages and updates - Added `--format` argument to explicitly specify the output format - The CLI now respects proxy configuration through environment variables and has a new `--cert` option for setting a custom CA certificate - Fixed crash when field wasn't present and `--one` is passed to `typst query` - Miscellaneous Improvements - Added [page setup guide]($guides/page-setup-guide) - Added [`figure.caption`]($figure.caption) function that can be used for simpler figure customization (**Breaking change** because `it.caption` now renders the full caption with supplement in figure show rules and manual outlines) - Moved `caption-pos` argument to `figure.caption` function and renamed it to `position` (**Breaking change**) - Added [`separator`]($figure.caption.separator) argument to `figure.caption` function - Added support for combination of and/or and before/after [selectors]($selector) - Packages can now specify a [minimum compiler version](https://github.com/typst/packages#package-format) they require to work - Fixed parser bug where method calls could be moved onto their own line for `[#let]` expressions in markup (**Breaking change**) - Fixed bugs in sentence and title case conversion for bibliographies - Fixed supplements for alphanumeric and author-title bibliography styles - Fixed off-by-one error in APA bibliography style - Development - Made `Span` and `FileId` more type-safe so that all error conditions must be handled by `World` implementors ## Version 0.7.0 (August 7, 2023) { #v0.7.0 } - Text and Layout - Added support for floating figures through the [`placement`]($figure.placement) argument on the figure function - Added support for arbitrary floating content through the [`float`]($place.float) argument on the place function - Added support for loading `.sublime-syntax` files as highlighting [syntaxes]($raw.syntaxes) for raw blocks - Added support for loading `.tmTheme` files as highlighting [themes]($raw.theme) for raw blocks - Added _bounds_ option to [`top-edge`]($text.top-edge) and [`bottom-edge`]($text.bottom-edge) arguments of text function for tight bounding boxes - Removed nonsensical top- and bottom-edge options, e.g. _ascender_ for the bottom edge (**Breaking change**) - Added [`script`]($text.script) argument to text function - Added [`alternative`]($smartquote.alternative) argument to smart quote function - Added basic i18n for Japanese - Added hyphenation support for `nb` and `nn` language codes in addition to `no` - Fixed positioning of [placed elements]($place) in containers - Fixed overflowing containers due to optimized line breaks - Export - Greatly improved export of SVG images to PDF. Many thanks to [@LaurenzV](https://github.com/LaurenzV) for their work on this. - Added support for the alpha channel of RGBA colors in PDF export - Fixed a bug with PPI (pixels per inch) for PNG export - Math - Improved layout of primes (e.g. in `[$a'_1$]`) - Improved display of multi-primes (e.g. in `[$a''$]`) - Improved layout of [roots]($math.root) - Changed relations to show attachments as [limits]($math.limits) by default (e.g. in `[$a ->^x b$]`) - Large operators and delimiters are now always vertically centered - [Boxes]($box) in equations now sit on the baseline instead of being vertically centered by default. Notably, this does not affect [blocks]($block) because they are not inline elements. - Added support for [weak spacing]($h.weak) - Added support for OpenType character variants - Added support for customizing the [math class]($math.class) of content - Fixed spacing around `.`, `\/`, and `...` - Fixed spacing between closing delimiters and large operators - Fixed a bug with math font weight selection - Symbols and Operators (**Breaking changes**) - Added `id`, `im`, and `tr` text [operators]($math.op) - Renamed `ident` to `equiv` with alias `eq.triple` and removed `ident.strict` in favor of `eq.quad` - Renamed `ast.sq` to `ast.square` and `integral.sq` to `integral.square` - Renamed `.eqq` modifier to `.equiv` (and `.neqq` to `.nequiv`) for `tilde`, `gt`, `lt`, `prec`, and `succ` - Added `emptyset` as alias for `nothing` - Added `lt.curly` and `gt.curly` as aliases for `prec` and `succ` - Added `aleph`, `beth`, and `gimmel` as alias for `alef`, `bet`, and `gimel` - Scripting - Fields - Added `abs` and `em` field to [lengths]($length) - Added `ratio` and `length` field to [relative lengths]($relative) - Added `x` and `y` field to [2d alignments]($align.alignment) - Added `paint`, `thickness`, `cap`, `join`, `dash`, and `miter-limit` field to [strokes]($stroke) - Accessor and utility methods - Added [`dedup`]($array.dedup) method to arrays - Added `pt`, `mm`, `cm`, and `inches` method to [lengths]($length) - Added `deg` and `rad` method to [angles]($angle) - Added `kind`, `hex`, `rgba`, `cmyk`, and `luma` method to [colors]($color) - Added `axis`, `start`, `end`, and `inv` method to [directions]($stack.dir) - Added `axis` and `inv` method to [alignments]($align.alignment) - Added `inv` method to [2d alignments]($align.alignment) - Added `start` argument to [`enumerate`]($array.enumerate) method on arrays - Added [`color.mix`]($color.mix) function - Added `mode` and `scope` arguments to [`eval`]($eval) function - Added [`bytes`]($bytes) type for holding large byte buffers - Added [`encoding`]($read.encoding) argument to read function to read a file as bytes instead of a string - Added [`image.decode`]($image.decode) function for decoding an image directly from a string or bytes - Added [`bytes`]($bytes) function for converting a string or an array of integers to bytes - Added [`array`]($array) function for converting bytes to an array of integers - Added support for converting bytes to a string with the [`str`]($str) function - Tooling and Diagnostics - Added support for compiler warnings - Added warning when compilation does not converge within five attempts due to intense use of introspection features - Added warnings for empty emphasis (`__` and `**`) - Improved error message for invalid field assignments - Improved error message after single `#` - Improved error message when a keyword is used where an identifier is expected - Fixed parameter autocompletion for functions that are in modules - Import autocompletion now only shows the latest package version until a colon is typed - Fixed autocompletion for dictionary key containing a space - Fixed autocompletion for for loops - Command line interface - Added `typst query` subcommand to execute a [query]($reference/meta/query/#command-line-queries) on the command line - The `--root` and `--font-paths` arguments cannot appear in front of the command anymore (**Breaking change**) - Local and cached packages are now stored in directories of the form `[{namespace}/{name}/{version}]` instead of `[{namespace}/{name}-{version}]` (**Breaking change**) - Now prioritizes explicitly given fonts (via `--font-paths`) over system and embedded fonts when both exist - Fixed `typst watch` not working with some text editors - Fixed displayed compilation time (now includes export) - Miscellaneous Improvements - Added [`bookmarked`]($heading.bookmarked) argument to heading to control whether a heading becomes part of the PDF outline - Added [`caption-pos`]($figure.caption.position) argument to control the position of a figure's caption - Added [`metadata`]($metadata) function for exposing an arbitrary value to the introspection system - Fixed that a [`state`]($state) was identified by the pair `(key, init)` instead of just its `key` - Improved indent logic of [enumerations]($enum). Instead of requiring at least as much indent as the end of the marker, they now require only one more space indent than the start of the marker. As a result, even long markers like `12.` work with just 2 spaces of indent. - Fixed bug with indent logic of [`raw`]($raw) blocks - Fixed a parsing bug with dictionaries - Development - Extracted parser and syntax tree into `typst-syntax` crate - The `World::today` implementation of Typst dependants may need fixing if they have the same [bug](https://github.com/typst/typst/issues/1842) that the CLI world had ## Version 0.6.0 (June 30, 2023) { #v0.6.0 } - Package Management - Typst now has built-in [package management]($scripting/#packages) - You can import [published]($packages) community packages or create and use [system-local](https://github.com/typst/packages#local-packages) ones - Published packages are also supported in the web app - Math - Added support for optical size variants of glyphs in math mode - Added argument to enable [`limits`]($math.limits) conditionally depending on whether the equation is set in [`display`]($math.display) or [`inline`]($math.inline) style - Added `gt.eq.slant` and `lt.eq.slant` symbols - Increased precedence of factorials in math mode (`[$1/n!$]` works correctly now) - Improved [underlines]($math.underline) and [overlines]($math.overline) in math mode - Fixed usage of [`limits`]($math.limits) function in show rules - Fixed bugs with line breaks in equations - Text and Layout - Added support for alternating page [margins]($page.margin) with the `inside` and `outside` keys - Added support for specifying the page [`binding`]($page.binding) - Added [`to`]($pagebreak.to) argument to pagebreak function to skip to the next even or odd page - Added basic i18n for a few more languages (TR, SQ, TL) - Fixed bug with missing table row at page break - Fixed bug with [underlines]($underline) - Fixed bug superfluous table lines - Fixed smart quotes after line breaks - Fixed a crash related to text layout - Command line interface - **Breaking change:** Added requirement for `--root`/`TYPST_ROOT` directory to contain the input file because it designates the _project_ root. Existing setups that use `TYPST_ROOT` to emulate package management should switch to [local packages](https://github.com/typst/packages#local-packages) - **Breaking change:** Now denies file access outside of the project root - Added support for local packages and on-demand package download - Now watches all relevant files, within the root and all packages - Now displays compilation time - Miscellaneous Improvements - Added [`outline.entry`]($outline.entry) to customize outline entries with show rules - Added some hints for error messages - Added some missing syntaxes for [`raw`]($raw) highlighting - Improved rendering of rotated images in PNG export and web app - Made [footnotes]($footnote) reusable and referenceable - Fixed bug with citations and bibliographies in [`locate`]($locate) - Fixed inconsistent tense in documentation - Development - Added [contribution guide](https://github.com/typst/typst/blob/main/CONTRIBUTING.md) - Reworked `World` interface to accommodate for package management and make it a bit simpler to implement _(Breaking change for implementors)_ ## Version 0.5.0 (June 9, 2023) { #v0.5.0 } - Text and Layout - Added [`raw`]($raw) syntax highlighting for many more languages - Added support for Korean [numbering]($numbering) - Added basic i18n for a few more languages (NL, SV, DA) - Improved line breaking for East Asian languages - Expanded functionality of outline [`indent`]($outline.indent) property - Fixed footnotes in columns - Fixed page breaking bugs with [footnotes]($footnote) - Fixed bug with handling of footnotes in lists, tables, and figures - Fixed a bug with CJK punctuation adjustment - Fixed a crash with rounded rectangles - Fixed alignment of [`line`]($line) elements - Math - **Breaking change:** The syntax rules for mathematical [attachments]($math.attach) were improved: `[$f^abs(3)$]` now parses as `[$f^(abs(3))$]` instead of `[$(f^abs)(3)$]`. To disambiguate, add a space: `[$f^zeta (3)$]`. - Added [forced size]($category/math/sizes) commands for math (e.g., [`display`]($math.display)) - Added [`supplement`]($math.equation.supplement) parameter to [`equation`]($math.equation), used by [references]($ref) - New [symbols]($category/symbols/sym): `bullet`, `xor`, `slash.big`, `sigma.alt`, `tack.r.not`, `tack.r.short`, `tack.r.double.not` - Fixed a bug with symbols in matrices - Fixed a crash in the [`attach`]($math.attach) function - Scripting - Added new [`datetime`]($datetime) type and [`datetime.today`]($datetime.today) to retrieve the current date - Added [`str.from-unicode`]($str.from-unicode) and [`str.to-unicode`]($str.to-unicode) functions - Added [`fields`]($content.fields) method on content - Added `base` parameter to [`str`]($str) function - Added [`calc.exp`]($calc.exp) and [`calc.ln`]($calc.ln) - Improved accuracy of [`calc.pow`]($calc.pow) and [`calc.log`]($calc.log) for specific bases - Fixed [removal]($dictionary.remove) order for dictionary - Fixed `.at(default: ..)` for [strings]($str.at) and [content]($content.at) - Fixed field access on styled elements - Removed deprecated `calc.mod` function - Command line interface - Added PNG export via `typst compile source.typ output-{n}.png`. The output path must contain `[{n}]` if the document has multiple pages. - Added `--diagnostic-format=short` for Unix-style short diagnostics - Doesn't emit color codes anymore if stderr isn't a TTY - Now sets the correct exit when invoked with a non-existent file - Now ignores UTF-8 BOM in Typst files - Miscellaneous Improvements - Improved errors for mismatched delimiters - Improved error message for failed length comparisons - Fixed a bug with images not showing up in Apple Preview - Fixed multiple bugs with the PDF outline - Fixed citations and other searchable elements in [`hide`]($hide) - Fixed bugs with [reference supplements]($ref.supplement) - Fixed Nix flake ## Version 0.4.0 (May 20, 2023) { #v0.4.0 } - Footnotes - Implemented support for footnotes - The [`footnote`]($footnote) function inserts a footnote - The [`footnote.entry`]($footnote.entry) function can be used to customize the footnote listing - The `{"chicago-notes"}` [citation style]($cite.style) is now available - Documentation - Added a [Guide for LaTeX users]($guides/guide-for-latex-users) - Now shows default values for optional arguments - Added richer outlines in "On this Page" - Added initial support for search keywords: "Table of Contents" will now find the [outline]($outline) function. Suggestions for more keywords are welcome! - Fixed issue with search result ranking - Fixed many more small issues - Math - **Breaking change**: Alignment points (`&`) in equations now alternate between left and right alignment - Added support for writing roots with Unicode: For example, `[$root(x+y)$]` can now also be written as `[$√(x+y)$]` - Fixed uneven vertical [`attachment`]($math.attach) alignment - Fixed spacing on decorated elements (e.g., spacing around a [canceled]($math.cancel) operator) - Fixed styling for stretchable symbols - Added `tack.r.double`, `tack.l.double`, `dotless.i` and `dotless.j` [symbols]($category/symbols/sym) - Fixed show rules on symbols (e.g. `{show sym.tack: set text(blue)}`) - Fixed missing rename from `ast.op` to `ast` that should have been in the previous release - Scripting - Added function scopes: A function can now hold related definitions in its own scope, similar to a module. The new [`assert.eq`]($assert.eq) function, for instance, is part of the [`assert`]($assert) function's scope. Note that function scopes are currently only available for built-in functions. - Added [`assert.eq`]($assert.eq) and [`assert.ne`]($assert.ne) functions for simpler equality and inequality assertions with more helpful error messages - Exposed [list]($list.item), [enum]($enum.item), and [term list]($terms.item) items in their respective functions' scope - The `at` methods on [strings]($str.at), [arrays]($array.at), [dictionaries]($dictionary.at), and [content]($content.at) now support specifying a default value - Added support for passing a function to [`replace`]($str.replace) that is called with each match. - Fixed [replacement]($str.replace) strings: They are now inserted completely verbatim instead of supporting the previous (unintended) magic dollar syntax for capture groups - Fixed bug with trailing placeholders in destructuring patterns - Fixed bug with underscore in parameter destructuring - Fixed crash with nested patterns and when hovering over an invalid pattern - Better error messages when casting to an [integer]($int) or [float]($float) fails - Text and Layout - Implemented sophisticated CJK punctuation adjustment - Disabled [overhang]($text.overhang) for CJK punctuation - Added basic translations for Traditional Chinese - Fixed [alignment]($raw.align) of text inside raw blocks (centering a raw block, e.g. through a figure, will now keep the text itself left-aligned) - Added support for passing a array instead of a function to configure table cell [alignment]($table.align) and [fill]($table.fill) per column - Fixed automatic figure [`kind`]($figure.kind) detection - Made alignment of [enum numbers]($enum.number-align) configurable, defaulting to `end` - Figures can now be made breakable with a show-set rule for blocks in figure - Initial fix for smart quotes in RTL languages - Export - Fixed ligatures in PDF export: They are now copyable and searchable - Exported PDFs now embed ICC profiles for images that have them - Fixed export of strokes with zero thickness - Web app - Projects can now contain folders - Added upload by drag-and-drop into the file panel - Files from the file panel can now be dragged into the editor to insert them into a Typst file - You can now copy-paste images and other files from your computer directly into the editor - Added a button to resend confirmation email - Added an option to invert preview colors in dark mode - Added tips to the loading screen and the Help menu. Feel free to propose more! - Added syntax highlighting for YAML files - Allowed middle mouse button click on many buttons to navigate into a new tab - Allowed more project names - Fixed overridden Vim mode keybindings - Fixed many bugs regarding file upload and more - Miscellaneous Improvements - Improved performance of counters, state, and queries - Improved incremental parsing for more efficient recompilations - Added support for `.yaml` extension in addition to `.yml` for bibliographies - The CLI now emits escape codes only if the output is a TTY - For users of the `typst` crate: The `Document` is now `Sync` again and the `World` doesn't have to be `'static` anymore ## Version 0.3.0 (April 26, 2023) { #v0.3.0 } - **Breaking changes:** - Renamed a few symbols: What was previous `dot.op` is now just `dot` and the basic dot is `dot.basic`. The same applies to `ast` and `tilde`. - Renamed `mod` to [`rem`]($calc.rem) to more accurately reflect the behaviour. It will remain available as `mod` until the next update as a grace period. - A lone underscore is not a valid identifier anymore, it can now only be used in patterns - Removed `before` and `after` arguments from [`query`]($query). This is now handled through flexible [selectors]($selector) combinator methods - Added support for [attachments]($math.attach) (sub-, superscripts) that precede the base symbol. The `top` and `bottom` arguments have been renamed to `t` and `b`. - New features - Added support for more complex [strokes]($stroke) (configurable caps, joins, and dash patterns) - Added [`cancel`]($math.cancel) function for equations - Added support for [destructuring]($scripting/#bindings) in argument lists and assignments - Added [`alt`]($image.alt) text argument to image function - Added [`toml`]($toml) function for loading data from a TOML file - Added [`zip`]($array.zip), [`sum`]($array.sum), and [`product`]($array.product) methods for arrays - Added `fact`, `perm`, `binom`, `gcd`, `lcm`, `atan2`, `quo`, `trunc`, and `fract` [calculation]($category/foundations/calc) functions - Improvements - Text in SVGs now displays properly - Typst now generates a PDF heading outline - [References]($ref) now provides the referenced element as a field in show rules - Refined linebreak algorithm for better Chinese justification - Locations are now a valid kind of selector - Added a few symbols for algebra - Added Spanish smart quote support - Added [`selector`]($selector) function to turn a selector-like value into a selector on which combinator methods can be called - Improved some error messages - The outline and bibliography headings can now be styled with show-set rules - Operations on numbers now produce an error instead of overflowing - Bug fixes - Fixed wrong linebreak before punctuation that follows inline equations, citations, and other elements - Fixed a bug with [argument sinks]($arguments) - Fixed strokes with thickness zero - Fixed hiding and show rules in math - Fixed alignment in matrices - Fixed some alignment bugs in equations - Fixed grid cell alignment - Fixed alignment of list marker and enum markers in presence of global alignment settings - Fixed [path]($path) closing - Fixed compiler crash with figure references - A single trailing line breaks is now ignored in math, just like in text - Command line interface - Font path and compilation root can now be set with the environment variables `TYPST_FONT_PATHS` and `TYPST_ROOT` - The output of `typst fonts` now includes the embedded fonts - Development - Added instrumentation for debugging and optimization - Added `--update` flag and `UPDATE_EXPECT` environment variable to update reference images for tests - You can now run a specific subtest with `--subtest` - Tests now run on multiple threads ## Version 0.2.0 (April 11, 2023) { #v0.2.0 } - **Breaking changes:** - Removed support for iterating over index and value in [for loops]($scripting/#loops). This is now handled via unpacking and enumerating. Same goes for the [`map`]($array.map) method. - [Dictionaries]($dictionary) now iterate in insertion order instead of alphabetical order. - New features - Added [unpacking syntax]($scripting/#bindings) for let bindings, which allows things like `{let (1, 2) = array}` - Added [`enumerate`]($array.enumerate) method - Added [`path`]($path) function for drawing Bézier paths - Added [`layout`]($layout) function to access the size of the surrounding page or container - Added `key` parameter to [`sorted`]($array.sorted) method - Command line interface - Fixed `--open` flag blocking the program - New Computer Modern font is now embedded into the binary - Shell completions and man pages can now be generated by setting the `GEN_ARTIFACTS` environment variable to a target directory and then building Typst - Miscellaneous improvements - Fixed page numbering in outline - Added basic i18n for a few more languages (AR, NB, CS, NN, PL, SL, ES, UA, VI) - Added a few numbering patterns (Ihora, Chinese) - Added `sinc` [operator]($math.op) - Fixed bug where math could not be hidden with [`hide`]($hide) - Fixed sizing issues with box, block, and shapes - Fixed some translations - Fixed inversion of "R" in [`cal`]($math.cal) and [`frak`]($math.frak) styles - Fixed some styling issues in math - Fixed supplements of references to headings - Fixed syntax highlighting of identifiers in certain scenarios - [Ratios]($ratio) can now be multiplied with more types and be converted to [floats]($float) with the [`float`]($float) function ## Version 0.1.0 (April 04, 2023) { #v0.1.0 } - **Breaking changes:** - When using the CLI, you now have to use subcommands: - `typst compile file.typ` or `typst c file.typ` to create a PDF - `typst watch file.typ` or `typst w file.typ` to compile and watch - `typst fonts` to list all fonts - Manual counters now start at zero. Read the "How to step" section [here]($counter) for more details - The [bibliography styles]($bibliography.style) `{"author-date"}` and `{"author-title"}` were renamed to `{"chicago-author-date"}` and `{"chicago-author-title"}` - Figure improvements - Figures now automatically detect their content and adapt their behaviour. Figures containing tables, for instance, are automatically prefixed with "Table X" and have a separate counter - The figure's supplement (e.g. "Figure" or "Table") can now be customized - In addition, figures can now be completely customized because the show rule gives access to the automatically resolved kind, supplement, and counter - Bibliography improvements - The [`bibliography`]($bibliography) now also accepts multiple bibliography paths (as an array) - Parsing of BibLaTeX files is now more permissive (accepts non-numeric edition, pages, volumes, dates, and Jabref-style comments; fixed abbreviation parsing) - Labels and references can now include `:` and `.` except at the end - Fixed APA bibliography ordering - Drawing additions - Added [`polygon`]($polygon) function for drawing polygons - Added support for clipping in [boxes]($box.clip) and [blocks]($block.clip) - Command line interface - Now returns with non-zero status code if there is an error - Now watches the root directory instead of the current one - Now puts the PDF file next to input file by default - Now accepts more kinds of input files (e.g. `/dev/stdin`) - Added `--open` flag to directly open the PDF - Miscellaneous improvements - Added [`yaml`]($yaml) function to load data from YAML files - Added basic i18n for a few more languages (IT, RU, ZH, FR, PT) - Added numbering support for Hebrew - Added support for [integers]($int) with base 2, 8, and 16 - Added symbols for double bracket and laplace operator - The [`link`]($link) function now accepts [labels]($label) - The link syntax now allows more characters - Improved justification of Japanese and Chinese text - Calculation functions behave more consistently w.r.t to non-real results - Replaced deprecated angle brackets - Reduced maximum function call depth from 256 to 64 - Fixed [`first-line-indent`]($par.first-line-indent) being not applied when a paragraph starts with styled text - Fixed extraneous spacing in unary operators in equations - Fixed block spacing, e.g. in `{block(above: 1cm, below: 1cm, ..)}` - Fixed styling of text operators in math - Fixed invalid parsing of language tag in raw block with a single backtick - Fixed bugs with displaying counters and state - Fixed crash related to page counter - Fixed crash when [`symbol`]($symbol) function was called without arguments - Fixed crash in bibliography generation - Fixed access to label of certain content elements - Fixed line number in error message for CSV parsing - Fixed invalid autocompletion after certain markup elements ## March 28, 2023 { #_ } - **Breaking changes:** - Enumerations now require a space after their marker, that is, `[1.ok]` must now be written as `[1. ok]` - Changed default style for [term lists]($terms): Does not include a colon anymore and has a bit more indent - Command line interface - Added `--font-path` argument for CLI - Embedded default fonts in CLI binary - Fixed build of CLI if `git` is not installed - Miscellaneous improvements - Added support for disabling [matrix]($math.mat) and [vector]($math.vec) delimiters. Generally with `[#set math.mat(delim: none)]` or one-off with `[$mat(delim: #none, 1, 2; 3, 4)$]`. - Added [`separator`]($terms.separator) argument to term lists - Added [`round`]($math.round) function for equations - Numberings now allow zeros. To reset a counter, you can write `[#counter(..).update(0)]` - Added documentation for `{page()}` and `{position()}` methods on [`location`]($location) type - Added symbols for double, triple, and quadruple dot accent - Added smart quotes for Norwegian Bokmål - Added Nix flake - Fixed bibliography ordering in IEEE style - Fixed parsing of decimals in math: `[$1.2/3.4$]` - Fixed parsing of unbalanced delimiters in fractions: `[$1/(2 (x)$]` - Fixed unexpected parsing of numbers as enumerations, e.g. in `[1.2]` - Fixed combination of page fill and header - Fixed compiler crash if [`repeat`]($repeat) is used in page with automatic width - Fixed [matrices]($math.mat) with explicit delimiter - Fixed [`indent`]($terms.indent) property of term lists - Numerous documentation fixes - Links in bibliographies are now affected by link styling - Fixed hovering over comments in web app ## March 21, 2023 { #_ } - Reference and bibliography management - [Bibliographies]($bibliography) and [citations]($cite) (currently supported styles are APA, Chicago Author Date, IEEE, and MLA) - You can now [reference]($ref) sections, figures, formulas, and works from the bibliography with `[@label]` - You can make an element referenceable with a label: - `[= Introduction ]` - `[$ A = pi r^2 $ ]` - Introspection system for interactions between different parts of the document - [`counter`]($counter) function - Access and modify counters for pages, headings, figures, and equations - Define and use your own custom counters - Time travel: Find out what the counter value was or will be at some other point in the document (e.g. when you're building a list of figures, you can determine the value of the figure counter at any given figure). - Counters count in layout order and not in code order - [`state`]($state) function - Manage arbitrary state across your document - Time travel: Find out the value of your state at any position in the document - State is modified in layout order and not in code order - [`query`]($query) function - Find all occurrences of an element or a label, either in the whole document or before/after some location - Link to elements, find out their position on the pages and access their fields - Example use cases: Custom list of figures or page header with current chapter title - [`locate`]($locate) function - Determines the location of itself in the final layout - Can be accessed to get the `page` and `x`, `y` coordinates - Can be used with counters and state to find out their values at that location - Can be used with queries to find elements before or after its location - New [`measure`]($measure) function - Measure the layouted size of elements - To be used in combination with the new [`style`]($style) function that lets you generate different content based on the style context something is inserted into (because that affects the measured size of content) - Exposed content representation - Content is not opaque anymore - Content can be compared for equality - The tree of content elements can be traversed with code - Can be observed in hover tooltips or with [`repr`]($repr) - New [methods]($content) on content: `func`, `has`, `at`, and `location` - All optional fields on elements are now settable - More uniform field names (`heading.title` becomes `heading.body`, `list.items` becomes `list.children`, and a few more changes) - Further improvements - Added [`figure`]($figure) function - Added [`numbering`]($math.equation.numbering) parameter on equation function - Added [`numbering`]($page.numbering) and [`number-align`]($page.number-align) parameters on page function - The page function's [`header`]($page.header) and [`footer`]($page.footer) parameters do not take functions anymore. If you want to customize them based on the page number, use the new [`numbering`]($page.numbering) parameter or [`counter`]($counter) function instead. - Added [`footer-descent`]($page.footer-descent) and [`header-ascent`]($page.header-ascent) parameters - Better default alignment in header and footer - Fixed Arabic vowel placement - Fixed PDF font embedding issues - Renamed `math.formula` to [`math.equation`]($math.equation) - Font family must be a named argument now: `[#set text(font: "..")]` - Added support for [hanging indent]($par.hanging-indent) - Renamed paragraph `indent` to [`first-line-indent`]($par.first-line-indent) - More accurate [logarithm]($calc.log) when base is `2` or `10` - Improved some error messages - Fixed layout of [`terms`]($terms) list - Web app improvements - Added template gallery - Added buttons to insert headings, equations, raw blocks, and references - Jump to the source of something by clicking on it in the preview panel (works for text, equations, images, and more) - You can now upload your own fonts and use them in your project - Hover debugging and autocompletion now takes multiple files into account and works in show rules - Hover tooltips now automatically collapse multiple consecutive equal values - The preview now automatically scrolls to the right place when you type - Links are now clickable in the preview area - Toolbar, preview, and editor can now all be hidden - Added autocompletion for raw block language tags - Added autocompletion in SVG files - New back button instead of four-dots button - Lots of bug fixes ## February 25, 2023 { #_ } - Font changes - New default font: Linux Libertine - New default font for raw blocks: DejaVu Sans Mono - New default font for math: Book weight of New Computer Modern Math - Lots of new math fonts available - Removed Latin Modern fonts in favor of New Computer Modern family - Removed unnecessary smallcaps fonts which are already accessible through the corresponding main font and the [`smallcaps`]($smallcaps) function - Improved default spacing for headings - Added [`panic`]($panic) function - Added [`clusters`]($str.clusters) and [`codepoints`]($str.codepoints) methods for strings - Support for multiple authors in [`set document`]($document.author) - Fixed crash when string is accessed at a position that is not a char boundary - Fixed semicolon parsing in `[#var ;]` - Fixed incremental parsing when inserting backslash at end of `[#"abc"]` - Fixed names of a few font families (including Noto Sans Symbols and New Computer Modern families) - Fixed autocompletion for font families - Improved incremental compilation for user-defined functions ## February 15, 2023 { #_ } - [Box]($box) and [block]($block) have gained `fill`, `stroke`, `radius`, and `inset` properties - Blocks may now be explicitly sized, fixed-height blocks can still break across pages - Blocks can now be configured to be [`breakable`]($block.breakable) or not - [Numbering style]($enum.numbering) can now be configured for nested enums - [Markers]($list.marker) can now be configured for nested lists - The [`eval`]($eval) function now expects code instead of markup and returns an arbitrary value. Markup can still be evaluated by surrounding the string with brackets. - PDFs generated by Typst now contain XMP metadata - Link boxes are now disabled in PDF output - Tables don't produce small empty cells before a pagebreak anymore - Fixed raw block highlighting bug ## February 12, 2023 { #_ } - Shapes, images, and transformations (move/rotate/scale/repeat) are now block-level. To integrate them into a paragraph, use a [`box`]($box) as with other elements. - A colon is now required in an "everything" show rule: Write `{show: it => ..}` instead of `{show it => ..}`. This prevents intermediate states that ruin your whole document. - Non-math content like a shape or table in a math formula is now centered vertically - Support for widow and orphan prevention within containers - Support for [RTL]($text.dir) in lists, grids, and tables - Support for explicit `{auto}` sizing for boxes and shapes - Support for fractional (i.e. `{1fr}`) widths for boxes - Fixed bug where columns jump to next page - Fixed bug where list items have no leading - Fixed relative sizing in lists, squares and grid auto columns - Fixed relative displacement in [`place`]($place) function - Fixed that lines don't have a size - Fixed bug where `{set document(..)}` complains about being after content - Fixed parsing of `{not in}` operation - Fixed hover tooltips in math - Fixed bug where a heading show rule may not contain a pagebreak when an outline is present - Added [`baseline`]($box.baseline) property on [`box`]($box) - Added [`tg`]($math.op) and [`ctg`]($math.op) operators in math - Added delimiter setting for [`cases`]($math.cases) function - Parentheses are now included when accepting a function autocompletion ## February 2, 2023 { #_ } - Merged text and math symbols, renamed a few symbols (including `infty` to `infinity` with the alias `oo`) - Fixed missing italic mappings - Math italics correction is now applied properly - Parentheses now scale in `[$zeta(x/2)$]` - Fixed placement of large root index - Fixed spacing in `[$abs(-x)$]` - Fixed inconsistency between text and identifiers in math - Accents are now ignored when positioning superscripts - Fixed vertical alignment in matrices - Fixed `text` set rule in `raw` show rule - Heading and list markers now parse consistently - Allow arbitrary math directly in content ## January 30, 2023 { #_ } [Go to the announcement blog post.](https://typst.app/blog/2023/january-update) - New expression syntax in markup/math - Blocks cannot be directly embedded in markup anymore - Like other expressions, they now require a leading hash - More expressions available with hash, including literals (`[#"string"]`) as well as field access and method call without space: `[#emoji.face]` - New import syntax - `[#import "module.typ"]` creates binding named `module` - `[#import "module.typ": a, b]` or `[#import "module.typ": *]` to import items - `[#import emoji: face, turtle]` to import from already bound module - New symbol handling - Removed symbol notation - Symbols are now in modules: `{sym}`, `{emoji}`, and `{math}` - Math module also reexports all of `{sym}` - Modified through field access, still order-independent - Unknown modifiers are not allowed anymore - Support for custom symbol definitions with `symbol` function - Symbols now listed in documentation - New `{math}` module - Contains all math-related functions - Variables and function calls directly in math (without hash) access this module instead of the global scope, but can also access local variables - Can be explicitly used in code, e.g. `[#set math.vec(delim: "[")]` - Delimiter matching in math - Any opening delimiters matches any closing one - When matched, they automatically scale - To prevent scaling, escape them - To forcibly match two delimiters, use `lr` function - Line breaks may occur between matched delimiters - Delimiters may also be unbalanced - You can also use the `lr` function to scale the brackets (or just one bracket) to a specific size manually - Multi-line math with alignment - The `\` character inserts a line break - The `&` character defines an alignment point - Alignment points also work for underbraces, vectors, cases, and matrices - Multiple alignment points are supported - More capable math function calls - Function calls directly in math can now take code expressions with hash - They can now also take named arguments - Within math function calls, semicolons turn preceding arguments to arrays to support matrices: `[$mat(1, 2; 3, 4)$]` - Arbitrary content in math - Text, images, and other arbitrary content can now be embedded in math - Math now also supports font fallback to support e.g. CJK and emoji - More math features - New text operators: `op` function, `lim`, `max`, etc. - New matrix function: `mat` - New n-ary roots with `root` function: `[$root(3, x)$]` - New under- and overbraces, -brackets, and -lines - New `abs` and `norm` functions - New shorthands: `[|`, `|]`, and `||` - New `attach` function, overridable attachments with `script` and `limit` - Manual spacing in math, with `h`, `thin`, `med`, `thick` and `quad` - Symbols and other content may now be used like a function, e.g. `[$zeta(x)$]` - Added Fira Math font, removed Noto Sans Math font - Support for alternative math fonts through `[#show math.formula: set text("Fira Math")]` - More library improvements - New `calc` module, `abs`, `min`, `max`, `even`, `odd` and `mod` moved there - New `message` argument on `{assert}` function - The `pairs` method on dictionaries now returns an array of length-2 arrays instead of taking a closure - The method call `{dict.at("key")}` now always fails if `"key"` doesn't exist Previously, it was allowed in assignments. Alternatives are `{dict.key = x}` and `{dict.insert("key", x)}`. - Smarter editor functionality - Autocompletion for local variables - Autocompletion for methods available on a value - Autocompletion for symbols and modules - Autocompletion for imports - Hover over an identifier to see its value(s) - Further editor improvements - New Font menu with previews - Single projects may now be shared with share links - New dashboard experience if projects are shared with you - Keyboard Shortcuts are now listed in the menus and there are more of them - New Offline indicator - Tooltips for all buttons - Improved account protection - Moved Status indicator into the error list button - Further fixes - Multiple bug fixes for incremental parser - Fixed closure parameter capturing - Fixed tons of math bugs - Bugfixes for performance, file management, editing reliability - Added redirection to the page originally navigated to after signin