From 079ccd5e5b8558b177c8b583948c60d75e3f547f Mon Sep 17 00:00:00 2001 From: LU Jialin Date: Mon, 25 Sep 2023 20:13:54 +0800 Subject: [PATCH] Fixing the styling issues of the empty pages caused by pagebreak (#2182) --- crates/typst-library/src/layout/page.rs | 10 ++++------ crates/typst-library/src/meta/document.rs | 13 +++++++++++-- tests/ref/bugs/pagebreak-numbering.png | Bin 0 -> 4136 bytes tests/ref/bugs/pagebreak-set-style.png | Bin 0 -> 5441 bytes tests/typ/bugs/pagebreak-numbering.typ | 13 +++++++++++++ tests/typ/bugs/pagebreak-set-style.typ | 12 ++++++++++++ 6 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 tests/ref/bugs/pagebreak-numbering.png create mode 100644 tests/ref/bugs/pagebreak-set-style.png create mode 100644 tests/typ/bugs/pagebreak-numbering.typ create mode 100644 tests/typ/bugs/pagebreak-set-style.typ diff --git a/crates/typst-library/src/layout/page.rs b/crates/typst-library/src/layout/page.rs index 05d0731d3..19184d22b 100644 --- a/crates/typst-library/src/layout/page.rs +++ b/crates/typst-library/src/layout/page.rs @@ -310,7 +310,6 @@ pub struct PageElem { pub body: Content, /// Whether the page should be aligned to an even or odd page. - /// Not part of the public API for now. #[internal] pub clear_to: Option, } @@ -328,6 +327,7 @@ impl PageElem { vt: &mut Vt, styles: StyleChain, page_counter: &mut ManualPageCounter, + extend_to: Option, ) -> SourceResult { tracing::info!("Page layout"); @@ -378,12 +378,10 @@ impl PageElem { let mut frames = child.layout(vt, styles, regions)?.into_frames(); // Align the child to the pagebreak's parity. - if self - .clear_to(styles) - .is_some_and(|p| !p.matches(page_counter.physical().get())) - { + if extend_to.is_some_and(|p| p.matches(page_counter.physical().get())) { + // Insert empty page after the current pages. let size = area.map(Abs::is_finite).select(area, Size::zero()); - frames.insert(0, Frame::new(size)); + frames.push(Frame::new(size)); } let fill = self.fill(styles); diff --git a/crates/typst-library/src/meta/document.rs b/crates/typst-library/src/meta/document.rs index 01095dc93..200b5d9dd 100644 --- a/crates/typst-library/src/meta/document.rs +++ b/crates/typst-library/src/meta/document.rs @@ -48,7 +48,10 @@ impl LayoutRoot for DocumentElem { let mut pages = vec![]; let mut page_counter = ManualPageCounter::new(); - for mut child in &self.children() { + let children = self.children(); + let mut iter = children.iter().peekable(); + + while let Some(mut child) = iter.next() { let outer = styles; let mut styles = styles; if let Some((elem, local)) = child.to_styled() { @@ -57,7 +60,13 @@ impl LayoutRoot for DocumentElem { } if let Some(page) = child.to::() { - let fragment = page.layout(vt, styles, &mut page_counter)?; + let extend_to = iter.peek().and_then(|&next| { + next.to_styled() + .map_or(next, |(elem, _)| elem) + .to::()? + .clear_to(styles) + }); + let fragment = page.layout(vt, styles, &mut page_counter, extend_to)?; pages.extend(fragment); } else { bail!(child.span(), "unexpected document child"); diff --git a/tests/ref/bugs/pagebreak-numbering.png b/tests/ref/bugs/pagebreak-numbering.png new file mode 100644 index 0000000000000000000000000000000000000000..96f047a88993d92d2c584066320de961a7700978 GIT binary patch literal 4136 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