summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorMax <me@mkor.je>2024-08-09 07:40:29 +0000
committerGitHub <noreply@github.com>2024-08-09 07:40:29 +0000
commita6a8cdaa28abe22c3a40e7a96d15e5e02e8a445e (patch)
tree9ecd7fa6f443b1f46a1e407453aec55ac51042a5 /crates
parenta88899ed750047a4871f92940be415e447aef7a3 (diff)
Make under/overlines behave the same as accents in attach base (#4695)
Diffstat (limited to 'crates')
-rw-r--r--crates/typst/src/math/underover.rs18
1 files changed, 14 insertions, 4 deletions
diff --git a/crates/typst/src/math/underover.rs b/crates/typst/src/math/underover.rs
index 68a39983..f1789b7a 100644
--- a/crates/typst/src/math/underover.rs
+++ b/crates/typst/src/math/underover.rs
@@ -67,7 +67,7 @@ fn layout_underoverline(
span: Span,
position: Position,
) -> SourceResult<()> {
- let (extra_height, content, line_pos, content_pos, baseline, bar_height);
+ let (extra_height, content, line_pos, content_pos, baseline, bar_height, line_adjust);
match position {
Position::Under => {
let sep = scaled!(ctx, styles, underbar_extra_descender);
@@ -79,7 +79,8 @@ fn layout_underoverline(
line_pos = Point::with_y(content.height() + gap + bar_height / 2.0);
content_pos = Point::zero();
- baseline = content.ascent()
+ baseline = content.ascent();
+ line_adjust = -content.italics_correction();
}
Position::Over => {
let sep = scaled!(ctx, styles, overbar_extra_ascender);
@@ -93,21 +94,25 @@ fn layout_underoverline(
line_pos = Point::with_y(sep + bar_height / 2.0);
content_pos = Point::with_y(extra_height);
baseline = content.ascent() + extra_height;
+ line_adjust = Abs::zero();
}
}
let width = content.width();
let height = content.height() + extra_height;
let size = Size::new(width, height);
+ let line_width = width + line_adjust;
let content_class = content.class();
+ let content_is_text_like = content.is_text_like();
+ let content_italics_correction = content.italics_correction();
let mut frame = Frame::soft(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(FixedStroke {
+ Geometry::Line(Point::with_x(line_width)).stroked(FixedStroke {
paint: TextElem::fill_in(styles).as_decoration(),
thickness: bar_height,
..FixedStroke::default()
@@ -116,7 +121,12 @@ fn layout_underoverline(
),
);
- ctx.push(FrameFragment::new(ctx, styles, frame).with_class(content_class));
+ ctx.push(
+ FrameFragment::new(ctx, styles, frame)
+ .with_class(content_class)
+ .with_text_like(content_is_text_like)
+ .with_italics_correction(content_italics_correction),
+ );
Ok(())
}