From 255044e04e8b3ad7941a7dadcfd36c07669326aa Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 2 Feb 2023 21:21:04 +0100 Subject: [PATCH] Ignore accent when positioning superscript --- library/src/math/accent.rs | 3 ++- library/src/math/attach.rs | 32 ++++++++++++++++++++------------ library/src/math/fragment.rs | 17 ++++++++++++----- tests/ref/math/accent.png | Bin 5794 -> 6686 bytes tests/typ/math/accent.typ | 6 +++++- 5 files changed, 39 insertions(+), 19 deletions(-) diff --git a/library/src/math/accent.rs b/library/src/math/accent.rs index 809939258..797a4761d 100644 --- a/library/src/math/accent.rs +++ b/library/src/math/accent.rs @@ -112,13 +112,14 @@ impl LayoutMath for AccentNode { let size = Size::new(base.width(), accent.height() + gap + base.height()); let accent_pos = Point::with_x(base_attach - accent_attach); let base_pos = Point::with_y(accent.height() + gap); + let base_ascent = base.ascent(); let baseline = base_pos.y + base.ascent(); let mut frame = Frame::new(size); frame.set_baseline(baseline); frame.push_frame(accent_pos, accent); frame.push_frame(base_pos, base.to_frame(ctx)); - ctx.push(FrameFragment::new(ctx, frame)); + ctx.push(FrameFragment::new(ctx, frame).with_base_ascent(base_ascent)); Ok(()) } diff --git a/library/src/math/attach.rs b/library/src/math/attach.rs index 8a1644beb..6adbd47ad 100644 --- a/library/src/math/attach.rs +++ b/library/src/math/attach.rs @@ -51,12 +51,15 @@ impl LayoutMath for AttachNode { let base = ctx.layout_fragment(&self.base)?; ctx.style(ctx.style.for_subscript()); - let top = self.top.as_ref().map(|node| ctx.layout_frame(node)).transpose()?; + let top = self.top.as_ref().map(|node| ctx.layout_fragment(node)).transpose()?; ctx.unstyle(); ctx.style(ctx.style.for_superscript()); - let bottom = - self.bottom.as_ref().map(|node| ctx.layout_frame(node)).transpose()?; + let bottom = self + .bottom + .as_ref() + .map(|node| ctx.layout_fragment(node)) + .transpose()?; ctx.unstyle(); let render_limits = self.base.is::() @@ -145,8 +148,8 @@ impl LayoutMath for LimitsNode { fn scripts( ctx: &mut MathContext, base: MathFragment, - sup: Option, - sub: Option, + sup: Option, + sub: Option, ) -> SourceResult<()> { let sup_shift_up = if ctx.style.cramped { scaled!(ctx, superscript_shift_up_cramped) @@ -166,8 +169,13 @@ fn scripts( let mut shift_down = Abs::zero(); if let Some(sup) = &sup { + let ascent = match &base { + MathFragment::Frame(frame) => frame.base_ascent, + _ => base.ascent(), + }; + shift_up = sup_shift_up - .max(base.ascent() - sup_drop_max) + .max(ascent - sup_drop_max) .max(sup_bottom_min + sup.descent()); } @@ -222,13 +230,13 @@ fn scripts( if let Some(sup) = sup { let sup_pos = Point::new(sup_delta + base_width, ascent - shift_up - sup.ascent()); - frame.push_frame(sup_pos, sup); + frame.push_frame(sup_pos, sup.to_frame(ctx)); } if let Some(sub) = sub { let sub_pos = Point::new(sub_delta + base_width, ascent + shift_down - sub.ascent()); - frame.push_frame(sub_pos, sub); + frame.push_frame(sub_pos, sub.to_frame(ctx)); } ctx.push(FrameFragment::new(ctx, frame).with_class(class)); @@ -240,8 +248,8 @@ fn scripts( fn limits( ctx: &mut MathContext, base: MathFragment, - top: Option, - bottom: Option, + top: Option, + bottom: Option, ) -> SourceResult<()> { let upper_gap_min = scaled!(ctx, upper_limit_gap_min); let upper_rise_min = scaled!(ctx, upper_limit_baseline_rise_min); @@ -275,13 +283,13 @@ fn limits( if let Some(top) = top { let top_pos = Point::with_x((width - top.width()) / 2.0 + delta); - frame.push_frame(top_pos, top); + frame.push_frame(top_pos, top.to_frame(ctx)); } if let Some(bottom) = bottom { let bottom_pos = Point::new((width - bottom.width()) / 2.0 - delta, height - bottom.height()); - frame.push_frame(bottom_pos, bottom); + frame.push_frame(bottom_pos, bottom.to_frame(ctx)); } ctx.push(FrameFragment::new(ctx, frame).with_class(class)); diff --git a/library/src/math/fragment.rs b/library/src/math/fragment.rs index f1c374a14..843021f48 100644 --- a/library/src/math/fragment.rs +++ b/library/src/math/fragment.rs @@ -218,7 +218,7 @@ impl GlyphFragment { glyphs: vec![Glyph { id: self.id.0, c: self.c, - x_advance: Em::from_length(self.width, ctx.size), + x_advance: Em::from_length(self.width, self.font_size), x_offset: Em::zero(), }], }; @@ -256,22 +256,25 @@ impl Debug for VariantFragment { #[derive(Debug, Clone)] pub struct FrameFragment { pub frame: Frame, - pub limits: bool, - pub spaced: bool, pub style: MathStyle, pub font_size: Abs, pub class: MathClass, + pub limits: bool, + pub spaced: bool, + pub base_ascent: Abs, } impl FrameFragment { pub fn new(ctx: &MathContext, frame: Frame) -> Self { + let base_ascent = frame.ascent(); Self { frame, - limits: false, - spaced: false, font_size: ctx.size, style: ctx.style, class: MathClass::Normal, + limits: false, + spaced: false, + base_ascent, } } @@ -286,6 +289,10 @@ impl FrameFragment { pub fn with_spaced(self, spaced: bool) -> Self { Self { spaced, ..self } } + + pub fn with_base_ascent(self, base_ascent: Abs) -> Self { + Self { base_ascent, ..self } + } } /// Look up the italics correction for a glyph. diff --git a/tests/ref/math/accent.png b/tests/ref/math/accent.png index c67e0912df55978d42750f6f201b1c8beb533a27..bea94cab3c29400ea8d2745d37ea13c813ea99a0 100644 GIT binary patch literal 6686 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 P@JCAWYI4dKD*0EBb9vcb0o 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 diff --git a/tests/typ/math/accent.typ b/tests/typ/math/accent.typ index 65ef9d1b5..b67614ddd 100644 --- a/tests/typ/math/accent.typ +++ b/tests/typ/math/accent.typ @@ -2,7 +2,7 @@ --- // Test function call. -$grave(a), acute(b), hat(f), tilde(§), macron(ä), diaer(a), ä, \ +$grave(a), acute(b), hat(f), tilde(§), macron(ä), diaer(a), ä \ breve(\&), dot(!), circle(a), caron(@), arrow(Z), arrow.l(Z)$ --- @@ -17,6 +17,10 @@ $sqrt(tilde(T)) + hat(f)/hat(g)$ // Test wide base. $arrow("ABC" + d), tilde(sum)$ +--- +// Test effect of accent on superscript. +$A^x != hat(A)^x != hat(hat(A))^x$ + --- // Test high base. $ tilde(integral), tilde(integral)_a^b, tilde(integral_a^b) $