From f94708d202785922f9ffbc6b3beb50a5d636682b Mon Sep 17 00:00:00 2001 From: Eric Biedert Date: Thu, 28 Dec 2023 14:30:32 +0100 Subject: [PATCH] Make accent size adjustable (#3077) --- crates/typst/src/eval/call.rs | 9 ++++++--- crates/typst/src/math/accent.rs | 15 ++++++++++++--- tests/ref/math/accent.png | Bin 8128 -> 8869 bytes tests/typ/math/accent.typ | 4 ++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/crates/typst/src/eval/call.rs b/crates/typst/src/eval/call.rs index fd660e94a..9e4a128f9 100644 --- a/crates/typst/src/eval/call.rs +++ b/crates/typst/src/eval/call.rs @@ -122,10 +122,13 @@ impl Eval for ast::FuncCall<'_> { let c = sym.get(); if let Some(accent) = Symbol::combining_accent(c) { let base = args.expect("base")?; + let size = args.named("size")?; args.finish()?; - return Ok(Value::Content( - AccentElem::new(base, Accent::new(accent)).pack(), - )); + let mut accent = AccentElem::new(base, Accent::new(accent)); + if let Some(size) = size { + accent = accent.with_size(size); + } + return Ok(Value::Content(accent.pack())); } } let mut body = Content::empty(); diff --git a/crates/typst/src/math/accent.rs b/crates/typst/src/math/accent.rs index 0480567c4..ba0307787 100644 --- a/crates/typst/src/math/accent.rs +++ b/crates/typst/src/math/accent.rs @@ -2,8 +2,8 @@ use ttf_parser::GlyphId; use unicode_math_class::MathClass; use crate::diag::{bail, SourceResult}; -use crate::foundations::{cast, elem, Content, NativeElement, Value}; -use crate::layout::{Abs, Em, Frame, Point, Size}; +use crate::foundations::{cast, elem, Content, NativeElement, Resolve, Smart, Value}; +use crate::layout::{Abs, Em, Frame, Length, Point, Rel, Size}; use crate::math::{ FrameFragment, GlyphFragment, LayoutMath, MathContext, MathFragment, Scaled, }; @@ -56,6 +56,9 @@ pub struct AccentElem { /// | Left arrow | `arrow.l`, `<-` | `←` | #[required] pub accent: Accent, + + /// The size of the accent, relative to the width of the base. + pub size: Smart>, } impl LayoutMath for AccentElem { @@ -74,12 +77,18 @@ impl LayoutMath for AccentElem { _ => (base.width() + base.italics_correction()) / 2.0, }; + let width = self + .size(ctx.styles()) + .unwrap_or(Rel::one()) + .resolve(ctx.styles()) + .relative_to(base.width()); + // Forcing the accent to be at least as large as the base makes it too // wide in many case. let Accent(c) = self.accent(); let glyph = GlyphFragment::new(ctx, *c, self.span()); let short_fall = ACCENT_SHORT_FALL.scaled(ctx); - let variant = glyph.stretch_horizontal(ctx, base.width(), short_fall); + let variant = glyph.stretch_horizontal(ctx, width, short_fall); let accent = variant.frame; let accent_attach = match variant.id { Some(id) => attachment(ctx, id, variant.italics_correction), diff --git a/tests/ref/math/accent.png b/tests/ref/math/accent.png index 619a066c0c5714dc36a339c797ac864d616fd9ce..b955b5adbedab9f64edf29ef468fb9ea419bec9e 100644 GIT binary patch delta 2804 zcmZvedpHve8^-69sl95B%R9uRa$ZFmVY4A2XKxO3)&Y^zG-+tEXolWaY7&xTn8RvV zX*P{=KIVKZ#3Cal`g-5LzU%vXuKT*~zwSSt>v^uv1aqp))E;o7u z`w{A6gCIBeXpFHtp63}Zs)f}3wLd|+*Du_jVDDY7@f^JIQXLNn;Vv~$jF+Ov(r(Bi zRY5NpNt1L>Z=z!G_L|}S{c3V|2Z2<+TP*;v$%=qW9^Jl@vGoPMim0M*ZQK)ARE(E1 zYG|066eMW-IbJ2Ne8V}%2_H`PN4jaPRjs{_g4&GcXby`E5OYtv-zBp$<_sbCGc^b| zslCAWr=HdJr5>nTUB!CozPdxodAcxUgaB#ubM2Aso=c(EDQBh&BNTiED)S|Q!lt?n zIklUHUuSX4&iSnKt@JYnhH3=t!9v{PjOEe;-x{-Op`nvBT!@ zah)Y9>3)-oPC-in-`8Khb!+faf?Zn==G;3|QmthSG{%*DH44Eu+R#9SI&q!g}so z&wgO4KttkYSq3fdi(3QgU1z8z#N@ckxK`0gQ$L~fcj|W*E=b=QJL!hyiAsYiNO$J6*vzV1 zGtFzS74&rw8UnqJs1Y%I3ZeOsg`MzaBF2KUx1F8+{X8-(7%h15&8%f;wL5d_ThB9t z+_>Sk=HXs$J9SjvW-gEXt)*S{_}Lj>+5W~UEVw6kCNETp7>CjOxYD)zOP>L4IL#UC zEGmn{*#D39eL~A%9RATd0v!GMv1&0;gOHT^um9ezfg>0@SwUhC&xmMKe25~7`V-dq zK`SjI2^V{h9Wlm(sRrBAsQ_obfA*dZ4$sd^4G%5IeBG`$$Vi?S9u6$ID!kiyEIczZ!253!0EwP_@wo zG~vUS#h^9}Vf)6gX8p(fAkUSC%2slv8Vhy`f6&nk%P@dUm}YRK*dk z=*s5t+`u;K$Nv3Hm}so5565xtwC9R99LWd1cL&^*Og-SK=fY`IB>3h)Qu8p=UY;vS zhFZUp@Lx$ZG_YZA?%ZJL8_-ZCSBFa5W+G6Jig;|R`r-@uA(7kzOxP0G1uj!o z_gV}&Ey9FpN$L6?M(t@4(?=(bf_J4}0M+%&IWcNbw0lM;y?$++kC>Q z2ut9~5jJUEd8cBz!6wrPmFIQ>v|UJMi>-0xn6M`#CM31jbt;K~AImag7fl0hs^dLd z#Lhrqa)tWl1etKCpok1JWL}n@%!$mT`j3CwZcB z-!SXC<*@s$&W&Sj8J!dW*lwzU_Rdf{ zY-OOR)j!vYMs^x}pm^?mY$k@Q(8m|gbBouwSk?)gv}Z8^IsZOBW_ z?W5;+)-->x{XEE9Tg65)#xo4q&xd4auS@dPicEFz1=zPLpTmqVzK+?Ly6Z&n4jwX| z{RE?Q^iOr3{M2J>$TO|=d*D(J+!`2WlI*It=dV7eLE=c~E#BXrADKF>fv}1A5w=f@-F4DXlm#D#L`m+QM#9~-0A95r z*|6CY-2(+RlB|*T+SsUpwa4S`>Sn%NIUY2zFO_oMcb?Sge;yvN5e#U$9NIVv-b9N& zfD5wcFBs#SHo|-v4D1)6K<=2HoZ2{-hkE8)B;`_9R&B|vSk5Np5z3;CV;tLjtS{VJ z0uS-KA^r`<3JP`-JAkF0{8@_6r7yBAHtkf1orDVDU5^1zS>>7*mDOySoUU};ei4XS zrWQm-9B2|4hw!5|cjep`0vrpgA3=TMSw(dmPZI%(Kge%%Iu861pe>`y+%GqY@^`TC0)l*UMcW5FI)^<+?GhqKm1E=1^l0;<;AYO&KfKK)Z5b- KJ9GugC+R=DRZj!} delta 2057 zcmaJ?Yd8}M174_>A|tmLwngr9Cv)Vsx#XZBmn7HaeoH$VSt0DOv63Q1Lz&HToAgQU z*N)5Nmit_e&P>dui8{W{_w#$6?|Yy3dEP(okN5razU9c)i@DOGxj?{A_#|Cb000y- zYLuI#@y)1-cx8b6{Mxc*ua1{{&I8hLn*s7N?{`*7C|N4dF}%K0LmXt!>Qai&PA^;6 zsp15N$;e8?>qI^fb%*+fh6ja;du58}@a!a(A%vNkgW@1B4n1+hm;dKgEO$QR#|nLW z<&a%;>#J{~q94Y57PHD!?HIfci!tz=p>^T&Es8vgGE@5pp>J6zlO2l8iRujRd01Xx z^dv++LR6ye-r_*o&>}`08}SUjq-5@R&Tt$!4w@iZ0QMS!MMQ-KV_ZzlJl+X$&+^7L z2^aLW{Z=i2qRBGF+P=|r(A+_uQ4YXRjjoWstHq^zr=(5_mP3Kn<#(JgaiFg+@sXWv zX(Pf7;713&8 zJ7*(^f#|v;*>P;*}*@#@~zl@}XGBB4si=^<(6BjzRce9{7#W6cFLt+uFlJK8^whjCtA*wJD7uKYqH9WPkk#vn zeFv(oZ-q*oqYMWlP93i+oNWU;9a%88JXFTAPHcawJC)BLK*4q6|(^x%pnP1+9K0i_q9nBy1d$fX+b$X5D08LX! zC9u!`CHp3zUq2fBL&fuy7I3@}9&Bkl42l=}U*ZC{>U$2~iijB+J29T2({7x4YF>(R zZI6Mt8_b8-CG0^XKJ)%QT*%)yJ{c3kTY@BOujxtBrS^4O>hvkT$zb#rpG zMgz<&dqK9*e^-AxFKhF1g2)W+Ro1JPiTbl#OopxdmW6x{pzl_P19C zG;Cmf+S-!j0EV_$DZ#&~jqIz}FG(aLiuh)al21OK6CE)3q=lr_dM`&E!AES}UW+-r zsq~wK5`DS>pY5jKUZ@L?vQ^oCH0%g0KK7b!!|86l?QdN3w;A~AwyQd-H^hD9B~1LO z03-4Ay}Q?jl@+Mfjl{*FqLA3f5wYklpx||7sQ7BwkEN=mE9gKUc1o;R0j#_4VT-w4 zzeU1o&Do={Wf?WQJCItyXFRUp+e308=d{IFfO_#1AqBKZl(TCd?-#Z}?G+_x=;e>U zKGIs**cVzM^I~4Y?vuhDQDb>AMd~k9^s=rbbt&Lzl&5Cg7-_S>GiP)fDq?(Uhgk`R zc*|RdWjCgWulQQKAgoF}l=a5PbJ*#JnYY7iRrLhO`%Y=>bY#Fo{1nJs;$g0XIKEXx zu=4~HW|JjUhRQnQqp`h3M{`rvirC{Z(gNHF;<^$Uv@nHb9V>_V z7}^-=^_*H#Vc@mIV56kXX!afHf?JEyjS$a2JP_@1tdmr=08PfHq%J8YEL*}g7w4_n z!xVtL_dr-l^R)HyF#+cp>t_bEerDPhJ0SN-E}Ai#)%GdzX{GITMF(NUg(;t|l!Bdt zn9gln;{ejnnrE87+22YWf;vjcF2w}AwgqCGGlTFy8xvF&D(p;i`cz?{8x8@wYJ9QP zQIeQugP(X{M_Fks@J590lOO`N0{nuhx^OQg_(`73oV&^PC062#osjb=F4@+@j>qbUbBojLD