From d221a89a40ba504408468d8f427ce8933e332a6f Mon Sep 17 00:00:00 2001 From: Leedehai <18319900+Leedehai@users.noreply.github.com> Date: Thu, 15 Aug 2024 16:08:40 -0400 Subject: [PATCH] Adjust the baseline of root radicand frame (#4736) --- crates/typst/src/math/root.rs | 16 ++++++++++++++-- crates/typst/src/math/row.rs | 2 +- tests/ref/math-root-large-body.png | Bin 1549 -> 1831 bytes tests/suite/math/root.typ | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/crates/typst/src/math/root.rs b/crates/typst/src/math/root.rs index 6a7604452..66707c59d 100644 --- a/crates/typst/src/math/root.rs +++ b/crates/typst/src/math/root.rs @@ -70,8 +70,20 @@ fn layout( let raise_factor = percent!(ctx, radical_degree_bottom_raise_percent); // Layout radicand. - let cramped = style_cramped(); - let radicand = ctx.layout_into_frame(radicand, styles.chain(&cramped))?; + let radicand = { + let cramped = style_cramped(); + let styles = styles.chain(&cramped); + let run = ctx.layout_into_run(radicand, styles)?; + let multiline = run.is_multiline(); + let mut radicand = run.into_fragment(ctx, styles).into_frame(); + if multiline { + // Align the frame center line with the math axis. + radicand.set_baseline( + radicand.height() / 2.0 + scaled!(ctx, styles, axis_height), + ); + } + radicand + }; // Layout root symbol. let target = radicand.height() + thickness + gap; diff --git a/crates/typst/src/math/row.rs b/crates/typst/src/math/row.rs index 60afe64e5..cafffdc51 100644 --- a/crates/typst/src/math/row.rs +++ b/crates/typst/src/math/row.rs @@ -353,7 +353,7 @@ impl MathRun { items } - fn is_multiline(&self) -> bool { + pub fn is_multiline(&self) -> bool { self.iter().any(|frag| matches!(frag, MathFragment::Linebreak)) } } diff --git a/tests/ref/math-root-large-body.png b/tests/ref/math-root-large-body.png index b8d9edfbdc956975e564aca682eba207c2ee27ab..2036364711b1ff8c9e5ec0b2bee9d1937d1de680 100644 GIT binary patch delta 1829 zcmV+=2io|J45to|7k_>T00000%2tXK000K=NkliF9c;59GNWA2~OLpNI@UX|@1Aw-Lg9+C-XbPtc!?ghTA%8By{_6D*wwjOH>d!hGR}oms zo5i}P;fX@-O6o8cUu-La01q$8T3g_s88%toE)!t6@g0UP3C_)at3(A{xolHZgb_vr zNQD2nCc^=1a8X!-R=g8s3n!#b?PI{Y7pxyi{ut5~m=@anw0++vH+SuJ4}LL5k% z!wqZF3>#TCr$DSZ2@GSJVHODb#DYm+ZhhKelEsM``T%^f=1P}pc%WB^O9D5SV1_n= zue-FgG^PgL&a&+8BB7uPm|AeP%mXzri(B*+NPma&qsb@OeatN2;Ga7%L+^pF{nDkj zhBrdhyTp27Xx>dot4kx?oItfYe)a zYN1eA`pew4wY8l3`?zJOel4iR%-_me(!H`DbkSvG0%^AwYT)G{aU0#B>-t81K7?|Q zgYHzO3^#7;o5eNevg#G)I{S@2aV|T4I)4vTf%2vG_*$5-XHA6?95){UgTzL<<#R)0 zMn*O0YTF>fH!6=sKo_xh;AIH?X;*@)o8HHl0NS!h69BN8g*dmPl`jUsk;S(?4!NxW zMq5cE0LHUOor&)fPCVVxF!IW97(mob0)XNDk4bR3g)amk6g78 z0M&+@=6b(Kj_OU*3Zo6|e4Oe9SEW_=#r2|lI zD@eiB(bQpfhd8&!`qD{IbuN_Q=zl;(AE@dA(+jTExl)I(KOt@PAae$Ej}Az4?Ik6( zpnBz?4EG*8c1*?b_TfQRK3Q|1%G@cKGJienyzvb!4heP;vK$g$1GCraGvWj`9b%IReDqze9-^qSwE|l6($bxk4)BqGZ^De{%br%mp4QvHp ztfDjor5aukpD=~Ptxza7FMlG!k;1C+YtKLtMS59)Y3*Gbpjd{O_tT8DL5hjsW4!M@gndNhOAS`xBp1%G=B?$B13IUyI( z5@s;np$-k;JDhVr?6R(tceac}ZJ>-f%dkjfvKTlmu1 zP1pv&Q%553z9w>s=YJN)w~aUgpu{QrpY%U_>Jr4}T81wcYKDpcVY-7RX)rea(<&@cvr;Umh48)?pp~Kf(V3%917T T6Geqk00000NkvXXu0mjfScr|; delta 1545 zcmV+k2KM=<4vh?u7k^m@00000(Eq=k000HlNkl^!>wge(34P%{Ttx1%R83kNk%10aoLrrRXArFCK?YPif#?l6V(rdFF$ zXJOZedv-H$gCP-H$7kUkJGTV^pr6Yg148iBam@il3!4+K0L}R#Jn3CeFLl6fp8zn( zabJDSaW)E17M#R7%))lN696o0Y+?7>+R{ zM+QGU2T$pQhUj5zskh{U!Xw)<_MaJ@AJ*o7UPNK3$sAR82+q#@tUv)=nRv)A!tlZe zgv0-|NwBNfz1bUrr971(I0yj>V7zk%A(%#CDG7G&$u)w37ydmqddT4s$B9oajvE2f zHSQ!pKYwqnU~A?$`sCucNAZ7)aX1dg;W+$1hlS~BSBF^NQo_j^O?F;B?eC?8dC&xq zmK<*07h_n>^I2!a%n@LyV+`|v+bQOb01GKGhe`P+%+n6C2F#UK#qeMsO^5)S3ouUy z$=Xv`SQt0$Lrwd^G@<`Vx+Fcj2EgV|Bojzy9Z&)%fg~Ip23z-D>G|Nv zz5}+>bO~S$R*4*2+ zy13iTovT0qX2Gwg$}TpG?42} zCz(6eHq$8BzA2_~(B6D&U`zpw6=c0PV9JJEX*wRH2c?6Mscbuifrs_ipad=^YoNT) z1G$C%fag@2)NT0?Itp~ v$w9clY;PC4I?(j>@!zZCa2$@qvFKlz+8dC#z8C@k0000