惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
IT之家
IT之家
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 聂微东
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
The Cloudflare Blog
博客园_首页
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 【当耐特】
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
宝玉的分享
宝玉的分享
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
NISL@THU
NISL@THU
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Blog — PlanetScale
Blog — PlanetScale
aimingoo的专栏
aimingoo的专栏
L
LINUX DO - 热门话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
博客园 - Franky
L
Lohrmann on Cybersecurity
S
Secure Thoughts
量子位
V
Vulnerabilities – Threatpost
Last Week in AI
Last Week in AI
博客园 - 叶小钗
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LINUX DO - 最新话题
I
InfoQ
C
CERT Recently Published Vulnerability Notes
Security Archives - TechRepublic
Security Archives - TechRepublic
P
Proofpoint News Feed
G
GRAHAM CLULEY
Cisco Talos Blog
Cisco Talos Blog

Hacker News: Best

madhadron - The seven programming ur-languages GitHub - smol-machines/smolvm: Tool to build & run portable, lightweight, self-contained virtual machines. I Measured Claude 4.7's New Tokenizer. Here's What It Costs You. Introducing Claude Design by Anthropic Labs It Is Time to Ban the Sale of Precise Geolocation The creative software industry has declared war on Adobe Isaac Asimov: The Last Question Newly unsealed records reveal Amazon’s price-fixing tactics, California attorney general claims Clojure - Documentary Android CLI and skills: Build Android apps 3x faster using any agent Qwen3.6-35B-A3B on my laptop drew me a better pelican than Claude Opus 4.7 Codex for almost everything Introducing Claude Opus 4.7 Qwen Studio The Future of Everything is Lies, I Guess: Where Do We Go From Here? Virginia Bans Sale of Geolocation Data YouTube now lets you turn off Shorts Burgers | マクドナルド公式 ChatGPT for Excel Ask HN: Who is using OpenClaw? Live Nation illegally monopolized ticketing market, jury finds Google Broke Its Promise to Me. Now ICE Has My Data. Open Source Isn't Dead. The Future of Everything is Lies, I Guess: New Jobs Unexpected €54k billing spike in 13 hours: Firebase browser key without API restrictions used for Gemini requests IPv6 – Google Your Backpack Got Worse On Purpose Good sleep, good learning, good life Fixing a 20-year-old bug in Enlightenment E16. Does Gas Town 'steal' usage from users' LLM credits & paid services to improve itself? Tell HN: Fiverr left customer files public and searchable Cybersecurity Looks Like Proof of Work Now Getting the Flock out Release OpenSSL 4.0.0 · openssl/openssl Internet será irrespirable los días de fútbol y otros deportes. Telefónica extiende los bloqueos a Champions, tenis y golf. Automate work with routines - Claude Code Docs The Future of Everything is Lies, I Guess: Work Thousands of rare concert recordings are landing on the Internet Archive — listen now What is jj and why should I care? Backblaze has quietly stopped backing up your data Cal.com Goes Closed Source: Why AI Security Is Forcing Our Decision | Cal.com - Scheduling Software for Online Bookings Codex Hacked a Samsung TV The Future of Everything is Lies, I Guess: Safety GitHub - sterlingcrispin/nothing-ever-happens: Polymarket bot that buys "No" on all non-sports markets. For entertainment only, mostly a meme. Make tmux Pretty and Usable - Ham Vocke Microsoft isn't removing Copilot from Windows 11, it's just renaming it Servo is now available on crates.io - Servo aims to empower developers with a lightweight, high-performance alternative for embedding web technologies in applications. We May Be Living Through the Most Consequential Hundred Days in Cyber History, and Almost Nobody Has Noticed All elementary functions from a single binary operator 奈拜提耶市 Seven countries now generate 100% of their electricity from renewable energy Pro Max 5x Quota Exhausted in 1.5 Hours Despite Moderate Usage Tell HN: docker pull fails in spain due to football cloudflare block Bring Back Idiomatic Design @adlrocha - How the "AI Loser" may end up winning Apple update turns Czech mate for locked-out iPhone user Cache TTL silently regressed from 1h to 5m around early March 2026, causing quota and cost inflation The peril of laziness lost AI Will Be Met With Violence, and Nothing Good Will Come of It Center for Responsible, Decentralized Intelligence at Berkeley The disturbing white paper Red Hat is trying to erase from the internet – OSnews The Future of Everything is Lies, I Guess: Annoyances 447 Terabytes per Square Centimetre at Zero Retention Energy: Non-Volatile Memory at the Atomic Scale on Fluorographane Show HN: Pardonned.com – A searchable database of US Pardons 20 Years on AWS and Never Not My Job Artemis II crew splashes down near San Diego after historic moon mission Molotov Cocktail Is Hurled at Home of Sam Altman, OpenAI’s CEO France to ditch Windows for Linux to reduce reliance on US tech On filing the corners off my MacBooks Installing every* Firefox extension Chimpanzees in Uganda locked in vicious 'civil war', say researchers linux/Documentation/process/coding-assistants.rst at master · torvalds/linux GitHub - callumlocke/json-formatter: Makes JSON easy to read. A compelling title that is cryptic enough to get you to take action on it GitHub - Keychron/Keychron-Keyboards-Hardware-Design: Industrial design files for Keychron keyboards and mice. 100+ models with CAD assets in STEP, DXF, DWG, and PDF. Source-available, with commercial use allowed for original compatible accessories within the license terms. [ANNOUNCE] WireGuardNT v0.11 and WireGuard for Windows v0.6 Released 1D-Chess Helium Is Hard to Replace FBI used iPhone notification data to retrieve deleted Signal messages Microsoft suspends dev accounts for high-profile open source projects Why you can’t trust Privacy & Security Serenity Forge (@serenityforge.com) A new trick brings stability to quantum operations OpenAI Backs Bill That Would Limit Liability for AI-Enabled Mass Deaths or Financial Disasters Netflix Prices Went Up Again – I Bought a DVD Player Instead DOJ Wants to Scrap Watergate-Era Rule That Makes Presidential Records Public EFF is Leaving X How NASA built Artemis II’s fault-tolerant computer Meta removes ads for social media addiction litigation How Pizza Tycoon simulated traffic on a 25 MHz CPU Claude mixes up who said what, and that's not OK Reallocating $100/Month Claude Code spend to Zed and OpenRouter Help Keep Thunderbird Alive! Why Are Flock Employees Watching Our Children? The Pentagon Threatened Pope Leo XIV’s Ambassador With the Avignon Papacy Fragments: April 2 Native Instant Space Switching on MacOS Bitcoin miners are losing $19,000 on every BTC produced as difficulty drops 7.8% God sleeps in the minerals Apple Silicon and Virtual Machines: Beating the 2 VM Limit
0.15.0 - Typst Documentation
2026-06-16 · via Hacker News: Best

