From 1d78c3ed436d70ef4fe05930903bc4b0402161b6 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 15 Feb 2024 11:07:07 +0100 Subject: [PATCH] Fix `h` and `v` in stack (#3423) --- crates/typst/src/layout/stack.rs | 19 +++++++++++++++++-- tests/ref/bugs/1240-stack-fr.png | Bin 0 -> 1197 bytes tests/typ/bugs/1240-stack-fr.typ | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 tests/ref/bugs/1240-stack-fr.png create mode 100644 tests/typ/bugs/1240-stack-fr.typ diff --git a/crates/typst/src/layout/stack.rs b/crates/typst/src/layout/stack.rs index e1c266254..caa78264a 100644 --- a/crates/typst/src/layout/stack.rs +++ b/crates/typst/src/layout/stack.rs @@ -4,8 +4,8 @@ use crate::diag::SourceResult; use crate::engine::Engine; use crate::foundations::{cast, elem, Content, Packed, Resolve, StyleChain, StyledElem}; use crate::layout::{ - Abs, AlignElem, Axes, Axis, Dir, FixedAlignment, Fr, Fragment, Frame, LayoutMultiple, - Point, Regions, Size, Spacing, + Abs, AlignElem, Axes, Axis, Dir, FixedAlignment, Fr, Fragment, Frame, HElem, + LayoutMultiple, Point, Regions, Size, Spacing, VElem, }; use crate::util::{Get, Numeric}; @@ -60,6 +60,7 @@ impl LayoutMultiple for Packed { regions: Regions, ) -> SourceResult { let mut layouter = StackLayouter::new(self.dir(styles), regions, styles); + let axis = layouter.dir.axis(); // Spacing to insert before the next block. let spacing = self.spacing(styles); @@ -72,6 +73,20 @@ impl LayoutMultiple for Packed { deferred = None; } StackChild::Block(block) => { + // Transparently handle `h`. + if let (Axis::X, Some(h)) = (axis, block.to_packed::()) { + layouter.layout_spacing(*h.amount()); + deferred = None; + continue; + } + + // Transparently handle `v`. + if let (Axis::Y, Some(v)) = (axis, block.to_packed::()) { + layouter.layout_spacing(*v.amount()); + deferred = None; + continue; + } + if let Some(kind) = deferred { layouter.layout_spacing(kind); } diff --git a/tests/ref/bugs/1240-stack-fr.png b/tests/ref/bugs/1240-stack-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..29df5d44a58c49f0ec5407fc2b62789f54bd664f GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0y~yU}OQZKX3pEhQs2nxeN>}C7v#hAr-gY-u>$zRw{A) z^3XVk_Jv$?v> zVhTRc?>o!N;`=&);6>VH z18x=p2cTQfi9c>THs~7`-%vJLQz-w*V#|&Yfm?Uo1Z*64e2M(jDCgbM)o=D+b+^>z z>q|^qT~5rcT2*&%b8{NU!N0FR3%@%tE%Yb9Y-UAKO|V6ayYP~v@Z`1!)4ZMg`!lEc zPIr6mb#tQdLxF!8Q?>3e-k!PP_|p^1_?2oW-8yuxrF$iJJmimi5vPhW%Q#*y+143p^ybF9`kk)i=1nPK-)78k<$up%Dg3KXeCx`ED`L&Q zUM&^>e@peSRsYn|&Hf21nV2{f8W^w;1*?@y!rq;e{l=j_ul)UIi*>hay z{uag`sTA|`+i|{|rE5(-FK?W{5!x@KGh^2&fy8HiRVsV z;y;*a-J%-g|7MBb%`f+l+zpy$EynjSU~P%kiH&nPU#@d7%jMa%WO9I$K8?*EqJZ;Cf;&w*uAhFW#<-ZD9q_DFa5M_fB3FF8VVWhtEcZ5 z-T5d(;Z4c&r};+}Tm%;u#ol@4mM{2eo89+o?;i@zv#R^lxv_Mg(ix4l(MGFOOq`}( zvB}!Ep5wmf-|s$hJ;!`Hq;J0e=o9hwoE!7Q-Uq9Wb416Mnh3CNO%$4%Q@ZkXwR+w02t_S5D)$CIw_`*nu3)#Zi68{6C3 s@vq-XT3kPgJJ$M@Z@BzWO>@|<~cK@uo1uBO;UHx3vIVCg!01=80mH+?% literal 0 HcmV?d00001 diff --git a/tests/typ/bugs/1240-stack-fr.typ b/tests/typ/bugs/1240-stack-fr.typ new file mode 100644 index 000000000..fa49dce76 --- /dev/null +++ b/tests/typ/bugs/1240-stack-fr.typ @@ -0,0 +1,18 @@ +// This issue is sort of horrible: When you write `h(1fr)` in a `stack` instead +// of directly `1fr`, things go awry. To fix this, we now transparently detect +// h/v children. +// +// https://github.com/typst/typst/issues/1240 + +--- +#stack(dir: ltr, [a], 1fr, [b], 1fr, [c]) +#stack(dir: ltr, [a], h(1fr), [b], h(1fr), [c]) + +--- +#set page(height: 60pt) +#stack( + dir: ltr, + spacing: 1fr, + stack([a], 1fr, [b]), + stack([a], v(1fr), [b]), +)