Merge af67206bdfe3a39c6ebc367b69fb038e8d2d579f into 9b09146a6b5e936966ed7ee73bce9dd2df3810ae

This commit is contained in:
Malo 2025-05-06 21:18:09 +00:00 committed by GitHub
commit f60cfc94d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 30 additions and 4 deletions

View File

@ -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;
}
}

View File

@ -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<Spacing>,
/// How to align the items.
///
/// If set to `{auto}`, the outer alignment is used.
pub align: Smart<Alignment>,
/// The children to stack along the axis.
#[variadic]
pub children: Vec<StackChild>,

BIN
tests/ref/stack-align.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -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.]