From cd717415324a8ddfbcb61a44a6103df394516c51 Mon Sep 17 00:00:00 2001 From: PgBiel <9021226+PgBiel@users.noreply.github.com> Date: Thu, 25 Jan 2024 12:35:10 -0300 Subject: [PATCH] Merging cells: Colspans [More Flexible Tables Pt.3a] (#3239) --- crates/typst/src/layout/grid/layout.rs | 737 +++++++++++++++++++++---- crates/typst/src/layout/grid/mod.rs | 12 +- crates/typst/src/model/enum.rs | 1 - crates/typst/src/model/list.rs | 1 - crates/typst/src/model/table.rs | 14 +- crates/typst/src/util/mod.rs | 29 + tests/ref/layout/grid-colspan.png | Bin 0 -> 91434 bytes tests/ref/layout/grid-rtl.png | Bin 1752 -> 41422 bytes tests/typ/layout/grid-colspan.typ | 141 +++++ tests/typ/layout/grid-rtl.typ | 81 +++ 10 files changed, 894 insertions(+), 122 deletions(-) create mode 100644 tests/ref/layout/grid-colspan.png create mode 100644 tests/typ/layout/grid-colspan.typ diff --git a/crates/typst/src/layout/grid/layout.rs b/crates/typst/src/layout/grid/layout.rs index 756d426fd..f9957fcb1 100644 --- a/crates/typst/src/layout/grid/layout.rs +++ b/crates/typst/src/layout/grid/layout.rs @@ -1,3 +1,5 @@ +use std::num::NonZeroUsize; + use ecow::eco_format; use crate::diag::{ @@ -14,7 +16,7 @@ use crate::layout::{ }; use crate::syntax::Span; use crate::text::TextElem; -use crate::util::Numeric; +use crate::util::{MaybeReverseIter, NonZeroExt, Numeric}; use crate::visualize::{FixedStroke, Geometry, Paint}; /// A value that can be configured per cell. @@ -93,12 +95,14 @@ pub struct Cell { pub body: Content, /// The cell's fill. pub fill: Option, + /// The amount of columns spanned by the cell. + pub colspan: NonZeroUsize, } impl From for Cell { /// Create a simple cell given its body. fn from(body: Content) -> Self { - Self { body, fill: None } + Self { body, fill: None, colspan: NonZeroUsize::ONE } } } @@ -113,6 +117,28 @@ impl LayoutMultiple for Cell { } } +/// A grid entry. +#[derive(Clone)] +enum Entry { + /// An entry which holds a cell. + Cell(Cell), + /// An entry which is merged with another cell. + Merged { + /// The index of the cell this entry is merged with. + parent: usize, + }, +} + +impl Entry { + /// Obtains the cell inside this entry, if this is not a merged cell. + fn as_cell(&self) -> Option<&Cell> { + match self { + Self::Cell(cell) => Some(cell), + Self::Merged { .. } => None, + } + } +} + /// Used for cell-like elements which are aware of their final properties in /// the table, and may have property overrides. pub trait ResolvableCell { @@ -135,6 +161,9 @@ pub trait ResolvableCell { /// Returns this cell's row override. fn y(&self, styles: StyleChain) -> Smart; + /// The amount of columns spanned by this cell. + fn colspan(&self, styles: StyleChain) -> NonZeroUsize; + /// The cell's span, for errors. fn span(&self) -> Span; } @@ -142,76 +171,24 @@ pub trait ResolvableCell { /// A grid of cells, including the columns, rows, and cell data. pub struct CellGrid { /// The grid cells. - cells: Vec, + entries: Vec, /// The column tracks including gutter tracks. cols: Vec, /// The row tracks including gutter tracks. rows: Vec, /// Whether this grid has gutters. has_gutter: bool, - /// Whether this is an RTL grid. - is_rtl: bool, } impl CellGrid { - /// Generates the cell grid, given the tracks and resolved cells. + /// Generates the cell grid, given the tracks and cells. pub fn new( tracks: Axes<&[Sizing]>, gutter: Axes<&[Sizing]>, - cells: Vec, - styles: StyleChain, + cells: impl IntoIterator, ) -> Self { - let mut cols = vec![]; - let mut rows = vec![]; - - // Number of content columns: Always at least one. - let c = tracks.x.len().max(1); - - // Number of content rows: At least as many as given, but also at least - // as many as needed to place each item. - let r = { - let len = cells.len(); - let given = tracks.y.len(); - let needed = len / c + (len % c).clamp(0, 1); - given.max(needed) - }; - - let has_gutter = gutter.any(|tracks| !tracks.is_empty()); - let auto = Sizing::Auto; - let zero = Sizing::Rel(Rel::zero()); - let get_or = |tracks: &[_], idx, default| { - tracks.get(idx).or(tracks.last()).copied().unwrap_or(default) - }; - - // Collect content and gutter columns. - for x in 0..c { - cols.push(get_or(tracks.x, x, auto)); - if has_gutter { - cols.push(get_or(gutter.x, x, zero)); - } - } - - // Collect content and gutter rows. - for y in 0..r { - rows.push(get_or(tracks.y, y, auto)); - if has_gutter { - rows.push(get_or(gutter.y, y, zero)); - } - } - - // Remove superfluous gutter tracks. - if has_gutter { - cols.pop(); - rows.pop(); - } - - // Reverse for RTL. - let is_rtl = TextElem::dir_in(styles) == Dir::RTL; - if is_rtl { - cols.reverse(); - } - - Self { cols, rows, cells, has_gutter, is_rtl } + let entries = cells.into_iter().map(Entry::Cell).collect(); + Self::new_internal(tracks, gutter, entries) } /// Resolves and positions all cells in the grid before creating it. @@ -257,7 +234,7 @@ impl CellGrid { let Some(cell_count) = cells.len().checked_add((c - cells.len() % c) % c) else { bail!(span, "too many cells were given") }; - let mut resolved_cells: Vec> = Vec::with_capacity(cell_count); + let mut resolved_cells: Vec> = Vec::with_capacity(cell_count); for cell in cells.iter().cloned() { let cell_span = cell.span(); // Let's calculate the cell's final position based on its @@ -270,6 +247,23 @@ impl CellGrid { }; let x = resolved_index % c; let y = resolved_index / c; + let colspan = cell.colspan(styles).get(); + + if colspan > c - x { + bail!( + cell_span, + "cell's colspan would cause it to exceed the available column(s)"; + hint: "try placing the cell in another position or reducing its colspan" + ) + } + + let Some(largest_index) = resolved_index.checked_add(colspan - 1) else { + bail!( + cell_span, + "cell would span an exceedingly large position"; + hint: "try reducing the cell's colspan" + ) + }; // Let's resolve the cell so it can determine its own fields // based on its final position. @@ -282,7 +276,7 @@ impl CellGrid { styles, ); - if resolved_index >= resolved_cells.len() { + if largest_index >= resolved_cells.len() { // Ensure the length of the vector of resolved cells is always // a multiple of 'c' by pushing full rows every time. Here, we // add enough absent positions (later converted to empty cells) @@ -292,7 +286,7 @@ impl CellGrid { // eventually susceptible to show rules and receive grid // styling, as they will be resolved as empty cells in a second // loop below. - let Some(new_len) = resolved_index + let Some(new_len) = largest_index .checked_add(1) .and_then(|new_len| new_len.checked_add((c - new_len % c) % c)) else { @@ -322,11 +316,30 @@ impl CellGrid { ); } - *slot = Some(cell); + *slot = Some(Entry::Cell(cell)); + + // Now, if the cell spans more than one column, we fill the spanned + // positions in the grid with Entry::Merged pointing to the + // original cell as its parent. + for (offset, slot) in resolved_cells[resolved_index..][..colspan] + .iter_mut() + .enumerate() + .skip(1) + { + if slot.is_some() { + let spanned_x = x + offset; + bail!( + cell_span, + "cell would span a previously placed cell at column {spanned_x}, row {y}"; + hint: "try specifying your cells in a different order or reducing the cell's colspan" + ) + } + *slot = Some(Entry::Merged { parent: resolved_index }); + } } // Replace absent entries by resolved empty cells, and produce a vector - // of 'Cell' from 'Option' (final step). + // of 'Entry' from 'Option' (final step). let resolved_cells = resolved_cells .into_iter() .enumerate() @@ -347,40 +360,119 @@ impl CellGrid { inset, styles, ); - Ok(new_cell) + Ok(Entry::Cell(new_cell)) } }) - .collect::>>()?; + .collect::>>()?; - Ok(Self::new(tracks, gutter, resolved_cells, styles)) + Ok(Self::new_internal(tracks, gutter, resolved_cells)) } - /// Get the content of the cell in column `x` and row `y`. + /// Generates the cell grid, given the tracks and resolved entries. + fn new_internal( + tracks: Axes<&[Sizing]>, + gutter: Axes<&[Sizing]>, + entries: Vec, + ) -> Self { + let mut cols = vec![]; + let mut rows = vec![]; + + // Number of content columns: Always at least one. + let c = tracks.x.len().max(1); + + // Number of content rows: At least as many as given, but also at least + // as many as needed to place each item. + let r = { + let len = entries.len(); + let given = tracks.y.len(); + let needed = len / c + (len % c).clamp(0, 1); + given.max(needed) + }; + + let has_gutter = gutter.any(|tracks| !tracks.is_empty()); + let auto = Sizing::Auto; + let zero = Sizing::Rel(Rel::zero()); + let get_or = |tracks: &[_], idx, default| { + tracks.get(idx).or(tracks.last()).copied().unwrap_or(default) + }; + + // Collect content and gutter columns. + for x in 0..c { + cols.push(get_or(tracks.x, x, auto)); + if has_gutter { + cols.push(get_or(gutter.x, x, zero)); + } + } + + // Collect content and gutter rows. + for y in 0..r { + rows.push(get_or(tracks.y, y, auto)); + if has_gutter { + rows.push(get_or(gutter.y, y, zero)); + } + } + + // Remove superfluous gutter tracks. + if has_gutter { + cols.pop(); + rows.pop(); + } + + Self { cols, rows, entries, has_gutter } + } + + /// Get the grid entry in column `x` and row `y`. /// /// Returns `None` if it's a gutter cell. #[track_caller] - fn cell(&self, mut x: usize, y: usize) -> Option<&Cell> { + fn entry(&self, x: usize, y: usize) -> Option<&Entry> { assert!(x < self.cols.len()); assert!(y < self.rows.len()); - // Columns are reorder, but the cell slice is not. - if self.is_rtl { - x = self.cols.len() - 1 - x; - } - if self.has_gutter { // Even columns and rows are children, odd ones are gutter. if x % 2 == 0 && y % 2 == 0 { let c = 1 + self.cols.len() / 2; - self.cells.get((y / 2) * c + x / 2) + self.entries.get((y / 2) * c + x / 2) } else { None } } else { let c = self.cols.len(); - self.cells.get(y * c + x) + self.entries.get(y * c + x) } } + + /// Get the content of the cell in column `x` and row `y`. + /// + /// Returns `None` if it's a gutter cell or merged position. + #[track_caller] + fn cell(&self, x: usize, y: usize) -> Option<&Cell> { + self.entry(x, y).and_then(Entry::as_cell) + } + + /// Returns the position of the parent cell of the grid entry at the given + /// position. It is guaranteed to have a non-gutter, non-merged cell at + /// the returned position, due to how the grid is built. + /// If the entry at the given position is a cell, returns the given + /// position. + /// If it is a merged cell, returns the parent cell's position. + /// If it is a gutter cell, returns None. + #[track_caller] + fn parent_cell_position(&self, x: usize, y: usize) -> Option> { + self.entry(x, y).map(|entry| match entry { + Entry::Cell(_) => Axes::new(x, y), + Entry::Merged { parent } => { + let c = if self.has_gutter { + 1 + self.cols.len() / 2 + } else { + self.cols.len() + }; + let factor = if self.has_gutter { 2 } else { 1 }; + Axes::new(factor * (*parent % c), factor * (*parent / c)) + } + }) + } } /// Given a cell's requested x and y, the vector with the resolved cell @@ -390,7 +482,7 @@ impl CellGrid { fn resolve_cell_position( cell_x: Smart, cell_y: Smart, - resolved_cells: &[Option], + resolved_cells: &[Option], auto_index: &mut usize, columns: usize, ) -> HintedStrResult { @@ -497,6 +589,8 @@ pub struct GridLayouter<'a> { initial: Size, /// Frames for finished regions. finished: Vec, + /// Whether this is an RTL grid. + is_rtl: bool, /// The span of the grid element. span: Span, } @@ -547,6 +641,7 @@ impl<'a> GridLayouter<'a> { lrows: vec![], initial: regions.size, finished: vec![], + is_rtl: TextElem::dir_in(styles) == Dir::RTL, span, } } @@ -570,14 +665,14 @@ impl<'a> GridLayouter<'a> { } self.finish_region(engine)?; - self.render_fills_strokes()?; - Ok(Fragment::frames(self.finished)) + self.render_fills_strokes() } /// Add lines and backgrounds. - fn render_fills_strokes(&mut self) -> SourceResult<()> { - for (frame, rows) in self.finished.iter_mut().zip(&self.rrows) { + fn render_fills_strokes(mut self) -> SourceResult { + let mut finished = std::mem::take(&mut self.finished); + for (frame, rows) in finished.iter_mut().zip(&self.rrows) { if self.rcols.is_empty() || rows.is_empty() { continue; } @@ -598,28 +693,51 @@ impl<'a> GridLayouter<'a> { } // Render vertical lines. - for offset in points(self.rcols.iter().copied()) { - let target = Point::with_y(frame.height() + thickness); - let vline = Geometry::Line(target).stroked(stroke.clone()); - frame.prepend( - Point::new(offset, -half), - FrameItem::Shape(vline, self.span), - ); + for (x, dx) in points(self.rcols.iter().copied()).enumerate() { + let dx = if self.is_rtl { self.width - dx } else { dx }; + // We want each vline to span the entire table (start + // at y = 0, end after all rows). + // We use 'split_vline' to split the vline such that it + // is not drawn above colspans. + for (dy, length) in + split_vline(self.grid, rows, x, 0, self.grid.rows.len()) + { + let target = Point::with_y(length + thickness); + let vline = Geometry::Line(target).stroked(stroke.clone()); + frame.prepend( + Point::new(dx, dy - half), + FrameItem::Shape(vline, self.span), + ); + } } } // Render cell backgrounds. + // Reverse with RTL so that later columns start first. let mut dx = Abs::zero(); - for (x, &col) in self.rcols.iter().enumerate() { + for (x, &col) in self.rcols.iter().enumerate().rev_if(self.is_rtl) { let mut dy = Abs::zero(); for row in rows { - let fill = - self.grid.cell(x, row.y).and_then(|cell| cell.fill.clone()); - if let Some(fill) = fill { - let pos = Point::new(dx, dy); - let size = Size::new(col, row.height); - let rect = Geometry::Rect(size).filled(fill); - frame.prepend(pos, FrameItem::Shape(rect, self.span)); + if let Some(cell) = self.grid.cell(x, row.y) { + let fill = cell.fill.clone(); + if let Some(fill) = fill { + let width = self.cell_spanned_width(x, cell.colspan.get()); + // In the grid, cell colspans expand to the right, + // so we're at the leftmost (lowest 'x') column + // spanned by the cell. However, in RTL, cells + // expand to the left. Therefore, without the + // offset below, cell fills would start at the + // rightmost visual position of a cell and extend + // over to unrelated columns to the right in RTL. + // We avoid this by ensuring the fill starts at the + // very left of the cell, even with colspan > 1. + let offset = + if self.is_rtl { -width + col } else { Abs::zero() }; + let pos = Point::new(dx + offset, dy); + let size = Size::new(width, row.height); + let rect = Geometry::Rect(size).filled(fill); + frame.prepend(pos, FrameItem::Shape(rect, self.span)); + } } dy += row.height; } @@ -627,7 +745,7 @@ impl<'a> GridLayouter<'a> { } } - Ok(()) + Ok(Fragment::frames(finished)) } /// Determine all column sizes. @@ -675,6 +793,16 @@ impl<'a> GridLayouter<'a> { Ok(()) } + /// Total width spanned by the cell (among resolved columns). + /// Includes spanned gutter columns. + fn cell_spanned_width(&self, x: usize, colspan: usize) -> Abs { + self.rcols + .iter() + .skip(x) + .take(if self.grid.has_gutter { 2 * colspan - 1 } else { colspan }) + .sum() + } + /// Measure the size that is available to auto columns. fn measure_auto_columns( &mut self, @@ -683,6 +811,14 @@ impl<'a> GridLayouter<'a> { ) -> SourceResult<(Abs, usize)> { let mut auto = Abs::zero(); let mut count = 0; + let all_frac_cols = self + .grid + .cols + .iter() + .enumerate() + .filter(|(_, col)| col.is_fractional()) + .map(|(x, _)| x) + .collect::>(); // Determine size of auto columns by laying out all cells in those // columns, measuring them and finding the largest one. @@ -693,21 +829,82 @@ impl<'a> GridLayouter<'a> { let mut resolved = Abs::zero(); for y in 0..self.grid.rows.len() { - if let Some(cell) = self.grid.cell(x, y) { - // For relative rows, we can already resolve the correct - // base and for auto and fr we could only guess anyway. - let height = match self.grid.rows[y] { - Sizing::Rel(v) => { - v.resolve(self.styles).relative_to(self.regions.base().y) - } - _ => self.regions.base().y, - }; + // We get the parent cell in case this is a merged position. + let Some(Axes { x: parent_x, y: parent_y }) = + self.grid.parent_cell_position(x, y) + else { + continue; + }; + let cell = self.grid.cell(parent_x, parent_y).unwrap(); + let colspan = cell.colspan.get(); + if colspan > 1 { + let last_spanned_auto_col = self + .grid + .cols + .iter() + .enumerate() + .skip(parent_x) + .take(if self.grid.has_gutter { + 2 * colspan - 1 + } else { + colspan + }) + .rev() + .find(|(_, col)| **col == Sizing::Auto) + .map(|(x, _)| x); - let size = Size::new(available, height); - let pod = Regions::one(size, Axes::splat(false)); - let frame = cell.measure(engine, self.styles, pod)?.into_frame(); - resolved.set_max(frame.width()); + if last_spanned_auto_col != Some(x) { + // A colspan only affects the size of the last spanned + // auto column. + continue; + } } + + if colspan > 1 + && self.regions.size.x.is_finite() + && !all_frac_cols.is_empty() + && all_frac_cols + .iter() + .all(|x| (parent_x..parent_x + colspan).contains(x)) + { + // Additionally, as a heuristic, a colspan won't affect the + // size of auto columns if it already spans all fractional + // columns, since those would already expand to provide all + // remaining available after auto column sizing to that + // cell. However, this heuristic is only valid in finite + // regions (pages without 'auto' width), since otherwise + // the fractional columns don't expand at all. + continue; + } + + // For relative rows, we can already resolve the correct + // base and for auto and fr we could only guess anyway. + let height = match self.grid.rows[y] { + Sizing::Rel(v) => { + v.resolve(self.styles).relative_to(self.regions.base().y) + } + _ => self.regions.base().y, + }; + // Don't expand this auto column more than the cell actually + // needs. To do this, we check how much the other, previously + // resolved columns provide to the cell in terms of width + // (if it is a colspan), and subtract this from its expected + // width when comparing with other cells in this column. Note + // that, since this is the last auto column spanned by this + // cell, all other auto columns will already have been resolved + // and will be considered. + // Only fractional columns will be excluded from this + // calculation, which can lead to auto columns being expanded + // unnecessarily when cells span both a fractional column and + // an auto column. One mitigation for this is the heuristic + // used above to not expand the last auto column spanned by a + // cell if it spans all fractional columns in a finite region. + let already_covered_width = self.cell_spanned_width(parent_x, colspan); + + let size = Size::new(available, height); + let pod = Regions::one(size, Axes::splat(false)); + let frame = cell.measure(engine, self.styles, pod)?.into_frame(); + resolved.set_max(frame.width() - already_covered_width); } self.rcols[x] = resolved; @@ -824,10 +1021,10 @@ impl<'a> GridLayouter<'a> { ) -> SourceResult>> { let mut resolved: Vec = vec![]; - for (x, &rcol) in self.rcols.iter().enumerate() { + for x in 0..self.rcols.len() { if let Some(cell) = self.grid.cell(x, y) { let mut pod = self.regions; - pod.size.x = rcol; + pod.size.x = self.cell_spanned_width(x, cell.colspan.get()); let frames = cell.measure(engine, self.styles, pod)?.into_frames(); @@ -897,14 +1094,29 @@ impl<'a> GridLayouter<'a> { let mut output = Frame::soft(Size::new(self.width, height)); let mut pos = Point::zero(); - for (x, &rcol) in self.rcols.iter().enumerate() { + // Reverse the column order when using RTL. + for (x, &rcol) in self.rcols.iter().enumerate().rev_if(self.is_rtl) { if let Some(cell) = self.grid.cell(x, y) { - let size = Size::new(rcol, height); + let width = self.cell_spanned_width(x, cell.colspan.get()); + let size = Size::new(width, height); let mut pod = Regions::one(size, Axes::splat(true)); if self.grid.rows[y] == Sizing::Auto { pod.full = self.regions.full; } - let frame = cell.layout(engine, self.styles, pod)?.into_frame(); + let mut frame = cell.layout(engine, self.styles, pod)?.into_frame(); + if self.is_rtl { + // In the grid, cell colspans expand to the right, + // so we're at the leftmost (lowest 'x') column + // spanned by the cell. However, in RTL, cells + // expand to the left. Therefore, without the + // offset below, the cell's contents would be laid out + // starting at its rightmost visual position and extend + // over to unrelated cells to its right in RTL. + // We avoid this by ensuring the rendered cell starts at + // the very left of the cell, even with colspan > 1. + let offset = Point::with_x(-width + rcol); + frame.translate(offset); + } output.push_frame(pos, frame); } @@ -935,13 +1147,18 @@ impl<'a> GridLayouter<'a> { // Layout the row. let mut pos = Point::zero(); - for (x, &rcol) in self.rcols.iter().enumerate() { + for (x, &rcol) in self.rcols.iter().enumerate().rev_if(self.is_rtl) { if let Some(cell) = self.grid.cell(x, y) { - pod.size.x = rcol; + let width = self.cell_spanned_width(x, cell.colspan.get()); + pod.size.x = width; // Push the layouted frames into the individual output frames. let fragment = cell.layout(engine, self.styles, pod)?; - for (output, frame) in outputs.iter_mut().zip(fragment) { + for (output, mut frame) in outputs.iter_mut().zip(fragment) { + if self.is_rtl { + let offset = Point::with_x(-width + rcol); + frame.translate(offset); + } output.push_frame(pos, frame); } } @@ -1017,3 +1234,287 @@ fn points(extents: impl IntoIterator) -> impl Iterator { offset }) } + +/// Given the 'x' of the column right after the vline (or cols.len() at the +/// border) and its start..end range of rows, alongside the rows for the +/// current region, splits the vline into contiguous parts to draw, including +/// the height of the vline in each part. This will go through each row and +/// interrupt the current vline to be drawn when a colspan is detected, or the +/// end of the row range (or of the region) is reached. +/// The idea is to not draw vlines over colspans. +/// This will return the start offsets and lengths of each final segment of +/// this vline. The offsets are relative to the top of the first row. +/// Note that this assumes that rows are sorted according to ascending 'y'. +fn split_vline( + grid: &CellGrid, + rows: &[RowPiece], + x: usize, + start: usize, + end: usize, +) -> impl IntoIterator { + // Each segment of this vline that should be drawn. + // The last element in the vector below is the currently drawn segment. + // That is, the last segment will be expanded until interrupted. + let mut drawn_vlines = vec![]; + // Whether the latest vline segment is complete, because we hit a row we + // should skip while drawing the vline. Starts at true so we push + // the first segment to the vector. + let mut interrupted = true; + // How far down from the first row have we gone so far. + // Used to determine the positions at which to draw each segment. + let mut offset = Abs::zero(); + + // We start drawing at the first suitable row, and keep going down + // (increasing y) expanding the last segment until we hit a row on top of + // which we shouldn't draw, which is skipped, leading to the creation of a + // new vline segment later if a suitable row is found, restarting the + // cycle. + for row in rows.iter().take_while(|row| row.y < end) { + if should_draw_vline_at_row(grid, x, row.y, start, end) { + if interrupted { + // Last segment was interrupted by a colspan, or there are no + // segments yet. + // Create a new segment to draw. We start spanning this row. + drawn_vlines.push((offset, row.height)); + interrupted = false; + } else { + // Extend the current segment so it covers at least this row + // as well. + // The vector can't be empty if interrupted is false. + let current_segment = drawn_vlines.last_mut().unwrap(); + current_segment.1 += row.height; + } + } else { + interrupted = true; + } + offset += row.height; + } + + drawn_vlines +} + +/// Returns 'true' if the vline right before column 'x', given its start..end +/// range of rows, should be drawn when going through row 'y'. +/// That only occurs if the row is within its start..end range, and if it +/// wouldn't go through a colspan. +fn should_draw_vline_at_row( + grid: &CellGrid, + x: usize, + y: usize, + start: usize, + end: usize, +) -> bool { + if !(start..end).contains(&y) { + // Row is out of range for this line + return false; + } + if x == 0 || x == grid.cols.len() { + // Border vline. Always drawn. + return true; + } + // When the vline isn't at the border, we need to check if a colspan would + // be present between columns 'x' and 'x-1' at row 'y', and thus overlap + // with the line. + // To do so, we analyze the cell right after this vline. If it is merged + // with a cell before this line (parent_x < x) which is at this row or + // above it (parent_y <= y), this means it would overlap with the vline, + // so the vline must not be drawn at this row. + let first_adjacent_cell = if grid.has_gutter { + // Skip the gutters, if x or y represent gutter tracks. + // We would then analyze the cell one column after (if at a gutter + // column), and/or one row below (if at a gutter row), in order to + // check if it would be merged with a cell before the vline. + (x + x % 2, y + y % 2) + } else { + (x, y) + }; + let Axes { x: parent_x, y: parent_y } = grid + .parent_cell_position(first_adjacent_cell.0, first_adjacent_cell.1) + .unwrap(); + + parent_x >= x || parent_y > y +} + +#[cfg(test)] +mod test { + use super::*; + + fn sample_cell() -> Cell { + Cell { + body: Content::default(), + fill: None, + colspan: NonZeroUsize::ONE, + } + } + + fn cell_with_colspan(colspan: usize) -> Cell { + Cell { + body: Content::default(), + fill: None, + colspan: NonZeroUsize::try_from(colspan).unwrap(), + } + } + + fn sample_grid(gutters: bool) -> CellGrid { + const COLS: usize = 4; + const ROWS: usize = 6; + let entries = vec![ + // row 0 + Entry::Cell(sample_cell()), + Entry::Cell(sample_cell()), + Entry::Cell(cell_with_colspan(2)), + Entry::Merged { parent: 2 }, + // row 1 + Entry::Cell(sample_cell()), + Entry::Cell(cell_with_colspan(3)), + Entry::Merged { parent: 5 }, + Entry::Merged { parent: 5 }, + // row 2 + Entry::Merged { parent: 4 }, + Entry::Cell(sample_cell()), + Entry::Cell(cell_with_colspan(2)), + Entry::Merged { parent: 10 }, + // row 3 + Entry::Cell(sample_cell()), + Entry::Cell(cell_with_colspan(3)), + Entry::Merged { parent: 13 }, + Entry::Merged { parent: 13 }, + // row 4 + Entry::Cell(sample_cell()), + Entry::Merged { parent: 13 }, + Entry::Merged { parent: 13 }, + Entry::Merged { parent: 13 }, + // row 5 + Entry::Cell(sample_cell()), + Entry::Cell(sample_cell()), + Entry::Cell(cell_with_colspan(2)), + Entry::Merged { parent: 22 }, + ]; + CellGrid::new_internal( + Axes::with_x(&[Sizing::Auto; COLS]), + if gutters { + Axes::new(&[Sizing::Auto; COLS - 1], &[Sizing::Auto; ROWS - 1]) + } else { + Axes::default() + }, + entries, + ) + } + + #[test] + fn test_vline_splitting_without_gutter() { + let grid = sample_grid(false); + let rows = &[ + RowPiece { height: Abs::pt(1.0), y: 0 }, + RowPiece { height: Abs::pt(2.0), y: 1 }, + RowPiece { height: Abs::pt(4.0), y: 2 }, + RowPiece { height: Abs::pt(8.0), y: 3 }, + RowPiece { height: Abs::pt(16.0), y: 4 }, + RowPiece { height: Abs::pt(32.0), y: 5 }, + ]; + let expected_vline_splits = &[ + vec![(Abs::pt(0.), Abs::pt(1. + 2. + 4. + 8. + 16. + 32.))], + vec![(Abs::pt(0.), Abs::pt(1. + 2. + 4. + 8. + 16. + 32.))], + // interrupted a few times by colspans + vec![ + (Abs::pt(0.), Abs::pt(1.)), + (Abs::pt(1. + 2.), Abs::pt(4.)), + (Abs::pt(1. + 2. + 4. + 8. + 16.), Abs::pt(32.)), + ], + // interrupted every time by colspans + vec![], + vec![(Abs::pt(0.), Abs::pt(1. + 2. + 4. + 8. + 16. + 32.))], + ]; + for (x, expected_splits) in expected_vline_splits.iter().enumerate() { + assert_eq!( + expected_splits, + &split_vline(&grid, rows, x, 0, 6).into_iter().collect::>(), + ); + } + } + + #[test] + fn test_vline_splitting_with_gutter() { + let grid = sample_grid(true); + let rows = &[ + RowPiece { height: Abs::pt(1.0), y: 0 }, + RowPiece { height: Abs::pt(2.0), y: 1 }, + RowPiece { height: Abs::pt(4.0), y: 2 }, + RowPiece { height: Abs::pt(8.0), y: 3 }, + RowPiece { height: Abs::pt(16.0), y: 4 }, + RowPiece { height: Abs::pt(32.0), y: 5 }, + RowPiece { height: Abs::pt(64.0), y: 6 }, + RowPiece { height: Abs::pt(128.0), y: 7 }, + RowPiece { height: Abs::pt(256.0), y: 8 }, + RowPiece { height: Abs::pt(512.0), y: 9 }, + RowPiece { height: Abs::pt(1024.0), y: 10 }, + ]; + let expected_vline_splits = &[ + // left border + vec![( + Abs::pt(0.), + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256. + 512. + 1024.), + )], + // gutter line below + vec![( + Abs::pt(0.), + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256. + 512. + 1024.), + )], + vec![( + Abs::pt(0.), + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256. + 512. + 1024.), + )], + // gutter line below + // the two lines below are interrupted multiple times by colspans + vec![ + (Abs::pt(0.), Abs::pt(1. + 2.)), + (Abs::pt(1. + 2. + 4.), Abs::pt(8. + 16. + 32.)), + ( + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256.), + Abs::pt(512. + 1024.), + ), + ], + vec![ + (Abs::pt(0.), Abs::pt(1. + 2.)), + (Abs::pt(1. + 2. + 4.), Abs::pt(8. + 16. + 32.)), + ( + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256.), + Abs::pt(512. + 1024.), + ), + ], + // gutter line below + // the two lines below can only cross certain gutter rows, because + // all non-gutter cells in the following column are merged with + // cells from the previous column. + vec![ + (Abs::pt(1.), Abs::pt(2.)), + (Abs::pt(1. + 2. + 4.), Abs::pt(8.)), + (Abs::pt(1. + 2. + 4. + 8. + 16.), Abs::pt(32.)), + ( + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256.), + Abs::pt(512.), + ), + ], + vec![ + (Abs::pt(1.), Abs::pt(2.)), + (Abs::pt(1. + 2. + 4.), Abs::pt(8.)), + (Abs::pt(1. + 2. + 4. + 8. + 16.), Abs::pt(32.)), + ( + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256.), + Abs::pt(512.), + ), + ], + // right border + vec![( + Abs::pt(0.), + Abs::pt(1. + 2. + 4. + 8. + 16. + 32. + 64. + 128. + 256. + 512. + 1024.), + )], + ]; + for (x, expected_splits) in expected_vline_splits.iter().enumerate() { + assert_eq!( + expected_splits, + &split_vline(&grid, rows, x, 0, 11).into_iter().collect::>(), + ); + } + } +} diff --git a/crates/typst/src/layout/grid/mod.rs b/crates/typst/src/layout/grid/mod.rs index 8e7302ed9..544d43a8f 100644 --- a/crates/typst/src/layout/grid/mod.rs +++ b/crates/typst/src/layout/grid/mod.rs @@ -17,6 +17,7 @@ use crate::layout::{ Sides, Sizing, }; use crate::syntax::Span; +use crate::util::NonZeroExt; use crate::visualize::{Paint, Stroke}; /// Arranges content in a grid. @@ -429,6 +430,10 @@ pub struct GridCell { /// ``` y: Smart, + /// The amount of columns spanned by this cell. + #[default(NonZeroUsize::ONE)] + colspan: NonZeroUsize, + /// The cell's fill override. fill: Smart>, @@ -461,6 +466,7 @@ impl ResolvableCell for Packed { styles: StyleChain, ) -> Cell { let cell = &mut *self; + let colspan = cell.colspan(styles); let fill = cell.fill(styles).unwrap_or_else(|| fill.clone()); cell.push_x(Smart::Custom(x)); cell.push_y(Smart::Custom(y)); @@ -478,7 +484,7 @@ impl ResolvableCell for Packed { cell.inset(styles).map_or(inset, |inner| inner.fold(inset)).map(Some), )); - Cell { body: self.pack(), fill } + Cell { body: self.pack(), fill, colspan } } fn x(&self, styles: StyleChain) -> Smart { @@ -489,6 +495,10 @@ impl ResolvableCell for Packed { (**self).y(styles) } + fn colspan(&self, styles: StyleChain) -> NonZeroUsize { + (**self).colspan(styles) + } + fn span(&self) -> Span { Packed::span(self) } diff --git a/crates/typst/src/model/enum.rs b/crates/typst/src/model/enum.rs index dc947e2a9..622501db5 100644 --- a/crates/typst/src/model/enum.rs +++ b/crates/typst/src/model/enum.rs @@ -278,7 +278,6 @@ impl LayoutMultiple for Packed { ]), Axes::with_y(&[gutter.into()]), cells, - styles, ); let layouter = GridLayouter::new(&grid, &stroke, regions, styles, self.span()); diff --git a/crates/typst/src/model/list.rs b/crates/typst/src/model/list.rs index 456356a74..71a586b94 100644 --- a/crates/typst/src/model/list.rs +++ b/crates/typst/src/model/list.rs @@ -176,7 +176,6 @@ impl LayoutMultiple for Packed { ]), Axes::with_y(&[gutter.into()]), cells, - styles, ); let layouter = GridLayouter::new(&grid, &stroke, regions, styles, self.span()); diff --git a/crates/typst/src/model/table.rs b/crates/typst/src/model/table.rs index 45ea92733..ecda0527d 100644 --- a/crates/typst/src/model/table.rs +++ b/crates/typst/src/model/table.rs @@ -1,3 +1,5 @@ +use std::num::NonZeroUsize; + use ecow::eco_format; use crate::diag::{SourceResult, Trace, Tracepoint}; @@ -12,6 +14,7 @@ use crate::layout::{ use crate::model::Figurable; use crate::syntax::Span; use crate::text::{Lang, LocalName, Region}; +use crate::util::NonZeroExt; use crate::visualize::{Paint, Stroke}; /// A table of items. @@ -346,6 +349,10 @@ pub struct TableCell { /// The cell's fill override. fill: Smart>, + /// The amount of columns spanned by this cell. + #[default(NonZeroUsize::ONE)] + colspan: NonZeroUsize, + /// The cell's alignment override. align: Smart, @@ -375,6 +382,7 @@ impl ResolvableCell for Packed { styles: StyleChain, ) -> Cell { let cell = &mut *self; + let colspan = cell.colspan(styles); let fill = cell.fill(styles).unwrap_or_else(|| fill.clone()); cell.push_x(Smart::Custom(x)); cell.push_y(Smart::Custom(y)); @@ -392,7 +400,7 @@ impl ResolvableCell for Packed { cell.inset(styles).map_or(inset, |inner| inner.fold(inset)).map(Some), )); - Cell { body: self.pack(), fill } + Cell { body: self.pack(), fill, colspan } } fn x(&self, styles: StyleChain) -> Smart { @@ -403,6 +411,10 @@ impl ResolvableCell for Packed { (**self).y(styles) } + fn colspan(&self, styles: StyleChain) -> std::num::NonZeroUsize { + (**self).colspan(styles) + } + fn span(&self) -> Span { Packed::span(self) } diff --git a/crates/typst/src/util/mod.rs b/crates/typst/src/util/mod.rs index 05ff6e11d..0ccc0a316 100644 --- a/crates/typst/src/util/mod.rs +++ b/crates/typst/src/util/mod.rs @@ -16,6 +16,7 @@ pub use self::scalar::Scalar; use std::fmt::{Debug, Formatter}; use std::hash::Hash; +use std::iter::{Chain, Flatten, Rev}; use std::num::NonZeroUsize; use std::ops::{Add, Deref, Div, Mul, Neg, Sub}; use std::sync::Arc; @@ -116,6 +117,34 @@ where } } +/// Adapter for reversing iterators conditionally. +pub trait MaybeReverseIter { + type RevIfIter; + + /// Reverse this iterator (apply .rev()) based on some condition. + fn rev_if(self, condition: bool) -> Self::RevIfIter + where + Self: Sized; +} + +impl MaybeReverseIter for I { + type RevIfIter = + Chain>, Flatten>>>; + + fn rev_if(self, condition: bool) -> Self::RevIfIter + where + Self: Sized, + { + let (maybe_self_iter, maybe_rev_iter) = + if condition { (None, Some(self.rev())) } else { (Some(self), None) }; + + maybe_self_iter + .into_iter() + .flatten() + .chain(maybe_rev_iter.into_iter().flatten()) + } +} + /// Check if the [`Option`]-wrapped L is same to R. pub fn option_eq(left: Option, other: R) -> bool where diff --git a/tests/ref/layout/grid-colspan.png b/tests/ref/layout/grid-colspan.png new file mode 100644 index 0000000000000000000000000000000000000000..46577c62cbfd4b3e6a7f7716ce4cb7fe93c6f56e GIT binary patch literal 91434 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

r6(J_k}Fb;@~_$ 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 j>eM8jBitJ` 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 literal 1752 zcmZXVc{J1u8^?dvCN7Putj!R~a--~1uQAr7>sq61*=5NXS+b2K^BP1dU0IWKQB5eK zk(ntnB1P67C^ux`U9X zn0S7GsNMBp{k?_|N~izLeL8o;fh**O{0zPMz!(FNnq}roBVF6RJNtSfs(W0q=*P}S z-^zcKMB^v7W1^pzF}%w(^ayP8A;cP;#{M#!nw-Yg)g+L$^6q|}Q%9^Zwje9;WiUon z^Z>~6M;VZd;^K?XnII^OUYI+7hd^r zxSt^0e5ne_;@w*~B*7OlaxhPoyY0u5-g>H*5BBhkeDsu>8s64Lav+^Hz`^6uCrQ4j z5eg|aqTkS+9E>W|CztTqTPslphc>{ICZRgJaNBO563eAE$R$Q2ICy%vg+OFFYssaf zXGSrM{h~g4e`dGK>WRgX%!enG4S5E-%?oY^?ck?IOvgX7V1+%SL&Ui%PG{i;t&X~$ zRd3mXRA|*2oTwK*i-0Pi1^9do+eH7p`|KPgyjX#>*uJ{7zvx_1G4 z}vK^~-L#Gp#NLt-X+-7R|2epDJVowtWbEI=*A zoV93&z{OPG3(i-KI`*-f6e#rgpX|{!kx%~;hpj<_Ie==n(5idq6GNc?FCu1AIp{WL z6cn}6hc^?tvC!6F+2bRqBR$aEhWCwGQ~L))xmi(_Mcg2uL1bn7d}V3fHpiQ_DT(0B zwdQz|OFp8NrXTyj9^x1M{o=rVeS*uk56Ch&U_kbK` z#XXYGO`*x!08(#(m|sr1;?1CAWj@0pz#7e{UPXoRjF^Ky*SOZe&UjYcmO`kJ6D#v> z7sMc%GY8P)(7|NFIZjQc3XYe5p>ceZu{a$UcXm;XXTU^?C^5TH$A4j%*D(DcIGSo3@?5{cgyTWq59+u#3UHpro}qsJfJt6>79n zh8d=Kbti>Be~z`z(-jJx9P85Y;K$KLFR9}UrJIh|9{ZwGyZELl zL?#1F(u%9;rX>uUf4Ye2V($^CRcpruo!45M4m-h#hNIt|%944VCyA==3>}J_4k$x_*DJ-vUhP;^RBz|yLv=Kdxj?g!)op=QL+0B4>4h<;9WmrBg-y1O=6{f` z;bEB7g4=Lzl&$1q7ZM^plP$t?4V2EdIeVO*ek*BUjgbeI=Mit^T1Q$LUF?6u&&_s0 z+9lEsWrvxeyxHR{-zEJ1>Y$}-Qw3usDZc4B3pV~8k3bXkExWI09qo}5jXF)ezoXP& z6~CC0xt=wpD0^2XdPPlaI%hy)_;s_Ju$yhXo^1}~PZ6#C%g(Qh{`4ykG0(V^HZy1) zyj-kR-oYNoFP&k|fe4RDCW)UVH`@jo3$bjJ7JYlnJ0)SU4^LUiX&g!qdBcxvzd5%3 zZ^ATv=> diff --git a/tests/typ/layout/grid-colspan.typ b/tests/typ/layout/grid-colspan.typ new file mode 100644 index 000000000..3fd1a0fd4 --- /dev/null +++ b/tests/typ/layout/grid-colspan.typ @@ -0,0 +1,141 @@ +#grid( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + grid.cell(colspan: 4)[*Full Header*], + grid.cell(colspan: 2, fill: orange)[*Half*], + grid.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], grid.cell(colspan: 3, fill: orange.darken(10%))[6], + grid.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], grid.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +#table( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + table.cell(colspan: 4)[*Full Header*], + table.cell(colspan: 2, fill: orange)[*Half*], + table.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], table.cell(colspan: 3, fill: orange.darken(10%))[6], + table.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], table.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +--- +#grid( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + gutter: 3pt, + grid.cell(colspan: 4)[*Full Header*], + grid.cell(colspan: 2, fill: orange)[*Half*], + grid.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], grid.cell(colspan: 3, fill: orange.darken(10%))[6], + grid.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], grid.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +#table( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + gutter: 3pt, + table.cell(colspan: 4)[*Full Header*], + table.cell(colspan: 2, fill: orange)[*Half*], + table.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], table.cell(colspan: 3, fill: orange.darken(10%))[6], + table.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], table.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +--- +#set page(width: 300pt) +#table( + columns: (2em, 2em, auto, auto), + stroke: 5pt, + [A], [B], [C], [D], + table.cell(colspan: 4, lorem(20)), + [A], table.cell(colspan: 2)[BCBCBCBC], [D] +) + +--- +// Error: 3:8-3:32 cell's colspan would cause it to exceed the available column(s) +// Hint: 3:8-3:32 try placing the cell in another position or reducing its colspan +#grid( + columns: 3, + [a], grid.cell(colspan: 3)[b] +) + +--- +// Error: 4:8-4:32 cell would span a previously placed cell at column 2, row 0 +// Hint: 4:8-4:32 try specifying your cells in a different order or reducing the cell's colspan +#grid( + columns: 3, + grid.cell(x: 2, y: 0)[x], + [a], grid.cell(colspan: 2)[b] +) + +--- +// Colspan over all fractional columns shouldn't expand auto columns on finite pages +#table( + columns: (1fr, 1fr, auto), + [A], [B], [C], + [D], [E], [F] +) +#table( + columns: (1fr, 1fr, auto), + table.cell(colspan: 3, lorem(8)), + [A], [B], [C], + [D], [E], [F] +) + +--- +// Colspan over only some fractional columns will not trigger the heuristic, and +// the auto column will expand more than it should. The table looks off, as a result. +#table( + columns: (1fr, 1fr, auto), + [], table.cell(colspan: 2, lorem(8)), + [A], [B], [C], + [D], [E], [F] +) + +--- +// On infinite pages, colspan over all fractional columns SHOULD expand auto columns +#set page(width: auto) +#table( + columns: (1fr, 1fr, auto), + [A], [B], [C], + [D], [E], [F] +) +#table( + columns: (1fr, 1fr, auto), + table.cell(colspan: 3, lorem(8)), + [A], [B], [C], + [D], [E], [F] +) + +--- +// Test multiple regions +#set page(height: 5em) +#grid( + stroke: red, + fill: aqua, + columns: 4, + [a], [b], [c], [d], + [a], grid.cell(colspan: 2)[e, f, g, h, i], [f], + [e], [g], grid.cell(colspan: 2)[eee\ e\ e\ e], + grid.cell(colspan: 4)[eeee e e e] +) diff --git a/tests/typ/layout/grid-rtl.typ b/tests/typ/layout/grid-rtl.typ index 9c8714249..33a688887 100644 --- a/tests/typ/layout/grid-rtl.typ +++ b/tests/typ/layout/grid-rtl.typ @@ -7,3 +7,84 @@ --- #set text(dir: rtl) #table(columns: 2)[A][B][C][D] + +--- +// Test interaction between RTL and colspans +#set text(dir: rtl) +#grid( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + grid.cell(colspan: 4)[*Full Header*], + grid.cell(colspan: 2, fill: orange)[*Half*], + grid.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], grid.cell(colspan: 3, fill: orange.darken(10%))[6], + grid.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], grid.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +#grid( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + gutter: 3pt, + grid.cell(colspan: 4)[*Full Header*], + grid.cell(colspan: 2, fill: orange)[*Half*], + grid.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], grid.cell(colspan: 3, fill: orange.darken(10%))[6], + grid.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], grid.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +--- +#set text(dir: rtl) +#table( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + table.cell(colspan: 4)[*Full Header*], + table.cell(colspan: 2, fill: orange)[*Half*], + table.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], table.cell(colspan: 3, fill: orange.darken(10%))[6], + table.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], table.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +#table( + columns: 4, + fill: (x, y) => if calc.odd(x + y) { blue.lighten(50%) } else { blue.lighten(10%) }, + inset: 5pt, + align: center, + gutter: 3pt, + table.cell(colspan: 4)[*Full Header*], + table.cell(colspan: 2, fill: orange)[*Half*], + table.cell(colspan: 2, fill: orange.darken(10%))[*Half*], + [*A*], [*B*], [*C*], [*D*], + [1], [2], [3], [4], + [5], table.cell(colspan: 3, fill: orange.darken(10%))[6], + table.cell(colspan: 2, fill: orange)[7], [8], [9], + [10], table.cell(colspan: 2, fill: orange.darken(10%))[11], [12] +) + +--- +// Test multiple regions +#set page(height: 5em) +#set text(dir: rtl) +#grid( + stroke: red, + fill: aqua, + columns: 4, + [a], [b], [c], [d], + [a], grid.cell(colspan: 2)[e, f, g, h, i], [f], + [e], [g], grid.cell(colspan: 2)[eee\ e\ e\ e], + grid.cell(colspan: 4)[eeee e e e] +)