diff --git a/library/src/meta/figure.rs b/library/src/meta/figure.rs index 548233c45..2082701bd 100644 --- a/library/src/meta/figure.rs +++ b/library/src/meta/figure.rs @@ -70,9 +70,14 @@ use crate::visualize::ImageElem; /// ) /// ``` /// +/// If your figure is too large and its contents are breakable across pages +/// (e.g. if it contains a large table), then you can make the figure breakable +/// across pages as well by using `#show figure: set block(breakable: true)` +/// (see the [block]($func/block) documentation for more information). +/// /// Display: Figure /// Category: meta -#[element(Locatable, Synthesize, Count, Show, Refable)] +#[element(Locatable, Synthesize, Count, Show, Finalize, Refable)] pub struct FigureElem { /// The content of the figure. Often, an [image]($func/image). #[required] @@ -254,12 +259,18 @@ impl Show for FigureElem { // We wrap the contents in a block. Ok(BlockElem::new() .with_body(Some(realized)) - .with_breakable(false) .pack() .aligned(Axes::with_x(Some(Align::Center.into())))) } } +impl Finalize for FigureElem { + fn finalize(&self, realized: Content, _: StyleChain) -> Content { + // Allow breakable figures with `show figure: set block(breakable: true)`. + realized.styled(BlockElem::set_breakable(false)) + } +} + impl Count for FigureElem { fn update(&self) -> Option { // If the figure is numbered, step the counter by one. diff --git a/tests/ref/meta/figure.png b/tests/ref/meta/figure.png index 4969e5a0e..593c6438a 100644 Binary files a/tests/ref/meta/figure.png and b/tests/ref/meta/figure.png differ diff --git a/tests/typ/meta/figure.typ b/tests/typ/meta/figure.typ index 3537bbe14..81db3edf0 100644 --- a/tests/typ/meta/figure.typ +++ b/tests/typ/meta/figure.typ @@ -101,4 +101,11 @@ We can clearly see that @fig-cylinder and println!("Hello, world!"); } ``` -] \ No newline at end of file +] + +--- +// Test breakable figures +#set page(width: 200pt, height: 6em) +#show figure: set block(breakable: true) + +#figure(table[a][b][c][d][e], caption: [A table])