From 578ba640f3666b5dc309ec0a03d6f6d5f2ae14a2 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 27 Nov 2024 11:16:25 +0000 Subject: [PATCH] Fix weak spacing being ignored unconditionally in `math.lr` (#5477) --- crates/typst-layout/src/math/lr.rs | 14 +++++++++++--- tests/ref/math-lr-weak-spacing.png | Bin 647 -> 1171 bytes tests/suite/math/delimited.typ | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/typst-layout/src/math/lr.rs b/crates/typst-layout/src/math/lr.rs index d195e67d..01a7f4cc 100644 --- a/crates/typst-layout/src/math/lr.rs +++ b/crates/typst-layout/src/math/lr.rs @@ -62,7 +62,7 @@ pub fn layout_lr( } // Handle MathFragment::Variant fragments that should be scaled up. - for fragment in inner_fragments { + for fragment in inner_fragments.iter_mut() { if let MathFragment::Variant(ref mut variant) = fragment { if variant.mid_stretched == Some(false) { variant.mid_stretched = Some(true); @@ -74,10 +74,18 @@ pub fn layout_lr( // Remove weak SpacingFragment immediately after the opening or immediately // before the closing. let mut index = 0; + let opening_exists = inner_fragments + .first() + .is_some_and(|f| f.class() == MathClass::Opening); + let closing_exists = inner_fragments + .last() + .is_some_and(|f| f.class() == MathClass::Closing); fragments.retain(|fragment| { + let discard = (index == start_idx + 1 && opening_exists + || index + 2 == end_idx && closing_exists) + && matches!(fragment, MathFragment::Spacing(_, true)); index += 1; - (index != start_idx + 2 && index + 1 != end_idx) - || !matches!(fragment, MathFragment::Spacing(_, true)) + !discard }); ctx.extend(fragments); diff --git a/tests/ref/math-lr-weak-spacing.png b/tests/ref/math-lr-weak-spacing.png index 871aaa2ebaae745a58eca5693ff7251a5ebee37c..2478ca2a3dd281a756ea9580786b9c360109eb81 100644 GIT binary patch delta 1164 zcmV;71atd`1(OMo7k@nn00000Lz?o@000D9Nkl?r9Kdnxg(w$eJa|we z2RWFi2RAgLMN}BnMhIg~R0K*DgrG7OI22@Q43#cmm7&lAb||PoTR_X!lukEVrh6yd z3vGpNQ@hR5ng2}ZEB(KJXa<_L{|t$V`F}3&<(HRylXrM|Gk^Gx%+SJGSPN_6`xw^k zBv_qqeXw!NTK$6g@7UR?n^t%;!CO7E9GUyn+exrlO}N1ilt>`8ju4=;8HOv7l{=6P zwICGu0bI|_aiI7?UD)$zl0nIg_>|j_UbHrk>J{MI^06pvCF1%WUY(0JBjLp z+#^>Gw{t5RXpYU82U)3k2b|<6!6gr02lZhiTaC2sf)ypKu}EjTLal`eIxj>(S5d+0 z+(vopdR6kjh@~Sr;r9W$qmlJLIoGE?oVPc1`8MkJ!haJ!zO%r&cu*_=z63}-i`ZJi z;7uU11#lV=3T8E_4%?F<;|m5hfbItCu5~qTxLWfM4FK({fR#QPx)DdtqY3$};hMcxgXE^-2TN3~zK2tkFd;EE%JF>8X$qE6$D6 z3MVBHEGgf7M-e0>X&(VCtcA6(7QS!c-W}Nlr+>~ou50>XYqE#nY=2<=ncFfC$A&+& zOhwqll0!|68bs&|buqdLut`HM zFn<8Jo5#Xkew$Yrz}lJROkl`4W!T7UJ4h=onez+eI_}mI#?M)khdoDNX@5Q#caDYeEx?BGO)Z$yfLotngV<)!RgHzY z9D@xaQ7p^nZin`vZ`;*S2bNGz64;g7kakf`TEe-k_uQO z!NnLUVq1NDl<9O2tVGzC#yu?iE9ahIvT$p02RDlgJusNvoY_%bUtbDsmw?f5fPY<3 z+)-u)VgOpsTmN$B^j~QMM4! z%jE$aR%B*m-eLmT>Hz3m=0@-tRE2}&482%&TV?Ja+aG_H>4$Zh1n1EFacSB|KnrVO eE&Trq{|ld1Y-_4G?v?-m002ovP6b4+LSTYp;vQT8 delta 635 zcmV->0)+jO35Nxc7k?uN00000dPb2t0006`Nkl6ZaK>txuG>_ zYin+E@9=pZgeM60v>=G*b@_hzeh%;JH;#WKP7SMJHLQmJVt-guNUWxJAIMvjeIzMy zua`niRN(?*m$}T0Ake<23JR2jtr4I<2*HUT$V`ueXBdI`JA!X^M8*h!fBiaXfXm9l z^J^V2`2?8Jm}I*<=MdQSbia2EJWJ5o&yHa}}JBbZ3O=;Q1cFf_cl>EN>#7%%DE3Hti( z8XwQ4V9Lr5e-f_dd^M9rklxQJQ?SdKF!BnKCIrX9*=x)+*o3QpdoZ#I)0D3K?i?;H z0{7}|VddfO%KEemj8(#_FlS8g;3`OxfRg|fU5HoHL4Vix zE*CT($$9Ox<@Q;=Vg+y<12V!`UCFaO5dvA@-T_+}@NLBamQqB;Z72=ToG!tyJvv4{ zd@8$_cCNpyx<-#T0YG01)Q{4xD{VHwa5M0vWLR`jM+ZFpy0QVH#!25TNY=Ob1N`!}X6(rjK6A3uUGFRE}=Ik5`9>{-$ae*(tO V%+W6@xoZFb002ovPDHLkV1jaTCg1=7 diff --git a/tests/suite/math/delimited.typ b/tests/suite/math/delimited.typ index fc00333d..22674050 100644 --- a/tests/suite/math/delimited.typ +++ b/tests/suite/math/delimited.typ @@ -87,6 +87,7 @@ $ 1/(2 y (x) (2(3)) $ // Test ignoring weak spacing immediately after the opening // and immediately before the closing. $ [#h(1em, weak: true)A(dif x, f(x) dif x)sum#h(1em, weak: true)] $ +$ lr(\[#h(1em, weak: true)lr(A dif x, f(x) dif x\))sum#h(1em, weak:true)a) $ --- math-lr-nested --- // Test nested lr calls.