Skip to content

0.128 → 0.129 — footnotes, math and definition lists, and ui.layout: flat is deprecated

Three extended markdown constructs join the content: a footnote, an equation and a definition list. Markdown that spelled any of them imported as something else in 0.128, so each section below is a change nothing reports, and the table closing the guide lists every break. The card schema's layout hints change too (§"Layout hints").

Footnotes

text[^1] with a [^1]: The note. definition renders a footnote, where 0.128 dropped the definition and kept [^1] as text. The reference stores as a footnote island at its place in the paragraph, holding the note as one table cell, {text, marks}; a note cited twice prints twice. Export numbers the references [^1], [^2], … in reading order and writes each definition after the body. A Typst plate draws it through Typst's footnote, so #set footnote(..) styles it.

A note is one passage. What it cannot hold drops and warns parse::dropped_construct:

  • a heading, list, code block, quote, table or rule inside a note keeps its text as lines of the note and warns footnote[list] and the like;
  • a definition nothing references, a second definition of one label, and a reference inside a table cell, an image's alt text or a note warn footnote.

footnote warned in 0.128 for every definition, so a host reading it as "footnotes are unsupported" reads it now as one of these.

Math

$x^2$ and $$\frac{a}{b}$$ render equations, where 0.128 rendered the dollars and the TeX as text. Each stores as a math island holding the TeX between its dollars under tex, a display one with display: true. A $ that opens nothing stays text: the opening $ takes no space after it and the closing one none before it, and braces inside balance, so $5 and $10 reads as before. To keep a pair of dollars as text, escape one: \$. Export writes \$ wherever a $ of the text could pair with another.

An equation in a table cell, an image's alt text or a footnote keeps its source as text and warns parse::dropped_construct (math), as does one whose TeX is blank once its edge whitespace drops. The authored lanes refuse a math island whose tex markdown cannot write between its dollars as ParseError::Shape.

The Typst backend translates the TeX to Typst math. A command outside the vocabulary Markdown Syntax lists draws as its own name and warns typst::unsupported_tex. Typst lays an equation out only in a font with a math table, so the backend embeds Noto Sans Math and has it answer to New Computer Modern Math, the family Typst sets equations in, for a quill shipping no font of that family. A plate setting show math.equation: set text(font: ..) to a font its quill ships draws in that one. quillmark workspace does not export the embedded face, so Typst's own tools draw an equation only in a math font the quill ships.

An acroform quill declines both as it declines every construct but the paragraph, under backend::declined_construct.

Definition lists

A paragraph with a : description line under it is a term and its description, where 0.128 imported both as one paragraph reading Term : description. The term stores as a term line and the description as a description container around its blocks; several : lines under one term are several descriptions. A Typst plate draws each term through Typst's terms.item, so #set terms(..) styles it. A definition list inside a footnote keeps its text as lines of the note and warns footnote[definition list].

A line of prose opening : under a paragraph reads as a description now. To keep it prose, escape the colon: \:. Export writes that escape before every paragraph line opening :.

An acroform quill declines a definition under backend::declined_construct (definition), and its text lands as lines.

Layout hints

schema() no longer writes ui.layout: flat on an object alone in its legacy ui.group. Nothing reports the change. An editor that read the flag to let the group header name that object finds it absent: detect the case itself, a group whose only field is an object.

ui.layout: flat warns quill::deprecated_flat, one per field, naming its path. It still loads where it loaded, and schema() still echoes it. No editor honors it: a card's top-level object is a panel framing its properties, and a nested one a subform. Drop the key.

A card-level field outside every group, declared after a top-level object or a grouped field, warns quill::field_after_object. An editor draws it above the groups. Declare it ahead of them, or move it into an object.

Text values in a plate

A one-line value printed in a Typst plate carries no space on either side, where 0.128 printed one at each edge. Dear #qm.ink(qm.data, "name"), renders "Dear Mr. Babbage," where it rendered "Dear Mr. Babbage ,". A text or richtext field without multiline is one such value, and so is each element of an array of them. A plate that trimmed the spaces itself keeps working and can drop the trim; one that leaned on them, as #qm.ink(data, "first")#qm.ink(data, "last"), writes the space between.

Stored rows

The storage tag is quillmark/document@0.129.0, the first that can hold a footnote or math island, a term line or a description container. A row under an older tag loads as before, and its content does not re-import, so text it stored as $x$ stays text. A save rewrites it under the new tag, so a hash over stored bytes recomputes once, though nothing else in the row moves. A 0.128 build refuses a row from then on, as a build too old for its tag.

Every break

Break Surface Action
A footnote reference and its definition render a footnote and import as a footnote island, where the definition dropped and the reference stayed text rendered output, imported content None
parse::dropped_construct footnote names a definition nothing references, a second definition of one label, or a reference where no note can sit, and footnote[<block>] a block inside a note Parsed.warnings, doc.warnings, revise warnings Drop the construct, or let the warning stand
$…$ and $$…$$ render equations and import as a math island, where they were text rendered output, imported content Escape a dollar, \$, to keep the text
An equation in a table cell, an image's alt text or a footnote warns parse::dropped_construct (math) Parsed.warnings, doc.warnings, revise warnings Move the equation into prose, or let the warning stand
A TeX command the Typst backend does not lower draws as its name and warns typst::unsupported_tex Typst session warnings, RenderResult.warnings Rewrite it with a listed command
The Typst backend embeds Noto Sans Math, which answers to New Computer Modern Math for a quill shipping no font of that family Typst rendered output None
An equation whose TeX is blank once its edge whitespace drops stays text and warns parse::dropped_construct (math) Parsed.warnings, doc.warnings, revise warnings Write TeX between the dollars, or escape one
A paragraph with a : line under it renders a definition list and imports as a term line and a description container, where it was one paragraph rendered output, imported content Escape the colon, \:, to keep the text
Export writes \: before a paragraph line opening : exported markdown None
An acroform render declines a footnote, an equation or a definition under backend::declined_construct acroform session warnings, RenderResult.warnings, Quill::validate None
IslandType gains Footnote and Math, LineKind gains Term, Container gains Description, BlockConstruct gains Footnote, Math and Definition, and Dropped gains NoteBlock and Math; StoredDocument gains V0_129_0, and STORAGE_V0_129_0 is the current tag Rust An exhaustive match adds the arms
ContentIsland gains footnote and math members, props: FootnoteProps and props: MathProps; ContentLineKind gains term and ContentContainer gains description WASM A switch over type, kind or container handles them
A save writes quillmark/document@0.129.0, and a 0.128 build refuses the row from then on stored documents None to load; a hash over stored bytes recomputes
A one-line text value prints with no space at either edge Typst rendered output Drop a trim of those spaces; write a space the plate leaned on
An object alone in a legacy ui.group carries no ui.layout: flat schema() Detect a group whose only field is an object directly
ui.layout: flat warns quill::deprecated_flat Quill::warnings, every render's warnings, quillmark validate Drop the key
A loose field after a top-level object or a grouped field warns quill::field_after_object Quill::warnings, every render's warnings, quillmark validate Declare it ahead of the groups, or move it into an object