diff --git a/crates/typst-library/src/layout/spacing.rs b/crates/typst-library/src/layout/spacing.rs index 50f66a8e6..cf69f6d90 100644 --- a/crates/typst-library/src/layout/spacing.rs +++ b/crates/typst-library/src/layout/spacing.rs @@ -1,5 +1,3 @@ -use std::cmp::Ordering; - use crate::prelude::*; /// Inserts horizontal spacing into a paragraph. @@ -64,9 +62,19 @@ impl Behave for HElem { } } - fn larger(&self, prev: &Content) -> bool { - let Some(prev) = prev.to::() else { return false }; - self.amount() > prev.amount() + fn larger( + &self, + prev: &(Content, Behaviour, StyleChain), + styles: StyleChain, + ) -> bool { + let Some(other) = prev.0.to::() else { return false }; + match (self.amount(), other.amount()) { + (Spacing::Fr(this), Spacing::Fr(other)) => this > other, + (Spacing::Rel(this), Spacing::Rel(other)) => { + this.resolve(styles) > other.resolve(prev.2) + } + _ => false, + } } } @@ -156,9 +164,19 @@ impl Behave for VElem { } } - fn larger(&self, prev: &Content) -> bool { - let Some(prev) = prev.to::() else { return false }; - self.amount() > prev.amount() + fn larger( + &self, + prev: &(Content, Behaviour, StyleChain), + styles: StyleChain, + ) -> bool { + let Some(other) = prev.0.to::() else { return false }; + match (self.amount(), other.amount()) { + (Spacing::Fr(this), Spacing::Fr(other)) => this > other, + (Spacing::Rel(this), Spacing::Rel(other)) => { + this.resolve(styles) > other.resolve(prev.2) + } + _ => false, + } } } @@ -216,16 +234,6 @@ impl From for Spacing { } } -impl PartialOrd for Spacing { - fn partial_cmp(&self, other: &Self) -> Option { - match (self, other) { - (Self::Rel(a), Self::Rel(b)) => a.partial_cmp(b), - (Self::Fr(a), Self::Fr(b)) => a.partial_cmp(b), - _ => None, - } - } -} - cast! { Spacing, self => match self { diff --git a/crates/typst-library/src/shared/behave.rs b/crates/typst-library/src/shared/behave.rs index ed7a2593b..f97e3fbcc 100644 --- a/crates/typst-library/src/shared/behave.rs +++ b/crates/typst-library/src/shared/behave.rs @@ -53,7 +53,7 @@ impl<'a> BehavedBuilder<'a> { let i = self.staged.iter().position(|prev| { let Behaviour::Weak(prev_level) = prev.1 else { return false }; level < prev_level - || (level == prev_level && item.larger(&prev.0)) + || (level == prev_level && item.larger(prev, styles)) }); let Some(i) = i else { return }; self.staged.remove(i); diff --git a/crates/typst/src/model/realize.rs b/crates/typst/src/model/realize.rs index 745d7f433..8edeb0e76 100644 --- a/crates/typst/src/model/realize.rs +++ b/crates/typst/src/model/realize.rs @@ -198,7 +198,11 @@ pub trait Behave { /// Whether this weak element is larger than a previous one and thus picked /// as the maximum when the levels are the same. #[allow(unused_variables)] - fn larger(&self, prev: &Content) -> bool { + fn larger( + &self, + prev: &(Content, Behaviour, StyleChain), + styles: StyleChain, + ) -> bool { false } } diff --git a/tests/ref/compiler/array.png b/tests/ref/compiler/array.png index a96dfe649..9b6bf8b30 100644 Binary files a/tests/ref/compiler/array.png and b/tests/ref/compiler/array.png differ diff --git a/tests/ref/compiler/repr.png b/tests/ref/compiler/repr.png index 82ece777c..aa519dd0d 100644 Binary files a/tests/ref/compiler/repr.png and b/tests/ref/compiler/repr.png differ diff --git a/tests/ref/compiler/show-selector.png b/tests/ref/compiler/show-selector.png index f82596980..52e99c9ac 100644 Binary files a/tests/ref/compiler/show-selector.png and b/tests/ref/compiler/show-selector.png differ diff --git a/tests/ref/layout/spacing.png b/tests/ref/layout/spacing.png index c733fb02e..9bab536a2 100644 Binary files a/tests/ref/layout/spacing.png and b/tests/ref/layout/spacing.png differ diff --git a/tests/ref/meta/outline-entry.png b/tests/ref/meta/outline-entry.png index 3a2773974..f8f5412f0 100644 Binary files a/tests/ref/meta/outline-entry.png and b/tests/ref/meta/outline-entry.png differ diff --git a/tests/ref/text/raw-align.png b/tests/ref/text/raw-align.png index 734008e1a..6d1044f7e 100644 Binary files a/tests/ref/text/raw-align.png and b/tests/ref/text/raw-align.png differ diff --git a/tests/ref/text/raw.png b/tests/ref/text/raw.png index 09912afcc..27120d746 100644 Binary files a/tests/ref/text/raw.png and b/tests/ref/text/raw.png differ diff --git a/tests/typ/layout/spacing.typ b/tests/typ/layout/spacing.typ index fbc5b0d8c..f4e595908 100644 --- a/tests/typ/layout/spacing.typ +++ b/tests/typ/layout/spacing.typ @@ -24,6 +24,16 @@ A #h(0pt) B #h(0pt) \ A B \ A #h(-1fr) B +--- +// Test spacing collapsing with different font sizes. +#grid(columns: 2)[ + #text(size: 12pt, block(below: 1em)[A]) + #text(size: 8pt, block(above: 1em)[B]) +][ + #text(size: 12pt, block(below: 1em)[A]) + #text(size: 8pt, block(above: 1.25em)[B]) +] + --- // Test RTL spacing. #set text(dir: rtl)