From 3594e3e767ca709d8158090391236a05890cad4d Mon Sep 17 00:00:00 2001 From: Malo <57839069+MDLC01@users.noreply.github.com> Date: Wed, 19 Feb 2025 00:59:56 +0100 Subject: [PATCH 1/2] Add `align` parameter to `stack` --- crates/typst-layout/src/stack.rs | 16 ++++++++++++++-- crates/typst-library/src/layout/stack.rs | 11 +++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/crates/typst-layout/src/stack.rs b/crates/typst-layout/src/stack.rs index c468945eb..196f9390a 100644 --- a/crates/typst-layout/src/stack.rs +++ b/crates/typst-layout/src/stack.rs @@ -1,6 +1,8 @@ use typst_library::diag::{bail, SourceResult}; use typst_library::engine::Engine; -use typst_library::foundations::{Content, Packed, Resolve, StyleChain, StyledElem}; +use typst_library::foundations::{ + Content, Packed, Resolve, Smart, StyleChain, StyledElem, +}; use typst_library::introspection::{Locator, SplitLocator}; use typst_library::layout::{ Abs, AlignElem, Axes, Axis, Dir, FixedAlignment, Fr, Fragment, Frame, HElem, Point, @@ -27,6 +29,8 @@ pub fn layout_stack( let spacing = elem.spacing(styles); let mut deferred = None; + let align = elem.align(styles); + for child in &elem.children { match child { StackChild::Spacing(kind) => { @@ -52,7 +56,15 @@ pub fn layout_stack( layouter.layout_spacing(kind); } - layouter.layout_block(engine, block, styles)?; + if let Smart::Custom(alignment) = align { + layouter.layout_block( + engine, + &block.clone().aligned(alignment), + styles, + )?; + } else { + layouter.layout_block(engine, block, styles)?; + } deferred = spacing; } } diff --git a/crates/typst-library/src/layout/stack.rs b/crates/typst-library/src/layout/stack.rs index 5fc78480e..3660b50ed 100644 --- a/crates/typst-library/src/layout/stack.rs +++ b/crates/typst-library/src/layout/stack.rs @@ -2,8 +2,10 @@ use std::fmt::{self, Debug, Formatter}; use crate::diag::SourceResult; use crate::engine::Engine; -use crate::foundations::{cast, elem, Content, NativeElement, Packed, Show, StyleChain}; -use crate::layout::{BlockElem, Dir, Spacing}; +use crate::foundations::{ + cast, elem, Content, NativeElement, Packed, Show, Smart, StyleChain, +}; +use crate::layout::{Alignment, BlockElem, Dir, Spacing}; /// Arranges content and spacing horizontally or vertically. /// @@ -42,6 +44,11 @@ pub struct StackElem { /// Spacing to insert between items where no explicit spacing was provided. pub spacing: Option, + /// How to align the items. + /// + /// If set to `{auto}`, the outer alignment is used. + pub align: Smart, + /// The children to stack along the axis. #[variadic] pub children: Vec, From af67206bdfe3a39c6ebc367b69fb038e8d2d579f Mon Sep 17 00:00:00 2001 From: Malo <57839069+MDLC01@users.noreply.github.com> Date: Wed, 19 Feb 2025 01:00:05 +0100 Subject: [PATCH 2/2] Add test --- tests/ref/stack-align.png | Bin 0 -> 1762 bytes tests/suite/layout/stack.typ | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 tests/ref/stack-align.png diff --git a/tests/ref/stack-align.png b/tests/ref/stack-align.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4912db807d14885ea2fd92123bf761832ff676 GIT binary patch literal 1762 zcmV<81|9i{P)r+#A9>?+i6Wb^IV8`y-wVk!?R=12+hQ(17q=;4OS{82zyCOv7A~#bJVi1)}B~UOD zAVNZ511KnpKv#lXm$e9{5FkJj2)PGIBDsDFwbL1`)9G}2e(B}BpPfgqNzVEGzQ1!` zftPxPhH03FY511_*S}Wd9T;oiC3qbTlj>EMcVKaB?QdiqPiWzqamt|6kcAT;@3jAS zZRODzfv=7zZ0ZXdz`N*3$EkjzaI`c<0v~jyA)$wASgXUgIW~5LWRLt#ows|*FOOo_ zzPkckJHAOX`$Vad>SfZYH*Qc2qnHmPzT2@8D&bp&lPmCak_j!Pd_nUyak3J#0wK^; z{w|g9aHssx3XH8fNv_8q>UE={JcP`}S2ytR5tXpBTDWBu-lgx4G#6!}9YCI3XMF@s<8Th7@58F(Ps+cFl z=kX0T*kWAC^#&YY4{D(0@jFbo=T`T3kGr0`O%x@Fu8-hXM-N718LcX5`6JE+ij7<)%7B5rDBy z4aHsrS#DlJN;N|DvIwA<1ndK-_9FB0*)gQtNBGn#EF%H0abau+SQZZu(~8jHncYg% z5rDhTH$jjiD>-pEd^)#Eog+lf=eXh~^;A3d0aq2?crnl9)b!KeGHIBGY53;@&vChP zUV*`6!aFdBL&JpNq9X6Wx(`0kc?EWwOwQlV1~Sul#xnKKzN8zK@pDAsT1#m){JXVp zKCLPv3Qv@z=3uAU;fscgMBxCdkcGc%EItrslY(vW9ayZ*uSx8WY`h&QXC*(yYI8?s zDTcuop~Q*r6egn*cFh3!b_&Ml~4FOOmx|NNl)Q^`Eq|7tDX>)6a|Q#1v)_?)E>wo9x7hMpc}@5qC~ z>nR0~dW}Q97F*{GFeaU}6B!awcan#iy>ZG^g#6_ay1DJdVGPFM{|sdCy#cc;Ac-Ik zABTVe@j2qKdR-2(aTeQ6%lJF!?&l8w&Mm~+H(3rJ@80Md3A37_9e$?7 zuo_3Un^HJX4HU=mb1bZ8?4O+q2S4h1uJP(;fEbj*A?@(+QvqbH!1AdBXgC3&j7#}b zJ>bXgH2Y>&=(okrug|x>U1{^r;2AtFR(OiLx@Lpee2(d;tBG z7ZyE5ytgQXYYLlQUxl$p*};M@Y-^Xg(y{qgWFfB>|Dq61l20F&tit=0vpesn!r_aD z#}!-5Mte*vm49_t1<-y3oB{-mkBc;bc_Vrb;SISk-T zcd^e8r}K?_q7U6_N}Z@;E<8NVb9nOeYyb0O;oHpTmTNt}uVguFte0#1Y%o?>7P`F{#EgQ5>176H+_0l}fxJMpdu4Ro{gOVQ-hlfVKJchJR5Qoj2 zsz9&6S$9+cIMeDN4uA1UbIkZ)tdu_9(l8Cv@UIsB3My$1>W@g;X8-^I07*qoM6N<$ Eg4MxS#sB~S literal 0 HcmV?d00001 diff --git a/tests/suite/layout/stack.typ b/tests/suite/layout/stack.typ index aad273a5b..9d64188c0 100644 --- a/tests/suite/layout/stack.typ +++ b/tests/suite/layout/stack.typ @@ -89,3 +89,10 @@ World! 🌍 // Error: 3-40 stack spacing is infinite stack(spacing: infinite-length)[A][B] }) + +--- stack-align --- +#set align(center) +#set stack(align: end) +#stack[I][am][aligned][to][the][right!] +#stack(align: auto)[I][am][aligned][to][the][center!] +#stack(dir: rtl, align: horizon)[Aligned \ at][horizon.]