summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2024-10-08 15:13:14 +0200
committerLaurenz <laurmaedje@gmail.com>2024-10-15 15:06:36 +0200
commit0abd417640bbb8d98c937293a4960ac3ec8a5b50 (patch)
tree8b0f4f3e211e49befe82c11947e0c770d0eb57a8 /crates
parentf8a218f59755e83d215f035c942c122fcef27abd (diff)
Allow sticky blocks to be breakable (#5161)
Diffstat (limited to 'crates')
-rw-r--r--crates/typst/src/layout/container.rs2
-rw-r--r--crates/typst/src/layout/flow/collect.rs4
-rw-r--r--crates/typst/src/layout/flow/distribute.rs8
3 files changed, 7 insertions, 7 deletions
diff --git a/crates/typst/src/layout/container.rs b/crates/typst/src/layout/container.rs
index 996ef6c9..9fdef0be 100644
--- a/crates/typst/src/layout/container.rs
+++ b/crates/typst/src/layout/container.rs
@@ -422,8 +422,6 @@ pub struct BlockElem {
/// This is, by default, set on heading blocks to prevent orphaned headings
/// at the bottom of the page.
///
- /// Marking a block as sticky makes it unbreakable.
- ///
/// ```example
/// >>> #set page(height: 140pt)
/// // Disable stickiness of headings.
diff --git a/crates/typst/src/layout/flow/collect.rs b/crates/typst/src/layout/flow/collect.rs
index 9fc64f06..a477c334 100644
--- a/crates/typst/src/layout/flow/collect.rs
+++ b/crates/typst/src/layout/flow/collect.rs
@@ -189,7 +189,7 @@ impl<'a> Collector<'a, '_, '_> {
self.output.push(spacing(elem.above(styles)));
- if !breakable || sticky || fr.is_some() {
+ if !breakable || fr.is_some() {
self.output.push(Child::Single(self.boxed(SingleChild {
align,
sticky,
@@ -203,6 +203,7 @@ impl<'a> Collector<'a, '_, '_> {
let alone = self.children.len() == 1;
self.output.push(Child::Multi(self.boxed(MultiChild {
align,
+ sticky,
alone,
elem,
styles,
@@ -375,6 +376,7 @@ fn layout_single_impl(
#[derive(Debug)]
pub struct MultiChild<'a> {
pub align: Axes<FixedAlignment>,
+ pub sticky: bool,
alone: bool,
elem: &'a Packed<BlockElem>,
styles: StyleChain<'a>,
diff --git a/crates/typst/src/layout/flow/distribute.rs b/crates/typst/src/layout/flow/distribute.rs
index 65516ccd..a30b71ba 100644
--- a/crates/typst/src/layout/flow/distribute.rs
+++ b/crates/typst/src/layout/flow/distribute.rs
@@ -247,7 +247,7 @@ impl<'a, 'b> Distributor<'a, 'b, '_, '_, '_> {
// Lay out the block.
let (frame, spill) = multi.layout(self.composer.engine, self.regions)?;
- self.frame(frame, multi.align, false, true)?;
+ self.frame(frame, multi.align, multi.sticky, true)?;
// If the block didn't fully fit into the current region, save it into
// the `spill` and finish the region.
@@ -292,9 +292,9 @@ impl<'a, 'b> Distributor<'a, 'b, '_, '_, '_> {
breakable: bool,
) -> FlowResult<()> {
if sticky {
- // If the frame is sticky and we haven't remember a preceding sticky
- // element, make a checkpoint which we can restore should we end on
- // this sticky element.
+ // If the frame is sticky and we haven't remembered a preceding
+ // sticky element, make a checkpoint which we can restore should we
+ // end on this sticky element.
if self.stickable && self.sticky.is_none() {
self.sticky = Some(self.snapshot());
}