mirror of
https://github.com/typst/typst
synced 2025-05-13 20:46:23 +08:00
345 lines
17 KiB
Markdown
345 lines
17 KiB
Markdown
---
|
||
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
|
||
<contributors from="v0.12.0" to="v0.13.0" />
|