From 6a396ae21410af5b265aa3174500146794d2b693 Mon Sep 17 00:00:00 2001 From: damaxwell Date: Wed, 19 Jul 2023 23:47:29 -0800 Subject: [PATCH] Center large operators on axis (#1735) --- crates/typst-library/src/math/ctx.rs | 29 ++++++++++++++++----------- tests/ref/math/opticalsize.png | Bin 11318 -> 11317 bytes 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/crates/typst-library/src/math/ctx.rs b/crates/typst-library/src/math/ctx.rs index e6a846745..4a0959ab2 100644 --- a/crates/typst-library/src/math/ctx.rs +++ b/crates/typst-library/src/math/ctx.rs @@ -167,24 +167,29 @@ impl<'a, 'b, 'v> MathContext<'a, 'b, 'v> { { // A single letter that is available in the math font. match self.style.size { - MathSize::Display => { - let class = self.style.class.as_custom().or(glyph.class); - if class == Some(MathClass::Large) { - let height = scaled!(self, display_operator_min_height); - glyph.stretch_vertical(self, height, Abs::zero()).into() - } else { - glyph.into() - } - } MathSize::Script => { glyph.make_scriptsize(self); - glyph.into() } MathSize::ScriptScript => { glyph.make_scriptscriptsize(self); - glyph.into() } - _ => glyph.into(), + _ => (), + } + + let class = self.style.class.as_custom().or(glyph.class); + if class == Some(MathClass::Large) { + let mut variant = if self.style.size == MathSize::Display { + let height = scaled!(self, display_operator_min_height); + glyph.stretch_vertical(self, height, Abs::zero()) + } else { + glyph.into_variant() + }; + // TeXbook p 155. Large operators are always vertically centered on the axis. + let h = variant.frame.height(); + variant.frame.set_baseline(h / 2.0 + scaled!(self, axis_height)); + variant.into() + } else { + glyph.into() } } else if text.chars().all(|c| c.is_ascii_digit()) { // Numbers aren't that difficult. diff --git a/tests/ref/math/opticalsize.png b/tests/ref/math/opticalsize.png index 5c338ab6ea27b4c91e59d2c9e97c8dd9d4d133aa..905d3389f9f0246814fd2f2c708f051a6d9e3961 100644 GIT binary patch delta 8361 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