Skip to content

Table multiple headers and subheaders#6168

Merged
laurmaedje merged 109 commits intomainfrom
table-subheaders
Jun 10, 2025
Merged

Table multiple headers and subheaders#6168
laurmaedje merged 109 commits intomainfrom
table-subheaders

Conversation

@PgBiel
Copy link
Contributor

@PgBiel PgBiel commented Apr 11, 2025

Solves part of #5375 and #5377

  • Table headers can now be placed at any row, not only the first (then, they will repeat starting on the next page).
  • A table can now have more than one header.
    • Each will cause the previous one to stop repeating, and the new one starts repeating on the next page instead.
  • A table can now have subheaders: headers with levels, like headings.
    • When headers with different levels are placed, they repeat simultaneously.
    • Levels form a hierarchy. When a level 2 subheader is placed, the previous level 2, as well as level 3+, subheaders stop repeating altogether, and the new level 2 subheader starts repeating instead, as if it began a new "table section".

As a bonus, headers with repeat: false now have orphan prevention too! They won't appear alone at the bottom of a page anymore.

Some preliminary work which will enable multiple footers and subfooters is also included, but the actual implementation of those is left to a follow-up PR.

Example

Source code

#set page(height: 15.6em, width: 120pt, margin: 10pt)
#table(
  columns: 2,
  align: center,
  table.header(
    table.cell(colspan: 2)[*Regional User Data*],
  ),
  table.header(
    level: 2,
    table.cell(colspan: 2)[*Germany*],
    [*Username*], [*Joined*]
  ),
  [john123], [2024],
  [rob8], [2025],
  [joe1], [2025],
  [joe2], [2025],
  [martha], [2025],
  [pear], [2025],
  table.header(
    level: 2,
    table.cell(colspan: 2)[*United States*],
    [*Username*], [*Joined*]
  ),
  [cool4], [2023],
  [roger], [2023],
  [bigfan55], [2022]
)

Output:

image

Implementation details

Core concepts

  • Header level: an integer >= 1. Headers with different levels may repeat together as soon as each one is found, as long as they are placed in strictly ascending levels order (level 1 then level 2 then level 3 header => they will all repeat together).
    • However, outside of ascending order, whenever a header is placed and starts repeating on each page, it stops repetition of any previous higher or equal level headings.
    • If no lower level headers appear further on, a header repeats until the last page of the table.
  • Short-lived headers: consecutive headers in non-strictly ascending order, such as a level 2 header immediately followed by a level 1 header, or a level 5 header followed by another level 5 header.
    • These headers would immediately stop repeating, so they are treated as non-headers, being simply an unbreakable row of groups like every header (just to keep this invariant).
    • This means that such headers do not have orphan prevention (as explained below) given they cannot possibly have "children" rows to attach to.
    • It is worth noting that headers at the very end of the table are also considered short-lived, even if there's a footer between it and the table's end.
  • Orphan prevention: headers should never appear at the bottom of a page, without any non-header rows below.
    • As such, any consecutive headers always appear together with the first non-header row afterwards. They are moved to the next page if necessary.
    • Short-lived headers do not have this guarantee.

