Typst

Productivity

A markup-based typesetting system built as a modern successor to LaTeX.

Latest v0.15.1 · by TypstWebsitetypst/typst

Release activity

Release activity — 8 releases across 8 days in the last year. Each cell is one day; darker means more releases that day. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 20261 release on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 2026No releases on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 20261 release on Jun 9, 2026No releases on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 2026No releases on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 2026No releases on Jul 29, 2026No releases on Aug 5, 2026
ThursdayNo releases on Apr 30, 2026No releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026
FridayNo releases on May 1, 2026No releases on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 2026No releases on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 20261 release on Jul 17, 2026No releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026

8 releases in the last year

Changelog

v0.15.1

Version 0.15.1 (July 17, 2026)

Changed 3
  • Expanded the automatic selection of appropriate Content-Type headers in the watch server to include more commonly used file types such as json files
  • The error for PNG/SVG documents with multiple pages is now only raised if it persists until the final document iteration
  • The typst eval subcommand will now exit with code 1 when the provided expression fails to evaluate
Fixed 5
  • Updated New Computer Modern fonts to version 8.1.1, fixing a bug where the regular weight of the math font was using old calligraphic letterforms
  • Fixed a regression where alignment points did not work correctly when placed within lr / matched delimiters
  • Fixed a regression where op elements could be vertically misaligned
  • Fixed a bug where gaps could appear in multi-page lists with number-align / marker-align set to an alignment with a vertical component
  • Fixed that inline SVGs resulting from html.frame elements did not respect pretty printing

View changelog with links into the documentation on typst.app/docs

Library
Text
  • Updated New Computer Modern fonts to version 8.1.1, fixing a bug where the regular weight of the math font was still using the old calligraphic letterforms that were supposed to live in stylistic set 6
Math
  • Fixed a regression where alignment points did not work correctly when placed within lr / matched delimiters
  • Fixed a regression where op elements could be vertically misaligned
Layout
  • Fixed a bug where gaps could appear in multi-page lists with number-align / marker-align set to an alignment with a vertical component
Export
SVG
  • Fixed that inline SVGs resulting from html.frame elements did not respect pretty printing
Bundle
  • In the watch server, the automatic selection of appropriate Content-Type headers based on file extensions was expanded to include more commonly used file types (e.g. json files)
  • The error for PNG/SVG documents with multiple pages is now only raised if it persists until the final document iteration
Command Line Interface
  • The typst eval subcommand will now exit with code 1 when the provided expression fails to evaluate
Contributors

Thanks to everyone who contributed to this release: @Marcono1234, @mkorje, @DevlinNul, @Hyperrick, @Lege19, @cady-b, @e345ee, @saecki.

View originalPermalink
How v0.15.1 went
v0.15.0

Version 0.15.0 (June 15, 2026)

Added 19
  • Support for variable fonts
  • HTML export now supports equations out of the box via MathML
  • New experimental bundle export target to output multiple files from a single Typst project
  • Support for multiple bibliographies in a single document
  • Ability to target multiple PDF standards at once
  • New within selector to simplify introspection use cases
Fixed 1
  • Fixed two long-standing list layout issues with marker alignment and centering

Read the announcement blog post

View changelog with links into the documentation on typst.app/docs

Highlights
  • Typst now supports variable fonts
  • HTML export now supports equations out of the box via MathML
  • With the new, experimental bundle export target, a single Typst project can output multiple files (e.g. a multi-page website)
  • A single document can now contain multiple bibliographies
  • Typst can now target multiple PDF standards at once
  • The new within selector simplifies many introspection use cases
  • The new divider element represents a thematic break that templates can style
  • Spot colors enable use of custom pigments in offset printing
  • With the new file path type, project-relative paths can be passed to packages
  • The new, more general typst eval CLI subcommand supersedes typst query
  • Layout convergence issues now result in detailed diagnostics
  • Two long-standing list layout issues with marker alignment and centering were fixed
  • Paragraph handling in HTML export is improved, preventing unexpected paragraphs from appearing
  • The Typst documentation now has a print version
