From c3334a55fe53253b55943a4b713bff532e876d95 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 20 Dec 2024 10:15:18 +0000 Subject: [PATCH] Fix arbitrarily nested equations in the base of `math.attach` (#5613) --- crates/typst-layout/src/math/attach.rs | 2 +- crates/typst-library/src/math/attach.rs | 2 +- tests/ref/math-attach-nested-base.png | Bin 1047 -> 1377 bytes tests/ref/math-attach-nested-deep-base.png | Bin 0 -> 185 bytes .../math-stretch-attach-nested-equation.png | Bin 180 -> 415 bytes tests/suite/math/attach.typ | 15 ++++++++++++++- tests/suite/math/stretch.typ | 8 ++++++++ 7 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 tests/ref/math-attach-nested-deep-base.png diff --git a/crates/typst-layout/src/math/attach.rs b/crates/typst-layout/src/math/attach.rs index 0f9090f77..cda033159 100644 --- a/crates/typst-layout/src/math/attach.rs +++ b/crates/typst-layout/src/math/attach.rs @@ -161,7 +161,7 @@ fn stretch_size( ) -> Option>> { // Extract from an EquationElem. let mut base = elem.base(); - if let Some(equation) = base.to_packed::() { + while let Some(equation) = base.to_packed::() { base = equation.body(); } diff --git a/crates/typst-library/src/math/attach.rs b/crates/typst-library/src/math/attach.rs index 74eabd101..f3c7ea99f 100644 --- a/crates/typst-library/src/math/attach.rs +++ b/crates/typst-library/src/math/attach.rs @@ -48,7 +48,7 @@ impl Packed { pub fn merge_base(&self) -> Option { // Extract from an EquationElem. let mut base = self.base(); - if let Some(equation) = base.to_packed::() { + while let Some(equation) = base.to_packed::() { base = equation.body(); } diff --git a/tests/ref/math-attach-nested-base.png b/tests/ref/math-attach-nested-base.png index 54c62387290fbba8d8ca5ea4e07936c1c1f2ecfe..4b8126e74d1fbf3263e69374a5aca571f101af9e 100644 GIT binary patch delta 1371 zcmV-h1*H0y2;mBl7k_UE000000^D0I000FjNkl2L-wJ`khHhY-#(jwx`|0`93yHKKcK1&j0^A3kXpQM1NR>MOcJG3fIfy#zO)Z zbD}XMFr#sV1U6sDipzhd$%yJ`krJ}5MXwKEcZ=%Xpb-n0c)Gw z;9U#T)UT_TWkoMKgn>I*g21P6ZeUF((;t2?fupG%ljr-Bs)T^^PS@g;q4y=Uy|V@8 zMGgDp?3S}s*QGU3+o3c&|~ZJ4H+ z-?en+8hR`g-149Xr)u*rfbs})4XmETx-l5H)7rXGG=CqLDPC80D{0f)(NMZ02=GkU zWIX30-t-qOJ$r%x6T#j|T#}bAR|f%pSW*rEH3{iB>OR^O)G70+H8jKCeR;AyBybIh zEumR)-H)MJF(&bAQG`WUghlv&3U}EnWVKS9>|I?RE+AO??56xMvPwNi}Jh3!# zr+6)jum}gHw%>%x9D%1&>>CWYr;TZanWVu0 zz<=z-Q?J-Kjfc`&F>U-IE|BnO3C`u$TLBi$NK7oM$NmLX>=g>g73v55DD2hum@8xoxIT?89Ad)dbFA4iE7jEF8f&0zkwJ5?O94vUI>{4Aw;5N-rl<%fqu)!nzd|kxV0Km8Vy~7d@u!Yk-T&Pa^zurti9ZF@i zQrQ4dnXj#02P>rb2v<&jtBdVJ7C8>!y4CrtWdpVYcgC-qGqYW`+H~(pLf0`y77ti` zgsI)dNU8i~W`jFS@-;f-a$U-xos+FDFvjf~?knmVGw~5_CAr*f`z-*_!&H~kII6BP z0zlu~U-VOJ{X45KHXj(mbJk;BTXCca-(QGxZ8u9U`v)^-2XAsWb4?kIR$Q`9i1)Dw di?9d_-M{fz#69&=qSgQa002ovPDHLkV1gtDnwJ0o delta 1039 zcmV+q1n~Re3YQ3w7k^v`00000fHE#F000BtNklE}P`W!`jkKXd=VCgGiStgs-@APJroVZ=H?ts8%#vUUmVaOg78P#N$j3#2t8lDE z6d0p&hysr&M~p(kBkI7SI9_J^v+!%RLco@Uuv2C()C&M(KcK!l9X6m#=HUaT+QQ%i zvlXqsqe-nynx6qX?kIVIPcgRrn|k0}yl5h@o!sX*XDz7X1HN}!7rM1uz5<=|5)hO> zqSFdK;PkPypMPOV#q4rkTjuC{;FvoN;jwl87arlJoYu84mfP8W(!v!!{@~>keR}}* z(9bF44gRqPWw-jl9?obxZ!iviiYqqYIor!Z@974AuVSijwqx~H*~i-i~5}40W%$K6LiY_;1_4ud#Nd;MS<&) zZxE;Ah7;mc43G4+D8Uje!4mwB!rdu9#etFH6AJd4+2N0T!$UXNVS;n`X;EpF*&7DG z&%IaT7=P$FT)~6~Pdz+~Ph7y}^+5FXz{X9Iie!@P1typJu|XLuS4EOLNYVgcZ6Eet z>*E40Is-(tKwtX=04S<0pQ2pAi#Q-gg+L5Y)Demr2W(M5)@ckqyiG?6>o22i{nLwx{Fs>Mkz;#-pYaVBht4I1@E>k-})zQh)6Y)}u%n35C(4?Xpy2CJd{ld5rYR zpu2+CcRC|K)e{*=4J;?Y47PMKo~Xy~((59Jar4>zzxuLKxPjhGaeB2)VHE|QSRKD# zx)vo^g1L##2ScL3<7KXm9Kh~Ztm$F3nKf^50-oVS4&Zk()^riQ-OiGx(mDWF!5{}P z*nivK55zjz@`?_4VvozYgh#6x>53-*)IvEE_L@wQRZMFtCxP!Xj6V7S$?QFMnylDXgE-S_EzJ`Iir>;ohn%%&v8^E8! z+_^;dHiGB|Ov`}iV!+}9fFgp}KoB~>w|~Hk)N~&g4dhBG5aobUAJ3>*F9$XmakJ+n z9a`~l43Jd;F5qwZT2)dx-e4mGrq60CD% JPDHLkV1m+<>K6b2 diff --git a/tests/ref/math-attach-nested-deep-base.png b/tests/ref/math-attach-nested-deep-base.png new file mode 100644 index 0000000000000000000000000000000000000000..e745e6b670399387dbac3553b101310a83ee8638 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^6+kS_0VEhE<%|3RQVpIijv*Ddl7HAcG$dYm6xi*q zyKLrB`Ro5>B)a3p_Q)+*uujfV?0sZa*~#tK4R629{W#UT`?Z+;-!E?r_v-%pzW;~L zgk3-8-V?k3C-d+38~=ayAC9|l^U=APqS}4`_J6eh`tiV$SC3D#saeZr#T2DF=-k^? k@bLV_TbUrc+NT_4nDMA*T03{$5|EobUHx3vIVCg!0M(yYD*ylh literal 0 HcmV?d00001 diff --git a/tests/ref/math-stretch-attach-nested-equation.png b/tests/ref/math-stretch-attach-nested-equation.png index 5ab4fbb513e92a82dc7da92e39c063021f64319f..3ddb0d00d69449001585066081e31e4d522a8888 100644 GIT binary patch delta 290 zcmV+-0p0$z0iOeq7Y;E900000G*~jK0004IktK6~BhTXP4+hBMgZogWcEA|hXl(JJ zeK!v8d0w}F``^{`&;I|vsp$F1^QTvCnsPSiFs&`F_&@1s&i~4XbL)WIhqL}Co}c}{ zuUeDo~5nDM-Klw^7Q4}3+r|-n6(th zKl=WE=kbplA8tGM@-&^Y)9tN?kBo?XeD&P1)5lJnI(p{Nxg#j>__ksI$e}8j2$HJ>FVdQ&MBb@ E0CYDFF#rGn diff --git a/tests/suite/math/attach.typ b/tests/suite/math/attach.typ index 56fa47c58..cedc3a4ab 100644 --- a/tests/suite/math/attach.typ +++ b/tests/suite/math/attach.typ @@ -167,9 +167,22 @@ $ attach(a^b, b: c) quad #let a0 = math.attach(math.alpha, b: [0]) #let a1 = $alpha^1$ +#let a2 = $attach(a1, bl: 3)$ $ a0 + a1 + a0_2 \ - a1_2 + a0^2 + a1^2 $ + a1_2 + a0^2 + a1^2 \ + a2 + a2_2 + a2^2 $ + +--- math-attach-nested-deep-base --- +// Test attachments when the base has attachments and is nested arbitrarily +// deep. +#{ + let var = $x^1$ + for i in range(24) { + var = $var$ + } + $var_2$ +} --- math-attach-scripts-extended-shapes --- // Test script attachments positioning if the base is an extended shape (or a diff --git a/tests/suite/math/stretch.typ b/tests/suite/math/stretch.typ index 6bf13e255..1377f4d21 100644 --- a/tests/suite/math/stretch.typ +++ b/tests/suite/math/stretch.typ @@ -83,3 +83,11 @@ $ stretch(base, size: #50%) $ // Test stretching with attachments when nested in an equation. #let body = $stretch(=)$ $ body^"text" $ + +#{ + let body = $stretch(=)$ + for i in range(24) { + body = $body$ + } + $body^"long text"$ +}