Typst 0.15.0 (June 15, 2026)

This section documents all changes to the Typst language and compiler between Typst 0.14.2 and 0.15.0. If you are migrating an existing document to Typst 0.15, make sure to check out the Migration guide. It walks you through changes you may need to make to your existing documents to ensure compatibility with Typst 0.15.

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
  • This documentation now has a print version

Language

Syntax

Styling

  • Text show rules now have tracebacks that include the matched text Link
  • Fixed a crash with text show rules that match on multi-character symbols Link

Scripting

Library

Foundations

  • Added file path type that is now accepted in all places where paths were previously only represented as strings Link

    • 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

  • Calculation

  • Date & time handling

  • Conversions

  • The panic function now displays strings as-is instead of showing their repr, making it more suitable for friendly, user-facing messages Link
  • Changed repr of styles and locations to be more distinct Link

Model

  • Added divider element representing a thematic break that templates can style Link
  • Bundle-related elements

  • Bibliography management

  • Footnotes

  • Numbering

  • The par.first-line-indent property will now fold, meaning that partial dictionaries across different set rules or par calls are combined Link
  • Added list.marker-align property for defining how to align list markers Link

    • When omitted, it will default to the new baseline alignment (vertically), combined with end alignment (horizontally)

Text

  • Added support for variable fonts Link

    • 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 Link (Minor breaking change)
  • Font features

  • Fixed that context text.font did not reflect the covers field Link
  • Fixed uneven CJK-Latin spacing in justified paragraphs Link
  • Fixed a bug where the lorem function would not produce the exact number of requested words Link
  • Improved translations for Swedish Link, Portuguese Link, Czech Link, Latvian Link, Slovak Link, Polish Link, Vietnamese Link, Finnish Link Link, and Welsh Link
  • Added font exception to avoid SimSun-ExtB being incorrectly merged with SimSun Link
  • Updated New Computer Modern fonts to version 8.1.0 Link Link Link Link Link

    • 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 Link

    • In particular, this fixed an issue with linebreaking of guillemets

Math

  • Layout

  • Text handling

  • The class function now applies the class only to its direct body rather than recursively Link (Minor breaking change)
  • More delimiter symbols (e.g. chevron.l) are now callable to produce an lr element Link (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) Link
  • Fixed a bug with ordering of primes and nested attachments Link

Symbols

