skip layout of redundant gutter at the top of footer

This commit is contained in:
PgBiel 2025-06-21 23:36:31 -03:00
parent 315612b1f7
commit d13617ed9b
4 changed files with 32 additions and 4 deletions

View File

@ -232,7 +232,7 @@ pub(super) enum Row {
impl Row {
/// Returns the `y` index of this row.
fn index(&self) -> usize {
pub(super) fn index(&self) -> usize {
match self {
Self::Frame(_, y, _) => *y,
Self::Fr(_, y, _) => *y,

View File

@ -679,9 +679,23 @@ impl<'a> GridLayouter<'a> {
let footer_len = footer.range.end - footer.range.start;
self.unbreakable_rows_left += footer_len;
// TODO(subfooters): also consider omitted gutter before the footer
// when there is a header right before it taking it.
for y in footer.range.clone() {
let footer_start = if self.grid.is_gutter_track(footer.range.start)
&& self
.current
.lrows
.last()
.is_none_or(|r| self.grid.is_gutter_track(r.index()))
{
// Skip gutter at the top of footer if there's already a gutter
// from a repeated header right before it in the current region.
// Normally, that shouldn't happen as it indicates we have a widow,
// but we can't fully prevent widows anyway.
footer.range.start + 1
} else {
footer.range.start
};
for y in footer_start..footer.range.end {
self.layout_row_with_state(
y,
engine,

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B

View File

@ -41,6 +41,20 @@
)
)
--- grid-footer-gutter-short-lived ---
// Gutter, no repetition, short-lived
#set page(height: 6em)
#set text(6pt)
#set table(inset: 2pt, stroke: 0.5pt)
#table(
gutter: 2pt,
align: center + horizon,
table.header([a]),
table.footer([b]),
table.footer([c]),
[d],
)
--- grid-cell-override-in-header-and-footer ---
#table(
table.header(table.cell(stroke: red)[Hello]),