diff --git a/crates/typst-layout/src/math/fragment.rs b/crates/typst-layout/src/math/fragment.rs index 691a97f70..ac8946681 100644 --- a/crates/typst-layout/src/math/fragment.rs +++ b/crates/typst-layout/src/math/fragment.rs @@ -148,7 +148,8 @@ impl MathFragment { pub fn is_text_like(&self) -> bool { match self { - Self::Glyph(_) | Self::Variant(_) => self.class() != MathClass::Large, + Self::Glyph(glyph) => !glyph.extended_shape, + Self::Variant(variant) => !variant.extended_shape, MathFragment::Frame(frame) => frame.text_like, _ => false, } @@ -247,6 +248,7 @@ pub struct GlyphFragment { pub dests: SmallVec<[Destination; 1]>, pub hidden: bool, pub limits: Limits, + pub extended_shape: bool, } impl GlyphFragment { @@ -302,6 +304,7 @@ impl GlyphFragment { span, dests: LinkElem::dests_in(styles), hidden: HideElem::hidden_in(styles), + extended_shape: false, }; fragment.set_id(ctx, id); fragment @@ -332,7 +335,8 @@ impl GlyphFragment { let accent_attach = accent_attach(ctx, id, self.font_size).unwrap_or((width + italics) / 2.0); - if !is_extended_shape(ctx, id) { + let extended_shape = is_extended_shape(ctx, id); + if !extended_shape { width += italics; } @@ -342,6 +346,7 @@ impl GlyphFragment { self.descent = -bbox.y_min.scaled(ctx, self.font_size); self.italics_correction = italics; self.accent_attach = accent_attach; + self.extended_shape = extended_shape; } pub fn height(&self) -> Abs { @@ -358,6 +363,7 @@ impl GlyphFragment { math_size: self.math_size, span: self.span, limits: self.limits, + extended_shape: self.extended_shape, frame: self.into_frame(), mid_stretched: None, } @@ -465,6 +471,7 @@ pub struct VariantFragment { pub span: Span, pub limits: Limits, pub mid_stretched: Option, + pub extended_shape: bool, } impl VariantFragment { diff --git a/crates/typst-layout/src/math/stretch.rs b/crates/typst-layout/src/math/stretch.rs index 9b5cd47a9..3d7c88cfc 100644 --- a/crates/typst-layout/src/math/stretch.rs +++ b/crates/typst-layout/src/math/stretch.rs @@ -295,6 +295,7 @@ fn assemble( span: base.span, limits: base.limits, mid_stretched: None, + extended_shape: true, } } diff --git a/tests/ref/math-attach-scripts-extended-shapes.png b/tests/ref/math-attach-scripts-extended-shapes.png new file mode 100644 index 000000000..c99d3c7fd Binary files /dev/null and b/tests/ref/math-attach-scripts-extended-shapes.png differ diff --git a/tests/ref/math-lr-scripts.png b/tests/ref/math-lr-scripts.png new file mode 100644 index 000000000..7ce35475b Binary files /dev/null and b/tests/ref/math-lr-scripts.png differ diff --git a/tests/ref/math-stretch-vertical-scripts.png b/tests/ref/math-stretch-vertical-scripts.png new file mode 100644 index 000000000..ce933c3c3 Binary files /dev/null and b/tests/ref/math-stretch-vertical-scripts.png differ diff --git a/tests/suite/math/attach.typ b/tests/suite/math/attach.typ index 9c92c62e3..56fa47c58 100644 --- a/tests/suite/math/attach.typ +++ b/tests/suite/math/attach.typ @@ -170,3 +170,9 @@ $ attach(a^b, b: c) quad $ a0 + a1 + a0_2 \ a1_2 + a0^2 + a1^2 $ + +--- math-attach-scripts-extended-shapes --- +// Test script attachments positioning if the base is an extended shape (or a +// sequence of extended shapes). +$lr(size: #130%, [x])_0^1, [x]_0^1, \]_0^1, x_0^1, A_0^1$ \ +$n^2, (n + 1)^2, sum_0^1, integral_0^1$ diff --git a/tests/suite/math/delimited.typ b/tests/suite/math/delimited.typ index 9e11ec8b0..fc00333d3 100644 --- a/tests/suite/math/delimited.typ +++ b/tests/suite/math/delimited.typ @@ -115,6 +115,12 @@ $lr(body2, size: #50%)$ $ (1 / 2) $ }) +--- math-lr-scripts --- +// Test interactions with script attachments. +$ lr(size: #3em, |)_a^b lr(size: #3em, zws|)_a^b + lr(size: #3em, [x])_0^1 [x]_0^1 + lr(size: #1em, lr(size: #10em, [x]))_0^1 $ + --- issue-4188-lr-corner-brackets --- // Test positioning of U+231C to U+231F $⌜a⌟⌞b⌝$ = $⌜$$a$$⌟$$⌞$$b$$⌝$ diff --git a/tests/suite/math/stretch.typ b/tests/suite/math/stretch.typ index 606967466..6bf13e255 100644 --- a/tests/suite/math/stretch.typ +++ b/tests/suite/math/stretch.typ @@ -35,6 +35,12 @@ $stretch(arrow.t)^"map"$ $stretch(arrow.t, size: #2em)^"map"$ $stretch(arrow.t, size: #200%)^"map"$ +--- math-stretch-vertical-scripts --- +// Test vertical stretch interactions with script attachments. +#let big = $stretch(|, size: #4em)$ +$ big_0^1 stretch(|, size: #1.5em)_0^1 + stretch(big, size: #1em)_0^1 |_0^1 $ + --- math-stretch-horizontal --- // Test stretching along horizontal axis. #let ext(sym) = math.stretch(sym, size: 2em)