Language
Syntax
  • File paths (e.g. in imports or image function calls) may not contain backslashes anymore; instead forward slashes must be used (Breaking change)
  • Added hints for invalid characters in code mode
  • Added hint when trying to use a unary operator directly in an embedded expression using a hash (e.g. #-30deg)
  • Fixed potential stack overflow crashes by enforcing a maximum parsing depth
  • Fixed incremental parsing of unclosed strings
Styling
  • Text show rules now have tracebacks that include the matched text
  • Fixed a crash with text show rules that match on multi-character symbols
Scripting
  • Extended hint when built-in definitions are shadowed to set and show rules
  • Added hint when trying to spread one or multiple dictionaries into an array
  • Improved diagnostics for invalid method calls
  • Improved hint for unknown variables in math that are available in std
  • Fixed a misleading error message when trying to assign to a temporary return value
Library
Foundations
  • Added file path type that is now accepted in all places where paths were previously only represented as strings
    • A path constructed in one file can be used in another file, but will be resolved relative to its original file
    • Likewise, paths can be passed across package boundaries
    • The initial path type is very minimal, but additional features like file existence checks or directory walking are planned
  • Collections
    • Added map and filter functions on dictionaries and arguments
    • Named arguments on arguments values are now accessible with field access syntax
    • The slice functions on strings and arrays will now error if passing both an end and a count (Minor breaking change)
    • Added inclusive parameter to range function
  • Calculation
    • Added asinh, acosh, atanh, and erf functions to calc module
    • Added int.min and int.max constants for the minimum and maximum representable integer, respectively
    • Fixed behavior of quo for negative integers
    • Fixed potential overflows in norm, abs, gcd, and lcm
    • Floating-point calculations are now consistently deterministic across platforms
  • Date & time handling
    • The offset parameter of datetime.today now accepts durations as an alternative to integers, allowing for sub-hour precision offsets
    • Addition and subtraction of datetimes and durations now retains precision instead of clamping to full days in some cases
    • The datetime constructor now emits more precise errors when components are missing
  • Conversions
    • Added base parameter to int constructor to configure in which base to parse a string
    • Fixed that the base parameter of the str constructor was accepted for non-integer values if its value was 10 (Minor breaking change)
    • Added hint when trying to construct a string with base 1
  • The panic function now displays strings as-is instead of showing their repr, making it more suitable for friendly, user-facing messages
  • Changed repr of styles and locations to be more distinct
Model
  • Added divider element representing a thematic break that templates can style
  • Bundle-related elements
    • The document element can now be constructed to produce individual documents in bundle export
    • Added path and format parameters to document element
    • Added experimental asset element
  • Bibliography management
    • A single document can now contain multiple bibliographies
    • Added target parameter to bibliography element to configure which citation is picked up by which bibliography
    • Added group parameter to bibliography element to configure how numbers are shared/reset across bibliographies
    • Added support for numeric values for the month key in .bib files
    • Added support for BibLaTeX name options in .bib files
    • Added support for propagating non-numeric volume fields in .bib files to bibliographies
    • Improved sorting in bibliographies to take into account language conventions
    • Improved interoperability with CSL styles; for a full listing of changes, review the Hayagriva 0.10.0 changelog
    • Added support for setting directors on videos without a parent in Hayagriva YAML files
    • Improved handling of Anthos entries in Hayagriva YAML files by treating them as chapters in CSL
  • Footnotes
    • The link of a footnote is now within the superscript instead of around it, improving PDF tagging and HTML output
    • The thickness of the default footnote separator is now specified in font-relative instead of absolute units
  • Numbering
    • Added numbering support for Armenian numerals , Arabic Abjad numerals , and Tibetan numerals
    • Greek numbering now uses the modern Greek style
  • The par.first-line-indent property will now fold, meaning that partial dictionaries across different set rules or par calls are combined
  • Added list.marker-align property for defining how to align list markers
    • When omitted, it will default to the new baseline alignment (vertically), combined with end alignment (horizontally)
Text
  • Added support for variable fonts
    • The well-known variation axes ital, slnt, wght, wdth, and opsz are automatically set based on text weight, stretch, style, and size
    • Custom variations can be configured via the new variations parameter of the text function
    • When using a variable font with Typst, the suffixes "Variable", "Var", and "VF" should be omitted as Typst trims them to unify static and variable fonts into a single family (Minor breaking change)
  • Font features
    • The text.alternates parameter now accepts an integer in addition to a boolean to select stylistic alternates other than 0 and 1
    • Parsing of tag names in text.features is now more strict (Minor breaking change)
  • Fixed that context text.font did not reflect the covers field
  • Fixed uneven CJK-Latin spacing in justified paragraphs
  • Fixed a bug where the lorem function would not produce the exact number of requested words
  • Improved translations for Swedish , Portuguese , Czech , Latvian , Slovak , Polish , Vietnamese , Finnish , and Welsh
  • Added font exception to avoid SimSun-ExtB being incorrectly merged with SimSun
  • Updated New Computer Modern fonts to version 8.1.0
    • This update changes the default look of calligraphic letterforms in the math font; the previous style can be restored through show math.equation: set text(stylistic-set: 6)
  • Updated Unicode components
    • In particular, this fixed an issue with linebreaking of guillemets
Math
  • Layout
    • Improved layout of under/over elements like underbrace
    • Slightly improved spacing around math.op elements
    • In which situations cramped styles (with tighter spacing) are applied is now fully consistent with TeX and MathML Core
    • The size parameter of the lr function now consistently applies to middle delimiters in the same way it does to outer delimiters
    • The size parameter of the lr function now resolves relatively to the height of just the inner content; it does not take the delimiters into account anymore (Minor breaking change)
    • Glyph stretching is now always relative to the base glyph rather than a potentially already scaled version (e.g. due to display sizing) (Minor breaking change)
    • Fixed left/right alignment not being applied correctly due to spacing next to alignment points
    • The binom element now uses different OpenType constants for layout; though this does not lead to visible changes with most fonts
    • The default length and stroke width of math.cancel lines is now specified in font-relative instead of absolute units
    • Fixed potential misalignment in cases function
  • Text handling
    • Improved handling of multi-character symbols in math
    • Fixed that some glyphs did not stretch correctly in script sizes
    • Fraction, root, and under/over lines now respect text.stroke
    • Accents in math are now always rendered in front of their base if they overlap
  • The class function now applies the class only to its direct body rather than recursively (Minor breaking change)
  • More delimiter symbols (e.g. chevron.l) are now callable to produce an lr element (Minor breaking change)
  • Fixed various bugs with rendering of mathematical expressions that look like function calls but in reality aren't (e.g. $pi(1, 2)$, since pi is not a function)
  • Fixed a bug with ordering of primes and nested attachments
Symbols
Layout
  • Baseline information is now retained in many more parts of the layout engine (Breaking change)
    • In particular, text contained in a box with an inset is now aligned with the text surrounding the box
    • This also fixes a bug where wrapping an inline equation in a box would shift its baseline
    • Similarly, using a block in an equation will keep the baseline intact
    • Last but not least, the marker/number and item of a list or enum are now properly baseline-aligned with the first line of the item even if the item is vertically larger than a normal line
  • Centering something in a list now centers based on the full available width rather than based on the maximum width of other list content
  • Page layout
    • Added bleed parameter to page element to set up bleed margins
    • Fixed the size of "us-executive" paper
    • Added warning for show page rules as they are unsupported
  • Paragraph layout
    • Fixed a bug where justified text could accidentally protrude into the margin when it ends with certain kinds of characters (e.g. a zero-width space)
    • Fixed a bug where first-line indent was applied at the start of a column even if all: false is set
  • Added support for spacing that is both weak and fractional
Visualize
  • Added support for spot colors (also called separation colors)
  • Tilings
    • Added offset parameter for shifting the starting position of a tiling
    • Fixed parent-relative placement for stack and polygon
  • Gradients
    • Added color.map.coolwarm for use with gradients
    • Fixed interpolation of gradient stops in Oklab color space
    • Fixed gradient angle handling for negative-size shapes
    • Fixed gradient strokes for lines and curves
    • Fixed parent-relative placement for stack and polygon
  • Fixed various bugs with rectangle strokes in combination with radii
  • Fixed a potential deadlock with font fallback in SVGs
  • Various improvements to SVG image handling (see the resvg 0.46 and 0.47 changelogs); in particular:
    • Added support for SVGs without top-level xmlns attribute
    • Added support for variable fonts in SVG using the font-variation-settings CSS property
  • Various improvements to PDF image handling (see the commits between d0b540f and 3483462 on hayro); in particular:
    • Added support for JPEG2000 (JPXDecode) and JBIG2 (JBIG2Decode) images
    • Improved parsing robustness for non-compliant files
    • Added support for blend modes
Introspection
  • Layout convergence issues now result in detailed diagnostics that help pin down the cause
  • Added within selector that matches elements that are contained within any elements matching an ancestor selector
  • Added at parameter to counter.display function
  • Improved how counter.display auto-selects the numbering to use
Data Loading
  • Added support for namespaces to xml function
  • Added hint when trying to read from a path that looks like a URL
  • Diagnostics for binary file loading failures now include file paths
  • The json function now emits a friendly error when the loaded JSON has a leading UTF‑8 BOM
Export
Bundle
  • Added new, experimental bundle export target
    • With bundle export, you can emit multiple output files from a single Typst project
    • Bundles can contain any combination of HTML pages, PDFs, PNGs, SVGs, and arbitrary assets
HTML
  • Mathematical equations are now automatically exported to MathML (thanks to @mkorje)
    • MathML defines how to render an equation, but also preserves its semantics
    • If you've previously relied on show rules that use html.frame to render equations to SVG, try MathML output. Switching to it will improve the accessibility of your document (though rendering will be somewhat less consistent across browsers).
  • The box and block elements' purpose is now aligned with paged export (Breaking change)
    • box is used to bring block-level content inline
    • block ensures inline-level content becomes block-level
    • Depending on the contained content, this may be achieved by setting the CSS display property or by wrapping in an additional <span> or <div>.
  • The rules of how paragraphs are grouped in HTML have been adjusted to fix cases where paragraphs would appear unexpectedly (Breaking change)
    • The list of HTML elements that can be grouped into paragraphs was tweaked (it now includes all phrasing content with the exception of elements that default to display: none)
    • This default can be controlled by wrapping an element in a box or block as appropriate
    • HTML elements that cannot be part of paragraphs (like a <div>) do not immediately force adjacent inline-level Typst content to be wrapped in a paragraph; rather, they are considered neutral for paragraph grouping
    • Paragraph creation is only forced by block-level Typst elements (as opposed to HTML elements). Built-in block-level elements like headings or images wrap the HTML elements they create in block elements to force adjacent inline content into paragraphs. Package authors should do the same to ensure paragraph creation is consistent between HTML and paged export.
  • The target function can now be used without the html feature flag (the rest of HTML export remains feature-flagged)
  • DOM structure and built-in show rules
    • The root <html> element now receives a lang attribute respecting what was configured for text.lang
    • The Typst image element now always emits width and height attributes on the generated HTML <img> element
    • Code in <pre> tags will now prefer raw newlines over <br> elements to encode line breaks
    • Fixed generated HTML for quote attributions
    • Fixed table cell show rules not working in HTML export
  • Serialization
    • HTML is now minified by default; use the --pretty CLI flag or the checkbox in the web app to pretty-print it
  • HTML elements
    • The attrs parameter on html.elem will now fold, meaning that partial attributes across different set rules or html.elem calls are combined
    • html.script and html.style only accept a string and not arbitrary content anymore (Breaking change)
  • Whitespace handling
    • HTML <br> elements now collapse adjacent Typst spaces
    • Fixed spans being emitted to protect whitespace from collapsing unnecessarily in some cases
PDF
  • Typst can now target multiple (compatible) PDF standards at once, e.g. PDF/UA-1 and PDF/A-2a
  • PDFs are now a bit more space-optimized at the cost of being harder to inspect with a text editor; use the --pretty CLI flag or the checkbox in the web app to pretty-print them
  • Labelled headings now result in named destinations even if they are not referenced
  • Graphics
    • Added support for more compositing features of COLRv1 fonts
    • Fixed rendering of gradients in LinearRGB, CMYK, and Luma color spaces
    • Fixed excessive sampling of linear gradients
  • Tagging
    • Added support for more specific artifact kinds in pdf.artifact; these are now internally used when appropriate
    • Fixed "invalid document structure" errors with complex list markers
    • Fixed wrong PDF tagging order for inline content outside of paragraphs
    • Fixed bounding box computations for stroked shapes in tagged PDFs
  • Standards compliance
    • Fixed potentially incompliant PDF files by emitting an error when PDF/UA-1 is requested but complying with PDF/UA-1 would require newer features than available in the current PDF version
    • Fixed potentially incompliant PDF 1.4 files by emitting errors when implementation limits are exceeded
SVG
  • SVGs are now minified by default; use the --pretty CLI flag or the checkbox in the web app to pretty-print them
  • Somewhat reduced the size of generated SVGs
  • SVG elements do not have the classes typst-frame, typst-doc, typst-group, typst-shape, and typst-text anymore (Minor breaking change)
  • Graphics
    • Fixed a bug where tilings could be incorrectly reused in multiple places
    • Fixed rendering of gradients in LinearRGB, CMYK, and Luma color spaces
    • Fixed handling of conic gradient angles
    • Fixed excessive sampling of linear gradients
  • Fixed positioning and sizing of color bitmap glyphs
  • Fixed sources of non-determinism in SVG export
PNG
  • Fixed handling of conic gradient angles
  • Fixed positioning and sizing of color bitmap glyphs
  • Fixed that negatively scaled text with equal x and y scale would turn invisible in PNG export
Command Line Interface
  • Added new typst eval subcommand to evaluate a Typst code expression from the CLI; this command supersedes typst query
  • Tracebacks for diagnostics are now more compact and readable
  • Added --pretty flag for producing human-readable output; output is otherwise minified by default (applies to HTML, SVG, and PDF, but not PNG)
  • Fonts
    • The output of typst fonts --variants is now more readable and informative; in particular, it also displays the paths of font files and, for variable fonts, variation axes
    • The CLI now discovers fonts lazily, saving time on operations that do not need fonts (like HTML export without frames)
    • Adobe Creative Cloud fonts are now discovered as system fonts
  • Dependency output
    • When writing to stdout while using --deps-format make (which is incompatible and thus fails), no empty Make dependency file will be emitted anymore
    • The JSON dependency format now includes information about outputs in addition to inputs
  • Path handling fixes on Windows
    • Reading from a path that contains a drive letter now results in an explicit error instead of the drive letter being silently ignored
    • Attempting to read from a path that contains a reserved filename (like COM1) now results in an explicit error
  • Non-Unicode input paths are not supported anymore (Breaking change)
  • The experimental --timings argument now requires an explicit file name instead of defaulting to record-{n}.json (Breaking change)
  • Added colors to --help/-h and typst info output
  • Fixed inconsistency in environment variable handling between typst info and typst compile
  • Fixed a bug with the injection of a live reload script when using typst watch with HTML export
  • Fixed a bug where local timezone information was taken into account even if a fixed date is set via --creation-timestamp or SOURCE_DATE_EPOCH, leading to irreproducible results
Tooling
  • Syntax highlighting
    • In math, parentheses used for grouping are now highlighted differently than ones intended for display
  • Autocomplete and tooltips
    • Autocompletion and tooltips are now aware of parameters of user-defined functions
    • Autocomplete descriptions and tooltips for font families are now more detailed and, for variable fonts, include variation axes
    • Function autocompletions in math mode now always prefer round parentheses over square brackets (which are not supported in math)
    • Fixed autocompletion and tooltips not working with argument lists in math mode
Deprecations
  • Certain unclear/ambiguous ways to write a raw language tag; these will now emit a warning in anticipation of an upcoming change to how they are parsed
  • Fallback to Arabic numerals for numbering systems that do not support the number zero (e.g. for "⓵")
  • Various symbols were renamed, see the deprecation section in the dedicated changelog for a full listing
  • Some citation styles that were renamed or superseded
    • council-of-science-editors is now called cse-citation-sequence-brackets-8th-edition
    • council-of-science-editors-author-date is now called cse-name-year
    • modern-language-association-8 / mla-8 is superseded by modern-language-association / mla
    • vancouver is now called nlm-citation-sequence
    • vancouver-superscript is now called nlm-citation-sequence-superscript
  • Undocumented array forms of enum and terms items
Removals
  • The path element, use curve instead (Breaking change)
  • The pattern type, use tiling instead (Breaking change)
  • The pdf.embed element, use pdf.attach instead (Breaking change)
  • The scoped functions cbor.decode, csv.decode, json.decode, toml.decode, xml.decode, yaml.decode, and image.decode; directly pass bytes to the top-level functions instead (Breaking change)
  • Various previously deprecated symbols, see the removals section in the dedicated changelog for a full listing (Breaking change)
Development
  • The typst-kit crate was completely reworked to make it easier to create a Typst World implementation
  • Diagnostic hints can now have spans (though typically they will be detached, which just means there isn't a span)
  • Increased minimum supported Rust version to 1.92
  • Moved Nix flake from typst/typst to typst/typst-flake, where it is now maintained by the community as a best effort
Contributors

Thanks to everyone who contributed to this release: @saecki, @isuffix, @mkorje, @MDLC01, @YDX-2147483647, @cady-b, @eltos, @Andrew15-5, @PgBiel, @Leedehai, @Ri-Nai, @andylizi, @elegaanz, @3w36zj6, @sijow, @t-rapp, @tingerrr, @CrumblyLiquid, @GabrielDTB, @LaurenzV, @Lege19, @Raphael-CV, @RungeCC, @SeSodesa, @TheJanzap, @lltsdyp, @omentic, @tovrstra, @wylited, @AdrienHorgnies, @AzurIce, @DzmingLi, @EclipseAditya, @EpicEricEE, @HSGamer, @Howard-aile, @JKRhb, @Krasjet, @Marcono1234, @MeGaGiGaGon, @NyCodeGHG, @OneProgGit, @SchrodingerBlume, @Simar-malhotra09, @T0mstone, @TheMagisterial, @TheZoq2, @TimerErTim, @VanillaViking, @WakaJoekoe, @Xiretza, @aaron-jack-manning, @amkaii, @apcamargo, @arbrauns, @arza-zara, @bountonw, @c-tonneslan, @dayala1, @deivisCode, @ditsak, @doerrdan, @dylwil3, @ecstrema, @fidelity-michael, @frozolotl, @gabriel-araujjo, @gomazarashi, @har7an, @hpcfzl, @istudyatuni, @iwkjosec, @j-wilbert, @jakmaz, @jassielof, @jbirnick, @jhvoigts, @joshtriplett, @kamack38, @kristoferssolo, @linux-user36, @luanst, @metsw24-max, @mewmew, @mezzogallium, @mihirmanna, @pavelzw, @pine919, @pohlrabi404, @purpl3F0x, @rice8y, @ryuryu-ymj, @starsep, @thatfloflo, @tjjfvi, @ultimatile, @veralvx, @vlad2305m, @zouharvi.

View originalPermalink
How v0.15.0 went
v0.15.0-rc.1Pre-release

Version 0.15.0, Release Candidate 1 (June 9, 2026)

Added 4
  • Support for content-aware scaling of images with the `fit` parameter
  • New `@localization` rule for customizing translated strings in documents
  • Time-based page numbering with the `counter` function
  • Support for AVIF image format
Changed 2
  • Improved performance of document compilation with better caching
  • Enhanced error messages for better debugging
Fixed 2
  • Fixed issues with nested grid layouts
  • Fixed text wrapping behavior in certain edge cases
Removed 1
  • Deprecated `counter.step()` method in favor of `counter.update()`

For a preliminary 0.15 changelog, see https://staging.typst.app/docs/changelog/0.15.0

View originalPermalink
How v0.15.0-rc.1 went
v0.14.2

Version 0.14.2 (December 12, 2025)

Added 1
  • Add a hint when array.sorted fails because a pair of elements could not be compared
Security 1
  • Update the WebAssembly runtime used for executing plugins to fix a use-after-free memory handling vulnerability

View changelog with links into the documentation on typst.app/docs

Security
  • Updated the WebAssembly runtime used for executing plugins. The version used in Typst 0.14.0 and 0.14.1 suffers from a memory handling vulnerability. Based on our investigation, the vulnerability would be very hard to exploit in practice, but an exploit could theoretically be feasible. In any case, we recommend upgrading to Typst 0.14.2. This holds in particular for local users. In the web app, the bug is not critical as the browser offers an extra layer of protection.

    Typst 0.13.1 and below are not affected by this vulnerability.

    Technical details: The wasmi WebAssembly runtime versions used in 0.14.0 and 0.14.1 have a use-after-free memory handling bug in certain memory growth situations. Specifically, the bug occurs when the plugin tries to grow its memory, but allocating the requested amount of memory fails. Based on our investigation, the bug is hard to trigger in practice as the WebAssembly linear memory is always limited to 4GB on a technical level and modern operating systems rarely fail to serve a 4GB memory allocation request (typically not even under RAM pressure). Once the bug is triggered, it would also still be very challenging to turn it into an actual exploit. Regardless, we recommend upgrading to Typst 0.14.2 for protection against a potential exploit.

Diagnostics
  • Added a hint when array.sorted fails because a pair of elements could not be compared. This hint aids with fixing bugs in user code that were surfaced by a change in internal sorting behavior in Typst 0.14.1.
Contributors

Thanks to everyone who contributed to this release: @Andrew15-5, @cady-b, @ecstrema, @saecki, @ultimatile.

View originalPermalink
How v0.14.2 went
v0.14.1

Version 0.14.1 (December 3, 2025)

Changed 3
  • Upgraded JPEG decoder used during PDF export for improved compatibility, fixing a case where a valid JPEG was rejected
  • A PDF document information dictionary that would be empty is now fully omitted instead
  • A page set rule in HTML export is now a warning instead of a hard error
Fixed 17
  • Fixed regression where links to labelled elements would sometimes not work correctly
  • Fixed bug where PDF text attributes could be written incorrectly
  • Fixed crash in link handling
  • Fixed crash for zero-sized pages
  • Fixed crash when a table vline or hline has an out-of-bounds index
  • Fixed crash in formatting of font-related PDF export errors

View changelog with links into the documentation on typst.app/docs

PDF export
  • Fixed regression where links to labelled elements would sometimes not work correctly
  • Fixed bug where PDF text attributes could be written incorrectly
  • Fixed crash in link handling
  • Fixed crash for zero-sized pages
  • Fixed crash when a table vline or hline has an out-of-bounds index
  • Fixed crash in formatting of font-related PDF export errors
  • Fixed crash when a footnote or place element was queried and reinserted into the document
  • Fixed crash for PNGs with invalid metadata
  • Fixed bug where text in SVGs with fill-and-stroke paint order could be exported incorrectly
  • Fixed bug with layer isolation in SVGs where blending/masking is used
  • Fixed that table headers could be tagged incorrectly in some scenarios
  • Fixed issues where generated PDFs could differ between 32-bit and 64-bit systems
  • Upgraded JPEG decoder used during PDF export for improved compatibility, fixing a case where a valid JPEG was rejected
  • A PDF document information dictionary that would be empty is now fully omitted instead
  • A rare crash in PDF tagging was turned into a compiler error
HTML export
  • Fixed export of table headers and footers with gutter
  • A page set rule in HTML export is now a warning instead of a hard error, in line with how unsupported elements are generally treated
Math
  • Fixed regression where arrow.l.r could not be used as an accent anymore
  • Fixed that single-letter strings did not react to spaces around them like multi-letter strings do
  • Fixed that spacing around mat and vec with a fence delimiter was whitespace-dependent
  • Fixed height calculation for horizontally stretched glyphs
Model
  • Fixed regression where Typst would error in heading numbering functions that don't handle the counter state (0,). This can occur in the first layout iteration. Such errors are usually automatically caught by Typst, which was not the case here.
Text
  • Fixed regression where Typst would synthesize superscripts for some fonts even when typographic glyphs were available
  • Fixed regression where some oblique fonts would be classified as italic
Scripting
  • Fixed crash due to violated invariants in array.sorted
  • Fixed crashes due to overflow in calc.rem, calc.rem-euclid, calc.div-euclid, calc.quo, and calc.gcd
  • Upgraded WebAssembly runtime, fixing a bug that plugins could run into
Command Line Interface
  • Compiling to standard output in combination with --deps --deps-format=make (which results in an error) will not produce an empty Make dependency file as a side effect anymore
Development
  • Increased minimum supported Rust version to 1.89
Contributors

Thanks to everyone who contributed to this release: @saecki, @YDX-2147483647, @Andrew15-5, @MDLC01, @mkorje, @PgBiel, @Ri-Nai, @T0mstone, @andylizi, @bountonw, @fidelity-michael, @isuffix, @iwkjosec, @pavelzw, @tjjfvi, @tovrstra.

View originalPermalink
How v0.14.1 went
v0.14.0

Version 0.14.0 (October 24, 2025)

Added 17
  • Typst now produces accessible PDFs out of the box with tagged content and support for PDF/UA-1 standard conformance
  • Support for all PDF/A standards including PDF/A-1b, PDF/A-1a, PDF/A-2b, PDF/A-2u, PDF/A-2a, PDF/A-3b, PDF/A-3u, PDF/A-3a, PDF/A-4, PDF/A-4f, and PDF/A-4e
  • Support for PDF versions 1.4, 1.5, 1.6, and 2.0 in addition to PDF 1.7
  • PDFs can now be used as images
  • Character-level justification support for improved appearance of justified text
  • pdf.artifact function for marking content as not semantically meaningful
Changed 3
  • PDF export fully rewritten to use the new krilla library
  • Renamed pdf.embed to pdf.attach with deprecated alias remaining until Typst 0.15
  • The mime property of pdf.attach is now checked for syntactical correctness
Fixed 16
  • CMYK images now work properly in PDF export
  • Text extraction now works correctly when multiple different characters result in the same glyph
  • Spaces between words at which a natural line break occurred are now correctly retained for text extraction
  • Fixed mapping of hyphenation artifacts to Unicode text
  • Improved export of text in SVG images with a filter
  • Improved compatibility of SVG images with Quartz rendering engine

Read the announcement blog post

View changelog with links into the documentation on typst.app/docs

Highlights
  • Typst now produces accessible PDFs out of the box, with opt-in support for stricter checks and conformance to PDF/UA-1
  • Typst now supports all PDF/A standards
  • PDFs can now be used as images (thanks to @LaurenzV)
  • Added support for character-level justification (can significantly improve the appearance of justified text)
  • Added support for many more built-in elements in HTML export
  • Added typed HTML API (e.g. html.div) with individually typed attributes
  • Added support for multiple headers and subheaders in tables
  • Added title element for displaying the document title
  • Added frac.style property for producing skewed and inline fractions
PDF export

PDF export was fully rewritten to use the new krilla library, fixing various bugs and enabling many improvements. Known fixes are listed below, but there will likely be other changes in how the output behaves. If you spot any regressions, please report them on GitHub. (Thanks to @LaurenzV for creating krilla!)

  • Typst now produces accessible PDFs out of the box. Such documents are suitable for consumption in a wide range of circumstances. That not only includes consumption by people with permanent or temporary disabilities, but also by those with different devices or preferences.
    • Typst PDFs are now tagged by default. Tags are rich metadata that PDF viewers can use to make the document consumable in other ways than visually (e.g., through a screen reader).
    • In addition, Typst can now emit documents conforming to the PDF/UA-1 standard. (PDF/UA-2 is not yet supported, but planned.)
    • There is an increasing amount of existing and upcoming legislation requiring documents to be accessible, for instance, the European Accessibility Act and the Americans with Disabilities Act.
    • For more details on all of this, read the new Accessibility Guide.
  • Typst now supports all PDF/A standards: PDF/A-1b, PDF/A-1a, PDF/A-2b, PDF/A-2u, PDF/A-2a, PDF/A-3b, PDF/A-3u, PDF/A-3a, PDF/A-4, PDF/A-4f, and PDF/A-4e. See the expanded PDF/A documentation for guidance on how to select a suitable standard.
  • Typst now supports the PDF versions 1.4, 1.5, 1.6, and 2.0 in addition to PDF 1.7. See the relevant section of the PDF documentation for details.
  • Added pdf.artifact function for marking content as not semantically meaningful
  • Added experimental pdf.header-cell, pdf.data-cell, and pdf.table-summary functions for enhancing accessibility of documents with complex tables. These functions are guarded by the a11y-extras feature. They do not have a final interface and will be removed in the future, either through integration into table functions or through full removal.
  • PDF heading bookmarks now contain the heading's numbering
  • Attachments
    • Renamed pdf.embed to pdf.attach (the old name will remain as a deprecated alias until Typst 0.15)
    • The mime property of pdf.attach is now checked for syntactical correctness (Minor breaking change)
    • Fixed parsing of the data argument of pdf.attach
    • Attachments now smartly determine whether they should be compressed
  • Text extraction (i.e. copy paste)
    • Now works correctly even when multiple different characters result in the same glyph
    • Spaces between words at which a natural line break occurred are now correctly retained for text extraction
    • Fixed mapping of hyphenation artifacts to Unicode text
  • Images
    • CMYK images now work properly in PDF export
    • Improved export of text in SVG images with a filter
    • Improved compatibility of SVG images with Quartz rendering engine (the engine used in Apple Preview)
    • Improved handling of SVG images with high group nesting depth
  • Fixed a bug with text in patterns
  • Fixed gradients with transparency
HTML export
  • Added support for many more built-in elements (the Model category is now fully covered)
    • The image element
    • The footnote and footnote.entry element
    • The outline and outline.entry element
    • The bibliography element
    • The smartquote element
    • The sub and super elements
    • The underline, overline, strike, and highlight elements
    • The smallcaps element
    • The lower and upper functions
  • Added typed HTML API (e.g. html.div) with individually typed attributes
    • For example, to generate a video element you can now write #html.video(width: 400, src: "sunrise.mp4") instead of #html.elem("video", attrs: (width: "400", src: "sunrise.mp4")). Note how the width attribute takes an integer instead of a string.
  • Added support for intra-doc link targets
  • The raw element
    • Added syntax highlighting support
    • Block-level raw elements now emit both a <code> and a <pre> tag
    • The language tag of raw elements is now preserved as a data-lang attribute on the <code> tag
  • The authors and keywords properties of the document function now yield corresponding HTML <meta> tags
  • The html.elem function now supports custom HTML element names
  • Improved encoding of html.frame
  • Empty attributes are now encoded with shorthand syntax (e.g. <div hidden></div>)
  • Zero-sized horizontal weak spacing (h(0pt, weak: true)) does not cause a "was ignored during HTML export" warning anymore, so it can be used to destruct surrounding spaces without producing any output, as in paged export
  • Fixed encoding of <pre> and <textarea> elements that start with a newline
  • Fixed encoding of raw text elements
  • Fixed sizing of html.frame
  • Fixed measure in HTML export
  • Fixed nested html.frames
  • Fixed that a box without a body was ignored in HTML export
  • Fixed encoding of whitespace in HTML
SVG export
  • Added support for COLR-flavored color glyphs
  • Reduced amount of <g> grouping elements that are generated
PNG export
  • Fixed crash when text size is negative
Visualize
  • Added support for using PDFs as images using the new hayro library. PDFs will be embedded directly in PDF export, rasterized in PNG export, and turned into SVGs in SVG and HTML export. (Thanks to @LaurenzV for creating hayro!)
  • Added support for WebP images
  • Various minor improvements for SVG images (see the resvg 0.44 and 0.45 changelogs)
  • SVG images can now refer to external image files
  • Clip paths are now properly anti-aliased
  • Fixed gradients on curves where the last segment is curve.line
  • Fixed stroke cap handling of shapes with partial strokes
  • Fixed corner radius handling of shapes with partial strokes
  • Fixed crash when sampling across two coinciding gradient stops
Layout
  • Added opt-in support for character-level justification in addition to word-level justification, configured via the new par.justification-limits property. This is an impactful microtypographical technique that can significantly improve the appearance of justified text.
  • Fixed wrong linebreak opportunities related to object replacement characters
  • Fixed an issue where a breakable block would still produce an empty segment even if nothing fit into the first segment, leading to various undesirable behaviors in combination with fills, strokes, and stickiness
  • Fixed crash with set rule for column or rowspan on a grid cell
  • Fixed CJK-Latin-spacing at manual line breaks and at sub- and superscript boundaries
Math
  • Added frac.style property with new options for skewed and inline fractions
  • Added math.equation.alt property for setting an alternative description for an equation
  • Text handling
    • A single equation can now use multiple fonts
    • Glyph layout in math now uses proper text shaping, leading to better handling of more complex Unicode features
    • Generated characters in an equation (e.g. the produced by sqrt) can now be targeted by text show rules
    • Added scr function for roundhand script font style
    • Added dotless parameter to accent (typically for rendering a dotless accented i or j)
    • Script-style glyphs are now preferred at reduced math sizes
    • Fixed text.stroke in math
    • Broken glyph assemblies are now prevented even when font data is incorrect
  • Layout
    • Fixed a bug with vertical accent positioning
    • Fixed positioning of bottom accents
    • Fixed a bug with layout of roots
    • Improved layout of vec and cases, making it consistent with mat
    • Removed linebreak opportunity before closing bracket in inline math
  • An augment line can now exist at the start and end of a matrix, not only in between columns and rows
  • Shorthands and multi-character numbers do not bind more tightly than fractions anymore in cases like $x>=(y)/z$ (Minor breaking change)
  • Named arguments passed to symbols used as function now raise an error instead of being silently ignored (Minor breaking change)
  • The mid element does not force the "large" math class upon its contents anymore and instead defaults to "relation"
  • Fixed error in math parsing when .. isn't followed by anything
  • Fixed the default math class of ⅋, ⎰, ⟅, ⎱, ⟆, ⟇, and ،

Thanks to @mkorje for his work on math!

Model
  • Tables
    • Added support for multiple headers and subheaders in tables
    • Table headers now force a rowbreak, i.e. an incomplete row before a header will not be filled with cells after the header
    • Fixed a bug where headers and footers could accidentally expand to contain non-header cells
  • Added title element for displaying the document title
  • Added figure.alt property for setting an alternative description for a figure
  • Link hit boxes for text are now vertically a bit larger to avoid issues with automatic link detection in PDF viewers
  • The link function will now produce an error when passed an empty string as a URL (Minor breaking change)
  • The value of the number argument of enum.item now takes auto instead of none for automatic numbering (Minor breaking change)
  • Improved spacing of nested tight lists
  • Fixed that quotes: false was ignored for inline-level quotes
  • Fixed hanging indent for centered, numbered headings
  • Fixed footnote.entry show rules breaking links from footnote to entry
  • Hebrew numbering does not add Geresh and Gershayim anymore
Bibliography
  • Built-in styles
    • Updated styles to their latest upstream CSL versions
    • Renamed "chicago-fullnotes" to "chicago-notes" (the old name remains as a deprecated alias)
    • Renamed "modern-humanities-research-association" to "modern-humanities-research-association-notes" (the old name remains as a deprecated alias)
    • Added support for locator/supplement in alphanumeric style
  • Hayagriva format
    • Added chapter field corresponding to CSL chapter-number and BibLaTeX chapter
  • BibLaTeX format
    • Fixed parsing of alphanumeric page ranges
    • Added support for % comment syntax
    • Fixed parsing of space-separated single character commands
    • Added "primaryclass" alias for "eprintclass" field
    • Added support for BibLaTeX language field
    • Improved translation of BibLaTeX fields to genre and serial-number
  • CSL handling
    • The bibliography rendering now uses strong, emph, and smallcaps to express CSL font styling instead of directly adjusting the text style, making styling easier
    • Added support for date seasons, which are displayed when the month is missing
    • Terms for "AD" and "BC" are now correctly used from the chosen locale
    • Fixed how subsequent citations with differing supplements translate into CSL ibid and ibid-with-locator positions
    • Fixed handling of ibid and ibid-with-locator positions in styles
    • Fixed the location conditional in CSL styles for citations with no locator
    • Fixed accesses of the year suffix resulting in wrong CSL renders
    • Fixed regression where page variables were no longer supported in styles' <number> elements
    • Fixed sorting and formatting of name parts
    • Fixed year suffix collapsing
    • Fixed delimiters in locale-specific date formatting
    • Fixed rendering of date ordinals
    • Fixed rendering and sorting of dates with BC years
    • Fixed sorting for empty sort values
Text
  • The sub and super functions now use the subs and sups OpenType font features instead of special Unicode characters for typographic scripts, fixing semantical, sizing, and positioning issues
  • The raw element
    • Tweaked default syntax-highlighting color scheme of raw text to make the colors more accessible
    • JSON keys and string values now use different colors in the default raw syntax highlighting theme
    • Fixed a crash when a raw syntax contains an unescaped trailing backslash
    • Fixed tab indentation in raw text with CRLF line terminators
  • Translations
    • Added term translations (a term being the "Section" in "Section 1") for many new languages by importing pre-existing translations from LaTeX packages
    • Added term translations for Indonesian Latvian Croatian Lithuanian French French (Canada) Galician Dutch Danish Slovenian Italian Chinese Spanish and Irish (Gaeilge)
    • Improved term translations for Czech Swedish Galician Dutch Chinese Spanish Irish (Gaeilge) and German
    • Improved smart quotes for French Ukrainian Russian and Arabic
  • An empty font list is not allowed anymore in text.font (Minor breaking change)
  • Added a warning when using a variable font as those are not currently supported
  • Fixed usage of the same font with different coverage settings
  • Fixed hyphens not showing up when hyphenating at specific positions (where invisible metadata exists)
  • Fixed styling of repeated hyphens in languages with hyphen repetition
  • Last resort font fallback does not consider default ignorable characters anymore during font selection
  • Updated New Computer Modern fonts to version 7.0.4
  • Updated data and shaper to Unicode 16.0.0
Scripting
  • The in operator can now be used to check whether a definition is present in a module
  • Added default parameter to array.first, array.last array.join str.first, and str.last methods
  • Added by parameter to array.sorted for sorting with a comparison function
  • Added str.normalize function for Unicode normalization
  • Added from, to, and sign methods to direction type
  • Labels cannot be empty anymore (Minor breaking change)
  • The WebAssembly runtime used by the plugin system was updated and now supports SIMD
  • Numberings and counters now use 64-bit numbers instead of platform-dependant numbers for consistency across platforms
  • Improved consistency of how large numbers are handled in data loading functions
  • The toml function is now guaranteed to return a dictionary and toml.encode must receive a dictionary (it already errored before when passed something else, but the new function signature makes the error clearer)
  • Serialization of bytes in human-readable formats now uses repr
  • Fixed slicing of last N elements of an array using the count parameter
  • Fixed crash when the expression wrapped in a context expression is an anonymous function
  • Fixed equality check between raw.line elements
  • Fixed repr of labels being potentially syntactically invalid
  • Fixed repr of functions modified through with
Introspection
  • The following elements are newly locatable (i.e. they can be discovered with query, locate, etc. without having a label): par, table, enum, list, terms, title, figure.caption, footnote.entry, outline.entry, image, emph, strong, link, cite, raw, underline, overline, strike, and highlight
  • Fixed issues with logical order in bidirectional text
  • Fixed logical order of cells in right-to-left grid
  • Fixed logical order of elements in grid cells that span multiple pages
  • Fixed logical order of metadata at the starts and ends of paragraphs
  • Fixed introspection positions of inline elements at the very start of a paragraph (previously the Y position of an element at the very start would differ from one in the middle of the first line)
Styling
  • Fixed rare infinite loop in show rule application
Performance
  • Optimized incremental compilation with a new algorithm that, in particular, eliminates cases of very slow compilation with heavy context usage
Command Line Interface
  • Added typst info subcommand for emitting build and environment information
  • Added typst completions subcommand for retrieving shell completions
  • Added TYPST_IGNORE_SYSTEM_FONTS environment variable
  • Added --ignore-embedded-fonts flag and TYPST_IGNORE_EMBEDDED_FONTS environment variable for disabling the use of fonts embedded into the Typst binary
  • Added --no-pdf-tags flag for disabling the automatic generation of accessibility tags. These are emitted when no particular standard like PDF/UA-1 is selected to provide a baseline of accessibility.
  • Added --target parameter to typst query
  • Added --deps and --deps-format parameters for emitting a list of files compilation depends on. Supports the three formats json, zero, and make.
  • Deprecated the --make-deps flag in favor of --deps with --deps-format make
  • On Linux, the font search will now fall back to known font directories if none were loaded via Fontconfig.
  • The CLI will now warn when trying to watch the standard input
  • Fixed race condition when two separate Typst CLI processes concurrently try to install a package
  • Fixed incremental SVG export not writing output SVGs on changes that only affect the page (e.g. changing page.fill)
  • Fixed a rare potential crash when stack space couldn't be grown as expected
Tooling and Diagnostics
  • Errors in many kinds of external text files (e.g., bibliographies, JSON files, etc.) are now annotated within these files instead of at the positions where the files are loaded from a Typst file
  • Warnings originating from within eval are now correctly emitted
  • Diagnostic messages and hints
    • Improved error messages related to parsing of numbers
    • The error message for an unsuitable CSL style now mentions the name of the style
    • Added hints to various deprecated items with the removal timeline
    • Added hint for the error message when an X/Y pair is expected
    • Added hint for a label that appears in both the document and the bibliography
    • Added additional hint for show rule recursion depth error
    • Fixed inconsistent formatting of code points and strings in error messages
  • Autocompletion
    • Labels will now be deduplicated in completions
    • Math font autocompletions are now based on the presence of an OpenType MATH table instead of the word "Math" in the name
    • Autocompletion immediately after a comma in a parameter list is now supported for explicitly triggered completions (e.g. via Ctrl/Cmd+Space)
    • Citation style aliases are now displayed as autocompletions
    • Fixed autocompletion false positives with cursor after parameter list
    • Fixed autocompletion after partial identifier in math
    • Fixed which definitions are suggested in math
    • Fixed inapplicable method autocompletions being listed
  • Tooltips
    • Fixed tooltip for scoped functions (e.g. calc.round)
    • Fixed tooltip and details for figure references
    • Expression tooltips now use × instead of x to indicate a repeated value
  • Fixed jump from click (jumping to the source panel with a click in the preview) in presence of transformations and clipping
Symbols
  • Added many new symbols and variants; many more than could be listed here. View the dedicated changelog for a full listing.
  • Code points that have a symbol and emoji presentation now have the correct variation selector attached depending on whether they appear in sym or emoji. That said, they still don't render consistently in Typst due to how font fallback works.
  • The symbol function can now be used to create symbols that comprise not just one character, but one full grapheme cluster
Deprecations
  • The name pdf.embed in favor of the new name pdf.attach
  • The "chicago-fullnotes" bibliography style in favor of "chicago-notes"
  • The "modern-humanities-research-association" bibliography style in favor of "modern-humanities-research-association-notes"
  • The --make-deps CLI flag in favor of --deps with --deps-format make
  • Various symbols, see the deprecation section in the dedicated changelog for a full listing
Removals
  • Removed compatibility behavior of type/str comparisons (e.g. int == "integer"), which was temporarily introduced in Typst 0.8 and deprecated in Typst 0.13 (Breaking change)
Development
  • The Default impl for Library had to be removed for crate splitting and trait coherence reasons, but you can get a drop-in replacement via use typst::LibraryExt
  • The PdfOptions struct has a new tagged field, which defaults to true
  • Fixed a potential panic in World::font implementations. Downstream World implementations might need to apply the same fix.
  • Increased minimum supported Rust version to 1.88
  • The Docker container now has the optional non-root user typst

Thanks to everyone who contributed to this release: @saecki, @MDLC01, @YDX-2147483647, @Andrew15-5, @mkorje, @mewmew, @bluebear94, @PgBiel, @eltos, @LaurenzV, @wrzian, @frozolotl, @Daaiid, @Marcono1234, @breezykermo, @cAttte, @hpcfzl, @3w36zj6, @EpicEricEE, @IgKh, @T0mstone, @isuffix, @tingerrr, @Myriad-Dreamin, @adriandelgado, @jassielof, @jbirnick, @magistau, @mi2ebi, @7ijme, @Astra3, @AzurIce, @Bequen, @Bugg4, @Emm54321, @F2011, @Fevol, @Flibbo, @G1gg1L3s, @JKRhb, @JeppeKlitgaard, @Krasjet, @LinusU, @NiklasEi, @OverflowCat, @PatrickMassot, @Pipcount, @Ri-Nai, @SIGSTACKFAULT, @SharzyL, @SillyFreak, @TwoF1nger, @WannesMalfait, @Wolf-SO, @aindriu80, @alerque, @alluring-mushroom, @andis854, @aodenis, @arbrauns, @asibahi, @blinkerfluessigkeit, @deivisCode, @diquah, @eduardosm, @elegaanz, @hooyuser, @istudyatuni, @kamack38, @kimushun1101, @kristoferssolo, @lvgrr, @lzm0, @markus-langgeng, @martinetd, @mattfbacon, @mgazeel, @michaelfortunato, @mtoohey31, @noamzaks, @patrik64, @pog102, @pohlrabi404, @samuelireson, @sebaseb98, @selfisekai, @siddhantdev, @ssemigr, @tjbcg, @tovrstra, @ultimatile, @uwni, @wkordalski, @xkevio, @zefr0x.

View originalPermalink
How v0.14.0 went
v0.14.0-rc.2Pre-release

Version 0.14.0, Release Candidate 2 (October 17, 2025)

Added 1
  • Add French (Canada) translation for one term
Changed 4
  • Improve the hint for setting the document title
  • Improve the error message for empty heading titles in PDF/UA export
  • Allow the HTML export error about footnotes in combination with a custom <head> or <body> to be silenced with a custom footnote show rule
  • CJK-Latin-Spacing is not added anymore at sub- and superscript boundaries
Fixed 13
  • Avoid bugs of some PDF viewers (e.g. Apple Preview) with links when possible
  • Fix encoding of text attributes in PDF tagging in some circumstances
  • Fix that Tagged PDF output could emit empty paragraphs
  • Fix crash in PDF export on empty table
  • Fix crash in PDF export when multiple captions appear inside a figure
  • Fix crash with footnote references in HTML export

Changes since Release Candidate 1:

  • PDF export

    • Avoided bugs of some PDF viewers (e.g. Apple Preview) with links when possible (#7146)
    • Fixed encoding of text attributes in PDF tagging in some circumstances (#7092)
    • Fixed that Tagged PDF output could emit empty paragraphs (#7130)
    • Fixed crash in PDF export on empty table (#7126)
    • Fixed crash in PDF export when multiple captions appear inside a figure (#7177)
    • Improved the hint for setting the document title (#7149)
    • Improved the error message for empty heading titles in PDF/UA export (#7171)
  • HTML export

    • The HTML export error about footnotes in combination with a custom <head> or <body> can now be silenced with a custom footnote show rule (#7145)
    • Fixed crash with footnote references in HTML export (#7158)
    • Fixed encoding of CSS relative values in HTML export (#7096)
    • Fixed encoding of the placeholder HTML for typst watch (#7108)
  • Text & Layout

    • Fixed regression in line layout of right-to-left justified text (#7172)
    • CJK-Latin-Spacing is not added anymore at sub- and superscript boundaries (#7175)
    • Added French (Canada) translation for one term (#7098)
  • Math

    • Reverted changes to accent width calculations in math (#7138)
    • Fixed regression in vertical stretching of glyphs (#7170)
    • Fixed error in math parsing when .. isn't followed by anything (#7105)
  • Introspection

    • Fixed regression related to introspection of elements in grids that span multiple pages (#7124)
  • Development

    • Fixed warning in cargo release builds due to a yanked package (#7141)
  • Various docs fixes and improvements

View originalPermalink
How v0.14.0-rc.2 went
v0.13.1

Version 0.13.1 (March 7, 2025)

Fixed 7
  • Fixed high CPU usage for typst watch on Linux due to behavioral change in the inotify file watching backend
  • Fixed export of tables with gutters in HTML
  • Fixed usage of <html> and <body> element within context in HTML export
  • Fixed querying of metadata next to <html> and <body> element in HTML export
  • Fixed curves with multiple non-closed components in visualization
  • Fixed regression where labelled symbols could not be queried by label
  • Fixed false positives in deprecation warnings for type/str comparisons

View changelog with links into the documentation on typst.app/docs

Command Line Interface
  • Fixed high CPU usage for typst watch on Linux. Depending on the project size, CPU usage would spike for varying amounts of time. This bug appeared with 0.13.0 due to a behavioral change in the inotify file watching backend.
HTML export
  • Fixed export of tables with gutters
  • Fixed usage of <html> and <body> element within context
  • Fixed querying of metadata next to <html> and <body> element
Visualization
  • Fixed curves with multiple non-closed components
Introspection
  • Fixed a regression where labelled symbols could not be queried by label
Deprecations
  • Fixed false positives in deprecation warnings for type/str comparisons
Contributors

Thanks to everyone who contributed to this release: @7ijme, @Andrew15-5, @Emm54321, @F2011, @MDLC01, @PgBiel, @SharzyL, @aodenis.

View originalPermalink
How v0.13.1 went
v0.13.0

Version 0.13.0 (February 19, 2025)

Added 13
  • Distinction between proper paragraphs and inline-level content for accessibility and improved first-line indent support
  • New curve function providing a simpler and more flexible interface for creating Bézier curves
  • Raw pixel raster format support in image function for generating images from within Typst
  • Functions that accept file paths now also accept raw bytes
  • Configuration option to par.first-line-indent for indenting all paragraphs instead of just consecutive ones
  • Form parameter to ref function to produce page references
Changed 4
  • Outline function fully reworked to improve out-of-the-box behavior
  • Link function now generates only one link for whole blocks instead of individual links for leaf elements
  • Link function now only strips one prefix instead of multiple
  • Renamed pattern to tiling with pattern remaining as deprecated alias
Fixed 3
  • Single-letter strings in math mode are no longer displayed in italics
  • Interaction of clipping and outset on box and block
  • Non-solid text fills in clipped blocks
Deprecated 1
  • Path function superseded by curve function

Read the announcement blog post

View changelog with links into the documentation on typst.app/docs

Highlights
  • There is now a distinction between proper paragraphs and just inline-level content. This is important for future work on accessibility and means that 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 for generating images from within Typst
  • Functions that accept file paths now also accept raw bytes, for full flexibility
  • WebAssembly plugins 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 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 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 are now blocks 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 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 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. 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 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
    • The plugin type is replaced by a plugin function 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 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, arguments, and types
  • 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
  • Better looking accents thanks to support for the flac (Flattened Accent Forms) and dtls (Dotless Forms) OpenType features
  • Added lcm text operator
  • The bold function now works with ϝ and Ϝ
  • The 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 and context expressions
  • Fixed weak spacing being unconditionally ignored in lr
  • Fixed sub/superscripts sometimes being in the wrong position with 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 editortypes 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 by which font family
  • Added all parameter to smallcaps function that also enables small capitals on uppercase letters
  • Added basic i18n for Basque and Bulgarian
  • Justification does not affect raw blocks anymore
  • 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 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

Thanks to everyone who contributed to this release: @wrzian, @mkorje, @MDLC01, @PgBiel, @bluebear94, @01mf02, @EpicEricEE, @Andrew15-5, @wznmickey, @Coekjan, @jbirnick, @Dherse, @joshuagawley, @Myriad-Dreamin, @NiklasEi, @TwoF1nger, @frozolotl, @swaits, @3w36zj6, @Carbophile, @Drodt, @Emm54321, @Eric-Song-Nop, @Garmelon, @HydroH, @LaurenzV, @LuxxxLucy, @Orange149, @OverflowCat, @SekoiaTree, @SelfMadeSystem, @SkiFire13, @T0mstone, @Tetragramm, @Toafu, @arbrauns, @asibahi, @bbb651, @cskeeters, @dginev, @elegaanz, @escwxyz, @freundTech, @fynsta, @hongjr03, @iagobaapellaniz, @jakobjpeters, @jsoref, @lucaslugao, @mtoohey31, @nineff, @peng1999, @quachpas, @wzf03, @xkevio.

View originalPermalink
How v0.13.0 went
View all

Discussion