summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalo <57839069+MDLC01@users.noreply.github.com>2025-06-11 09:29:38 +0100
committerGitHub <noreply@github.com>2025-06-11 08:29:38 +0000
commit3a6d5fd6b21c85fa100d7fc1e7508ee4b484d99c (patch)
treef8039295d90102b1d9385669a9b28a730c4188cd
parent98034903e4184708dbaf3cf6b23a4f4de5e910ec (diff)
Do not force `math.mid` elements to have the Large math class (#5980)
-rw-r--r--crates/typst-layout/src/math/lr.rs45
-rw-r--r--tests/ref/math-lr-mid-class.pngbin0 -> 556 bytes
-rw-r--r--tests/ref/math-lr-mid-size-nested-equation.pngbin900 -> 920 bytes
-rw-r--r--tests/ref/math-lr-mid-size.pngbin2210 -> 2251 bytes
-rw-r--r--tests/ref/math-lr-mid.pngbin1399 -> 1413 bytes
-rw-r--r--tests/suite/math/delimited.typ8
6 files changed, 34 insertions, 19 deletions
diff --git a/crates/typst-layout/src/math/lr.rs b/crates/typst-layout/src/math/lr.rs
index e0caf417..a3b5cb05 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<Abs>,
+) {
+ // 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 00000000..6487578d
--- /dev/null
+++ b/tests/ref/math-lr-mid-class.png
Binary files differ
diff --git a/tests/ref/math-lr-mid-size-nested-equation.png b/tests/ref/math-lr-mid-size-nested-equation.png
index df010668..750ad14c 100644
--- a/tests/ref/math-lr-mid-size-nested-equation.png
+++ b/tests/ref/math-lr-mid-size-nested-equation.png
Binary files differ
diff --git a/tests/ref/math-lr-mid-size.png b/tests/ref/math-lr-mid-size.png
index 12b4c086..07d33722 100644
--- a/tests/ref/math-lr-mid-size.png
+++ b/tests/ref/math-lr-mid-size.png
Binary files differ
diff --git a/tests/ref/math-lr-mid.png b/tests/ref/math-lr-mid.png
index 42e6da70..8af85b00 100644
--- a/tests/ref/math-lr-mid.png
+++ b/tests/ref/math-lr-mid.png
Binary files differ
diff --git a/tests/suite/math/delimited.typ b/tests/suite/math/delimited.typ
index 794ffd8a..b8656151 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) $