From 8fa573a9a203084ede03cb2f22a54a4b5973bb88 Mon Sep 17 00:00:00 2001 From: PgBiel <9021226+PgBiel@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:30:07 -0300 Subject: [PATCH] Initial table per-cell customization [More Flexible Tables Pt.2a] (#3037) Co-authored-by: Laurenz --- crates/typst/src/foundations/auto.rs | 16 +- .../src/layout/{grid.rs => grid/layout.rs} | 623 +++++++----------- crates/typst/src/layout/grid/mod.rs | 383 +++++++++++ crates/typst/src/model/bibliography.rs | 8 +- crates/typst/src/model/enum.rs | 26 +- crates/typst/src/model/list.rs | 24 +- crates/typst/src/model/table.rs | 139 +++- tests/ref/layout/grid-cell.png | Bin 0 -> 39178 bytes tests/ref/layout/grid-styling.png | Bin 18429 -> 27200 bytes tests/ref/layout/table-cell.png | Bin 0 -> 41893 bytes tests/ref/layout/table.png | Bin 12226 -> 22515 bytes tests/typ/layout/grid-cell.typ | 107 +++ tests/typ/layout/grid-styling.typ | 45 ++ tests/typ/layout/table-cell.typ | 102 +++ tests/typ/layout/table.typ | 45 ++ 15 files changed, 1063 insertions(+), 455 deletions(-) rename crates/typst/src/layout/{grid.rs => grid/layout.rs} (67%) create mode 100644 crates/typst/src/layout/grid/mod.rs create mode 100644 tests/ref/layout/grid-cell.png create mode 100644 tests/ref/layout/table-cell.png create mode 100644 tests/typ/layout/grid-cell.typ create mode 100644 tests/typ/layout/table-cell.typ diff --git a/crates/typst/src/foundations/auto.rs b/crates/typst/src/foundations/auto.rs index dd36e814f..5cb03f7f1 100644 --- a/crates/typst/src/foundations/auto.rs +++ b/crates/typst/src/foundations/auto.rs @@ -128,8 +128,20 @@ impl Smart { } } - /// Retusn `Auto` if `self` is `Auto`, otherwise calls the provided function onthe contained - /// value and returns the result. + /// Keeps `self` if it contains a custom value, otherwise returns the + /// output of the given function. + pub fn or_else(self, f: F) -> Self + where + F: FnOnce() -> Self, + { + match self { + Self::Custom(x) => Self::Custom(x), + Self::Auto => f(), + } + } + + /// Returns `Auto` if `self` is `Auto`, otherwise calls the provided + /// function on the contained value and returns the result. pub fn and_then(self, f: F) -> Smart where F: FnOnce(T) -> Smart, diff --git a/crates/typst/src/layout/grid.rs b/crates/typst/src/layout/grid/layout.rs similarity index 67% rename from crates/typst/src/layout/grid.rs rename to crates/typst/src/layout/grid/layout.rs index 56f8190ba..24d641a66 100644 --- a/crates/typst/src/layout/grid.rs +++ b/crates/typst/src/layout/grid/layout.rs @@ -1,282 +1,17 @@ -use std::num::NonZeroUsize; - -use smallvec::{smallvec, SmallVec}; - use crate::diag::{bail, At, SourceResult, StrResult}; use crate::engine::Engine; use crate::foundations::{ - cast, elem, Array, CastInfo, Content, FromValue, Func, IntoValue, NativeElement, - Reflect, Resolve, Smart, StyleChain, Value, + Array, CastInfo, Content, FromValue, Func, IntoValue, Reflect, Resolve, Smart, + StyleChain, Value, }; use crate::layout::{ - Abs, Align, AlignElem, Axes, Dir, Fr, Fragment, Frame, FrameItem, Layout, Length, - Point, Regions, Rel, Sides, Size, Sizing, + Abs, Align, Axes, Dir, Fr, Fragment, Frame, FrameItem, Layout, Length, Point, + Regions, Rel, Sides, Size, Sizing, }; use crate::syntax::Span; use crate::text::TextElem; use crate::util::Numeric; -use crate::visualize::{FixedStroke, Geometry, Paint, Stroke}; - -/// Arranges content in a grid. -/// -/// The grid element allows you to arrange content in a grid. You can define the -/// number of rows and columns, as well as the size of the gutters between them. -/// There are multiple sizing modes for columns and rows that can be used to -/// create complex layouts. -/// -/// The sizing of the grid is determined by the track sizes specified in the -/// arguments. Because each of the sizing parameters accepts the same values, we -/// will explain them just once, here. Each sizing argument accepts an array of -/// individual track sizes. A track size is either: -/// -/// - `{auto}`: The track will be sized to fit its contents. It will be at most -/// as large as the remaining space. If there is more than one `{auto}` track -/// which, and together they claim more than the available space, the `{auto}` -/// tracks will fairly distribute the available space among themselves. -/// -/// - A fixed or relative length (e.g. `{10pt}` or `{20% - 1cm}`): The track -/// will be exactly of this size. -/// -/// - A fractional length (e.g. `{1fr}`): Once all other tracks have been sized, -/// the remaining space will be divided among the fractional tracks according -/// to their fractions. For example, if there are two fractional tracks, each -/// with a fraction of `{1fr}`, they will each take up half of the remaining -/// space. -/// -/// To specify a single track, the array can be omitted in favor of a single -/// value. To specify multiple `{auto}` tracks, enter the number of tracks -/// instead of an array. For example, `columns:` `{3}` is equivalent to -/// `columns:` `{(auto, auto, auto)}`. -/// -/// # Examples -/// The example below demonstrates the different track sizing options. -/// -/// ```example -/// // We use `rect` to emphasize the -/// // area of cells. -/// #set rect( -/// inset: 8pt, -/// fill: rgb("e4e5ea"), -/// width: 100%, -/// ) -/// -/// #grid( -/// columns: (60pt, 1fr, 2fr), -/// rows: (auto, 60pt), -/// gutter: 3pt, -/// rect[Fixed width, auto height], -/// rect[1/3 of the remains], -/// rect[2/3 of the remains], -/// rect(height: 100%)[Fixed height], -/// image("tiger.jpg", height: 100%), -/// image("tiger.jpg", height: 100%), -/// ) -/// ``` -/// -/// You can also [spread]($arguments/#spreading) an array of strings or content -/// into a grid to populate its cells. -/// -/// ```example -/// #grid( -/// columns: 5, -/// gutter: 5pt, -/// ..range(25).map(str) -/// ) -/// ``` -#[elem(Layout)] -pub struct GridElem { - /// The column sizes. - /// - /// Either specify a track size array or provide an integer to create a grid - /// with that many `{auto}`-sized columns. Note that opposed to rows and - /// gutters, providing a single track size will only ever create a single - /// column. - #[borrowed] - pub columns: TrackSizings, - - /// The row sizes. - /// - /// If there are more cells than fit the defined rows, the last row is - /// repeated until there are no more cells. - #[borrowed] - pub rows: TrackSizings, - - /// The gaps between rows & columns. - /// - /// If there are more gutters than defined sizes, the last gutter is repeated. - #[external] - pub gutter: TrackSizings, - - /// The gaps between columns. Takes precedence over `gutter`. - #[parse( - let gutter = args.named("gutter")?; - args.named("column-gutter")?.or_else(|| gutter.clone()) - )] - #[borrowed] - pub column_gutter: TrackSizings, - - /// The gaps between rows. Takes precedence over `gutter`. - #[parse(args.named("row-gutter")?.or_else(|| gutter.clone()))] - #[borrowed] - pub row_gutter: TrackSizings, - - /// How to fill the cells. - /// - /// This can be a color or a function that returns a color. The function is - /// passed the cells' column and row index, starting at zero. This can be - /// used to implement striped grids. - /// - /// ```example - /// #grid( - /// fill: (col, row) => if calc.even(col + row) { luma(240) } else { white }, - /// align: center + horizon, - /// columns: 4, - /// [X], [O], [X], [O], - /// [O], [X], [O], [X], - /// [X], [O], [X], [O], - /// [O], [X], [O], [X] - /// ) - /// ``` - #[borrowed] - pub fill: Celled>, - - /// How to align the cells' content. - /// - /// This can either be a single alignment, an array of alignments - /// (corresponding to each column) or a function that returns an alignment. - /// The function is passed the cells' column and row index, starting at zero. - /// If set to `{auto}`, the outer alignment is used. - /// - /// ```example - /// #grid( - /// columns: 3, - /// align: (x, y) => (left, center, right).at(x), - /// [Hello], [Hello], [Hello], - /// [A], [B], [C], - /// ) - /// ``` - #[borrowed] - pub align: Celled>, - - /// How to [stroke]($stroke) the cells. - /// - /// Grids have no strokes by default, which can be changed by setting this - /// option to the desired stroke. - /// - /// _Note:_ Richer stroke customization for individual cells is not yet - /// implemented, but will be in the future. In the meantime, you can use the - /// third-party [tablex library](https://github.com/PgBiel/typst-tablex/). - #[resolve] - #[fold] - pub stroke: Option, - - /// How much to pad the cells' content. - /// - /// ```example - /// #grid( - /// inset: 10pt, - /// fill: (_, row) => (red, blue).at(row), - /// [Hello], - /// [World], - /// ) - /// - /// #grid( - /// columns: 2, - /// inset: ( - /// x: 20pt, - /// y: 10pt, - /// ), - /// fill: (col, _) => (red, blue).at(col), - /// [Hello], - /// [World], - /// ) - /// ``` - #[fold] - #[default(Sides::splat(Abs::pt(0.0).into()))] - pub inset: Sides>>, - - /// The contents of the grid cells. - /// - /// The cells are populated in row-major order. - #[variadic] - pub children: Vec, -} - -impl Layout for GridElem { - #[typst_macros::time(name = "grid", span = self.span())] - fn layout( - &self, - engine: &mut Engine, - styles: StyleChain, - regions: Regions, - ) -> SourceResult { - let inset = self.inset(styles); - let align = self.align(styles); - let columns = self.columns(styles); - let rows = self.rows(styles); - let column_gutter = self.column_gutter(styles); - let row_gutter = self.row_gutter(styles); - let fill = self.fill(styles); - let stroke = self.stroke(styles).map(Stroke::unwrap_or_default); - - let tracks = Axes::new(columns.0.as_slice(), rows.0.as_slice()); - let gutter = Axes::new(column_gutter.0.as_slice(), row_gutter.0.as_slice()); - let cells = - apply_align_inset_to_cells(engine, &tracks, &self.children, align, inset)?; - - // Prepare grid layout by unifying content and gutter tracks. - let layouter = GridLayouter::new( - tracks, - gutter, - &cells, - fill, - &stroke, - regions, - styles, - self.span(), - ); - - // Measure the columns and layout the grid row-by-row. - Ok(layouter.layout(engine)?.fragment) - } -} - -pub fn apply_align_inset_to_cells( - engine: &mut Engine, - tracks: &Axes<&[Sizing]>, - cells: &[Content], - align: &Celled>, - inset: Sides>, -) -> SourceResult> { - let cols = tracks.x.len().max(1); - cells - .iter() - .enumerate() - .map(|(i, child)| { - let mut child = child.clone().padded(inset); - - let x = i % cols; - let y = i / cols; - if let Smart::Custom(alignment) = align.resolve(engine, x, y)? { - child = child.styled(AlignElem::set_alignment(alignment)); - } - - Ok(child) - }) - .collect() -} - -/// Track sizing definitions. -#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)] -pub struct TrackSizings(pub SmallVec<[Sizing; 4]>); - -cast! { - TrackSizings, - self => self.0.into_value(), - sizing: Sizing => Self(smallvec![sizing]), - count: NonZeroUsize => Self(smallvec![Sizing::Auto; count.get()]), - values: Array => Self(values.into_iter().map(Value::cast).collect::>()?), -} +use crate::visualize::{FixedStroke, Geometry, Paint}; /// A value that can be configured per cell. #[derive(Debug, Clone, PartialEq, Hash)] @@ -347,87 +82,70 @@ impl FromValue for Celled { } } -/// Performs grid layout. -pub struct GridLayouter<'a> { +/// Represents a cell in CellGrid, to be laid out by GridLayouter. +pub struct Cell { + /// The cell's body. + pub body: Content, + /// The cell's fill. + pub fill: Option, +} + +impl From for Cell { + /// Create a simple cell given its body. + fn from(body: Content) -> Self { + Self { body, fill: None } + } +} + +impl Layout for Cell { + fn layout( + &self, + engine: &mut Engine, + styles: StyleChain, + regions: Regions, + ) -> SourceResult { + self.body.layout(engine, styles, regions) + } +} + +/// Used for cell-like elements which are aware of their final properties in +/// the table, and may have property overrides. +pub trait ResolvableCell { + /// Resolves the cell's fields, given its coordinates and default grid-wide + /// fill, align and inset properties. + /// Returns a final Cell. + fn resolve_cell( + self, + x: usize, + y: usize, + fill: &Option, + align: Smart, + inset: Sides>, + styles: StyleChain, + ) -> Cell; +} + +/// A grid of cells, including the columns, rows, and cell data. +pub struct CellGrid { /// The grid cells. - cells: &'a [Content], - /// Whether this is an RTL grid. - is_rtl: bool, - /// Whether this grid has gutters. - has_gutter: bool, + cells: Vec, /// The column tracks including gutter tracks. cols: Vec, /// The row tracks including gutter tracks. rows: Vec, - // How to fill the cells. - #[allow(dead_code)] - fill: &'a Celled>, - // How to stroke the cells. - #[allow(dead_code)] - stroke: &'a Option, - /// The regions to layout children into. - regions: Regions<'a>, - /// The inherited styles. - styles: StyleChain<'a>, - /// Resolved column sizes. - rcols: Vec, - /// The sum of `rcols`. - width: Abs, - /// Resolve row sizes, by region. - rrows: Vec>, - /// Rows in the current region. - lrows: Vec, - /// The initial size of the current region before we started subtracting. - initial: Size, - /// Frames for finished regions. - finished: Vec, - /// The span of the grid element. - span: Span, + /// Whether this grid has gutters. + has_gutter: bool, + /// Whether this is an RTL grid. + is_rtl: bool, } -/// The resulting sizes of columns and rows in a grid. -#[derive(Debug)] -pub struct GridLayout { - /// The fragment. - pub fragment: Fragment, - /// The column widths. - pub cols: Vec, - /// The heights of the resulting rows segments, by region. - pub rows: Vec>, -} - -/// Details about a resulting row piece. -#[derive(Debug)] -pub struct RowPiece { - /// The height of the segment. - pub height: Abs, - /// The index of the row. - pub y: usize, -} - -/// Produced by initial row layout, auto and relative rows are already finished, -/// fractional rows not yet. -enum Row { - /// Finished row frame of auto or relative row with y index. - Frame(Frame, usize), - /// Fractional row with y index. - Fr(Fr, usize), -} - -impl<'a> GridLayouter<'a> { - /// Create a new grid layouter. - /// - /// This prepares grid layout by unifying content and gutter tracks. - #[allow(clippy::too_many_arguments)] +impl CellGrid { + /// Generates the cell grid, given the tracks and resolved cells. pub fn new( tracks: Axes<&[Sizing]>, gutter: Axes<&[Sizing]>, - cells: &'a [Content], - fill: &'a Celled>, - stroke: &'a Option, - regions: Regions<'a>, - styles: StyleChain<'a>, - span: Span, + cells: Vec, + styles: StyleChain, ) -> Self { let mut cols = vec![]; let mut rows = vec![]; @@ -479,22 +197,154 @@ impl<'a> GridLayouter<'a> { cols.reverse(); } + Self { cols, rows, cells, has_gutter, is_rtl } + } + + /// Resolves all cells in the grid before creating it. + /// Allows them to keep track of their final properties and adjust their + /// fields accordingly. + /// Cells must implement Clone as they will be owned. Additionally, they + /// must implement Default in order to fill the last row of the grid with + /// empty cells, if it is not completely filled. + #[allow(clippy::too_many_arguments)] + pub fn resolve( + tracks: Axes<&[Sizing]>, + gutter: Axes<&[Sizing]>, + cells: &[T], + fill: &Celled>, + align: &Celled>, + inset: Sides>, + engine: &mut Engine, + styles: StyleChain, + ) -> SourceResult { + // Number of content columns: Always at least one. + let c = tracks.x.len().max(1); + + // If not all columns in the last row have cells, we will add empty + // cells and complete the row so that those positions are susceptible + // to show rules and receive grid styling. + // We apply '% c' twice so that 'cells_remaining' is zero when + // the last row is already filled (then 'cell_count % c' would be zero). + let cell_count = cells.len(); + let cells_remaining = (c - cell_count % c) % c; + let cells = cells + .iter() + .cloned() + .chain(std::iter::repeat_with(T::default).take(cells_remaining)) + .enumerate() + .map(|(i, cell)| { + let x = i % c; + let y = i / c; + + Ok(cell.resolve_cell( + x, + y, + &fill.resolve(engine, x, y)?, + align.resolve(engine, x, y)?, + inset, + styles, + )) + }) + .collect::>>()?; + + Ok(Self::new(tracks, gutter, cells, styles)) + } + + /// Get the content of the cell 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> { + 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) + } else { + None + } + } else { + let c = self.cols.len(); + self.cells.get(y * c + x) + } + } +} + +/// Performs grid layout. +pub struct GridLayouter<'a> { + /// The grid of cells. + grid: &'a CellGrid, + // How to stroke the cells. + stroke: &'a Option, + /// The regions to layout children into. + regions: Regions<'a>, + /// The inherited styles. + styles: StyleChain<'a>, + /// Resolved column sizes. + rcols: Vec, + /// The sum of `rcols`. + width: Abs, + /// Resolve row sizes, by region. + rrows: Vec>, + /// Rows in the current region. + lrows: Vec, + /// The initial size of the current region before we started subtracting. + initial: Size, + /// Frames for finished regions. + finished: Vec, + /// The span of the grid element. + span: Span, +} + +/// Details about a resulting row piece. +#[derive(Debug)] +pub struct RowPiece { + /// The height of the segment. + pub height: Abs, + /// The index of the row. + pub y: usize, +} + +/// Produced by initial row layout, auto and relative rows are already finished, +/// fractional rows not yet. +enum Row { + /// Finished row frame of auto or relative row with y index. + Frame(Frame, usize), + /// Fractional row with y index. + Fr(Fr, usize), +} + +impl<'a> GridLayouter<'a> { + /// Create a new grid layouter. + /// + /// This prepares grid layout by unifying content and gutter tracks. + #[allow(clippy::too_many_arguments)] + pub fn new( + grid: &'a CellGrid, + stroke: &'a Option, + regions: Regions<'a>, + styles: StyleChain<'a>, + span: Span, + ) -> Self { // We use these regions for auto row measurement. Since at that moment, // columns are already sized, we can enable horizontal expansion. let mut regions = regions; regions.expand = Axes::new(true, false); Self { - cells, - is_rtl, - has_gutter, - rows, - fill, + grid, stroke, regions, styles, - rcols: vec![Abs::zero(); cols.len()], - cols, + rcols: vec![Abs::zero(); grid.cols.len()], width: Abs::zero(), rrows: vec![], lrows: vec![], @@ -505,17 +355,17 @@ impl<'a> GridLayouter<'a> { } /// Determines the columns sizes and then layouts the grid row-by-row. - pub fn layout(mut self, engine: &mut Engine) -> SourceResult { + pub fn layout(mut self, engine: &mut Engine) -> SourceResult { self.measure_columns(engine)?; - for y in 0..self.rows.len() { + for y in 0..self.grid.rows.len() { // Skip to next region if current one is full, but only for content // rows, not for gutter rows. - if self.regions.is_full() && (!self.has_gutter || y % 2 == 0) { + if self.regions.is_full() && (!self.grid.has_gutter || y % 2 == 0) { self.finish_region(engine)?; } - match self.rows[y] { + match self.grid.rows[y] { Sizing::Auto => self.layout_auto_row(engine, y)?, Sizing::Rel(v) => self.layout_relative_row(engine, v, y)?, Sizing::Fr(v) => self.lrows.push(Row::Fr(v, y)), @@ -524,19 +374,13 @@ impl<'a> GridLayouter<'a> { self.finish_region(engine)?; - if self.stroke.is_some() || !matches!(self.fill, Celled::Value(None)) { - self.render_fills_strokes(engine)?; - } + self.render_fills_strokes()?; - Ok(GridLayout { - fragment: Fragment::frames(self.finished), - cols: self.rcols, - rows: self.rrows, - }) + Ok(Fragment::frames(self.finished)) } /// Add lines and backgrounds. - fn render_fills_strokes(&mut self, engine: &mut Engine) -> SourceResult<()> { + fn render_fills_strokes(&mut self) -> SourceResult<()> { for (frame, rows) in self.finished.iter_mut().zip(&self.rrows) { if self.rcols.is_empty() || rows.is_empty() { continue; @@ -573,7 +417,9 @@ impl<'a> GridLayouter<'a> { for (x, &col) in self.rcols.iter().enumerate() { let mut dy = Abs::zero(); for row in rows { - if let Some(fill) = self.fill.resolve(engine, x, row.y)? { + 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); @@ -598,7 +444,7 @@ impl<'a> GridLayouter<'a> { // Resolve the size of all relative columns and compute the sum of all // fractional tracks. - for (&col, rcol) in self.cols.iter().zip(&mut self.rcols) { + for (&col, rcol) in self.grid.cols.iter().zip(&mut self.rcols) { match col { Sizing::Auto => {} Sizing::Rel(v) => { @@ -644,17 +490,17 @@ impl<'a> GridLayouter<'a> { // Determine size of auto columns by laying out all cells in those // columns, measuring them and finding the largest one. - for (x, &col) in self.cols.iter().enumerate() { + for (x, &col) in self.grid.cols.iter().enumerate() { if col != Sizing::Auto { continue; } let mut resolved = Abs::zero(); - for y in 0..self.rows.len() { - if let Some(cell) = self.cell(x, y) { + 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.rows[y] { + let height = match self.grid.rows[y] { Sizing::Rel(v) => { v.resolve(self.styles).relative_to(self.regions.base().y) } @@ -682,7 +528,7 @@ impl<'a> GridLayouter<'a> { return; } - for (&col, rcol) in self.cols.iter().zip(&mut self.rcols) { + for (&col, rcol) in self.grid.cols.iter().zip(&mut self.rcols) { if let Sizing::Fr(v) = col { *rcol = v.share(fr, remaining); } @@ -703,7 +549,7 @@ impl<'a> GridLayouter<'a> { last = fair; fair = redistribute / (overlarge as f64); - for (&col, &rcol) in self.cols.iter().zip(&self.rcols) { + for (&col, &rcol) in self.grid.cols.iter().zip(&self.rcols) { // Remove an auto column if it is not overlarge (rcol <= fair), // but also hasn't already been removed (rcol > last). if col == Sizing::Auto && rcol <= fair && rcol > last { @@ -715,7 +561,7 @@ impl<'a> GridLayouter<'a> { } // Redistribute space fairly among overlarge columns. - for (&col, rcol) in self.cols.iter().zip(&mut self.rcols) { + for (&col, rcol) in self.grid.cols.iter().zip(&mut self.rcols) { if col == Sizing::Auto && *rcol > fair { *rcol = fair; } @@ -783,7 +629,7 @@ impl<'a> GridLayouter<'a> { let mut resolved: Vec = vec![]; for (x, &rcol) in self.rcols.iter().enumerate() { - if let Some(cell) = self.cell(x, y) { + if let Some(cell) = self.grid.cell(x, y) { let mut pod = self.regions; pod.size.x = rcol; @@ -831,7 +677,7 @@ impl<'a> GridLayouter<'a> { self.finish_region(engine)?; // Don't skip multiple regions for gutter and don't push a row. - if self.has_gutter && y % 2 == 1 { + if self.grid.has_gutter && y % 2 == 1 { return Ok(()); } } @@ -856,10 +702,10 @@ impl<'a> GridLayouter<'a> { let mut pos = Point::zero(); for (x, &rcol) in self.rcols.iter().enumerate() { - if let Some(cell) = self.cell(x, y) { + if let Some(cell) = self.grid.cell(x, y) { let size = Size::new(rcol, height); let mut pod = Regions::one(size, Axes::splat(true)); - if self.rows[y] == Sizing::Auto { + if self.grid.rows[y] == Sizing::Auto { pod.full = self.regions.full; } let frame = cell.layout(engine, self.styles, pod)?.into_frame(); @@ -894,7 +740,7 @@ impl<'a> GridLayouter<'a> { // Layout the row. let mut pos = Point::zero(); for (x, &rcol) in self.rcols.iter().enumerate() { - if let Some(cell) = self.cell(x, y) { + if let Some(cell) = self.grid.cell(x, y) { pod.size.x = rcol; // Push the layouted frames into the individual output frames. @@ -964,33 +810,6 @@ impl<'a> GridLayouter<'a> { Ok(()) } - - /// Get the content of the cell 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<&'a Content> { - 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) - } else { - None - } - } else { - let c = self.cols.len(); - self.cells.get(y * c + x) - } - } } /// Turn an iterator of extents into an iterator of offsets before, in between, diff --git a/crates/typst/src/layout/grid/mod.rs b/crates/typst/src/layout/grid/mod.rs new file mode 100644 index 000000000..4d66fd4a7 --- /dev/null +++ b/crates/typst/src/layout/grid/mod.rs @@ -0,0 +1,383 @@ +mod layout; + +pub use self::layout::{Cell, CellGrid, Celled, GridLayouter, ResolvableCell}; + +use std::num::NonZeroUsize; + +use smallvec::{smallvec, SmallVec}; + +use crate::diag::{SourceResult, StrResult}; +use crate::engine::Engine; +use crate::foundations::{ + cast, elem, scope, Array, Content, Fold, NativeElement, Show, Smart, StyleChain, + Value, +}; +use crate::layout::{ + Abs, Align, AlignElem, Axes, Fragment, Layout, Length, Regions, Rel, Sides, Sizing, +}; +use crate::visualize::{Paint, Stroke}; + +/// Arranges content in a grid. +/// +/// The grid element allows you to arrange content in a grid. You can define the +/// number of rows and columns, as well as the size of the gutters between them. +/// There are multiple sizing modes for columns and rows that can be used to +/// create complex layouts. +/// +/// The sizing of the grid is determined by the track sizes specified in the +/// arguments. Because each of the sizing parameters accepts the same values, we +/// will explain them just once, here. Each sizing argument accepts an array of +/// individual track sizes. A track size is either: +/// +/// - `{auto}`: The track will be sized to fit its contents. It will be at most +/// as large as the remaining space. If there is more than one `{auto}` track +/// which, and together they claim more than the available space, the `{auto}` +/// tracks will fairly distribute the available space among themselves. +/// +/// - A fixed or relative length (e.g. `{10pt}` or `{20% - 1cm}`): The track +/// will be exactly of this size. +/// +/// - A fractional length (e.g. `{1fr}`): Once all other tracks have been sized, +/// the remaining space will be divided among the fractional tracks according +/// to their fractions. For example, if there are two fractional tracks, each +/// with a fraction of `{1fr}`, they will each take up half of the remaining +/// space. +/// +/// To specify a single track, the array can be omitted in favor of a single +/// value. To specify multiple `{auto}` tracks, enter the number of tracks +/// instead of an array. For example, `columns:` `{3}` is equivalent to +/// `columns:` `{(auto, auto, auto)}`. +/// +/// # Styling the grid +/// The grid's appearance can be customized through different parameters, such +/// as `fill` to give all cells a background; `align` to change how cells are +/// aligned; `inset` to optionally add internal padding to each cell; and +/// `stroke` to optionally enable grid lines with a certain stroke. +/// +/// If you need to override one of the above options for a single cell, you can +/// use the [`grid.cell`]($grid.cell) element. Alternatively, if you need the +/// appearance options to depend on a cell's position (column and row), you may +/// specify a function to `fill` or `align` of the form +/// `(column, row) => value`. You may also use a show rule on +/// [`grid.cell`]($grid.cell) - see that element's examples for more information. +/// +/// # Examples +/// The example below demonstrates the different track sizing options. +/// +/// ```example +/// // We use `rect` to emphasize the +/// // area of cells. +/// #set rect( +/// inset: 8pt, +/// fill: rgb("e4e5ea"), +/// width: 100%, +/// ) +/// +/// #grid( +/// columns: (60pt, 1fr, 2fr), +/// rows: (auto, 60pt), +/// gutter: 3pt, +/// rect[Fixed width, auto height], +/// rect[1/3 of the remains], +/// rect[2/3 of the remains], +/// rect(height: 100%)[Fixed height], +/// image("tiger.jpg", height: 100%), +/// image("tiger.jpg", height: 100%), +/// ) +/// ``` +/// +/// You can also [spread]($arguments/#spreading) an array of strings or content +/// into a grid to populate its cells. +/// +/// ```example +/// #grid( +/// columns: 5, +/// gutter: 5pt, +/// ..range(25).map(str) +/// ) +/// ``` +#[elem(scope, Layout)] +pub struct GridElem { + /// The column sizes. + /// + /// Either specify a track size array or provide an integer to create a grid + /// with that many `{auto}`-sized columns. Note that opposed to rows and + /// gutters, providing a single track size will only ever create a single + /// column. + #[borrowed] + pub columns: TrackSizings, + + /// The row sizes. + /// + /// If there are more cells than fit the defined rows, the last row is + /// repeated until there are no more cells. + #[borrowed] + pub rows: TrackSizings, + + /// The gaps between rows & columns. + /// + /// If there are more gutters than defined sizes, the last gutter is repeated. + #[external] + pub gutter: TrackSizings, + + /// The gaps between columns. Takes precedence over `gutter`. + #[parse( + let gutter = args.named("gutter")?; + args.named("column-gutter")?.or_else(|| gutter.clone()) + )] + #[borrowed] + pub column_gutter: TrackSizings, + + /// The gaps between rows. Takes precedence over `gutter`. + #[parse(args.named("row-gutter")?.or_else(|| gutter.clone()))] + #[borrowed] + pub row_gutter: TrackSizings, + + /// How to fill the cells. + /// + /// This can be a color or a function that returns a color. The function is + /// passed the cells' column and row index, starting at zero. This can be + /// used to implement striped grids. + /// + /// ```example + /// #grid( + /// fill: (col, row) => if calc.even(col + row) { luma(240) } else { white }, + /// align: center + horizon, + /// columns: 4, + /// [X], [O], [X], [O], + /// [O], [X], [O], [X], + /// [X], [O], [X], [O], + /// [O], [X], [O], [X] + /// ) + /// ``` + #[borrowed] + pub fill: Celled>, + + /// How to align the cells' content. + /// + /// This can either be a single alignment, an array of alignments + /// (corresponding to each column) or a function that returns an alignment. + /// The function is passed the cells' column and row index, starting at zero. + /// If set to `{auto}`, the outer alignment is used. + /// + /// ```example + /// #grid( + /// columns: 3, + /// align: (x, y) => (left, center, right).at(x), + /// [Hello], [Hello], [Hello], + /// [A], [B], [C], + /// ) + /// ``` + #[borrowed] + pub align: Celled>, + + /// How to [stroke]($stroke) the cells. + /// + /// Grids have no strokes by default, which can be changed by setting this + /// option to the desired stroke. + /// + /// _Note:_ Richer stroke customization for individual cells is not yet + /// implemented, but will be in the future. In the meantime, you can use the + /// third-party [tablex library](https://github.com/PgBiel/typst-tablex/). + #[resolve] + #[fold] + pub stroke: Option, + + /// How much to pad the cells' content. + /// + /// ```example + /// #grid( + /// inset: 10pt, + /// fill: (_, row) => (red, blue).at(row), + /// [Hello], + /// [World], + /// ) + /// + /// #grid( + /// columns: 2, + /// inset: ( + /// x: 20pt, + /// y: 10pt, + /// ), + /// fill: (col, _) => (red, blue).at(col), + /// [Hello], + /// [World], + /// ) + /// ``` + #[fold] + #[default(Sides::splat(Abs::pt(0.0).into()))] + pub inset: Sides>>, + + /// The contents of the grid cells. + /// + /// The cells are populated in row-major order. + #[variadic] + pub children: Vec, +} + +#[scope] +impl GridElem { + #[elem] + type GridCell; +} + +impl Layout for GridElem { + #[typst_macros::time(name = "grid", span = self.span())] + fn layout( + &self, + engine: &mut Engine, + styles: StyleChain, + regions: Regions, + ) -> SourceResult { + let inset = self.inset(styles); + let align = self.align(styles); + let columns = self.columns(styles); + let rows = self.rows(styles); + let column_gutter = self.column_gutter(styles); + let row_gutter = self.row_gutter(styles); + let fill = self.fill(styles); + let stroke = self.stroke(styles).map(Stroke::unwrap_or_default); + + let tracks = Axes::new(columns.0.as_slice(), rows.0.as_slice()); + let gutter = Axes::new(column_gutter.0.as_slice(), row_gutter.0.as_slice()); + let grid = CellGrid::resolve( + tracks, + gutter, + self.children(), + fill, + align, + inset, + engine, + styles, + )?; + + let layouter = GridLayouter::new(&grid, &stroke, regions, styles, self.span()); + + // Measure the columns and layout the grid row-by-row. + layouter.layout(engine) + } +} + +/// Track sizing definitions. +#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)] +pub struct TrackSizings(pub SmallVec<[Sizing; 4]>); + +cast! { + TrackSizings, + self => self.0.into_value(), + sizing: Sizing => Self(smallvec![sizing]), + count: NonZeroUsize => Self(smallvec![Sizing::Auto; count.get()]), + values: Array => Self(values.into_iter().map(Value::cast).collect::>()?), +} + +/// A cell in the grid. Use this to either override grid properties for a +/// particular cell, or in show rules to apply certain styles to multiple cells +/// at once. +/// +/// For example, you can override the fill, alignment or inset for a single +/// cell: +/// +/// ```example +/// #grid( +/// columns: 2, +/// fill: red, +/// align: left, +/// inset: 5pt, +/// [ABC], [ABC], +/// grid.cell(fill: blue)[C], [D], +/// grid.cell(align: center)[E], [F], +/// [G], grid.cell(inset: 0pt)[H] +/// ) +/// ``` +#[elem(name = "cell", title = "Grid Cell", Show)] +pub struct GridCell { + /// The cell's body. + #[required] + body: Content, + + /// The cell's fill override. + fill: Smart>, + + /// The cell's alignment override. + align: Smart, + + /// The cell's inset override. + inset: Smart>>>, +} + +cast! { + GridCell, + v: Content => v.into(), +} + +impl Default for GridCell { + fn default() -> Self { + Self::new(Content::default()) + } +} + +impl ResolvableCell for GridCell { + fn resolve_cell( + mut self, + _: usize, + _: usize, + fill: &Option, + align: Smart, + inset: Sides>, + styles: StyleChain, + ) -> Cell { + let fill = self.fill(styles).unwrap_or_else(|| fill.clone()); + self.push_fill(Smart::Custom(fill.clone())); + self.push_align(match align { + Smart::Custom(align) => { + Smart::Custom(self.align(styles).map_or(align, |inner| inner.fold(align))) + } + // Don't fold if the grid is using outer alignment. Use the + // cell's alignment instead (which, in the end, will fold with + // the outer alignment when it is effectively displayed). + Smart::Auto => self.align(styles), + }); + self.push_inset(Smart::Custom( + self.inset(styles).map_or(inset, |inner| inner.fold(inset)).map(Some), + )); + + Cell { body: self.pack(), fill } + } +} + +impl Show for GridCell { + fn show(&self, _engine: &mut Engine, styles: StyleChain) -> SourceResult { + show_grid_cell(self.body().clone(), self.inset(styles), self.align(styles)) + } +} + +impl From for GridCell { + fn from(value: Content) -> Self { + value + .to::() + .cloned() + .unwrap_or_else(|| Self::new(value.clone())) + } +} + +/// Function with common code to display a grid cell or table cell. +pub fn show_grid_cell( + mut body: Content, + inset: Smart>>>, + align: Smart, +) -> SourceResult { + let inset = inset.unwrap_or_default().map(Option::unwrap_or_default); + + if inset != Sides::default() { + // Only pad if some inset is not 0pt. + // Avoids a bug where using .padded() in any way inside Show causes + // alignment in align(...) to break. + body = body.padded(inset); + } + + if let Smart::Custom(alignment) = align { + body = body.styled(AlignElem::set_alignment(alignment)); + } + + Ok(body) +} diff --git a/crates/typst/src/model/bibliography.rs b/crates/typst/src/model/bibliography.rs index fa35936b3..62e6d986f 100644 --- a/crates/typst/src/model/bibliography.rs +++ b/crates/typst/src/model/bibliography.rs @@ -29,7 +29,7 @@ use crate::foundations::{ }; use crate::introspection::{Introspector, Locatable, Location}; use crate::layout::{ - BlockElem, Em, GridElem, HElem, PadElem, Sizing, TrackSizings, VElem, + BlockElem, Em, GridCell, GridElem, HElem, PadElem, Sizing, TrackSizings, VElem, }; use crate::model::{ CitationForm, CiteGroup, Destination, FootnoteElem, HeadingElem, LinkElem, ParElem, @@ -239,8 +239,8 @@ impl Show for BibliographyElem { if references.iter().any(|(prefix, _)| prefix.is_some()) { let mut cells = vec![]; for (prefix, reference) in references { - cells.push(prefix.clone().unwrap_or_default()); - cells.push(reference.clone()); + cells.push(GridCell::new(prefix.clone().unwrap_or_default())); + cells.push(GridCell::new(reference.clone())); } seq.push(VElem::new(row_gutter).with_weakness(3).pack()); @@ -947,7 +947,7 @@ impl ElemRenderer<'_> { if let Some(prefix) = suf_prefix { const COLUMN_GUTTER: Em = Em::new(0.65); - content = GridElem::new(vec![prefix, content]) + content = GridElem::new(vec![GridCell::new(prefix), GridCell::new(content)]) .spanned(self.span) .with_columns(TrackSizings(smallvec![Sizing::Auto; 2])) .with_column_gutter(TrackSizings(smallvec![COLUMN_GUTTER.into()])) diff --git a/crates/typst/src/model/enum.rs b/crates/typst/src/model/enum.rs index bb44f438a..7f3ffae1a 100644 --- a/crates/typst/src/model/enum.rs +++ b/crates/typst/src/model/enum.rs @@ -6,8 +6,8 @@ use crate::foundations::{ cast, elem, scope, Array, Content, Fold, NativeElement, Smart, StyleChain, }; use crate::layout::{ - Align, Axes, BlockElem, Celled, Em, Fragment, GridLayouter, HAlign, Layout, Length, - Regions, Sizing, Spacing, VAlign, + Align, Axes, BlockElem, Cell, CellGrid, Em, Fragment, GridLayouter, HAlign, Layout, + Length, Regions, Sizing, Spacing, VAlign, }; use crate::model::{Numbering, NumberingPattern, ParElem}; use crate::text::TextElem; @@ -259,16 +259,17 @@ impl Layout for EnumElem { let resolved = resolved.aligned(number_align).styled(TextElem::set_overhang(false)); - cells.push(Content::empty()); - cells.push(resolved); - cells.push(Content::empty()); - cells.push(item.body().clone().styled(Self::set_parents(Parent(number)))); + cells.push(Cell::from(Content::empty())); + cells.push(Cell::from(resolved)); + cells.push(Cell::from(Content::empty())); + cells.push(Cell::from( + item.body().clone().styled(Self::set_parents(Parent(number))), + )); number = number.saturating_add(1); } - let fill = Celled::Value(None); let stroke = None; - let layouter = GridLayouter::new( + let grid = CellGrid::new( Axes::with_x(&[ Sizing::Rel(indent.into()), Sizing::Auto, @@ -276,15 +277,12 @@ impl Layout for EnumElem { Sizing::Auto, ]), Axes::with_y(&[gutter.into()]), - &cells, - &fill, - &stroke, - regions, + cells, styles, - self.span(), ); + let layouter = GridLayouter::new(&grid, &stroke, regions, styles, self.span()); - Ok(layouter.layout(engine)?.fragment) + layouter.layout(engine) } } diff --git a/crates/typst/src/model/list.rs b/crates/typst/src/model/list.rs index 48913fc77..520657bb2 100644 --- a/crates/typst/src/model/list.rs +++ b/crates/typst/src/model/list.rs @@ -5,8 +5,8 @@ use crate::foundations::{ Value, }; use crate::layout::{ - Axes, BlockElem, Celled, Em, Fragment, GridLayouter, HAlign, Layout, Length, Regions, - Sizing, Spacing, VAlign, + Axes, BlockElem, Cell, CellGrid, Em, Fragment, GridLayouter, HAlign, Layout, Length, + Regions, Sizing, Spacing, VAlign, }; use crate::model::ParElem; use crate::text::TextElem; @@ -160,15 +160,14 @@ impl Layout for ListElem { let mut cells = vec![]; for item in self.children() { - cells.push(Content::empty()); - cells.push(marker.clone()); - cells.push(Content::empty()); - cells.push(item.body().clone().styled(Self::set_depth(Depth))); + cells.push(Cell::from(Content::empty())); + cells.push(Cell::from(marker.clone())); + cells.push(Cell::from(Content::empty())); + cells.push(Cell::from(item.body().clone().styled(Self::set_depth(Depth)))); } - let fill = Celled::Value(None); let stroke = None; - let layouter = GridLayouter::new( + let grid = CellGrid::new( Axes::with_x(&[ Sizing::Rel(indent.into()), Sizing::Auto, @@ -176,15 +175,12 @@ impl Layout for ListElem { Sizing::Auto, ]), Axes::with_y(&[gutter.into()]), - &cells, - &fill, - &stroke, - regions, + cells, styles, - self.span(), ); + let layouter = GridLayouter::new(&grid, &stroke, regions, styles, self.span()); - Ok(layouter.layout(engine)?.fragment) + layouter.layout(engine) } } diff --git a/crates/typst/src/model/table.rs b/crates/typst/src/model/table.rs index 339204455..169289aa0 100644 --- a/crates/typst/src/model/table.rs +++ b/crates/typst/src/model/table.rs @@ -1,9 +1,11 @@ use crate::diag::SourceResult; use crate::engine::Engine; -use crate::foundations::{elem, Content, NativeElement, Smart, StyleChain}; +use crate::foundations::{ + cast, elem, scope, Content, Fold, NativeElement, Show, Smart, StyleChain, +}; use crate::layout::{ - apply_align_inset_to_cells, Abs, Align, Axes, Celled, Fragment, GridLayouter, Layout, - Length, Regions, Rel, Sides, TrackSizings, + show_grid_cell, Abs, Align, Axes, Cell, CellGrid, Celled, Fragment, GridLayouter, + Layout, Length, Regions, Rel, ResolvableCell, Sides, TrackSizings, }; use crate::model::Figurable; use crate::text::{Lang, LocalName, Region}; @@ -13,9 +15,15 @@ use crate::visualize::{Paint, Stroke}; /// /// Tables are used to arrange content in cells. Cells can contain arbitrary /// content, including multiple paragraphs and are specified in row-major order. -/// Because tables are just grids with configurable cell properties, refer to -/// the [grid documentation]($grid) for more information on how to size the -/// table tracks. +/// Because tables are just grids with different defaults for some cell +/// properties (notably `stroke` and `inset`), refer to the +/// [grid documentation]($grid) for more information on how to size the table +/// tracks and specify the cell appearance properties. +/// +/// Note that, to override a particular cell's properties or apply show rules +/// on table cells, you can use the [`table.cell`]($table.cell) element (but +/// not `grid.cell`, which is exclusive to grids). See its documentation for +/// more information. /// /// To give a table a caption and make it [referenceable]($ref), put it into a /// [figure]($figure). @@ -39,7 +47,7 @@ use crate::visualize::{Paint, Stroke}; /// [$a$: edge length] /// ) /// ``` -#[elem(Layout, LocalName, Figurable)] +#[elem(scope, Layout, LocalName, Figurable)] pub struct TableElem { /// The column sizes. See the [grid documentation]($grid) for more /// information on track sizing. @@ -149,7 +157,13 @@ pub struct TableElem { /// The contents of the table cells. #[variadic] - pub children: Vec, + pub children: Vec, +} + +#[scope] +impl TableElem { + #[elem] + type TableCell; } impl Layout for TableElem { @@ -171,22 +185,20 @@ impl Layout for TableElem { let tracks = Axes::new(columns.0.as_slice(), rows.0.as_slice()); let gutter = Axes::new(column_gutter.0.as_slice(), row_gutter.0.as_slice()); - let cells = - apply_align_inset_to_cells(engine, &tracks, self.children(), align, inset)?; - - // Prepare grid layout by unifying content and gutter tracks. - let layouter = GridLayouter::new( + let grid = CellGrid::resolve( tracks, gutter, - &cells, + self.children(), fill, - &stroke, - regions, + align, + inset, + engine, styles, - self.span(), - ); + )?; - Ok(layouter.layout(engine)?.fragment) + let layouter = GridLayouter::new(&grid, &stroke, regions, styles, self.span()); + + layouter.layout(engine) } } @@ -227,3 +239,92 @@ impl LocalName for TableElem { } impl Figurable for TableElem {} + +/// A cell in the table. Use this to either override table properties for a +/// particular cell, or in show rules to apply certain styles to multiple cells +/// at once. +/// +/// For example, you can override the fill, alignment or inset for a single +/// cell: +/// +/// ```example +/// #table( +/// columns: 2, +/// fill: green, +/// align: right, +/// [*Name*], [*Data*], +/// table.cell(fill: blue)[J.], [Organizer], +/// table.cell(align: center)[K.], [Leader], +/// [M.], table.cell(inset: 0pt)[Player] +/// ) +/// ``` +#[elem(name = "cell", title = "Table Cell", Show)] +pub struct TableCell { + /// The cell's body. + #[required] + body: Content, + + /// The cell's fill override. + fill: Smart>, + + /// The cell's alignment override. + align: Smart, + + /// The cell's inset override. + inset: Smart>>>, +} + +cast! { + TableCell, + v: Content => v.into(), +} + +impl Default for TableCell { + fn default() -> Self { + Self::new(Content::default()) + } +} + +impl ResolvableCell for TableCell { + fn resolve_cell( + mut self, + _: usize, + _: usize, + fill: &Option, + align: Smart, + inset: Sides>, + styles: StyleChain, + ) -> Cell { + let fill = self.fill(styles).unwrap_or_else(|| fill.clone()); + self.push_fill(Smart::Custom(fill.clone())); + self.push_align(match align { + Smart::Custom(align) => { + Smart::Custom(self.align(styles).map_or(align, |inner| inner.fold(align))) + } + // Don't fold if the table is using outer alignment. Use the + // cell's alignment instead (which, in the end, will fold with + // the outer alignment when it is effectively displayed). + Smart::Auto => self.align(styles), + }); + self.push_inset(Smart::Custom( + self.inset(styles).map_or(inset, |inner| inner.fold(inset)).map(Some), + )); + + Cell { body: self.pack(), fill } + } +} + +impl Show for TableCell { + fn show(&self, _engine: &mut Engine, styles: StyleChain) -> SourceResult { + show_grid_cell(self.body().clone(), self.inset(styles), self.align(styles)) + } +} + +impl From for TableCell { + fn from(value: Content) -> Self { + value + .to::() + .cloned() + .unwrap_or_else(|| Self::new(value.clone())) + } +} diff --git a/tests/ref/layout/grid-cell.png b/tests/ref/layout/grid-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..fb68312366c07430039a3cc8f95a6185e04de736 GIT binary patch literal 39178 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 T9MI?C00000NkvXXu0mjfL$pFq diff --git a/tests/ref/layout/table-cell.png b/tests/ref/layout/table-cell.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3d04ccb4735836aec8a77156059a6c8a05ea26 GIT binary patch literal 41893 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 LRVEW_==;9_jEbPy diff --git a/tests/typ/layout/grid-cell.typ b/tests/typ/layout/grid-cell.typ new file mode 100644 index 000000000..ced16a97a --- /dev/null +++ b/tests/typ/layout/grid-cell.typ @@ -0,0 +1,107 @@ +// Test basic styling using the grid.cell element. + +--- +// Cell override +#grid( + align: left, + fill: red, + stroke: blue, + inset: 5pt, + columns: 2, + [AAAAA], [BBBBB], + [A], [B], + grid.cell(align: right)[C], [D], + align(right)[E], [F], + align(horizon)[G], [A\ A\ A], + grid.cell(align: horizon)[G2], [A\ A\ A], + grid.cell(inset: 0pt)[I], [F], + [H], grid.cell(fill: blue)[J] +) + +--- +// Cell show rule +#show grid.cell: it => [Zz] + +#grid( + align: left, + fill: red, + stroke: blue, + inset: 5pt, + columns: 2, + [AAAAA], [BBBBB], + [A], [B], + grid.cell(align: right)[C], [D], + align(right)[E], [F], + align(horizon)[G], [A\ A\ A] +) + +--- +#show grid.cell: it => (it.align, it.fill) +#grid( + align: left, + row-gutter: 5pt, + [A], + grid.cell(align: right)[B], + grid.cell(fill: aqua)[B], +) + +--- +// Cell set rules +#set grid.cell(align: center) +#show grid.cell: it => (it.align, it.fill, it.inset) +#set grid.cell(inset: 20pt) +#grid( + align: left, + row-gutter: 5pt, + [A], + grid.cell(align: right)[B], + grid.cell(fill: aqua)[B], +) + +--- +// Test folding per-cell properties (align and inset) +#grid( + columns: (1fr, 1fr), + rows: (2.5em, auto), + align: right, + inset: 5pt, + fill: (x, y) => (green, aqua).at(calc.rem(x + y, 2)), + [Top], grid.cell(align: bottom)[Bot], + grid.cell(inset: (bottom: 0pt))[Bot], grid.cell(inset: (bottom: 0pt))[Bot] +) + +--- +// Test overriding outside alignment +#set align(bottom + right) +#grid( + columns: (1fr, 1fr), + rows: 2em, + align: auto, + fill: green, + [BR], [BR], + grid.cell(align: left, fill: aqua)[BL], grid.cell(align: top, fill: red.lighten(50%))[TR] +) + +--- +// First doc example +#grid( + columns: 2, + fill: red, + align: left, + inset: 5pt, + [ABC], [ABC], + grid.cell(fill: blue)[C], [D], + grid.cell(align: center)[E], [F], + [G], grid.cell(inset: 0pt)[H] +) + +--- +#{ + show grid.cell: emph + grid( + columns: 2, + gutter: 3pt, + [Hello], [World], + [Sweet], [Italics] + ) +} diff --git a/tests/typ/layout/grid-styling.typ b/tests/typ/layout/grid-styling.typ index 577e15c4b..e076d0c4c 100644 --- a/tests/typ/layout/grid-styling.typ +++ b/tests/typ/layout/grid-styling.typ @@ -87,3 +87,48 @@ a [A], [B], ) + +--- +// Test interaction with gutters. +#grid( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + +#grid( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + row-gutter: 5pt, + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + +#grid( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + column-gutter: 5pt, + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + +#grid( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + gutter: 5pt, + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) diff --git a/tests/typ/layout/table-cell.typ b/tests/typ/layout/table-cell.typ new file mode 100644 index 000000000..a4d3bba47 --- /dev/null +++ b/tests/typ/layout/table-cell.typ @@ -0,0 +1,102 @@ +// Test basic styling using the table.cell element. + +--- +// Cell override +#table( + align: left, + fill: red, + stroke: blue, + columns: 2, + [AAAAA], [BBBBB], + [A], [B], + table.cell(align: right)[C], [D], + align(right)[E], [F], + align(horizon)[G], [A\ A\ A], + table.cell(align: horizon)[G2], [A\ A\ A], + table.cell(inset: 0pt)[I], [F], + [H], table.cell(fill: blue)[J] +) + +--- +// Cell show rule +#show table.cell: it => [Zz] + +#table( + align: left, + fill: red, + stroke: blue, + columns: 2, + [AAAAA], [BBBBB], + [A], [B], + table.cell(align: right)[C], [D], + align(right)[E], [F], + align(horizon)[G], [A\ A\ A] +) + +--- +#show table.cell: it => (it.align, it.fill) +#table( + align: left, + row-gutter: 5pt, + [A], + table.cell(align: right)[B], + table.cell(fill: aqua)[B], +) + +--- +// Cell set rules +#set table.cell(align: center) +#show table.cell: it => (it.align, it.fill, it.inset) +#set table.cell(inset: 20pt) +#table( + align: left, + row-gutter: 5pt, + [A], + table.cell(align: right)[B], + table.cell(fill: aqua)[B], +) + +--- +// Test folding per-cell properties (align and inset) +#table( + columns: (1fr, 1fr), + rows: (2.5em, auto), + align: right, + fill: (x, y) => (green, aqua).at(calc.rem(x + y, 2)), + [Top], table.cell(align: bottom)[Bot], + table.cell(inset: (bottom: 0pt))[Bot], table.cell(inset: (bottom: 0pt))[Bot] +) + +--- +// Test overriding outside alignment +#set align(bottom + right) +#table( + columns: (1fr, 1fr), + rows: 2em, + align: auto, + fill: green, + [BR], [BR], + table.cell(align: left, fill: aqua)[BL], table.cell(align: top, fill: red.lighten(50%))[TR] +) + +--- +// First doc example +#table( + columns: 2, + fill: green, + align: right, + [*Name*], [*Data*], + table.cell(fill: blue)[J.], [Organizer], + table.cell(align: center)[K.], [Leader], + [M.], table.cell(inset: 0pt)[Player] +) + +--- +#{ + show table.cell: emph + table( + columns: 2, + [Person], [Animal], + [John], [Dog] + ) +} diff --git a/tests/typ/layout/table.typ b/tests/typ/layout/table.typ index 529f27201..1b250aa4c 100644 --- a/tests/typ/layout/table.typ +++ b/tests/typ/layout/table.typ @@ -61,6 +61,51 @@ [B], ) +--- +// Test interaction with gutters. +#table( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + +#table( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + row-gutter: 5pt, + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + +#table( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + column-gutter: 5pt, + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + +#table( + columns: (3em, 3em), + fill: (x, y) => (red, blue).at(calc.rem(x, 2)), + align: (x, y) => (left, right).at(calc.rem(y, 2)), + gutter: 5pt, + [A], [B], + [C], [D], + [E], [F], + [G], [H] +) + --- // Ref: false #table()