Layout

  • Baseline information is now retained in many more parts of the layout engine Link (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 Link
  • Centering something in a list now centers based on the full available width rather than based on the maximum width of other list content Link
  • Page layout

  • Paragraph layout

  • Added support for spacing that is both weak and fractional Link

Visualize

  • Added support for spot colors (also called separation colors) Link
  • Tilings

  • Gradients

  • Fixed various bugs with rectangle strokes in combination with radii Link Link
  • Fixed a potential deadlock with font fallback in SVGs Link
  • 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

Data Loading

Export

Bundle

HTML

  • Mathematical equations are now automatically exported to MathML (thanks to @mkorje) Link

    • 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 Link (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 Link Link (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) Link
  • DOM structure and built-in show rules

  • Serialization

    • HTML is now minified by default; use the --pretty CLI flag or the checkbox in the web app to pretty-print it Link
  • HTML elements

  • Whitespace handling

PDF

SVG

PNG

Command Line Interface

Deprecations

Removals

  • The path element, use curve instead Link (Breaking change)
  • The pattern type, use tiling instead Link (Breaking change)
  • The pdf.embed element, use pdf.attach instead Link (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 Link (Breaking change)
  • Various previously deprecated symbols, see the removals section in the dedicated changelog for a full listing (Breaking change)

Development

Migration guide

This section walks you through changes you may need to make to your existing documents to ensure compatibility with Typst 0.15.

Typst 0.15 removes definitions from the Typst standard library that were already deprecated in previous Typst versions. If you are still relying on those, also refer to the Typst 0.14 and Typst 0.13 migration guides.

Baselines

Typst now retains baseline information in more parts of the layout engine (most importantly for boxes, blocks, list items, and equations). This may lead to silent layout shifts. These are generally improvements, but if you’ve previously counter-acted bad-looking output through explicit adjustments, you may need to revisit those.

In particular, Typst will now set the baseline of a box to the baseline of its first line of content and use it to align the box with its surrounding text. This yields better-looking output out of the box.

// Typst 0.15+
Lorem #box(inset: 0.3em, stroke: 1pt)[ipsum] dolor.

// Typst 0.14 and below
Lorem #box(inset: 0.3em, stroke: 1pt)[ipsum] dolor.

File paths

If you are using Typst on Windows, you may have used backslashes in your file paths. This syntax is not supported anymore. Consistent use of forward slashes ensures your document compiles on all supported platforms.

// Typst 0.15+ ✅
#include "chapters/introduction.typ"

// Typst 0.14 and below ❌
#include "chapters\\introduction.typ"

Moreover, the Typst CLI does not support non-Unicode input paths anymore. Such paths are exceedingly rare today.

Math glyph stretching

In mathematical typesetting, glyphs frequently need to be stretched to the size of some part of an equation. This primarily applies to brackets, but also accents, arrows, and more. In Typst, this happens implicitly through matched delimiters or explicitly through the lr and stretch functions.

Typst 0.15 makes some adjustments to how ratios passed to these functions are resolved. Previously, a size of 200% passed to lr.size or stretch.size would be interpreted relative to a glyph size that was potentially already affected by display sizing. Now, ratios are always resolved relative to the base glyph size. In practice, this means that, to retain the same appearance, you may need to increase the target sizes you’ve configured for glyphs that are already larger out of the box in display style (e.g. integrals).

Math delimiters as functions

In Typst’s math mode, various symbols defined in General Symbols can be called like a function, either to be applied as an accent or to delimit body content. Typst 0.15 extends this handling to additional delimiters like chevron.l. This can change the output of existing calls, which would previously fall back to displaying the parentheses (which would rarely have produced desirable output in the case of delimiters).

// Typst 0.15+ ✅
$ chevron.l(x) $

// Typst 0.14 and below ⚠️
$ chevron.l(x) $

Math classes

The class function defines how part of an equation should be laid out (primarily the spacing around it). In Typst 0.14 and below, the class function applied recursively: If applied to a larger piece of content, all items in it would receive the class. In Typst 0.15, the class is only applied to the directly wrapped content. This is mostly a bug fix, but can lead to subtle layout changes.

Calligraphic letterforms in the default math font

With the update to New Computer Modern Math 8.1.0, the default calligraphic letterforms were changed. The previous letterforms can still be accessed by selecting stylistic set 6.

// Typst 0.15, default style.
$ R != cal(R) $

// Typst 0.15, with stylistic set 6.
// Reproduces the default style from Typst 0.14 and below.
#show math.equation: set text(stylistic-set: 6)
$ R != cal(R) $

Paragraphs, boxes, and blocks in HTML

Typst automatically collects inline-level content into paragraphs. In Typst 0.14 and below, the exact same rules were used to collect inline-level HTML elements (e.g. a <span>) into Typst paragraphs, which in turn result in <p> elements. This had the unfortunate effect that even use of the low-level typed HTML API could result in <p> elements appearing automatically. Consider the example below:

#html.div({
  html.span[Hello]
  html.div[World]
})

Where Typst 0.14 would insert an unexpected additional <p> element, Typst 0.15 yields the expected result:

<!-- Typst 0.14 and below ⚠️ -->
<div>
  <p><span>Hello</span></p>
  <div>World</div>
</div>

<!-- Typst 0.15+ ✅ -->
<div>
  <span>Hello</span>
  <div>World</div>
</div>

This change in output is achieved through a few new rules for how paragraphs are collected in HTML export. Previously, Typst would always categorize elements into either inline-level or block-level. It would then force inline-level elements into a paragraph whenever at least one block-level element was present in the same flow of content. In Typst 0.15, elements can instead be considered inline-level, block-level, or neutral:

  • Text, Typst box elements and HTML phrasing content (elements that are allowed as children of <p> elements) are considered inline-level1
  • All other HTML elements are considered neutral
  • Typst block elements are considered block-level

Neutral elements don’t force adjacent inline-level content into paragraphs. They can co-exist with inline-level content in a mixed flow. This ensures that usage of the typed HTML API does not result in extraneous paragraphs.

Meanwhile, Typst elements that are block-level out of the box (e.g. heading) now explicitly use a block in their default show rule to ensure that they still force adjacent inline-level elements into paragraphs. This ensures consistency in paragraph grouping across paged and HTML export. Package authors should also explicitly use blocks when creating HTML components that Typst should consider block-level.

To make this change possible, the way boxes and blocks behave in HTML export has been adjusted: Instead of unconditionally wrapping their contents in a <span> or <div>, they now do just what is necessary to ensure their contents are considered inline- or block-level by browsers. If they contain multiple children, they still create a wrapper element, but for just a single child, they instead configure the CSS display property. And if the single child already has the appropriate display property by default, it is fully omitted. Then, the effect of the box or block is limited to influencing Typst’s paragraph grouping.

HTML script and style elements

The typed HTML functions for the HTML script and style element previously accepted arbitrary body content and then only failed during HTML serialization if the content resulted in non-textual elements. In Typst 0.15, they instead only accept strings in the first place. Note that you can also use them with raw syntax by accessing the .text field.

// Typst 0.15+ ✅
#html.style("a { color: red }")
#html.style(
  ```css
  a { color: red }
  ```.text
)

