-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Avoid breaking after an empty frame #6335
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
PgBiel
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm impressed such a small change produced the desired effect here, very smart! Although I haven't looked too deep into it yet to tell whether this could produce some regression of some sort. Still, nice find!
A third issue that could have surfaced in the future is that this invisible "leftover" part would be enough for a block to count as sticking to a preceding block, even though the visible part would actually only be in the next region.
I actually faced this just yesterday! A block had a very tiny empty leftover at the previous page (everything else was at the next page), causing a heading right before it to appear to be an orphan (I even double-checked my show rules 😂), but adding fill to the block revealed that the sneaky thing was still in the previous page by a few pixels. Would be certainly nice to have this not happen anymore.
The fix itself is quite simple, and just includes the same empty-frame check, which is also used when skipping the fill and stroke for a first empty frame. This check is put right before the spill is created, so that instead of breaking the child, it can be entirely moved into the next region when (only) the first frame is empty.
So, if I understood correctly, you took code specific to block elements with fill and stroke and copied it to the flow layouter to avoid creating an empty frame entirely, not only skipping its fill and stroke? And by doing this, the fix bubbles up into a parent block containing a spilled breakable block, as its first frame also becomes entirely empty as well? That would seem decently robust in principle.
In grid-header-containing-rowspan, the last cell on the first page is no longer stroked as there is nothing inside it. I assume this was the same issue (...) though I might have misinterpreted the test.
The test was entirely unrelated, so I think I just didn't care about it back then. But yes, it's the same issue: an auto row is skipped to the next page if the first frame is empty, but here it wasn't empty, as the block containing lorem had, itself, created a nested empty frame, if I'm understanding correctly. So the new output seems correct to me!
In grid-header-orphan-prevention, the "B" in the first header was previously too bold (drawn multiple times?). I'm not sure what happened there, but it seems to be fixed now.
Wow! I think I noticed this at the time, but had no idea either and just ignored it. That is actually funny, I wonder what triggered this?
Seems like the header was placed normally once and then immediately repeated, but somehow it escaped to the next region or something 🤔
Maybe we could test these changes on top of #6168 to see if anything else changed?
Exactly. The original check is typst/crates/typst-layout/src/flow/block.rs Lines 209 to 214 in 2a258a0
This check remains necessary, as otherwise, the first region would not be empty anymore when it reaches the spill check.
In case you want to investigate this further, here's an MRE where a header with rowspan is currently drawn multiple times (once with "1" and once with "2"), though this is also no longer the case after this PR: #set page(paper: "a11")
#let count = counter("g")
#lorem(2)
#table(
table.header(
table.cell(rowspan: 2, count.step() + context count.display()),
),
[C]
)
Done, no other tests have changed |
Instead, spill the whole child into the next region to prevent small leftovers to influence layout. This is not done when all frames are empty (e.g. for an explicitly sized block without content or fill). This helps with the following cases: - Previously, if a sticky block was followed by a leftover frame, the stickiness would be ignored, as the leftover was in fact sticking. This is not currently a problem, as sticky blocks aren't really breakable at the moment, but probably will be in the future. - When ignoring stroke and fill for a first empty frame, a nested broken block would previously make the first frame not be considered empty anymore, which would lead to the leftover frame being filled. - Similarly, when the fill of an explicitly sized block is ignored in the first empty frame, the leftover part would still be considered as laid out, making the actually visible block too small.
Adding a label makes a previously empty frame non-empty, but we want to keep orphans empty.
In `grid-header-containing-rowspan`, the first region is now correctly not stroked. Not sure what happened in `grid-header-orphan-prevention`, but the "B" in the first header was too bold before.
|
I realized we can also easily fix #6304 by not only skipping the fill/stroke, but also the label for empty orphan frames. Adding a label wraps the frame in another frame, making the wrapper frame not empty. |
Could this affect introspection, e.g. by changing the page returned by |
Previously, this would result in a position on the first page.
|
The position would previously be on the page of the empty orphan frame, but now that it's no longer labeled, it's on the next page as expected. I've added a test for that. |
|
Thank you. In principle, this seems sound to me, but I'll wait for @laurmaedje's opinion. |
|
While looking a bit into #6388, I found that this introduces an infinite loop of moving the child into the next region for this case: #set page(width: 70pt, height: 70pt, margin: 10pt)
#grid(block(sticky: true, fill: blue, width: 100%, height: 75pt))Don't know if I should add a |
laurmaedje
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry that it took so long for me to respond. I guess I evaded this PR 🙈 as the concept matter is so tricky and reviewing work on such things is even trickier than working on them.
However, upon looking into this a bit more closely, it seems like a nice approach indeed! It's pretty natural in the new-ish relayout paradigm.
While looking a bit into #6388, I found that this introduces an infinite loop of moving the child into the next region for this case:
Oof, infinite layout loops are always a pain. But I think a may_progress check in distribute.rs should fix it; see my comment on the relevant line.
Adding a label wraps the frame in another frame, making the wrapper frame not empty.
Could this affect introspection, e.g. by changing the page returned by locate()? Maybe we should test that too.
The frame labelling should have no effect on introspection. It's not used for that at all, it's just used to expose the label in SVG export, which was a feature request by someone at some point, for something animation-related.
The position would previously be on the page of the empty orphan frame, but now that it's no longer labeled, it's on the next page as expected. I've added a test for that.
Regardless of not being caused by the frame labelling change, this change is entirely natural. The observed position of the block depends on where in the frame the introspection tags end up. These are are sticky and will migrate to the next region with the block.
|
Also fixes #5977 :) |
|
Thank you! This is a very nice fix. |
… 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 <laurmaedje@gmail.com> * Improve number lexing (typst#5969) * Report errors in external files (typst#6308) Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Render `#super` as `<sup>`, `#sub` as `<sub>` in HTML (typst#6422) * Warning when watching stdin (typst#6381) Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Use ICU data to check if accent is bottom (typst#6393) Co-authored-by: Laurenz <laurmaedje@gmail.com> * Add docs for `std` module (typst#6407) Co-authored-by: Laurenz <laurmaedje@gmail.com> * Improve equation reference example (typst#6481) * Add page reference customization example (typst#6480) Co-authored-by: Laurenz <laurmaedje@gmail.com> * Bump `krilla` to current Git version (typst#6488) Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Add `pdf` extension to image autocompletions (typst#6643) * Fix bounding box computation for lines in curves (typst#6647) Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <9021226+PgBiel@users.noreply.github.com> Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Require parentheses in all function-like sub/superscripts (typst#6442) Co-authored-by: Laurenz <laurmaedje@gmail.com> * Fix several wrong anchors in `$` docs link resolution (typst#6684) * Add `cargo testit` alias for running integration tests (typst#6682) Co-authored-by: Laurenz <laurmaedje@gmail.com> * Update guides welcome text to refer to list instead of specific guides (typst#6685) Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Add interface to disable timer (typst#6695) Co-authored-by: Derived Cat <hooyuser@outlook.com> * 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 <laurmaedje@gmail.com> * 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 <57839069+MDLC01@users.noreply.github.com> * 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 <laurmaedje@gmail.com> * Document escaping semicolon, valid identifiers, and `state` tips (typst#6674) Co-authored-by: Andrew Voynov <37143421+Andrew15-5@users.noreply.github.com> Co-authored-by: Yaksher <yaksher.git@gmail.com> Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <daniel.drodt@tu-darmstadt.de> Co-authored-by: Daniel Drodt <132357467+Drodt@users.noreply.github.com> * 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 <9021226+PgBiel@users.noreply.github.com> * 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 <laurmaedje@gmail.com> * 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 <57839069+MDLC01@users.noreply.github.com> Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Fix CJ-Latin space at manual line breaks (typst#6700) Co-authored-by: Laurenz Mädje <laurmaedje@gmail.com> * Allow multi-character symbols (typst#6489) Co-authored-by: Max <max@mkor.je> Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * Improve docs of various numbering parameters (typst#6757) Co-authored-by: Laurenz <laurmaedje@gmail.com> * Document and test `Sides<T>` parameters (typst#6862) Co-authored-by: Laurenz <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <laurmaedje@gmail.com> * 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 <37143421+Andrew15-5@users.noreply.github.com> Co-authored-by: Laurenz <laurmaedje@gmail.com> * Initial plan --------- Co-authored-by: Sam Ireson <107627922+samuelireson@users.noreply.github.com> Co-authored-by: PgBiel <9021226+PgBiel@users.noreply.github.com> Co-authored-by: Ian Wrzesinski <133046678+wrzian@users.noreply.github.com> Co-authored-by: cAttte <26514199+cAttte@users.noreply.github.com> Co-authored-by: Andrew Voynov <37143421+Andrew15-5@users.noreply.github.com> Co-authored-by: Laurenz <laurmaedje@gmail.com> Co-authored-by: Tobias Schmitz <tobiasschmitz2001@gmail.com> Co-authored-by: Max <max@mkor.je> Co-authored-by: 3w36zj6 <52315048+3w36zj6@users.noreply.github.com> Co-authored-by: Malo <57839069+MDLC01@users.noreply.github.com> Co-authored-by: T0mstone <39707032+T0mstone@users.noreply.github.com> Co-authored-by: Lachlan Kermode <lachiekermode@gmail.com> Co-authored-by: Y.D.X. <73375426+YDX-2147483647@users.noreply.github.com> Co-authored-by: Ilia <43654815+istudyatuni@users.noreply.github.com> Co-authored-by: Noam Zaks <63877260+noamzaks@users.noreply.github.com> Co-authored-by: Wannes Malfait <46323945+WannesMalfait@users.noreply.github.com> Co-authored-by: Ivica Nakić <ssemigr@gmail.com> Co-authored-by: +merlan #flirora <flirora@flirora.xyz> Co-authored-by: Connor K <sigstackfault@gmail.com> Co-authored-by: Said A. <47973576+Daaiid@users.noreply.github.com> Co-authored-by: Florian Bohlken <flibbo@gmail.com> Co-authored-by: Robin <mewmew@users.noreply.github.com> Co-authored-by: Adrián Delgado <11708972+adriandelgado@users.noreply.github.com> Co-authored-by: frozolotl <44589151+frozolotl@users.noreply.github.com> Co-authored-by: Jassiel Ovando <jassielovando@protonmail.com> Co-authored-by: Patrick Massot <patrickmassot@free.fr> Co-authored-by: Erik <tinger@tinger.dev> Co-authored-by: pog102 <85764555+pog102@users.noreply.github.com> Co-authored-by: Laurenz Stampfl <47084093+LaurenzV@users.noreply.github.com> Co-authored-by: Niklas Eicker <git@nikl.me> Co-authored-by: Marcono1234 <Marcono1234@users.noreply.github.com> Co-authored-by: Igor Khanin <igor@khanin.biz> Co-authored-by: hpcfzl <hopcfizl@gmail.com> Co-authored-by: zefr0x <65136727+zefr0x@users.noreply.github.com> Co-authored-by: Abdul-Rahman Sibahi <asibahi@users.noreply.github.com> Co-authored-by: 枚鴉 <ling@omots.io> Co-authored-by: Myriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com> Co-authored-by: Derived Cat <hooyuser@outlook.com> Co-authored-by: Sebastian Eberle <152992757+sebaseb98@users.noreply.github.com> Co-authored-by: Johann Birnick <6528009+jbirnick@users.noreply.github.com> Co-authored-by: Yaksher <yaksher.git@gmail.com> Co-authored-by: Tau <git@alice-carroll.pet> Co-authored-by: Martin Haug <mhaug@live.de> Co-authored-by: Théophile Cailliau <tjbcg@pm.me> Co-authored-by: Drodt <daniel.drodt@tu-darmstadt.de> Co-authored-by: Daniel Drodt <132357467+Drodt@users.noreply.github.com> Co-authored-by: ultimatile <ultimatile@users.noreply.github.com> Co-authored-by: Poh <167305720+pohlrabi404@users.noreply.github.com> Co-authored-by: Clemens Koza <clemens.koza@gmx.at> Co-authored-by: Siddhant Agarwal <68201519+siddhantdev@users.noreply.github.com> Co-authored-by: Philipp Niedermayer <eltos@outlook.de> Co-authored-by: Toon Verstraelen <Toon.Verstraelen@UGent.be> Co-authored-by: Eric Biedert <github@ericbiedert.de> Co-authored-by: Jan Romann <jan.romann@uni-bremen.de> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Fixes #2914 and – to some extent1 – the first part of #6125
Fixes #4972
Fixes #5977
Fixes #6304
What was wrong?
When a breakable block is split into multiple regions, and the first region is too small to fit any part of the block, it would previously add still add an empty frame to that region. However, when the block contains another breakable block, which also doesn't fit into the first region, the originally empty frame isn't empty anymore, as the empty frame from the nested block is added to it. This is what lead to #2914, where the no longer empty frame unexpectedly gets a fill.
Even when there is no nested block, and the empty region remains unfilled, it is still considered as part of the block. Thus, when it is laid out, its height is subtracted, making the remaining (and actually visible) part of the block smaller then expected, as pointed out in #2914 (comment).
A third issue
that could have surfaced in the futureis that this invisible "leftover" part could be enough for a block to count as sticking to a preceding block, even though the visible part would actually only be in the next region.This isn't an issue yet, as sticky blocks currently lose most of their breaking capabilities as soon as something sticks to them, but #6020 already planned on changing that.This is likely what lead to #5977.The problem with labels is that when one is added to an empty frame, the frame is no longer considered empty. Since empty frames are ignored when making two elements stick together, the addition of the label breaks the stickiness, leading to #6304.
What changed?
The fix itself is quite simple, and just includes the same empty-frame check, which is also used when skipping the fill and stroke for a first empty frame. This check is put where labels are attached, and again right before the spill is created, so that instead of breaking the child, it can be entirely moved into the next region when (only) the first frame is empty. For cases where all frames are empty (e.g. explicitly sized blocks without content or fill), spilling and labeling remains allowed.
Two tests have failed with this change, but the updated references seem more correct to me:
grid-header-containing-rowspan, the last cell on the first page is no longer stroked as there is nothing inside it. I assume this was the same issue as #2914, though I might have misinterpreted the test.grid-header-orphan-prevention, the "B" in the first header was previously too bold (drawn multiple times?). I'm not sure what happened there, but it seems to be fixed now.Footnotes
The underyling issue isn't limited to the effect of empty orphan frames; a breakable block with regions of different width suffices. ↩