summaryrefslogtreecommitdiff
path: root/crates/typst-library
diff options
context:
space:
mode:
authordamaxwell <damaxwell@alaska.edu>2023-07-20 02:50:12 -0800
committerGitHub <noreply@github.com>2023-07-20 12:50:12 +0200
commitc72952b512f031a20be1455e5168b7e673b25a97 (patch)
tree2259a34d6d48422b8909fa405ab78d6d52495346 /crates/typst-library
parent6a396ae21410af5b265aa3174500146794d2b693 (diff)
Center delimiters vertically about the axis (#1756)
Diffstat (limited to 'crates/typst-library')
-rw-r--r--crates/typst-library/src/math/ctx.rs3
-rw-r--r--crates/typst-library/src/math/delimited.rs5
-rw-r--r--crates/typst-library/src/math/frac.rs14
-rw-r--r--crates/typst-library/src/math/fragment.rs9
-rw-r--r--crates/typst-library/src/math/matrix.rs15
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(())