Tables
Tables are now much more flexible, read the new Table Guide to get started
Added
table.cellelement for per-cell configurationCells can now span multiple columns or rows
The stroke of individual cells can now be customized
The
alignandinsetarguments of the table function now also take{(x, y) => ..}functionsAdded
table.hlineandtable.vlinefor convenient line customizationAdded
table.headerelement for table headers that repeat on every pageAdded
table.footerelement for table footers that repeat on every pageAll the new table functionality is also available for grids
Fixed gutter-related bugs
Thanks to https://github.com/PgBiel for his work on tables!
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.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. 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 and disciplines.
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, andstate.finalAdded contextual methods
counter.getandstate.getto retrieve the value of a counter or state in the current contextAdded contextual function
hereto retrieve the location of the current contextThe
locatefunction 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.atandstate.atmethods are now more flexible: They directly accept any kind of locatable selector with a unique match (e.g. a label) instead of just locationsWhen context is available,
counter.displaynow 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.displayfunction should not be used anymore, usestate.getinstead (Deprecation planned)The
locationargument ofquery,counter.final, andstate.finalshould not be used anymore (Deprecation planned)The
stylesargument of themeasurefunction should not be used anymore (Deprecation planned)The
stylefunction 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 properlySetting 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
locateFixed a bug where document set rules were allowed after content
Layout
Added
reflowargument torotateandscalewhich lets them affect the layoutFixed 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
hidefunction didn't hide its contents properlyFixed usage of
handvin stacksInvisible 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
strokeproperty for textAdded 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
depthandoffsetarguments to heading to increase or decrease the heading level for a bunch of content; the heading syntax now setsdepthrather thanlevel(Breaking change)List markers now cycle by default
The
quotefunction now more robustly selects the correct quotes based on language and nestingFixed indent bugs related to the default show rule of terms
Math
Inline equations now automatically linebreak at appropriate places
Added
number-alignargument to equationsAdded support for adjusting the
sizeof accents relative to their baseImproved positioning of accents
Primes are now always attached as scripts by default
Exposed
math.primeselement which backs the[$f'$]syntax in mathMath mode is not affected by
strongandemphanymoreFixed
attachunder fractionsFixed that
math.classdid not affect smart limit placementFixed weak spacing in
lrgroupsFixed layout of large operators for Cambria Math font
Fixed math styling of Hebrew symbol codepoints
Symbols
Added
gradientas an alias fornablaAdded
partialas an alias fordiff,diffwill be deprecated in the futureAdded
colon.double,gt.approx,gt.napprox,lt.approx, andlt.napproxAdded
arrow.r.tildeandarrow.l.tildeAdded
tilde.dotAdded
forcesandforces.notAdded
space.nobreak.narrowAdded
lrm(Left-to-Right Mark) andrlm(Right-to-Left Mark)Fixed
star.strokedsymbol (which previously had the wrong codepoint)
Scripting
Arrays can now be compared lexicographically
Added contextual method
to-absoluteto lengthsAdded
calc.rootAdded
int.signumandfloat.signummethodsAdded
float.is-nanandfloat.is-infinitemethodsAdded
int.bit-not,int.bit-and,int.bit-or,int.bit-xor,int.bit-lshift, andint.bit-rshiftmethodsAdded
array.chunksmethodA module can now be converted to a dictionary with the dictionary constructor to access its contents dynamically
Added
row-typeargument tocsvfunction to configure how rows will be representedXML parsing now allows DTDs (document type definitions)
Improved formatting of negative numbers with
strandreprFor 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()}dictionariesFixed a bug where unnamed argument sinks wouldn't capture excess arguments
Fixed typo in
reproutput 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
contextis 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 accessText 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
rawtextAdded 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
imagefunction doesn't upscale images beyond their natural size anymoreThe
imagefunction now respects rotation stored in EXIF metadataAdded support for SVG filters
Added alpha component to
lumacolorsAdded
color.transparentizeandcolor.opacifymethodsImproved
color.negatefunctionAdded
strokeandradiusarguments tohighlightfunctionChanged default
highlightcolor to be transparentCMYK 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.componentsdoesn'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 setAdded 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
widthandheight
Command line interface
Added support for passing inputs via a CLI flag
When passing the filename
-, Typst will now read input from stdinNow 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
--colorflag to configure whether to print colored outputFixed user agent with which packages are downloaded
Updated bundled fonts to the newest versions
Development
Added
--vendor-opensslto 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
--timingsflag which supersedes the old flamegraph profiling in the CLIAdded minimal CLI to
typst-docscrate for extracting the language and standard library documentation as JSONThe
typst_pdf::exportfunction'sidentargument switched fromOptiontoSmart. It should only be set toSmart::Customif you can provide a stable identifier (like the web app can). The CLI setsSmart::Auto.