From 3faad6bc5d7d6b7d83329363dd66b136b526afb8 Mon Sep 17 00:00:00 2001 From: SekoiaTree <51149447+SekoiaTree@users.noreply.github.com> Date: Sun, 22 Oct 2023 13:22:34 +0200 Subject: [PATCH] Add support for negative augment indexes (#2372) --- crates/typst-library/src/math/matrix.rs | 37 ++++++++++++++---------- tests/ref/math/matrix.png | Bin 40018 -> 44173 bytes tests/typ/math/matrix.typ | 4 +++ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/crates/typst-library/src/math/matrix.rs b/crates/typst-library/src/math/matrix.rs index 91310ed3a..333a57066 100644 --- a/crates/typst-library/src/math/matrix.rs +++ b/crates/typst-library/src/math/matrix.rs @@ -97,7 +97,7 @@ pub struct MatElem { /// /// - `{none}`: No lines are drawn. /// - A single number: A vertical augmentation line is drawn - /// after the specified column number. + /// after the specified column number. Negative numbers start from the end. /// - A dictionary: With a dictionary, multiple augmentation lines can be /// drawn both horizontally and vertically. Additionally, the style of the /// lines can be set. The dictionary can contain the following keys: @@ -105,17 +105,19 @@ pub struct MatElem { /// For example, an offset of `2` would result in a horizontal line /// being drawn after the second row of the matrix. Accepts either an /// integer for a single line, or an array of integers - /// for multiple lines. + /// for multiple lines. Like for a single number, negative numbers start from the end. /// - `vline`: The offsets at which vertical lines should be drawn. /// For example, an offset of `2` would result in a vertical line being /// drawn after the second column of the matrix. Accepts either an /// integer for a single line, or an array of integers - /// for multiple lines. + /// for multiple lines. Like for a single number, negative numbers start from the end. /// - `stroke`: How to [stroke]($stroke) the line. If set to `{auto}`, /// takes on a thickness of 0.05em and square line caps. /// /// ```example /// $ mat(1, 0, 1; 0, 1, 2; augment: #2) $ + /// // Equivalent to: + /// $ mat(1, 0, 1; 0, 1, 2; augment: #(-1)) $ /// ``` /// /// ```example @@ -200,15 +202,16 @@ impl LayoutMath for MatElem { // validate inputs let augment = self.augment(ctx.styles()); + let rows = self.rows(); if let Some(aug) = &augment { for &offset in &aug.hline.0 { - if offset == 0 || offset >= self.rows().len() { + if offset == 0 || offset.unsigned_abs() >= rows.len() { bail!( self.span(), "cannot draw a horizontal line after row {} of a matrix with {} rows", - offset, - self.rows().len() + if offset < 0 { rows.len() as isize + offset } else { offset }, + rows.len() ); } } @@ -216,11 +219,11 @@ impl LayoutMath for MatElem { let ncols = self.rows().first().map_or(0, |row| row.len()); for &offset in &aug.vline.0 { - if offset == 0 || offset >= ncols { + if offset == 0 || offset.unsigned_abs() >= ncols { bail!( self.span(), "cannot draw a vertical line after column {} of a matrix with {} columns", - offset, + if offset < 0 { ncols as isize + offset } else { offset }, ncols ); } @@ -230,7 +233,7 @@ impl LayoutMath for MatElem { let delim = self.delim(ctx.styles()); let frame = layout_mat_body( ctx, - &self.rows(), + &rows, augment, Axes::new(self.column_gap(ctx.styles()), self.row_gap(ctx.styles())), self.span(), @@ -472,7 +475,9 @@ fn layout_mat_body( x += rcol; // If a vertical line should be inserted after this column - if vline.0.contains(&(index + 1)) { + if vline.0.contains(&(index as isize + 1)) + || vline.0.contains(&(1 - ((ncols - index) as isize))) + { frame.push( Point::with_x(x + half_gap.x), line_item(total_height, true, stroke.clone(), span), @@ -488,8 +493,10 @@ fn layout_mat_body( // This allows the horizontal lines to be laid out for line in hline.0 { - let offset = (heights[0..line].iter().map(|&(a, b)| a + b).sum::() - + gap.y * (line - 1) as f64) + let real_line = + if line < 0 { nrows - line.unsigned_abs() } else { line as usize }; + let offset = (heights[0..real_line].iter().map(|&(a, b)| a + b).sum::() + + gap.y * (real_line - 1) as f64) + half_gap.y; frame.push( @@ -605,7 +612,7 @@ cast! { d.into_value() }, - v: usize => Augment { + v: isize => Augment { hline: Offsets::default(), vline: Offsets(vec![v]), stroke: Smart::Auto, @@ -632,11 +639,11 @@ cast! { /// The offsets at which augmentation lines /// should be drawn on a matrix. #[derive(Debug, Default, Clone, Hash)] -pub struct Offsets(Vec); +pub struct Offsets(Vec); cast! { Offsets, self => self.0.into_value(), - v: usize => Self(vec![v]), + v: isize => Self(vec![v]), v: Array => Self(v.into_iter().map(Value::cast).collect::>()?), } diff --git a/tests/ref/math/matrix.png b/tests/ref/math/matrix.png index 530c2b5a5f521d0eea0d03179ffe7e797385eaa1..32181c69c96b1d77f535b90cf392f960ce1774c1 100644 GIT binary patch delta 18633 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 delta 14412 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 A0{{R3 diff --git a/tests/typ/math/matrix.typ b/tests/typ/math/matrix.typ index efcde1eb1..57ecd85fd 100644 --- a/tests/typ/math/matrix.typ +++ b/tests/typ/math/matrix.typ @@ -72,9 +72,13 @@ $ mat(#1, #(foo: "bar")) $ gutter: 10pt, $ mat(10, 2, 3, 4; 5, 6, 7, 8; augment: #3) $, + $ mat(10, 2, 3, 4; 5, 6, 7, 8; augment: #(-1)) $, $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(hline: 2)) $, + $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(hline: -1)) $, $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(hline: 1, vline: 1)) $, + $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(hline: -2, vline: -2)) $, $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(vline: 2, stroke: 1pt + blue)) $, + $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(vline: -1, stroke: 1pt + blue)) $, ) ---