From 3a6d5fd6b21c85fa100d7fc1e7508ee4b484d99c Mon Sep 17 00:00:00 2001 From: Malo <57839069+MDLC01@users.noreply.github.com> Date: Wed, 11 Jun 2025 09:29:38 +0100 Subject: [PATCH] Do not force `math.mid` elements to have the Large math class (#5980) --- crates/typst-layout/src/math/lr.rs | 45 ++++++++++-------- tests/ref/math-lr-mid-class.png | Bin 0 -> 556 bytes .../ref/math-lr-mid-size-nested-equation.png | Bin 900 -> 920 bytes tests/ref/math-lr-mid-size.png | Bin 2210 -> 2251 bytes tests/ref/math-lr-mid.png | Bin 1399 -> 1413 bytes tests/suite/math/delimited.typ | 8 ++++ 6 files changed, 34 insertions(+), 19 deletions(-) create mode 100644 tests/ref/math-lr-mid-class.png diff --git a/crates/typst-layout/src/math/lr.rs b/crates/typst-layout/src/math/lr.rs index e0caf417..a3b5cb05 100644 --- a/crates/typst-layout/src/math/lr.rs +++ b/crates/typst-layout/src/math/lr.rs @@ -45,12 +45,12 @@ pub fn layout_lr( // Scale up fragments at both ends. match inner_fragments { - [one] => scale(ctx, one, relative_to, height, None), + [one] => scale_if_delimiter(ctx, one, relative_to, height, None), [first, .., last] => { - scale(ctx, first, relative_to, height, Some(MathClass::Opening)); - scale(ctx, last, relative_to, height, Some(MathClass::Closing)); + scale_if_delimiter(ctx, first, relative_to, height, Some(MathClass::Opening)); + scale_if_delimiter(ctx, last, relative_to, height, Some(MathClass::Closing)); } - _ => {} + [] => {} } // Handle MathFragment::Glyph fragments that should be scaled up. @@ -58,7 +58,7 @@ pub fn layout_lr( if let MathFragment::Glyph(ref mut glyph) = fragment { if glyph.mid_stretched == Some(false) { glyph.mid_stretched = Some(true); - scale(ctx, fragment, relative_to, height, Some(MathClass::Large)); + scale(ctx, fragment, relative_to, height); } } } @@ -97,7 +97,7 @@ pub fn layout_mid( for fragment in &mut fragments { if let MathFragment::Glyph(ref mut glyph) = fragment { glyph.mid_stretched = Some(false); - glyph.class = MathClass::Fence; + glyph.class = MathClass::Relation; } } @@ -105,8 +105,12 @@ pub fn layout_mid( Ok(()) } -/// Scale a math fragment to a height. -fn scale( +/// Scales a math fragment to a height if it has the class Opening, Closing, or +/// Fence. +/// +/// In case `apply` is `Some(class)`, `class` will be applied to the fragment if +/// it is a delimiter, in a way that cannot be overridden by the user. +fn scale_if_delimiter( ctx: &mut MathContext, fragment: &mut MathFragment, relative_to: Abs, @@ -117,20 +121,23 @@ fn scale( fragment.class(), MathClass::Opening | MathClass::Closing | MathClass::Fence ) { - // This unwrap doesn't really matter. If it is None, then the fragment - // won't be stretchable anyways. - let short_fall = DELIM_SHORT_FALL.at(fragment.font_size().unwrap_or_default()); - stretch_fragment( - ctx, - fragment, - Some(Axis::Y), - Some(relative_to), - height, - short_fall, - ); + scale(ctx, fragment, relative_to, height); if let Some(class) = apply { fragment.set_class(class); } } } + +/// Scales a math fragment to a height. +fn scale( + ctx: &mut MathContext, + fragment: &mut MathFragment, + relative_to: Abs, + height: Rel, +) { + // This unwrap doesn't really matter. If it is None, then the fragment + // won't be stretchable anyways. + let short_fall = DELIM_SHORT_FALL.at(fragment.font_size().unwrap_or_default()); + stretch_fragment(ctx, fragment, Some(Axis::Y), Some(relative_to), height, short_fall); +} diff --git a/tests/ref/math-lr-mid-class.png b/tests/ref/math-lr-mid-class.png new file mode 100644 index 0000000000000000000000000000000000000000..6487578d7f8c0ed60584daba0e5d3663d33a7101 GIT binary patch literal 556 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 a?fw802}+pvYLNT@00008KBqz diff --git a/tests/ref/math-lr-mid-size.png b/tests/ref/math-lr-mid-size.png index 12b4c0868d133a99f8973511888564a83dafb329..07d3372252ccfd396fcb913026ac4ae8d541716d 100644 GIT binary patch literal 2251 zcmV;+2sHPJP)q)GK zlJe7>;7+UsWN`Yw?Jfa|+`yYpW-t`g<-4iwyK$ZxSzKI%IKOHKU)}SesH3Ny-PT#T zvbaTM;*4nkUuX6}QF9xIfE#O7hFfz1jCvw#A?XHS%lr}mWBBcd!d1CJ8E#w)7){a2 zoPWbZB+jnmz*z;mi=+Kya97L3F#`a4+hD766ab_(fvSBDNM?In$aZmpk~nZ%v+XWk z9?8a?`hx5t@pjeZ!B(2cF#o|qmk9t8GUu%yWyg-6mkO1~y zEBpMmVP;T&txEnw{P#_O{hW)928qT!e}@=mo9%Gy^Rs5+;c==payVp_VXy}+WP3)E zO|AzQE;In7Amuo$S4(gl<-HGf6Wf^QulP4v;ho#caWk5g;lhuBUHh?GNV*Erga_gn zL(8EUXPyLQxR0u!q}~}k?+_kYOx#zy09(IqgYyJ;C@Sp`5AOIz2JU3$`VQDCoeZb_ zZ)4h7DClUO?*kqjcI-Ae;It{lu$AS-b63x0KuLAyD!_$9O&KJ`fy$cddgFKDTsRl* z;c)k!Al#+JQ_IU$Mg%nQrgARo_{Q*GxI*pqbC4-A<1pacF!o7BZjZ3HoR-{w7yceJhX9?OX zK(!-}!i_3p<8u6qP`W$JEW!2tu$zhd+CLwadqRv-+)*zEPU%Cq<>vw$2U`+c!K)xR zj)(Bd@JE2t%mD*e=)-!?Rjnk$gPTz8MFakaY7^1)f5;E5sQP9NL`UfjXxz2I%Z7x_wXSA3^2aOi@q5MOsVsSDf< z7@!1a(dh(8s{oZzr+0mhaN%4y7mf#a7n06_D(ghtW5tzilKTXvP3^DB@c>`iw0`g= zq~GDg^?lGMhg%kQ9#{^(mW5`5x5%Vre7L|$$l$JS1-Nl}+rXcj04|(q3FL78=?ZY$ zGQeH+pTUPqI3bIh(xw16xg8EQ*JH2--QZmf2DF<_JIBrJmc!{sgCD1V5e^xSL6W8# zu(ebp-WaDi>mO5iVq}mR*JAj2d-vR&@ z^6etl3|qT)0MLI9N&Q>Nc6!<2>PLbPm$?R{9`_(S+}nu^T=$paoE~AKaWj(~Ub!=( z$%egbhl`)fi95U>r0DqdG*0+w6$2M>3jkVEe|L|SG>_TiPQ|6h`Z5+_X~)aqD9C&7g5-rhtL-0e~C+ zG1Jotj{2BK;})95p9IH@siknj@Cs$P)K=VoiN*zZvv8{bSWf^uBPpD}k0WleLHuG0 ze2_=sYJOtj#2q{c05P-rk@d`V3in493m0@3jUUFLYl&Bv6gMx%5x4Ohpv1iZ4enb9 zq_`wEaN?5J0YGO5(A}k@aHDRqa1DttcJ;#4(P5F|MpioF;^P5*rxAUf?U3SjY~jU~ zzbEq$Zv6#VIK=nEmIT-GEF5t?+rfMYd#3Q>j1y#Vm*%r^)^ZG1CXmhY5GN%O()OB| zxEGpvad^wb#vR_r#IXwv1f%9S7OrOuxN+gBY~1o|3UJHv!RniO3|87kHfOas+D#$O zaXrh}xQS*3xQP~U7o4cz9b!#43)i>={J4gt;Lk&+0N1+95qDV~RKktRK6RiJoC&KM z0-ykg^QjKFcJ)P&`gI?{Np0$j;4VdNP=rGcBt?TN%4g#f^u{l^K1aB4E}RSJ!hJ7s Z{|D_?Q&$9>BS-)M002ovPDHLkV1jDIT)F@N literal 2210 zcmV;T2wnGyP)|+tn{Cr>x-Gk1*X}l1H)^t^yU|)TsO!B}MX}XVHLkZ6uL>0p1S_Z@g&u>7 z24qAIp%qb(Dj-V1N>xljF1h4Tkh8$xAlEQ6?{Aamo$x-x`;7Cvu!%OE?;rC_qW<#9 z9B+IHFW`CX1)IvIvZ-t;o9h3ldRPppSkN`(Ju8*3M-QZqpug1bA$;Z92fnT+gTIz< z>z=Mse*!R7g?`R@Ab1zJs@vhx4DQw@1wUQ2AkBhma~^qnM}ezD$>6X4Lu>Eg%pWYM z>;(X5`U|*nXa|4luLi5CoDBu4C;tSi+hLH(HNe!$ECBH-gHT26Qld&*0Y+Cgfa>%U zm>NNz`5)&{83i-dx@fjapWGmxyc)vjR&o%IwwIal{gk+A5^kbHL35`P^vq_z*6l>C&$gg zH_TLHlE_iJ$dbyiH3g*P+L%vimCss;kKZXJ zXS6DObSb5}YX`BGu@!8U&Ly3kr}|JbjaH4wgjn&icG+vC3kUXxP^!tXA8sB$n?pFz~Rxm$T z?is+%aakyJaOss)t{xyga)KolrsP3P03=oB7>IQ+zJpRGRrxT0{T*aoMWc}p-Ns2F_lW8O8*ZiQQ7x_UB*dB-O-c7Hxi`y3s9)a`B;gn(Gd!AsskNc z<#?5$@=t-Onvt+tlp6f$W`jd@Vuwt%l zQ}x+{Q*~hv%xlZ<0F|--$!GxO#Y0iuT*|9*i-&pl_9cTV6sGPj1dy=kH%oQNTYmTW_B{Zo{K%^6 zi`_$3Ij6EzJv|th?hOF|j2%{0s}hE+vhR?o*yTAvR{b$E)iIF9wvgkewS!h^CWBLT zG6=FNlbS)*B|g3jQu@_Ft1kQUs#ceSukXD;r(AWfcUu*o>LwODoRg0Yv^BfGQQRV;CvCNPLzQZblGfl!Vi3^_jIC1*Z3$?B{t#lD0*Oe1WUCJ zKtmERyFgMIUMZKU>Iwf_Egp`iN5>>`ssaN6Abe&ouD)`c8n7#7sWt+4CKaP%`~gG1 zs@M)Pm0>m@9G_>zxj*Jgqq>*sIaTM$Yu(xcXxg;WzymvhrMggoj@DjuwYH#N6+2(9 z!hZm?v;eJbPo&YjzkyR#w1{~Xy*Ljn71Z+Qdk!&FhZ-28k;{2iJ?}78z6aSV%_H=e z57PW=0HF1*2UYVi#^}zYyedrUW2u&=GgRzGbbwJrvwZZu9B$Q-M3(C99$r^Em83Q_AMH@>TEE#$}I<+g`QEMYT7?gbu52l z2d8RV+dA;&U$M4VfeM!s2dHx6b0OBHU5Tfb_Duu$x)omxB`Rbk diff --git a/tests/ref/math-lr-mid.png b/tests/ref/math-lr-mid.png index 42e6da706870bde9c0fa6c7454cf3ab6ff39d929..8af85b0058ecbde7483008a07f04139b8634bd9c 100644 GIT binary patch delta 1394 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 m&^yuKJ(zo8FYJZ?$MD~3^$@tyv`IDq0000