From f8966f9e867dc72080355342aab64734f70ac4f7 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 19 Apr 2023 10:38:03 +0200 Subject: [PATCH] Fix realize in math --- library/src/math/fragment.rs | 6 +++++- library/src/math/mod.rs | 13 +++++++++++-- library/src/math/stretch.rs | 1 + src/doc.rs | 17 +++++++++++------ tests/ref/bugs/math-realize.png | Bin 0 -> 6335 bytes tests/typ/bugs/math-realize.typ | 15 +++++++++++++++ 6 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 tests/ref/bugs/math-realize.png create mode 100644 tests/typ/bugs/math-realize.typ diff --git a/library/src/math/fragment.rs b/library/src/math/fragment.rs index d85bd33c8..1d13e3b79 100644 --- a/library/src/math/fragment.rs +++ b/library/src/math/fragment.rs @@ -148,6 +148,7 @@ pub struct GlyphFragment { pub font_size: Abs, pub class: Option, pub span: Span, + pub meta: Vec, } impl GlyphFragment { @@ -194,6 +195,7 @@ impl GlyphFragment { _ => unicode_math_class::class(c), }, span, + meta: MetaElem::data_in(ctx.styles()), } } @@ -231,6 +233,7 @@ impl GlyphFragment { }; let size = Size::new(self.width, self.ascent + self.descent); let mut frame = Frame::new(size); + frame.meta_iter(self.meta); frame.set_baseline(self.ascent); frame.push(Point::with_y(self.ascent), FrameItem::Text(item)); frame @@ -273,8 +276,9 @@ pub struct FrameFragment { } impl FrameFragment { - pub fn new(ctx: &MathContext, frame: Frame) -> Self { + pub fn new(ctx: &MathContext, mut frame: Frame) -> Self { let base_ascent = frame.ascent(); + frame.meta(ctx.styles(), false); Self { frame, font_size: ctx.size, diff --git a/library/src/math/mod.rs b/library/src/math/mod.rs index 97e5548ee..9c8a9cdf3 100644 --- a/library/src/math/mod.rs +++ b/library/src/math/mod.rs @@ -344,9 +344,18 @@ impl LayoutMath for EquationElem { impl LayoutMath for Content { fn layout_math(&self, ctx: &mut MathContext) -> SourceResult<()> { + // Directly layout the body of nested equations instead of handling it + // like a normal equation so that things like this work: + // ``` + // #let my = $pi$ + // $ my r^2 $ + // ``` + if let Some(elem) = self.to::() { + return elem.layout_math(ctx); + } + if let Some(realized) = ctx.realize(self)? { - realized.layout_math(ctx)?; - return Ok(()); + return realized.layout_math(ctx); } if let Some(children) = self.to_sequence() { diff --git a/library/src/math/stretch.rs b/library/src/math/stretch.rs index 226f3f4e7..bb454022b 100644 --- a/library/src/math/stretch.rs +++ b/library/src/math/stretch.rs @@ -162,6 +162,7 @@ fn assemble( let mut frame = Frame::new(size); let mut offset = Abs::zero(); frame.set_baseline(baseline); + frame.meta_iter(base.meta); for (fragment, advance) in selected { let pos = if horizontal { diff --git a/src/doc.rs b/src/doc.rs index 4f0428fb7..b7b1eacdb 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -273,13 +273,18 @@ impl Frame { /// Attach the metadata from this style chain to the frame. pub fn meta(&mut self, styles: StyleChain, force: bool) { if force || !self.is_empty() { - for meta in MetaElem::data_in(styles) { - if matches!(meta, Meta::Hide) { - self.clear(); - break; - } - self.prepend(Point::zero(), FrameItem::Meta(meta, self.size)); + self.meta_iter(MetaElem::data_in(styles)); + } + } + + /// Attach metadata from an iterator. + pub fn meta_iter(&mut self, iter: impl IntoIterator) { + for meta in iter { + if matches!(meta, Meta::Hide) { + self.clear(); + break; } + self.prepend(Point::zero(), FrameItem::Meta(meta, self.size)); } } diff --git a/tests/ref/bugs/math-realize.png b/tests/ref/bugs/math-realize.png new file mode 100644 index 0000000000000000000000000000000000000000..d68fb923f836366133790dfb73d47de1cfefb46d GIT binary patch literal 6335 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 f1) +#show math.vec: [nope] + +$ pi a $ +$ my a $ +$ 1 + sqrt(x/2) + sqrt(#hide($x/2$)) $ +$ a x #link("url", $+ b$) $ +$ f f1 f2 $ +$ vec(1,2) * 2 $