From 02f07e7912a484974bc044eab59e0439f0c1312e Mon Sep 17 00:00:00 2001 From: Eric Biedert Date: Tue, 27 May 2025 15:18:20 +0200 Subject: [PATCH] Don't label empty orphan frames Adding a label makes a previously empty frame non-empty, but we want to keep orphans empty. --- crates/typst-layout/src/flow/block.rs | 11 +++++------ tests/ref/issue-6304-block-skip-label.png | Bin 311 -> 312 bytes 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/crates/typst-layout/src/flow/block.rs b/crates/typst-layout/src/flow/block.rs index 6c2c3923d..d30fcbd0b 100644 --- a/crates/typst-layout/src/flow/block.rs +++ b/crates/typst-layout/src/flow/block.rs @@ -204,13 +204,11 @@ pub fn layout_multi_block( let has_inset = !inset.is_zero(); let is_explicit = matches!(body, None | Some(BlockBody::Content(_))); - // Skip filling/stroking the first frame if it is empty and a non-empty - // one follows. + // Skip filling, stroking and labeling the first frame if it is empty and + // a non-empty one follows. let mut skip_first = false; if let [first, rest @ ..] = fragment.as_slice() { - skip_first = has_fill_or_stroke - && first.is_empty() - && rest.iter().any(|frame| !frame.is_empty()); + skip_first = first.is_empty() && rest.iter().any(|frame| !frame.is_empty()); } // Post-process to apply insets, clipping, fills, and strokes. @@ -242,7 +240,8 @@ pub fn layout_multi_block( // Assign label to each frame in the fragment. if let Some(label) = elem.label() { - for frame in fragment.iter_mut() { + // Skip empty orphan frames, as a label would make them non-empty. + for frame in fragment.iter_mut().skip(if skip_first { 1 } else { 0 }) { frame.label(label); } } diff --git a/tests/ref/issue-6304-block-skip-label.png b/tests/ref/issue-6304-block-skip-label.png index a912ff0d5e7f2a69f5b0cdb8ff60c7113efbea76..089cb7d4186e4d7b2d91ba5b0970de3f05b3cf92 100644 GIT binary patch delta 285 zcmdnaw1a7aO8tLN7srr_TW_z}dmUnAI9iy0QBKtN;+2Tt3#?X70f7QrSzKLaHwUMB zFHl(YVYW*^42z>nK>&-mze3l72lfFqaZWW{_sbj4e|R80DN`{aA>qN-1L3j!F}r_% zJ23I#PS$sKr=7dSXAzX?YR~iGhv%%hXUzHk@A)25+aoLhR9z3m$l!r)OYGxhpeb|P zCbw@axX1X~;cqZ^&6S`3w;uT2y8d-1v)#0Lli4aZs^1miE%>E4D@y=m%mdx_*`0?D zFxInOe$&dRx7Xv8zopr0KI>Iv;Y7A delta 284 zcmdnNw4G^!O8q}i7srr_TW_z}cOPVwIbL}C?025LJui>#p1p4O+i%rO=JR&NNAh?* zV$^VT;aGg|+4)lnOMO(5g4*uuy9RpI*mC|1cz<5F;_J&``T3oXnAzCa_VN6AoAqFy z{mRD2v-vsS{M{PAoXg^#>{4Z>3UPzm`(@VgFF!Qz>l`6=CLSK1`kKQ9%LC_oJ~+B~ z`v1@a-*RUAbN&hWm(?k?J71VL=i(ZMceYz*|69s1ufIKe9=8Mx{8*O|dIQM$vG1Xy z&UbmC1MkjXJR^9ZvuWmBmJPw8xpO$X9$c-y-naGg*TiV?$y0T~wgD|f1~tteL?vfk Wer00&e@QU|5O})!xvX