diff --git a/crates/typst-layout/src/math/lr.rs b/crates/typst-layout/src/math/lr.rs index e0caf4179..a3b5cb05c 100644 --- a/crates/typst-layout/src/math/lr.rs +++ b/crates/typst-layout/src/math/lr.rs @@ -45,12 +45,12 @@ pub fn layout_lr( // Scale up fragments at both ends. match inner_fragments { - [one] => scale(ctx, one, relative_to, height, None), + [one] => scale_if_delimiter(ctx, one, relative_to, height, None), [first, .., last] => { - scale(ctx, first, relative_to, height, Some(MathClass::Opening)); - scale(ctx, last, relative_to, height, Some(MathClass::Closing)); + scale_if_delimiter(ctx, first, relative_to, height, Some(MathClass::Opening)); + scale_if_delimiter(ctx, last, relative_to, height, Some(MathClass::Closing)); } - _ => {} + [] => {} } // Handle MathFragment::Glyph fragments that should be scaled up. @@ -58,7 +58,7 @@ pub fn layout_lr( if let MathFragment::Glyph(ref mut glyph) = fragment { if glyph.mid_stretched == Some(false) { glyph.mid_stretched = Some(true); - scale(ctx, fragment, relative_to, height, Some(MathClass::Large)); + scale(ctx, fragment, relative_to, height); } } } @@ -97,7 +97,7 @@ pub fn layout_mid( for fragment in &mut fragments { if let MathFragment::Glyph(ref mut glyph) = fragment { glyph.mid_stretched = Some(false); - glyph.class = MathClass::Fence; + glyph.class = MathClass::Relation; } } @@ -105,8 +105,12 @@ pub fn layout_mid( Ok(()) } -/// Scale a math fragment to a height. -fn scale( +/// Scales a math fragment to a height if it has the class Opening, Closing, or +/// Fence. +/// +/// In case `apply` is `Some(class)`, `class` will be applied to the fragment if +/// it is a delimiter, in a way that cannot be overridden by the user. +fn scale_if_delimiter( ctx: &mut MathContext, fragment: &mut MathFragment, relative_to: Abs, @@ -117,20 +121,23 @@ fn scale( fragment.class(), MathClass::Opening | MathClass::Closing | MathClass::Fence ) { - // This unwrap doesn't really matter. If it is None, then the fragment - // won't be stretchable anyways. - let short_fall = DELIM_SHORT_FALL.at(fragment.font_size().unwrap_or_default()); - stretch_fragment( - ctx, - fragment, - Some(Axis::Y), - Some(relative_to), - height, - short_fall, - ); + scale(ctx, fragment, relative_to, height); if let Some(class) = apply { fragment.set_class(class); } } } + +/// Scales a math fragment to a height. +fn scale( + ctx: &mut MathContext, + fragment: &mut MathFragment, + relative_to: Abs, + height: Rel, +) { + // This unwrap doesn't really matter. If it is None, then the fragment + // won't be stretchable anyways. + let short_fall = DELIM_SHORT_FALL.at(fragment.font_size().unwrap_or_default()); + stretch_fragment(ctx, fragment, Some(Axis::Y), Some(relative_to), height, short_fall); +} diff --git a/tests/ref/math-lr-mid-class.png b/tests/ref/math-lr-mid-class.png new file mode 100644 index 000000000..6487578d7 Binary files /dev/null and b/tests/ref/math-lr-mid-class.png differ diff --git a/tests/ref/math-lr-mid-size-nested-equation.png b/tests/ref/math-lr-mid-size-nested-equation.png index df0106689..750ad14c8 100644 Binary files a/tests/ref/math-lr-mid-size-nested-equation.png and b/tests/ref/math-lr-mid-size-nested-equation.png differ diff --git a/tests/ref/math-lr-mid-size.png b/tests/ref/math-lr-mid-size.png index 12b4c0868..07d337225 100644 Binary files a/tests/ref/math-lr-mid-size.png and b/tests/ref/math-lr-mid-size.png differ diff --git a/tests/ref/math-lr-mid.png b/tests/ref/math-lr-mid.png index 42e6da706..8af85b005 100644 Binary files a/tests/ref/math-lr-mid.png and b/tests/ref/math-lr-mid.png differ diff --git a/tests/suite/math/delimited.typ b/tests/suite/math/delimited.typ index 794ffd8aa..b8656151b 100644 --- a/tests/suite/math/delimited.typ +++ b/tests/suite/math/delimited.typ @@ -77,6 +77,14 @@ $ lr(body) quad lr(size: #1em, body) quad lr(size: #(1em+20%), body) $ +--- math-lr-mid-class --- +// Test that `mid` creates a Relation, but that can be overridden. +$ (a | b) $ +$ (a mid(|) b) $ +$ (a class("unary", |) b) $ +$ (a class("unary", mid(|)) b) $ +$ (a mid(class("unary", |)) b) $ + --- math-lr-unbalanced --- // Test unbalanced delimiters. $ 1/(2 (x) $