From 33213abe7dfcb8d8065faadd2f5b72ec4b718af1 Mon Sep 17 00:00:00 2001 From: Martin Haug Date: Mon, 2 May 2022 18:48:32 +0200 Subject: [PATCH] New page margins API --- src/library/layout/page.rs | 26 +++++--------------------- src/model/styles.rs | 15 ++++++++++++++- tests/ref/layout/page.png | Bin 7401 -> 7390 bytes tests/typ/layout/page-margin.typ | 10 +++++----- tests/typ/layout/page-marginals.typ | 5 ++--- tests/typ/layout/page.typ | 2 +- tests/typeset.rs | 10 +++++----- 7 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/library/layout/page.rs b/src/library/layout/page.rs index 4307d2f9..801a137d 100644 --- a/src/library/layout/page.rs +++ b/src/library/layout/page.rs @@ -18,14 +18,9 @@ impl PageNode { /// Whether the page is flipped into landscape orientation. pub const FLIPPED: bool = false; - /// The left margin. - pub const LEFT: Smart> = Smart::Auto; - /// The right margin. - pub const RIGHT: Smart> = Smart::Auto; - /// The top margin. - pub const TOP: Smart> = Smart::Auto; - /// The bottom margin. - pub const BOTTOM: Smart> = Smart::Auto; + /// The page margin. + #[property(fold)] + pub const MARGINS: Sides>> = Sides::splat(Smart::Auto); /// How many columns the page has. pub const COLUMNS: NonZeroUsize = NonZeroUsize::new(1).unwrap(); @@ -54,13 +49,7 @@ impl PageNode { styles.set_opt(Self::WIDTH, args.named("width")?); styles.set_opt(Self::HEIGHT, args.named("height")?); - let all = args.named("margins")?; - let hor = args.named("horizontal")?; - let ver = args.named("vertical")?; - styles.set_opt(Self::LEFT, args.named("left")?.or(hor).or(all)); - styles.set_opt(Self::TOP, args.named("top")?.or(ver).or(all)); - styles.set_opt(Self::RIGHT, args.named("right")?.or(hor).or(all)); - styles.set_opt(Self::BOTTOM, args.named("bottom")?.or(ver).or(all)); + styles.set_opt(Self::MARGINS, args.named("margins")?); styles.set_opt(Self::FLIPPED, args.named("flipped")?); styles.set_opt(Self::FILL, args.named("fill")?); @@ -96,12 +85,7 @@ impl PageNode { // Determine the margins. let default = Relative::from(0.1190 * min); - let padding = Sides { - left: styles.get(Self::LEFT).unwrap_or(default), - right: styles.get(Self::RIGHT).unwrap_or(default), - top: styles.get(Self::TOP).unwrap_or(default), - bottom: styles.get(Self::BOTTOM).unwrap_or(default), - }; + let padding = styles.get(Self::MARGINS).map(|side| side.unwrap_or(default)); let mut child = self.0.clone(); diff --git a/src/model/styles.rs b/src/model/styles.rs index 00d1df0f..1fddfd0e 100644 --- a/src/model/styles.rs +++ b/src/model/styles.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use super::{Content, Show, ShowNode}; use crate::diag::{At, TypResult}; -use crate::eval::{Args, Func, Node, Smart, Value}; +use crate::eval::{Args, Func, Node, RawLength, Smart, Value}; use crate::geom::{Length, Numeric, Relative, Sides, Spec}; use crate::library::layout::PageNode; use crate::library::structure::{EnumNode, ListNode}; @@ -488,6 +488,19 @@ impl Fold for Sides>> { } } +impl Fold for Sides>> { + type Output = Sides>>; + + fn fold(self, outer: Self::Output) -> Self::Output { + Sides { + left: self.left.or(outer.left), + top: self.top.or(outer.top), + right: self.right.or(outer.right), + bottom: self.bottom.or(outer.bottom), + } + } +} + /// A scoped property barrier. /// /// Barriers interact with [scoped](StyleMap::scoped) styles: A scoped style diff --git a/tests/ref/layout/page.png b/tests/ref/layout/page.png index 35716e4deca33ecca7c038f9a6938c594597ddfa..e0618e589a9cb342f5bbb435ef5207126400a8d7 100644 GIT binary patch literal 7390 zcmcgx2UL^E+D2J{l~7zkqcm9y2r5B}^jt**7o{jwg%A-VAiabdT$(EgD2Oal0*HVh zL;*!=C_@O3Dm!=7P3~*c ze~3hX_qDLefjiskqpu6s8^)6)tVfiFw9if*m9$?DqA>3UE+k556cKLBrM;JpKXm@* zG1Yn^D(gV+<1>6Pga7%dJpi>6hQRoEpkHu9LbvhMafR94ISs2lPi))YZ^uvi{k;6I)P_QM{?75EE&uJZ^YJy0 z&PcT4z5Z?HKN912oZ=&)>*3+CFj}2!jKw@6#6cCa43kd4CTBvWUtBE%v5={I_aUra{Q`G*9+^C{VGm9K;+caRJBS6!!Z(TO5_+9pMC~L@&f+>bPT$nb%F1e_;JmzL(fzDR4s+q|>DSXk*~U5>*~o@S zOI!bmx-ec{KIYn7<;PI|D`l?LC}R3F>=1UQhB+U0`t{uQ01j&d=;hX%-)oIZ^Qr$* zru6oJ=lpPaZ#9uC%t1r~)Z&CTZ# z(&D|E?_qhq*ZnrxbT3a&4c}S6UUN$UDD0y?oY8r_Z1^OGwLTtU23_%K5Uyve&Rl+O zhQVOgxTP9Yd~ z2??}XZlT(Yicslr_xW9qtgG1{yEUwnN6Se7QO_fm{sco7`3J6I(Q*u*` zkfhf4{+kU#@KhbO;UHSOhq!`uadrhtP}+O;!_uc{1>b+oU7Rk!oip{OrlD_+`h!HE zQYhz4OWnun+nBg=$`cUv3j-xG;U)mOu3cko7z=Vk5Hb*6A<5f4d7V4W}*L+W@VvnVTn;NJKsX`2oBB?mOA2Q4Di#oRXy%oh5svI$-s~D|;~&C-0B7-;Q&h zU(P*ex&m_J@G1Q`Nq|W?7gM@W{u3YT!pLex2t0-mDJNFL{4=-Tom6g78p7jkTmtk#KI6Nv#U()|jxw_~04{uzCB85l&$T6}}wwR5H zagLZ<)hhsJ6B85q?_drsk7T1<-;PBBM2HY>X=&jRk{o{PLB0S9W~?~&7mcL2)g;$k z^MCEwozriFPTMUBR6>$!f(7;~L)F~vJWBus_S*)!c-|WZIKS)QxkGgHOkbfT&UQ+u zrOBN!m5ZJqR%cgR80b`iH5?(xrB96>;_#(+yOXhu4$XzO=H`Ky$S^Ok@Uo6>oTRpq z`otsQGoY5(+Ky(QPl#s%yiMWyP#uUiGU~8FkNBL0fGX6|-rkNe94qOE2dw`qBJ++yUGeNSwOI7r;3}|eqem)dA=vNZx4ipRZ@&dlqwYnyQQh_A z9+J&i^$-`5&?wb_NQbAmRvazL;gt${uP&r}v2GE>hrX$D;M(k1!(AD~*YR6Ul#SZS z&rhS#0OnEx-IJl9I7$+h9!TrvHwd4Bs@}E|C-Cn*aqaO)aaY$Rsuo0Lhpx4?HE{Vd zjRsay_gnnfcK6C_Cl%n%(ds~i-&jO49c81Ged#%e%|vO>mDQ{kDo4URKD|?mCHYe& za!)~2*r{JbXG_U|{{gyFZ0AylNa;w1`5Aj^Z za8Mvs9J|JI;cQ1r!u@?pl)d=%h%FaJj9KCt<|29knuma4DeT=xE*R*vg3vIPh#c2` z3pfLYmO>JTV_3uGUQz**nXL-=DxaCYWQD@meM(1S$pyF?hTGlBr6w^@pt^9^zuXG- zwp4Yc#BUsG{GOD$j#QY*^@2cdOS-7bM;}2W-9yw(O# zNsk_R&kt`Dx1MNa<*g3!K`xe8^1>yKLCgP(&|IYuVsPq^iqcHa|h^Gu(f zgH1y1Z*^wrB@tCYUWe?|^^DEoN2Pi+f%2Hz^inC7jAhTFl6k8*j2RE{I0;SF@&Ulb zXdRjgv^!u|f(I*w#5z(wQ0_$qx#Lii9=Q0i4sh#+4Ey_;fX;I342?G@Y(95OC{ADN zyXqE0_9LciJ3>4F@#|B3ZZ`eIx#+xYdK6i$UBQNrwBB@zu`;#$jI4qJvAMY!V_2sW z=0s7^?bDADS3en*10Ta;=_7<*xqT-w-tMN&xHseX`SQ(z} zBBIyW*w~9S;53AQP9stnxD9&^snF^=(2^*x%Lf_>Q;}zQhb@lXAZmHdgSA9J1^3i` z%RSSNLztRAY!Vg{Q$0qzv%I_vYSrm5o(N&kkkFQwF&rA!l8)k&Rt9~*pfj$$qU2(V zDlG3N@;mZ6=uys-c7f{ESLIJLJW+m#w!H#W$K)hDD9X`fKT2D2bGtLH`i)-no-Hm5 zmmCdTs0MjbXj2Jn3qlKk&*MjrvZaIyEOD`9C=VNrkMDS*G6PHws@f>%9TG6HCfBYF1F?1+ zYb|x^OC3LUOkC+^+dY}|55*3x$FIIQ#Cr@;qXqT>RaFSiS_Bxnxp)`80t^DAg-u!^ z*H@UUW^##a0XC|Vy*6a5HWm(k4p&j0IBR%MK3I*&DlIJq>Xw(6dx!(x;W$#-Y6g)j7g9!R>%O@AtorUW-?Nen3ROGt=3@Qyyhz% z-qqCwpdRlks(KVga67& z++kpP_daXXVZ6ZuEEdZ~u%Bw4gY|ernn_9f^-P!h)dj%@pnp!r$BLf;jfx&4Fn8K$ z<*CNMz6#?Ja01Y_tkDIc;FB6=ee7<5=K3uoZ>Zh+mFsHWlP0Z?kGoY&<+LRwb^wM5 zwaasc*3S-LD)kaj}2A)rtI zB!8mp*aeb934S%<$i)sdG6bw94?V+Yti5U`P9SR0F7&bStO*6Mc6ERX1lA)8NwV<; z#%W&zy`4|U@+Q_DQ0saw-L%?85W|2DZuOVn#re*Dcm-PNW;h=3iLz&!%-NEsvirBF z9xd~(q{g8A7rGZ4h0{SDu_(OKo~%UuE>2KNrwZU_Gf7s$$jrQ7s_5`8n)+$)~E`syTN@^~q4#Sc@0!n3cxH&9!w>>Qh)xqH`qa1V+Bj z-Ei!y+=CEUkYuDstHp7-qc&!j0_IY8=xb$kXNL~Vz^%+KFC?FG z$x|WSeFV$u5PE!>0*2B!&4Kl6NB(HF(@kjzOxzHXq@{_=%Fi#BtE!|uJt(=DqUUB|5z&$lE4&r#N&KPzu_b!f zS7+4B%vV-t`bts6BLD(wWkK}Y!Pc-KS zy0oq(bQ>?jk7&~veG*g5GNG&M6d$5OmB*+v`ElW(Ip#pPF?O2L5K?87u(Qi}Jx<%Y zRC=RU@9;BgA)Cb&eps#heMQy+zHQWN(Zs?0gVkE|(S-Eopvf9MJ|&fIzghEjFp2@H z5{;eL=Fjb?Cu-ye26=4JU9B7Eb6;uQRjGiVTp`6ro49CEfXwhlWVVwAkJ^lez8Ir8#=OqvWlP#GG(_qCvz zS){P-@Y}=XsFiqhJb9BiYgrtJwOV|CwID&CsiP^x6Wj|G3@PE%rB{Qws0~hcH?EB1 z*f@Ch2L%c~-G7m4ujY8YZcqp=IM$6*YHm;APdY@13t-R9hRN(nRrl#jRN}{_TKhFU z+6T)!S5+EdI2J$Nvx#>r)B*ECwA4`{dJYceRuwL&zK4kLOgs9wVbbCKW%CBEzF5^j zQf8EJJtwM#_i+&`cXas9wn!W$IP#Ps`fz^>>SCJt;%HM#zKN-MBKySZUL=%87o95G z=*w9+_IB!7zg&KPJhN3^j^Z}R0Aa(y5ouh{b=k5{tLDt6V=bHF_#Yq^w=(~xl`b_`@~ z+wl|Ub+WVaof>1~(n%&K(d5S}cS(6h^Q?(hx3_mJTnGKk%Gl!hh7J0;$mD-CLNr5QOziqxT%IxY7R%^wr=*6Zu_*@0`Yg z%5BtCFG0w%OT1gcFB-@jZva&QtZs`+{DUt+#@OiDCBQcgU5l(sjwF5)BL$b-I`ze1 zx9(v6K*>6AIrHb;fAHDm dpe%D!z7&72Iosn5xVPjwuV-|&=!{+HKLOELRGk0- literal 7401 zcmcgx2UwF?)`n35B?vR325G~Jil7n(lp>OWhzz(=q<1oki1gkQhZ1H`L17S;Cg9K^ z2+}(Up=nf_bm=8PfY3?EfB1K&?#%4|vpzq$4-ffB&OP_sbKdto_kO3Xsm8VM$UYVp z7B2O#E?#9}VcpHbvdfd>6L@l8*s6+!MIcZ8qOzWM@7#c&bM#6Qb=YfgH%DGcdcXL< zm-^v>BSPd1-(ap})2yr6VHy`q#INN9zPRPUm-n|l8DetcbDyT&VwJeM&>=Q{T$Odt z#iVb|#xlQT*%chi^Es>QM*M?fyW_bc8eT5^O|-{U;asmuM zYCc(P-@E3k9IR}6|MCmDdlw>*m93T~$m+H-s^)W~6%PW%!G;t?J{$c``RB==jkZ4$ z9GJZrcjqu$5bH-9hY$Vk?7wh|l?{pbc*D$SXK}wU|I0P+Jg&96{SgN^4@Q5EqUf~U zNxcGk0_UIl@H^W9Rx;<2OG`^<%4hSxJ8(j1bR&q3>sDXUX@r6fD%gY4rK;0Gw5)DB zuj0MEF_|K^**CQPus`mCpC_*>V`~lFs5al3)!mKlq?T6MBGh{Guoz=wz8#}gnR&h| zGmZmg=DyQEY;0_xrmiK85%0u%=H#(p&83W+)9?zwZ`SCx1+sw#JRUA zq}91TiLW0?+h|tf7;O6m)?c5e);x`3t)J=4N)bCE_4UQg?S(o{$+5Aq7mfp)TSH7- zmO)Ok*pc&|_Kn5rx~YH9&`r~9eR#ScKYv6{=!@$d2!$S${a{6@=UlH>zl)k{!HXBm zWt3dI_j$vEm459=-v$?Y%`R@||+;j3lqTJfHK^vRWxx zgA0lJoEFXl6GdtKFz8Fk8Jl==*6wOXN7I9&?Q5Za)XHMxf*U#QXB~QF!bcCCHkp0@ z{Aj6cw1zb%yL(Oilui3MpKW(vd-fSlhqP!&16(e0+QgZoDd+cw#rxl~aDJ zQyi&hjuJ)3x(|4CcV_BKFgU-|c2i3;j}Y+gFz>5aSxL((|Mt`? zd}LuO?UlNPA;Eu#9=|Q`-!HA-1Hhj!Vs{X{ejg-1?&JTTiGHMtKLNpC;8jMZ;Q&q` zrEHv}^-p5>zpc3{dGCSaX1I-U(<1wf*i5I3#i~U~NDw zObE9=9L5gi&^$XkD;75KI^J|~J*Rlk1d=RZYc+&N zhQvWAnsWDP*NyR*H1a-vS;xD{P!~cPjyNdV(Z+k{oj-ip5c)*g=Cu=ktB)k)cWPtx zwRIXyD2V7X;0G(ylw#+|0~h4{?nYelK}yzMOhSTzsDhpzi8)dm0eMK`D1|7n~LL zUr=_X4R{UZSXOV(6%Wk^h9+fNiHVD6>Sq~{6D~x>f-_}vMSYQJO$=NY2vky6KG^~HSGR0wNPbgc!kofb&Z2INsbs@ACIxjUC$7P&CSlv2GlH>z@~o& zu@Y2pm)n{xz;HA)G|0=#r>I3}hI`HRo@LFmAt%5`)r5S;(vcb(8h|0vLs!>F+z4rj zIEC=hyKBdeUwOhyT73E40dpEk?;wI(Y28YI1aWyH?{-6gG>xX#18nKTgCKTp&De9N zN29yKkX=MeVUi2*+YU37K-fk!d^e}l{$T=kAR_tZOh?8p_Wggax+r?uyi6u6xu?K} z8!$IoL*Jh}_iu!`zG9LK;NnmVDwt<;jVer9>@RgYY*SS7^l8mmZj62{kgX9=7waxI zcd(_EsC1Be3s~Z*a?lRhXXTbSDkDT*p74^7XeArqPB4^ zOmri72VC1%?35T46}2cx=fAz%r=!}^WA7Si5 z36LJ-_mGgh>)2gB=^ZZMcPvS=ZBIRDX(D*e-bjE{-0#|I8PQShMTKoy&N2#w#NdcJ zp{4o5)q|FbS4@f>&Bdc{0Vg)ZT)}W?DK1_VkM6DTaohaTD9=hc_MF3r-0PN>vh|TW zG#ah%g{>Q7rQ496e%R9gIV4^)Z2~sS<3r6ieB2U95HzH$qgtt6^Zgs+llB8;9x#p_ zJ9fqcsd?kSVTj*i-EZIjN09jWk9u8H{i;V>#Hn?8&VNzczcT#$0=4s#`mP+)z9NS$ zI*pvh9b6m4KIB}_H9kH*v^>tM0BcXv5=OfFqq0qlbMw_Ks{DO8u)vi%yj+3`GK^1? zFroVk?YfnmKh($u$cIe4ie-LaN8eT^9l)e%#uILwa|i5GYsdph6A41v7Cg_Ct zUs2hj+4NF7I#78CMF3K+*qq6FEQ>LEar12+wjK)Z0q6&P|6s6x4-gTMfqlQgBRQ9^ zncIv+zxh&lcmtQpV~}km6|l8Et%X;ZIh zRPkIr>NuY)=qU@paDyC^9aRvPoJb!#0bAO<_q^9UfbKW!LUK$xO-p|Kdsqn+7`Osz z(tv&u+{ghX2rHMYS|0&almVHwxja369%E}e4Ok_pssnHtNnV;tiP(`Z!;Nuqapm)6 zlmfC6r-%Sxbk)}Uo#d&~$%L$LlVEMr#1q)@mS`w`$9e+S+H6mhz++gR00~1ts9QYi zg&glRv>bqX9rL-&fdzrA!@B}VSyCb=pJYh1@R;fNMw!Hi*^#HX=gL8B3|(ZTos4N#R8lVTIesvx=hXdOj zc`TYiw1c2>U|&5stHUd}@~M@!K4~F#h<-dQxuT+?1tp4Ku=MEE7YPO+KS9m|g!2Z$ zED}to)5XHx4Si7yVtW{rU4hjl6tD9et^(wRNX!;j@Wbgbt_;#4*TUn>d$CAQFo0dm`iVt~Wozu!{be4MQn$%esutP?iTXgsZ@Vppn`&xmuFVf{a&k%=dCvEj zf?*wA5F+LQE1f(2L&Jdyaw2}U2fiN{A3p%u0>O;;=rWca@|Q*^C?U5ytJXul1{06b zmmX~FRsaP*4A~HU!NkR75g7iRQ=|1E6)`a}Xsf#S?qea$1SaK+`<=~rGC2~WjEc)f zevznh{gBE|*Cif(M9~}d2`X;vk921^J!d32IeAP{M9;w1*7og#?FKh1=S2fs#AKYC zCa>y1xfgLZ7*ghiea{yg6rWB-f*6h@*ygtdnRDho4Z^)JgGti15PS^0rF$%69Jzij>w2fNbJ-i zsz$pKMW0ebhmEcifPkgUq1}?$&Z>cboJK)23jI43y5Z`DJ3D^`a-O-(3Y#Pnya4^! zOBXt{@zw&&21(qfq@De=x}8*JRkFQF;g`AT4E@&K(Pk#TuAUo>*o6T00aqVJMYV(G zN*U~fj{_T>U@|}*D&3zSxg!~#oDL=3{K^K@fDsv@cM$Ukg;j|QQ5sywI+?M`>sQ zGk+d_=eqpW^CrSf@UU9@1igTHe{%&NKYkpMs5m!VVF`a)v0zKMl}fsj(~Mvsox z`bq_NOAE%>2U+bK;Cg+*@3OexXP>Evos`6TI9Svjuk7b+)HHeFFsVaEYhT@bA86fd z>tNx}FiM;cc3z96K?5a+k6n%_^l2W)F=s>gyb1#rS8~|HT3YI>>W>``kBw~16P0Hc zM#zR6ReaIYbS&#cPM@ChQ@IUyszVRXU{iUUG}S#gRCYAL-;Y@;+^-biNG%@Zf9^e= zJAx7M-_~9e+88esijT$B;O*;XxSH8tw@NmZP{ItEY_KA}dgeB*BOvrLOxRe*u!+Fs zjF@ZD87X6B!rN=((?Qcjgb028UMU~<3RRNfF_D_nTp2WE8YwWVG(I=>)qHQoU7F-J z?R!C0b_|Cfx1i$%1=?ZHiS&NQs2j(G&!1v&F2u1Ch--V7qwZ|GyiFs1Ag`fGn!SEg z&c;6P^-8K=J?f6wgIP-MN_v;iQy0r$EUHF0WAreNiBGMH^4U)Bw^1^S?(bV!DYgRT zGu$LgNt{2gZ6M@%NLUfg@TCaH5U&K&{kygfYHhnBY{Fa2%l(`<67lisj)Uj@lwG&) zuf^O*P!wOQbJ2BtqPUgXTp)=&zn3kb9T`3gX%u;x$;6e+Kt?mAu)VeK^7EJSZuY&t zD_y-0GoOG7#c)ua1|Ia=qj9%%)NMJ2t!#UA?-Sbw4_3V4fBPUx9-;0gh zT5QZ;(l)V3*f_Idh()eK{E9caQn@DvrD>J#mX^l6U2LZz2k{rELClo~!#I!zwfD_@ znh%G{Cpt>VFZog^iS})Zr$OM6s|m|EO6B#n*A@$qHnb(q$nqjVG0p1D<%j`ApH=of zmfjvK+QvO#Pr?tsiw#+&zO#A;KF`pWVCse7-5G zn6f&1xk~AU7SoIkktvQ$b!yT=>3PE4~6xYx+%K(KLXlq(+Ms9 z{m~EOw?-}^-6OBb*|gb7FD*rJpF9l*VWS1p{7W|W{rMA3{GH9UmKBw64&02NMZV*w z4@N?%ePJ2Gg>A^aP&wpF-a>4aNsW1K(GpzclTkU)G=E+TRb=*yK9v4Qx-U?Oo@5XO?7$gGq zUyPrTT2!B=a<-LP`s>Sz{{-&g6c+d#1Uv9R#-n#S-%3B(odfc)u&^Tgo{>ILeJ@0UGzUS3zyrz&jjh{_)Ekfr=J8#g zdZ6*cPA{15Yb6J21rDK$ZoGPeN-x8H>sUJe5Du5q4T(aCOh=@Dtmuz7EIUpQw^BgY zh)0W`I@MNjH29oDulwwKsQ`(7pUHUWn+VD$BnVNbt0({TfbuWI;-_n#pCb3?hmXJ5 zfQ-!5M7%Z+O-b5*PY F{|D)1AkF{) diff --git a/tests/typ/layout/page-margin.typ b/tests/typ/layout/page-margin.typ index 44126d2d..e30518b0 100644 --- a/tests/typ/layout/page-margin.typ +++ b/tests/typ/layout/page-margin.typ @@ -11,10 +11,10 @@ --- // Set individual margins. #set page(height: 40pt) -[#set page(left: 0pt); #align(left)[Left]] -[#set page(right: 0pt); #align(right)[Right]] -[#set page(top: 0pt); #align(top)[Top]] -[#set page(bottom: 0pt); #align(bottom)[Bottom]] +[#set page(margins: (left: 0pt,)); #align(left)[Left]] +[#set page(margins: (right: 0pt,)); #align(right)[Right]] +[#set page(margins: (top: 0pt,)); #align(top)[Top]] +[#set page(margins: (bottom: 0pt,)); #align(bottom)[Bottom]] // Ensure that specific margins override general margins. -[#set page(margins: 0pt, left: 20pt); Overriden] +[#set page(margins: (rest: 0pt, left: 20pt)); Overriden] diff --git a/tests/typ/layout/page-marginals.typ b/tests/typ/layout/page-marginals.typ index 9fd193c6..6e8e3d85 100644 --- a/tests/typ/layout/page-marginals.typ +++ b/tests/typ/layout/page-marginals.typ @@ -1,7 +1,6 @@ #set page( paper: "a8", - margins: 30pt, - horizontal: 15pt, + margins: (x: 15pt, y: 30pt), header: align(horizon, { text(eastern)[*Typst*] h(1fr) @@ -18,5 +17,5 @@ do wear it; cast it off. It is my lady, O, it is my love! O, that she knew she were! She speaks yet she says nothing: what of that? Her eye discourses; I will answer it. -#set page(header: none, height: auto, top: 15pt, bottom: 25pt) +#set page(header: none, height: auto, margins: (top: 15pt, bottom: 25pt)) The END. diff --git a/tests/typ/layout/page.typ b/tests/typ/layout/page.typ index 89d0f2fb..3157ebf9 100644 --- a/tests/typ/layout/page.typ +++ b/tests/typ/layout/page.typ @@ -24,7 +24,7 @@ // Test page fill. #set page(width: 80pt, height: 40pt, fill: eastern) #text(15pt, "Roboto", fill: white, smallcaps: true)[Typst] -#page(width: 40pt, fill: none, margins: auto, top: 10pt)[Hi] +#page(width: 40pt, fill: none, margins: (top: 10pt, rest: auto))[Hi] --- // Just page followed by pagebreak. diff --git a/tests/typeset.rs b/tests/typeset.rs index 9f84a733..d3f7844b 100644 --- a/tests/typeset.rs +++ b/tests/typeset.rs @@ -12,7 +12,7 @@ use walkdir::WalkDir; use typst::diag::Error; use typst::eval::{Smart, Value}; use typst::frame::{Element, Frame}; -use typst::geom::{Length, RgbaColor}; +use typst::geom::{Length, RgbaColor, Sides}; use typst::library::layout::PageNode; use typst::library::text::{TextNode, TextSize}; use typst::loading::FsLoader; @@ -64,10 +64,10 @@ fn main() { let mut styles = StyleMap::new(); styles.set(PageNode::WIDTH, Smart::Custom(Length::pt(120.0).into())); styles.set(PageNode::HEIGHT, Smart::Auto); - styles.set(PageNode::LEFT, Smart::Custom(Length::pt(10.0).into())); - styles.set(PageNode::TOP, Smart::Custom(Length::pt(10.0).into())); - styles.set(PageNode::RIGHT, Smart::Custom(Length::pt(10.0).into())); - styles.set(PageNode::BOTTOM, Smart::Custom(Length::pt(10.0).into())); + styles.set( + PageNode::MARGINS, + Sides::splat(Smart::Custom(Length::pt(10.0).into())), + ); styles.set(TextNode::SIZE, TextSize(Length::pt(10.0).into())); // Hook up an assert function into the global scope.