[View changelog with more links on typst.app](https://typst.app/docs/changelog)
- Tables (thanks to [PgBiel](https://github.com/PgBiel))
- Tables are now _much_ more flexible, read the new [table guide](https://typst.app/docs/guides/table-guide/) to get started
- Added `table.cell` element for per-cell configuration
- Cells can now span multiple columns or rows
- The stroke of individual cells can now be customized
- The `align` and `inset` arguments of the table function now also take `(x, y) => ..` functions
- Added `table.hline` and `table.vline` for convenient line customization
- Added `table.header` element for table headers that repeat on every page
- Added `table.footer` element for table footers that repeat on every page
- All the new table functionality is also available for grids
- Fixed gutter-related bugs
- Templates
- You can now use template packages to get started with new projects. Click _Start from template_ on the web app's dashboard and choose your preferred template or run the `typst init <template>` command in the CLI. You can [browse the available templates here](https://typst.app/universe/search/?kind=templates).
- Switching templates after the fact has become easier. You can just import a styling function from a different template package.
- Package authors can now submit their own templates to the [package repository](https://github.com/typst/packages). Share a template for a paper, your institution, or an original work to help the community get a head start on their projects.
- Templates and packages are now organized by category and discipline. Filter packages by either taxonomy in the _Start from template_ wizard. If you are a package author, take a look at the new documentation for [categories](https://github.com/typst/packages/blob/main/CATEGORIES.md) and [disciplines](https://github.com/typst/packages/blob/main/DISCIPLINES.md).
- Context
- Added _context expressions:_ Read the chapter on context to get started
- With context, you can access settable properties, e.g. `context text.lang` to access the language set via `set text(lang: "..")`
- The following existing functions have been made contextual: `query`, `locate`, `measure`, `counter.display`, `counter.at`, `counter.final`, `state.at`, and `state.final`
- Added contextual methods `counter.get` and `state.get` to retrieve the value of a counter or state in the current context
- Added contextual function `here` to retrieve the location of the current context
- The `locate` function now returns the location of a selector's unique match. Its old behavior has been replaced by context expressions and only remains temporarily available for compatibility.
- The `counter.at` and `state.at` methods are now more flexible: They directly accept any kind of locatable selector with a unique match (e.g. a label) instead of just locations
- When context is available, `counter.display` now directly returns the result of applying the numbering instead of yielding opaque content. It should not be used anymore without context. (Deprecation planned)
- The `state.display` function should not be used anymore, use `state.get` instead (Deprecation planned)
- The `location` argument of `query`, `counter.final`, and `state.final` should not be used anymore (Deprecation planned)
- The `styles` argument of the `measure` function should not be used anymore (Deprecation planned)
- The `style` function should not be used anymore, use context instead (Deprecation planned)
- The correct context is now also provided in various other places where it is available, e.g. in show rules, layout callbacks, and numbering functions in the outline
- Styling
- Fixed priority of multiple show-set rules: They now apply in the same order as normal set rules would
- Show-set rules on the same element (e.g. `show heading.where(level: 1): set heading(numbering: "1.")`) now work properly
- Setting properties on an element within a transformational show rule (e.g. `show heading: it => { set heading(..); it }`) is **not** supported anymore (previously it also only worked sometimes); use show-set rules instead (**Breaking change**)
- Text show rules that match their own output now work properly (e.g. `` show "cmd": `cmd` ``)
- The elements passed to show rules and returned by queries now contain all fields of their respective element functions rather than just specific ones
- All settable properties can now be used in where selectors
- _And_ and _or_ selectors can now be used with show rules
- Errors within show rules and context expressions are now ignored in all but the last introspection iteration, in line with the behavior of the old `locate`
- Fixed a bug where document set rules were allowed after content
- Layout
- Added `reflow` argument to `rotate` and `scale` which lets them affect the layout
- Fixed a bug where floating placement or floating figures could end up out of order
- Fixed overlap of text and figure for full-page floating figures
- Fixed various cases where the `hide` function didn't hide its contents properly
- Fixed usage of `h` and `v` in stacks
- Invisible content like a counter update will no longer force a visible block for just itself
- Fixed a bug with horizontal spacing followed by invisible content (like a counter update) directly at the start of a paragraph
- Text
- Added `stroke` property for text
- Added basic i18n for Serbian and Catalan
- Added support for contemporary Japanese numbering method
- Added patches for various wrong metadata in specific fonts
- The text direction can now be overridden within a paragraph
- Fixed Danish smart quotes
- Fixed font fallback next to a line break
- Fixed width adjustment of JIS-style Japanese punctuation
- Fixed Finnish translation of "Listing"
- Fixed Z-ordering of multiple text decorations (underlines, etc.)
- Fixed a bug due to which text features could not be overridden in consecutive set rules
- Model
- Added `depth` and `offset` arguments to heading to increase or decrease the heading level for a bunch of content; the heading syntax now sets `depth` rather than `level` (**Breaking change**)
- List markers) now cycle by default
- The `quote` function now more robustly selects the correct quotes based on language and nesting
- Fixed indent bugs related to the default show rule of terms
- Math
- Inline equations now automatically linebreak at appropriate places
- Added `number-align` argument to equations
- Added support for adjusting the `size` of accents relative to their base
- Improved positioning of accents
- Primes are now always attached as scripts by default
- Exposed `math.primes` element which backs the `$f'$` syntax in math
- Math mode is not affected by `strong` and `emph` anymore
- Fixed `attach` under fractions
- Fixed that `math.class` did not affect smart limit placement
- Fixed weak spacing in `lr` groups
- Fixed layout of large operators for Cambria Math font
- Fixed math styling of Hebrew symbol codepoints
- Symbols
- Added `gradient` as an alias for `nabla`
- Added `partial` as an alias for `diff`, `diff` will be deprecated in the future
- Added `colon.double`, `gt.approx`, `gt.napprox`, `lt.approx`, and `lt.napprox`
- Added `arrow.r.tilde` and `arrow.l.tilde`
- Added `tilde.dot`
- Added `forces` and `forces.not`
- Added `space.nobreak.narrow`
- Added `lrm` (Left-to-Right Mark) and `rlm` (Right-to-Left Mark)
- Fixed `star.stroked` symbol (which previously had the wrong codepoint)
- Scripting
- Arrays can now be compared lexicographically
- Added contextual method `to-absolute` to lengths
- Added `calc.root`
- Added `int.signum` and `float.signum` methods
- Added `float.is-nan` and `float.is-infinite` methods
- Added `int.bit-not`, `int.bit-and`, `int.bit-or`, `int.bit-xor`, `int.bit-lshift`, and `int.bit-rshift` methods
- Added `array.chunks` method
- A module can now be converted to a dictionary with the dictionary constructor to access its contents dynamically
- Added `row-type` argument to `csv` function to configure how rows will be represented
- XML parsing now allows DTDs (document type definitions)
- Improved formatting of negative numbers with `str` and `repr`
- For loops can now iterate over bytes
- Fixed a bug with pattern matching in for loops
- Fixed a bug with labels not being part of `.fields()` dictionaries
- Fixed a bug where unnamed argument sinks wouldn't capture excess arguments
- Fixed typo in `repr` output of strokes
- Syntax
- Added support for nested destructuring patterns
- Special spaces (like thin or non-breaking spaces) are now parsed literally instead of being collapsed into normal spaces (**Breaking change**)
- Korean text can now use emphasis syntax without adding spaces (**Breaking change**)
- The token `context` is now a keyword and cannot be used as an identifier anymore (**Breaking change**)
- Nested line comments aren't allowed anymore in block comments (**Breaking change**)
- Fixed a bug where `x.)` would be treated as a field access
- Text elements can now span across curly braces in markup
- Fixed silently wrong parsing when function name is parenthesized
- Fixed various bugs with parsing of destructuring patterns, arrays, and dictionaries
- Tooling & Diagnostics
- Click-to-jump now works properly within `raw` text
- Added suggestion for accessing a field if a method doesn't exist
- Improved hint for calling a function stored in a dictionary
- Improved errors for mutable accessor functions on arrays and dictionaries
- Fixed error message when calling constructor of type that doesn't have one
- Fixed confusing error message with nested dictionaries for strokes on different sides
- Fixed autocompletion for multiple packages with the same name from different namespaces
- Visualization
- The `image` function doesn't upscale images beyond their natural size anymore
- The `image` function now respects rotation stored in EXIF metadata
- Added support for SVG filters
- Added alpha component to `luma` colors
- Added `color.transparentize` and `color.opacify` methods
- Improved `color.negate` function
- Added `stroke` and `radius` arguments to `highlight` function
- Changed default `highlight` color to be transparent
- CMYK to RGB conversion is now color-managed
- Fixed crash with gradients in Oklch color space
- Fixed color-mixing for hue-based spaces
- Fixed bugs with color conversion
- SVG sizes are not rounded anymore, preventing slightly wrong aspect ratios
- Fixed a few other SVG-related bugs
- `color.components` doesn't round anything anymore
- Export
- PDFs now contain named destinations for headings derived from their labels
- The internal PDF structure was changed to make it easier for external tools to extract or modify individual pages, avoiding a bug with Typst PDFs in Apple Preview
- PDFs produced by Typst should now be byte-by-byte reproducible when `set document(date: none)` is set
- Added missing flag to PDF annotation
- Fixed multiple bugs with gradients in PDF export
- Fixed a bug with patterns in PDF export
- Fixed a bug with embedding of grayscale images in PDF export
- Fixed a bug with To-Unicode mapping of CFF fonts in PDF export
- Fixed a bug with the generation of the PDF outline
- Fixed a sorting bug in PDF export leading to non-reproducible output
- Fixed a bug with transparent text in PNG export
- Exported SVG files now include units in their top-level `width` and `height`
- Command line interface
- Added support for passing inputs via a CLI flag
- When passing the filename `-`, Typst will now read input from stdin
- Now uses the system-native TLS implementation for network fetching which should be generally more robust
- Watch mode will now properly detect when a previously missing file is created
- Added `--color` flag to configure whether to print colored output
- Fixed user agent with which packages are downloaded
- Updated bundled fonts to the newest versions
- Development
- Added `--vendor-openssl` to CLI to configure whether to link OpenSSL statically instead of dynamically (not applicable to Windows and Apple platforms)
- Removed old tracing (and its verbosity) flag from the CLI
- Added new `--timings` flag which supersedes the old flamegraph profiling in the CLI
- Added minimal CLI to `typst-docs` crate for extracting the language and standard library documentation as JSON
- The `typst_pdf::export` function's `ident` argument switched from `Option` to `Smart`. It should only be set to `Smart::Custom` if you can provide a stable identifier (like the web app can). The CLI sets `Smart::Auto`.
Thanks to everyone who contributed to this release: Leedehai, PgBiel, frozolotl, Dherse, MDLC01, Andrew15-5, Enter-tainer, Myriad-Dreamin, peng1999, EpicEricEE, jcbhmr, Heinenen, tingerrr, Jollywatt, LaurenzV, YDX-2147483647, k-84mo10, s-cerevisiae, 01mf02, A-Walrus, C0ffeeCode, CosmicHorrorDev, DavidMazarro, Hofer-Julian, Jocs, Midbin, Quaqqer, artemist, astrale-sharp, cmoog, drupol, dyc3, eltociear, emilyyyylime, emmett-rayes, espinielli, evfinkn, f3rn0s, freundTech, geekvest, h-arry-smith, istudyatuni, jaroeichler, jbirnick, kg583, mattfbacon, max397574, mkpoli, mkroening, muzimuzhi, natsukagami, nvarner, onerandomusername, pineapplehunter, silvergasp, t-rapp, tertsdiepraam, uetcis, violetfauna, voidiz, xTeamStanly, xalbd, xkevio, zica87.