// Typst 0.14 ❌
#html.style[
  a { color: red }
]

Classes in SVG export

Typst 0.14 and below would generate the class attributes typst-frame, typst-doc, typst-group, typst-shape, and typst-text on SVG elements in SVG export. These are no longer emitted. If you are using the typst-frame class to style html.frame elements in HTML export, you’ll need to adapt your style sheet.

Variable font family names

Typst aims to unify different fonts from the same family under a single family name. To that effect, it automatically trims common style suffixes like “Bold” or “Condensed” from font family names. Instead of selecting these through the name, they should be accessed through Typst’s built-in mechanisms (such as the weight and stretch parameters).

In Typst 0.15, the additional suffixes “Variable”, “Var”, and “VF” are trimmed to unify static and variable fonts into a single family. If you’ve previously used a font with any of these suffixes in its family name, you should now omit the suffix when specifying the font.

Upcoming raw language tag changes

In the next Typst version, we will make a change to how raw language tags are parsed. Should this upcoming change have an effect on your document, the compiler will already warn you today and suggest how to adjust your document to future-proof it against the change.

Numbering fallback for the number zero

Not all numbering systems can express the number zero. In Typst 0.14 and below, those would silently fall back to Arabic numerals for 0. This behavior is deprecated in Typst 0.15. Using zero with these systems will become a hard error in the future.

Tightened validation in some functions

The array.slice function, str constructor, and text.features parameter now perform stricter validation on their inputs. If you’ve previously passed invalid or nonsensical input, you will now receive an error.

Renamed citation styles

Typst 0.15 renames some citation styles to stay aligned with upstream CSL changes. If you are relying on any of these, the compiler will warn you and suggest the new name.

Renamed symbols

Typst 0.15 also renames a few symbols in General Symbols. If you are using any of these, the compiler will warn you and suggest the new name.

Contributors

Thanks to everyone who contributed to this release!

  1. 1There are a few exceptions: Some elements like <script> are considered phrasing content by the HTML specifications, but don’t make sense in paragraphs as they default to display: none.