Main implementation overview

  • In grid resolving: the most important changes necessary were already done after Refactor grid header and footer resolving #5919.

    • This step is now responsible for detecting short-lived headers (described above).
      • When a new header is found, any consecutive headers right before it with conflicting levels are marked as short-lived. Afterwards, any headers at the end of the table (or separated from it only by a footer) are also marked as such.
  • Finding a new header: This is the most fundamental step among the new changes, and happens during usual row layout.

    • Whenever a row that belongs to a header is found, that header is added to the counter of consecutive headers without laying out anything, until we find a header that is followed by a non-header row, or by a short-lived header.
      • The upcoming_headers field in the grid layouter is what lets us know when a new header is found. It is a slice of headers sorted by ascending first row index, so we just keep checking if a new row is inside the first upcoming header until it is found.
    • When the last header of a sequence is found, we begin the new header layout process:
      • Currently repeating headers with a higher level than the lowest one in this sequence immediately stop repeating (so they don't appear again in the next region if the new headers have to be moved there to fit);
      • Layout state fields storing header heights - specifically header_height (the only one before this PR), repeating_header_height (new) and repeating_header_heights (new) - are updated.
        • repeating_header_heights is a vector that holds the height of each currently repeating header. With it, we know the height of each header we just forced to stop repeating, allowing us to update header_height to the correct new value.
        • repeating_header_height is similar to header_height but ignores headers that only appear once (non-repeating headers). We use this for multi-page row layout (more on this later).
      • All previous headers being currently held are laid out (skipping to a fitting region if necessary);
      • Orphan prevention is set up (see the dedicated bullet point below);
      • The new headers are stored as the pending_headers slice.
        • This is important so that they can be laid out again in the next page if orphan prevention later requires that.
        • While pushing them directly to repeating_headers (explained further below) could also work, that wouldn't consider non-repeating headers, which also participate in orphan prevention, so two slices/vectors are needed: "headers which have been laid out once, and should be repeated in the next regions" (repeating_headers vector) vs "headers which haven't been laid out yet, waiting for the first non-orphan opportunity" (pending_headers slice - may include non-repeating headers).
  • Orphan prevention: The next step after the first layout attempt of new headers is to ensure they are not orphans. That is, if, after that first layout, the page ends and no other rows were laid out, this means the new headers should be removed and we should try again in the next page.

    • This is implemented with a snapshot mechanism, which differs from (but is inspired by) the existing one for sticky blocks in the flow. It's fairly simple:
      1. When we push the first header in a sequence of headers (no matter repeated or pending), we record the amount of rows in the current region (page) right before we push it in the lrows_orphan_snapshot variable.
      2. Next, a hook is added to push_row such that, whenever a new non-header row is pushed to the region, it clears that snapshot variable (becomes None) and flushes pending headers, which clears the pending_headers slice, moving any repeating headers to repeating_headers to indicate they will be repeated in the next regions.
        • In the "happy path", this happens immediately after the new headers are found, such that they are placed at the same page they were found and then just repeat later if requested. But we use the pending_headers slice precisely to guard against the non-happy path of having orphan headers.
      3. At the end of the region, if the snapshot variable was not cleared, the vector of rows in the current region is restored to the amount indicated in that variable.
        • Otherwise, nothing happens (laid out headers are kept, and pending headers were already flushed, so we stop trying to place them for the first - maybe only if non-repeating - time).
    • If orphan prevention was triggered and pending headers were removed from this region, they stay in the pending_headers slice, so we will try to place them at the start of the next region instead.
    • This completely subsumes the previous mechanism of simply checking whether the current region only had header and footer rows, and the reason is that headers no longer appear necessarily at the top, which was something we assumed before since there could only be one header, at the start.
    • The snapshot is regenerated on each region break to detect regions with only headers and footers instead. Then, there is a snapshot at 0 rows, which is restored if nothing else can be placed.
    • The snapshot is not regenerated if we detect a potential cycle (regions.may_progress() fails), which could force us to place orphan headers.
      • I think (to be tested) this can only happen if there is a very large non-repeating header - since it never repeats, a non-header row right afterwards that didn't fit can safely migrate to the next region in order to get more space.
      • EDIT: it is now assumed in the code logic that non-repeated headers can become orphans in one situation: where it and its subsequent rows don't fit in one page. Then the subsequent rows will skip in the lack of better option.
  • On each region break:

    1. Restore the orphan snapshot, if still active.
    2. Store information related to repeated headers in this region.
      • We store the repeated header height at the top of the region, as well as info about the last repeated header and the amount of repeated headers, in a vector finished_header_rows. This is used later by rowspans and line layout (see below).
    3. After starting a new region, repeat headers where necessary.
      • Set up orphan prevention again.
      • We place all headers in repeating_headers again.
      • Any pending_headers are also placed, as the fact they are still there indicates they were orphans in the previous region and so were not placed yet.
      • We regenerate header_height and friends.

Other affected areas of grid layout

  • Rowspans: Since they may span more than one page, their layout is delayed and only happens at the last page.

    • That's why we store the height of repeated headers at the top of each region. Each frame of the rowspan - one for each spanned page - has to be placed below repeated headers. So that's the height that needs to be skipped each time.
  • Line layout: the previous invariant of lines of repeated headers taking priority over normal rows below them was kept.

    • For this, we store the end bound of the last repeated header in each region. Any lines coming from that end bound take precedence on each page the header is repeated.
    • We also store the amount of repeated headers in each region so we can know at which row of that region we will need to perform this decision (of using the line under the last repeated header or the line above the first non-header row below it).
  • Multi-page auto rows: since auto rows have to predict how much space will be available in upcoming regions, we store repeating_header_height (height only of repeated or repeatable pending headers) as that's the height to subtract from the second page onwards. On the first page, we already subtracted the height of all headers - repeated, pending - from the region, and on the second page onwards, non-repeating headers will already be gone, so their height doesn't matter, and new headers can't show up while an auto row is still being laid out.

  • Multi-page rowspan simulation: used to predict the available sizes for a multi-page rowspan cell in each upcoming page (so we can calculate by how much to expand its last spanned auto row for the rowspan to fit), we also use repeating_header_height to predict the height of headers in upcoming regions (which is subtracted), for a similar reason as multi-page auto rows, noting that new headers cannot appear while a rowspan is still active, since it cannot span a header from outside it (cells in headers and outside of headers must be entirely disjoint).

Other changes

  • Created RowState to store information during the layout of a single row. This indicates whether the current row is a in a header (and thus should not "defuse" orphan prevention). Also, the row stores its final height in it, but only if it's a fixed or auto row, to allow calculating header height.
  • Grouped up fields related to the current region in Current.

TODO

  • Refactor new grid layouter fields (group them up).
  • Additional fixes to orphan prevention
  • Test gutters and some more orphan prevention edge cases
  • Test interaction with footers
  • HTML export (can be left to a future PR) Initial HTML support has been added (not the best accessibility yet I think, but enough to indicate the presence of headers where necessary).
  • Remove TODO comments where applicable
  • General cleanup where applicable

PgBiel added 30 commits April 3, 2025 01:49
pending headers change
Considerations:
- Need to change layout headers algorithm to
  1. Place those headers
  2. But in a new region, also place other repeating headers
  3. Keep footer height up-to-date without much intervention
- May have to include ALL headers when skipping a region...
- Approach too naive
- Subtract footer height in it already
- Still need to fix finish region
- This will allow us to tell layout_headers to just layout headers that are already repeating, plus pending headers which are waiting for layout.
- flush pending headers
- properly layout headers at region start
- Currently also includes non-repeatable header row heights, which will lead to bugs on rowspans; needs fix
- Faulty, as we have to update it when pushing new pending headers too
- Need to have a vector associating a height to each row...
So we can update in the middle of the region
this has been done on pending header layout now
- dont wait until the end of the region, as a header can start and end in the same region (i.e. never repeat).
- remove non-repeating header height on pending flush
- use lrows
- reset current region dataon orphan prevention row wipe
check if there is another header at the end, not if at the next row
- Include new headers at the start as part of the region's header rows
- Check if header rows are all rows
- With a header at the end, decrease the header row count for orphan prevention.
PgBiel added 5 commits May 16, 2025 04:29
Even if they don't repeat, they should cause previous headers to stop repeating.
We were checking after instead of before fixing up header indices due to gutter.
@laurmaedje laurmaedje added layout Related to layout, positioning, etc. interface PRs that add to or change Typst's user-facing interface as opposed to internals or docs changes. labels Jun 4, 2025
@PgBiel
Copy link
Contributor Author

PgBiel commented Jun 10, 2025

I didn't add an example to docs as I don't remember if multi-page examples are supported, or would look good 🤔

One alternative is to show a single-page example anyway, but indicating the header levels - better than nothing...

Copy link
Member

@laurmaedje laurmaedje left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't add an example to docs as I don't remember if multi-page examples are supported, or would look good 🤔

Let's revisit that during general docs polishing phase before release.

Apart from the two typos, this is ready to merge now, right?

@laurmaedje laurmaedje added this pull request to the merge queue Jun 10, 2025
Merged via the queue into main with commit 7c7b962 Jun 10, 2025
13 checks passed
@PgBiel
Copy link
Contributor Author

PgBiel commented Jun 10, 2025

Apart from the two typos, this is ready to merge now, right?

I was going to answer this just now, but it seems that you've read my mind already 😄

@laurmaedje
Copy link
Member

Totally forgot I asked :D

@laurmaedje laurmaedje deleted the table-subheaders branch June 10, 2025 14:53
@mewmew
Copy link
Contributor

mewmew commented Aug 7, 2025

Really happy to see the addition of subheaders in tables! Thank you @PgBiel <3

For a paper I'm writing, it helped resolve the position of subheaders to the correct page.column, so it wouldn't be "alone" without any associated data cells on the same page.

Before PR

As a reference, this was before the PR:

page 1 (notice subheader "alone" on page without any associated data cells)
screenshot_2025-08-07_18:41:00

page 2
screenshot_2025-08-07_18:41:11

After PR

And this is after the PR:

page 1
screenshot_2025-08-07_18:41:31
page 2
screenshot_2025-08-07_18:41:41

hiandy24 pushed a commit to hiandy24/typst that referenced this pull request Sep 27, 2025
… upstream (#1)

* Numbering implementation refactor (typst#6122)

* Pin colspan and rowspan for blank cells (typst#6401)

* Clean up some parser comments (typst#6398)

* Autocomplete fixes for math mode (typst#6415)

* Update docs for gradient.repeat (typst#6385)

* Document how to escape lr delimiter auto-scaling (typst#6410)

Co-authored-by: Laurenz <[email protected]>

* Improve number lexing (typst#5969)

* Report errors in external files (typst#6308)

Co-authored-by: Laurenz <[email protected]>

* Table multiple headers and subheaders (typst#6168)

* Use the shaper in math (typst#6336)

* Standardize trailing slashes in docs route paths (typst#6420)

* Make a more descriptive definition of `module` (typst#6380)

* Specify which CSL style is not suitable for bibliographies (typst#6306)

Co-authored-by: Laurenz <[email protected]>

* Adjust source file API surface (typst#6423)

* Do not force `math.mid` elements to have the Large math class (typst#5980)

* List both YAML file extensions in bibliography docs (typst#6426)

* Fix panic when test source is not found in world (typst#6428)

* Use `codex::ModifierSet` (typst#6159)

Co-authored-by: Laurenz <[email protected]>

* Render `#super` as `<sup>`, `#sub` as `<sub>` in HTML (typst#6422)

* Warning when watching stdin (typst#6381)

Co-authored-by: Laurenz <[email protected]>

* Fix untidy Cargo.lock

* Warn when using variable fonts (typst#6425)

* Check that all translation files are added to TRANSLATIONS and ends with newline (typst#6424)

Co-authored-by: Laurenz <[email protected]>

* Unify `EvalMode` and `LexMode` into `SyntaxMode` (typst#6432)

* Consume `data` argument in `pdf.embed()` (typst#6435)

* Better error message for compile time string interning failure (typst#6439)

* Ensure that label repr is syntactically valid (typst#6456)

* Hint for label in both document and bibliography (typst#6457)

* Prefer `.yaml` over `.yml` in the docs (typst#6436)

* Fix align link in layout documentation (typst#6451)

* Fix param autocompletion false positive (typst#6475)

* Encode empty attributes with shorthand syntax

* Add `Duration::decompose`

* Generic casting for `Axes<T>`

* More type-safe color conversions

* Add  `typst_utils::display`

* Support for generating native functions at runtime

* Typed HTML API (typst#6476)

* Consistent codepoint formatting in HTML and PDF error messages

* Test runner support for HTML export errors

* Turn non-empty void element into export error

* Handle pre elements that start with a newline

* Extract `write_children` function

* Properly handle raw text elements

* Fix stroke cap of shapes with partial stroke (typst#5688)

* Adding Croatian translations entries (typst#6413)

* Rewrite `outline.indent` example (typst#6383)

Co-authored-by: Laurenz <[email protected]>

* Use ICU data to check if accent is bottom (typst#6393)

Co-authored-by: Laurenz <[email protected]>

* Add docs for `std` module (typst#6407)

Co-authored-by: Laurenz <[email protected]>

* Improve equation reference example (typst#6481)

* Add page reference customization example (typst#6480)

Co-authored-by: Laurenz <[email protected]>

* Bump `krilla` to current Git version (typst#6488)

Co-authored-by: Laurenz <[email protected]>

* Check that git tree is clean after build (typst#6495)

* Also fix encoding of `<textarea>` (typst#6497)

* Minor fixes to doc comments (typst#6500)

* Fix typos in page-setup.md (typst#6499)

* Support `in` operator on strings and modules (typst#6498)

* Consistent sizing for `html.frame` (typst#6505)

* Allow deprecating symbol variants (typst#6441)

* Disallow empty labels and references (typst#5776) (typst#6332)

Co-authored-by: Laurenz <[email protected]>

* Fix nested HTML frames (typst#6509)

* Basic support for text decoration functions in HTML (typst#6510)

* Improve sentence in guide for LaTeX users (typst#6511)

* Sort line items by logical order when constructing frame (typst#5887)

Co-authored-by: Laurenz <[email protected]>

* Fix panic when sampling across two coincident gradient stops (typst#6166)

* Bump `typst-dev-assets` (typst#6514)

* Acknowledgements (typst#6528)

* Support HTML tests in test-helper extension (typst#6504)

* Fix typo in Advanced Styling docs tutorial (typst#6517)

* Fix typo in PDF standard CLI help (typst#6518)

* Fix typo in PDF standard CLI help part 2 (typst#6531)

* Fix minor typo in `array.product` docs (typst#6532)

* Fix typos in calc module docs (typst#6535)

* Use "subs" and "sups" font features for typographic scripts (typst#5777)

* Use punctuation math class for Arabic comma (typst#6537)

* Remove duplicate language computation (typst#6557)

* Fix typo in PackageStorage (typst#6556)

* Fix nightly warnings (typst#6558)

* Fix minor typo in function docs (typst#6542)

* Refer to json function instead of deprecated json.decode in groups docs (typst#6552)

* Rewrite foundations of native elements (typst#6547)

* Target-specific native show rules (typst#6569)

* Construct library via extension trait instead of default & inherent impl (typst#6576)

* Move `html` module to `typst-html` crate (typst#6577)

* Fix typo of Typst domain in quote docs (typst#6573)

* Anti-alias clip paths (typst#6570)

* Use "displayed" instead of "repeated" to avoid ambiguity in numbering docs (typst#6565)

* Ignore spans when checking for RawElem equality (typst#6560)

* Add `default` argument for `str.first` and `str.last` (typst#6554)

Co-authored-by: Laurenz <[email protected]>

* Add completions subcommand (typst#6568)

* Update Swedish translations based on defaults used for LaTeX and cleveref (typst#6519)

* Move math styling to codex and add `math.scr` (typst#6309)

* More consistent `Packed<T>` to `Content` conversion methods (typst#6579)

* Support images in HTML export (typst#6578)

* Fix tooltip for figure reference (typst#6580)

* Complete movement of HTML export code to `typst-html` (typst#6584)

* Handle `lower` and `upper` in HTML export (typst#6585)

* Deduplicate labels for code completion (typst#6516)

* Fix regression in reference autocomplete (typst#6586)

* Use "whitespace" instead of "space" to denote block-level equation in docs (typst#6591)

* Fix minor typo in text docs (typst#6589)

* Rephrase docs for truncation of float/decimal to integer (typst#6543)

* HTML frame improvements (typst#6605)

* Change `enum.item.number` to `Smart` instead of `Option` (typst#6609)

* Support setting fonts repeatedly with different `covers` (typst#6604)

* Support intra-doc links in HTML (typst#6602)

* Partially automate span assignment in native show rule (typst#6613)

* Bump `zip` dependency (typst#6615)

* Restore timing scopes for native show rules (typst#6616)

* Slightly improve selector docs (typst#6544)

* Add show rule for smallcaps in HTML (typst#6600)

* Mention Tinymist in README.md (typst#6601)

* Fix documentation oneliners (typst#6608)

* Add rust-analyzer to flake devShell (typst#6618)

* Add Lithuanian translations (typst#6587)

* Bump CI Rust to 1.88

* Bump MSRV to 1.88

* Migrate to 2024 edition

* Fix 2024 clippy warnings

* Yeet `if_chain` macro

* Reformat with 2024 edition

* Add support for PDF embedding (typst#6623)

Co-authored-by: Laurenz <[email protected]>

* Add `pdf` extension to image autocompletions (typst#6643)

* Fix bounding box computation for lines in curves (typst#6647)

Co-authored-by: Laurenz <[email protected]>

* Lint for iterations over hash types (typst#6652)

* Create constructor methods for manifest types (typst#6625)

* Remove unnecessary `comemo` dependency in `typst-syntax` (typst#6668)

* Remove duplicate center alignment style for equations (typst#6667)

* Fix incorrect `vline.x` docs (typst#6657)

* Miscellaneous minor docs improvements (typst#6651)

Co-authored-by: Laurenz <[email protected]>

* Allow explicit autocomplete immediately after comma and colon (typst#6550)

* Improve Guide for LaTeX users, Query Function, and replace invisible emojis (typst#6620)

Co-authored-by: PgBiel <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Hint that deprecated items will be removed in `0.15.0` (typst#6617)

* Specify the standard smart quotes for `Arabic` (typst#6626)

* Use `rustc-hash` for hash maps and sets (typst#6678)

* Faster constraint checking in comemo (bumps comemo & krilla) (typst#6683)

* Add `--target` argument for `typst query` (typst#6405)

Co-authored-by: Laurenz <[email protected]>

* Require parentheses in all function-like sub/superscripts (typst#6442)

Co-authored-by: Laurenz <[email protected]>

* Fix several wrong anchors in `$` docs link resolution  (typst#6684)

* Add `cargo testit` alias for running integration tests (typst#6682)

Co-authored-by: Laurenz <[email protected]>

* Update guides welcome text to refer to list instead of specific guides (typst#6685)

Co-authored-by: Laurenz <[email protected]>

* Prevent broken glyph assemblies when font data is incorrect (typst#6688)

* Allow custom element names in HTML tag syntax  (typst#6676)

Co-authored-by: Laurenz <[email protected]>

* Add interface to disable timer (typst#6695)

Co-authored-by: Derived Cat <[email protected]>

* Add support for drawing COLR glyphs in SVG export (typst#6693)

* Apply aspect ratio correction for linear gradients in PDF export (typst#6689)

* Wrap raw blocks in `<code>` tag additionally to `<pre>` tag (typst#6701)

* Support for raw syntax highlighting in HTML export (typst#6691)

* Ensure that whitespace is not collapsed in inline raw blocks (typst#6703)

* Show aliases of citation styles in docs and completions (typst#6696)

* Correct CeTZ spelling (typst#6706)

* Add `title` element (typst#5618)

Co-authored-by: Laurenz <[email protected]>

* Make HTML data structures cheaper to clone (typst#6708)

* Move `par`, `box`, and `block` to show rules in HTML export (typst#6709)

* Support smartquotes in HTML export (typst#6710)

Co-authored-by: Malo <[email protected]>

* Avoid dangling reference output for HTML tests (typst#6711)

* Support multiple fonts in math (typst#6365)

* Add link to position field of grid.hline and grid.vline docs (typst#6670)

* Rename `pdf.embed` to `pdf.attach` (typst#6705)

* Include numbering in PDF bookmark (typst#6622)

Co-authored-by: Laurenz <[email protected]>

* Document escaping semicolon, valid identifiers, and `state` tips (typst#6674)

Co-authored-by: Andrew Voynov <[email protected]>
Co-authored-by: Yaksher <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Ensure table headers trigger rowbreak (typst#6687)

* Fix phrasing of iff (if and only if) in docs (typst#6713)

* Remove redundant "This can be" from stroke docs of curve and polygon (typst#6715)

* Fix curve docs for fill (refer to curve instead of rectangle) (typst#6714)

* Add span to `html.frame` node (typst#6716)

* Fix return type of `missing_method` (typst#6718)

* Encoding fixes for HTML raw text elements (typst#6720)

* Update RelativeTo to include tiling in docs (typst#6730)

* Add missing "the" for cmyk function of color docs (typst#6731)

* Remove use of "last" and "end" for conic gradient circle docs (typst#6733)

* Fix broken links in docs (typst#6734)

* Simplify links in docs (typst#6732)

Co-authored-by: Laurenz <[email protected]>

* Bump hayro and krilla (typst#6741)

* Deduplicate fallback smart quotes (typst#6747)

* Move `is_inline` to `HtmlElem` (typst#6748)

* Move grid cell locator creation to GridLayouter (typst#6746)

* HTML whitespace protection (typst#6750)

* Improve code snippets in Table Guide (typst#6658)

* More accessible color scheme for raw blocks (typst#6754)

Co-authored-by: Laurenz <[email protected]>

* Use `stylistic-set: 1` in favor of `ss01` in docs and tests (typst#6766)

* Implement fraction styles: vertical, skewed, and horizontal. (typst#6672)

* Bump Rust to 1.89 in CI (typst#6775)

Co-authored-by: Drodt <[email protected]>
Co-authored-by: Daniel Drodt <[email protected]>

* Fix typo in doc on quotes parameter of smartquote (typst#6779)

* Fix logical order in bidirectional lines (typst#6796)

* Extract `trim_weak_spacing` function (typst#6797)

* Separate items for hyphens, fixing style of repeated hyphen (typst#6798)

* Fix Unicode mapping of hyphenation artifacts (typst#6799)

* Do not consider default ignorables when picking last resort font (typst#6805)

* Compute width of shaped text on-demand (typst#6806)

* Fix `sub` and `super` oneliners (typst#6791)

* Ensure that hyphenation is possible after a tag (typst#6807)

* Make links to `$grid` in `table` docs more specific (typst#6776)

Co-authored-by: PgBiel <[email protected]>

* Fix `repr` of `foo.with(..)` (typst#6773)

* Fix case in docs serialization (typst#6808)

* Add links and examples in the docs of `str` (typst#6751)

Co-authored-by: Laurenz <[email protected]>

* Hash page instead of frame for watch command (typst#6810)

* Update nix flake and use nixfmt (typst#6827)

* Update & fix tutorial part 3 & 4 example code (typst#6778)

* Improve docs on customizing `raw` (typst#6000)

Co-authored-by: Malo <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Better handle large numbers (u128/i128) in deserialization (typst#6836)

* Follow the comment on setting the `State`'s mask (typst#6642)

* Allow augment line at the beginning and end of a matrix (typst#5806)

Co-authored-by: Laurenz <[email protected]>

* Fix slicing last n elements using count (typst#6838)

* Fix auto hanging-indent for centered headings (typst#6839)

* Use rust-analyzer from fenix toolchain in flake (typst#6826)

* Type safety for logical indices in line layout (typst#6848)

* Load linked bitmap images in SVG images (typst#6794)

Co-authored-by: Laurenz <[email protected]>

* Fix CJ-Latin space at manual line breaks (typst#6700)

Co-authored-by: Laurenz Mädje <[email protected]>

* Allow multi-character symbols (typst#6489)

Co-authored-by: Max <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Keep end of line whitespace glyphs (typst#6866)

* Fix punctuation in HTML placeholder (typst#6854)

* Unify and document the behaviours of `{json,yaml,toml,cbor}.encode` (typst#6743)

Co-authored-by: Laurenz <[email protected]>

* Improve docs of various numbering parameters (typst#6757)

Co-authored-by: Laurenz <[email protected]>

* Document and test `Sides<T>` parameters (typst#6862)

Co-authored-by: Laurenz <[email protected]>

* Remove unused `Styles::set_family` (typst#6879)

* Make clear that `Content::query_first` is naive (typst#6880)

* Ensure correct tag nesting with grouping rules (typst#6881)

* Avoid breaking after an empty frame (typst#6335)

* Add test for default ignorables before a breakpoint (typst#6782)

* Fix typos (typst#6878)

* Improve the docs on function params of `array.{sorted,dedup}` (typst#6756)

* Add a link from `math.vec` to `math.{arrow,bold}` in docs (typst#6867)

* Add a disclaimer about embedding PDFs (typst#6888)

Co-authored-by: Laurenz <[email protected]>

* Improve examples in the docs for under/over functions (typst#6889)

* Improve docs of `Celled<T>` params of `table` and `grid` (typst#6764)

Co-authored-by: Laurenz <[email protected]>

* Fix off by one in tag expansion (typst#6900)

* More useful `Debug` impls for `Tag` and `Location` (typst#6901)

* Fix potential crash in `Debug` impl of `Property` (typst#6902)

* Fix `Debug` impl for end tags (typst#6906)

* Make `select_where!` usable outside of typst-library (typst#6910)

* Fix footnote links in presence of styling (typst#6912)

* Consistently ignore styles for tags (typst#6911)

* Expand tags even a bit more around groupings (typst#6909)

* Don't warn for zero-sized horizontal spacing in HTML export

* Use `singleton!` for `HElem::hole`

* Add way to attach role to closest element in HTML export

* Add logical parent mechanism to HTML export

* Generalize mechanism for root styles to HTML export

* Support footnotes in HTML export

* Add `default` argument to `array.join` (typst#6932)

* Replace the non-existent `$math.arrow` with `$math.accent` in the docs for vector (typst#6918)

* Initial Hayagriva bump (typst#6920)

Co-authored-by: Laurenz <[email protected]>

* Use different colors for object keys and string-based values in JSON listings (typst#6873)

* Support for outline in HTML (typst#6606)

* Use Title Case for Doc Pages (typst#6936)

* Improve the docs for dictionary (typst#6899)

* Add an illustration for `par.{leading,spacing}` in docs (typst#6915)

Co-authored-by: Andrew Voynov <[email protected]>
Co-authored-by: Laurenz <[email protected]>

* Initial plan

---------

Co-authored-by: Sam Ireson <[email protected]>
Co-authored-by: PgBiel <[email protected]>
Co-authored-by: Ian Wrzesinski <[email protected]>
Co-authored-by: cAttte <[email protected]>
Co-authored-by: Andrew Voynov <[email protected]>
Co-authored-by: Laurenz <[email protected]>
Co-authored-by: Tobias Schmitz <[email protected]>
Co-authored-by: Max <[email protected]>
Co-authored-by: 3w36zj6 <[email protected]>
Co-authored-by: Malo <[email protected]>
Co-authored-by: T0mstone <[email protected]>
Co-authored-by: Lachlan Kermode <[email protected]>
Co-authored-by: Y.D.X. <[email protected]>
Co-authored-by: Ilia <[email protected]>
Co-authored-by: Noam Zaks <[email protected]>
Co-authored-by: Wannes Malfait <[email protected]>
Co-authored-by: Ivica Nakić <[email protected]>
Co-authored-by: +merlan #flirora <[email protected]>
Co-authored-by: Connor K <[email protected]>
Co-authored-by: Said A. <[email protected]>
Co-authored-by: Florian Bohlken <[email protected]>
Co-authored-by: Robin <[email protected]>
Co-authored-by: Adrián Delgado <[email protected]>
Co-authored-by: frozolotl <[email protected]>
Co-authored-by: Jassiel Ovando <[email protected]>
Co-authored-by: Patrick Massot <[email protected]>
Co-authored-by: Erik <[email protected]>
Co-authored-by: pog102 <[email protected]>
Co-authored-by: Laurenz Stampfl <[email protected]>
Co-authored-by: Niklas Eicker <[email protected]>
Co-authored-by: Marcono1234 <[email protected]>
Co-authored-by: Igor Khanin <[email protected]>
Co-authored-by: hpcfzl <[email protected]>
Co-authored-by: zefr0x <[email protected]>
Co-authored-by: Abdul-Rahman Sibahi <[email protected]>
Co-authored-by: 枚鴉 <[email protected]>
Co-authored-by: Myriad-Dreamin <[email protected]>
Co-authored-by: Derived Cat <[email protected]>
Co-authored-by: Sebastian Eberle <[email protected]>
Co-authored-by: Johann Birnick <[email protected]>
Co-authored-by: Yaksher <[email protected]>
Co-authored-by: Tau <[email protected]>
Co-authored-by: Martin Haug <[email protected]>
Co-authored-by: Théophile Cailliau <[email protected]>
Co-authored-by: Drodt <[email protected]>
Co-authored-by: Daniel Drodt <[email protected]>
Co-authored-by: ultimatile <[email protected]>
Co-authored-by: Poh <[email protected]>
Co-authored-by: Clemens Koza <[email protected]>
Co-authored-by: Siddhant Agarwal <[email protected]>
Co-authored-by: Philipp Niedermayer <[email protected]>
Co-authored-by: Toon Verstraelen <[email protected]>
Co-authored-by: Eric Biedert <[email protected]>
Co-authored-by: Jan Romann <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

interface PRs that add to or change Typst's user-facing interface as opposed to internals or docs changes. layout Related to layout, positioning, etc.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants