diff options
| author | damaxwell <damaxwell@alaska.edu> | 2023-07-20 02:50:12 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-20 12:50:12 +0200 |
| commit | c72952b512f031a20be1455e5168b7e673b25a97 (patch) | |
| tree | 2259a34d6d48422b8909fa405ab78d6d52495346 /crates/typst-library | |
| parent | 6a396ae21410af5b265aa3174500146794d2b693 (diff) | |
Center delimiters vertically about the axis (#1756)
Diffstat (limited to 'crates/typst-library')
| -rw-r--r-- | crates/typst-library/src/math/ctx.rs | 3 | ||||
| -rw-r--r-- | crates/typst-library/src/math/delimited.rs | 5 | ||||
| -rw-r--r-- | crates/typst-library/src/math/frac.rs | 14 | ||||
| -rw-r--r-- | crates/typst-library/src/math/fragment.rs | 9 | ||||
| -rw-r--r-- | crates/typst-library/src/math/matrix.rs | 15 |
5 files changed, 29 insertions, 17 deletions
diff --git a/crates/typst-library/src/math/ctx.rs b/crates/typst-library/src/math/ctx.rs index 4a0959ab..acd60e48 100644 --- a/crates/typst-library/src/math/ctx.rs +++ b/crates/typst-library/src/math/ctx.rs @@ -185,8 +185,7 @@ impl<'a, 'b, 'v> MathContext<'a, 'b, 'v> { 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.center_on_axis(self); variant.into() } else { glyph.into() diff --git a/crates/typst-library/src/math/delimited.rs b/crates/typst-library/src/math/delimited.rs index 99cd6c33..25ecf623 100644 --- a/crates/typst-library/src/math/delimited.rs +++ b/crates/typst-library/src/math/delimited.rs @@ -95,9 +95,10 @@ fn scale( }; let short_fall = DELIM_SHORT_FALL.scaled(ctx); - *fragment = - MathFragment::Variant(glyph.stretch_vertical(ctx, height, short_fall)); + let mut stretched = glyph.stretch_vertical(ctx, height, short_fall); + stretched.center_on_axis(ctx); + *fragment = MathFragment::Variant(stretched); if let Some(class) = apply { fragment.set_class(class); } diff --git a/crates/typst-library/src/math/frac.rs b/crates/typst-library/src/math/frac.rs index 0e1f78cc..cf1d38e9 100644 --- a/crates/typst-library/src/math/frac.rs +++ b/crates/typst-library/src/math/frac.rs @@ -122,13 +122,15 @@ fn layout( frame.push_frame(denom_pos, denom); if binom { - ctx.push( - GlyphFragment::new(ctx, '(', span).stretch_vertical(ctx, height, short_fall), - ); + let mut left = + GlyphFragment::new(ctx, '(', span).stretch_vertical(ctx, height, short_fall); + left.center_on_axis(ctx); + ctx.push(left); ctx.push(FrameFragment::new(ctx, frame)); - ctx.push( - GlyphFragment::new(ctx, ')', span).stretch_vertical(ctx, height, short_fall), - ); + let mut right = + GlyphFragment::new(ctx, ')', span).stretch_vertical(ctx, height, short_fall); + right.center_on_axis(ctx); + ctx.push(right); } else { frame.push( line_pos, diff --git a/crates/typst-library/src/math/fragment.rs b/crates/typst-library/src/math/fragment.rs index 85fdf6a6..f4efa7f6 100644 --- a/crates/typst-library/src/math/fragment.rs +++ b/crates/typst-library/src/math/fragment.rs @@ -353,6 +353,15 @@ pub struct VariantFragment { pub limits: Limits, } +impl VariantFragment { + /// Vertically adjust the fragment's frame so that it is centered + /// on the axis. + pub fn center_on_axis(&mut self, ctx: &MathContext) { + let h = self.frame.height(); + self.frame.set_baseline(h / 2.0 + scaled!(ctx, axis_height)); + } +} + impl Debug for VariantFragment { fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { write!(f, "VariantFragment({:?})", self.c) diff --git a/crates/typst-library/src/math/matrix.rs b/crates/typst-library/src/math/matrix.rs index aaccc332..3fa53ba0 100644 --- a/crates/typst-library/src/math/matrix.rs +++ b/crates/typst-library/src/math/matrix.rs @@ -295,18 +295,19 @@ fn layout_delimiters( frame.set_baseline(height / 2.0 + axis); if let Some(left) = left { - ctx.push( - GlyphFragment::new(ctx, left, span).stretch_vertical(ctx, target, short_fall), - ); + let mut left = + GlyphFragment::new(ctx, left, span).stretch_vertical(ctx, target, short_fall); + left.center_on_axis(ctx); + ctx.push(left); } ctx.push(FrameFragment::new(ctx, frame)); if let Some(right) = right { - ctx.push( - GlyphFragment::new(ctx, right, span) - .stretch_vertical(ctx, target, short_fall), - ); + let mut right = GlyphFragment::new(ctx, right, span) + .stretch_vertical(ctx, target, short_fall); + right.center_on_axis(ctx); + ctx.push(right); } Ok(()) |
