summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/typst-layout/src/math/fragment.rs11
-rw-r--r--crates/typst-layout/src/math/stretch.rs1
-rw-r--r--tests/ref/math-attach-scripts-extended-shapes.pngbin0 -> 1057 bytes
-rw-r--r--tests/ref/math-lr-scripts.pngbin0 -> 611 bytes
-rw-r--r--tests/ref/math-stretch-vertical-scripts.pngbin0 -> 379 bytes
-rw-r--r--tests/suite/math/attach.typ6
-rw-r--r--tests/suite/math/delimited.typ6
-rw-r--r--tests/suite/math/stretch.typ6
8 files changed, 28 insertions, 2 deletions
diff --git a/crates/typst-layout/src/math/fragment.rs b/crates/typst-layout/src/math/fragment.rs
index 691a97f7..ac894668 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<bool>,
+ 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 9b5cd47a..3d7c88cf 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 00000000..c99d3c7f
--- /dev/null
+++ b/tests/ref/math-attach-scripts-extended-shapes.png
Binary files differ
diff --git a/tests/ref/math-lr-scripts.png b/tests/ref/math-lr-scripts.png
new file mode 100644
index 00000000..7ce35475
--- /dev/null
+++ b/tests/ref/math-lr-scripts.png
Binary files differ
diff --git a/tests/ref/math-stretch-vertical-scripts.png b/tests/ref/math-stretch-vertical-scripts.png
new file mode 100644
index 00000000..ce933c3c
--- /dev/null
+++ b/tests/ref/math-stretch-vertical-scripts.png
Binary files differ
diff --git a/tests/suite/math/attach.typ b/tests/suite/math/attach.typ
index 9c92c62e..56fa47c5 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 9e11ec8b..fc00333d 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 60696746..6bf13e25 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)