From b10f9ae7b7f5a15c797441d4d67ea69d2ab9b617 Mon Sep 17 00:00:00 2001 From: Eric Biedert Date: Mon, 18 Sep 2023 14:51:34 +0200 Subject: [PATCH] Fix "set align" for block equations (#2157) --- crates/typst-library/src/math/mod.rs | 27 ++++++++++++++++------ tests/ref/math/block-alignment.png | Bin 0 -> 5167 bytes tests/typ/math/block-alignment.typ | 33 +++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 tests/ref/math/block-alignment.png create mode 100644 tests/typ/math/block-alignment.typ diff --git a/crates/typst-library/src/math/mod.rs b/crates/typst-library/src/math/mod.rs index 3ae3f23aa..df3beb7fd 100644 --- a/crates/typst-library/src/math/mod.rs +++ b/crates/typst-library/src/math/mod.rs @@ -43,7 +43,7 @@ use self::ctx::*; use self::fragment::*; use self::row::*; use self::spacing::*; -use crate::layout::{BoxElem, HElem, ParElem, Spacing}; +use crate::layout::{AlignElem, BoxElem, HElem, ParElem, Spacing}; use crate::meta::Supplement; use crate::meta::{ Count, Counter, CounterUpdate, LocalName, Numbering, Outlinable, Refable, @@ -200,14 +200,18 @@ impl Show for EquationElem { fn show(&self, _: &mut Vt, styles: StyleChain) -> SourceResult { let mut realized = self.clone().pack().guarded(Guard::Base(Self::elem())); if self.block(styles) { - realized = realized.aligned(Align::CENTER); + realized = AlignElem::new(realized).pack(); } Ok(realized) } } impl Finalize for EquationElem { - fn finalize(&self, realized: Content, _: StyleChain) -> Content { + fn finalize(&self, realized: Content, style: StyleChain) -> Content { + let mut realized = realized; + if self.block(style) { + realized = realized.styled(AlignElem::set_alignment(Align::CENTER)); + } realized .styled(TextElem::set_weight(FontWeight::from_number(450))) .styled(TextElem::set_font(FontList(vec![FontFamily::new( @@ -251,17 +255,26 @@ impl Layout for EquationElem { .layout(vt, styles, pod)? .into_frame(); + let full_counter_width = counter.width() + NUMBER_GUTTER.resolve(styles); let width = if regions.size.x.is_finite() { regions.size.x } else { - frame.width() - + 2.0 * (counter.width() + NUMBER_GUTTER.resolve(styles)) + frame.width() + 2.0 * full_counter_width }; let height = frame.height().max(counter.height()); - frame.resize(Size::new(width, height), Axes::splat(FixedAlign::Center)); + let align = AlignElem::alignment_in(styles).resolve(styles).x; + frame.resize(Size::new(width, height), Axes::splat(align)); - let x = if TextElem::dir_in(styles).is_positive() { + let dir = TextElem::dir_in(styles); + let offset = match (align, dir) { + (FixedAlign::Start, Dir::RTL) => full_counter_width, + (FixedAlign::End, Dir::LTR) => -full_counter_width, + _ => Abs::zero(), + }; + frame.translate(Point::with_x(offset)); + + let x = if dir.is_positive() { frame.width() - counter.width() } else { Abs::zero() diff --git a/tests/ref/math/block-alignment.png b/tests/ref/math/block-alignment.png new file mode 100644 index 0000000000000000000000000000000000000000..608cef17ff71b07c7323dac40fa64546607903df GIT binary patch literal 5167 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