From 7163b4a6c57c99fda085bf9b364c82bdba8ea698 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 24 Apr 2022 21:58:45 +0200 Subject: [PATCH] Soft pagebreak --- src/library/layout/page.rs | 5 +++-- src/model/content.rs | 8 ++++---- tests/ref/layout/pagebreak.png | Bin 2115 -> 8640 bytes tests/typ/layout/pagebreak.typ | 26 ++++++++++++++++++++++++-- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/library/layout/page.rs b/src/library/layout/page.rs index 13583f098..38ba53e9b 100644 --- a/src/library/layout/page.rs +++ b/src/library/layout/page.rs @@ -164,8 +164,9 @@ pub struct PagebreakNode; #[node] impl PagebreakNode { - fn construct(_: &mut Context, _: &mut Args) -> TypResult { - Ok(Content::Pagebreak) + fn construct(_: &mut Context, args: &mut Args) -> TypResult { + let soft = args.named("soft")?.unwrap_or(false); + Ok(Content::Pagebreak(soft)) } } diff --git a/src/model/content.rs b/src/model/content.rs index 4077f6963..04d5fc5f7 100644 --- a/src/model/content.rs +++ b/src/model/content.rs @@ -63,7 +63,7 @@ pub enum Content { /// An item in an ordered list. Enum(ListItem), /// A page break. - Pagebreak, + Pagebreak(bool), /// A page node. Page(PageNode), /// A node that can be realized with styles. @@ -262,7 +262,7 @@ impl Debug for Content { f.write_str(". ")?; item.body.fmt(f) } - Self::Pagebreak => f.pad("Pagebreak"), + Self::Pagebreak(soft) => write!(f, "Pagebreak({soft})"), Self::Page(page) => page.fmt(f), Self::Show(node) => { f.write_str("Show(")?; @@ -463,8 +463,8 @@ impl<'a> Builder<'a> { staged: vec![], }); } - Content::Pagebreak => { - self.finish_page(ctx, true, true, styles)?; + Content::Pagebreak(soft) => { + self.finish_page(ctx, !soft, !soft, styles)?; } Content::Page(page) => { self.finish_page(ctx, false, false, styles)?; diff --git a/tests/ref/layout/pagebreak.png b/tests/ref/layout/pagebreak.png index 293e1b06b4057b1e0a2f442adad4208164f4572b..741ed50fd5165ed5d6e4d30f64bcee92436ff15f 100644 GIT binary patch literal 8640 zcmb_i2UJtrwnahkY7}{*1gR=bK#0<7L_lstKva4QAWfPy>D>zo2ue{A5Cx<|DAJJ* z5kfDaM4F+u&;z05Z+-9oXSwCw|Nj{ojAZX~_E~$KwdR^@9vd>b9H640pbS5J5R6!j?6go&oDD`O$lY-pS{(M&ZwtnwS30(tPf1L*i*gBT|IPOORHN?@T;M6WrS zOfm-&m)07G*HY|n%lAyK7%^iXnV{82)K+kyS0i&*}L_Y z%j|yC*{;3W(X@F=tm7?4EMiaE3RpuJo)$^kB2BPQzKn$r-|NHWSRn6MmP_ws3-f7^ zTgDs$*jumnb%4+Qq%7P~)8mphHv2ZQQFBhhE%;Qh-1!h&1Enm&-G&yH0QRtOoZhEo zXXsL+HMOQFthX@V7XSI}h~J|DCAiA1(dP9OjINLqpOj}r-(y;}vxft)pOVHg3GwC%RAhY$YE8OJ4^uG&W(+IXik+;}E9VEjk4%nQFu?MTgviO@ z#Dc68RuW7Hk;qd=>(^6m>|8i|*5b&MesR)o*6)XEPL_R{2vnZX?P_gpY4^FJu%M@R zi&{X}LMLk}^tg8zjksIzF9Dr=;^kWR*R!MCfrm00@}>jaH4^qF#y%f^`8wLlP-B|; z#CB(B)3Jy_&BA9zs~4@_4`IE7q41#;>FY8~dTW`I;8QKHwf(Gcl}unv zF#dV4{Z3eBA2j_v)WhSUe~{}3{w%mPb77TE3r2>c@h{hH?~Sd*UtTe4tCh-L3e6Gs zthpHp4OE~A<-l1Vdg6~}Jy6jtwVWKc*FUmg9 zr=5lpdL3Gym7IDc0A{?V79q|x(>wga0Bxy|KXp_k(Kkc>U5mz?c1e6C{{4!dU$W~f zB9#5`)tECynb_Pkx<-rFw&I*;Rmwz`-BjnRmT3f96_FjAf* zu=p=W>%AV6 zbtgkT3-`Xv5T|;Yc;~vc-KB|oRCK89C|S3{YK?Re*DlLC`Za2T_ra+Jn zUFq^#$znp7OnLZFl74)_+KplJoOw}emPqrPrg==4B*tbEK!P_t8wHyS)Xs=})&mkO zhM!l=awoHcSRIs#DfBHPn>S?gidY98fN<{Gb%UocS7Mn=r}%_N7n|LKby=S&{ouQw zk?4r4%*^c>n4J@3Bz2vZI}yacb6MD6Q|jeAk&+qdb~SIm=^)CM9d!UbmTj$zX%AmY zCtahb;n&Y;g2`Oyar4_r!yS@?o}kOpU$|_XdMzuVoNsvI7glJ^@*STJn8WpA@=A_4!Td^%0L&eGu7Eu31-mCNqoXMP?VYnW@2rV8ylAWc}>n zhEyL+F_NMlzU%-&*{fPAs7o-=2o7@`u47s=9U+m@o1-n3DU-3*3SFjcxxphbSIu@` zDBZ|K-AdLxYViWyu&h7-VB=La;3m=rklHlD1wp;OxX7oebc#x&t}$t9b7=%cF}t3( zG=dZ%5=a2cXVjhb3c4ne+0LjhtZLSnnph56KUFN6<05{t`{)Mqd)ok`O02RlvoJz! zD_6mHQ>*qjn&o_@yU0tmdSVvu%G-3|qfPBwBkBOPP5M-s(EA}tV?D%s!ZtQ$7O1LV zyPm0Hhn1Imn7ucNYguA>1wJ2Mkg%@{Pg}p^u9~oa!$YwvB8;ale>T^iVvn#|R zDdZ9RZDYdcubvO-n-iOv60(?CZ4-EAZ8S&7?Yb8y^}$No96T*c^UbRj{nUzR&umpM zZ^tiYcMKNOO5C>G<@CEoZ{$29P7xqdo^ZMSK$XEAVu{3&&Z>4~KCA&}TxBK40nq>LZarI3;ms)O+@2*PQHEhd)DGiqd^fqJ0ZtZNvkc!Rz z-jZ!jxvJ2)UL)LO4#iq#`J3CWsRjY?NuF)I1kV{=g0R{awX&m3cl&@M~H z^VkDy{{n=&M`r+Ha1q286TKF@&^Hjj3T?xF^APf_+}?Dx0O;epl>;C4sG}vfUGICb z8bNz`-+}gT(vL6=H^>iEhBNAhuX4QA-y&?^lWH<7h)*k5TvDo;%Cu461z$B&I$$hEfNPBUm{lCCjtn z$@m*tJkWy&55As@r9XA*5H;@_bai$0^XJd136dJ?pC6y(7Pb52Hr>uLnL05s;l4Jt zy|u-!`+lbTopMV|_1-3Kt}knGVS!5S(N3~;f3ClO3rA2`7)0(wU46ZZfNH$BI=v!Z z`KYh2uR48BPL8duZIQ0+##~>C-7qg^wb&MSqiS5nbJNeig_c@RPfty)qb*L1o0D^L zaxww#Ye?Vt<_+L6dL?#cWo3$rip>T5h)6>eo0wfZ`(YBi+?Om1OHj1zz&??Cy(g$@>*|ug%5-#ehYlS=z6p6G_k40;VIfDaq&-#$-PHy5 z#=yV;yLqVbjom<=aT1TYg+-u0@9Ch{*4C#_pVrk~#fyxOkL%`$iit5m?&QO=4Jxo; zZe&DOR8*9c(`>lh#bqA5*pn8q;+K~PlRJ?_<`ER6h1@xFNx$^ITw2c|8X5-IE9T~@ zs%fENVO}$ernq9;!s24hD$X2DskB7?y@spFBA)mXFmB=`IWak?>5Q+FOntFJI zaeuDCIC-=+R_Ku23|OZ$6WwrATib26`yF|li2~p$z9;2t;(2*{hmNeXUE1vcJ*C+{ z0yz*44h~gSRfG@3kus<0UYeBD)TYM9;SZku6DB@BJ|-rg+Y_XoD7}_+;gyt>b^yJlt?f~hGf!gikk;z&tJ zO_D%5#l^*07Y$u|a%R@Ke1C7JqP#o+7y*%A94gYv);^1ftgGJU_ptjmn`xzG8easWm!nWOL3^TlQ4|r~8bJ6|4 zv7ptUvs_%)_CkL{*WS$1%t^9G02iI2lLtFwW?`wNpoV=se*8EVi{&CNeExip8g@q< z^6c5OBpxmf4k)S_gRvgSI}5G3IS%7Vt5Qvi6SE%yt^@1iO6*6Evq<_KfV?{{|212W z9zM+DaXU`bmb5XSR>dVMs+rcqII41lmbQP^xv4}&MIe(c3BXzmuf{(VyPBG&#%cqX zmXPp0a- z_@*aGJfI}@_4kX($QYEZ&U7U+GBVD2ZmzGt&&wOLp$0*Uw6|w7OquUT@uBrA-MWx4 zXf+2r`xSb{4~D3!MCxN_sHmtwh?ubkHoNc6e92Q2x6MI|T8bdY@Uwz~f&v0dy&1O) z_>HQ4WCR3q)e>cscye`%c)>Wx_{WbQA7v1rSIqY%?}Ln%dawYi{Ziii{QNpQJ5y3P zRPA8V#t>jt0QU`#=LbTr3)5h$+W;^OJmY#>ENf-dS6YwPOj>gZfRD=8@4_X&I} zjV$#gR~e!bC0#N>ZrP9Y&TkM2qk=pF0XJUWYQj` zrA6IN3s+5Jg8NiDwxuAV?qRbtWTzGe3ndel>S^H<^fdBT4S!ZS*i{*RCkFomq3oMr z24B?&+gtqeSB3sF`Rd<_!p%>w=VAAW{?Tu5*KJAUJBGit>NjrOW0Nm&VLh)cQAwIo zKt#%FZ!`j>YHw43g~n|q%G`{izG?#Rf7JAbCNV}V#x&cIDap2b55d~VZPOe`)}q`^ z(V0b`$d_Kq*cV(+D1kt-TTSz9MtX)l?dDmNLk(?utQW=*Z~JU_c*R_p$4)VCTdlXK z_^iQgdfoFJC)Xb2CVSUMFvHJd3Mz>Du7t9Up<`o8?SKO^NR~AhFqgubCO(I37%4~I z^|GSdUYU;MNT_g=5LpbUMV3Y-^o$DK%yXO(_bbu3XA9^pfoDY)>sq$#4Y;UW zSk{Zp)?TYr9FO9#+V3uExg=sVS2Bwucu!wEna$kLG@Lmg?t7+M<@qG9XuF0@yvS~) zj#blr{8U1s@3zK=&c>{edUizjoQhPhYqw`FMCUn6kQ)P$hb;$J_f^hHNj1>kF$?f8 z-90T$vWg_Bo~e{fe={}$ye9L>`zs~XcK2yRIu2NlF5?Cz3izj|8JMqcOCW2HtT80i z)bO68u5B5Q#d?!GsoTSK%XY4Wa3JDbmuM)n-avbIcIOQuIb?duX`$MUb)9+1xKFg$ zJNM=+E4l6)ht(p}hmsh+%#2+E+CT9Kk&}%LU-HIabmhGFlo5Gvb5o|diSjA~D$;C_ z+vc&_z&|ikGC-5+e)Ja6|5l=m{ZYNRZLEgr&d32Tfm>z65sLbBgZ9~Fr zw#*||l2uxg!8SiO_f1dC&6l{2gU3Uzwy+%N%K0ss#&`2?M`De(V$%<*@tw;nN4=WR zm%dZ2zr+1M)@ZY(jnlE2u5pH@wh8DN-A#d$*l(U-+IosUpJZE<^u?{k0dtf_j80 z5nO?LM-q+rvBZ7V26U*&XLN@b>RzZJSIGmWxs!Rw#@%<;2HezI`3{<+y}1N85dS84 zy99l%-vssG;8x-FX{SDr85W1r9#)c#l2RX+}1)6UNeS%56t4{(>mrAFWLAUTnIEh`fx_w;%CNam>m! zBODuDcxJZU)F#CsRLFt2u2Ruix6&aP5i-b*S!FUEZEou^YHhs?g+y`ygHZddL23zc zY1Mp)TTS-;1>~4G=ZT5572H=%3pp=+%~y;(wYcz9k})!^6`;pHy7v_bN4adcB{!;@3{eJ>1@okaX;xxhSRvNAB`ZnjBS%xNRXAFX<_V zOQ|?hA8akERkFyZEzxU-Bco4R{q`I6`7~@O*3(nuCs~#<< z1Yo{gfiTcdix>A+B_%V75wb_#*Bd`7S;3wW+`u&V3GUxbCMi>gC30d4<{M}%$b~G_ zQ_~FmA&<4#mWOJZftn@g?8wJcDhAxo6~Tk(wj8}L5){NT97eOwD0BPyx)gn{UUmk1OKvjImkq%a8+pSE<;>WaH z7;#ETI9LO`{|uAH8NcDj6eer(GIYG|5Z`x_1PUCj7jv=-DnF9r!gNwxzm3jwZYqVU zZrAuPV%GV}X+-3Nuop?5aQ&@GKlx(RJRqtgl}=<+lV1@so~y0yFu(Cx6IkJcJBG!X z{gpevA|lN{FeFQR--3G!ma7UxaUgh?{Fdrd5s|`fx6+%H;2ek$ZC2t-Xw^U!QT0K1 zvyAWRwiux1kBz}9pI&(FPQRFNCb}5PV>ggPPfWS>HwMjY=pvOS7U{JF+L*8v zJ@&8F1%DvsmE>zlPrw6snyVQPp3Z*CG3$uk7*yv2wZi>|rM2NNP|5kjbpx-mWcW3PfZv0l_MKsln`OCn!)%kf4DlxEQ_R zN^|hlwt}`?6|yur&UUI$Zf|be0cIKJ3{UV`vGb{|Q10JglyMrsIaLk1u+M%(fS%)_ zklbWhej1f!M1Rsg z<(#&Jc*L@lr>uM#dA@q|xOU#vy&^gc-qCR*Mguxm;@aHYMU>aY+d}p+0M!4NkTqBAttaW;Yb`d`g%&2rc2CsP&-L9~3sNbeJKg3Xy^eh) zxZw$uERB2zfk`&DySsSSzkYZ2Z}Rcaw`@NUndSz;Wkxpi@4c}6C-ndEd%FB10mf)z zGatU%yWs$c)fBYPhtKv1Z>LqFSE@9Hm~ooZN9&M-?EFo61<-OVA-_WSAzm2a<#B zDInRxvML^LqvH56>X(>8{@Ec@Qu0MX0gw3fVftF5&C8V~B`k_oiw&S*6QDq5Ocqh0 zz<=xaiHnot_R<9|5nZyz%2PghP3{j9ixIBi{oi9_^&7j33-NsYJ})>faBGd$5BIy( zETqR2@WVmgl1wV9@V;#yBROV2t_ZbkLlXq>ZOwi5D$>i7;oeB38Kj<2 zvUCHY&mp?Rr7hv?7`u*&uN0bn0ea-flwq1%yVHUMiEfmwz1k#!DzG+hJ~%PDo>#;r zUesbXM~ZxqlFt+xo^V~uXl?veTO>!H`*xcW@;>x)&VHl@Q}OgH0c%f4s=E9oUh@j} z4tmTj&~hMd?SB+J9=MWJ5Zzk{QUiZTn9m-{MWvAGo4+g$wHs*{AU&stYAZI}pIz+( zMu7T0mPhQ&cVZBX`?NNduv1&Z%S;WJ2j>?g>~MPm*jlVsZlJ%0IHV;bF)E8TeE0o} z;A-@H*Xm)X8BhR_NYEgEB`l;zlMagZk`AO##ltjx{UFUjT8LG}(U-!wxV7xPaJ>^r zq_b6UxA%FSfWr;0F(%NchTtOI0H6x_X>|H_ys;jvsLcx8%J^SU8282>D9pOs9-Fg; XY1QTHd?&$wW>6p$RTXltA_M*lFw0^3 literal 2115 zcmeAS@N?(olHy`uVBq!ia0y~yU}RxnVDjT&28yKp?OYG!Fb4R9xc>kD|KGoVfB*jd z^XJd+-@kwU{Q2X@kMG~VfBW|B>({SezI^%o`SZt*A3uEf@b2Baw{PFRe*OB@t5+{y zzI^fG#q;OSpFMl_^y$+lPo6w}{P@wMM-Lx9eDL7Gy?giW-o1P0&Yj!0Z{NIm^Tv%E z*RNl{a^=e9%a<=+ym;Zlh4bgnpF4N%?Afy?Po6w+;>7Xe$B!L5cKGn&`LBZx95}FV z-@ZM2_Uzuhd)KaAJ9qBfv17;f?c29(*|KTVrVSf5tY5!=-MV$FR;^mGV#V_1%a<-) zx@5_c#fuj&TC`}vf(7&E&!0DM-mF=(X3Ur|ZQ8V{Q>RXvG-<+w3H|;3y}i9XJw4ss z-CbQ>ot>Q>9UX0LZOzTijg5^B4Gs16^|iINH8nNW)z#(Y<<1M$%gV}1N=k~0i;Iei z^7Hfa^73+XbF;FtGBYzXGBVQB(^FDXl9Q8@l9Cb=6XWCKV`F2ZqM{-qBErJLLPA1< zgM)*Df&u~pe0_bry}iA>ygWTUJv=;ITwI);ot>PV92^|%?d|RC>}+gotgWprEG$e- zO-)QpjE#+rjEoEn4D|K&_4M>~bab?|v@|p{)YQ~eRaKRhl@$~e#blnN>j7@oSeCPA;xo^-t!2`3S|!4K`~3UEyKV38mH&40 z*1dUaZ_YXq>_6{0BO?^<5zf`rZK(*?5W{tFn9 z8ia7@J!^s6R#3=tI}PFzA~Z8F9tu$0F+&(`-=U*|?|$xQCQ2(*(}XI7Z+V1BcKk{< zgyji>ZNH|qf`bvw1y{74TzcNeP1A6S&Mk>Lb7~u}$>P+qy~-}pbqiw7&geMF%X~KD z{A*doTc7&8_q1L0R5Y2o?AvtfX>sC))pxHgS9iU$Ws$o6)MLw<1cW~qZQV2J>E$Hv zvK`ysZ&%&8yL)UDQg^s7AV_=jWHKOH-k__eR#PryW8)0Q{Ai>d?d zwwoopb7ecdKc}Rf&EeWPqu|+rKW!lbY*E6i*tPwhEw_)fHp*?uh}*Q!`u0={r-|D) zJ)0sJW!~G-QFMQ+rn1ie&j(J;?EkYzUCHdp+qb@7dkvOu+IcN!?HbEyrKFD!ZQfT` z`xq|X9+bH zZ~E!yiaj$#Rw{f+Pr7&W{t88&IUxey`1DKdii+k8mI(6zx zN72%!IhtxUU&6ngy_+w$GQGuHRmsi2_m{0+Z>c1AN`6gw%e}d-VSGISu@djkgsXlnln{8h zZI3K4d@_}LEOxH1b=2Z8gk}xRbFx~CyP7|JJhfU-f4;`8?P2rQi*M>&#k~ gAVTY*(ogBw{i{!{IjnXUSRXKWy85}Sb4q9e07SVoZvX%Q diff --git a/tests/typ/layout/pagebreak.typ b/tests/typ/layout/pagebreak.typ index 005ca2445..df3b04238 100644 --- a/tests/typ/layout/pagebreak.typ +++ b/tests/typ/layout/pagebreak.typ @@ -2,18 +2,29 @@ --- // Just a pagebreak. -// Should result in two auto-sized pages. +// Should result in two pages. #pagebreak() --- // Pagebreak, empty with styles and then pagebreak -// Should result in one auto-sized page and two conifer-colored A11 pages. +// Should result in one auto-sized page and two conifer-colored 2cm wide pages. #pagebreak() #set page(width: 2cm, fill: conifer) #pagebreak() +--- +// Two text bodies separated with and surrounded by soft pagebreaks. +// Should result in two aqua-colored pages. +#set page(fill: aqua) +#pagebreak(soft: true) +First +#pagebreak(soft: true) +Second +#pagebreak(soft: true) + --- // Test a combination of pagebreaks, styled pages and pages with bodies. +// Should result in three five pages, with the fourth one being forest-colored. #set page(width: 80pt, height: 30pt) [#set page(width: 60pt); First] #pagebreak() @@ -21,3 +32,14 @@ Third #page(height: 20pt, fill: forest)[] Fif[#set page();th] + +--- +// Test hard and soft pagebreak followed by page with body. +// Should result in three navy-colored pages. +#set page(fill: navy) +#set text(fill: white) +First +#pagebreak() +#page[Second] +#pagebreak(soft: true) +#page[Third]