From 0d8c3254b75e6493ecf8efc46c37d049c1ae6b63 Mon Sep 17 00:00:00 2001 From: Pg Biel <9021226+PgBiel@users.noreply.github.com> Date: Fri, 28 Apr 2023 13:49:02 -0300 Subject: [PATCH] Initial fix for spacing on decorated math operators (#1023) --- library/src/math/accent.rs | 8 +++++++- library/src/math/cancel.rs | 7 +++++-- library/src/math/row.rs | 14 ++++++++++++++ library/src/math/underover.rs | 3 ++- tests/ref/math/spacing.png | Bin 11992 -> 17743 bytes tests/typ/math/spacing.typ | 9 +++++++++ 6 files changed, 37 insertions(+), 4 deletions(-) diff --git a/library/src/math/accent.rs b/library/src/math/accent.rs index 1cd844290..2a650f2e7 100644 --- a/library/src/math/accent.rs +++ b/library/src/math/accent.rs @@ -58,6 +58,8 @@ impl LayoutMath for AccentElem { let base = ctx.layout_fragment(&self.base())?; ctx.unstyle(); + // Preserve class to preserve automatic spacing. + let base_class = base.class().unwrap_or(MathClass::Normal); let base_attach = match &base { MathFragment::Glyph(base) => { attachment(ctx, base.id, base.italics_correction) @@ -93,7 +95,11 @@ impl LayoutMath for AccentElem { frame.set_baseline(baseline); frame.push_frame(accent_pos, accent); frame.push_frame(base_pos, base.into_frame()); - ctx.push(FrameFragment::new(ctx, frame).with_base_ascent(base_ascent)); + ctx.push( + FrameFragment::new(ctx, frame) + .with_class(base_class) + .with_base_ascent(base_ascent), + ); Ok(()) } diff --git a/library/src/math/cancel.rs b/library/src/math/cancel.rs index edc2ba1ea..770f3c654 100644 --- a/library/src/math/cancel.rs +++ b/library/src/math/cancel.rs @@ -90,7 +90,10 @@ pub struct CancelElem { impl LayoutMath for CancelElem { fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - let mut body = ctx.layout_frame(&self.body())?; + let body = ctx.layout_fragment(&self.body())?; + // Use the same math class as the body, in order to preserve automatic spacing around it. + let body_class = body.class().unwrap_or(MathClass::Special); + let mut body = body.into_frame(); let styles = ctx.styles(); let body_size = body.size(); @@ -130,7 +133,7 @@ impl LayoutMath for CancelElem { body.push_frame(center, second_line); } - ctx.push(FrameFragment::new(ctx, body)); + ctx.push(FrameFragment::new(ctx, body).with_class(body_class)); Ok(()) } diff --git a/library/src/math/row.rs b/library/src/math/row.rs index 23c9d242e..a25178af7 100644 --- a/library/src/math/row.rs +++ b/library/src/math/row.rs @@ -95,6 +95,20 @@ impl MathRow { self.iter().map(MathFragment::descent).max().unwrap_or_default() } + pub fn class(&self) -> MathClass { + // Predict the class of the output of 'into_fragment' + if self.0.len() == 1 { + self.0 + .first() + .and_then(|fragment| fragment.class()) + .unwrap_or(MathClass::Special) + } else { + // FrameFragment::new() (inside 'into_fragment' in this branch) defaults + // to MathClass::Normal for its class. + MathClass::Normal + } + } + pub fn into_frame(self, ctx: &MathContext) -> Frame { let styles = ctx.styles(); let align = AlignElem::alignment_in(styles).x.resolve(styles); diff --git a/library/src/math/underover.rs b/library/src/math/underover.rs index 89ec5cff3..3ad2538c9 100644 --- a/library/src/math/underover.rs +++ b/library/src/math/underover.rs @@ -202,6 +202,7 @@ fn layout( ) -> SourceResult<()> { let gap = gap.scaled(ctx); let body = ctx.layout_row(body)?; + let body_class = body.class(); let glyph = GlyphFragment::new(ctx, c, span); let stretched = glyph.stretch_horizontal(ctx, body.width(), Abs::zero()); @@ -226,7 +227,7 @@ fn layout( } let frame = stack(ctx, rows, Align::Center, gap, baseline); - ctx.push(FrameFragment::new(ctx, frame)); + ctx.push(FrameFragment::new(ctx, frame).with_class(body_class)); Ok(()) } diff --git a/tests/ref/math/spacing.png b/tests/ref/math/spacing.png index 921996b017c1450ea350221d8d871eb63b58d8cf..94ca9b98e210a470e9b7f32091dea10f76f608bf 100644 GIT binary patch literal 17743 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 S+x<1Nt{|f-T`p<%{(k_~w+!(B diff --git a/tests/typ/math/spacing.typ b/tests/typ/math/spacing.typ index c1050d680..969c26c10 100644 --- a/tests/typ/math/spacing.typ +++ b/tests/typ/math/spacing.typ @@ -29,3 +29,12 @@ $a - b ident c quad (mod 2)$ // Test spacing for set comprehension. #set page(width: auto) $ { x in RR | x "is natural" and x < 10 } $ + +--- +// Test spacing for operators with decorations and modifiers on them +#set page(width: auto) +$a ident b + c - d => e log 5 op("ln") 6$ \ +$a cancel(ident) b overline(+) c arrow(-) d hat(=>) e cancel(log) 5 dot(op("ln")) 6$ \ +$a overbrace(ident) b underline(+) c grave(-) d underbracket(=>) e circle(log) 5 caron(op("ln")) 6$ \ +\ +$a attach(ident, tl: a, tr: b) b attach(limits(+), t: a, b: b) c tilde(-) d breve(=>) e attach(limits(log), t: a, b: b) 5 attach(op("ln"), tr: a, bl: b) 6$