From bc802bd8fb1656e5004b7c1b8a4e02ec7fc31aa8 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Mon, 24 Apr 2023 02:16:13 -0700 Subject: [PATCH] Fix broken matrices with alignment and optimize code while we're at it (#935) --- library/src/math/align.rs | 15 ++++++- library/src/math/matrix.rs | 27 +++++-------- library/src/math/row.rs | 7 +--- library/src/math/underover.rs | 16 +++----- tests/ref/math/alignment.png | Bin 23935 -> 6413 bytes tests/ref/math/matrix-alignment.png | Bin 0 -> 15027 bytes tests/typ/math/alignment.typ | 60 ---------------------------- tests/typ/math/matrix-alignment.typ | 55 +++++++++++++++++++++++++ 8 files changed, 86 insertions(+), 94 deletions(-) create mode 100644 tests/ref/math/matrix-alignment.png create mode 100644 tests/typ/math/matrix-alignment.typ diff --git a/library/src/math/align.rs b/library/src/math/align.rs index bbdda5fdc..4e4a76e97 100644 --- a/library/src/math/align.rs +++ b/library/src/math/align.rs @@ -15,10 +15,16 @@ impl LayoutMath for AlignPointElem { } } +pub(super) struct AlignmentResult { + pub points: Vec, + pub width: Abs, +} + /// Determine the position of the alignment points. -pub(super) fn alignments(rows: &[MathRow]) -> Vec { +pub(super) fn alignments(rows: &[MathRow]) -> AlignmentResult { let mut widths = Vec::::new(); + let mut pending_width = Abs::zero(); for row in rows { let mut width = Abs::zero(); let mut alignment_index = 0; @@ -28,6 +34,7 @@ pub(super) fn alignments(rows: &[MathRow]) -> Vec { widths[alignment_index].set_max(width); } else { widths.push(width); + pending_width = Abs::zero(); } width = Abs::zero(); alignment_index += 1; @@ -35,6 +42,7 @@ pub(super) fn alignments(rows: &[MathRow]) -> Vec { width += fragment.width(); } } + pending_width.set_max(width); } let mut points = widths; @@ -42,5 +50,8 @@ pub(super) fn alignments(rows: &[MathRow]) -> Vec { let prev = points[i - 1]; points[i] += prev; } - points + AlignmentResult { + width: points.last().copied().unwrap_or_default() + pending_width, + points, + } } diff --git a/library/src/math/matrix.rs b/library/src/math/matrix.rs index 956c7f8af..eb465a43d 100644 --- a/library/src/math/matrix.rs +++ b/library/src/math/matrix.rs @@ -242,16 +242,13 @@ fn layout_mat_body(ctx: &mut MathContext, rows: &[Vec]) -> SourceResult return Ok(Frame::new(Size::zero())); } - let mut widths = vec![Abs::zero(); ncols]; - let mut ascents = vec![Abs::zero(); nrows]; - let mut descents = vec![Abs::zero(); nrows]; + let mut heights = vec![(Abs::zero(), Abs::zero()); nrows]; ctx.style(ctx.style.for_denominator()); let mut cols = vec![vec![]; ncols]; - for ((row, ascent), descent) in rows.iter().zip(&mut ascents).zip(&mut descents) { - for ((cell, rcol), col) in row.iter().zip(&mut widths).zip(&mut cols) { + for (row, (ascent, descent)) in rows.iter().zip(&mut heights) { + for (cell, col) in row.iter().zip(&mut cols) { let cell = ctx.layout_row(cell)?; - rcol.set_max(cell.width()); ascent.set_max(cell.ascent()); descent.set_max(cell.descent()); col.push(cell); @@ -259,18 +256,15 @@ fn layout_mat_body(ctx: &mut MathContext, rows: &[Vec]) -> SourceResult } ctx.unstyle(); - let width = widths.iter().sum::() + col_gap * (ncols - 1) as f64; - let height = ascents.iter().sum::() - + descents.iter().sum::() - + row_gap * (nrows - 1) as f64; - let size = Size::new(width, height); - - let mut frame = Frame::new(size); + let mut frame = Frame::new(Size::new( + Abs::zero(), + heights.iter().map(|&(a, b)| a + b).sum::() + row_gap * (nrows - 1) as f64, + )); let mut x = Abs::zero(); - for (col, &rcol) in cols.into_iter().zip(&widths) { - let points = alignments(&col); + for col in cols { + let AlignmentResult { points, width: rcol } = alignments(&col); let mut y = Abs::zero(); - for ((cell, &ascent), &descent) in col.into_iter().zip(&ascents).zip(&descents) { + for (cell, &(ascent, descent)) in col.into_iter().zip(&heights) { let cell = cell.into_aligned_frame(ctx, &points, Align::Center); let pos = Point::new( if points.is_empty() { x + (rcol - cell.width()) / 2.0 } else { x }, @@ -281,6 +275,7 @@ fn layout_mat_body(ctx: &mut MathContext, rows: &[Vec]) -> SourceResult } x += rcol + col_gap; } + frame.size_mut().x = x - col_gap; Ok(frame) } diff --git a/library/src/math/row.rs b/library/src/math/row.rs index aa6f76f66..23c9d242e 100644 --- a/library/src/math/row.rs +++ b/library/src/math/row.rs @@ -87,10 +87,6 @@ impl MathRow { self.iter().map(MathFragment::width).sum() } - pub fn height(&self) -> Abs { - self.ascent() + self.descent() - } - pub fn ascent(&self) -> Abs { self.iter().map(MathFragment::ascent).max().unwrap_or_default() } @@ -136,8 +132,7 @@ impl MathRow { rows.pop(); } - let width = rows.iter().map(|row| row.width()).max().unwrap_or_default(); - let points = alignments(&rows); + let AlignmentResult { points, width } = alignments(&rows); let mut frame = Frame::new(Size::zero()); for (i, row) in rows.into_iter().enumerate() { diff --git a/library/src/math/underover.rs b/library/src/math/underover.rs index 5282c6dc1..89ec5cff3 100644 --- a/library/src/math/underover.rs +++ b/library/src/math/underover.rs @@ -242,22 +242,18 @@ pub(super) fn stack( gap: Abs, baseline: usize, ) -> Frame { - let mut width = Abs::zero(); - let mut height = rows.len().saturating_sub(1) as f64 * gap; - - let points = alignments(&rows); + let AlignmentResult { points, width } = alignments(&rows); let rows: Vec<_> = rows .into_iter() .map(|row| row.into_aligned_frame(ctx, &points, align)) .collect(); - for row in &rows { - height += row.height(); - width.set_max(row.width()); - } - let mut y = Abs::zero(); - let mut frame = Frame::new(Size::new(width, height)); + let mut frame = Frame::new(Size::new( + width, + rows.iter().map(|row| row.height()).sum::() + + rows.len().saturating_sub(1) as f64 * gap, + )); for (i, row) in rows.into_iter().enumerate() { let x = align.position(width - row.width()); diff --git a/tests/ref/math/alignment.png b/tests/ref/math/alignment.png index 2e3c3d5ddfabb70a57c58cbdd6aeb5121da6f57a..917c49e11ccf8a07af93e09ce2488b9f13a93ae6 100644 GIT binary patch delta 1608 zcmZ{ldpOez7{@mjztC)`RA?^6aw#d4bx_%!jje=9%%wO>xwTp)<;N_ir&w|dxsQw_ zw-%PmSuSDhEasMI#9SstM5mNf=Q*d&+eMHAmG)eHmP({lh zKZL)-XO4z{4vkzTndmt;(dlWum0ptQCmbvyRjE{W|JMtT{VBhgWgf4&;;=%aw`Du^fyMg>h-dRNg*wAgaxL60?in9wpS&3| z{^VuFE-ZE^W!KA?7P_jmX0sL69s&C^3A&VZowxq4f&ZBdQVAh(fE)^lLO~diudw`3 zu0c0Q*4fXfm@h@LFDvXb>dQ63iKqFsY2B_YO(p2K7(hpBXq$1;$`D=$^qoRi&Y=39 z0^$L{Vrm1D?OQ){YU7J+R89Ec%#6Nvw=70+>$dgvG341&u<+fbqS;mVdvd&7Y6k`` z=IW;0d(L+j%89+@Qi2+L*@12Mz}}#m8_0CGRMU_7S@CgpVJ8Oykx3fsR35vwDfL<2 z)Ju`~J70DR@!D7!RnlR|uNg$RS8A3P@Koxz0j(v9J11B6M$Bhz2pI0LiD&dTGWO^N zwVajzOjzrE2F#iCuG4ZGEjIudsDJ0LEew%j&uqdc8sHP}P`{v5@_oAq7}OpDgCbyd z2*^Ky2?hj9P$`0mv9x!R1$P)QP0SlDw0aVXe6@3}Gn#V9>NnH9sUR(i5SVeHArv{* zLpz9W;@Twx5wWQpoxV6xeScH43MOiig~gGU)UsBKUR(X>)^ePpS5yMBC~hBJI+F~D zRx|!3-4j|iF>hzcv<4N{<@9C>DUst!C|`9^)M`M_)j_fp4ffR~9^PEMn){3XTYht2~sm`(m$$^ytXN z1;@gXMY4mw7qZoT-c72QxOSqe)dePkDPy|wQ`#LJB;3e28vd!JK|CKu#LZ}^sd9st zu9Q1ESL96kR&k!4PtAG3NIRhf%2bEBZ?y-ClSZ%BgDwlYL^9@~BXdNyrG_h+v&{2p zr1(8y8)h_%m)6^rUkF%M`lM^^<6%FX5S0<3HrsLYuok<6RO7FTSE##vkhus~@G_iw zD2ubrw}q8|aAFB>TZARbZ`^ZLt9#C+CfTA9V=iEb$cxu3JgZrhXgHFuU@ZV!&RHr- zr8E!%=NYy*JABjS4|og!;SEnNK7LRcOmpQd>(7%?$Wpk-tLLzkDbe>jxM-5va(YKz zX4@NNPr+h%@r(6Q68#i!DX*ODkway2nXNYHd~G~2%`g}p9@(?Rm^0hbM+#UbxYTQ3 z(i_FiSG^BAzB`llU?<2sKhQc2Ewd?yc&S%Ysb|Teq5C;O#6=^a7UIThEwMuuKzaUb z_<;tdiQYA@eqi@~&dU(O2u9OA9|+B(ckM{(?6<0tYb)f$)F=_;BG$4!6xc(lwIJkcKMyhH@m4 zmJ$hetHtZ|O6Z*O*^xnYz3%jE$EvB-uwC>uM={JMzm9veJB-epJbEur6A`UUMNhZC z$hG8|3)pUdyD;>-uqNNsWgFbKO!%Vsmn`vqfykH9a9r{lm#+^4??BpLyw{iUJKAXD A00000 delta 19268 zcma%i1yq|&6K;?~C`E!5r)Y7fxVux_-5rWskRZh=El`|N+>1K|D^Q%^F2&vb@_pa$ z|9|hfIq%t>^KLfDJ3G(JGqal*_NOMecsvYbRv_T{^;+9P3ji>Xs-pgh1vWbp%FU%G z3W!;@!j3?Rz)AQPsQN z)5A@C$uOPE_rxu&JzJ)wJOUbl=&TaL^LDGBjKgF&-pc zJ^E!)UG4@H(Oq;oIzEHUEGPrEh1N)7JFa~SCcOFXO8Smm5t-wx7pu+&aBjR5h0H#K z%n=DhrQ-kW(02yN4S2sZgu89VmlKbF5pQyp(fY?t@c+1b*G`eeMnMT+hkx_;Cb;a= zQX`OvPy?-de5cot>(g=-P!_pcj8TBW**ft@6zY*WqFWNkSP_nMtJd$yQF2sIDsWjC zS%&dJNgDrww}UKnxd$lQws?!~Bc~d5dQ@-il2g7mmk%DA^kfn<-6XI4zDu+gjuR6% z-F-=qLzH%0E{VUIibUWIZ{o%l7<9BYowL7{@TA-r@cgtH@{Ko7>)Xx5LE{?lbtF=9 zz56K6UE`3)rwA#dX#tBhM@kTGQ~GXPGIWI{jP}-w7w})Sbx(#Rv<)}AlvAOJWKV)c z@^6aVBf;Qn3k(^j#fF1e&tpx#n;>-53hWJW+#7S*zv=HkIuR*=IpUuUU?aYqO7_$9 zb>2?%tlid-=r@!<=ZLv6-OWBi<@tFx5u=Th z;pp#DVDnzwZc`~5O>Q5u`y(@4V&U+h=458%?37SipH@rsN5_tup)%d?Cax7{1Jp)L z!?K{Mb})frf-)=L%_He`4grlnJ=HtXJ_KJty|}J2SpNY*8}hn zFX-D@3=+L3l(uGDGbKSUWNcI!J4fzywCdn36t{{j*FX}ZYm_3zt)w*6G{jX25-{N4 zmBZM#fAO0xribI#A!0Q17$V0|=d7UQ8%vgH<oAI5#@*g4SGBJrn~l#4SM z$)PM*Z1|E~rSAKR22nu%DDmp0&ShXvS?f8QfSs9Btjd`XMe-RH z;k|*|&Wj1cX}+d+1rno*2Pb;h7tCf@Y%=&~{_QSvn1;8LViOj^WaP@)r2Js?(~>W!w+pJ4VkKCJ7K&Jn=VJKbd0*AvpzP| zjr~}8pT={&>Z_ppD%8ppS4zu{EO?fA2Y<*m9?8htSmQq2P-FsWBL!$37ki*rM`&3w z_39E7kg|BXH!ag`{Hf~cs*O6;7$&jFYQ033^?_pHuIYqCS6f0`&3SFlD+(wJHjocD zzt)pzP_5cD+qDGc$chT4tHy4o0B@D)w^x&G5p($%X*%pyUwdO~#OYs|SqV6#1@6pR7H8zYyoT&2)&;geWsG?V* z*i9yq)td3|i%1u-TxB5KWYb>YvWx?Rl~GRh`Ohe~$*p_!q(rgBwR>o>uiOl7h>8nB z+msc^mTNbL^R%mS)z|jQg&zrLL!K?I!Q~*Fbn21!ElNmrYjaEtI$70ggoAOV2lyF& z`d1;_38Y;k--nNtyHZ;pq$FBMc^_k1?31q0|Lz|C<|V*?>;LHPxg|%BQk$spP)9U} zfI}V7n@0Jgkh~3la-T|rf&8M*kJ?@h=7-dRc<960cauS&xdXqtx}V+(j`fWv4OS28 z3cr;;^69vc;?;fDBiYcorm2&==jHUVERstTSjl2h$nuKVnV8(W0ZH=&i*197@W0ha%%ACX8PfUG0xXP)JHe)P9c!( zAg+TC^l=P5PQrQ$Gx71mN}hJ?d#E%?kO!=4_Dh|o@vplS#(lKUhavB63*PXMEAi38 z6O%4fH#P*x`WcTbS(KP~c*=PWg1d%P!IuCsv`&xI_Pg6j5Mk6gYV#G-cF=6&d%?Mn zg0Ydu#hY8NQGP^V>K5z4GyMXcC!)Thzd^Zt1v9S{tf3-~gPVB?v<$RY));He}P#<%jCRM-7DQ3F^mF2m5ma@T1qY z_*khZ?w1nm<09!fJavxGt=-k5w>ZRXPt5>4sgA!@T z!6H2kW7Fe3HwDzg7jJuw4$h9iy$_i=O}ZOP>&&gTg8M;bbB$Rtx;&I4_a=oDQT|U< z-8}vS_>;@T`{>`|+ds&`f5x=ufu~l`CooT7BJT{3kS`_GyX}aHoeNm?essL% z)!nP~xas!sYBuN!3pUtU?3TuG_Vubv<{(erog+~-12j!F#6@*ozS~L-(n*c&qH1G- zWUdS;I2`o$y?s@QgZCnd-O+-c$Ws|PiL^H`Z&I&6ewKLp?JU-6y%=3fS;O!F67xlC z%vjZluNF)=>TA|h5V?Vo-e*!!P4z7MuSf2{LlRe%$p^Z zrKt&)u%K|Bk3nsxa@u;=wY+j)kVhx6vB_8>Tu`d6`InJC$QPK@)M|205-V6{zQC>~ zheqhfdFe3?+M4(+xxK0}QViCvS|rXn$4xnk?e9Pm88XDD*3d@u{DO^taLxJZkyg?2 zZO^@Zgh~^$)81z=JKl903f{MRMyw$1hK4z{G1H_PC!4%jZQwGe0ZOler=>XVuZ{|0}$+hNc8CU zr?A8*JhC}%C`TU7uu?8#EJ+V)?iqV5zutoRyN6fa5V3pg6nAoG0n&lERJK*RWzLGYfJCU%)N}{-0gp}q948I3imbKP54Lc}&3(soUfpL>0E>=5|-c95E>UCL zaWqT}mjc z?+;h83?FSCVJp{6z^_k_nF~5pCPV82nIaX+{k$N&B%Raa21y8a`(q{lQXd7h$TfF( zZ-J3Qp}c|KwZv2qYHNY4(iToh8I40aA_{j4Bf& z#dRHpIP;B4ur8qg7U$b%uBK}3O>(I@E-~!)DD(cagei2;q!z?LJ5zp@T2k!yXd}q_ zYVgphZ}dw<_~lfJQ+ln*${_>;>*7&W#hy&*1iOu4+h6O*9)P~61z^`q%-=Y{h!5O=AwM1c--Yd3 zy8DK79wsH$OGsYde-xe5j=Wgn zcacsmK8m<^Le_$G1MBCzw8#g9Qm!yCYz z)U{N4SAPa5=789w0oc*c^g4H+*ra_sGLeX?Zk|`{haGRaKEg@&Fvz-4ps$F!F{y6} zMDvk^r?%C!bdfS0yNi{#-QEfw59^9qFf^}kZ%Q(d`XO|%1?`|J5EBj0(B8;}M4nsI z-v8sQ@n+H@rAqa8^pNE^a2{y|ab$nj*ec3;s-C${GrdsDqW~lEtzTWcQ%~~@z4uSp zWQ@^r-$r-zR#m2ukHWo2zW#$NKaEDQ$rF&Mhgto#etpNx558!mFES8zGuCnNheI!p5c1QQf9 zmMJ7MeZ)pk2jVO*VU=T=eYvgvB5m>94-SmiL1m1kGWa?-`ta>axhr1CVdz>lIs6BG zC|iX7+Pu5~R03=XU2)nqO{#QX@zMfE<3*H-e0(%+p0B>Ecj;kVUnvA_wy^q=Zu6`2 z2GdVD(9eR%b2{+BfYF$13Lf4`3NiD8!|81^kcpn`lhp=?^mhDP+(X*=Djn7EupELx zMhboAr#l2fU5S*t+27m=`M`-tDoc4pOE5laM+AG3vx2u9cMoRXhI2e+@e!M7DNtP{?YS>#%Un8r-)0p|Ar-6hi9hx)S(SmX2=96aHz(MU8)K;C+QVZ-ya=2qy| zJ|-|=hA#bAQNn2t`{@DS|C^#jznO+m|CxqU5&aiQ`42i14fqKRj0UubgMRxa4*6N~ z=z$?R)Rg^}W4K{FT8Qnz+&?{(2Zo&UfmRD~tAM!Ea2{pI#%Zo|1cBsQI*r&7I~@#7>M`tCJUeVa!d_ek!@72!M$iy{AVWQ$iKy>RUQ3qLUaNl1aCx`NzgU zgvsNkxm!jT;fHIiQm`bkQDhc2KE0iHHP+!Dovb3<7e6NC-_vO8QxJq~w1iTu&Ih2! zI%_EOXdcL0cDPNOzdEn&6$u_hidIS%LWXN(BY2NoIE|J&DffX~fj4lBBJ z0;K%HYVY=*0R3Ja19ha1d7v5xHCfA-PBtZP-{{tYfls(XQbtM{fCw#3w|G-U*b5-PT{y9_y zQu^37Q=FKFH%u$d4pmuXtOPluj)JMOQ!jOJ>@_~Eso0cUOhPNlA|&1Ek3?lu>+-2{ z2~|}Z6#|K>Vk3?37~W`z%OiB1elMMkv2_y?T+n)s0on9B2+>-f^0(nu8hFq@JM>7X z3sDD63{0Wk0Ynnp8`q?TxoP;=#S}NW>i81gW}?C5#(tv}8w_xzEE_{}_P~X6S|N~S z1F~UJ+`CRjp2;f5TMBgsS7~VU?qgb3wynOj&84Z#q1FdteDa}M&bs;0oFgMT(g$?2 zjb&@s(U`rVw`Q2rwFf_H2?kS1y5F2P!=;I1weS(i?-g)=ZQL3AO15QoTw{=VHMMQU zExgwOwCWz=nNc2aK{jH0qytN>7*j&BLMYv^OI#{vO#?$HIq`CMW^~5}IzjXw_jt4; z3O84PFC-xAuY02S--$(1EUg$TOP0S1m-1r7Awkc7FOecnxq!vYlOEMT{ak-i!dwme zAknZo3hWeHaTY@ytO&urr{OVGoY|q^u~wXE{I?eTw_84nGbf;O)Yp9#D9sUj=rNUA zz-JM)YI@8FS-K2`ALbMsG6mT*_}=oxqY0=CSx=VWip1I(1vV{Ez#~Vg5#MKjQC)*a zztpA+Hlv)x^>wZ+8AwKt9ThF@?u?~ZBq25_ObH5M((vKufr_yKk@qSXJ)I#8;BVyU zQ`(KcSAe$|XSU9z-)`K{V@3E~NW*=;adwP>;Jf{ZZEM+=Rzai@mptmPH|x46RW8jG zzP&3Ch{*de=s|5tPVTj1)1f+4+}ws2gB%l(5NO1w#nG@sNGFzyC# znHyI?`mjbtb0sZJb$?QAku-xO2(EK?JP04cb5d&3GvlJMdK&4Nynr!{lcim(S!^xM z5|ifyA|v7QbvSI|NNwrYcOGrJ<6k`S5Xi+j{%+063*L{kX zP2|JO@-@4ZGM@2eQBl-J^5a3y-7;|O6pAvqT=Wkb7B($kyF~Jc+M6kz1{-?i?DxFk zeX?RPaWqlDQ-&+X`1u={;B9Fd-}2!nS!lj7URC$BG)k8Q*yr9j>WN>XxehK24{pB4 zVOv;gHnQ`_!j;p_h0|u3&TUWv<>0mX2SmOv;<&1|m)LS&DXqgbX4Cu@D8wWbE9|aQ zDDTTk;fm{fJiuRcNs`TDRlq~li=J<};P61qNknJyKC`5&33omK<|g77atdP$B3w24 zgv6TA!|(8chwBLF$u25?4xJ~AIRJ-|CW?&$c-98 zcu-?+puJ`YDE?fLWP{+d>Ak=KPeju1p03^w#?bi$9IXvnYF1@`4Zk=%Ecr#{-19g~ z`_9k#o%D)kr%GV+Loe9DH-X2FSBj|RIjY%h)Eq|D9liFOW3{#%T5*F{xI` z`pTb}6|?vP^I8auKv#(Y91Nb+xa_Saha zvRXUH>;P_QMCmp1eX%|j>T99)7iDwC?4t-^!`6BPO2tq#OclnDPtUZ#R9}o$j-eXu zcajoiBBn*IAmz4vKoplE!;bL=vhEM(x^n{UB>C{MZSYQx$?NEGhC9*kGb3R3N;sA3 z*HW^$c%25Dh+n^yS&RVtLWMPnHS^(@AK`VHf8-a)bTCqz+tem$N6ZOmA)aJWAL!|V zizxA++=^Pk{r35;3$dWv$UAK|g+>fnZ_C8I+An=sGgNCsC_Yn0KJALA3gxifn=3U2 z5SAbj6L@9;Au;N&RGYjSIkMn^!aB+?l1tbhxUa=bE!^4kHA@PL4k8PeyK={1s<9De zEavdO5|0GR$p`;pr@xvI{eWQ#eox{q3|BRfIf=tgr@IgULI*mPo;+e5_gCn7!S4xO zz|%xt+YkbPxYB_ynNlK(ulhQ8L2fn}=6Dpt@YI4S5d+l%&JwfOJ`e?6y83-Qlk}ND zF5gqj${INh|0vGVJ?$4*eGN-lA@t=PZam{fO1EO_L5*D|mN75%D9Ee9|0CfJR=EHC z!Xs)_VWGPim(>4Vi_P7<%@54!vV-y39WWPa=Zg9|T-w#!%YB@1IpMQAf;7@h2fnzc z73<$%|?0_i;?B z!P_F}W7@M$1;FYaYuAX_0oP^;6(gNY@mK1-^K@cwt02Ut#cLJ?z?dE+*NDx5IFCpb z*?scxnIiQ%HHfk#kXIt&wCK5bI>RMKSCvd`TA@0i1kw*B?+;)%qscrKhGY~IVO!R#x81UDBUuX;e)N&!fz|>XNz+%px+BIW z->iRIq6iMK&x0vXF%a6vXBMEbvKfVmQ+&qijGt{_uP|=M!p?aCFz`0Ymd7TwfV~+Z z5J9977KdGxP-!!8#$8)^b}M9$f#cGl#l|M>QF*iRI-yD(RMeJ+@PKq|-=LR@DG}}u zs0dpUD;Z3MFEIeOs6!HuIeVz?^px?#j#lt6HqJM^{FjXFjQ6Y?heK1;G)TvQ!9CKg?hRVOAUMy*RnYcl& zrN$lLPnL+yk=f^SyUmu$Tt3eRFAV-1Ype26f|dh`@)koLa3Dy{TaY`7wgz-?x00`J_wKQac& zc2H#}u^=J$AT>*6`-s0fx1xFVn9pp9qK6#odC|AO3ct)uL2CE>lmWFlPh=Fp>VMCx ztuI2C+MWw@o`5$$Jg)4{t0F4PzCUrCex>|=RqRdc5Pkuyt3at>tfha~Lm~Dr88!Gh zr6#0=Y%V=7?DMuHl8BZo&x%3vU?Do47997}_q#$L_2~{g5LhD)_gy)P(=hIfk8&#Z zRK;NKu`Vnv=3JlOZSdDqgU-i$(=)vATL!TJeXTkG?k+nD4CpDCu6Exw_3d_s2>;Dm z!A>Q#m&>F=InbDT8!7}CZHj~E12?hvYs)S`s61INj0^TGnx$9ji)V*J(NTer08W|6JGmx`gjmS&-4cF;b9*!bU9dmVvZ>a7ekE_9;@=lbd&d!#zo z`ng#4;XlbM_dJ5eZ6Dy`d4@gL(SoJEn>goPZIDzLDeJ_Iz0ArBZxpyD1#8Z<(D;p8 z^$vgETK6!`)|;`DqR|`038B+&#yEigoHE-s?rE$GiYBh7 z*)J0a23iPyov~2lIs5vkZ;Y(<$L)I;#WyP6ax@;=*u#Fk-{>cXncqn}&!ip`(t@-lv)#-l_oL)lx-LhqMswF!^;<2wev)^*5aw=-a~xlX1!zgAWi zj8bgo0)U^(8L5@E)ig0Ho2<#t+rzxJiad>3S{32pdT7esQh)sJ1I8x*KHR;F4{2Gw zBIPK9Tqggml|ga?0@1&XrDI!;o&QEyUiOt>W zTVRGIaMlYx;S)7?5F2gnK_fLgweH@rBMIB<*A+{v`*3&u(zOkkTU?OMz=lfcKYQZ5 z(#rb7wdPu<(hs%GQ(Um!Bmq5Mjhf*o)z3m5D*%?4tp6r2!HYV!7POJrgZ-1-TwnGL@j;WXmE`@CEAf7Wl ze_DjoqWN^15FTjwGnuzx@<^1!N80-E5@`4xjKG&V6mYIx{sCr2KK4!{RJ-``p)dO57JVK?1x;nN6$?4S(e6+!vE?g~CwQ;=NOR#Z-wSXt%n)Z=8j^LP-RJWR*KoolE2}joN4pM$E>sD`{G|_P(T%fw_vj zF8mdID5fBu=lAF8zm9`U1ma6k22(5lY|_gqfx&P7egS~+Z-9Ys0Kxw*V9?k>|2PLj zC95h&We0se#(;_VKQA~;L=j9w)rm8`4ehoC>eG}hFD-ksg(s~YT+iW zw+Fh(f6mjvHY`OCKA5e0b@|7j|t&HgWQ#q0E^xXK3ERy{TUTAF`Dq zz$#Hn#to8TE%h0EA=pCy;VF7WAN!pFy2p^4B2U{eXTvwmHAR;fd+@IE;4qg-;-+!(uW88i21(0Nc`^{rhGG?>yM6Y&V3u~! z;ms8Zc0KGzL0CY9I_jZ*-`T)tcp9SVk$AW3D|)L^Jd0Q8|3u|K;Q6QU7d)W|q3yT!q^jTKEq)}` z)5Cu*6OS|>8Snf7WZRL7rwGOWz!+62>p%^byqyKsGD73etG>&Wq2^FSQ!RrY>V~@< zoRaonO{%v05{&g7{O_k0JR;4}OPHJQQ~ zIWl)@TL(Dv&E(}#;Vf3>$2j&fl7KGn9sr(`+Y+GIwQc2EVzEhfg}Lo|d_G}M4$yP` zo$6etsf4wwA)8X{;8ntL_*`gnSbkKH;;u9nOPdJ!8zDk&1D|5H(JBBT1%zlQ@KLt( z3|0p3S5%kag*++p$+ox(llDF#7N`e9T&cZxB!}GfoQK-Iy>3Zo%?6L%P=x;|Hi{55;w8^i@6oZ#^;8w6}iM~ysJ^!|%MUgg5T?(9X zh@D+QqZ_srY#A}I>G7oUy+db>{Dl4-Jc`#>hvVd14S9$h96-Ng>~jF~L61(IAqtQ> z5Kg(rbS@!)* zc;%oBmzzIerZ^)4Jc@FYB!I*C7ywEb{Ys-DkFLRH0Ci@WYx@#_wT}liIogqjsQBGF zqmWr8HK=$J`d;k`pQkX%B!Kta8>S$^7@VpFGFRrH<^w_0;ICKXruxlV?&n`)1jA-ra7?4C-iWc_Dv7OD<4OIn zX&WLA`q_Bab?tcqj?M6fZE9B=;zrx=jcp4EYEQ(#z zxO2q_;x&Tr`1NWmNg`VujTlDj7?R1dqT$kG3-B+17l}dF#$GkwRRff2<_2oP9~XZu z-r8RY^WO)g%VC?oM@+p$&Mx6YSS@PnE8zow*J<2QA&$M}?kWa`XSKdk5#+B_AoaP~9n9y%luwY>NrQTSiD>~k>o-KwUlu3kKtl8SI*1H=(dlupqp-0q8~<$?Il zyQ*Vr<#1zl$UN)Vp^@zG6q;II>7&wy*wl@eltnpnYvzrqnZCF%43j+XaCO zfYLCQhN7DSO-bO${aX~Kqnnew12#uY8UhCR5Ra3iOSC;6R^q^+uSeQACgvu@vmx~1 zVOsC%8bz&>nye;^6u|3q+u!z5Ch!3-<9^VJ4I2|*4Emt>dJ|KHn?lE}wiHmv0IO0iI zeGIO zA9ge*DuoIaK;KR+&>Tkvk%8iTD7JbqXX6Rz)cj#iN^JH{7wftH%_l1s&VY!vZT739 z`LTS_)O-jNz++=yM#n;-0}NdBr2@4k4iJpX*+8^YNENqB*Ty2vo?!Su|D6h5oFJtP0FbjBs^RpM z<@Dw8SFJYI?j!-YghJnqIPg6e3+pnE?*pfydNaFe9 z8pMtv7C`Y3v{A1~+rQD!G!@t4%=uqu1P6H0qLwV$M@2 zQtRMoq3EES*4XvHH%aQvZpOy)uN%Xfg(-%scc_1|9q`{%%fH9Le{i5b1EQxL%~LXq z`=Jies?sKbmwNK2#@Li6U2f<&&^>=eXH4)um(^~3UQ;SXm8e>bCdlrB!NjmEt2D~_ zayBuOl)_|if$U64z;o#b@Stgp4oX`4lG`1nh8{}&B+e5_awZBMZOd|M7QLpw*ho@* zeSCyhvpaf&13-RY(ZN|=f5{VB`Ve66Cs{j)2IUV}M^SDjNd7jj-qz7g2spMivZLr0 zgdl>3vp}8Rlhtn-T z1MisN16zCLDy_h_!PO1{A%SNe0G_gU+E_VSO2q!9=wj+kARa#6!vGTb*yd$Z0Dcxd zF*+fF^OSr>M_zg><42W3-q@vqm!)d_`)v8i;wqq(4`!6ZOTQxQhER1ts|~4;T%^q) zA%e96M^4FYJ#70IwyUaxSOCVZF)H_kV4xbzk=Q?jd=E-X3}@5-I(CKd}O6`(_N;U97W~4bH5&{@I3KPqLy?xUqjD z&zZmK@F3y_LZqP~8I6O&l0+Gd5ujs_+>f`OZ-iQhI^-eN=#s-69{#&Ivi zdKSRnts5D1F>_peRBO&-p5bdCxuW~4&ZzF>ShDaCPXa$rX?^Z6(ENc*spLJLL`q3r zpk4T6g@B*lq&_Nz{v|5XG|lzm$|~w*v%M(dKs#Fbi_dQeS`A1UC|>oOhC@uJDr#G2 za9OI4bX`!SFB!!dKUQjyyvbQU^XD%4s0#smmeIc3sBdb9TM3-AlSMp@?ih=7E6K@l zA*o3HWWs;XhY66{=u8Egp~8!}W!{RUt$D#V3-~)Wb@c$*E6>bG!h9CcA;E?GbDp4r z(5z*m&7v7G1Wo7Y8F6rmaM!Fb5}sVV6%EDAUY&`NDta-m%prirO9Zu;67ullZ{XX_ z>w+QgBW=7OVYzMulEJ`(7r#8svio^CybM>dp`YM$fUAzyiZ1DLGE|G`8?32fP02TgvXw3nBxYeLS)h zWenH_g3z}I-anyfA$E&D60HxAwqq;zLRm?Fj6Mb0QKuzXa~sa&@`|;Ze8&_^S-$FC zNhOgMU!EdbHBMC#ps#ZRhm>PW?R$h&&TKEXXc!Bi%!a`ZXFRY0IX37vF~^dOes3qIwaCXZ9EY%B0BkLxwb@$-a}@SkA6)bnnE3(XS@3PDub-~Ra7;Q;MS9ppuHm*% z$pClUJgEhBc2QtfLy}Ghqv9;MYlaKScWw7LWEmWi4Jjw|Mq6lbg!s}kpHArY(RAZ- zDQ#QofDbUVg}RbX7eLBH;ly#_6<@<0i|eK@99bCrFO&x4!Fi9H!af45rkq>5sACg) z{w0gZ6(QeZj9SUU8-f0xmqesjeu@sDNZc-IT!wrmu^{mHb>aBUU*V52NTm`-s90Up z0YtyiBfVLc%_Nrl>bme%OpWAr@!_gu6^C@}R!&nvlWi2MYDQO7c})NDI}8{vm#QA* z#+GBr?JZ23w0Ow2tq#bo8q<-cS-dEqPN}*$iWem3ew?q&G4EBlt1e~)Nl>0Yu4Lel zG7123|P$^9^g&zb(I4MN4 z0SEQlzRtYt;UKTPRs-N`<7a^KH-4;&UVfquB>%d0Qi=JrR9P}E3b1bs7$qd9xpNh; z4kdiiqVrmrC~pbFo_B*7z&HZR<$}+(TNee3!$c#LgkLJ#oxd8kjT3c(q$DTDyBVm> z8|TisSdeGJT5tgG0rGOawy_;c!B+sw7BH$KR~p(c8$2XLf7E>&KdeBq2eT@eGRf5< z{U=A+M3uIov0dL8)rx-aL)=?yTIZG%A%775gCVhshC>ijF`tTjS@^t-5mKAFFdW#q ze&Y&UPnP_slFRd{{G+bIe#uk8_F-E{YRQeuQOwXi1*>GtB!19p%sRRK+m2z@mERtL z?JRIrdJX_*tKNnvdm>LFjHYVb2$JQ!yE6&yT?m z{eMN+Kiu%&@=rXvzfMrfx~ARFFdmWo@AB=RofYz_6zh?(lbj474IPrdbyT0P$U?MTd2clM7ObzZ#g(GvWs z-}E1?z|PBo(Avor|MyGWI0ijS67=>+hjjC6?n$z&3Nb6n>VDOtbY&`_fWbz>^! zf6b)~F58yAMh~KSaX?7%i}UgZ%Os;pTNrX3T(K^X_)=pWV^xbQ9OAg-jCb-AvlpMg zR@^#Oh)_CtZ`uV9^QjQi@w;6ykyy7{?eW282UxGDi&H!$FW5hZwfkC<1A=5r_WMPN zcnXY`Qr6uNZ3V1nhiDTP&%}_gNP0@9;nYotMdx}RSfJ6D5biRO4>~IL6K`AXq)>g3 zW`SU8;7&|ER5?C0!H{LYZ{ylcR~X&hc`vw`U(8+XJ!+$2XwEfc<3fpHFS4d*Q}S`e zz!+ShEbcMj_{*FhbI~JrJ%tsxVutRZtok0>JX|q8_t#mT(4YC(P{l7Vmp$iM4{adF z^#ky2Bg;HFASmAj)^(eHuTKnSQc3X2-Alqjra(+?Ta3&)5BPjVLkAtm&Ou~}jn`ym zX07Tp`ANW@_7c8597L3!>uJ8XEKN`n%u{uHD{l$p=MGDG^IbE9Qw%@bl1doAH`xV?dKiIfOQ8 znOr10Ft5HKpGYmAD;!3oKoz-Sx!~J%neUbB*y?5C1x&YsCZ>JE2K=74#2DZ?Z2ZYQ zd6nits_|g-jAjp%-A_EhEnlWkO+p4j2`8d5?M>6xzEtR_J*nBQKxqb?`QEsg_& ztY9vFh7h?pC14&b>$(M%K1&mLR494f5>p(h3Cw_9UALeVCu;&ZG~W6d#-|qGLaB49 zKDuuZ%39oE$IW{pC)1Zq=z_^rIAJ8D`wNkVHu>vyGwqgbpI(gc-RSwYbMaJLdE>QW zHWhOT%)D-uCYW%Z?~m(kxp|cdJ4<}D-_G7Q=k;2DDo%Ye5U~H08k+lY!~lj9w8OI0kteG0a>J|0m1qG+Gfym*n7X*U zJETc{IE@ngMF^-;(=8t@=>_LE3ZB^En@ zL*xJ95dIp<#DsKo3Y>=3e4HleT)O?zEO2_*dgD>k3oJu5>_V2*d{i-l?97VEl+Mhu zWKw?=6SkMY>Zt(#Y9|0tociT5KpTHe$dr!fF%b4S&o6wt;F#|8zc4I!EbSfp#2J1e zQK?lHDZ8EyToNYVvp*3AwmgJo0y!SyZqZjupEyZCYp5RGo@9DUV z^D*u6u^lY@8}Ot)%u|93Wy~cKsz|$)Wq>&Ln)@wL!QL}K}2-6D9Xo^#{PxbZ|cUArXwKT{p(=#iZ(x^0CKdU%!hi zdHSr++y46TG>oTWO*_BfE8rJW&lokjGjAvYa0dol95y@uSD)ZC*vP5zNDaV~c79A> zp+sCv7V?YBei{$2&gI`LB===r%RlxXRI^%c5k}$;y@%<(I1q9eJ3YSP z9i-z!FPq;I$&k`9vz>kKmVwGmt(dhjWA|2>7OX~W+g71t%fH~(`dv9m#K>MDo^_~m z4{dDoV+45-v@XG1&uJArPPAL932fQ-B&zoKRhS#QUPn|SC8+iKiX>%XK|6#)@AuXi zYEHOrsE%lE6T!1-lC^IAE)2O7BI1)M>z!4CNpL{&Y_l;OS3gJ^H|TyRfM(Rd{9{y@ z)IL8$U+KeaJuu;sX$);On{A;UC|sg3N3OC*-K-26ND>i-z`(W^krdrAq=)tjlOe!) zm?;{F_CzU?qSEzawZ#|)MGb9KEO1bj>~wLnk^%OT31od8HiBtyk-B~BY~5Q#WoTrE zAdB}9^D?c$iRZu|<5l_G~RKoUDDo3oR1aUoIQDXpy{@nJ^S6n+ylct(KD8I!yv%86ddeG)<`WHWV ztO4$$2g{R;0Z5E}n7T@?T~m>S!*{5qu?HcuNPMkKu2oAJQLkstF*9CqwZM`{tJ3b{ zvDz)>GP%Bju#Pljrp4fd1is9*&nAMkpJ!Jd;$T}B0Ay>lU6DtW`#gqW5~~|bc~{k* zk>P6&#Gdpyz+CFb56`u8(Bt33e<}oH9-5a{5JAgoE>525z0z2EN8H;3@IgX+Owpg(4AgzX99eQmLvTQ!6mX!k#|OL1dSG;GC;CFEi~ z=m_cplg)v9H@GGo4+Xuhk2@FNr)U^vtUc9v9avwNui$lh5XC@I=gg%k7rAH% zis+Jy3J1=oKhD?z#*f2qalSmP=l$mc|L_{;>>M^ehZDljY6i47lcHE5Ojp~Xy=^pw z6~bHU0<;%Rqgf$zQaRAx1?t5Lp?|3=hW2h#OHK&+stNR0K&prl!gbXe(4QA2GeU@M zm<8`nbXpd?c`ta|Bcoup-Ai5ExFf_UKR7!wVSt(fQzcFu)HK-OW}F|zuwCX%zg}h* zA^Y0%&cSuKf$=hDIC-N=1_);VcHjcRo5H#6G3rO?M#ls}5Cox7BN#7uH-CPFqtvw_ zeiORVQN9b_8W0%1PFPOO8UmpiEob|jkejfHdRouhQTHAv?)7MU;`}p%TO)j8O#C5i z$>K%xY^ZxT7KANX95z4C@a9Ywyg4JBqn82w`KowE2pQzrFbm!(j1WpJ^a%R1&=W=o zXiK-Cy#n$ECxpIq4%)jzU4L02jHi9jUL3v63SkCqg!VSjx2zEM(qw4wOFGC3;i07` zDtG%bTo&^jX0zs_Qh{`r6#{x&9;2enJ+r;0qW0o`97@SBRnqnlWree{7u$gs!fZN@ ziekb}yL=ZpchelR2umZv)hRf;Kp!zfI8O6TzLj2Y76FK^g0PsPnSUV^HXEiJVMxmo zW(WvvlC2k^&~p;FA>6bq(u=T-V%Z^JOviGq2ygZQKZG-MxLy%#3+FitE3S_4I~`+) zfPm5Uihy&cot-JIjxb>$I3id*uIhU@BwAuwBH+UTc3lXzH$DYVgnKQv!qFWy2CkY( zR+wy^+5t!5ot`j7z<-f8e*?h2VSWAm1BaBLmOcpT?H^#U>TS5-?eFjJSny8rIRmZ; zSkyfi8cKO-1^6Oh&TDyad-wfTfinWuM#AkyZj?n{g$71dlWLN{@wH5pH=MLQMq>AElCwZpQ8L z|GZT&YA(*>5>EtM-?1(}aK9cug#Y7!a+U~NeD3H&xbG9m5uv2xEa*eP7wt^6ibI>ioQbn`MedieEpXS2%Og;3Od z6gPx?&k*Q+I3PsjFhkg?Ht9wPSHCht7*Xqwv|L>^xYb_UVK6RHP2z=MukGLS=1*#; z`iA~ya5L=Ml(FPFaq4{-^t`DrFND9;NEnuyo|%=AmVaY#GprybBP%ogRtbz6M5(M0 zeo`}`z1g&d6~b3)C$twup{x)Fsf*BF32k}70` z@TY16=+8^tWQ1TsHNq#xODoqz ztX;FrhPs!$VogNEn&tU5-DJVr8GD2TY7gkomw(PNLdc{hfc~0ODkFqa3*|$5b_*3U zLO?sZ3GF>0A8*?caUy`z}BVA z5HQUnOE1DdO+vv9Ay&{y({>Itd!s-ZT$jT4_ z14h&<0U%iEsegEu2>2|ZTo*z~k5KSLc+h489Hpv}<#5q7 zbrdFBNt@wlv0o8W1Xx?8I~KeHg9Zn=SnwV)I4IEMg7?tCpg_lhcf5BZxFR6D%Ux*b zdaDiKi-3jQa^Uu|eK&(M0=8~}+uO2JHdSO;Mi2x+5ClOG1VIo4K@bE%5ClOG1Smle p1VIo4p}`|bk|arzBuT1c{{qCnF>WQC1Ka=r002ovPDHLkV1n>H6Da@y diff --git a/tests/ref/math/matrix-alignment.png b/tests/ref/math/matrix-alignment.png new file mode 100644 index 0000000000000000000000000000000000000000..1449553da33a044bbf07558afa6c4b443325e0cb GIT binary patch literal 15027 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 F{~trs>k$9| literal 0 HcmV?d00001 diff --git a/tests/typ/math/alignment.typ b/tests/typ/math/alignment.typ index 70c52d376..8f12971f2 100644 --- a/tests/typ/math/alignment.typ +++ b/tests/typ/math/alignment.typ @@ -25,69 +25,9 @@ $ "left" \ $ ---- -// Test alternating alignment. -$ -"a" & "a a a" & "a a" \ -"a a" & "a a" & "a" \ -"a a a" & "a" & "a a a" \ -$ - ---- -// Test alternating alignment in a vector. -$ vec( - "a" & "a a a" & "a a", - "a a" & "a a" & "a", - "a a a" & "a" & "a a a", -) $ - ---- -// Test alternating explicit alignment in a matrix. -$ mat( - "a" & "a a a" & "a a"; - "a a" & "a a" & "a"; - "a a a" & "a" & "a a a"; -) $ - ---- -// Test alignment in a matrix. -$ mat( - "a", "a a a", "a a"; - "a a", "a a", "a"; - "a a a", "a", "a a a"; -) $ - ---- -// Test explicit left alignment in a matrix. -$ mat( - &"a", &"a a a", &"a a"; - &"a a", &"a a", &"a"; - &"a a a", &"a", &"a a a"; -) $ - ---- -// Test explicit right alignment in a matrix. -$ mat( - "a"&, "a a a"&, "a a"&; - "a a"&, "a a"&, "a"&; - "a a a"&, "a"&, "a a a"&; -) $ - --- // Test #460 equations. $ a &=b & quad c&=d \ e &=f & g&=h $ - -$ mat(&a+b,c;&d, e) $ -$ mat(&a+b&,c;&d&, e) $ -$ mat(&&&a+b,c;&&&d, e) $ -$ mat(.&a+b&.,c;.....&d&....., e) $ - ---- -// Test #454 equations. -$ mat(-1, 1, 1; 1, -1, 1; 1, 1, -1) $ -$ mat(-1&, 1&, 1&; 1&, -1&, 1&; 1&, 1&, -1&) $ -$ mat(-1&, 1&, 1&; 1, -1, 1; 1, 1, -1) $ -$ mat(&-1, &1, &1; 1, -1, 1; 1, 1, -1) $ diff --git a/tests/typ/math/matrix-alignment.typ b/tests/typ/math/matrix-alignment.typ new file mode 100644 index 000000000..fd149dd88 --- /dev/null +++ b/tests/typ/math/matrix-alignment.typ @@ -0,0 +1,55 @@ +// Test matrix alignment math. + +--- +// Test alternating alignment in a vector. +$ vec( + "a" & "a a a" & "a a", + "a a" & "a a" & "a", + "a a a" & "a" & "a a a", +) $ + +--- +// Test alternating explicit alignment in a matrix. +$ mat( + "a" & "a a a" & "a a"; + "a a" & "a a" & "a"; + "a a a" & "a" & "a a a"; +) $ + +--- +// Test alignment in a matrix. +$ mat( + "a", "a a a", "a a"; + "a a", "a a", "a"; + "a a a", "a", "a a a"; +) $ + +--- +// Test explicit left alignment in a matrix. +$ mat( + &"a", &"a a a", &"a a"; + &"a a", &"a a", &"a"; + &"a a a", &"a", &"a a a"; +) $ + +--- +// Test explicit right alignment in a matrix. +$ mat( + "a"&, "a a a"&, "a a"&; + "a a"&, "a a"&, "a"&; + "a a a"&, "a"&, "a a a"&; +) $ + +--- +// Test #460 equations. +$ mat(&a+b,c;&d, e) $ +$ mat(&a+b&,c;&d&, e) $ +$ mat(&&&a+b,c;&&&d, e) $ +$ mat(.&a+b&.,c;.....&d&....., e) $ + +--- +// Test #454 equations. +$ mat(-1, 1, 1; 1, -1, 1; 1, 1, -1) $ +$ mat(-1&, 1&, 1&; 1&, -1&, 1&; 1&, 1&, -1&) $ +$ mat(-1&, 1&, 1&; 1, -1, 1; 1, 1, -1) $ +$ mat(&-1, &1, &1; 1, -1, 1; 1, 1, -1) $