From 62361b4127c39fc1b165b81f24f52b14ddaa41db Mon Sep 17 00:00:00 2001 From: Leedehai <18319900+Leedehai@users.noreply.github.com> Date: Tue, 25 Apr 2023 05:24:07 -0400 Subject: [PATCH] Support indices preceding the base symbol, revamping #699 (#825) Breaking change: abbreviate attach() attachment params, top -> t, bottom -> b --- library/src/lib.rs | 22 +- library/src/math/attach.rs | 319 ++++++++++++++++----------- src/eval/library.rs | 14 +- src/eval/mod.rs | 4 +- tests/ref/math/attach.png | Bin 11366 -> 21307 bytes tests/typ/compiler/content-field.typ | 4 +- tests/typ/math/attach.typ | 60 ++++- tests/typ/math/content.typ | 2 +- 8 files changed, 277 insertions(+), 148 deletions(-) diff --git a/library/src/lib.rs b/library/src/lib.rs index 98ec121a2..e7a23cd7c 100644 --- a/library/src/lib.rs +++ b/library/src/lib.rs @@ -227,13 +227,25 @@ fn items() -> LangItems { equation: |body, block| math::EquationElem::new(body).with_block(block).pack(), math_align_point: || math::AlignPointElem::new().pack(), math_delimited: |open, body, close| math::LrElem::new(open + body + close).pack(), - math_attach: |base, bottom, top| { + math_attach: |base, top, bottom, topleft, bottomleft, topright, bottomright| { let mut elem = math::AttachElem::new(base); - if let Some(bottom) = bottom { - elem.push_bottom(Some(bottom)); - } if let Some(top) = top { - elem.push_top(Some(top)); + elem.push_t(Some(top)); + } + if let Some(bottom) = bottom { + elem.push_b(Some(bottom)); + } + if let Some(topleft) = topleft { + elem.push_tl(Some(topleft)); + } + if let Some(bottomleft) = bottomleft { + elem.push_bl(Some(bottomleft)); + } + if let Some(topright) = topright { + elem.push_tr(Some(topright)); + } + if let Some(bottomright) = bottomright { + elem.push_br(Some(bottomright)); } elem.pack() }, diff --git a/library/src/math/attach.rs b/library/src/math/attach.rs index dcf7fb78d..34c24e17f 100644 --- a/library/src/math/attach.rs +++ b/library/src/math/attach.rs @@ -3,8 +3,9 @@ use super::*; /// A base with optional attachments. /// /// ## Syntax -/// This function also has dedicated syntax: Use the underscore (`_`) to -/// indicate a bottom attachment and the hat (`^`) to indicate a top attachment. +/// This function also has dedicated syntax for attachments after the base: Use the +/// underscore (`_`) to indicate a subscript i.e. bottom attachment and the hat (`^`) +/// to indicate a superscript i.e. top attachment. /// /// ## Example /// ```example @@ -19,38 +20,56 @@ pub struct AttachElem { #[required] pub base: Content, - /// The top attachment. - pub top: Option, + /// The top attachment, smartly positioned at top-right or above the base. + /// Use limits() or scripts() on the base to override the smart positioning. + pub t: Option, - /// The bottom attachment. - pub bottom: Option, + /// The bottom attachment, smartly positioned at the bottom-right or below the base. + /// Use limits() or scripts() on the base to override the smart positioning. + pub b: Option, + + /// The top-left attachment before the base. + pub tl: Option, + + /// The bottom-left attachment before base. + pub bl: Option, + + /// The top-right attachment after the base. + pub tr: Option, + + /// The bottom-right attachment after the base. + pub br: Option, } +type GetAttachmentContent = + fn(&AttachElem, styles: ::typst::model::StyleChain) -> Option; + impl LayoutMath for AttachElem { #[tracing::instrument(skip(ctx))] fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { - let base = self.base(); - let display_limits = base.is::(); - let display_scripts = base.is::(); + let base = ctx.layout_fragment(&self.base())?; - let base = ctx.layout_fragment(&base)?; + let getarg = |ctx: &mut MathContext, getter: GetAttachmentContent| { + getter(self, ctx.styles()) + .map(|elem| ctx.layout_fragment(&elem)) + .transpose() + .unwrap() + }; ctx.style(ctx.style.for_superscript()); - let top = self - .top(ctx.styles()) - .map(|elem| ctx.layout_fragment(&elem)) - .transpose()?; + let arg_tl = getarg(ctx, Self::tl); + let arg_tr = getarg(ctx, Self::tr); + let arg_t = getarg(ctx, Self::t); ctx.unstyle(); ctx.style(ctx.style.for_subscript()); - let bottom = self - .bottom(ctx.styles()) - .map(|elem| ctx.layout_fragment(&elem)) - .transpose()?; + let arg_bl = getarg(ctx, Self::bl); + let arg_br = getarg(ctx, Self::br); + let arg_b = getarg(ctx, Self::b); ctx.unstyle(); - let display_limits = display_limits - || (!display_scripts + let as_limits = self.base().is::() + || (!self.base().is::() && ctx.style.size == MathSize::Display && base.class() == Some(MathClass::Large) && match &base { @@ -59,11 +78,12 @@ impl LayoutMath for AttachElem { _ => false, }); - if display_limits { - limits(ctx, base, top, bottom) - } else { - scripts(ctx, base, top, bottom) - } + let (t, tr) = + if as_limits || arg_tr.is_some() { (arg_t, arg_tr) } else { (None, arg_t) }; + let (b, br) = + if as_limits || arg_br.is_some() { (arg_b, arg_br) } else { (None, arg_b) }; + + layout_attachments(ctx, base, [arg_tl, t, tr, arg_bl, b, br]) } } @@ -113,113 +133,98 @@ impl LayoutMath for LimitsElem { } } -/// Layout sub- and superscripts. -fn scripts( +/// Layout the attachments. +fn layout_attachments( ctx: &mut MathContext, base: MathFragment, - sup: Option, - sub: Option, + [tl, t, tr, bl, b, br]: [Option; 6], ) -> SourceResult<()> { - let sup_shift_up = if ctx.style.cramped { - scaled!(ctx, superscript_shift_up_cramped) - } else { - scaled!(ctx, superscript_shift_up) - }; - let sup_bottom_min = scaled!(ctx, superscript_bottom_min); - let sup_bottom_max_with_sub = scaled!(ctx, superscript_bottom_max_with_subscript); - let sup_drop_max = scaled!(ctx, superscript_baseline_drop_max); - let gap_min = scaled!(ctx, sub_superscript_gap_min); - let sub_shift_down = scaled!(ctx, subscript_shift_down); - let sub_top_max = scaled!(ctx, subscript_top_max); - let sub_drop_min = scaled!(ctx, subscript_baseline_drop_min); - let space_after = scaled!(ctx, space_after_script); + let (shift_up, shift_down) = + compute_shifts_up_and_down(ctx, &base, [&tl, &tr, &bl, &br]); - let mut shift_up = Abs::zero(); - 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(ascent - sup_drop_max) - .max(sup_bottom_min + sup.descent()); - } - - if let Some(sub) = &sub { - shift_down = sub_shift_down - .max(base.descent() + sub_drop_min) - .max(sub.ascent() - sub_top_max); - } - - if let (Some(sup), Some(sub)) = (&sup, &sub) { - let sup_bottom = shift_up - sup.descent(); - let sub_top = sub.ascent() - shift_down; - let gap = sup_bottom - sub_top; - if gap < gap_min { - let increase = gap_min - gap; - let sup_only = - (sup_bottom_max_with_sub - sup_bottom).clamp(Abs::zero(), increase); - let rest = (increase - sup_only) / 2.0; - shift_up += sup_only + rest; - shift_down += rest; - } - } - - let italics = base.italics_correction(); let sup_delta = Abs::zero(); - let sub_delta = -italics; + let sub_delta = -base.italics_correction(); + let (base_width, base_ascent, base_descent) = + (base.width(), base.ascent(), base.descent()); + let base_class = base.class().unwrap_or(MathClass::Normal); - let mut width = Abs::zero(); - let mut ascent = base.ascent(); - let mut descent = base.descent(); - - if let Some(sup) = &sup { - ascent.set_max(shift_up + sup.ascent()); - width.set_max(sup_delta + sup.width()); + macro_rules! measure { + ($e: ident, $attr: ident) => { + $e.as_ref().map(|e| e.$attr()).unwrap_or_default() + }; } - if let Some(sub) = &sub { - descent.set_max(shift_down + sub.descent()); - width.set_max(sub_delta + sub.width()); + let ascent = base_ascent + .max(shift_up + measure!(tr, ascent)) + .max(shift_up + measure!(tl, ascent)) + .max(shift_up + measure!(t, height)); + + let descent = base_descent + .max(shift_down + measure!(br, descent)) + .max(shift_down + measure!(bl, descent)) + .max(shift_down + measure!(b, height)); + + let pre_sup_width = measure!(tl, width); + let pre_sub_width = measure!(bl, width); + let pre_width_dif = pre_sup_width - pre_sub_width; // Could be negative. + let pre_width_max = pre_sup_width.max(pre_sub_width); + let post_max_width = + (sup_delta + measure!(tr, width)).max(sub_delta + measure!(br, width)); + + let (center_frame, base_offset) = attach_top_and_bottom(ctx, base, t, b); + let base_pos = + Point::new(sup_delta + pre_width_max, ascent - base_ascent - base_offset); + if [&tl, &bl, &tr, &br].iter().all(|&e| e.is_none()) { + ctx.push(FrameFragment::new(ctx, center_frame).with_class(base_class)); + return Ok(()); } - width += base.width() + space_after; - - let base_pos = Point::with_y(ascent - base.ascent()); - let base_width = base.width(); - let class = base.class().unwrap_or(MathClass::Normal); - - let mut frame = Frame::new(Size::new(width, ascent + descent)); + let mut frame = Frame::new(Size::new( + pre_width_max + base_width + post_max_width + scaled!(ctx, space_after_script), + ascent + descent, + )); frame.set_baseline(ascent); - frame.push_frame(base_pos, base.into_frame()); + frame.push_frame(base_pos, center_frame); - 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.into_frame()); + if let Some(tl) = tl { + let pos = + Point::new(-pre_width_dif.min(Abs::zero()), ascent - shift_up - tl.ascent()); + frame.push_frame(pos, tl.into_frame()); } - 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.into_frame()); + if let Some(bl) = bl { + let pos = + Point::new(pre_width_dif.max(Abs::zero()), ascent + shift_down - bl.ascent()); + frame.push_frame(pos, bl.into_frame()); } - ctx.push(FrameFragment::new(ctx, frame).with_class(class)); + if let Some(tr) = tr { + let pos = Point::new( + sup_delta + pre_width_max + base_width, + ascent - shift_up - tr.ascent(), + ); + frame.push_frame(pos, tr.into_frame()); + } + + if let Some(br) = br { + let pos = Point::new( + sub_delta + pre_width_max + base_width, + ascent + shift_down - br.ascent(), + ); + frame.push_frame(pos, br.into_frame()); + } + + ctx.push(FrameFragment::new(ctx, frame).with_class(base_class)); Ok(()) } -/// Layout limits. -fn limits( +fn attach_top_and_bottom( ctx: &mut MathContext, base: MathFragment, - top: Option, - bottom: Option, -) -> SourceResult<()> { + t: Option, + b: Option, +) -> (Frame, Abs) { let upper_gap_min = scaled!(ctx, upper_limit_gap_min); let upper_rise_min = scaled!(ctx, upper_limit_baseline_rise_min); let lower_gap_min = scaled!(ctx, lower_limit_gap_min); @@ -229,41 +234,99 @@ fn limits( let mut width = base.width(); let mut height = base.height(); - if let Some(top) = &top { - let top_gap = upper_gap_min.max(upper_rise_min - top.descent()); - width.set_max(top.width()); - height += top.height() + top_gap; - base_offset = top_gap + top.height(); + if let Some(t) = &t { + let top_gap = upper_gap_min.max(upper_rise_min - t.descent()); + width.set_max(t.width()); + height += t.height() + top_gap; + base_offset = top_gap + t.height(); } - if let Some(bottom) = &bottom { - let bottom_gap = lower_gap_min.max(lower_drop_min - bottom.ascent()); - width.set_max(bottom.width()); - height += bottom.height() + bottom_gap; + if let Some(b) = &b { + let bottom_gap = lower_gap_min.max(lower_drop_min - b.ascent()); + width.set_max(b.width()); + height += b.height() + bottom_gap; } let base_pos = Point::new((width - base.width()) / 2.0, base_offset); - let class = base.class().unwrap_or(MathClass::Normal); let delta = base.italics_correction() / 2.0; let mut frame = Frame::new(Size::new(width, height)); frame.set_baseline(base_pos.y + base.ascent()); frame.push_frame(base_pos, base.into_frame()); - if let Some(top) = top { - let top_pos = Point::with_x((width - top.width()) / 2.0 + delta); - frame.push_frame(top_pos, top.into_frame()); + if let Some(t) = t { + let top_pos = Point::with_x((width - t.width()) / 2.0 + delta); + frame.push_frame(top_pos, t.into_frame()); } - if let Some(bottom) = bottom { + if let Some(b) = b { let bottom_pos = - Point::new((width - bottom.width()) / 2.0 - delta, height - bottom.height()); - frame.push_frame(bottom_pos, bottom.into_frame()); + Point::new((width - b.width()) / 2.0 - delta, height - b.height()); + frame.push_frame(bottom_pos, b.into_frame()); } - ctx.push(FrameFragment::new(ctx, frame).with_class(class)); + (frame, base_offset) +} - Ok(()) +fn compute_shifts_up_and_down( + ctx: &MathContext, + base: &MathFragment, + [tl, tr, bl, br]: [&Option; 4], +) -> (Abs, Abs) { + let sup_shift_up = if ctx.style.cramped { + scaled!(ctx, superscript_shift_up_cramped) + } else { + scaled!(ctx, superscript_shift_up) + }; + + let sup_bottom_min = scaled!(ctx, superscript_bottom_min); + let sup_bottom_max_with_sub = scaled!(ctx, superscript_bottom_max_with_subscript); + let sup_drop_max = scaled!(ctx, superscript_baseline_drop_max); + let gap_min = scaled!(ctx, sub_superscript_gap_min); + let sub_shift_down = scaled!(ctx, subscript_shift_down); + let sub_top_max = scaled!(ctx, subscript_top_max); + let sub_drop_min = scaled!(ctx, subscript_baseline_drop_min); + + let mut shift_up = Abs::zero(); + let mut shift_down = Abs::zero(); + + for e in [tl, tr].into_iter().flatten() { + let ascent = match &base { + MathFragment::Frame(frame) => frame.base_ascent, + _ => base.ascent(), + }; + + shift_up = shift_up + .max(sup_shift_up) + .max(ascent - sup_drop_max) + .max(sup_bottom_min + e.descent()); + } + for e in [bl, br].into_iter().flatten() { + shift_down = shift_down + .max(sub_shift_down) + .max(base.descent() + sub_drop_min) + .max(e.ascent() - sub_top_max); + } + + for (sup, sub) in [(tl, bl), (tr, br)] { + if let (Some(sup), Some(sub)) = (&sup, &sub) { + let sup_bottom = shift_up - sup.descent(); + let sub_top = sub.ascent() - shift_down; + let gap = sup_bottom - sub_top; + if gap >= gap_min { + continue; + } + + let increase = gap_min - gap; + let sup_only = + (sup_bottom_max_with_sub - sup_bottom).clamp(Abs::zero(), increase); + let rest = (increase - sup_only) / 2.0; + shift_up += sup_only + rest; + shift_down += rest; + } + } + + (shift_up, shift_down) } /// Codepoints that should have sub- and superscripts attached as limits. diff --git a/src/eval/library.rs b/src/eval/library.rs index 0c635864a..a92d8bd19 100644 --- a/src/eval/library.rs +++ b/src/eval/library.rs @@ -87,8 +87,18 @@ pub struct LangItems { /// Matched delimiters in math: `[x + y]`. pub math_delimited: fn(open: Content, body: Content, close: Content) -> Content, /// A base with optional attachments in math: `a_1^2`. - pub math_attach: - fn(base: Content, bottom: Option, top: Option) -> Content, + #[allow(clippy::type_complexity)] + pub math_attach: fn( + base: Content, + // Positioned smartly. + top: Option, + bottom: Option, + // Fixed positions. + topleft: Option, + bottomleft: Option, + topright: Option, + bottomright: Option, + ) -> Content, /// A base with an accent: `arrow(x)`. pub math_accent: fn(base: Content, accent: char) -> Content, /// A fraction in math: `x/2`. diff --git a/src/eval/mod.rs b/src/eval/mod.rs index d8f49d661..d2ca0e74e 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -708,9 +708,9 @@ impl Eval for ast::MathAttach { #[tracing::instrument(name = "MathAttach::eval", skip_all)] fn eval(&self, vm: &mut Vm) -> SourceResult { let base = self.base().eval_display(vm)?; - let bottom = self.bottom().map(|expr| expr.eval_display(vm)).transpose()?; let top = self.top().map(|expr| expr.eval_display(vm)).transpose()?; - Ok((vm.items.math_attach)(base, bottom, top)) + let bottom = self.bottom().map(|expr| expr.eval_display(vm)).transpose()?; + Ok((vm.items.math_attach)(base, top, bottom, None, None, None, None)) } } diff --git a/tests/ref/math/attach.png b/tests/ref/math/attach.png index 956199ca257aca039470256b2af4c522a8e2abb2..e65a1691057352b6e5c3796cadd650034e566e26 100644 GIT binary patch literal 21307 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 H+hP9!XD^8J literal 11366 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 Q0=!CELP5L&Y8dc806FC0