From 03a766444a2770246a847f71980aebe71964e3af Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 14 Oct 2024 17:36:29 +0200 Subject: [PATCH] Put floats back above footnotes instead of below (#5204) --- crates/typst/src/layout/flow/compose.rs | 26 ++++++++++++------ .../ref/footnote-break-across-pages-float.png | Bin 1414 -> 1428 bytes tests/ref/footnote-in-place.png | Bin 1103 -> 1110 bytes 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/crates/typst/src/layout/flow/compose.rs b/crates/typst/src/layout/flow/compose.rs index 4b991f2b2..a262d5c1f 100644 --- a/crates/typst/src/layout/flow/compose.rs +++ b/crates/typst/src/layout/flow/compose.rs @@ -634,6 +634,23 @@ impl<'a, 'b> Insertions<'a, 'b> { output.push_frame(Point::with_y(self.top_size), inner); + // We put floats first and then footnotes. This differs from what LaTeX + // does and is a little inconsistent w.r.t column vs page floats (page + // floats are below footnotes because footnotes are per column), but + // it's what most people (including myself) seem to intuitively expect. + // We experimented with the LaTeX ordering in 0.12.0-rc1, but folks were + // surprised and considered this strange. In LaTeX, it can be changed + // with `\usepackage[bottom]{footmisc}`. We could also consider adding + // configuration in the future. + for (placed, frame) in self.bottom_floats { + offset_bottom += placed.clearance; + let x = placed.align_x.position(size.x - frame.width()); + let y = offset_bottom; + let delta = placed.delta.zip_map(size, Rel::relative_to).to_point(); + offset_bottom += frame.height(); + output.push_frame(Point::new(x, y) + delta, frame); + } + if let Some(frame) = self.footnote_separator { offset_bottom += config.footnote.clearance; let y = offset_bottom; @@ -648,15 +665,6 @@ impl<'a, 'b> Insertions<'a, 'b> { output.push_frame(Point::with_y(y), frame); } - for (placed, frame) in self.bottom_floats { - offset_bottom += placed.clearance; - let x = placed.align_x.position(size.x - frame.width()); - let y = offset_bottom; - let delta = placed.delta.zip_map(size, Rel::relative_to).to_point(); - offset_bottom += frame.height(); - output.push_frame(Point::new(x, y) + delta, frame); - } - output } } diff --git a/tests/ref/footnote-break-across-pages-float.png b/tests/ref/footnote-break-across-pages-float.png index 94f8a587eee74c39eb370e3c3c574cb73b31a257..5d3ea1078ae1684d5e42c20cf9b5e9c857fa1f25 100644 GIT binary patch delta 1409 zcmV-{1%CR53zQ3xB!5p(OjJex|Nj600Dypie}8`{C@B8^{-vd*?(g&6-{<%D`ThO< z`}_Q-r>7ns9&m7Q_4W1g^77~B=i1uZ%gf7+jg6?NsG_2x_V)Jf?(SS%T(`HkI5;>W zA|lz@*?_+Nr6j zOiWD6%+Ro~uz&RQ^kHFP)79NEF)`54&^b9d*xKT1YHC zaB_M|OjM||jSYiewCb$5S@jg`j8(4wQKtE{lPyu^@_n#0A-W@vEr z_4l!{vB1E|J&-GANPH#awUczAbrcbuG@y}iA` z!NE2*HaVN8*nwo5EY?hXm`1tt9$jHaX$NBmBm6es7o13+@wQX%}t*xz;l$3mYe5`+cSr#bRtC9j*v2_ojr9W+CLZ9c3P zNbtg2DpX%sX+MV!J@*8mweQRb%%;{7tRZW z*B?G|{NyQ#7mr|ALD+kQAOCYP?9A}8Ra372r28L~d%(A-Im+A$~CK#D8c1 zW{B`UR)~~+65*o-(Cn26Z_fu-NQ8Adxp3~v8Yt)Iz2Pjz2PjTcl9(C| z30re_+aaQ3Pbg%V*Fr+9*%S;B!8~mDcMmce?nB0-7>Kx1FBHCNh+7U3J!|rKVB`{Z zLwgS-WMyYnK|*Y1hA(8S>VSkQ7#>4H^|}mR7`ce8(*_Bezz~SYIFJwp33_R_iY<_k zRC4_qB-k1Uth_LCsmo{2)xRi)dfsPFBfb^t-8fNzB}*kj9o@Z?6CMEpmA8?e2LU0eSiI=}3U3n%8+Pp6Wq|+<01c0uh{nG^jZ07MrZ#Jc P00000NkvXXu0mjfX?oR6 delta 1395 zcmV-(1&sQX3x*4jB!5g$OjJex|Nnn~fA{zIh=_=Xhll+9{H3L(j*gDMzrT}{ljGy# z;^N|;pP#F%t9*QXl$4aMt*vcsZE$dK_4W0&wYBo{^7;As?(XhfTwI!(nrv)rI5;>W zA|mSQ>ged`ARr*1prDzVnT(8#FE20P;NaZc+<}3CBqSs-Fn=&5B_$ml9Y#h*-rnAW zgM;7S-$Ft{NJvO&X=#s-k92f&85tS3x3`>}oLX91ot>TW@$o)BKE1uY)z{yVlbf!v zxI{!m_4W79(b=)FvB1E<(9+t|)!l}OkT*9s-QC@xp`paY#KpzMuCA_&i;G!VS@7`i zVPk8{%+RT;vwxYIp2o<~i;b15tgxb^r<0YPw6?xwXK$FAqQ1b$f`p8trLD!s&xneW zmzbQLo}#?H!P(p6>FVxSSzT{&dDz^r@+-OiWBzSXgRmYE)EILqkJ`hK9SlyR59NkbjVn*x1-{ad9&3_v9mX%umE4pz7?<~h9P@P_TV zWn8~6@IMbbH*a>%H4qVva`O`)qJ2RCM6@km0SSFyU%zS)d2n@2(;BwZU&rGn z@_&eq$+2cD)NB3|3B*9XNg)8Dp`JMuG7QroV@gsW;O~TbQ{4fynk*YA|gqC!-Dr{hs6)Zm)Q62hKT+>=_r3B z5#Epn=R=9``cz=4MA&AN3+KG7fpVR8JNgRwt%y(3?u3Z;+?xfE&}eDZLqw5D2MM}- zS0f}ey@}KF!ib272Dud&vg^=zokKHJSOc$fGt4l<3^U9y!wfUbFvAQp%rL_YkALm( zt@G#3oIcg5K5V;i@oeTvyFmCz#))Ic1;QDJ4rd-smw53YhWQVK;gN+MZm)9;6^2Fu zegQ*7p72))|MEn{F;-?s@e5;j7{k{F0slPDBkYmI*b5kaf6d0^xfT5E3*B;@7hRY5{ZesK?E zJdS{bDp*%SLiMv^UKn|aE7S!E&ae)MD863b3<;&zvJ8+=yLHQENN~ma>uh*o002ovPDHLkV1g&_ B(9-|_ diff --git a/tests/ref/footnote-in-place.png b/tests/ref/footnote-in-place.png index fa5e1bd1e362b6fb9ff76b41016f00ff7125f2d8..b500ac80f47b0d90ad779dd813601a5f5ad2cf3b 100644 GIT binary patch delta 1089 zcmV-H1it&v2-XOYB!2`@OjJex|Nj600F;!J_4V~TJ3Hv;=-b=d{QUgj;NbW7_n@Gl zzrVjxQBh`QW>{EQnwpv{EG#@cJa2DrmX?;^-{05Q*U-?=+S=NKgM-P*$+@|?tgNhl zetvj(c)Gf}Y;0_CadFbp(sOfjVq#)WPEO+D;+UA2@$vCXOMgqAo}Sp)*l=)grKP1) zQ&W6=e20gJwY9bT`}@Jc!9qep)z#Jb`1q!#rZzSFMdi!^6kP(Za;c znw+GQm7Unw+JCOFxTB@5tgNot+1b6ly+J`ifPjFOmz{!xiLkP|sjIV$j+SwAdwY9( z#l^*BWMu2?@JLEh+1umV+~ofL{$XKZJv}|`?(*#I@myYJh>DUxLQ3G_mVN`awfW{eS)ag@uKytE+c+cci4Gc6N5f z$In?=S!ro$O-)TYIy#e+lcJ)cWo2cXo12P?ild{Ws;a7yk&%6UeSv|2hK7cMf`YTN zv&P28%gf7-j*du3NcZ>o`T6;$r>D=)&tqd_jg5`m+}z{im>+9>F@VUwW00Iq3L_t(|+U?hMPg`LWfbj<@QcBCJSdk6c z#*~e@ySux)Fn49baQBwBl=fcwC6^HXSyD)v+6Q z;k`n9ecv0=ky1Zh*k8Q{9X)yUnz&+bYFB&EkAI>l#O3c@=_pP@IIRZib}lzQoVp~& zhFxZKqpGT`6d{BVv)}kc0>;r!N-O~>T82r0ge5Ft2}@YQ5|*%pB`jeH|EJ;fi3Fsh zowQg2(&VfcdU$3+V_DyF`v*df5b=#LNqzd@J{s#Z^D>Z4TtoSJQ{je(DjMth_2E@G zH-Ai#t-ZCah3=m4yh1NUi*f)+hu$FEyHWpG^Kes37ZzthF?R|4;ENy2s?D3ciYMIZSd>aLIk z%Y4JT_sXIa;%}8YBlHuSk$lX*WbEWIAOpjxCyqnr9^=dE(Ie1v`mFKc!-t^r)EVQ$ zib8qwmYQ`*2)}C@qF`+%#u^(Oe47)%onw*-7aDtU?!0Mkb88r*sTVF%>e{{oqdHx` ze2KCJ-rA&Wt}=JYill_?E-ET9STqtbS(Xl)Wz2*S;!nQ;ry>9lrafK*00000NkvXX Hu0mjf>VRC| delta 1082 zcmV-A1jYN-2+s(RB!2-=OjJex|NpzYyF^4p?(g&6-{ALm*L^z*x1;X zmX=*zU2bk}adC0Q#l<{4JWxmyn1|u zk&~NaWNL(ki+_!emvwi4)z{x(VrrY5qI!FQr>U{6ueYwSxRaHgh>DV_tFxP&pv=wD z(bL=0)!m_?p(`sZpP!%7($YRYKF-e0i;Ih=r>8+dL2GMklarHaX=zAENLg7~^78WS z?d^7Ub~rdVGBPq!Qc^-fLe|#SoSdAhs;aWGvWSR?jDL)b+1c4mO-<$He@5;)`-{0RxMn+gzSXEV3KtMp%)z#gwtyCMN6a>;C@! z;Nalh-GAMRii-91^#A|>zw#&90006BNklA!%}D!1;ZFCvV=IlN^K)Vn*1@R9*zp(bhdGiEV!V3>~Sv zrwZGeAE2WxyH=A>sQ$>|L+D3URT8o-AFeuRLVq~67;+Ef7$06(6vDZGAG%Q#MOKOs zLR){Pg??hwl8>29(r?@Z@-dup{R;Rxhm8+ky9y=FZsWtZZbNb1GULOlN^eO;W0MKt zS1+4sS{lPx3)0hHx3uAJ>5&PawQ?{=#)XU7_VThyjHX<=Oig9Q5{$O##7SzacGj7) zxqoUaA9lLU2-j@mM-~RNSgqOBj~;tvyoC@#h(yv-laPjXCR36ysb!cXNLa!Wmav2+ zEMW;tSi%yP@Ei?Kq$Xhk?L7VhtG<`=l{0x%D3d9eQYF+E=VlYzcod-y%URz8n15T&@tapzw+PEl3O!vPmC z=;>)}2$J~($5#eDbc_)OU>#Jf&?Ow1Ume0TG&-`fKH%qRSNA~PP=L19z&JqF+A}q5 z*a#M@)q+0CRuO%J3Ci1h@7>1?k!V=fsSy8{zX5i)bvkyk4*&oF07*qoM6N<$f&=bQ Au>b%7