From 7dc7c82cb9f8b8c96ee394b7fb55b6c59180bdb3 Mon Sep 17 00:00:00 2001 From: siddhantdev Date: Tue, 4 Feb 2025 16:34:58 +0530 Subject: [PATCH] Allow augment line at the beginning and end of a matrix Allows augment lines at the begginnig and end of a matrix. Augment 0 draws a line before the first column/row and augment n draws a line after the last column/row of a matrix with n columns/rows. -1 now draws a line after the last column/row of the matrix, not before it. --- crates/typst-layout/src/math/mat.rs | 51 ++++++++++++++++++++++------ tests/ref/math-mat-augment.png | Bin 3631 -> 12519 bytes tests/suite/math/mat.typ | 10 ++++-- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/crates/typst-layout/src/math/mat.rs b/crates/typst-layout/src/math/mat.rs index d678f8658..7045084db 100644 --- a/crates/typst-layout/src/math/mat.rs +++ b/crates/typst-layout/src/math/mat.rs @@ -84,7 +84,7 @@ pub fn layout_mat( let augment = elem.augment(styles); if let Some(aug) = &augment { for &offset in &aug.hline.0 { - if offset == 0 || offset.unsigned_abs() >= rows.len() { + if offset > rows.len() as isize || offset.unsigned_abs() > rows.len() + 1 { bail!( span, "cannot draw a horizontal line after row {} of a matrix with {} rows", @@ -95,7 +95,7 @@ pub fn layout_mat( } for &offset in &aug.vline.0 { - if offset == 0 || offset.unsigned_abs() >= ncols { + if offset > ncols as isize || offset.unsigned_abs() > ncols + 1 { bail!( span, "cannot draw a vertical line after column {} of a matrix with {} columns", @@ -211,18 +211,39 @@ fn layout_body( // For each row, combine maximum ascent and descent into a row height. // Sum the row heights, then add the total height of the gaps between rows. - let total_height = + let mut total_height = heights.iter().map(|&(a, b)| a + b).sum::() + gap.y * (nrows - 1) as f64; + if hline.0.contains(&0_isize) || hline.0.contains(&-(nrows as isize + 1)) { + total_height += gap.y; + } + + if hline.0.contains(&(nrows as isize)) || hline.0.contains(&-1) { + total_height += gap.y; + } + // Width starts at zero because it can't be calculated until later let mut frame = Frame::soft(Size::new(Abs::zero(), total_height)); let mut x = Abs::zero(); + if vline.0.contains(&(0_isize)) || vline.0.contains(&-(ncols as isize + 1)) { + frame.push( + Point::with_x(x + half_gap.x), + line_item(total_height, true, stroke.clone(), span), + ); + x += gap.x; + } + for (index, col) in cols.into_iter().enumerate() { let AlignmentResult { points, width: rcol } = alignments(&col); - let mut y = Abs::zero(); + let mut y = + if hline.0.contains(&0_isize) || hline.0.contains(&-(nrows as isize + 1)) { + gap.y + } else { + Abs::zero() + }; for (cell, &(ascent, descent)) in col.into_iter().zip(&heights) { let cell = cell.into_line_frame(&points, alternator); @@ -245,7 +266,7 @@ fn layout_body( // If a vertical line should be inserted after this column if vline.0.contains(&(index as isize + 1)) - || vline.0.contains(&(1 - ((ncols - index) as isize))) + || (vline.0.contains(&(index as isize - ncols as isize))) { frame.push( Point::with_x(x + half_gap.x), @@ -257,16 +278,24 @@ fn layout_body( x += gap.x; } - // Once all the columns are laid out, the total width can be calculated - let total_width = x - gap.x; + let total_width = + if !(vline.0.contains(&(ncols as isize)) || vline.0.contains(&-1_isize)) { + x - gap.x + } else { + x + }; // This allows the horizontal lines to be laid out for line in hline.0 { 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; + if line < 0 { nrows + 1 - line.unsigned_abs() } else { line as usize }; + let offset = if line == 0 || real_line == 0 { + gap.y + } else { + (heights[0..real_line].iter().map(|&(a, b)| a + b).sum::() + + gap.y * (real_line - 1) as f64) + + half_gap.y + }; frame.push( Point::with_y(offset), diff --git a/tests/ref/math-mat-augment.png b/tests/ref/math-mat-augment.png index 0e2a42a241c8195744b2442e32bbaaffa1920ffe..40c8233ca7167c3bb63c9adeffcdf93efc09281a 100644 GIT binary patch literal 12519 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

a$B&0lJ0YacxLnp%A4%>t9e?zf=_L#i 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 literal 3631 zcmV+~4$$$5P)R0008tP)t-s|NsB~ z{{H>_{rvp=`}_O)`uh3#`S|$w_xJbq_V)Gl_4M@g^Yioa^78TV@$m5Q@9*#K?(XgF z?d+9?4>gws~>FDU_=jZ3<=H}()<>ch#(^($dk<(a_M)&(F`!&d$xv&CJZq%gf8k z%F4;f$;ima$H&LU#>U0P#iY&g#KgqI!^6VD!ok78z`(%2zrVh|zP-J@yu7@-ySuu& zy1BWzxVX5tx3{*owzajjw6wIdv$L|YvazwTu&}VNudlAIuC1-DtgNhjx9h8`tE#H1 zsi~=`sHmr>r>3T+rKP2$q@<&xqoSgsp`oFmprD_hpPrtcot>SWoSd7Ro0^)MnVFfG zn3$KBmzI{6m6es0l$4W`lai8>k&%&*kdTj$kB*Lxjg5_rjEswmi;9YhiHV7bh=_-W zhlYlRg@uKLgoJ~GgMxyBfq{X5fPjC0e|~;`eSLj=e0+O*dwP0$d3kwwczAbrcXoDm zb#--gbaZobb8>QWadB~QaBy#LZ*FdGZEbCAY;0?5Yieq0X=!O_XlQ3=XJ%$*Wo2b# zWMpGwV`5@rVPRolU|?TgUtV5bU0q!OblF^7Tw7aPT3T9JSy@56%`Z|6cZB@5)u*)4h{_s4Gatn2nYxV2L}cQ1_cEL1Ox;F0|NpA0s#R5 z0000qc8hZW01FFAL_t(|+U?ruQ&r~y$MNswUfCB>P<9m|AfRGY7VAdbaJv$<3MeWf zA|Qwc>V`XLG%C2a8ZkDe8jM*?Oj4H^o5jSYNz*3Lm|D}cO-*jL%Fi zJhz!iruXyWdBM#0cl3F2W;g>L9v&V)XI<9fLQDd>+HmDeW_zJCSbTtB9~`26aR?3o zvc>}VgkalYQ_W<{20_k&`7men{NV_td98&A)x$Q_84FG0A$hrKCh<8angwtgUO{8M zLeGy88smnabS(5cHXbTQWZk_ky&M4s3 z81>97XE&P4DmY?`+KaGwc~Juz+qX}*jO2v% zW+RLtVj5!MU{^K(EH6{f%yRZS7B-A4#=-xKnTu0#ScbkZ=6d5mfW1T2GqZ>@=sIyE z7G3lWo9~~{^`Gxp7+mwgW`NUOP|wWH1fnSz#nvKpwrlVobi0Q;7Pe!3ArON9;7(>X zV-A`TNxawtht}Z8m(ZO{aV$LT#WpL=OR?IxVM0j|3{O?(C&Ej?@TRa%o zvMSxoWOJ%$i%E0c%4FRR0KPMUbbD|8(2ZG~iEiNZA;7*EcQV!Zbi zW<;*@yulO-HL^FAzon5k9bKr^MBtrchj`|)8o(3+s0$qtM#7MgPz zzfBzIEN}Ke=+rExM(kD2WR`0kjD_uEv2PLwx+NnqoEZpMu6wCwvi>JA7OH15r&JsW z<1!e6rlNv9YsJn0)l9Z>Gl19Re-;G!Z4TS-FAg+WS6_c?BAQWU$?x<6Si4*`lO0`% zrc+3$6|YPm#3A^1>C(l95R?;&rr@}0CVR_H+dXtqHIrRWr|nWdSIuNMqiDOxo2r@Y zRs?MqaZ5Fm-Auxy7?U;mbykGX*##DWq?>A)%m49|vzWZv&4-y5B8Mj-lvY9_m#MB63ZR?L1%Z?0RBz_3-W4Fe)?sb;b-k^wK9 zYhFO_f2d}%OT#gwZmh1Fgwue@51|`3BL~g+cU3dlv(qsYE~?m(2ZpplX7@ld{4sWQ z11LYPn#tC##Lx{}B~I~gM$|;2*<4CR4Zz0rs+nx?%Q%(AV6y$+4G6_`G;INRW{7Gg zvt0*+*GrhB&rQ5E6pgiR){`p$uWMH2O!nJM3<W3~Y1|Z^uJDDtb3vJVs=2j-F&7v)) z)Vi6;>eFzo??$&XSpcpDC}y5-Y91aQKZ-#^acyw6o0;sv{YdhVtRCQ2Ci6Sy14IMf z18t6jbwJo)e{}v?zF;}(<4z`P907i_uYv!zt~-3hAr>B(H{|UoG~FMKc`pVsHld!$ zf={A(A4>C?Q7jIzP_=@la($tcx08XhA?lf|KHpe)bQ}{J#32?e9XOSZ5L&YaV9rwY zOm;cMSlE@zgze%G3ovdK4&6`10Dhk;XR_{ZU@X*6p`b<_`a((x31~)+V$TYIKgO$O zvhp2h0>1Yz}sb;dAo7gRIZcPSWp_X#jB;7xM| znk}n%q#PjSJJn2fw+DvOc{QJmb}kgmroI|YbsY;D0eak3%v@YG8JB{b3%v&Md_0;i zE$kks-`#D}Vx>{K3xDK9;DZnbkEqRMYg z5Skt>zAXU&#V@L6vgT?GnNVqUE)3j9ej1wf3#cvuSiM6vli7cV)2Ixb3!J=Ii?DPd zs~Z7YCaGq!;J@K?1k*y-y3)_%(S-hH!t?6^t^_G(vh&?BM80NTSkZ-k^$5Np8^!~P z7t}MEy#Yf`t9fB^Dbq)y$=DQi*bAu3Lp_sSu;LIg+`K^A+)Q+Ng@J(2X?HT2eL)-F z1dAVbE0gUFZ_`53UiUIt;I0tv*PZ)yIuhh&CJRW$wd6p>%=2-}!^7jp5SET>>7Cuq zq=BacG01*_&Tmhcdzq{yjvw$84k0aWWwP02;5Yj%pw|9~eh5LeD-QXJh2YX@hXbLg z2=z?nb=C&(K1?cM!8mcCshY#%MPlK>U7XJZ%NthpOg5t$$HJQN*z3iCCMuCbQ^W$K zJZ}M37N}>kce)u1dvY1SLmcROK5Nw%Lg#Py2O=*jXR?kTVJvKz$dqN`KnQB^4H64+ zakMM|xY9{AlTF)?@MjoW%gVvxKx5mUJt$u+tS#eM1;C-Hs+nweJ%DxozRFPS_SuL- z721n;-TRPWD$-GudBr+Od%Nk!mKp(X$;3J#MIH@;8un zEJWN=&184tF!9I4f)~bu1x?%?w=(&Yq9N)8CSSdG(5f#KRyIfK-v$*kS65we7L%$F z5DVQ}85^tLnPTSR!DHgh3v9|At1r~xm&OH^96=3N78m!nS7C*#Uaq zQ_W=GCSh1TZ=w0mhO>vVs!}X0t)XlaK+?C0nTx9?<~5u~WwU>XSm@i#s%iS2DP}Gn zY+L-;D4gtbixCUVnqP&!pqj~U$F$>35OZ5KliiDN$3px)#q6i_%KSRE9ShyQQq5#n z`eX3(1)Gaw&EOIFm{DSEcovm-)sRWJfoV)4$i|c84AO| zFsz)31H{6TMJ%-gEPY%xlNIm5DKQTx@2eZ?tYV>YK1)^s>@HEwWU(LO)NIAcwygDo z5V4T5H|T{&0p5*P&SW14V+g*0N!bIGR*40A*f$gdVIQeyvZ`_n8P8(!NPkjG#X@== zt%1O-CF+^X|2&4?)tK0dOG+(b!Mn0972p+r)HB(NoHo7*CN6g;lUa}0+O!aO)aF(u z>($5)_$4~a6UlC7vXo3*%T80wJRi3_JUo8p{tMNpqmr@@GpPUo002ovPDHLkV1mAc B_7MO8 diff --git a/tests/suite/math/mat.typ b/tests/suite/math/mat.typ index 80f190605..0e14db8f5 100644 --- a/tests/suite/math/mat.typ +++ b/tests/suite/math/mat.typ @@ -96,12 +96,18 @@ $ mat(column-gap: #1em, 1, 2; 3, 4) $ 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: 0)) $, + $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(hline: -4)) $, $ 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)) $, + $ mat(10, 2, 3, 4; 5, 6, 7, 8; augment: #4) $, + $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(vline: 3, stroke: 1pt + blue)) $, + $ mat(100, 2, 3; 4, 5, 6; 7, 8, 9; augment: #(vline: 0, stroke: 1pt + blue)) $, + $ mat(10, 2, 3, 4; 5, 6, 7, 8; augment: #(vline: -5, stroke: 1pt + blue)) $, ) --- math-mat-augment-set --- @@ -115,8 +121,8 @@ $ mat(1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 1) $ #set math.mat(augment: none) --- math-mat-augment-line-out-of-bounds --- -// Error: 3-37 cannot draw a vertical line after column 3 of a matrix with 3 columns -$ mat(1, 0, 0; 0, 1, 1; augment: #3) $, +// Error: 3-37 cannot draw a vertical line after column 4 of a matrix with 3 columns +$ mat(1, 0, 0; 0, 1, 1; augment: #4) $, --- math-mat-align --- $ mat(-1, 1, 1; 1, -1, 1; 1, 1, -1; align: #left) $