From b2d6cb58dcffbe297fecf07c2e8d8db5a0340c05 Mon Sep 17 00:00:00 2001 From: sitandr <60141933+sitandr@users.noreply.github.com> Date: Sat, 26 Aug 2023 18:36:52 +0300 Subject: [PATCH] Fix weak spacing broken in math (#1966) --- crates/typst-library/src/math/mod.rs | 9 +++++---- crates/typst/src/model/content.rs | 15 ++++++++++++++- tests/ref/math/spacing.png | Bin 18848 -> 21090 bytes tests/typ/math/spacing.typ | 7 +++++++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/crates/typst-library/src/math/mod.rs b/crates/typst-library/src/math/mod.rs index 1f87ff81d..40df524fb 100644 --- a/crates/typst-library/src/math/mod.rs +++ b/crates/typst-library/src/math/mod.rs @@ -418,11 +418,12 @@ impl LayoutMath for Content { return realized.layout_math(ctx); } - if let Some(children) = self.to_sequence() { + if self.is_sequence() { let mut bb = BehavedBuilder::new(); - for child in children { - bb.push(child.clone(), StyleChain::default()); - } + self.sequence_recursive_for_each(&mut |child: &Content| { + bb.push(child.clone(), StyleChain::default()) + }); + for (child, _) in bb.finish().0.iter() { child.layout_math(ctx)?; } diff --git a/crates/typst/src/model/content.rs b/crates/typst/src/model/content.rs index 0c79d02ca..f1600f251 100644 --- a/crates/typst/src/model/content.rs +++ b/crates/typst/src/model/content.rs @@ -85,12 +85,25 @@ impl Content { /// Access the children if this is a sequence. pub fn to_sequence(&self) -> Option> { - if !self.is::() { + if !self.is_sequence() { return None; } Some(self.attrs.iter().filter_map(Attr::child)) } + pub fn is_sequence(&self) -> bool { + self.is::() + } + + /// Also auto expands sequence of sequences into flat sequence + pub fn sequence_recursive_for_each(&self, f: &mut impl FnMut(&Self)) { + if let Some(childs) = self.to_sequence() { + childs.for_each(|c| c.sequence_recursive_for_each(f)); + } else { + f(self); + } + } + /// Access the child and styles. pub fn to_styled(&self) -> Option<(&Content, &Styles)> { if !self.is::() { diff --git a/tests/ref/math/spacing.png b/tests/ref/math/spacing.png index 0430060bbd9192d75c029eab3e98bc1c4cd2949d..c9522b368f820da79f825ef2ceb5e1bcd16263e3 100644 GIT binary patch delta 3614 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 VTl0+F|NR0r)t;-CJ|VGq`(Jcv_Iv;U delta 1354 zcmV-Q1-1I(qyeCl0gx9CI0yg$003b1p9BB^NoTPoS44l(&b`M}RR;hZKRYO-v@*>U z@d-;4&7=Y9bjozjfaYVUlnW)jTCypoT%DwXWoG$+MDmU31=BP&9uZ2Z2`LgP>3H}8 znV6a&uY2Qh;oEkm+y`9Jb#|Ax^ZDoZ$2mLa?7N+vo$dGg(X6X$$hoQNwp!*63CY~D z3d?FIO*wzNbhs0(h#sTENL}!V#I%t*qn4jd$S(e5%pD-q`?$K-n!_GQE!8vT`mJxJ z<;VSnbk$GluGitNS7O-g2@C!J;Eb?%-ol`9r82dg=w6Gi<3t`S{jEuRwt*I^e$~?K zvJe94Vu|IJryb+L?R6|0KdheG=L2{oqw`D6Iyry1=V9PILJRL_8Cvdpxdxc$4e3HI z^b0@_z{c5)RQ6rovL)LD6*RP81=OD{=Sm5Zy<*Qx5ZXs8OUpw-3e?zd!kn(spawJ1 z?aJVca14obPC|e*G$7Hs`T^<_Sd<{7K~?*$v?|Sgc`=Xd64D`Mc&(wO({z9z#1zy* z6?lKYYP^q@+M%dr%XsNooj$}=jNl982y10&Iph^RqzV@>(>TD{pkFDbrn>`Q3#S0s zFP+oHQ5xnWi58Axpz<*A%t7MTy%AD`JX%-c+`R%Mqa1_h%v@VRbIV)eLV$~6I6K4w z=sy=D(PA6`rKuN;Tjm2jRG8W?d<5JUeB^&KpPm9(ka zZWa*QjmPvit{aIQq^Sc*L&rd~?|7cL0N}hBN~6ov{HTE?NU~fH0o%nd0LX9&Gj3T3 z^q7OG)522VPr*ZumRE&Hz;iMho<^q_D0c|LVoTrN05oFBRUr!Sm`)r>&Utw@dqaQp zFNfxqs}0wZTIwCA0UQzIDO{AgE?Enb1o10it(b_Ud)hy?tnHuziiCINXsLIMflRwE z>-{m4ea0XQGsB}`Mdw?VTdwH^a3c_jr5k668|(aONj(cABNqW|*$+UD@C$s}MGL&+ zR!hd{YMR~m2k_}z13-bjH1gtVKqG$?08ZvD2^tKf2q|*3B*M2UNi{TbZExmce)KOX6jN(elT zK4|>q;;;di;V(Bk`xl(2Wg=O#`kp?j(; z{+qcwcn-3(BzegE;86L7n2W%U)`&-Q>-;Oy*zI$(ca4|?`jH=S8P|oHQ|IZZ{vv_ z9<(8|Fy3db4s%7_AbO}?Y5C-I$JRycETR=7GSWQqc@|qHgk|yHQn}|qCC_Bb0*90Q zTgse4B$uA6#ky*$ZMEg*(KKL9$GWL(wWYuN^596UX=t3Sw(J^%u3djQ*7MM=$VOXU zvDc9=#1&cmCE+ExyNnO#WJj^#1WFZJW$r8$iel_!(oS%wNkPuSf)O&tUGIs@;@#UrKNn7 zmhw?r%13D_AEl*yl$I{?QCiAJX(=D2rR@_G3WY+UP$(1%h2nqaZ_NcoER0p6{Qv*} M07*qoM6N<$g21Po&;S4c diff --git a/tests/typ/math/spacing.typ b/tests/typ/math/spacing.typ index 87bfb0028..9b64d92d2 100644 --- a/tests/typ/math/spacing.typ +++ b/tests/typ/math/spacing.typ @@ -39,3 +39,10 @@ $a cancel(equiv) b overline(+) c arrow(-) d hat(=>) e cancel(log) 5 dot(op("ln") $a overbrace(equiv) b underline(+) c grave(-) d underbracket(=>) e circle(log) 5 caron(op("ln")) 6$ \ \ $a attach(equiv, tl: a, tr: b) b attach(limits(+), t: a, b: b) c tilde(-) d breve(=>) e attach(limits(log), t: a, b: b) 5 attach(op("ln"), tr: a, bl: b) 6$ +--- +// Test weak spacing +$integral f(x) dif x$, +// Not weak +$integral f(x) thin dif x$, +// Both are weak, collide +$integral f(x) #h(0.166em, weak: true)dif x$