From 1861ceb1792d2a42979dff2fa721246ada922a42 Mon Sep 17 00:00:00 2001 From: damaxwell Date: Mon, 26 Jun 2023 03:42:38 -0800 Subject: [PATCH] math under/overline now draws simple lines based on parameters in math font table (#1568) --- library/src/math/underover.rs | 85 ++++++++++++++++++++++++++++++---- tests/ref/math/spacing.png | Bin 17745 -> 17618 bytes tests/ref/math/syntax.png | Bin 5036 -> 4850 bytes tests/ref/math/underover.png | Bin 4944 -> 4819 bytes 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/library/src/math/underover.rs b/library/src/math/underover.rs index 29c0e543c..796c9ebc4 100644 --- a/library/src/math/underover.rs +++ b/library/src/math/underover.rs @@ -1,9 +1,14 @@ use super::*; -const LINE_GAP: Em = Em::new(0.15); const BRACE_GAP: Em = Em::new(0.25); const BRACKET_GAP: Em = Em::new(0.25); +/// A marker to distinguish under- vs. overlines. +enum LineKind { + Over, + Under, +} + /// A horizontal line under content. /// /// ## Example { #example } @@ -23,7 +28,7 @@ pub struct UnderlineElem { impl LayoutMath for UnderlineElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - layout(ctx, &self.body(), &None, '\u{305}', LINE_GAP, false, self.span()) + layout_underoverline(ctx, &self.body(), self.span(), LineKind::Under) } } @@ -46,10 +51,72 @@ pub struct OverlineElem { impl LayoutMath for OverlineElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - layout(ctx, &self.body(), &None, '\u{332}', LINE_GAP, true, self.span()) + layout_underoverline(ctx, &self.body(), self.span(), LineKind::Over) } } +/// layout under- or overlined content +fn layout_underoverline( + ctx: &mut MathContext, + body: &Content, + span: Span, + line: LineKind, +) -> SourceResult<()> { + let (extra_height, content, line_pos, content_pos, baseline, bar_height); + match line { + LineKind::Under => { + let sep = scaled!(ctx, underbar_extra_descender); + bar_height = scaled!(ctx, underbar_rule_thickness); + let gap = scaled!(ctx, underbar_vertical_gap); + extra_height = sep + bar_height + gap; + + content = ctx.layout_fragment(body)?; + + line_pos = Point::with_y(content.height() + gap + bar_height / 2.0); + content_pos = Point::zero(); + baseline = content.ascent() + } + LineKind::Over => { + let sep = scaled!(ctx, overbar_extra_ascender); + bar_height = scaled!(ctx, overbar_rule_thickness); + let gap = scaled!(ctx, overbar_vertical_gap); + extra_height = sep + bar_height + gap; + + ctx.style(ctx.style.with_cramped(true)); + content = ctx.layout_fragment(body)?; + ctx.unstyle(); + + line_pos = Point::with_y(sep + bar_height / 2.0); + content_pos = Point::with_y(extra_height); + baseline = content.ascent() + extra_height; + } + } + + let width = content.width(); + let height = content.height() + extra_height; + let size = Size::new(width, height); + + let content_class = content.class().unwrap_or(MathClass::Normal); + let mut frame = Frame::new(size); + frame.set_baseline(baseline); + frame.push_frame(content_pos, content.into_frame()); + frame.push( + line_pos, + FrameItem::Shape( + Geometry::Line(Point::with_x(width)).stroked(Stroke { + paint: TextElem::fill_in(ctx.styles()), + thickness: bar_height, + ..Stroke::default() + }), + span, + ), + ); + + ctx.push(FrameFragment::new(ctx, frame).with_class(content_class)); + + Ok(()) +} + /// A horizontal brace under content, with an optional annotation below. /// /// ## Example { #example } @@ -73,7 +140,7 @@ pub struct UnderbraceElem { impl LayoutMath for UnderbraceElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - layout( + layout_underoverspreader( ctx, &self.body(), &self.annotation(ctx.styles()), @@ -108,7 +175,7 @@ pub struct OverbraceElem { impl LayoutMath for OverbraceElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - layout( + layout_underoverspreader( ctx, &self.body(), &self.annotation(ctx.styles()), @@ -143,7 +210,7 @@ pub struct UnderbracketElem { impl LayoutMath for UnderbracketElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - layout( + layout_underoverspreader( ctx, &self.body(), &self.annotation(ctx.styles()), @@ -178,7 +245,7 @@ pub struct OverbracketElem { impl LayoutMath for OverbracketElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - layout( + layout_underoverspreader( ctx, &self.body(), &self.annotation(ctx.styles()), @@ -190,8 +257,8 @@ impl LayoutMath for OverbracketElem { } } -/// Layout an over- or underthing. -fn layout( +/// Layout an over- or underbrace-like object. +fn layout_underoverspreader( ctx: &mut MathContext, body: &Content, annotation: &Option, diff --git a/tests/ref/math/spacing.png b/tests/ref/math/spacing.png index d15d6607587b685c5265dade234a28856b6c2995..2fd30e538787dd9c10f17dd266d279081c0419e6 100644 GIT binary patch delta 10591 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 diff --git a/tests/ref/math/syntax.png b/tests/ref/math/syntax.png index b843185a06fbfa10ee4cc7d70b917f38c34c7ec3..3d09723d6f733f55282a4a0c16b912e3d7642b2e 100644 GIT binary patch delta 3509 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 delta 3714 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 O0000