Spaces:
Sleeping
Sleeping
| title: 0.12.0 | |
| description: Changes in Typst 0.12.0 | |
| # Version 0.12.0 (October 18, 2024) | |
| ## Highlights | |
| - Added support for multi-column floating [placement]($place.scope) and | |
| [figures]($figure.scope) | |
| - Added support for automatic [line numbering]($par.line) (often used in | |
| academic papers) | |
| - Typst's layout engine is now multithreaded. Typical speedups are 2-3x for | |
| larger documents. The multithreading operates on page break boundaries, so | |
| explicit page breaks are necessary for it to kick in. | |
| - Paragraph justification was optimized with a new two-pass algorithm. Speedups | |
| are larger for shorter paragraphs and go up to 6x. | |
| - Highly reduced PDF file sizes due to better font subsetting (thanks to | |
| [@LaurenzV](https://github.com/LaurenzV)) | |
| - Emoji are now exported properly in PDF | |
| - Added initial support for PDF/A. For now, only the PDF/A-2b profile is | |
| supported, but more is planned for the future. | |
| - Added various options for configuring the CLI's environment (fonts, package | |
| paths, etc.) | |
| - Text show rules now match across multiple text elements | |
| - Block-level equations can now optionally break over multiple pages | |
| - Fixed a bug where some fonts would not print correctly on professional | |
| printers | |
| - Fixed a long-standing bug which could cause headings to be orphaned at the | |
| bottom of the page | |
| ## Layout | |
| - Added support for multi-column floating placement and figures via | |
| [`place.scope`] and [`figure.scope`]. Two-column documents should now prefer | |
| `{set page(columns: 2)}` over `{show: column.with(2)}` (see the | |
| [page setup guide]($guides/page-setup-guide/#columns)). | |
| - Added support for automatic [line numbering]($par.line) (often used in | |
| academic papers) | |
| - Added [`par.spacing`] property for configuring paragraph spacing. This should | |
| now be used instead of `{show par: set block(spacing: ..)}` | |
| **(Breaking change)** | |
| - Block-level elements like lists, grids, and stacks now show themselves as | |
| blocks and are thus affected by all block properties (e.g. `stroke`) rather | |
| than just `spacing` **(Breaking change)** | |
| - Added [`block.sticky`] property which prevents a page break after a block | |
| - Added [`place.flush`] function which forces all floating figures to be placed | |
| before any further content | |
| - Added [`skew`] function | |
| - Added `{auto}` option for [`page.header`] and [`page.footer`] which results in | |
| an automatic header/footer based on the numbering (which was previously | |
| inaccessible after a change) | |
| - Added `gap` and `justify` parameters to [`repeat`] function | |
| - Added `width` and `height` parameters to the [`measure`] function to define | |
| the space in which the content should be measured. Especially useful in | |
| combination with [`layout`]. | |
| - The height of a `block`, `image`, `rect`, `square`, `ellipse`, or `circle` can | |
| now be specified in [fractional units]($fraction) | |
| - The [`scale`] function now supports absolute lengths for `x`, `y`, `factor`. | |
| This way an element of unknown size can be scaled to a fixed size. | |
| - The values of `block.above` and `block.below` can now be retrieved in context | |
| expressions. | |
| - Increased accuracy of conversions between absolute units (pt, mm, cm, in) | |
| - Fixed a bug which could cause headings to be orphaned at the bottom of the | |
| page | |
| - Fixed footnotes within breakable blocks appearing on the page where the | |
| breakable block ends instead of at the page where the footnote marker is | |
| - Fixed numbering of nested footnotes and footnotes in floats | |
| - Fixed empty pages appearing when a [context] expression wraps whole pages | |
| - Fixed `{set block(spacing: x)}` behaving differently from | |
| `{set block(above: x, below: x)}` | |
| - Fixed behavior of [`rotate`] and [`scale`] with `{reflow: true}` | |
| - Fixed interaction of `{align(horizon)}` and `{v(1fr)}` | |
| - Fixed various bugs where floating placement would yield overlapping results | |
| - Fixed a bug where widow/orphan prevention would unnecessarily move text into | |
| the next column | |
| - Fixed [weak spacing]($h.weak) not being trimmed at the start and end of lines | |
| in a paragraph (only at the start and end of paragraphs) | |
| - Fixed interaction of weak page break and [`pagebreak.to`] | |
| - Fixed compilation output of a single weak page break | |
| - Fixed crash when [padding]($pad) by `{100%}` | |
| ## Text | |
| - Tuned hyphenation: It is less eager by default and hyphenations close to the | |
| edges of words are now discouraged more strongly | |
| **(May lead to larger layout reflows)** | |
| - New default font: Libertinus Serif. This is the maintained successor to the | |
| old default font Linux Libertine. **(May lead to smaller reflows)** | |
| - Setting the font to an unavailable family will now result in a warning | |
| - Implemented a new smart quote algorithm, fixing various bugs where smart | |
| quotes weren't all that smart | |
| - Added [`text.costs`] parameter for tweaking various parameters that affect the | |
| choices of the layout engine during text layout | |
| - Added `typm` highlighting mode for math in [raw blocks]($raw.lang) | |
| - Added basic i18n for Galician, Catalan, Latin, Icelandic, Hebrew | |
| - Implemented hyphenation duplication for Czech, Croatian, Lower Sorbian, | |
| Polish, Portuguese, Slovak, and Spanish. | |
| - The [`smallcaps`] function is now an element function and can thereby be used | |
| in show(-set) rules. | |
| - The [`raw.theme`] parameter can now be set to `{none}` to disable highlighting | |
| even in the presence of a language tag, and to `{auto}` to reset to the | |
| default | |
| - Multiple [stylistic sets]($text.stylistic-set) can now be enabled at once | |
| - Fixed the Chinese translation for "Equation" | |
| - Fixed that hyphenation could occur outside of words | |
| - Fixed incorrect layout of bidirectional text in edge cases | |
| - Fixed layout of paragraphs with explicit trailing whitespace | |
| - Fixed bugs related to empty paragraphs created via `#""` | |
| - Fixed accidental trailing spaces for line breaks immediately preceding an | |
| inline equation | |
| - Fixed [`text.historical-ligatures`] not working correctly | |
| - Fixed accidental repetition of Thai characters around line breaks in some | |
| circumstances | |
| - Fixed [smart quotes]($smartquote) for Swiss French | |
| - New font metadata exceptions for Archivo, Kaiti SC, and Kaiti TC | |
| - Updated bundled New Computer Modern fonts to version 6.0 | |
| ## Math | |
| - Block-level equations can now break over multiple pages if enabled via | |
| `{show math.equation: set block(breakable: true)}`. | |
| - Matrix and vector sizing is now more consistent across different cell contents | |
| - Added [`stretch`]($math.stretch) function for manually or automatically | |
| stretching characters like arrows or parentheses horizontally or vertically | |
| - Improved layout of attachments on parenthesized as well as under- or overlined | |
| expressions | |
| - Improved layout of nested attachments resulting from code like | |
| `[#let a0 = $a_0$; $a0^1$]` | |
| - Improved layout of primes close to superscripts | |
| - Improved layout of fractions | |
| - Typst now makes use of math-specific height-dependent kerning information in | |
| some fonts for better attachment layout | |
| - The `floor` and `ceil` functions in math are now callable symbols, such that | |
| `[$ floor(x) = lr(floor.l x floor.r) $]` | |
| - The [`mat.delim`]($math.mat.delim), [`vec.delim`]($math.vec.delim), and | |
| [`cases.delim`]($math.cases.delim) parameters now allow any character that is | |
| considered a delimiter or "fence" (e.g. |) by Unicode. The `{delim: "||"}` | |
| notation is _not_ supported anymore and should be replaced by | |
| `{delim: bar.double}` **(Minor breaking change)** | |
| - Added [`vec.align`]($math.vec.align) and [`mat.align`]($math.mat.align) | |
| parameters | |
| - Added [`underparen`]($math.underparen), [`overparen`]($math.overparen), | |
| [`undershell`]($math.undershell), and [`overshell`]($math.overshell) | |
| - Added `~` shorthand for `tilde.op` in math mode **(Minor breaking change)** | |
| - Fixed baseline alignment of equation numbers | |
| - Fixed positioning of corner brackets (⌜, ⌝, ⌞, ⌟) | |
| - Fixed baseline of large roots | |
| - Fixed multiple minor layout bugs with attachments | |
| - Fixed that alignment points could affect line height in math | |
| - Fixed that spaces could show up between text and invisible elements like | |
| [`metadata`] in math | |
| - Fixed a crash with recursive show rules in math | |
| - Fixed [`lr.size`]($math.lr.size) not affecting characters enclosed in | |
| [`mid`]($math.mid) in some cases | |
| - Fixed resolving of em units in sub- and superscripts | |
| - Fixed bounding box of inline equations when a [text edge]($text.top-edge) is | |
| set to `{"bounds"}` | |
| ## Introspection | |
| - Implemented a new system by which Typst tracks where elements end up on the | |
| pages. This may lead to subtly different behavior in introspections. | |
| **(Breaking change)** | |
| - Fixed various bugs with wrong counter behavior in complex layout situations, | |
| through a new, more principled implementation | |
| - Counter updates can now be before the first, in between, and after the last | |
| page when isolated by weak page breaks. This allows, for instance, updating a | |
| counter before the first page header and background. | |
| - Fixed logical ordering of introspections within footnotes and figures | |
| - Fixed incorrect [`here().position()`]($here) when [`place`] was used in a | |
| context expression | |
| - Fixed resolved positions of elements (in particular, headings) whose show rule | |
| emits an invisible element (like a state update) before a page break | |
| - Fixed behavior of stepping a counter at a deeper level than its current state | |
| has | |
| - Fixed citation formatting not working in table headers and a few other places | |
| - Displaying the footnote counter will now respect the footnote numbering style | |
| ## Model | |
| - Document set rules do not need to be at the very start of the document | |
| anymore. The only restriction is that they must not occur inside of layout | |
| containers. | |
| - The `spacing` property of [lists]($list.spacing), | |
| [enumerations]($enum.spacing), and [term lists]($terms.spacing) is now also | |
| respected for tight lists | |
| - Tight lists now only attach (with tighter spacing) to preceding paragraphs, | |
| not arbitrary blocks | |
| - The [`quote`] element is now locatable (can be used in queries) | |
| - The bibliography heading now uses `depth` instead of `level` so that its level | |
| can still be configured via a show-set rule | |
| - Added support for more [numbering] formats: Devanagari, Eastern Arabic, | |
| Bengali, and circled numbers | |
| - Added [`hanging-indent`]($heading.hanging-indent) parameter to heading | |
| function to tweak the appearance of multi-line headings and improved default | |
| appearance of multi-line headings | |
| - Improved handling of bidirectional text in outline entry | |
| - Fixed document set rules being ignored in an otherwise empty document | |
| - Fixed document set rules not being usable in context expressions | |
| - Fixed bad interaction between `{set document}` and `{set page}` | |
| - Fixed `{show figure: set align(..)}`. Since the default figure alignment is | |
| now a show-set rule, it is not revoked by `{show figure: it => it.body}` | |
| anymore. **(Minor breaking change)** | |
| - Fixed numbering of footnote references | |
| - Fixed spacing after bibliography heading | |
| ## Bibliography | |
| - The Hayagriva YAML `publisher` field can now accept a dictionary with a | |
| `location` key. The top-level `location` key is now primarily intended for | |
| event and item locations. | |
| - Multiple page ranges with prefixes and suffixes are now allowed | |
| - Added `director` and catch-all editor types to BibLaTeX parsing | |
| - Added support for disambiguation to alphanumeric citation style | |
| - The year 0 will now render as 1BC | |
| - Fixes for sorting of bibliography entries | |
| - Fixed pluralization of page range labels | |
| - Fixed sorting of citations by their number | |
| - Fixed how citation number ranges collapse | |
| - Fixed when the short form of a title is used | |
| - Fixed parsing of unbalanced dollars in BibLaTeX `url` field | |
| - Updated built-in citation styles | |
| ## Visualization | |
| - Added `fill-rule` parameter to [`path`]($path.fill-rule) and | |
| [`polygon`]($polygon.fill-rule) functions | |
| - Fixed color mixing and gradients for [Luma colors]($color.luma) | |
| - Fixed conversion from Luma to CMYK colors | |
| - Fixed offset gradient strokes in PNG export | |
| - Fixed unintended cropping of some SVGs | |
| - SVGs with foreign objects now produce a warning as they will likely not render | |
| correctly in Typst | |
| ## Syntax | |
| - Added support for nested imports like `{import "file.typ": module.item}` | |
| - Added support for parenthesized imports like `{import "file.typ": (a, b, c)}`. | |
| With those, the import list can break over multiple lines. | |
| - Fixed edge case in parsing of reference syntax | |
| - Fixed edge case in parsing of heading, list, enum, and term markers | |
| immediately followed by comments | |
| - Fixed rare crash in parsing of parenthesized expressions | |
| ## Scripting | |
| - Added new fixed-point [`decimal`] number type for highly precise arithmetic on | |
| numbers in base 10, as needed for finance | |
| - Added `std` module for accessing standard library definitions even when a | |
| variable with the same name shadows/overwrites it | |
| - Added [`array.to-dict`], [`array.reduce`], [`array.windows`] methods | |
| - Added `exact` argument to [`array.zip`] | |
| - Added [`arguments.at`] method | |
| - Added [`int.from-bytes`], [`int.to-bytes`], [`float.from-bytes`], and | |
| [`float.to-bytes`] | |
| - Added proper support for negative values of the `digits` parameter of | |
| [`calc.round`] (the behaviour existed before but was subtly broken) | |
| - Conversions from [`int`] to [`float`] will now error instead of saturating if | |
| the float is too large **(Minor breaking change)** | |
| - Added `float.nan` and `float.inf`, removed `calc.nan` | |
| **(Minor breaking change)** | |
| - Certain symbols are now generally callable like functions and not only | |
| specifically in math. Examples are accents or [`floor`]($math.floor) and | |
| [`ceil`]($math.ceil). | |
| - Improved [`repr`] of relative values, sequences, infinities, NaN, | |
| `{type(none)}` and `{type(auto)}` | |
| - Fixed crash on whole packages (rather than just files) cyclically importing | |
| each other | |
| - Fixed return type of [`calc.round`] on integers when a non-zero value is | |
| provided for `digits` | |
| ## Styling | |
| - Text show rules now match across multiple text elements | |
| - The string `{"}` in a text show rule now matches smart quotes | |
| - Fixed a long-standing styling bug where the header and footer would | |
| incorrectly inherit styles from a lone element on the page (e.g. a heading) | |
| - Fixed `{set page}` not working directly after a counter/state update | |
| - Page fields configured via an explicit `{page(..)[..]}` call can now be | |
| properly retrieved in context expressions | |
| ## Export | |
| - Highly reduced PDF file sizes due to better font subsetting | |
| - Emoji are now exported properly in PDF | |
| - Added initial support for PDF/A. For now, only the standard PDF/A-2b is | |
| supported, but more is planned for the future. Enabled via `--pdf-standard | |
| a-2b` in the CLI and via the UI in File > Export as > PDF in the web app. | |
| - Setting [`page.fill`] to `{none}` will now lead to transparent pages instead | |
| of white ones in PNG and SVG. The new default of `{auto}` means transparent | |
| for PDF and white for PNG and SVG. | |
| - Improved text copy-paste from PDF in complex scenarios | |
| - Exported SVGs now contain the `data-typst-label` attribute on groups resulting | |
| from labelled [boxes]($box) and [blocks]($block) | |
| - Fixed a bug where some fonts would not print correctly on professional | |
| printers | |
| - Fixed a bug where transparency could leak from one PDF object to another | |
| - Fixed a bug with CMYK gradients in PDF | |
| - Fixed various bugs with export of Oklab gradients in PDF | |
| - Fixed crashes related to rendering of non-outline glyphs | |
| - Two small fixes for PDF standard conformance | |
| ## Performance | |
| - Typst's layout engine is now multithreaded. Typical speedups are 2-3x for | |
| larger documents. The multithreading operates on page break boundaries, so | |
| explicit page breaks are necessary for it to kick in. | |
| - Paragraph justification was optimized with a new two-pass algorithm. Speedups | |
| are larger for shorter paragraphs and range from 1-6x. | |
| ## Command Line Interface | |
| - Added `--pages` option to select specific page ranges to export | |
| - Added `--package-path` and `--package-cache-path` as well as | |
| `TYPST_PACKAGE_PATH` and `TYPST_PACKAGE_CACHE_PATH` environment variables for | |
| configuring where packages are loaded from and cached in, respectively | |
| - Added `--ignore-system-fonts` flag to disable system fonts fully for better | |
| reproducibility | |
| - Added `--make-deps` argument for outputting the dependencies of the current | |
| compilation as a Makefile | |
| - Added `--pretty` option to `typst query`, with the default now being to minify | |
| (only applies to JSON format) | |
| - Added `--backup-path` to `typst update` to configure where the previous | |
| version is backed up | |
| - Added useful links to help output | |
| - The CLI will now greet users who invoke just `typst` for the first time | |
| - The document can now be written to stdout by passing `-` as the output | |
| filename (for PDF or single-page image export) | |
| - Typst will now emit a proper error message instead of failing silently when | |
| the certificate specified by `--cert` or `TYPST_CERT` could not be loaded | |
| - The CLI now respects the `SOURCE_DATE_EPOCH` environment variable for better | |
| reproducibility | |
| - When exporting multiple images, you can now use `{t}` (total pages), `{p}` | |
| (current page), and `{0p}` (zero-padded current page, same as current `{n}`) | |
| in the output path | |
| - The input and output paths now allow non-UTF-8 values | |
| - Times are now formatted more consistently across the CLI | |
| - Fixed a bug related to the `--open` flag | |
| - Fixed path completions for `typst` not working in zsh | |
| ## Tooling and Diagnostics | |
| - The "compiler" field for specifying the minimum Typst version required by a | |
| package now supports imprecise bounds like 0.11 instead of 0.11.0 | |
| - Added warning when a label is ignored by Typst because no preceding labellable | |
| element exists | |
| - Added hint when trying to apply labels in code mode | |
| - Added hint when trying to call a standard library function that has been | |
| shadowed/overwritten by a local definition | |
| - Added hint when trying to set both the language and the region in the `lang` | |
| parameter | |
| - Added hints when trying to compile non-Typst files (e.g. after having typed | |
| `typst c file.pdf` by accident) | |
| - Added hint when a string is used where a label is expected | |
| - Added hint when a stray end of a block comment (`*/`) is encountered | |
| - Added hints when destructuring arrays with the wrong number of elements | |
| - Improved error message when trying to use a keyword as an identifier in a let | |
| binding | |
| - Improved error messages when accessing nonexistent fields | |
| - Improved error message when a package exists, but not the specified version | |
| - Improved hints for unknown variables | |
| - Improved hint when trying to convert a length with non-zero em component to an | |
| absolute unit | |
| - Fixed a crash that could be triggered by certain hover tooltips | |
| - Fixed an off-by-one error in to-source jumps when first-line-indent is enabled | |
| - Fixed suggestions for `.` after the end of an inline code expressions | |
| - Fixed autocompletions being duplicated in a specific case | |
| ## Symbols | |
| - New: `parallelogram`, `original`, `image`, `crossmark`, `rest`, `natural`, | |
| `flat`, `sharp`, `tiny`, `miny`, `copyleft`, `trademark`, `emoji.beet`, | |
| `emoji.fingerprint`, `emoji.harp`, `emoji.shovel`, `emoji.splatter`, | |
| `emoji.tree.leafless`, | |
| - New variants: `club.stroked`, `diamond.stroked`, `heart.stroked`, | |
| `spade.stroked`, `gt.neq`, `lt.neq`, `checkmark.heavy`, `paren.double`, | |
| `brace.double`, `shell.double`, `arrow.turn`, `plus.double`, `plus.triple`, | |
| `infinity.bar`, `infinity.incomplete`, `infinity.tie`, `multimap.double`, | |
| `ballot.check`, `ballot.check.heavy`, `emptyset.bar`, `emptyset.circle`, | |
| `emptyset.arrow.l`, `emptyset.arrow.r`, `parallel.struck`, `parallel.eq`, | |
| `parallel.equiv`, `parallel.slanted`, `parallel.tilde`, `angle.l.curly`, | |
| `angle.l.dot`, `angle.r.curly`, `angle.r.dot`, `angle.oblique`, `angle.s`, | |
| `em.two`, `em.three` | |
| - Renamed: `turtle` to `shell`, `notes` to `note`, `ballot.x` to `ballot.cross`, | |
| `succ.eq` to `succ.curly.eq`, `prec.eq` to `prec.curly.eq`, `servicemark` to | |
| `trademark.service`, `emoji.face.tired` to `emoji.face.distress` | |
| **(Breaking change)** | |
| - Changed codepoint: `prec.eq`, `prec.neq`, `succ.eq`, `succ.neq`, `triangle` | |
| from ▷ to △, `emoji.face.tired` **(Breaking change)** | |
| - Removed: `lt.curly` in favor of `prec`, `gt.curly` in favor of `succ` | |
| **(Breaking change)** | |
| ## Deprecations | |
| - [`counter.display`] without an established context | |
| - [`counter.final`] with a location | |
| - [`state.final`] with a location | |
| - `state.display` | |
| - [`query`] with a location as the second argument | |
| - [`locate`] with a callback function | |
| - [`measure`] with styles | |
| - `style` | |
| ## Development | |
| - Added `typst-kit` crate which provides useful APIs for `World` implementors | |
| - Added go-to-definition API in `typst-ide` | |
| - Added package manifest parsing APIs to `typst-syntax` | |
| - As the compiler is now capable of multithreading, `World` implementations must | |
| satisfy `Send` and `Sync` | |
| - Changed signature of `World::main` to allow for the scenario where the main | |
| file could not be loaded | |
| - Removed `Tracer` in favor of `Warned<T>` and `typst::trace` function | |
| - The `xz2` dependency used by the self-updater is now statically linked | |
| - The Dockerfile now has an `ENTRYPOINT` directive | |
| ## Contributors | |
| <contributors from="v0.11.0" to="v0.12.0" /> | |