Typst

For Typst the extension prints each index with page locators, in two columns, built from the same marks every other back-end reads. A declared index that no mark files in prints nothing, not even its heading. It needs no Typst package: everything the index uses is written into the document, so nothing is downloaded when the document compiles.

A page number is known only once Typst has laid out the pages, and the extension runs before that. So it writes an invisible Typst label at each mark, and each locator in the index asks Typst for the page of its label while the document is typeset. A mark in a heading gets its label just after the heading, so the copy of that heading in the table of contents carries none. For the same reason, a mark in the caption of most figures, tables and code listings gets its label in the float’s content. See Lists of figures, tables and listings for which floats.

Where the index goes

Each index goes where your placement marker puts it, and at the end of the document where no marker names it, in the order your indexes: metadata declares them. See Placing the index. An index starts on a new page under an unnumbered level-one heading, which Typst lists in the table of contents. The heading is the title your indexes: metadata gives the index, or its name where you give no title. A document that declares no indexes: gets Index, or its language’s word for an index where the extension covers that language. The text after the index starts on a new page too.

Entries

The entries are ordered and grouped as in HTML: a Symbols group first, then one group per letter, each under its letter in bold. See Letter groups in the HTML index. A sub-entry is indented under its parent, and sub-entries nest as deep as you write them.

Locators

Each locator is the page number as the page shows it. Each one links to its page.

  • Where the page numbering pattern names two counters, such as 1 / 1, a locator prints both, as the page footer does: 5 / 30.
  • A page with no numbering prints its physical page number.
  • Several marks of one term on one page print that page once.
  • Locators that print the same text print it once, even from different pages, as after a page counter reset. That one locator links to the earliest of those pages, and it is bold where any of their marks is a principal mention. It prints at the place of the first of them in the order below.
  • The locator of a principal mention is set in bold. Where a principal and an ordinary mark of one term share a page, that page’s one locator is bold.
  • A range prints its opening and closing pages, 12–15, and links to the opening page. Where both ends of a range are on one page, with no page counter update between them, it prints that page alone. Where the two ends print the same text, it prints that text alone.
  • An entry’s locators are ordered by the numbering of their opening pages, as the PDF index orders page numbers. Lower roman numbers come first, then upper roman numbers, arabic numbers, lowercase letters, uppercase letters, and then any other numbering. The first counting symbol of the page numbering pattern sets the kind, so 1 / 1 is arabic. A page with no numbering counts as arabic, with its physical page as its number, and a numbering function counts as other. Numbers of one kind are ordered by value, the page counter’s value or the physical page where a page has no numbering, and then by page. So after a page counter reset, 1 comes before a 3 from an earlier page. Where two locators of one kind and number open on one page, the one that closes on the earlier page comes first, and a single mark comes before a range that closes on its page.
  • A range whose two ends print different numbers of one kind, with a higher closing number, spans the numbers from its opening number to its closing number, both included. A mark of the term on a spanned number of that kind prints no locator of its own, even on a page after the range, as after a page counter reset. A principal mention there loses its bold. A range whose two ends print the same text counts as a single mark, and a span removes it the same way. Any other range spans nothing. A span never removes a range whose two ends print different text.
  • Pages you marked separately stay separate: marks on pages 3, 4 and 5 print 3, 4, 5. Only a range you write prints as a range. A mark on the page just after a range prints its own locator, 2–3, 4, where the PDF index prints 2–4.
  • A mark in an image’s alt text files the image’s page. Pandoc writes alt text to Typst as a plain string, which Typst does not print, so the extension writes the mark’s label, and an id you give the mark, just after the image. A link to that id builds and goes to the image’s page. Where the image sits in the caption of a float that keeps its labels in its caption, a list copies the id, and a link to it fails, as for a caption mark. See Lists of figures, tables and listings for which floats.

Cross-references

A cross-reference prints its word in italics, then its target as plain text, with no link. Two targets of one kind share one word: see Felines; Pets. The words are see and see also, your document language’s words where the extension covers that language, or the words you set under index-labels:, which Typst reads for symbols, see and see-also.

The punctuation is fixed: a comma before each locator and before the first cross-reference, and a semicolon between two cross-references. The separator and xref-separator keys of index-labels: do not reach the Typst index.

Books

Quarto renders a Typst book as one merged document, so the extension sees every chapter’s marks at once, and a range you open in one chapter and close in another pairs. Books were tested on Quarto 1.10.18. On that version Quarto’s Typst book template does not compile a book whose book: metadata has no author:. Quarto 1.5.52 does not render a Typst book. It prints the warning The typst format is not supported by book projects and writes no PDF.

Lists of figures, tables and listings

When this page was written, lof: true printed no list of figures in a Typst document (observed on Quarto 1.10.19, 2026-10-19). To print one, write Typst’s own outline in a raw Typst block:

```{=typst}
#outline(title: [List of Figures], target: figure.where(kind: "quarto-float-fig"))
```

A list of tables takes the kind quarto-float-tbl, and a list of code listings takes quarto-float-lst. Such a list copies each caption it lists. Take a figure, a figure div, a table or a code listing whose content is one image or paragraph, one table or one code block. A mark in its caption gets its label in that content, so the mark files the page its caption prints on. An id you give it names one place, so a link to it builds. Both hold when the float does not break across pages, which is Quarto’s default. In a document that makes floats breakable, such a mark files the page where the float’s content ends.

Any other float keeps a caption mark’s label in the caption, because moving it into that content changed the layout. A list before such a float files the mark on the list’s page. An id you give the mark is copied with the caption, so a Typst link to it fails to compile. These floats include a float laid out in cells with layout-ncol or its kin, such as a grid of images or tables. A code listing with a filename is one, as is a figure or table whose content Quarto keeps in a code cell’s output div, as a knitr kable does. They also include a figure with no id whose content does not start with text or an image, which Markdown does not make. A knitr plot and a table knitr writes with output: asis take the label in their content.

A mark Typst never prints

A mark in a front-matter field that Quarto’s Typst template does not print, such as description:, has no label on any page, so it adds no page number. If all the page-number marks of an entry are such marks, and no cross-reference or sub-entry of it prints, the Typst index leaves it out. A letter group none of whose entries prints has no heading. Such an entry that is kept for a sub-entry that prints shows no page number of its own, and so does an entry whose range opens in such a field and closes on a page.

A see= or see-also= mark in such a field adds no cross-reference. A cross-reference prints where one of the marks that write it is on a page. A cross-reference whose target term is left out is not printed, and nothing reports it. Where the target was the first of its kind, the word see or see also goes in front of the next target of that kind that prints. An entry left with nothing that prints is left out. Two terms whose cross-references point at each other both print, if a mark of each is on a page. A target that no mark files still prints, and the dangling-target report names it. An index whose every entry is left out prints nothing: no heading, no line in the table of contents and no page, as an index that no mark files in prints nothing.