From 8379a45cf223651b1c06ebf5c680db900d83c6a5 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 11 Mar 2021 03:00:51 +0000 Subject: CTAN sync 202103110300 --- .../latex/contrib/nicematrix/nicematrix-french.pdf | Bin 420606 -> 424997 bytes .../latex/contrib/nicematrix/nicematrix-french.tex | 652 ++++--- macros/latex/contrib/nicematrix/nicematrix.dtx | 1866 +++++++++++++------- macros/latex/contrib/nicematrix/nicematrix.pdf | Bin 1133328 -> 1166775 bytes 4 files changed, 1621 insertions(+), 897 deletions(-) (limited to 'macros/latex/contrib/nicematrix') diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.pdf b/macros/latex/contrib/nicematrix/nicematrix-french.pdf index 7c58a0449c..21154fbe67 100644 Binary files a/macros/latex/contrib/nicematrix/nicematrix-french.pdf and b/macros/latex/contrib/nicematrix/nicematrix-french.pdf differ diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.tex b/macros/latex/contrib/nicematrix/nicematrix-french.tex index 75a1954df9..9ae1a3a8ab 100644 --- a/macros/latex/contrib/nicematrix/nicematrix-french.tex +++ b/macros/latex/contrib/nicematrix/nicematrix-french.tex @@ -232,8 +232,8 @@ l'extension \pkg{nicematrix} propose deux clés |cell-space-top-limit| et |cell-space-bottom-limit| qui sont similaires aux deux paramètres |\cellspacetoplimit| et |\cellspacebottomlimit| proposés par \pkg{cellspace}. -\colorbox{yellow!30}{Nouveau 5.9}\enskip Il existe aussi une clé -|cell-space-limits| pour régler simultanément les deux paramètres. +Il existe aussi une clé |cell-space-limits| pour régler simultanément les deux +paramètres. La valeur initiale de ces paramètres est $0$~pt pour que les environnements de \pkg{nicematrix} aient par défaut le même comportement que ceux de \pkg{array} @@ -409,7 +409,7 @@ Dans les environnements de \pkg{nicematrix}, on peut utiliser la commande |\Block| pour placer un élément au centre d'un rectangle de cases fusionnées. La commande |\Block| doit être utilisée dans la case supérieure gauche du bloc -avec deux arguments. +avec deux arguments obligatoires. \begin{itemize} \item Le premier argument est la taille de ce bloc avec la syntaxe $i$-$j$ où @@ -500,10 +500,34 @@ $\begin{bNiceArray}{ccc|c}[margin] \end{bNiceArray}$ + +\interitem +La commande |\Block| accepte en fait en premier argument optionnel (entre +crochets) une liste de couples clé-valeur. Les clés sont les suivantes : +\begin{itemize} +\item les clés |l|, |c| et |r| réglent le positionnement horizontal comme dit +précédemment ; +\item la clé |fill| prend en argument une couleur et remplit le bloc avec cette +couleur ; +\item la clé |draw| prend en argument une couleur et trace le cadre avec cette +couleur (la valeur par défaut de cette clé est la couleur courante des filets du +tableau) ; +\item la clé |color| prend en argument une couleur et l'applique au contenu et +trace également le cadre avec cette couleur. +\item la clé |line-width| fixe la largeur des filets servant pour le cadre (n'a +d'intérêt que si |draw| est utilisée) ; +\item \colorbox{yellow!50}{\textbf{Nouveau 5.12}}\enskip la clé +|rounded-corners| impose des coins arrondis (pour le cadre dessiné par |draw| et +le fond dessiné par |fill|) avec un rayon égal à la valeur de cette clé (la +valeur par défaut est 4~pt\footnote{Cette valeur par défaut est la valeur + initiale des \emph{rounded corners} de Tikz.}). +\end{itemize} + + \interitem \textbf{On doit remarquer que, par défaut, les blocs ne créent pas d'espace}. Il n'y a exception que pour les blocs mono-rangée et les blocs mono-colonne comme -expliqué juste après. +expliqué plus loin. \medskip @@ -512,10 +536,11 @@ construction |wc{...}| de \pkg{array}). \medskip \begin{BVerbatim} -\begin{NiceTabular}~emphase#{cwc{2cm}wc{3cm}c}@ +\begin{NiceTabular}{cwc{2cm}wc{3cm}c} rose & tulipe & marguerite & dahlia \\ violette -& \Block[draw=red,fill=red!15]{2-2}{\LARGE De très jolies fleurs} & & souci \\ +& ~emphase#\Block[draw=red,fill=red!15,rounded-corners]{2-2}{\LARGE De très jolies fleurs}@ + & & souci \\ pervenche & & & lys \\ arum & iris & jacinthe & muguet \end{NiceTabular} @@ -526,20 +551,13 @@ arum & iris & jacinthe & muguet \begin{center} \begin{NiceTabular}{cwc{2cm}wc{3cm}c} rose & tulipe & marguerite & dahlia \\ -violette & \Block[draw=red,fill=red!15]{2-2}{\LARGE De très jolies fleurs} & & souci \\ +violette & \Block[draw=red,fill=red!15,rounded-corners]{2-2} + {\LARGE De très jolies fleurs} & & souci \\ pervenche & & & lys \\ arum & iris & jacinthe & muguet \end{NiceTabular} \end{center} -\medskip -Comme on le voit sur cet exemple, on peut fixer la couleur de fond avec la clé -|fill| et la couleur du cadre avec la clé |draw|\footnote{Si la clé |draw| est - utilisée sans valeur, c'est la couleur par défaut des filets de tableaux qui - est utilisée.}. On peut aussi fixer l'épaisseur du trait avec la clé -|line-width|. - - \subsection{Les blocs mono-colonne} @@ -616,7 +634,8 @@ bloc sur plusieurs lignes. la consigne générale donnée dans le préambule pour cette colonne. \item On peut tracer un cadre autour du bloc avec la clé |draw| de la commande -|\Block|.\footnote{Pour colorier le fond d'une case, il n'y a pas besoin +|\Block| ou colorier le fond avec des bords arrondis avec les clés |fill| et +|rounded-corners|.\footnote{Pour colorier simplement le fond d'une case, il n'y a pas besoin d'utiliser un bloc mono-case : on peut utiliser la commande |\cellcolor| si la clé |colortbl-like| est utilisée : voir p.~\pageref{colortbl-like}.} \end{itemize} @@ -885,11 +904,11 @@ p.~\pageref{OnlyMainNiceMatrix}. \subsection{Les clés hlines et vlines} La clé |hlines| demande un tracé de tous les filets horizontaux et la clé -|vlines| demande un tracé de tous les filets verticaux (sauf dans les blocs et -dans les blocs virtuels déterminés par des lignes en pointillés). En fait, dans les -environnements avec délimiteurs (comme |{pNiceMatrix}| ou |{bNiceArray}|), les -filets extérieurs ne sont pas tracés (ce qui est le comportement certainement -attendu). +|vlines| demande un tracé de tous les filets verticaux (sauf dans les blocs, +créés par |\Block| et dans les blocs virtuels déterminés par des lignes en +pointillés : |\Cdots|, |\Vdots|, etc.). En fait, dans les environnements avec +délimiteurs (comme |{pNiceMatrix}| ou |{bNiceArray}|), les filets extérieurs ne +sont pas tracés (ce qui est le comportement certainement attendu). \medskip @@ -1143,16 +1162,33 @@ inconvénients. \subsection{Les outils de nicematrix dans le code-before} -L'extension \pkg{nicematrix} proposent des outils (indépendants de -\pkg{colortbl}) pour tracer d'abord les rectangles colorés, puis le contenu des -cases et les filets. Cette manière de faire est plus dans l'esprit du «modèle du -peintre» des formats PostScript et \textsc{pdf} et convient donc mieux aux -lecteurs de \textsc{pdf}. L'inconvénient est qu'elle nécessite plusieurs -compilations successives. +L'extension \pkg{nicematrix} propose des outils (indépendants de \pkg{colortbl}) +pour tracer d'abord les rectangles colorés, puis le contenu des cases et les +filets. Cette manière de faire est plus dans l'esprit du «modèle du peintre» des +formats PostScript et \textsc{pdf} et convient donc mieux aux lecteurs de +\textsc{pdf}. L'inconvénient est qu'elle nécessite plusieurs compilations +successives. \medskip L'extension \pkg{nicematrix} fournit une clé |code-before| pour du code qui sera -exécuté avant le tracé du tableau. De nouvelles commandes y sont disponibles : +exécuté avant le tracé du tableau. + +\smallskip +\colorbox{yellow!50}{\textbf{Nouveau 5.12}}\enskip Une syntaxe alternative est +proposée : on peut placer le contenu de ce |code-before| entre les mots-clés +|\CodeBefore| et |\Body| juste au début de l'environnement. + +\begin{Verbatim} +\begin{pNiceArray}{~textsl#preamble@} +~emphase#\CodeBefore@ +~textsl#instructions du code-before@ +~emphase#\Body@ +~textsl#contenu de l'environnement@ +\end{pNiceArray} +\end{Verbatim} + +\smallskip +De nouvelles commandes sont disponibles dans ce |\CodeBefore| : |\cellcolor|, |\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors| et |\chessboardcolors|.\footnote{On pourra remarquer que, dans le \verb|code-before|, des nœuds PGF/Tikz correspondant à la position des filets @@ -1176,14 +1212,20 @@ format $i$-$j$ où $i$ est le numéro de ligne et $j$ le numéro de colonne. \begin{scope} \hfuzz=10cm \begin{BVerbatim}[boxwidth=10cm,baseline=c] -\begin{NiceTabular}{|c|c|c|}[code-before = ~emphase#\cellcolor{red!15}{3-1,2-2,1-3}@] +\begin{NiceTabular}{|c|c|c|} +\CodeBefore + ~emphase#\cellcolor{red!15}{3-1,2-2,1-3}@ +\Body \hline a & b & c \\ \hline e & f & g \\ \hline h & i & j \\ \hline \end{NiceTabular} \end{BVerbatim} -\begin{NiceTabular}{|c|c|c|}[code-before = \cellcolor{red!15}{3-1,2-2,1-3}] +\begin{NiceTabular}{|c|c|c|} +\CodeBefore + \cellcolor{red!15}{3-1,2-2,1-3} +\Body \hline a & b & c \\ \hline e & f & g \\ \hline @@ -1201,14 +1243,20 @@ et la case en bas à droite du rectangle. \begin{scope} \hfuzz=10cm \begin{BVerbatim}[boxwidth=10cm,baseline=c] -\begin{NiceTabular}{|c|c|c|}[code-before = ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@] +\begin{NiceTabular}{|c|c|c|} +\CodeBefore + ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@ +\Body \hline a & b & c \\ \hline e & f & g \\ \hline h & i & j \\ \hline \end{NiceTabular} \end{BVerbatim} -\begin{NiceTabular}{|c|c|c|}[code-before = \rectanglecolor{blue!15}{2-2}{3-3}] +\begin{NiceTabular}{|c|c|c|} +\CodeBefore + \rectanglecolor{blue!15}{2-2}{3-3} +\Body \hline a & b & c \\ \hline e & f & g \\ \hline @@ -1230,7 +1278,10 @@ partir de la rangée~$a$). \begin{scope} \hfuzz=10cm \begin{BVerbatim}[boxwidth=9cm,baseline=c] -$\begin{NiceArray}{lll}[hvlines, ~emphase#code-before = \rowcolor{red!15}{1,3-5,8-}@] +$\begin{NiceArray}{lll}[hvlines] +\CodeBefore + ~emphase#\rowcolor{red!15}{1,3-5,8-}@ +\Body a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3 \\ @@ -1244,8 +1295,10 @@ a_{10} & b_{10} & c_{10} \\ \end{NiceArray}$ \end{BVerbatim} % -$\begin{NiceArray}{lll}% -[baseline=4,hvlines, code-before = \rowcolor{red!15}{1,3-5,8-}] +$\begin{NiceArray}{lll}[baseline=4,hvlines] +\CodeBefore + \rowcolor{red!15}{1,3-5,8-} +\Body a_1 & b_1 & c_1 \\ a_2 & b_2 & c_2 \\ a_3 & b_3 & c_3 \\ @@ -1281,7 +1334,7 @@ l'intervalle constitué de toutes les rangées du tableau à partir de la rangé \bigskip -La commande |\rowcolors| accepte une liste de paires clé-valeur comme argument +La commande |\rowcolors| accepte une liste de couples clé-valeur comme argument optionnel en dernière position (l'argument optionel en première position correspond à l'espace colorimétrique). Les clés disponibles sont |cols|, |restart| et |respect-blocks|. @@ -1306,8 +1359,10 @@ tableau pour englober les blocs (créés par la commande |\Block| : cf.~p.~\page \begin{scope} \hfuzz=10cm \begin{BVerbatim}[baseline=c,boxwidth=9cm] -\begin{NiceTabular}{clr}% - [hvlines,code-before = ~emphase#{\rowcolors{2}{blue!10}{}[cols=2-3,restart]}@] +\begin{NiceTabular}{clr}[hvlines] +\CodeBefore + ~emphase#{\rowcolors{2}{blue!10}{}[cols=2-3,restart]}@ +\Body \Block{1-*}{Résultats} \\ \Block{2-1}{A}& Pierre & 12 \\ & Jacques & 8 \\ @@ -1317,8 +1372,10 @@ tableau pour englober les blocs (créés par la commande |\Block| : cf.~p.~\page & Estelle & 15 \end{NiceTabular} \end{BVerbatim} -\begin{NiceTabular}{clr}[hvlines, - code-before = {\rowcolors{2}{blue!10}{}[cols=2-3,restart]},baseline=2] +\begin{NiceTabular}{clr}[hvlines,baseline=2] +\CodeBefore + \rowcolors{2}{blue!10}{}[cols=2-3,restart] +\Body \Block{1-*}{Résultats} \\ \Block{2-1}{A}& Pierre & 12 \\ & Jacques & 8 \\ @@ -1335,8 +1392,10 @@ tableau pour englober les blocs (créés par la commande |\Block| : cf.~p.~\page \begin{scope} \hfuzz=10cm \begin{BVerbatim}[baseline=c,boxwidth=11cm] -\begin{NiceTabular}{lr}[hvlines,code-before = -~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@] +\begin{NiceTabular}{lr}[hvlines] +\CodeBefore + ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@ +\Body \Block{2-1}{Pierre} & 12 \\ & 13 \\ Jacques & 8 \\ @@ -1349,8 +1408,10 @@ Henri & 14 \\ & 19 \end{NiceTabular} \end{BVerbatim} -\begin{NiceTabular}{lr}[hvlines,code-before = -\rowcolors{1}{blue!10}{}[respect-blocks],baseline=c] +\begin{NiceTabular}{lr}[hvlines,baseline=c] +\CodeBefore + \rowcolors{1}{blue!10}{}[respect-blocks] +\Body \Block{2-1}{Pierre} & 12 \\ & 13 \\ Jacques & 8 \\ @@ -1376,14 +1437,19 @@ couleurs et colorie les cases en quinconces avec les deux couleurs. \begin{scope} \hfuzz=10cm \begin{BVerbatim}[baseline=c,boxwidth=9cm] -$\begin{pNiceMatrix}[r,margin, ~emphase#code-before=\chessboardcolors{red!15}{blue!15}@] +$\begin{pNiceMatrix}[r,margin] +\CodeBefore + ~emphase#code-before=\chessboardcolors{red!15}{blue!15}@ +\Body 1 & -1 & 1 \\ -1 & 1 & -1 \\ 1 & -1 & 1 \end{pNiceMatrix}$ \end{BVerbatim} -$\begin{pNiceMatrix}% -[baseline=1, r, margin, code-before = \chessboardcolors{red!15}{blue!15}] +$\begin{pNiceMatrix}[baseline=1, r, margin] +\CodeBefore + \chessboardcolors{red!15}{blue!15} +\Body 1 & -1 & 1 \\ -1 & 1 & -1 \\ 1 & -1 & 1 @@ -1404,8 +1470,11 @@ l'extension \pkg{booktabs} n'est pas chargée par \pkg{nicematrix}. \begin{scope} \hfuzz=10cm \begin{BVerbatim}[baseline=c,boxwidth=8.5cm] -\begin{NiceTabular}{lSSSS}% -[code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}] +\begin{NiceTabular}{lSSSS} +\CodeBefore + \rowcolor{red!15}{1-2} + \rowcolors{3}{blue!15}{} +\Body ~emphase#\toprule@ \Block{2-1}{Produit} & \Block{1-3}{dimensions (cm)} & & & @@ -1421,8 +1490,11 @@ spécial & 12 & 12 & 0.5 & 70 \\ ~emphase#\bottomrule@ \end{NiceTabular} \end{BVerbatim} -\begin{NiceTabular}[c]{lSSSS}% -[code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}] +\begin{NiceTabular}[c]{lSSSS} +\CodeBefore + \rowcolor{red!15}{1-2} + \rowcolors{3}{blue!15}{} +\Body \toprule \Block{2-1}{Produit} & \Block{1-3}{dimensions (cm)} & & & @@ -2062,7 +2134,7 @@ C[a_1,a_1] & \Cdots & C[a_1,a_n] & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\ C[a_n,a_1] & \Cdots & C[a_n,a_n] & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\ -\rule{0pt}{15mm} & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\ +\rule{0pt}{15mm}\NotEmpty & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\ C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\ \Vdots & \Ddots & \Vdots @@ -2077,7 +2149,7 @@ C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n] C[a_1,a_1] & \Cdots & C[a_1,a_n] & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\ \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\ C[a_n,a_1] & \Cdots & C[a_n,a_n] & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\ -\rule{0pt}{15mm} & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\ +\rule{0pt}{15mm}\NotEmpty & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\ C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\ \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\ C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n] & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}] @@ -2359,7 +2431,7 @@ p.~\pageref{customization}). \label{sub-matrix} -\colorbox{yellow!50}{\textbf{Nouveau 5.10}}\enskip +\colorbox{yellow!30}{Nouveau 5.10}\enskip La commande |\SubMatrix| permet de positionner des délimiteurs sur une partie du tableau, partie qui est considérée comme une sous-matrice. La commande |\SubMatrix| prend cinq arguments : @@ -2373,7 +2445,11 @@ la syntaxe $i$|-|$j$ où $i$ est le numéro de rangée et $j$ le numéro de colo \item le troisième argument est le coin inférieur droit avec la même syntaxe ; \item la quatrième argument est le délimiteur droit ; \item le cinquième argument, optionnel, entre crochets, est une liste de couples -clé-valeur. +clé-valeur.\footnote{Il n'y a pas d'argument optionnel entre crochets en première +position car un crochet ouvrant juste après \verb|\SubMatrix| doit pouvoir être +interprété comme le premier argument (obligatoire) de \verb|\SubMatrix|: ce +crochet est alors le délimiteur gauche de la sous-matrice (ex. : +\verb|\SubMatrix[{2-2}{4-7}]|).} \end{itemize} On remarquera que la commande |\SubMatrix| trace les délimiteurs après la @@ -2392,8 +2468,8 @@ colonne avec |@{\hspace{1.5em}}| dans le préambule du tableau. \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\ 1 & 2 & 3 & z \CodeAfter -~emphase#\SubMatrix({1-1}{3-3})+ -~emphase#\SubMatrix({1-4}{3-4})+ + ~emphase#\SubMatrix({1-1}{3-3})+ + ~emphase#\SubMatrix({1-4}{3-4})+ \end{NiceArray}\] \end{BVerbatim} \end{scope} @@ -2402,8 +2478,8 @@ $\begin{NiceArray}{ccc@{\hspace{1.5em}}c}[cell-space-limits=2pt,margin] \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\ 1 & 2 & 3 & z \CodeAfter -\SubMatrix({1-1}{3-3}) -\SubMatrix({1-4}{3-4}) + \SubMatrix({1-1}{3-3}) + \SubMatrix({1-4}{3-4}) \end{NiceArray}$ \bigskip @@ -2429,6 +2505,21 @@ environnements de \pkg{nicematrix} ou comme option de |\CodeAfter| avec le préfixe |sub-matrix|, c'est-à-dire qu'elles sont alors nommées |sub-matrix/left-xshift|, |sub-matrix/right-xshift|, |sub-matrix/xshift|, etc. +\medskip +\colorbox{yellow!50}{\textbf{Nouveau 5.12}}\enskip Il y a aussi les clés +suivantes, qui ne sont accessibles que pour une commande |\SubMatrix| +individuelle : +% +\begin{itemize} +\item |vlines| contient une liste de numéros de filets verticaux à tracer dans +la sous-matrice (si cette clé est utilisée sans valeur, tous les filets +verticaux sont tracés) ; +\item |hlines| est similaire à |vlines| mais pour les filets horizontaux ; +\item |hvlines|, qui s'utilise sans valeur, trace tous les filets dans la sous-matrice. +\end{itemize} +On remarquera que tous ces filets sont dessinés après la construction du tableau +principal : les colonnes et les rangées ne sont pas écartées. + \bigskip \begin{scope} \hfuzz=12cm @@ -2440,9 +2531,9 @@ $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt] a & b & \frac12a+\frac14b \\ c & d & \frac12c+\frac14d \\ \CodeAfter -\SubMatrix({1-3}{2-3}) -\SubMatrix({3-1}{4-2}) -\SubMatrix({3-3}{4-3}) + \SubMatrix({1-3}{2-3}) + \SubMatrix({3-1}{4-2}) + \SubMatrix({3-3}{4-3}) \end{NiceArray}$ \end{BVerbatim} \end{scope} @@ -2452,9 +2543,9 @@ $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt] a & b & \frac12a+\frac14b \\ c & d & \frac12c+\frac14d \\ \CodeAfter -\SubMatrix({1-3}{2-3}) -\SubMatrix({3-1}{4-2}) -\SubMatrix({3-3}{4-3}) + \SubMatrix({1-3}{2-3}) + \SubMatrix({3-1}{4-2}) + \SubMatrix({3-3}{4-3}) \end{NiceArray}$ \medskip @@ -2471,9 +2562,9 @@ $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt] a & b & \frac12a+\frac14b \\ c & d & \frac12c+\frac14d \\ \CodeAfter -\SubMatrix({1-3}{2-3})[~emphase#slim!] -\SubMatrix({3-1}{4-2}) -\SubMatrix({3-3}{4-3}) + \SubMatrix({1-3}{2-3})[~emphase#slim!] + \SubMatrix({3-1}{4-2}) + \SubMatrix({3-3}{4-3}) \end{NiceArray}$ \end{BVerbatim} \end{scope} @@ -2484,9 +2575,9 @@ $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt] a & b & \frac12a+\frac14b \\ c & d & \frac12c+\frac14d \\ \CodeAfter -\SubMatrix({1-3}{2-3})[slim] -\SubMatrix({3-1}{4-2}) -\SubMatrix({3-3}{4-3}) + \SubMatrix({1-3}{2-3})[slim] + \SubMatrix({3-1}{4-2}) + \SubMatrix({3-3}{4-3}) \end{NiceArray}$ @@ -3488,7 +3579,7 @@ noix & noisette & brugnon \label{noeuds-i} -\colorbox{yellow!50}{\textbf{Nouveau 5.11}}\enskip L'extension \pkg{nicematrix} +\colorbox{yellow!30}{Nouveau 5.11}\enskip L'extension \pkg{nicematrix} crée un nœud PGF-Tikz nommé simplement $i$ (précédé du préfixe habituel) à l'intersection du filet horizontal de numéro $i$ et du filet vertical de numéro~$j$ (ou plutôt la position potentielle de ces filets car ils ne sont @@ -3521,13 +3612,10 @@ horizontal~$i$ et du filet vertical~$j$ avec la syntaxe |(|$i$\verb+-|+$j$|)|. \medskip \begin{Verbatim} -\[\begin{NiceMatrix}[ - code-before = - { -~emphase# \tikz \draw [fill = red!15] @ -~emphase# (7-|4) -- (8-|4) -- (8-|5) -- (9-|5) -- (9-|6) |- cycle ; @ - } -] +\begin{NiceMatrix} +\CodeBefore +~emphase#\tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ;@ +\Body 1 \\ 1 & 1 \\ 1 & 2 & 1 \\ @@ -3537,16 +3625,13 @@ horizontal~$i$ et du filet vertical~$j$ avec la syntaxe |(|$i$\verb+-|+$j$|)|. 1 & 6 & 15 & 20 & 15 & 6 & 1 \\ 1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\ 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1 -\end{NiceMatrix}\] +\end{NiceMatrix} \end{Verbatim} % -\[\begin{NiceMatrix}[ - code-before = - { - \tikz \draw [fill = red!15] - (7-|4) -- (8-|4) -- (8-|5) -- (9-|5) -- (9-|6) |- cycle ; - } -] +\[\begin{NiceMatrix} +\CodeBefore +\tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ; +\Body 1 \\ 1 & 1 \\ 1 & 2 & 1 \\ @@ -3563,7 +3648,7 @@ horizontal~$i$ et du filet vertical~$j$ avec la syntaxe |(|$i$\verb+-|+$j$|)|. \label{node-sub-matrix} -\colorbox{yellow!50}{\textbf{Nouveau 5.10}}\enskip +\colorbox{yellow!30}{Nouveau 5.10}\enskip La commande |\SubMatrix| disponible dans le |\CodeAfter| a été présentée p.~\pageref{sub-matrix}. @@ -3636,10 +3721,8 @@ bibliothèque Tikz \pkg{patterns} : |\usetikzlibrary{patterns}|). \ExplSyntaxOn \cs_new_protected:Nn \__pantigny_hatch:nnn { - \begin { tikzpicture } - \fill [ pattern = north~west~lines , pattern~color = #3 ] - ( #1 -| #2) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; - \end { tikzpicture } + \tikz \fill [ pattern = north~west~lines , pattern~color = #3 ] + ( #1 -| #2) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; } \NewDocumentCommand \hatchcell { ! O { black } } @@ -3654,10 +3737,8 @@ bibliothèque Tikz \pkg{patterns} : |\usetikzlibrary{patterns}|). \ExplSyntaxOn \cs_new_protected:Nn \__pantigny_hatch:nnn { - \begin { tikzpicture } - \fill [ pattern = north~west~lines , pattern~color = #3 ] - ( #1 -| #2 ) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; - \end { tikzpicture } + \tikz \fill [ pattern = north~west~lines , pattern~color = #3 ] + ( #1 -| #2 ) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; } \NewDocumentCommand \hatchcell { ! O { black } } @@ -4150,96 +4231,224 @@ $\begin{pNiceMatrix}[first-row,first-col] -\subsection{Largeur des colonnes} +\subsection{Empilements de matrices} + +On a souvent besoin de présetner des matrices empilées les unes au-dessus des +autres (par exemple pour la résolutiond de systèmes linéaires). + \medskip -Dans l'exemple suivant, nous utilisons |{NiceMatrixBlock}| avec l'option -|auto-columns-width| parce que nous voulons la même largeur (automatique) pour -toutes les colonnes. +Pour avoir les colonnes alignées les unes sous les autres, on peut imposer une +largeur commune à toutes les colonnes, ce que l'on fait dans l'exemple suivant +avec l'environnement |{NiceMatrixBlock}| et l'option |auto-columns-width|. -\bigskip -\begin{BVerbatim} +\begin{Verbatim}[formatcom=\small\color{gray}] ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@ \NiceMatrixOptions - { last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax} + { + light-syntax, + last-col, code-for-last-col = \color{blue} \scriptstyle, + } \setlength{\extrarowheight}{1mm} -$\begin{pNiceArray}{cccc:c} - 1 1 1 1 1 { } ; - 2 4 8 16 9 ; - 3 9 27 81 36 ; - 4 16 64 256 100 + +$\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; + 3 -18 12 1 4 ; +-3 -46 29 -2 -15 ; + 9 10 -5 4 7 \end{pNiceArray}$ -\medskip -$\begin{pNiceArray}{cccc:c} - 1 1 1 1 1 ; - 0 2 6 14 7 { L_2 \gets -2 L_1 + L_2 } ; - 0 6 24 78 33 { L_3 \gets -3 L_1 + L_3 } ; - 0 12 60 252 96 { L_4 \gets -4 L_1 + L_4 } + +\smallskip +$\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 ; +0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ; +0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ; +0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ; \end{pNiceArray}$ -... + +\smallskip +$\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 ; +0 64 -41 1 19 ; +0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 } +\end{pNiceArray}$ + +\smallskip +$\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; +0 64 -41 1 19 ; +\end{pNiceArray}$ + ~emphase#\end{NiceMatrixBlock}@ -\end{BVerbatim} +\end{Verbatim} \bigskip - -\begin{multicols}{2} \begin{NiceMatrixBlock}[auto-columns-width] -\NiceMatrixOptions{last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax} +\NiceMatrixOptions + { + light-syntax, + last-col, code-for-last-col = \color{blue} \scriptstyle , + } \setlength{\extrarowheight}{1mm} -\enskip $\begin{pNiceArray}{cccc:c} -1 1 1 1 1 { } ; -2 4 8 16 9 ; -3 9 27 81 36 ; -4 16 64 256 100 +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; + 3 -18 12 1 4 ; +-3 -46 29 -2 -15 ; + 9 10 -5 4 7 \end{pNiceArray}$ -\medskip - -\enskip $\begin{pNiceArray}{cccc:c} -1 1 1 1 1 ; -0 2 6 14 7 { L_2 \gets -2 L_1 + L_2 } ; -0 6 24 78 33 { L_3 \gets -3 L_1 + L_3 } ; -0 12 60 252 96 { L_4 \gets -4 L_1 + L_4 } +\smallskip +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 ; +0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ; +0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ; +0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ; \end{pNiceArray}$ -\medskip +\smallskip +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 ; +0 64 -41 1 19 ; +0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 } +\end{pNiceArray}$ -\enskip $\begin{pNiceArray}{cccc:c} -1 1 1 1 1 ; -0 1 3 7 \frac72 { L_2 \gets \frac12 L_2 } ; -0 3 12 39 \frac{33}2 { L_3 \gets \frac12 L_3 } ; -0 1 5 21 8 { L_4 \gets \frac1{12} L_4 } +\smallskip +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; +0 64 -41 1 19 ; \end{pNiceArray}$ +\end{NiceMatrixBlock} + +\bigskip +On constate que la dernière matrice n'est pas parfaitement alignée avec les +précédentes. C'est que les parenthèses, en LaTeX, n'ont pas toutes la même +largeur suivant leur taille. \medskip +\colorbox{yellow!50}{\textbf{Nouveau 5.12}}\enskip Pour résoudre ce problème, on +peut demander que les délimiteurs soient composés avec leur largeur maximale +grâce à la clé booléenne |delimiters/max-width|. + +\begin{Verbatim}[formatcom=\small\color{gray}] +~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@ +\NiceMatrixOptions + { + ~emphase#delimiters/max-width@, + light-syntax, + last-col, code-for-last-col = \color{blue}\scriptstyle, + } +\setlength{\extrarowheight}{1mm} -\enskip $\begin{pNiceArray}{cccc:c} -1 1 1 1 1 ; -0 1 3 7 \frac72 ; -0 0 3 18 6 { L_3 \gets -3 L_2 + L_3 } ; -0 0 -2 -14 -\frac92 { L_4 \gets L_2 - L_4 } +$\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; + 3 -18 12 1 4 ; +-3 -46 29 -2 -15 ; + 9 10 -5 4 7 \end{pNiceArray}$ -\medskip +... +~emphase#\end{NiceMatrixBlock}@ +\end{Verbatim} -\enskip $\begin{pNiceArray}{cccc:c} -1 1 1 1 1 ; -0 1 3 7 \frac72 ; -0 0 1 6 2 { L_3 \gets \frac13 L_3 } ; -0 0 -2 -14 -\frac92 +\bigskip +\begin{NiceMatrixBlock}[auto-columns-width] +\NiceMatrixOptions + { + delimiters/max-width, + light-syntax, + last-col, code-for-last-col = \color{blue}\scriptstyle, + } +\setlength{\extrarowheight}{1mm} + +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; + 3 -18 12 1 4 ; +-3 -46 29 -2 -15 ; + 9 10 -5 4 7 \end{pNiceArray}$ -\medskip +\smallskip +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 ; +0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ; +0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ; +0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ; +\end{pNiceArray}$ -\enskip $\begin{pNiceArray}{cccc:c} -1 1 1 1 1 ; -0 1 3 7 \frac72 ; -0 0 1 6 2 ; -0 0 0 -2 -\frac12 { L_4 \gets L_3 + L_4 } +\smallskip +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 ; +0 64 -41 1 19 ; +0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 } \end{pNiceArray}$ + +\smallskip +\quad $\begin{pNiceArray}{rrrr|r} +12 -8 7 5 3 {} ; +0 64 -41 1 19 ; +\end{pNiceArray}$ + \end{NiceMatrixBlock} -\end{multicols} + + +\interitem +Si on souhaite un alignement des colonnes des différentes matrices sans imposer +la même largeur à toutes les colonnes, on peut utiliser un grand tableau unique +et placer les parenthèses avec des commandes |\SubMatrix| dans le |\CodeAfter|. +Bien sûr, ce tableau ne pourra pas être coupé par un saut de page. + +\medskip +\begin{Verbatim} +\setlength{\extrarowheight}{1mm} +\[\begin{NiceMatrix}% + [ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ] +12 & -8 & 7 & 5 & 3 \\ + 3 & -18 & 12 & 1 & 4 \\ +-3 & -46 & 29 &-2 &-15 \\ + 9 & 10 &-5 &4 & 7 \\[1mm] +12 & -8 & 7 &5 & 3 \\ +0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\ +0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\ +0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm] +12 & -8 &7 &5 & 3 \\ +0 & 64 &-41 &1 &19 \\ +0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm] +12 & -8 &7 &5 & 3 \\ +0 & 64 &-41 & 1 & 19 \\ +~emphase#\CodeAfter@ +~emphase# \SubMatrix({1-1}{4-5})[vlines=4]@ +~emphase# \SubMatrix({5-1}{8-5})[vlines=4]@ +~emphase# \SubMatrix({9-1}{11-5})[vlines=4]@ +~emphase# \SubMatrix({12-1}{13-5})[vlines=4]@ +\end{NiceMatrix}\] +\end{Verbatim} + +\medskip +\begin{scope} +\setlength{\extrarowheight}{1mm} +\[\begin{NiceMatrix}% + [ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ] +12 & -8 & 7 & 5 & 3 \\ + 3 & -18 & 12 & 1 & 4 \\ +-3 & -46 & 29 &-2 &-15 \\ + 9 & 10 &-5 &4 & 7 \\[1mm] +12 & -8 & 7 &5 & 3 \\ +0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\ +0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\ +0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm] +12 & -8 &7 &5 & 3 \\ +0 & 64 &-41 &1 &19 \\ +0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm] +12 & -8 &7 &5 & 3 \\ +0 & 64 &-41 & 1 & 19 \\ +\CodeAfter + \SubMatrix({1-1}{4-5})[vlines=4] + \SubMatrix({5-1}{8-5})[vlines=4] + \SubMatrix({9-1}{11-5})[vlines=4] + \SubMatrix({12-1}{13-5})[vlines=4] +\end{NiceMatrix}\] +\end{scope} \subsection{Comment surligner les cases d'une matrice} @@ -4280,7 +4489,7 @@ matrice.\footnote{Pour la commande |\cline|, voir la remarque \vspace{1cm} Il est possible de colorier une rangée avec |\rowcolor| dans le |code-before| -(ou avec |\rowcolor| dans la première case de la rangée si on utilise la clé +(ou avec |\rowcolor| dans une case de la rangée si on utilise la clé |colortbl-like| − même si \pkg{colortbl} n'est pas chargé). @@ -4491,112 +4700,43 @@ a & a & a & L_3 \\ -\subsection{Utilisation directe des nœuds Tikz} - -Dans l'exemple suivant, on souhaite illustrer le produit mathématique de deux matrices. - -\medskip -L'utilisation de |{NiceMatrixBlock}| avec l'option |auto-columns-width| va -permettre que toutes les colonnes aient la même largeur ce qui permettra un -alignement des deux matrices superposées. -\begin{Verbatim} -\begin{NiceMatrixBlock}[auto-columns-width] -\end{Verbatim} - -\begin{Verbatim} -\NiceMatrixOptions{nullify-dots} -\end{Verbatim} +\subsection{Utilisation de \textbackslash SubMatrix dans le code-before} -Les trois matrices vont être disposées les unes par rapport aux autres grâce à un tableau de LaTeX. -\begin{Verbatim} -$\begin{array}{cc} -& -\end{Verbatim} +Dans l'exemple suivant, on illustre le produit mathématique de deux matrices. -La matrice $B$ a une «première rangée» (pour $C_j$) d'où l'option |first-row|. -\begin{Verbatim} -\begin{bNiceArray}{c>{\strut}cccc}[name=B,first-row] - & & ~emphase#C_j@ \\ -b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ -\Vdots & & \Vdots & & \Vdots \\ - & & b_{kj} \\ - & & \Vdots \\ - b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} -\end{bNiceArray} \\ \\ -\end{Verbatim} +L'ensemble de la figure est un environnement |{NiceArray}| et les trois paires +de parenthèses ont été rajoutées avec |\SubMatrix| dans le |code-before|. -La matrice $A$ a une «première colonne» (pour $L_i$) d'où l'option |first-col|. -\begin{Verbatim} -\begin{bNiceArray}{cc>{\strut}ccc}[name=A,first-col] +Ceux qui sont intéressés par le code correspondant le trouveront dans le fichier +source de ce document. +% +% +% +\[\begin{NiceArray}{*{6}{c}@{\hspace{6mm}}*{5}{c}}[nullify-dots] +\CodeBefore + \SubMatrix({2-7}{6-11}) + \SubMatrix({7-2}{11-6}) + \SubMatrix({7-7}{11-11}) +\Body + & & & & & & & & \color{blue}\scriptstyle C_j \\ + & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ + & & & & & & \Vdots & & \Vdots & & \Vdots \\ + & & & & & & & & b_{kj} \\ + & & & & & & & & \Vdots \\ + & & & & & & b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} \\[3mm] & a_{11} & \Cdots & & & a_{1n} \\ + & \Vdots & & & & \Vdots & & & \Vdots \\ +\color{blue}\scriptstyle L_i + & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} & \Cdots & & c_{ij} \\ & \Vdots & & & & \Vdots \\ -~emphase#L_i@ & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\ - & \Vdots & & & & \Vdots \\ - & a_{n1} & \Cdots & & & a_{nn} -\end{bNiceArray} -& -\end{Verbatim} - -Dans la matrice produit, on remarquera que les lignes en pointillés sont «semi-ouvertes». -\begin{Verbatim} -\begin{bNiceArray}{cc>{\strut}ccc} - & & & & \\ - & & \Vdots \\ -\Cdots & & c_{ij} \\ -\\ -\\ -\end{bNiceArray} -\end{array}$ - -\end{NiceMatrixBlock} -\end{Verbatim} - -\begin{Verbatim} -\begin{tikzpicture}[remember picture, overlay] - \node [highlight = (A-3-1) (A-3-5) ] {} ; - \node [highlight = (B-1-3) (B-5-3) ] {} ; - \draw [color = gray] (A-3-3) to [bend left] (B-3-3) ; -\end{tikzpicture} -\end{Verbatim} - - - -\begin{NiceMatrixBlock}[auto-columns-width] -\NiceMatrixOptions{nullify-dots} -$\begin{array}{cc} -& -\begin{bNiceArray}{c>{\strut}cccc}[name=B,first-row] - & & C_j \\ -b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ -\Vdots & & \Vdots & & \Vdots \\ - & & b_{kj} \\ - & & \Vdots \\ - b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} -\end{bNiceArray} \\ \\ -\begin{bNiceArray}{cc>{\strut}ccc}[name=A,first-col] - & a_{11} & \Cdots & & & a_{1n} \\ - & \Vdots & & & & \Vdots \\ -L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\ - & \Vdots & & & & \Vdots \\ - & a_{n1} & \Cdots & & & a_{nn} \\ -\end{bNiceArray} -& -\begin{bNiceArray}{cc>{\strut}ccc} - & & & & \\ - & & \Vdots \\ -\Cdots & & c_{ij} \\ -\\ -\\ -\end{bNiceArray} -\end{array}$ - -\end{NiceMatrixBlock} - -\begin{tikzpicture}[remember picture, overlay] - \node [highlight = (A-3-1) (A-3-5) ] {} ; - \node [highlight = (B-1-3) (B-5-3) ] {} ; - \draw [color = gray] (A-3-3) to [bend left] (B-3-3) ; + & a_{n1} & \Cdots & & & a_{nn} \\ +\CodeAfter +\begin{tikzpicture} +\node [highlight = (9-2) (9-6)] { } ; +\node [highlight = (2-9) (6-9)] { } ; +\draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ; \end{tikzpicture} +\end{NiceArray}\] diff --git a/macros/latex/contrib/nicematrix/nicematrix.dtx b/macros/latex/contrib/nicematrix/nicematrix.dtx index 24732c133c..a84069b7c8 100644 --- a/macros/latex/contrib/nicematrix/nicematrix.dtx +++ b/macros/latex/contrib/nicematrix/nicematrix.dtx @@ -15,8 +15,8 @@ % % \fi % \iffalse -\def\myfileversion{5.11} -\def\myfiledate{2021/02/22} +\def\myfileversion{5.12} +\def\myfiledate{2021/03/10} % % %<*batchfile> @@ -279,8 +279,7 @@ version 2005/12/01 or later. % |cell-space-bottom-limit| similar to the parameters |\cellspacetoplimit| and % |\cellspacebottomlimit| of \pkg{cellspace}. % -% \colorbox{yellow!30}{New 5.9}\enskip There is also a key |cell-space-limits| -% to set both parameters at once. +% There is also a key |cell-space-limits| to set both parameters at once. % % The initial value of these parameters is $0$~pt in order to have for the % environments of \pkg{nicematrix} the same behaviour as those of \pkg{array} @@ -546,7 +545,29 @@ version 2005/12/01 or later. % 0 & \Cdots& 0 & 0 % \end{bNiceArray}$ % -% +% \interitem +% In fact, the command |\Block| accepts as first optional argument (between +% square brackets) a list of couples key-value. The available keys are as +% follows: +% \begin{itemize} +% \item the keys |l|, |c| and |r| are used to fix the horizontal position of the +% content of the block, as explained previously; +% \item the key |fill| takes in as value a color and fills the block with that +% color; +% \item the key |draw| takes in as value a color and strokes the frame of the +% block with that color (the default value of that key is the current color of +% the rules of the array); +% \item the key |color| takes in as value a color and apply that color the +% content of the block but draws also the frame of the block with that color; +% \item the key |line-width| is the width (thickness) of the frame (this key +% should be used only when the key |draw| is in force); +% \item \colorbox{yellow!50}{\textbf{New 5.12}}\enskip the key |rounded-corners| +% requires rounded corners (for the frame drawn by |draw| and the shape drawn by +% |fill|) with a radius equal to the value of that key (the default value is +% 4~pt\footnote{This value is the initial value of the \emph{rounded corners} of +% Tikz.}). +% \end{itemize} +% % \interitem % {\bfseries One must remark that, by default, the commands |\Blocks| don't create space}. % There is exception only for the blocks mono-row and the blocks mono-column as @@ -556,35 +577,29 @@ version 2005/12/01 or later. % In the following example, we have had to enlarge by hand the columns 2 and 3 % (with the construction |wc{...}| of \pkg{array}). % -% \medskip +% \bigskip % \begin{BVerbatim} -% \begin{NiceTabular}~emphase#{cwc{2cm}wc{3cm}c}@ +% \begin{NiceTabular}{cwc{2cm}wc{3cm}c} % rose & tulipe & marguerite & dahlia \\ % violette -% & \Block[draw=red,fill=red!15]{2-2}{\LARGE De très jolies fleurs} & & souci \\ +% & ~emphase#\Block[draw=red,fill=red!15,rounded-corners]{2-2}{\LARGE De très jolies fleurs}@ +% & & souci \\ % pervenche & & & lys \\ % arum & iris & jacinthe & muguet % \end{NiceTabular} % \end{BVerbatim} % -% % \medskip % \begin{center} % \begin{NiceTabular}{cwc{2cm}wc{3cm}c} % rose & tulipe & marguerite & dahlia \\ -% violette & -% \Block[draw=red,fill=red!15]{2-2}{\LARGE De très jolies fleurs} & & souci \\ +% violette & \Block[draw=red,fill=red!15,rounded-corners]{2-2} +% {\LARGE De très jolies fleurs} & & souci \\ % pervenche & & & lys \\ % arum & iris & jacinthe & muguet % \end{NiceTabular} % \end{center} % -% As we can see on this example, it's possible to fill the block by using the -% key |fill| and to draw the frame with the key |draw|\footnote{If the key -% |draw| is used without value, the default color the rules of the tabulars is -% used}. It's also possible to change the width (thickness) of that rules with -% the key |line-width|. -% % \subsection{The mono-column blocks} % % The mono-column blocks have a special behaviour. @@ -655,9 +670,11 @@ version 2005/12/01 or later. % derogation of the type of column given in the preamble of the array. % % \item It's possible do draw a frame around the cell with the key |draw| of the -% command |\Block|.\footnote{If one wishes to color the background of a unique -% celle, there is no point using the command |\Block|: it's possible to use the -% command |\cellcolor| (when the key |colortbl-like| is used).} +% command |\Block| and to fill the background with rounded corners with the keys +% |fill| and |rounded-corners|.\footnote{If one simply wishes to color the +% background of a unique celle, there is no point using the command |\Block|: +% it's possible to use the command |\cellcolor| (when the key |colortbl-like| is +% used).} % \end{itemize} % % \bigskip @@ -908,10 +925,10 @@ version 2005/12/01 or later. % \subsection{The keys hlines and vlines} % % The key |hlines| draws all the horizontal rules and the key |vlines| draws all -% the vertical rules excepted in the blocks (and the virtual blocks determined -% by dotted lines). In fact, in the environments with delimiters (as -% |{pNiceMatrix}| or |{bNiceArray}|) the exteriors rules are not drawn (as -% expected). +% the vertical rules excepted in the blocks, created by |\Block| and the virtual +% blocks determined by dotted lines: |\Cdots|, |\Vdots|, etc.. In fact, in the +% environments with delimiters (as |{pNiceMatrix}| or |{bNiceArray}|) the +% exteriors rules are not drawn (as expected). % % \medskip % \begin{BVerbatim}[baseline=c,boxwidth=10.6cm] @@ -1164,11 +1181,27 @@ version 2005/12/01 or later. % % \medskip % The extension \pkg{nicematrix} provides a key |code-before| for some code that -% will be executed before the drawing of the tabular. In this |code-before|, new -% commands are available: |\cellcolor|, |\rectanglecolor|, |\rowcolor|, -% |\columncolor|, |\rowcolors| and |\chessboardcolors|.\footnote{Remark that, in -% the \verb|code-before|, some PGF/Tikz nodes corresponding to the position to -% the potential rules are available: cf.~p.~\pageref{nodes-i}.} +% will be executed before the drawing of the tabular. +% +% \medskip +% \colorbox{yellow!50}{\textbf{New 5.12}}\enskip An alternative syntax is +% provided: it's possible to put the content of that |code-before| between the +% keywords |\CodeBefore| and |\Body| at the beginning of the environment. +% +% \begin{Verbatim} +% \begin{pNiceArray}{~textsl#preamble@} +% ~emphase#\CodeBefore@ +% ~textsl#instructions of the code-before@ +% ~emphase#\Body@ +% ~textsl#contents of the environnement@ +% \end{pNiceArray} +% \end{Verbatim} +% +% New commands are available in that |\CodeBefore|: |\cellcolor|, +% |\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors| and +% |\chessboardcolors|.\footnote{Remark that, in the \verb|code-before|, some +% PGF/Tikz nodes corresponding to the position to the potential rules are +% available: cf.~p.~\pageref{nodes-i}.} % \label{code-before} % % \medskip @@ -1189,16 +1222,20 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz=10cm % \begin{BVerbatim}[boxwidth=10cm,baseline=c] -% \begin{NiceTabular}{|c|c|c|}[code-before = -% ~emphase#\cellcolor{red!15}{3-1,2-2,1-3}@] +% \begin{NiceTabular}{|c|c|c|} +% \CodeBefore +% ~emphase#\cellcolor{red!15}{3-1,2-2,1-3}@ +% \Body % \hline % a & b & c \\ \hline % e & f & g \\ \hline % h & i & j \\ \hline % \end{NiceTabular} % \end{BVerbatim} -% \begin{NiceTabular}{|c|c|c|}[code-before = -% \cellcolor{red!15}{3-1,2-2,1-3}] +% \begin{NiceTabular}{|c|c|c|} +% \CodeBefore +% \cellcolor{red!15}{3-1,2-2,1-3} +% \Body % \hline % a & b & c \\ \hline % e & f & g \\ \hline @@ -1215,16 +1252,20 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz=10cm % \begin{BVerbatim}[boxwidth=10cm,baseline=c] -% \begin{NiceTabular}{|c|c|c|}[code-before = -% ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@] +% \begin{NiceTabular}{|c|c|c|} +% \CodeBefore +% ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@ +% \Body % \hline % a & b & c \\ \hline % e & f & g \\ \hline % h & i & j \\ \hline % \end{NiceTabular} % \end{BVerbatim} -% \begin{NiceTabular}{|c|c|c|}[code-before = -% \rectanglecolor{blue!15}{2-2}{3-3}] +% \begin{NiceTabular}{|c|c|c|} +% \CodeBefore +% \rectanglecolor{blue!15}{2-2}{3-3} +% \Body % \hline % a & b & c \\ \hline % e & f & g \\ \hline @@ -1244,7 +1285,10 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz = 10cm % \begin{BVerbatim}[boxwidth=9cm,baseline=c] -% $\begin{NiceArray}{lll}[hvlines, ~emphase#code-before = \rowcolor{red!15}{1,3-5,8-}@] +% $\begin{NiceArray}{lll}[hvlines] +% \CodeBefore +% ~emphase#code-before = \rowcolor{red!15}{1,3-5,8-}@ +% \Body % a_1 & b_1 & c_1 \\ % a_2 & b_2 & c_2 \\ % a_3 & b_3 & c_3 \\ @@ -1257,7 +1301,10 @@ version 2005/12/01 or later. % a_{10} & b_{10} & c_{10} \\ % \end{NiceArray}$ % \end{BVerbatim} -% $\begin{NiceArray}{lll}[baseline=4,hvlines, code-before = \rowcolor{red!15}{1,3-5,8-}] +% $\begin{NiceArray}{lll}[baseline=4,hvlines] +% \CodeBefore +% \rowcolor{red!15}{1,3-5,8-} +% \Body % a_1 & b_1 & c_1 \\ % a_2 & b_2 & c_2 \\ % a_3 & b_3 & c_3 \\ @@ -1314,9 +1361,11 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz=10cm % \begin{BVerbatim}[baseline=c,boxwidth=10cm] -% \begin{NiceTabular}{clr} -% [hvlines,code-before = ~emphase#{\rowcolors{2}{blue!10}{}[cols=2-3,restart]}@] -% \Block{1-}{Results} \\ +% \begin{NiceTabular}{clr}[hvlines] +% \CodeBefore +% ~emphase#\rowcolors{2}{blue!10}{}[cols=2-3,restart]@ +% \Body +% \Block{1-*}{Results} \\ % John & 12 \\ % Stephen & 8 \\ % Sarah & 18 \\ @@ -1325,9 +1374,11 @@ version 2005/12/01 or later. % Madison & 15 % \end{NiceTabular} % \end{BVerbatim} -% \begin{NiceTabular}{clr}[hvlines,code-before = -% {\rowcolors{2}{blue!10}{}[cols=2-3,restart]},baseline=2] -% \Block{1-}{Results} \\ +% \begin{NiceTabular}{clr}[hvlines,baseline=2] +% \CodeBefore +% \rowcolors{2}{blue!10}{}[cols=2-3,restart] +% \Body +% \Block{1-*}{Results} \\ % \Block{2-1}{A}& John & 12 \\ % & Stephen & 8 \\ % \Block{4-1}{B}& Sarah & 18 \\ @@ -1341,8 +1392,10 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz=10cm % \begin{BVerbatim}[baseline=c,boxwidth=10cm] -% \begin{NiceTabular}{lr}[hvlines,code-before = -% ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@] +% \begin{NiceTabular}{lr}[hvlines] +% \CodeBefore +% ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@ +% \Body % \Block{2-1}{John} & 12 \\ % & 13 \\ % Steph & 8 \\ @@ -1355,8 +1408,10 @@ version 2005/12/01 or later. % & 19 % \end{NiceTabular} % \end{BVerbatim} -% \begin{NiceTabular}{lr}[hvlines,code-before = -% \rowcolors{1}{blue!10}{}[respect-blocks],baseline=c] +% \begin{NiceTabular}{lr}[hvlines,baseline=c] +% \CodeBefore +% \rowcolors{1}{blue!10}{}[respect-blocks] +% \Body % \Block{2-1}{John} & 12 \\ % & 13 \\ % Steph & 8 \\ @@ -1379,13 +1434,19 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz=10cm % \begin{BVerbatim}[baseline=c,boxwidth=9cm] -% $\begin{pNiceMatrix}[r,margin, ~emphase#code-before=\chessboardcolors{red!15}{blue!15}@] +% $\begin{pNiceMatrix}[r,margin] +% \CodeBefore +% ~emphase#code-before=\chessboardcolors{red!15}{blue!15}@ +% \Body % 1 & -1 & 1 \\ % -1 & 1 & -1 \\ % 1 & -1 & 1 % \end{pNiceMatrix}$ % \end{BVerbatim} -% $\begin{pNiceMatrix}[r,baseline=1, margin, code-before = \chessboardcolors{red!15}{blue!15}] +% $\begin{pNiceMatrix}[r,baseline=1, margin] +% \CodeBefore +% \chessboardcolors{red!15}{blue!15} +% \Body % 1 & -1 & 1 \\ % -1 & 1 & -1 \\ % 1 & -1 & 1 @@ -1407,8 +1468,11 @@ version 2005/12/01 or later. % \begin{scope} % \hfuzz=10cm % \begin{BVerbatim}[baseline=c,boxwidth=8.5cm] -% \begin{NiceTabular}[c]{lSSSS}% -% [code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}] +% \begin{NiceTabular}[c]{lSSSS} +% \CodeBefore +% \rowcolor{red!15}{1-2} +% \rowcolors{3}{blue!15}{} +% \Body % ~emphase#\toprule@ % \Block{2-1}{Product} & % \Block{1-3}{dimensions (cm)} & & & @@ -1424,8 +1488,11 @@ version 2005/12/01 or later. % ~emphase#\bottomrule@ % \end{NiceTabular} % \end{BVerbatim} -% \begin{NiceTabular}[c]{lSSSS}[code-before = \rowcolor{red!15}{1-2} -% \rowcolors{3}{blue!15}{}] +% \begin{NiceTabular}[c]{lSSSS} +% \CodeBefore +% \rowcolor{red!15}{1-2} +% \rowcolors{3}{blue!15}{} +% \Body % \toprule % \Block{2-1}{Product} & % \Block{1-3}{dimensions (cm)} & & & @@ -1645,7 +1712,6 @@ version 2005/12/01 or later. % for the potential ``first column''. % % \begin{Verbatim} -% $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@] % $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@,nullify-dots] % & C_1 & \Cdots & & C_4 & \\ % L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\ @@ -1654,7 +1720,6 @@ version 2005/12/01 or later. % L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\ % & C_1 & \Cdots & & C_4 & % \end{pNiceMatrix}$ -% \end{pNiceMatrix}$ % \end{Verbatim} % % \[\begin{pNiceMatrix}[first-row,last-row,first-col,last-col,nullify-dots] @@ -2053,7 +2118,7 @@ version 2005/12/01 or later. % & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\ % C[a_n,a_1] & \Cdots & C[a_n,a_n] % & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\ -% \rule{0pt}{15mm} & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\ +% \rule{0pt}{15mm}\NotEmpty & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\ % C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] % & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\ % \Vdots & \Ddots & \Vdots @@ -2068,7 +2133,7 @@ version 2005/12/01 or later. % C[a_1,a_1] & \Cdots & C[a_1,a_n] & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\ % \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\ % C[a_n,a_1] & \Cdots & C[a_n,a_n] & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\ -% \rule{0pt}{15mm} & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\ +% \rule{0pt}{15mm}\NotEmpty & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\ % C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\ % \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\ % C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n] & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}] @@ -2340,7 +2405,7 @@ version 2005/12/01 or later. % % \label{sub-matrix} % -% \colorbox{yellow!50}{\textbf{New 5.10}}\enskip +% \colorbox{yellow!30}{New 5.10}\enskip % The command |\SubMatrix| provides a way to put delimiters on a portion % of the array considered as a submatrix. The command |\SubMatrix| takes in five % arguments: @@ -2352,7 +2417,12 @@ version 2005/12/01 or later. % syntax $i$|-|$j$ where $i$ the number of row and $j$ the number of column; % \item the third argument is the lower-right corner with the same syntax; % \item the fourth argument is the right delimiter; -% \item the last argument, which is optional, is a list of key-value pairs. +% \item the last argument, which is optional, is a list of key-value +% pairs.\footnote{There is no optional argument between square brackets in first +% position because a square bracket just after |\SubMatrix| must be interpreted +% as the first (mandatory) argument of the command |\SubMatrix|: that bracket is +% the left delimiter of the sub-matrix to construct (eg.: +% |\SubMatrix[{2-2}{4-7}]|).} % \end{itemize} % % One should remark that the command |\SubMatrix| draws the delimiters after the @@ -2371,8 +2441,8 @@ version 2005/12/01 or later. % \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\ % 1 & 2 & 3 & z % \CodeAfter -% ~emphase#\SubMatrix({1-1}{3-3})+ -% ~emphase#\SubMatrix({1-4}{3-4})+ +% ~emphase#\SubMatrix({1-1}{3-3})+ +% ~emphase#\SubMatrix({1-4}{3-4})+ % \end{NiceArray}\] % \end{BVerbatim} % \end{scope} @@ -2381,8 +2451,8 @@ version 2005/12/01 or later. % \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\ % 1 & 2 & 3 & z % \CodeAfter -% \SubMatrix({1-1}{3-3}) -% \SubMatrix({1-4}{3-4}) +% \SubMatrix({1-1}{3-3}) +% \SubMatrix({1-4}{3-4}) % \end{NiceArray}$ % % \bigskip @@ -2394,7 +2464,7 @@ version 2005/12/01 or later. % (height |\ht| + depth |\dp|); % \item |delimiters/color| fixes the color of the delimiters (also % available in |\NiceMatrixOptions|, in the environments with delimiters and as -% option of the command |\CodeAfter|); +% option of the keyword |\CodeAfter|); % \item |slim| is a boolean key: when that key is in force, the horizontal % position of the delimiters is computed by using only the contents of the cells % of the submatrix whereas, in the general case, the position is computed by @@ -2407,6 +2477,24 @@ version 2005/12/01 or later. % the prefix |sub-matrix| which means that their names are therefore % |sub-matrix/left-xshift|, |sub-matrix/right-xshift|, |sub-matrix/xshift|, etc. % +% \bigskip +% \medskip +% \colorbox{yellow!50}{\textbf{New 5.12}}\enskip There is also the following +% keys, which are available only for an individual command |\SubMatrix|: +% +% \begin{itemize} +% \item |vlines| contents a list of numbers of vertical rules that will be drawn in +% the sub-matrix (if this key is used without value, all the vertical rules of +% the sub-matrix are drawn); +% +% \item |hlines| is similar to |vlines| but for the horizontal rules; +% +% \item |hvlines|, which must be used without value, draws all the vertical and +% horizontal rules. +% \end{itemize} +% One should remark that these keys add their rules after the construction of +% the main matrix: no space is added between the rows and the columns of the +% array for theses rules. % % \bigskip % \begin{scope} @@ -2419,9 +2507,9 @@ version 2005/12/01 or later. % a & b & \frac12a+\frac14b \\ % c & d & \frac12c+\frac14d \\ % \CodeAfter -% \SubMatrix({1-3}{2-3}) -% \SubMatrix({3-1}{4-2}) -% \SubMatrix({3-3}{4-3}) +% \SubMatrix({1-3}{2-3}) +% \SubMatrix({3-1}{4-2}) +% \SubMatrix({3-3}{4-3}) % \end{NiceArray}$ % \end{BVerbatim} % \end{scope} @@ -2431,9 +2519,9 @@ version 2005/12/01 or later. % a & b & \frac12a+\frac14b \\ % c & d & \frac12c+\frac14d \\ % \CodeAfter -% \SubMatrix({1-3}{2-3}) -% \SubMatrix({3-1}{4-2}) -% \SubMatrix({3-3}{4-3}) +% \SubMatrix({1-3}{2-3}) +% \SubMatrix({3-1}{4-2}) +% \SubMatrix({3-3}{4-3}) % \end{NiceArray}$ % % \medskip @@ -2450,9 +2538,9 @@ version 2005/12/01 or later. % a & b & \frac12a+\frac14b \\ % c & d & \frac12c+\frac14d \\ % \CodeAfter -% \SubMatrix({1-3}{2-3})[~emphase#slim!] -% \SubMatrix({3-1}{4-2}) -% \SubMatrix({3-3}{4-3}) +% \SubMatrix({1-3}{2-3})[~emphase#slim!] +% \SubMatrix({3-1}{4-2}) +% \SubMatrix({3-3}{4-3}) % \end{NiceArray}$ % \end{BVerbatim} % \end{scope} @@ -2462,15 +2550,15 @@ version 2005/12/01 or later. % a & b & \frac12a+\frac14b \\ % c & d & \frac12c+\frac14d \\ % \CodeAfter -% \SubMatrix({1-3}{2-3})[slim] -% \SubMatrix({3-1}{4-2}) -% \SubMatrix({3-3}{4-3}) +% \SubMatrix({1-3}{2-3})[slim] +% \SubMatrix({3-1}{4-2}) +% \SubMatrix({3-3}{4-3}) % \end{NiceArray}$ % % % \bigskip % There is also a key |name| which gives a name to the submatrix created by -% |\SubMatrix|. That name is used to created PGF/Tikz nodes: cf +% |\SubMatrix|. That name is used to create PGF/Tikz nodes: cf % p.~\pageref{node-sub-matrix}. % % \section{The notes in the tabulars} @@ -3196,7 +3284,7 @@ version 2005/12/01 or later. % 4 & 5 & 6 \\ % 7 & 8 & 9 % \CodeAfter -% \tikz \draw ~emphase#(2-2)@ circle (2mm) ; +% \tikz \draw ~emphase#(2-2)@ circle (2mm) ; % \end{pNiceMatrix}$ % \end{BVerbatim} % $\begin{pNiceMatrix} @@ -3204,7 +3292,7 @@ version 2005/12/01 or later. % 4 & 5 & 6 \\ % 7 & 8 & 9 % \CodeAfter -% \tikz \draw (2-2) circle (2mm) ; +% \tikz \draw (2-2) circle (2mm) ; % \end{pNiceMatrix}$ % % @@ -3444,7 +3532,7 @@ version 2005/12/01 or later. % \subsection{The nodes which indicate the position of the rules} % % \label{nodes-i} -% \colorbox{yellow!50}{\textbf{New 5.11}}\enskip The package \pkg{nicematrix} +% \colorbox{yellow!30}{New 5.11}\enskip The package \pkg{nicematrix} % creates a PGF/Tikz node merely called $i$ (with the classical prefix) at the % intersection of the horizontal rule of number~$i$ and the vertical rule of % number~$j$ (more specifically the potential position of those rules because @@ -3456,32 +3544,30 @@ version 2005/12/01 or later. % arum & iris & violette \\ % muguet & dahlia & souci % \CodeAfter -% \tiny -% \begin{tikzpicture} -% \foreach \i in {1,2,3,4} -% { -% \fill [red] (\i) circle (0.5mm) ; -% \node [red,above right] at (\i) {\i} ; -% } -% \end{tikzpicture} +% \tiny +% \begin{tikzpicture} +% \foreach \i in {1,2,3,4} +% { +% \fill [red] (\i) circle (0.5mm) ; +% \node [red,above right] at (\i) {\i} ; +% } +% \end{tikzpicture} % \end{NiceTabular} % \end{center} % % \bigskip % If we use Tikz (we remind that \pkg{nicematrix} does not load Tikz by default, % by only \textsc{pgf}, which is a sub-layer of Tikz), we can access, in the -% |\CodeAfter| but also in the |code-before|) to the intersection of the horizontal -% rule~$i$ and the vertical rule~$j$ with the syntax |(|$i$\verb+-|+$j$|)|. +% |\CodeAfter| but also in the |code-before|, to the intersection of the +% (potential) horizontal rule~$i$ and the (potential) vertical rule~$j$ with the +% syntax |(|$i$\verb+-|+$j$|)|. % % \medskip % \begin{Verbatim} -% \[\begin{NiceMatrix}[ -% code-before = -% { -% ~emphase# \tikz \draw [fill = red!15] @ -% ~emphase# (7-|4) -- (8-|4) -- (8-|5) -- (9-|5) -- (9-|6) |- cycle ; @ -% } -% ] +% \begin{NiceMatrix} +% \CodeBefore +% ~emphase#\tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ;@ +% \Body % 1 \\ % 1 & 1 \\ % 1 & 2 & 1 \\ @@ -3491,15 +3577,13 @@ version 2005/12/01 or later. % 1 & 6 & 15 & 20 & 15 & 6 & 1 \\ % 1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\ % 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1 -% \end{NiceMatrix}\] +% \end{NiceMatrix} % \end{Verbatim} -% \[\begin{NiceMatrix}[ -% code-before = -% { -% \tikz \draw [fill = red!15] -% (7-|4) -- (8-|4) -- (8-|5) -- (9-|5) -- (9-|6) |- cycle ; -% } -% ] +% % +% \[\begin{NiceMatrix} +% \CodeBefore +% \tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ; +% \Body % 1 \\ % 1 & 1 \\ % 1 & 2 & 1 \\ @@ -3515,7 +3599,7 @@ version 2005/12/01 or later. % % \label{node-sub-matrix} % -% \colorbox{yellow!50}{\textbf{New 5.10}}\enskip +% \colorbox{yellow!30}{New 5.10}\enskip % The command |\SubMatrix| available in the |\CodeAfter| has been described % p.~\pageref{sub-matrix}. % @@ -3540,14 +3624,14 @@ version 2005/12/01 or later. % 3462 & 38458 & 34 & 294 \\ % 34 & 7 & 78 & 309 \\ % \CodeAfter -% \SubMatrix\{{2-2}{3-3}\}[name=A] -% \begin{tikzpicture} -% [every node/.style = {blend mode = multiply, -% inner sep = 0 pt}] -% \node [fit = (A),fill = red!15] {} ; -% \node [fit = (A-left),fill = blue!15] {} ; -% \node [fit = (A-right),fill = blue!15] {} ; -% \end{tikzpicture} +% \SubMatrix\{{2-2}{3-3}\}[name=A] +% \begin{tikzpicture} +% [every node/.style = {blend mode = multiply, +% inner sep = 0 pt}] +% \node [fit = (A),fill = red!15] {} ; +% \node [fit = (A-left),fill = blue!15] {} ; +% \node [fit = (A-right),fill = blue!15] {} ; +% \end{tikzpicture} % \end{pNiceMatrix}\] % % \section{API for the developpers} @@ -3588,10 +3672,8 @@ version 2005/12/01 or later. %\ExplSyntaxOn % \cs_new_protected:Nn \__pantigny_hatch:nnn % { -% \begin { tikzpicture } -% \fill [ pattern = north~west~lines , pattern~color = #3 ] -% ( #1 -| #2) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; -% \end { tikzpicture } +% \tikz \fill [ pattern = north~west~lines , pattern~color = #3 ] +% ( #1 -| #2) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; % } % % \NewDocumentCommand \hatchcell { ! O { black } } @@ -3607,10 +3689,8 @@ version 2005/12/01 or later. % \ExplSyntaxOn % \cs_new_protected:Nn \__pantigny_hatch:nnn % { -% \begin { tikzpicture } -% \fill [ pattern = north~west~lines , pattern~color = #3 ] -% ( #1 -| #2 ) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; -% \end { tikzpicture } +% \tikz \fill [ pattern = north~west~lines , pattern~color = #3 ] +% ( #1 -| #2 ) rectangle ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ; % } % % \NewDocumentCommand \hatchcell { ! O { black } } @@ -4085,97 +4165,223 @@ version 2005/12/01 or later. % \end{pNiceMatrix}\] % \end{scope} % -% \subsection{Width of the columns} -% +% +% \subsection{Stacks of matrices} +% +% We often need to compose mathematical matrices on top on each other (for +% example for the resolution of linear systems). % % \medskip -% In the following example, we use |{NiceMatrixBlock}| with the option -% |auto-columns-width| because we want the same automatic width for all the -% columns of the matrices. +% In order to have the columns aligned one above the other, it's possible to +% fix a width for all the columns. That's what is done in the following example +% with the environment |{NiceMatrixBlock}| and its option |auto-columns-width|. % -% \bigskip -% \begin{BVerbatim} +% \begin{Verbatim}[formatcom=\small\color{gray}] % ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@ % \NiceMatrixOptions -% { last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax} +% { +% light-syntax, +% last-col, code-for-last-col = \color{blue} \scriptstyle, +% } % \setlength{\extrarowheight}{1mm} -% $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 {} ; -% 2 4 8 16 9 ; -% 3 9 27 81 36 ; -% 4 16 64 256 100 +% +% $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 3 -18 12 1 4 ; +% -3 -46 29 -2 -15 ; +% 9 10 -5 4 7 % \end{pNiceArray}$ -% \medskip -% $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 ; -% 0 2 6 14 7 { L_2 \gets -2 L_1 + L_2 } ; -% 0 6 24 78 33 { L_3 \gets -3 L_1 + L_3 } ; -% 0 12 60 252 96 { L_4 \gets -4 L_1 + L_4 } +% +% \smallskip +% $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 ; +% 0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ; +% 0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ; +% 0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ; % \end{pNiceArray}$ -% ... +% +% \smallskip +% $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 ; +% 0 64 -41 1 19 ; +% 0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 } +% \end{pNiceArray}$ +% +% \smallskip +% $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 0 64 -41 1 19 ; +% \end{pNiceArray}$ +% % ~emphase#\end{NiceMatrixBlock}@ -% \end{BVerbatim} +% \end{Verbatim} % % \bigskip -% -% \begin{multicols}{2} % \begin{NiceMatrixBlock}[auto-columns-width] -% \NiceMatrixOptions{last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax} +% \NiceMatrixOptions +% { +% light-syntax, +% last-col, code-for-last-col = \color{blue} \scriptstyle , +% } % \setlength{\extrarowheight}{1mm} % -% \enskip $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 {} ; -% 2 4 8 16 9 ; -% 3 9 27 81 36 ; -% 4 16 64 256 100 +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 3 -18 12 1 4 ; +% -3 -46 29 -2 -15 ; +% 9 10 -5 4 7 % \end{pNiceArray}$ % -% \medskip -% -% \enskip $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 ; -% 0 2 6 14 7 { L_2 \gets -2 L_1 + L_2 } ; -% 0 6 24 78 33 { L_3 \gets -3 L_1 + L_3 } ; -% 0 12 60 252 96 { L_4 \gets -4 L_1 + L_4 } +% \smallskip +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 ; +% 0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ; +% 0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ; +% 0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ; % \end{pNiceArray}$ % -% \medskip +% \smallskip +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 ; +% 0 64 -41 1 19 ; +% 0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 } +% \end{pNiceArray}$ % -% \enskip $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 ; -% 0 1 3 7 \frac72 { L_2 \gets \frac12 L_2 } ; -% 0 3 12 39 \frac{33}2 { L_3 \gets \frac12 L_3 } ; -% 0 1 5 21 8 { L_4 \gets \frac1{12} L_4 } +% \smallskip +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 0 64 -41 1 19 ; % \end{pNiceArray}$ +% \end{NiceMatrixBlock} +% +% \bigskip +% However, one can see that the last matrix is not perfectly aligned with the +% other. That's why, in LaTeX, the parenthesis have not exactly the same width +% (smaller parenthesis are a bit slimer). % % \medskip +% \colorbox{yellow!50}{\textbf{New 5.12}}\enskip In order the solve that +% problem, it's possible to require the delimiters to be composed with the +% maximal width, thanks to the boolean key |delimiters/max-width|. +% +% \begin{Verbatim}[formatcom=\small\color{gray}] +% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@ +% \NiceMatrixOptions +% { +% ~emphase#delimiters/max-width@, +% light-syntax, +% last-col, code-for-last-col = \color{blue}\scriptstyle, +% } +% \setlength{\extrarowheight}{1mm} % -% \enskip $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 ; -% 0 1 3 7 \frac72 ; -% 0 0 3 18 6 { L_3 \gets -3 L_2 + L_3 } ; -% 0 0 -2 -14 -\frac92 { L_4 \gets L_2 - L_4 } +% $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 3 -18 12 1 4 ; +% -3 -46 29 -2 -15 ; +% 9 10 -5 4 7 % \end{pNiceArray}$ % -% \medskip +% ... +% ~emphase#\end{NiceMatrixBlock}@ +% \end{Verbatim} % -% \enskip $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 ; -% 0 1 3 7 \frac72 ; -% 0 0 1 6 2 { L_3 \gets \frac13 L_3 } ; -% 0 0 -2 -14 -\frac92 +% \bigskip +% \begin{NiceMatrixBlock}[auto-columns-width] +% \NiceMatrixOptions +% { +% delimiters/max-width, +% light-syntax, +% last-col, code-for-last-col = \color{blue}\scriptstyle, +% } +% \setlength{\extrarowheight}{1mm} +% +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 3 -18 12 1 4 ; +% -3 -46 29 -2 -15 ; +% 9 10 -5 4 7 % \end{pNiceArray}$ % -% \medskip +% \smallskip +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 ; +% 0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ; +% 0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ; +% 0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ; +% \end{pNiceArray}$ +% +% \smallskip +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 ; +% 0 64 -41 1 19 ; +% 0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 } +% \end{pNiceArray}$ % -% \enskip $\begin{pNiceArray}{cccc:c} -% 1 1 1 1 1 ; -% 0 1 3 7 \frac72 ; -% 0 0 1 6 2 ; -% 0 0 0 -2 -\frac12 { L_4 \gets L_3 + L_4 } +% \smallskip +% \quad $\begin{pNiceArray}{rrrr|r} +% 12 -8 7 5 3 {} ; +% 0 64 -41 1 19 ; % \end{pNiceArray}$ +% % \end{NiceMatrixBlock} -% \end{multicols} +% +% +% \interitem +% If you wish an alignment of the different matrices without the same width +% for all the columns, you can construct a unique array and place the +% parenthesis with commands |\SubMatrix| in the |\CodeAfter|. Of course, that +% array can't be broken by a page break. +% +% \medskip +% \begin{Verbatim} +% \setlength{\extrarowheight}{1mm} +% \[\begin{NiceMatrix}[ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ] +% 12 & -8 & 7 & 5 & 3 \\ +% 3 & -18 & 12 & 1 & 4 \\ +% -3 & -46 & 29 &-2 &-15 \\ +% 9 & 10 &-5 &4 & 7 \\[1mm] +% 12 & -8 & 7 &5 & 3 \\ +% 0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\ +% 0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\ +% 0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm] +% 12 & -8 &7 &5 & 3 \\ +% 0 & 64 &-41 &1 &19 \\ +% 0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm] +% 12 & -8 &7 &5 & 3 \\ +% 0 & 64 &-41 & 1 & 19 \\ +% ~emphase#\CodeAfter@ +% ~emphase# \SubMatrix({1-1}{4-5})[vlines=4]@ +% ~emphase# \SubMatrix({5-1}{8-5})[vlines=4]@ +% ~emphase# \SubMatrix({9-1}{11-5})[vlines=4]@ +% ~emphase# \SubMatrix({12-1}{13-5})[vlines=4]@ +% \end{NiceMatrix}\] +% \end{Verbatim} +% +% \medskip +% \begin{scope} +% \setlength{\extrarowheight}{1mm} +% \[\begin{NiceMatrix}[ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ] +% 12 & -8 & 7 & 5 & 3 \\ +% 3 & -18 & 12 & 1 & 4 \\ +% -3 & -46 & 29 &-2 &-15 \\ +% 9 & 10 &-5 &4 & 7 \\[1mm] +% 12 & -8 & 7 &5 & 3 \\ +% 0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\ +% 0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\ +% 0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm] +% 12 & -8 &7 &5 & 3 \\ +% 0 & 64 &-41 &1 &19 \\ +% 0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm] +% 12 & -8 &7 &5 & 3 \\ +% 0 & 64 &-41 & 1 & 19 \\ +% \CodeAfter +% \SubMatrix({1-1}{4-5})[vlines=4] +% \SubMatrix({5-1}{8-5})[vlines=4] +% \SubMatrix({9-1}{11-5})[vlines=4] +% \SubMatrix({12-1}{13-5})[vlines=4] +% \end{NiceMatrix}\] +% \end{scope} +% % % % \subsection{How to highlight cells of a matrix} @@ -4320,7 +4526,7 @@ version 2005/12/01 or later. % & & & 0 \\ % 0 & \Cdots& 0 & 0 % \CodeAfter -% \tikz \node [highlight = (1-1-block-medium)] {} ; +% \tikz \node [highlight = (1-1-block-medium)] {} ; % \end{pNiceMatrix}$ % % @@ -4424,117 +4630,42 @@ version 2005/12/01 or later. % \end{pNiceArray}\] % % -% \subsection{Direct use of the Tikz nodes} +% \subsection{Utilisation of \textbackslash SubMatrix in the code-before} % % In the following example, we illustrate the mathematical product of two % matrices. % -% \medskip -% The use of |{NiceMatrixBlock}| with the option |auto-columns-width| -% gives the same width for all the columns and, therefore, a perfect alignment -% of the two superposed matrices. -% \begin{Verbatim} -% \begin{NiceMatrixBlock}[auto-columns-width] -% \end{Verbatim} -% -% \begin{Verbatim} -% \NiceMatrixOptions{nullify-dots} -% \end{Verbatim} -% -% The three matrices will be displayed using an environment |{array}| (an -% environment |{tabular}| may also be possible). -% \begin{Verbatim} -% $\begin{array}{cc} -% & -% \end{Verbatim} -% -% The matrix $B$ has a ``first row'' (for $C_j$) and that's why we use the key -% |first-row|. -% \begin{Verbatim} -% \begin{bNiceArray}{c>{\strut}cccc}[name=B,first-row] -% & & C_j \\ -% b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ -% \Vdots & & \Vdots & & \Vdots \\ -% & & b_{kj} \\ -% & & \Vdots \\ -% b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} -% \end{bNiceArray} \\ \\ -% \end{Verbatim} -% -% The matrix $A$ has a ``first column'' (for $L_i$) and that's why we use the -% key |first-col|. -% \begin{Verbatim} -% \begin{bNiceArray}{cc>{\strut}ccc}[name=A,first-col] -% & a_{11} & \Cdots & & & a_{1n} \\ -% & \Vdots & & & & \Vdots \\ -% L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\ -% & \Vdots & & & & \Vdots \\ -% & a_{n1} & \Cdots & & & a_{nn} -% \end{bNiceArray} -% & -% \end{Verbatim} -% -% In the matrix product, the two dotted lines have an open extremity. -% \begin{Verbatim} -% \begin{bNiceArray}{cc>{\strut}ccc} -% & & & & \\ -% & & \Vdots \\ -% \Cdots & & c_{ij} \\ -% \\ -% \\ -% \end{bNiceArray} -% \end{array}$ -% -% \end{NiceMatrixBlock} -% \end{Verbatim} -% -% \begin{Verbatim} -% \begin{tikzpicture}[remember picture, overlay] -% \node [highlight = (A-3-1) (A-3-5) ] {} ; -% \node [highlight = (B-1-3) (B-5-3) ] {} ; -% \draw [color = gray] (A-3-3) to [bend left] (B-3-3) ; -% \end{tikzpicture} -% \end{Verbatim} -% -% -% \begin{NiceMatrixBlock}[auto-columns-width] -% \NiceMatrixOptions{nullify-dots} -% $\begin{array}{cc} -% & -% \begin{bNiceArray}{c>{\strut}cccc}[name=B,first-row] -% & & C_j \\ -% b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ -% \Vdots & & \Vdots & & \Vdots \\ -% & & b_{kj} \\ -% & & \Vdots \\ -% b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} -% \end{bNiceArray} \\ \\ -% \begin{bNiceArray}{cc>{\strut}ccc}[name=A,first-col] +% The whole figure is an environment |{NiceArray}| and the three pairs of +% parenthesis have been added with |\SubMatrix| in the |code-before|. +% +% You will find the LaTeX code of that figure in the source file of this +% document. +% +% \[\begin{NiceArray}{*{6}{c}@{\hspace{6mm}}*{5}{c}}[nullify-dots] +% \CodeBefore +% \SubMatrix({2-7}{6-11}) +% \SubMatrix({7-2}{11-6}) +% \SubMatrix({7-7}{11-11}) +% \Body +% & & & & & & & & \color{blue}\scriptstyle C_j \\ +% & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ +% & & & & & & \Vdots & & \Vdots & & \Vdots \\ +% & & & & & & & & b_{kj} \\ +% & & & & & & & & \Vdots \\ +% & & & & & & b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} \\[3mm] % & a_{11} & \Cdots & & & a_{1n} \\ +% & \Vdots & & & & \Vdots & & & \Vdots \\ +% \color{blue}\scriptstyle L_i +% & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} & \Cdots & & c_{ij} \\ % & \Vdots & & & & \Vdots \\ -% L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\ -% & \Vdots & & & & \Vdots \\ -% & a_{n1} & \Cdots & & & a_{nn} \\ -% \end{bNiceArray} -% & -% \begin{bNiceArray}{cc>{\strut}ccc} -% & & & & \\ -% & & \Vdots \\ -% \Cdots & & c_{ij} \\ -% \\ -% \\ -% \end{bNiceArray} -% \end{array}$ -% -% \end{NiceMatrixBlock} -% -% \begin{tikzpicture}[remember picture, overlay] -% \node [highlight = (A-3-1) (A-3-5) ] {} ; -% \node [highlight = (B-1-3) (B-5-3) ] {} ; -% \draw [color = gray] (A-3-3) to [bend left] (B-3-3) ; -% \end{tikzpicture} -% -% +% & a_{n1} & \Cdots & & & a_{nn} \\ +% \CodeAfter +% \begin{tikzpicture} +% \node [highlight = (9-2) (9-6)] { } ; +% \node [highlight = (2-9) (6-9)] { } ; +% \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ; +% \end{tikzpicture} +% \end{NiceArray}\] % %\section{Implementation} % @@ -4897,7 +5028,11 @@ version 2005/12/01 or later. % \end{macrocode} % % -% +% \bigskip +% \begin{macrocode} +\cs_set_eq:NN \@@_old_pgfpointanchor \pgfpointanchor +% \end{macrocode} +% % \bigskip % \textbf{The column S of siunitx}\par\nobreak % @@ -5271,6 +5406,13 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip +% For the key |code| of the command |\SubMatrix| (itself in the main +% |\CodeAfter|), we will use the following token list. +% \begin{macrocode} +\tl_new:N \l_@@_code_tl +% \end{macrocode} +% +% \bigskip % The following token list has a function similar to % |\g_nicematrix_code_after_tl| but it is used internally by \pkg{nicematrix}. % In fact, we have to distinguish between |\g_nicematrix_code_after_tl| and @@ -5335,8 +5477,9 @@ version 2005/12/01 or later. % |\g_@@_code_before_|\textsl{i}|_tl| (where \textsl{i} is the number of the % environment) and, at the beginning of the environment, it will be put in % |\l_@@_code_before_tl|. -% \item The final user can explicitely add material in |\l_@@_code_before_tl| by -% using the key |code-before|. +% \item The final user can explicitly add material in |\l_@@_code_before_tl| by +% using the key |code-before| or the keyword |\CodeBefore| (with the keyword +% |\Body|). % \end{itemize} % \begin{macrocode} \tl_new:N \l_@@_code_before_tl @@ -5432,8 +5575,29 @@ version 2005/12/01 or later. \seq_new:N \g_@@_submatrix_names_seq % \end{macrocode} % +% \medskip +% The following counters will be used when searching the extremities of a dotted +% line (we need these counters because of the potential ``open'' lines in the +% |\SubMatrix|---the |\SubMatrix| in the |code-before|). +% \begin{macrocode} +\int_new:N \l_@@_row_min_int +\int_new:N \l_@@_row_max_int +\int_new:N \l_@@_col_min_int +\int_new:N \l_@@_col_max_int +% \end{macrocode} % % \medskip +% The following sequence will be used when the command |\SubMatrix| is used in +% the |code-before| (and not in the |\CodeAfter|). It will contain the position of +% all the sub-matrices specified in the |code-before|. Each sub-matrix is +% represented by an ``object'' of the forme |{|$i$|}{|$j$|}{|$k$|}{|$l$|}| +% where $i$ and $j$ are the number of row and column of the upper-left cell and +% $k$ and $l$ the number of row and column of the lower-right cell. +% \begin{macrocode} +\seq_new:N \g_@@_submatrix_seq +% \end{macrocode} +% +% \medskip % We are able to determine the number of columns specified in the preamble (for % the environments with explicit preamble, of course and without the potential % exterior columns). @@ -5442,11 +5606,12 @@ version 2005/12/01 or later. % \end{macrocode} % % \medskip -% The following token lists correspond to the keys |fill| and |draw| of -% a command |\Block|. +% The following parameters correspond to the keys |fill|, |draw| and +% |rounded-corners| of the command |\Block|. % \begin{macrocode} \tl_new:N \l_@@_fill_tl \tl_new:N \l_@@_draw_tl +\dim_new:N \l_@@_rounded_corners_dim % \end{macrocode} % % \medskip @@ -5492,8 +5657,8 @@ version 2005/12/01 or later. \dim_new:N \l_@@_submatrix_extra_height_dim \dim_new:N \l_@@_submatrix_left_xshift_dim \dim_new:N \l_@@_submatrix_right_xshift_dim -\clist_new:N \l_@@_submatrix_hlines_clist -\clist_new:N \l_@@_submatrix_vlines_clist +\clist_new:N \l_@@_hlines_clist +\clist_new:N \l_@@_vlines_clist % \end{macrocode} % % @@ -5586,7 +5751,7 @@ version 2005/12/01 or later. % \begin{macrocode} \bool_new:N \g_@@_last_col_found_bool % \end{macrocode} -% This boolean is set to |false| at the end of |\@@_pre_array:|. +% This boolean is set to |false| at the end of |\@@_pre_array_ii:|. % \end{itemize} % % \bigskip @@ -5957,21 +6122,6 @@ version 2005/12/01 or later. \bool_set_true:N \l_@@_parallelize_diags_bool % \end{macrocode} % -% \bigskip -% If the flag |\l_@@_vlines_bool| is raised, horizontal space will be reserved -% in the the preamble of the array (for the vertical rules) and, after the -% construction of the array, the vertical rules will be drawn. -% \begin{macrocode} -\bool_new:N \l_@@_vlines_bool -% \end{macrocode} -% -% \bigskip -% If the flag |\l_@@_hlines_bool| is raised, vertical space will be reserved -% between the rows of the array (for the horizontal rules) and, after the -% construction of the array, the vertical rules will be drawn. -% \begin{macrocode} -\bool_new:N \l_@@_hlines_bool -% \end{macrocode} % % \bigskip % The flag |\l_@@_except_corners_bool| will be raised when the key @@ -6076,11 +6226,11 @@ version 2005/12/01 or later. % |{NiceMatrixBlock}|). However, even if we use the same type of delimiters, the % width of the delimiters may be different from an array to another because the % width of the delimiter is fonction of its size. That's why we create an option -% called |max-delimiter-width| which will give to the delimiters the width of +% called |delimiters/max-width| which will give to the delimiters the width of % a delimiter (of the same type) of big size. The following boolean corresponds % to this option. % \begin{macrocode} -\bool_new:N \l_@@_max_delimiter_width_bool +\bool_new:N \l_@@_delimiters_max_width_bool % \end{macrocode} % % \bigskip @@ -6153,9 +6303,8 @@ version 2005/12/01 or later. cell-space-top-limit = #1 , cell-space-bottom-limit = #1 , } , - cell-spaces-limits .value_required:n = true , + cell-space-limits .value_required:n = true , xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , - max-delimiter-width .bool_set:N = \l_@@_max_delimiter_width_bool , light-syntax .bool_set:N = \l_@@_light_syntax_bool , light-syntax .default:n = true , end-of-row .tl_set:N = \l_@@_end_of_row_tl , @@ -6172,8 +6321,10 @@ version 2005/12/01 or later. code-for-first-row .value_required:n = true , code-for-last-row .tl_set:N = \l_@@_code_for_last_row_tl , code-for-last-row .value_required:n = true , - hlines .bool_set:N = \l_@@_hlines_bool , - vlines .bool_set:N = \l_@@_vlines_bool , + hlines .clist_set:N = \l_@@_hlines_clist , + vlines .clist_set:N = \l_@@_vlines_clist , + hlines .default:n = all , + vlines .default:n = all , vlines-in-sub-matrix .code:n = { \tl_if_single_token:nTF { #1 } @@ -6183,8 +6334,8 @@ version 2005/12/01 or later. vlines-in-sub-matrix .value_required:n = true , hvlines .code:n = { - \bool_set_true:N \l_@@_vlines_bool - \bool_set_true:N \l_@@_hlines_bool + \clist_set:Nn \l_@@_vlines_clist { all } + \clist_set:Nn \l_@@_hlines_clist { all } } , parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool , % \end{macrocode} @@ -6221,13 +6372,14 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / Env } { + delimiters/max-width .bool_set:N = \l_@@_delimiters_max_width_bool , except-corners .clist_set:N = \l_@@_except_corners_clist , except-corners .default:n = { NW , SW , NE , SE } , hvlines-except-corners .code:n = { \clist_set:Nn \l_@@_except_corners_clist { #1 } - \bool_set_true:N \l_@@_vlines_bool - \bool_set_true:N \l_@@_hlines_bool + \clist_set:Nn \l_@@_vlines_clist { all } + \clist_set:Nn \l_@@_hlines_clist { all } } , hvlines-except-corners .default:n = { NW , SW , NE , SE } , code-before .code:n = @@ -6385,6 +6537,7 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / NiceMatrixOptions } { + delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool , delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , delimiters / color .value_required:n = true , delimiters-color .tl_set:N = \l_@@_delimiters_color_tl , @@ -6539,6 +6692,8 @@ version 2005/12/01 or later. delimiters-color .value_required:n = true , delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , delimiters / color .value_required:n = true , + r .code:n = \@@_error:n { r~or~l~with~preamble } , + l .code:n = \@@_error:n { r~or~l~with~preamble } , unknown .code:n = \@@_error:n { Unknown~option~for~NiceArray } } % \end{macrocode} @@ -6555,6 +6710,8 @@ version 2005/12/01 or later. first-row .code:n = \int_zero:N \l_@@_first_row_int , small .bool_set:N = \l_@@_small_bool , small .value_forbidden:n = true , + r .code:n = \@@_error:n { r~or~l~with~preamble } , + l .code:n = \@@_error:n { r~or~l~with~preamble } , unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix } } % \end{macrocode} @@ -6575,6 +6732,8 @@ version 2005/12/01 or later. last-col .code:n = \tl_if_empty:nF {#1} { \@@_error:n { last-col~non~empty~for~NiceArray } } \int_zero:N \l_@@_last_col_int , + r .code:n = \@@_error:n { r~or~l~with~preamble } , + l .code:n = \@@_error:n { r~or~l~with~preamble } , unknown .code:n = \@@_error:n { Unknown~option~for~NiceTabular } } % \end{macrocode} @@ -6999,24 +7158,33 @@ version 2005/12/01 or later. % We don't draw the rules of the key |hlines| (or |hvlines|) but we reserve the % vertical space for theses rules. % \begin{macrocode} - \bool_if:NT \l_@@_hlines_bool + \tl_if_empty:NF \l_@@_hlines_clist { + \tl_if_eq:NnF \l_@@_hlines_clist { all } + { + \exp_args:NNx + \clist_if_in:NnT + \l_@@_hlines_clist + { \@@_succ:n \c@iRow } + } + { % \end{macrocode} % The counter |\c@iRow| has the value $-1$ only if there is a ``first % row'' and that we are before that ``first row'', i.e. just before the % beginning of the array. % \begin{macrocode} - \int_compare:nNnT \c@iRow > { -1 } - { - \int_compare:nNnF \c@iRow = \l_@@_last_row_int + \int_compare:nNnT \c@iRow > { -1 } + { + \int_compare:nNnF \c@iRow = \l_@@_last_row_int % \end{macrocode} % The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of % the rules in the array. The package \pkg{nicematrix} uses it even if % \pkg{colortbl} is not loaded. We use a TeX group in order to limit the scope % of |\CT@arc@|. % \begin{macrocode} - { \hrule height \arrayrulewidth width \c_zero_dim } - } + { \hrule height \arrayrulewidth width \c_zero_dim } + } + } } } } @@ -7064,12 +7232,12 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% The following code |\@@_pre_array:| is used in |{NiceArrayWithDelims}|. It +% The following code |\@@_pre_array_ii:| is used in |{NiceArrayWithDelims}|. It % exists as a standalone macro only for legibility. % \label{prearray} % % \begin{macrocode} -\cs_new_protected:Npn \@@_pre_array: +\cs_new_protected:Npn \@@_pre_array_ii: { % \end{macrocode} % If \pkg{booktabs} is loaded, we have to patch the macro |\@BTnormal| which is @@ -7260,160 +7428,47 @@ version 2005/12/01 or later. \tl_gclear_new:N \g_nicematrix_code_before_tl } % \end{macrocode} -% This is the end of |\@@_pre_array:|. +% This is the end of |\@@_pre_array_ii:|. % -% % \bigskip -% \subsection*{The environment \{NiceArrayWithDelims\}} -% +% If the key |code-before| is used, we have to create the |col| nodes and the +% |row| nodes before the creation of the array. First, we have to test whether +% the size of the array has been written in the |aux| file in a previous run. In +% this case, a command |\@@_size_|{\slshape\ttfamily nb_of_env}|:| has been +% created. % \begin{macrocode} -\NewDocumentEnvironment { NiceArrayWithDelims } { m m O { } m ! O { } } - { - \@@_provide_pgfsyspdfmark: - \bool_if:NT \c_@@_footnote_bool \savenotes +\cs_new_protected:Npn \@@_pre_array: + { + \seq_gclear:N \g_@@_submatrix_seq + \bool_if:NT \l_@@_code_before_bool + { + \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq } + { % \end{macrocode} -% The aim of the following |\bgroup| (the corresponding |\egroup| is, of course, -% at the end of the environment) is to be able to put an exposant to a matrix in -% a mathematical formula. +% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that, +% in the |code-before| (and in the |\CodeAfter|) they represent the numbers of +% rows and columns of the array (without the potential last row and last column). % \begin{macrocode} - \bgroup + \int_zero_new:N \c@iRow + \int_set:Nn \c@iRow + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 } + \int_zero_new:N \c@jCol + \int_set:Nn \c@jCol + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 } % \end{macrocode} -% -% \bigskip +% We have to adjust the values of |\c@iRow| and |\c@jCol| to take into account +% the potential last row and last column. A value of $-2$ for +% |\l_@@_last_row_int| means that there is no last row. Idem for the columns. % \begin{macrocode} - \tl_set:Nn \l_@@_left_delim_tl { #1 } - \tl_set:Nn \l_@@_right_delim_tl { #2 } - \tl_gset:Nn \g_@@_preamble_tl { #4 } + \int_compare:nNnF \l_@@_last_row_int = { -2 } + { \int_decr:N \c@iRow } + \int_compare:nNnF \l_@@_last_col_int = { -2 } + { \int_decr:N \c@jCol } % \end{macrocode} -% -% -% \bigskip % -% \begin{macrocode} - \int_gzero:N \g_@@_block_box_int - \dim_zero:N \g_@@_width_last_col_dim - \dim_zero:N \g_@@_width_first_col_dim - \bool_gset_false:N \g_@@_row_of_col_done_bool - \str_if_empty:NT \g_@@_name_env_str - { \str_gset:Nn \g_@@_name_env_str { NiceArrayWithDelims } } - \@@_adapt_S_column: - \bool_if:NTF \l_@@_NiceTabular_bool - \mode_leave_vertical: - \@@_test_if_math_mode: - \bool_if:NT \l_@@_in_env_bool { \@@_fatal:n { Yet~in~env } } - \bool_set_true:N \l_@@_in_env_bool -% \end{macrocode} -% The command |\CT@arc@| contains the instruction of color for the rules of the -% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by |\CT@arc@| but -% we use it also for compatibility with \pkg{colortbl}. But we want also to be -% able to use color for the rules of the array when \pkg{colortbl} is \emph{not} -% loaded. That's why we do the following instruction which is in the patch of -% the beginning of arrays done by \pkg{colortbl}. Of course, we restore the -% value of |\CT@arc@| at the end of our environment. -% \begin{macrocode} - \cs_gset_eq:NN \@@_old_CT@arc@ \CT@arc@ -% \end{macrocode} -% -% We deactivate Tikz externalization because we will use \textsc{pgf} pictures -% with the options |overlay| and |remember picture| (or equivalent forms). We -% deactivate with |\tikzexternaldisable| and not with -% |\tikzset{external/export=false}| which is \emph{not} equivalent. -% \begin{macrocode} - \cs_if_exist:NT \tikz@library@external@loaded - { - \tikzexternaldisable - \cs_if_exist:NT \ifstandalone - { \tikzset { external / optimize = false } } - } -% \end{macrocode} -% -% We increment the counter |\g_@@_env_int| which counts the environments -% of the package. -% \begin{macrocode} - \int_gincr:N \g_@@_env_int - \bool_if:NF \l_@@_block_auto_columns_width_bool - { \dim_gzero_new:N \g_@@_max_cell_width_dim } -% \end{macrocode} -% -% -% The sequence |\g_@@_blocks_seq| will contain the carateristics of the blocks -% (specified by |\Block|) of the array. The sequence |\g_@@_pos_of_blocks_seq| -% will contain only the position of the blocks. Of course, this is redundant but -% it's for efficiency. -% \begin{macrocode} - \seq_gclear:N \g_@@_blocks_seq - \seq_gclear:N \g_@@_pos_of_blocks_seq -% \end{macrocode} -% In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the -% positions of the cells with a |\diagbox|. -% -% \begin{macrocode} - \seq_gclear:N \g_@@_pos_of_stroken_blocks_seq - \seq_gclear:N \g_@@_pos_of_xdots_seq -% \end{macrocode} -% -% \begin{macrocode} - \tl_if_exist:cT { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl } - { - \bool_set_true:N \l_@@_code_before_bool - \exp_args:NNv \tl_put_right:Nn \l_@@_code_before_tl - { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl } - } -% \end{macrocode} -% -% The set of keys is not exactly the same for |{NiceArray}| and for the variants -% of |{NiceArray}| (|{pNiceArray}|, |{bNiceArray}|, etc.) because, for -% |{NiceArray}|, we have the options |t|, |c|, |b| and |baseline|. -% \begin{macrocode} - \bool_if:NTF \l_@@_NiceArray_bool - { \keys_set:nn { NiceMatrix / NiceArray } } - { \keys_set:nn { NiceMatrix / pNiceArray } } - { #3 , #5 } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} - \tl_if_empty:NF \l_@@_rules_color_tl - { \exp_after:wN \@@_set_CT@arc@: \l_@@_rules_color_tl \q_stop } -% \end{macrocode} -% -% -% \bigskip -% If the key |code-before| is used, we have to create the |col| nodes and the -% |row| nodes before the creation of the array. First, we have to test whether -% the size of the array has been written in the |aux| file in a previous run. In -% this case, a command |\@@_size_|{\slshape\ttfamily nb_of_env}|:| has been -% created. -% \begin{macrocode} - \bool_if:NT \l_@@_code_before_bool - { - \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq } - { -% \end{macrocode} -% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that, -% in the |code-before| (and in the |\CodeAfter|) they represent the numbers of -% rows and columns of the array (without the potential last row and last column). -% \begin{macrocode} - \int_zero_new:N \c@iRow - \int_set:Nn \c@iRow - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 } - \int_zero_new:N \c@jCol - \int_set:Nn \c@jCol - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 } -% \end{macrocode} -% We have to adjust the values of |\c@iRow| and |\c@jCol| to take into account -% the potential last row and last column. A value of $-2$ for -% |\l_@@_last_row_int| means that there is no last row. Idem for the columns. -% \begin{macrocode} - \int_compare:nNnF \l_@@_last_row_int = { -2 } - { \int_decr:N \c@iRow } - \int_compare:nNnF \l_@@_last_col_int = { -2 } - { \int_decr:N \c@jCol } -% \end{macrocode} -% -% Now, we will create all the |col| nodes and |row| nodes with the informations -% written in the |aux| file. You use the technique described in the page~1229 of -% |pgfmanual.pdf|, version~3.1.4b. +% Now, we will create all the |col| nodes and |row| nodes with the informations +% written in the |aux| file. You use the technique described in the page~1229 of +% |pgfmanual.pdf|, version~3.1.4b. % \begin{macrocode} \pgfsys@markposition { \@@_env: - position } \pgfsys@getposition { \@@_env: - position } \@@_picture_position: @@ -7448,7 +7503,7 @@ version 2005/12/01 or later. % \end{macrocode} % % \medskip -% Now, yet another settings before the executation of the |code-before|. +% Now, yet other settings before the execution of the |code-before|. % \begin{macrocode} \group_begin: \bool_if:NT \c_@@_tikz_loaded_bool @@ -7461,17 +7516,30 @@ version 2005/12/01 or later. } \cs_set_eq:NN \cellcolor \@@_cellcolor \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor + \cs_set_eq:NN \roundedrectanglecolor \@@_roundedrectanglecolor \cs_set_eq:NN \rowcolor \@@_rowcolor \cs_set_eq:NN \rowcolors \@@_rowcolors \cs_set_eq:NN \columncolor \@@_columncolor \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors + \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before % \end{macrocode} % We compose the |code-before| in math mode in order to nullify the spaces put % by the user between instructions in the |code-before|. % \begin{macrocode} \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token \seq_clear_new:N \l_@@_colors_seq - \l_@@_code_before_tl +% \end{macrocode} +% Here is the |\CodeBefore|. As of now, the keys that may be provided to the +% keyword |\CodeBefore| are the same as keys that may be provided to +% |\CodeAfter|, hence the |\@@_CodeAfter_keys:|. +% \begin{macrocode} + \exp_last_unbraced:NV \@@_CodeAfter_keys: \l_@@_code_before_tl +% \end{macrocode} +% Now, all the cells which are specified to be colored by instructions in the +% |\CodeBefore| will actually be colored. It's a two-stages mechanism because we +% want to draw all the cells with the same color at the same time to absolutely +% avoid thin white lines in some \textsc{pdf} viewers. +% \begin{macrocode} \@@_actually_color: \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token \group_end: @@ -7547,9 +7615,9 @@ version 2005/12/01 or later. % \end{macrocode} % % \interitem -% The code in |\@@_pre_array:| is used only by |{NiceArrayWithDelims}|. +% The code in |\@@_pre_array_ii:| is used only by |{NiceArrayWithDelims}|. % \begin{macrocode} - \@@_pre_array: + \@@_pre_array_ii: % \end{macrocode} % % \medskip @@ -7617,6 +7685,150 @@ version 2005/12/01 or later. } % \end{macrocode} % +% \bigskip +% The following command |\@@_pre_array_i:w| will be used when the keyword +% |\CodeBefore| is present at the beginning of the environment. +% \begin{macrocode} +\cs_new_protected:Npn \@@_pre_array_i:w #1 \Body + { + \tl_put_right:Nn \l_@@_code_before_tl { #1 } + \bool_set_true:N \l_@@_code_before_bool +% \end{macrocode} +% We go on with |\@@_pre_array:| which will (among other) execute the +% |\CodeBefore| (specified in the key |code-before| or after the keyword +% |\CodeBefore|). By definition, the |\CodeBefore| must be executed before the +% body of the array... +% \begin{macrocode} + \@@_pre_array: + } +% \end{macrocode} +% +% \bigskip +% \subsection*{The environment \{NiceArrayWithDelims\}} +% +% \begin{macrocode} +\NewDocumentEnvironment { NiceArrayWithDelims } + { m m O { } m ! O { } t \CodeBefore } + { + \@@_provide_pgfsyspdfmark: + \bool_if:NT \c_@@_footnote_bool \savenotes +% \end{macrocode} +% The aim of the following |\bgroup| (the corresponding |\egroup| is, of course, +% at the end of the environment) is to be able to put an exposant to a matrix in +% a mathematical formula. +% \begin{macrocode} + \bgroup +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} + \tl_set:Nn \l_@@_left_delim_tl { #1 } + \tl_set:Nn \l_@@_right_delim_tl { #2 } + \tl_gset:Nn \g_@@_preamble_tl { #4 } +% \end{macrocode} +% +% +% \bigskip +% +% \begin{macrocode} + \int_gzero:N \g_@@_block_box_int + \dim_zero:N \g_@@_width_last_col_dim + \dim_zero:N \g_@@_width_first_col_dim + \bool_gset_false:N \g_@@_row_of_col_done_bool + \str_if_empty:NT \g_@@_name_env_str + { \str_gset:Nn \g_@@_name_env_str { NiceArrayWithDelims } } + \@@_adapt_S_column: + \bool_if:NTF \l_@@_NiceTabular_bool + \mode_leave_vertical: + \@@_test_if_math_mode: + \bool_if:NT \l_@@_in_env_bool { \@@_fatal:n { Yet~in~env } } + \bool_set_true:N \l_@@_in_env_bool +% \end{macrocode} +% The command |\CT@arc@| contains the instruction of color for the rules of the +% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by |\CT@arc@| but +% we use it also for compatibility with \pkg{colortbl}. But we want also to be +% able to use color for the rules of the array when \pkg{colortbl} is \emph{not} +% loaded. That's why we do the following instruction which is in the patch of +% the beginning of arrays done by \pkg{colortbl}. Of course, we restore the +% value of |\CT@arc@| at the end of our environment. +% \begin{macrocode} + \cs_gset_eq:NN \@@_old_CT@arc@ \CT@arc@ +% \end{macrocode} +% +% We deactivate Tikz externalization because we will use \textsc{pgf} pictures +% with the options |overlay| and |remember picture| (or equivalent forms). We +% deactivate with |\tikzexternaldisable| and not with +% |\tikzset{external/export=false}| which is \emph{not} equivalent. +% \begin{macrocode} + \cs_if_exist:NT \tikz@library@external@loaded + { + \tikzexternaldisable + \cs_if_exist:NT \ifstandalone + { \tikzset { external / optimize = false } } + } +% \end{macrocode} +% +% We increment the counter |\g_@@_env_int| which counts the environments +% of the package. +% \begin{macrocode} + \int_gincr:N \g_@@_env_int + \bool_if:NF \l_@@_block_auto_columns_width_bool + { \dim_gzero_new:N \g_@@_max_cell_width_dim } +% \end{macrocode} +% +% +% The sequence |\g_@@_blocks_seq| will contain the carateristics of the blocks +% (specified by |\Block|) of the array. The sequence |\g_@@_pos_of_blocks_seq| +% will contain only the position of the blocks. Of course, this is redundant but +% it's for efficiency. +% \begin{macrocode} + \seq_gclear:N \g_@@_blocks_seq + \seq_gclear:N \g_@@_pos_of_blocks_seq +% \end{macrocode} +% In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the +% positions of the cells with a |\diagbox|. +% +% \begin{macrocode} + \seq_gclear:N \g_@@_pos_of_stroken_blocks_seq + \seq_gclear:N \g_@@_pos_of_xdots_seq +% \end{macrocode} +% +% \begin{macrocode} + \tl_if_exist:cT { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl } + { + \bool_set_true:N \l_@@_code_before_bool + \exp_args:NNv \tl_put_right:Nn \l_@@_code_before_tl + { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl } + } +% \end{macrocode} +% +% The set of keys is not exactly the same for |{NiceArray}| and for the variants +% of |{NiceArray}| (|{pNiceArray}|, |{bNiceArray}|, etc.) because, for +% |{NiceArray}|, we have the options |t|, |c|, |b| and |baseline|. +% \begin{macrocode} + \bool_if:NTF \l_@@_NiceArray_bool + { \keys_set:nn { NiceMatrix / NiceArray } } + { \keys_set:nn { NiceMatrix / pNiceArray } } + { #3 , #5 } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} + \tl_if_empty:NF \l_@@_rules_color_tl + { \exp_after:wN \@@_set_CT@arc@: \l_@@_rules_color_tl \q_stop } +% \bigskip +% \end{macrocode} +% The argument |#6| is the last argument of |{NiceArrayWithDelims}|. With that +% argument of type ``|t \CodeBefore|'', we test whether there is the keyword +% |\CodeBefore| at the beginning of the environment. If that keyword is present, +% we have now to extract all the content between that keyword |\CodeBefore| and +% the (other) keyword |\Body|. It's the job that will do the command +% |\@@_pre_array_i:w|. After that job, the command |\@@_pre_array_i:w| will go +% on with |\@@_pre_array:|. +% \begin{macrocode} + \IfBooleanTF { #6 } \@@_pre_array_i:w \@@_pre_array: + } +% \end{macrocode} % % \begin{macrocode} { @@ -7761,6 +7973,13 @@ version 2005/12/01 or later. % \begin{macrocode} \skip_vertical:N -\l_tmpb_dim } +% \end{macrocode} +% Curiously, we have to put again the following specification of color. +% Otherwise, with XeLaTeX (and not with the other engines), the closing +% delimiter is not colored. +% \begin{macrocode} + \tl_if_empty:NF \l_@@_delimiters_color_tl + { \color { \l_@@_delimiters_color_tl } } \exp_after:wN \right \l_@@_right_delim_tl \c_math_toggle_token } @@ -7769,9 +7988,9 @@ version 2005/12/01 or later. % % \smallskip % We will put the box in the TeX flow. However, we have a small work to do -% when the option |max-delimiter-width| is used. +% when the option |delimiters/max-width| is used. % \begin{macrocode} - \bool_if:NTF \l_@@_max_delimiter_width_bool + \bool_if:NTF \l_@@_delimiters_max_width_bool { \@@_put_box_in_flow_bis:nn { #1 } { #2 } } \@@_put_box_in_flow: } @@ -7877,12 +8096,19 @@ version 2005/12/01 or later. % counter |\c@jCol|. % \begin{macrocode} \int_gzero_new:N \c@jCol - \bool_if:NTF \l_@@_vlines_bool + \tl_gclear:N \g_@@_preamble_tl + \tl_if_eq:NnTF \l_@@_vlines_clist { all } { \tl_gset:Nn \g_@@_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } - { \tl_gclear:N \g_@@_preamble_tl } + { + \clist_if_in:NnT \l_@@_vlines_clist 1 + { + \tl_gset:Nn \g_@@_preamble_tl + { ! { \skip_horizontal:N \arrayrulewidth } } + } + } % \end{macrocode} % The sequence |\g_@@_cols_vlsim_seq| will contain the numbers of the columns % where you will to have to draw vertical lines in the potential sub-matrices @@ -7925,7 +8151,7 @@ version 2005/12/01 or later. { \l_@@_NiceArray_bool { \bool_not_p:n \l_@@_NiceTabular_bool } - { \bool_not_p:n \l_@@_vlines_bool } + { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } } { \tl_gput_left:Nn \g_@@_preamble_tl { @ { } } } @@ -7937,7 +8163,7 @@ version 2005/12/01 or later. { \l_@@_NiceArray_bool { \bool_not_p:n \l_@@_NiceTabular_bool } - { \bool_not_p:n \l_@@_vlines_bool } + { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } } { \tl_gput_right:Nn \g_@@_preamble_tl { @ { } } } @@ -8242,11 +8468,19 @@ version 2005/12/01 or later. \str_if_eq:nnTF { #1 } { < } \@@_patch_preamble_ix:n { - \bool_if:NT \l_@@_vlines_bool + \tl_if_eq:NnTF \l_@@_vlines_clist { all } { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } + { + \exp_args:NNx + \clist_if_in:NnT \l_@@_vlines_clist { \@@_succ:n \c@jCol } + { + \tl_gput_right:Nn \g_@@_preamble_tl + { ! { \skip_horizontal:N \arrayrulewidth } } + } + } \@@_patch_preamble:n { #1 } } } @@ -8506,7 +8740,7 @@ version 2005/12/01 or later. % % \bigskip % The command |\@@_put_box_in_flow_bis:| is used when the option -% |max-delimiter-width| is used because, in this case, we have to adjust the +% |delimiters/max-width| is used because, in this case, we have to adjust the % widths of the delimiters. The arguments |#1| and |#2| are the delimiters % specified by the user. % \begin{macrocode} @@ -9380,17 +9614,16 @@ version 2005/12/01 or later. \cs_set_eq:NN \@@_vline_i:nn \@@_vline_i_complete:nn \cs_set_eq:NN \@@_hline_i:nn \@@_hline_i_complete:nn } - \bool_if:NT \l_@@_hlines_bool \@@_draw_hlines: - \bool_if:NT \l_@@_vlines_bool \@@_draw_vlines: + \tl_if_empty:NF \l_@@_hlines_clist \@@_draw_hlines: + \tl_if_empty:NF \l_@@_vlines_clist \@@_draw_vlines: % \end{macrocode} % % \begin{macrocode} - \g_@@_internal_code_after_tl - \tl_gclear:N \g_@@_internal_code_after_tl + \cs_set_eq:NN \SubMatrix \@@_SubMatrix % \end{macrocode} % % \bigskip -% Now, the |\CodeAfter|. +% Now, the internal |code-after| and then, the |\CodeAfter|. % \begin{macrocode} \bool_if:NT \c_@@_tikz_loaded_bool { @@ -9405,7 +9638,8 @@ version 2005/12/01 or later. } } \cs_set_eq:NN \line \@@_line - \cs_set_eq:NN \SubMatrix \@@_SubMatrix + \g_@@_internal_code_after_tl + \tl_gclear:N \g_@@_internal_code_after_tl % \end{macrocode} % When |light-syntax| is used, we insert systematically a |\CodeAfter| in the % flow. Thus, it's possible to have two instructions |\CodeAfter| and the second @@ -9654,23 +9888,23 @@ version 2005/12/01 or later. % We test if we are still in the matrix. % \begin{macrocode} \bool_set_false:N \l_@@_final_open_bool - \int_compare:nNnTF \l_@@_final_i_int > \c@iRow + \int_compare:nNnTF \l_@@_final_i_int > \l_@@_row_max_int { \int_compare:nNnTF { #3 } = 1 { \bool_set_true:N \l_@@_final_open_bool } { - \int_compare:nNnT \l_@@_final_j_int > \c@jCol + \int_compare:nNnT \l_@@_final_j_int > \l_@@_col_max_int { \bool_set_true:N \l_@@_final_open_bool } } } { - \int_compare:nNnTF \l_@@_final_j_int < 1 + \int_compare:nNnTF \l_@@_final_j_int < \l_@@_col_min_int { \int_compare:nNnT { #4 } = { -1 } { \bool_set_true:N \l_@@_final_open_bool } } { - \int_compare:nNnT \l_@@_final_j_int > \c@jCol + \int_compare:nNnT \l_@@_final_j_int > \l_@@_col_max_int { \int_compare:nNnT { #4 } = 1 { \bool_set_true:N \l_@@_final_open_bool } @@ -9722,7 +9956,7 @@ version 2005/12/01 or later. % a dotted line have to be marked as ``dotted'' because we don't want % intersections between dotted lines. We recall that the research of the % extremities of the lines are all done in the same TeX group (the group of the -% environnement), even though, when the extremities are found, each line is +% environment), even though, when the extremities are found, each line is % drawn in a TeX group that we will open for the options of the line. % \begin{macrocode} { @@ -9749,23 +9983,23 @@ version 2005/12/01 or later. \int_sub:Nn \l_@@_initial_i_int { #3 } \int_sub:Nn \l_@@_initial_j_int { #4 } \bool_set_false:N \l_@@_initial_open_bool - \int_compare:nNnTF \l_@@_initial_i_int < 1 + \int_compare:nNnTF \l_@@_initial_i_int < \l_@@_row_min_int { \int_compare:nNnTF { #3 } = 1 { \bool_set_true:N \l_@@_initial_open_bool } { - \int_compare:nNnT \l_@@_initial_j_int = 0 + \int_compare:nNnT \l_@@_initial_j_int = { \l_@@_col_min_int -1 } { \bool_set_true:N \l_@@_initial_open_bool } } } { - \int_compare:nNnTF \l_@@_initial_j_int < 1 + \int_compare:nNnTF \l_@@_initial_j_int < \l_@@_col_min_int { \int_compare:nNnT { #4 } = 1 { \bool_set_true:N \l_@@_initial_open_bool } } { - \int_compare:nNnT \l_@@_initial_j_int > \c@jCol + \int_compare:nNnT \l_@@_initial_j_int > \l_@@_col_max_int { \int_compare:nNnT { #4 } = { -1 } { \bool_set_true:N \l_@@_initial_open_bool } @@ -9827,6 +10061,51 @@ version 2005/12/01 or later. % \end{macrocode} % % \medskip +% The following commmand (\emph{when it will be written}) will set the four +% counters |\l_@@_row_min_int|, |\l_@@_row_max_int|, |\l_@@_col_min_int| and +% |\l_@@_col_max_int| to the intersections of the sub-matrices which contains +% the cell of row |#1| and column |#2|. +% As of now, it's only the whole array (excepted exterior row and columns). +% \begin{macrocode} +\cs_new_protected:Npn \@@_adjust_to_submatrix:nn #1 #2 + { + \int_set:Nn \l_@@_row_min_int 1 + \int_set:Nn \l_@@_col_min_int 1 + \int_set_eq:NN \l_@@_row_max_int \c@iRow + \int_set_eq:NN \l_@@_col_max_int \c@jCol +% \end{macrocode} +% We do a loop over all the submatrices specified in the |code-before|. We have +% stored the position of all those submatrices in |\g_@@_submatrix_seq|. +% \begin{macrocode} + \seq_map_inline:Nn \g_@@_submatrix_seq + { \@@_adjust_to_submatrix:nnnnnn { #1 } { #2 } ##1 } + } +% \end{macrocode} +% +% \medskip +% |#1| and |#2| are the numbers of row and columns of the cell where the command +% of dotted line (ex.: |\Vdots|) has been issued. |#3|, |#4|, |#5| and |#6| are +% the specification (in $i$ and $j$) of the submatrix where are analysing. +% \begin{macrocode} +\cs_set_protected:Npn \@@_adjust_to_submatrix:nnnnnn #1 #2 #3 #4 #5 #6 + { + \bool_if:nT + { + \int_compare_p:n { #3 <= #1 } + && \int_compare_p:n { #1 <= #5 } + && \int_compare_p:n { #4 <= #2 } + && \int_compare_p:n { #2 <= #6 } + } + { + \int_set:Nn \l_@@_row_min_int { \int_max:nn \l_@@_row_min_int { #3 } } + \int_set:Nn \l_@@_col_min_int { \int_max:nn \l_@@_col_min_int { #4 } } + \int_set:Nn \l_@@_row_max_int { \int_min:nn \l_@@_row_max_int { #5 } } + \int_set:Nn \l_@@_col_max_int { \int_min:nn \l_@@_col_max_int { #6 } } + } + } +% \end{macrocode} +% +% \medskip % \begin{macrocode} \cs_new_protected:Npn \@@_set_initial_coords: { @@ -9862,12 +10141,74 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_open_x_initial_dim: + { + \dim_set_eq:NN \l_@@_x_initial_dim \c_max_dim + \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int + { + \cs_if_exist:cT + { pgf @ sh @ ns @ \@@_env: - ##1 - \int_use:N \l_@@_initial_j_int } + { + \pgfpointanchor + { \@@_env: - ##1 - \int_use:N \l_@@_initial_j_int } + { west } + \dim_set:Nn \l_@@_x_initial_dim + { \dim_min:nn \l_@@_x_initial_dim \pgf@x } + } + } +% \end{macrocode} +% If, in fact, all the cells of the columns are empty (no PGF/Tikz nodes in +% those cells). +% \begin{macrocode} + \dim_compare:nNnT \l_@@_x_initial_dim = \c_max_dim + { + \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int } + \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x + \dim_add:Nn \l_@@_x_initial_dim \col@sep + } + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_open_x_final_dim: + { + \dim_set:Nn \l_@@_x_final_dim { - \c_max_dim } + \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int + { + \cs_if_exist:cT + { pgf @ sh @ ns @ \@@_env: - ##1 - \int_use:N \l_@@_final_j_int } + { + \pgfpointanchor + { \@@_env: - ##1 - \int_use:N \l_@@_final_j_int } + { east } + \dim_set:Nn \l_@@_x_final_dim + { \dim_max:nn \l_@@_x_final_dim \pgf@x } + } + } +% \end{macrocode} +% If, in fact, all the cells of the columns are empty (no PGF/Tikz nodes in +% those cells). +% \begin{macrocode} + \dim_compare:nNnT \l_@@_x_final_dim = { - \c_max_dim } + { + \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int } + \dim_set_eq:NN \l_@@_x_final_dim \pgf@x + \dim_sub:Nn \l_@@_x_final_dim \col@sep + } + } +% \end{macrocode} +% +% +% % \interitem % The first and the second arguments are the coordinates of the cell where the % command has been issued. The third argument is the list of the options. % \begin{macrocode} \cs_new_protected:Npn \@@_draw_Ldots:nnn #1 #2 #3 { + \@@_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { @@ _ dotted _ #1 - #2 } { \@@_find_extremities_of_line:nnnn { #1 } { #2 } 0 1 @@ -9914,18 +10255,14 @@ version 2005/12/01 or later. { \bool_if:NTF \l_@@_initial_open_bool { - \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int } - \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x - \dim_add:Nn \l_@@_x_initial_dim \col@sep + \@@_open_x_initial_dim: \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int - base } \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y } { \@@_set_initial_coords_from_anchor:n { base~east } } \bool_if:NTF \l_@@_final_open_bool { - \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int } - \dim_set_eq:NN \l_@@_x_final_dim \pgf@x - \dim_sub:Nn \l_@@_x_final_dim \col@sep + \@@_open_x_final_dim: \@@_qpoint:n { row - \int_use:N \l_@@_final_i_int - base } \dim_set_eq:NN \l_@@_y_final_dim \pgf@y } @@ -9947,6 +10284,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_draw_Cdots:nnn #1 #2 #3 { + \@@_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { @@ _ dotted _ #1 - #2 } { \@@_find_extremities_of_line:nnnn { #1 } { #2 } 0 1 @@ -9975,6 +10313,7 @@ version 2005/12/01 or later. } % \end{macrocode} % +% % \medskip % The command |\@@_actually_draw_Cdots:| has the following implicit arguments: % \begin{itemize} @@ -9990,18 +10329,10 @@ version 2005/12/01 or later. \cs_new_protected:Npn \@@_actually_draw_Cdots: { \bool_if:NTF \l_@@_initial_open_bool - { - \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int } - \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x - \dim_add:Nn \l_@@_x_initial_dim \col@sep - } + { \@@_open_x_initial_dim: } { \@@_set_initial_coords_from_anchor:n { mid~east } } \bool_if:NTF \l_@@_final_open_bool - { - \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int } - \dim_set_eq:NN \l_@@_x_final_dim \pgf@x - \dim_sub:Nn \l_@@_x_final_dim \col@sep - } + { \@@_open_x_final_dim: } { \@@_set_final_coords_from_anchor:n { mid~west } } \bool_lazy_and:nnTF \l_@@_initial_open_bool @@ -10023,12 +10354,55 @@ version 2005/12/01 or later. } % \end{macrocode} % +% \begin{macrocode} +\cs_new_protected:Npn \@@_open_y_initial_dim: + { + \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int - base } + \dim_set:Nn \l_@@_y_initial_dim + { \pgf@y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch } + \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int + { + \cs_if_exist:cT + { pgf @ sh @ ns @ \@@_env: - \int_use:N \l_@@_initial_i_int - ##1 } + { + \pgfpointanchor + { \@@_env: - \int_use:N \l_@@_initial_i_int - ##1 } + { north } + \dim_set:Nn \l_@@_y_initial_dim + { \dim_max:nn \l_@@_y_initial_dim \pgf@y } + } + } + } +% \end{macrocode} % +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_open_y_final_dim: + { + \@@_qpoint:n { row - \int_use:N \l_@@_final_i_int - base } + \dim_set:Nn \l_@@_y_final_dim + { \pgf@y - ( \box_dp:N \strutbox ) * \arraystretch } + \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int + { + \cs_if_exist:cT + { pgf @ sh @ ns @ \@@_env: - \int_use:N \l_@@_final_i_int - ##1 } + { + \pgfpointanchor + { \@@_env: - \int_use:N \l_@@_final_i_int - ##1 } + { south } + \dim_set:Nn \l_@@_y_final_dim + { \dim_min:nn \l_@@_y_final_dim \pgf@y } + } + } + } +% \end{macrocode} +% % The first and the second arguments are the coordinates of the cell where the % command has been issued. The third argument is the list of the options. % \begin{macrocode} \cs_new_protected:Npn \@@_draw_Vdots:nnn #1 #2 #3 { + \@@_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { @@ _ dotted _ #1 - #2 } { \@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 0 @@ -10073,6 +10447,9 @@ version 2005/12/01 or later. % be considered as if. % \begin{macrocode} \bool_set_false:N \l_tmpa_bool +% \end{macrocode} +% First the case when the line is closed on both ends. +% \begin{macrocode} \bool_lazy_or:nnF \l_@@_initial_open_bool \l_@@_final_open_bool { \@@_set_initial_coords_from_anchor:n { south~west } @@ -10085,16 +10462,10 @@ version 2005/12/01 or later. % considered as if. % \begin{macrocode} \bool_if:NTF \l_@@_initial_open_bool - { - \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int } - \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y - } + \@@_open_y_initial_dim: { \@@_set_initial_coords_from_anchor:n { south } } \bool_if:NTF \l_@@_final_open_bool - { - \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int } - \dim_set_eq:NN \l_@@_y_final_dim \pgf@y - } + \@@_open_y_final_dim: { \@@_set_final_coords_from_anchor:n { north } } \bool_if:NTF \l_@@_initial_open_bool { @@ -10130,8 +10501,7 @@ version 2005/12/01 or later. { % \end{macrocode} % Now the case where both extremities are closed. The first conditional tests -% whether the column is of type |c| (|C| of |{NiceArray}|) or may be considered -% as if. +% whether the column is of type |c| or may be considered as if. % \begin{macrocode} \dim_compare:nNnF \l_@@_x_initial_dim = \l_@@_x_final_dim { @@ -10158,6 +10528,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_draw_Ddots:nnn #1 #2 #3 { + \@@_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { @@ _ dotted _ #1 - #2 } { \@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 1 @@ -10191,17 +10562,17 @@ version 2005/12/01 or later. { \bool_if:NTF \l_@@_initial_open_bool { - \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int } - \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y - \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int } - \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x + \@@_open_y_initial_dim: + % \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int } + % \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x + \@@_open_x_initial_dim: } { \@@_set_initial_coords_from_anchor:n { south~east } } \bool_if:NTF \l_@@_final_open_bool { - \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int } - \dim_set_eq:NN \l_@@_y_final_dim \pgf@y - \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int } + % \@@_open_y_final_dim: + % \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int } + \@@_open_x_final_dim: \dim_set_eq:NN \l_@@_x_final_dim \pgf@x } { \@@_set_final_coords_from_anchor:n { north~west } } @@ -10255,6 +10626,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_draw_Iddots:nnn #1 #2 #3 { + \@@_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { @@ _ dotted _ #1 - #2 } { \@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 { -1 } @@ -10288,18 +10660,22 @@ version 2005/12/01 or later. { \bool_if:NTF \l_@@_initial_open_bool { - \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int } - \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y - \@@_qpoint:n { col - \@@_succ:n \l_@@_initial_j_int } - \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x + % \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int } + % \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y + \@@_open_y_initial_dim: + % \@@_qpoint:n { col - \@@_succ:n \l_@@_initial_j_int } + % \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x + \@@_open_x_initial_dim: } { \@@_set_initial_coords_from_anchor:n { south~west } } \bool_if:NTF \l_@@_final_open_bool { - \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int } - \dim_set_eq:NN \l_@@_y_final_dim \pgf@y - \@@_qpoint:n { col - \int_use:N \l_@@_final_j_int } - \dim_set_eq:NN \l_@@_x_final_dim \pgf@x + % \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int } + % \dim_set_eq:NN \l_@@_y_final_dim \pgf@y + \@@_open_y_final_dim: + % \@@_qpoint:n { col - \int_use:N \l_@@_final_j_int } + % \dim_set_eq:NN \l_@@_x_final_dim \pgf@x + \@@_open_x_final_dim: } { \@@_set_final_coords_from_anchor:n { north~east } } \bool_if:NT \l_@@_parallelize_diags_bool @@ -10404,8 +10780,8 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% The command |\@@_draw_standard_dotted_line:| draws the line with our system of points -% (which gives a dotted line with real round points). +% The command |\@@_draw_standard_dotted_line:| draws the line with our system of dots +% (which gives a dotted line with real round dots). % \begin{macrocode} \cs_new_protected:Npn \@@_draw_standard_dotted_line: { @@ -10494,7 +10870,7 @@ version 2005/12/01 or later. \cs_new_protected:Npn \@@_draw_standard_dotted_line_i: { % \end{macrocode} -% The integer |\l_tmpa_int| is the number of dots of the dotted line. +% The number of dots will be |\l_tmpa_int + 1|. % \begin{macrocode} \bool_if:NTF \l_@@_initial_open_bool { @@ -10532,6 +10908,8 @@ version 2005/12/01 or later. } } % \end{macrocode} +% +% \medskip % The dimensions |\l_tmpa_dim| and |\l_tmpb_dim| are the coordinates of the % vector between two dots in the dotted line. % \begin{macrocode} @@ -10860,7 +11238,7 @@ version 2005/12/01 or later. \AtBeginDocument { \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } } - \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl + \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl % \end{macrocode} % We don't put |!| before the last optionnal argument for homogeneity with % |\Cdots|, etc. which have only one optional argument. @@ -11177,7 +11555,7 @@ version 2005/12/01 or later. % % We want to avoid the thin white lines that are shown in some \textsc{pdf} % viewers (eg: with the engine MuPDF used by SumatraPDF). That's why we try to -% draw rectangles of the same color in the same instruction |\pgfusepathqfill| +% draw rectangles of the same color in the same instruction |\pgfusepath { fill }| % (and they will be in the same instruction |fill|---coded |f|--- in the % resulting \textsc{pdf}). % @@ -11246,7 +11624,7 @@ version 2005/12/01 or later. { \color ##2 \use:c { l_@@_color _ ##1 _tl } - \pgfusepathqfill + \pgfusepath { fill } } \endpgfpicture } @@ -11282,7 +11660,7 @@ version 2005/12/01 or later. \tl_set:Nn \l_@@_cols_tl { - } % \end{macrocode} % The command |\@@_cartesian_path:| takes in two implicit arguments: -% |\l_@@_cols_tl| and |\l_@@_row_tl|. +% |\l_@@_cols_tl| and |\l_@@_rows_tl|. % \begin{macrocode} \@@_cartesian_path: } @@ -11309,7 +11687,7 @@ version 2005/12/01 or later. \tl_set:Nn \l_@@_cols_tl { #1 } % \end{macrocode} % The command |\@@_cartesian_path:| takes in two implicit arguments: -% |\l_@@_cols_tl| and |\l_@@_row_tl|. +% |\l_@@_cols_tl| and |\l_@@_rows_tl|. % \begin{macrocode} \@@_cartesian_path: } @@ -11325,14 +11703,29 @@ version 2005/12/01 or later. { \@@_add_to_colors_seq:xn { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } } - { \@@_rectanglecolor:nn { #3 } { #4 } } + { \@@_rectanglecolor:nnn { #3 } { #4 } { 0 pt }} + } + } +% \end{macrocode} +% +% \bigskip +% The last argument is the radius of the corners of the rectangle. +% \begin{macrocode} +\NewDocumentCommand \@@_roundedrectanglecolor { O { } m m m m } + { + \tl_if_blank:nF { #2 } + { + \@@_add_to_colors_seq:xn + { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } } + { \@@_rectanglecolor:nnn { #3 } { #4 } { #5 } } } } % \end{macrocode} % % \bigskip +% The last argument is the radius of the corners of the rectangle. % \begin{macrocode} -\cs_new_protected:Npn \@@_rectanglecolor:nn #1 #2 +\cs_new_protected:Npn \@@_rectanglecolor:nnn #1 #2 #3 { \@@_cut_on_hyphen:w #1 \q_stop \tl_clear_new:N \l_tmpc_tl @@ -11343,10 +11736,10 @@ version 2005/12/01 or later. \tl_set:Nx \l_@@_rows_tl { \l_tmpc_tl - \l_tmpa_tl } \tl_set:Nx \l_@@_cols_tl { \l_tmpd_tl - \l_tmpb_tl } % \end{macrocode} -% The command |\@@_cartesian_path:| takes in two implicit arguments: -% |\l_@@_cols_tl| and |\l_@@_row_tl|. +% The command |\@@_cartesian_path:n| takes in two implicit arguments: +% |\l_@@_cols_tl| and |\l_@@_rows_tl|. % \begin{macrocode} - \@@_cartesian_path: + \@@_cartesian_path:n { #3 } } % \end{macrocode} % @@ -11488,10 +11881,10 @@ version 2005/12/01 or later. { #3 } % \end{macrocode} % The command |\@@_cartesian_path:| takes in two implicit arguments: -% |\l_@@_cols_tl| and |\l_@@_row_tl|. +% |\l_@@_cols_tl| and |\l_@@_rows_tl|. % \begin{macrocode} \@@_cartesian_path: - \pgfusepathqfill + \pgfusepath { fill } } \bool_set_false:N \l_tmpa_bool } @@ -11507,7 +11900,7 @@ version 2005/12/01 or later. % |\l_@@_cols_tl| and |\l_@@_row_tl|. % \begin{macrocode} \@@_cartesian_path: - \pgfusepathqfill + \pgfusepath { fill } } \bool_set_true:N \l_tmpa_bool } @@ -11559,14 +11952,17 @@ version 2005/12/01 or later. % \end{macrocode} % % -% +% \begin{macrocode} +\cs_new:Npn \@@_cartesian_path: { \@@_cartesian_path:n { 0 pt } } +% \end{macrocode} +% % \bigskip % The following command uses two implicit arguments : |\l_@@_rows_tl| and % |\l_@@_cols_tl| which are specifications for a set of rows and a set of % columns. It creates a path but does \emph{not} fill it. It must be filled by -% another command after. +% another command after. The argument is the radius of the corners. % \begin{macrocode} -\cs_new_protected:Npn \@@_cartesian_path: +\cs_new_protected:Npn \@@_cartesian_path:n #1 { % \end{macrocode} % We begin the loop over the columns. @@ -11582,6 +11978,13 @@ version 2005/12/01 or later. { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } } \int_compare:nNnT \l_tmpb_tl > \c@jCol { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } } +% \end{macrocode} +% If we decide to provide the commands |\cellcolor|, |\rectanglecolor|, +% |\rowcolor|, |\columncolor|, |\rowcolors| and |\chessboardcolors| available in +% the |code-before| of a |\SubMatrix|, we will have to modify the following +% line, by adding a kind of offset. We will have also some other rows below in +% the same command |\@@_cartesian_path:|. +% \begin{macrocode} \@@_qpoint:n { col - \l_tmpa_tl } \int_compare:nNnTF \l_@@_first_col_int = \l_tmpa_tl { \dim_set:Nn \l_tmpc_dim { \pgf@x - 0.5 \arrayrulewidth } } @@ -11589,7 +11992,7 @@ version 2005/12/01 or later. \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl } \dim_set:Nn \l_tmpa_dim { \pgf@x + 0.5 \arrayrulewidth } % \end{macrocode} -% We begin the loop over the rows +% We begin the loop over the rows. % \begin{macrocode} \clist_map_inline:Nn \l_@@_rows_tl { @@ -11609,6 +12012,7 @@ version 2005/12/01 or later. \dim_set:Nn \l_tmpb_dim { \pgf@y + 0.5 \arrayrulewidth } \@@_qpoint:n { row - \l_tmpa_tl } \dim_set:Nn \l_tmpd_dim { \pgf@y + 0.5 \arrayrulewidth } + \pgfsetcornersarced { \pgfpoint { #1 } { #1 } } \pgfpathrectanglecorners { \pgfpoint \l_tmpc_dim \l_tmpd_dim } { \pgfpoint \l_tmpa_dim \l_tmpb_dim } @@ -11625,7 +12029,15 @@ version 2005/12/01 or later. \NewDocumentCommand \@@_cellcolor_tabular { O { } m } { \tl_gput_right:Nx \g_nicematrix_code_before_tl - { \cellcolor [ #1 ] { #2 } { \int_use:N \c@iRow - \int_use:N \c@jCol } } + { +% \end{macrocode} +% We must not expand the color (|#2|) because the color may contain the token +% |!| which may be activated by some packages (ex.: \pkg{babel} with the option +% |french| on latex and pdflatex). +% \begin{macrocode} + \cellcolor [ #1 ] { \exp_not:n { #2 } } + { \int_use:N \c@iRow - \int_use:N \c@jCol } + } } % \end{macrocode} % @@ -11637,7 +12049,7 @@ version 2005/12/01 or later. { \tl_gput_right:Nx \g_nicematrix_code_before_tl { - \exp_not:N \rectanglecolor [ #1 ] { #2 } + \exp_not:N \rectanglecolor [ #1 ] { \exp_not:n { #2 } } { \int_use:N \c@iRow - \int_use:N \c@jCol } { \int_use:N \c@iRow - \exp_not:n { \int_use:N \c@jCol } } } @@ -11655,7 +12067,10 @@ version 2005/12/01 or later. % columns drawn before the specifications of color for the rows (and the cells). % \begin{macrocode} \tl_gput_left:Nx \g_nicematrix_code_before_tl - { \exp_not:N \columncolor [ #1 ] { #2 } { \int_use:N \c@jCol } } + { + \exp_not:N \columncolor [ #1 ] + { \exp_not:n { #2 } } { \int_use:N \c@jCol } + } } } % \end{macrocode} @@ -11858,7 +12273,7 @@ version 2005/12/01 or later. \pgfpathrectanglecorners { \pgfpoint \l_tmpb_dim \l_tmpa_dim } { \pgfpoint \l_tmpd_dim \l_tmpc_dim } - \pgfusepathqfill + \pgfusepath { fill } \group_end: } \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } @@ -11897,7 +12312,11 @@ version 2005/12/01 or later. \int_step_inline:nnn { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } - { \@@_vline:nn { ##1 } 1 } + { + \tl_if_eq:NnF \l_@@_vlines_clist { all } + { \clist_if_in:NnT \l_@@_vlines_clist { ##1 } } + { \@@_vline:nn { ##1 } 1 } + } } % \end{macrocode} % @@ -12067,7 +12486,11 @@ version 2005/12/01 or later. \int_step_inline:nnn { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow } - { \@@_hline:nn { ##1 } 1 } + { + \tl_if_eq:NnF \l_@@_hlines_clist { all } + { \clist_if_in:NnT \l_@@_hlines_clist { ##1 } } + { \@@_hline:nn { ##1 } 1 } + } } % \end{macrocode} % @@ -13016,12 +13439,8 @@ version 2005/12/01 or later. r .value_forbidden:n = true , c .code:n = \tl_set:Nn \l_@@_pos_of_block_tl c , c .value_forbidden:n = true , -% \end{macrocode} -% The two following lines will be uncommented when we will give to the key -% |color| its new definition. -% \begin{macrocode} - % color .tl_set:N = \l_@@_color_tl , - % color .value_required:n = true , + color .tl_set:N = \l_@@_color_tl , + color .value_required:n = true , } % \end{macrocode} % @@ -13068,7 +13487,8 @@ version 2005/12/01 or later. % argument of |\Block| (which is of the syntax $i$|-|$j$). However, the user is % allowed to omit $i$ or $j$ (or both). We detect that situation by replacing a % missing value by 100 (it's a convention: when the block will actually be drawn -% these values will be detected and interpreted as \emph{maximal possible value}). +% these values will be detected and interpreted as \emph{maximal possible +% value} according to the actual size of the array). % \begin{macrocode} \bool_lazy_or:nnTF { \tl_if_blank_p:n { #1 } } @@ -13096,7 +13516,6 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_set_known:nn { NiceMatrix / Block / FirstPass } { #3 } % \end{macrocode} -% % % \begin{macrocode} \tl_set:Nx \l_tmpa_tl @@ -13332,15 +13751,9 @@ version 2005/12/01 or later. fill .value_required:n = true , draw .tl_set:N = \l_@@_draw_tl , draw .default:n = default , -% \end{macrocode} -% The following definition for the key |color| will be deleted when we will give -% to the key |color| of the command |\Block| its new definition. It will be -% replaced by the line which is commented. -% \begin{macrocode} - color .code:n = - \@@_fatal:n { Key~color~for~Block } - \tl_set:Nn \l_@@_fill_tl { #1 } , - % color .code:n = \color { #1 } \tl_set:Nn \l_@@_draw_tl { #1 } , + rounded-corners .dim_set:N = \l_@@_rounded_corners_dim , + rounded-corners .default:n = 4 pt , + color .code:n = \color { #1 } \tl_set:Nn \l_@@_draw_tl { #1 } , color .value_required:n = true , line-width .dim_set:N = \l_@@_line_width_dim , line-width .value_required:n = true , @@ -13453,10 +13866,11 @@ version 2005/12/01 or later. { \tl_gput_right:Nx \g_nicematrix_code_before_tl { - \exp_not:N \rectanglecolor + \exp_not:N \roundedrectanglecolor { \exp_not:V \l_@@_fill_tl } { #1 - #2 } { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int } + { \dim_use:N \l_@@_rounded_corners_dim } } } % \end{macrocode} @@ -13479,7 +13893,7 @@ version 2005/12/01 or later. % % \medskip % \begin{macrocode} - \hbox_set:Nn \l_@@_cell_box { #6 } + \hbox_set:Nn \l_@@_cell_box { \set@color #6 } \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box: % \end{macrocode} % @@ -13738,7 +14152,7 @@ version 2005/12/01 or later. % % % \bigskip % The first argument of |\@@_stroke_block:nnn| is a list of options for the -% rectangle that you will stoke. The second argument is the upper-left cell of +% rectangle that you will stroke. The second argument is the upper-left cell of % the block (with, as usual, the syntex $i$|-|$j$) and the third is the last % cell of the block (with the same syntax). % \begin{macrocode} @@ -13759,8 +14173,14 @@ version 2005/12/01 or later. % \begin{macrocode} \str_if_eq:VnTF \l_@@_draw_tl { default } { \CT@arc@ } - { \pgfsetstrokecolor { \l_@@_draw_tl } } + { \exp_args:NV \pgfsetstrokecolor \l_@@_draw_tl } } + \pgfsetcornersarced + { + \pgfpoint + { \dim_use:N \l_@@_rounded_corners_dim } + { \dim_use:N \l_@@_rounded_corners_dim } + } \@@_cut_on_hyphen:w #2 \q_stop \bool_lazy_and:nnT { \int_compare_p:n { \l_tmpa_tl <= \c@iRow } } @@ -13783,7 +14203,10 @@ version 2005/12/01 or later. { \pgfpoint \l_tmpc_dim \l_tmpb_dim } { \pgfpoint \l_tmpd_dim \l_tmpa_dim } \pgfsetlinewidth { 1.1 \l_@@_line_width_dim } - \pgfusepathqstroke +% \end{macrocode} +% We can't use |\pgfusepathqtroke| because of the key |rounded-corners|. +% \begin{macrocode} + \pgfusepath { stroke } } \endpgfpicture \group_end: @@ -13798,10 +14221,12 @@ version 2005/12/01 or later. % We will uncomment the following line when we will give to the key |color| of % the command |\Block| its new definition. % \begin{macrocode} - % color .tl_set:N = \l_@@_draw_tl , + color .tl_set:N = \l_@@_draw_tl , draw .tl_set:N = \l_@@_draw_tl , draw .default:n = default , line-width .dim_set:N = \l_@@_line_width_dim , + rounded-corners .dim_set:N = \l_@@_rounded_corners_dim , + rounded-corners .default:n = 4 pt } % \end{macrocode} % @@ -14228,10 +14653,12 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / SubMatrix } { - hlines .clist_set:N = \l_@@_submatrix_hlines_clist , + hlines .clist_set:N = \l_@@_hlines_clist , hlines .default:n = all , - vlines .clist_set:N = \l_@@_submatrix_vlines_clist , + vlines .clist_set:N = \l_@@_vlines_clist , vlines .default:n = all , + hvlines .meta:n = { hlines, vlines } , + hvlines .value_forbidden:n = true , name .code:n = \tl_if_empty:nTF { #1 } { \@@_error:n { Invalid~name~format } } @@ -14249,14 +14676,33 @@ version 2005/12/01 or later. } , rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , rules .value_required:n = true , + code .tl_set:N = \l_@@_code_tl , + code .value_required:n = true , name .value_required:n = true , unknown .code:n = \@@_error:n { Unknown~key~for~SubMatrix } } % \end{macrocode} % % \bigskip -% In the |code-after|, the following command |\@@_SubMatrix| will be linked to -% |\SubMatrix|. +% \begin{macrocode} +\NewDocumentCommand \@@_SubMatrix_in_code_before { m m m m ! O { } } + { + \@@_cut_on_hyphen:w #3 \q_stop + \tl_clear_new:N \l_tmpc_tl + \tl_clear_new:N \l_tmpd_tl + \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl + \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl + \@@_cut_on_hyphen:w #2 \q_stop + \seq_gput_right:Nx \g_@@_submatrix_seq + { { \l_tmpa_tl } { \l_tmpb_tl } { \l_tmpc_tl } { \l_tmpd_tl } } + \tl_gput_right:Nn \g_@@_internal_code_after_tl + { \SubMatrix { #1 } { #2 } { #3 } { #4 } [ #5 ] } + } +% \end{macrocode} +% +% \bigskip +% In the internal |code-after| and in the |\CodeAfter| the following command +% |\@@_SubMatrix| will be linked to |\SubMatrix|. % \begin{itemize} % \item |#1| is the left delimiter; % \item |#2| is the upper-left cell of the matrix with the format $i$-$j$; @@ -14265,26 +14711,35 @@ version 2005/12/01 or later. % \item |#5| is the list of options of the command. % \end{itemize} % \begin{macrocode} -\NewDocumentCommand \@@_SubMatrix { m m m m ! O { } } +\NewDocumentCommand \@@_SubMatrix { m m m m O { } } { \group_begin: % \end{macrocode} +% The four following token lists correspond to the position of the |\SubMatrix|. +% \begin{macrocode} + \tl_clear_new:N \l_@@_first_i_tl + \tl_clear_new:N \l_@@_first_j_tl + \tl_clear_new:N \l_@@_last_i_tl + \tl_clear_new:N \l_@@_last_j_tl +% \end{macrocode} % The command |\@@_cut_on_hyphen:w| cuts on the hyphen an argument of the form % $i$-$j$. The value of $i$ is stored in |\l_tmpa_tl| and the value of $j$ is % stored in |\l_tmpb_tl|. % \begin{macrocode} - \@@_cut_on_hyphen:w #3 \q_stop - \tl_clear_new:N \l_tmpc_tl - \tl_clear_new:N \l_tmpd_tl - \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl - \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl \@@_cut_on_hyphen:w #2 \q_stop + \tl_set_eq:NN \l_@@_first_i_tl \l_tmpa_tl + \tl_set_eq:NN \l_@@_first_j_tl \l_tmpb_tl + \@@_cut_on_hyphen:w #3 \q_stop + \tl_set_eq:NN \l_@@_last_i_tl \l_tmpa_tl + \tl_set_eq:NN \l_@@_last_j_tl \l_tmpb_tl \bool_lazy_or:nnTF - { \int_compare_p:nNn \l_tmpc_tl > \g_@@_row_total_int } - { \int_compare_p:nNn \l_tmpd_tl > \g_@@_col_total_int } + { \int_compare_p:nNn \l_@@_last_i_tl > \g_@@_row_total_int } + { \int_compare_p:nNn \l_@@_last_j_tl > \g_@@_col_total_int } { \@@_error:n { SubMatrix~too~large } } { \str_clear_new:N \l_@@_submatrix_name_str + \clist_clear:N \l_@@_hlines_clist + \clist_clear:N \l_@@_vlines_clist \keys_set:nn { NiceMatrix / SubMatrix } { #5 } \pgfpicture \pgfrememberpicturepositiononpagetrue @@ -14296,43 +14751,43 @@ version 2005/12/01 or later. % The last value of |\int_step_inline:nnn| is provided by currifycation. % \begin{macrocode} \bool_if:NTF \l_@@_submatrix_slim_bool - { \int_step_inline:nnn \l_tmpa_tl \l_tmpc_tl } + { \int_step_inline:nnn \l_@@_first_i_tl \l_@@_last_i_tl } { \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int } { \cs_if_exist:cT - { pgf @ sh @ ns @ \@@_env: - ##1 - \l_tmpb_tl } + { pgf @ sh @ ns @ \@@_env: - ##1 - \l_@@_first_j_tl } { - \pgfpointanchor { \@@_env: - ##1 - \l_tmpb_tl } { west } + \pgfpointanchor { \@@_env: - ##1 - \l_@@_first_j_tl } { west } \dim_set:Nn \l_@@_x_initial_dim { \dim_min:nn \l_@@_x_initial_dim \pgf@x } } \cs_if_exist:cT - { pgf @ sh @ ns @ \@@_env: - ##1 - \l_tmpd_tl } + { pgf @ sh @ ns @ \@@_env: - ##1 - \l_@@_last_j_tl } { - \pgfpointanchor { \@@_env: - ##1 - \l_tmpd_tl } { east } + \pgfpointanchor { \@@_env: - ##1 - \l_@@_last_j_tl } { east } \dim_set:Nn \l_@@_x_final_dim { \dim_max:nn \l_@@_x_final_dim \pgf@x } } } - \@@_qpoint:n { row - \l_tmpa_tl - base } + \@@_qpoint:n { row - \l_@@_first_i_tl - base } \dim_set:Nn \l_@@_y_initial_dim { \pgf@y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch } - \@@_qpoint:n { row - \l_tmpc_tl - base } + \@@_qpoint:n { row - \l_@@_last_i_tl - base } \dim_set:Nn \l_@@_y_final_dim { \pgf@y - ( \box_dp:N \strutbox ) * \arraystretch } \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int { \cs_if_exist:cT - { pgf @ sh @ ns @ \@@_env: - \l_tmpa_tl - ##1 } + { pgf @ sh @ ns @ \@@_env: - \l_@@_first_i_tl - ##1 } { - \pgfpointanchor { \@@_env: - \l_tmpa_tl - ##1 } { north } + \pgfpointanchor { \@@_env: - \l_@@_first_i_tl - ##1 } { north } \dim_set:Nn \l_@@_y_initial_dim { \dim_max:nn \l_@@_y_initial_dim \pgf@y } } \cs_if_exist:cT - { pgf @ sh @ ns @ \@@_env: - \l_tmpc_tl - ##1 } + { pgf @ sh @ ns @ \@@_env: - \l_@@_last_i_tl - ##1 } { - \pgfpointanchor { \@@_env: - \l_tmpc_tl - ##1 } { south } + \pgfpointanchor { \@@_env: - \l_@@_last_i_tl - ##1 } { south } \dim_set:Nn \l_@@_y_final_dim { \dim_min:nn \l_@@_y_final_dim \pgf@y } } @@ -14360,9 +14815,10 @@ version 2005/12/01 or later. % \begin{macrocode} \seq_map_inline:Nn \g_@@_cols_vlism_seq { - \int_compare:nNnT \l_tmpb_tl < { ##1 } + \int_compare:nNnT \l_@@_first_j_tl < { ##1 } { - \int_compare:nNnT { ##1 } < { \int_eval:n { \l_tmpd_tl + 1 } } + \int_compare:nNnT + { ##1 } < { \int_eval:n { \l_@@_last_j_tl + 1 } } { % \end{macrocode} % First, we extract the value of the abscissa of the rule we have to draw. @@ -14381,15 +14837,17 @@ version 2005/12/01 or later. % The last argument of |\int_step_inline:nn| or |\clist_map_inline:Nn| is given % by curryfication. % \begin{macrocode} - \tl_if_eq:NnTF \l_@@_submatrix_vlines_clist { all } - { \int_step_inline:nn { \l_tmpd_tl - \l_tmpb_tl } } - { \clist_map_inline:Nn \l_@@_submatrix_vlines_clist } + \tl_if_eq:NnTF \l_@@_vlines_clist { all } + { \int_step_inline:nn { \l_@@_last_j_tl - \l_@@_first_j_tl } } + { \clist_map_inline:Nn \l_@@_vlines_clist } { \bool_lazy_and:nnTF { \int_compare_p:nNn { ##1 } > 0 } - { \int_compare_p:nNn { ##1 } < { \l_tmpd_tl - \l_tmpb_tl + 1 } } + { + \int_compare_p:nNn + { ##1 } < { \l_@@_last_j_tl - \l_@@_first_j_tl + 1 } } { - \@@_qpoint:n { col - \int_eval:n { ##1 + \l_tmpb_tl } } + \@@_qpoint:n { col - \int_eval:n { ##1 + \l_@@_first_j_tl } } \pgfpathmoveto { \pgfpoint \pgf@x \l_@@_y_initial_dim } \pgfpathlineto { \pgfpoint \pgf@x \l_@@_y_final_dim } \pgfusepathqstroke @@ -14404,15 +14862,17 @@ version 2005/12/01 or later. % The last argument of |\int_step_inline:nn| or |\clist_map_inline:Nn| is given % by curryfication. % \begin{macrocode} - \tl_if_eq:NnTF \l_@@_submatrix_hlines_clist { all } - { \int_step_inline:nn { \l_tmpc_tl - \l_tmpa_tl } } - { \clist_map_inline:Nn \l_@@_submatrix_hlines_clist } + \tl_if_eq:NnTF \l_@@_hlines_clist { all } + { \int_step_inline:nn { \l_@@_last_i_tl - \l_@@_first_i_tl } } + { \clist_map_inline:Nn \l_@@_hlines_clist } { \bool_lazy_and:nnTF { \int_compare_p:nNn { ##1 } > 0 } - { \int_compare_p:nNn { ##1 } < { \l_tmpc_tl - \l_tmpa_tl + 1 } } + { + \int_compare_p:nNn + { ##1 } < { \l_@@_last_i_tl - \l_@@_first_i_tl + 1 } } { - \@@_qpoint:n { row - \int_eval:n { ##1 + \l_tmpa_tl } } + \@@_qpoint:n { row - \int_eval:n { ##1 + \l_@@_first_i_tl } } % \end{macrocode} % We use a group to protect |\l_tmpa_dim| and |\l_tmpb_dim|. % \begin{macrocode} @@ -14495,11 +14955,121 @@ version 2005/12/01 or later. \@@_node_right:nn #4 { \@@_env: - \l_@@_submatrix_name_str - right } } \endpgfpicture +% \end{macrocode} +% +% \begin{macrocode} + \cs_set_eq:NN \pgfpointanchor \@@_pgfpointanchor:n + \flag_clear_new:n { nicematrix } + \l_@@_code_tl } \group_end: } % \end{macrocode} +% The group was a group for the whole |\SubMatrix|. +% +% \bigskip +% In the key |code| of the command |\SubMatrix| there may be Tikz instructions. +% We want that, in these instructions, the $i$ and $j$ in specifications of +% nodes of the forms $i$|-|$j$, |row-|$i$, |col-|$j$ and $i$\verb+-|+$j$ refer +% to the number of row and columm \emph{relative} of the current |\SubMatrix|. +% That's why we will patch (locally in the |\SubMatrix|) the command +% |\pgfpointanchor|. +% \begin{macrocode} +\cs_set_eq:NN \@@_old_pgfpointanchor \pgfpointanchor +% \end{macrocode} +% +% \bigskip +% The following command will be linked to |\pgfpointanchor| just before the +% execution of the option |code| of the command |\SubMatrix|. In this command, +% we catch the argument |#1| of |\pgfpointanchor| and we apply to it the command +% |\@@_pgfpointanchor_i:nn| before passing it to the original |\pgfpointanchor|. +% We have to act in an expandable way because the command |\pgfpointanchor| is +% used in names of Tikz nodes which are computed in an expandable way. +% \begin{macrocode} +\cs_new_protected:Npn \@@_pgfpointanchor:n #1 + { + \use:e + { \exp_not:N \@@_old_pgfpointanchor { \@@_pgfpointanchor_i:nn #1 } } + } +% \end{macrocode} +% +% \bigskip +% In fact, the argument of |\pgfpointanchor| is always of the form +% |\a_command { name_of_node }| where ``|name_of_node|'' is the name of the Tikz +% node without the potential prefix and suffix. That's why we catch two +% arguments and work only on the second by trying (first) to extract an hyphen |-|. +% \begin{macrocode} +\cs_new:Npn \@@_pgfpointanchor_i:nn #1 #2 + { #1 { \@@_pgfpointanchor_ii:w #2 - \q_stop } } +% \end{macrocode} +% +% \bigskip +% Since |\seq_if_in:NnTF| and |\clist_if_in:NnTF| are not expandable, we will +% use the following token list and |\str_case:nVTF| to test whether we have an +% integer or not. +% \begin{macrocode} +\tl_const:Nn \c_@@_integers_alist_tl + { + { 1 } { } { 2 } { } { 3 } { } { 4 } { } { 5 } { } + { 6 } { } { 7 } { } { 8 } { } { 9 } { } { 10 } { } + { 11 } { } { 12 } { } { 13 } { } { 14 } { } { 15 } { } + { 16 } { } { 17 } { } { 18 } { } { 19 } { } { 20 } { } + } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} +\cs_new:Npn \@@_pgfpointanchor_ii:w #1-#2\q_stop + { +% \end{macrocode} +% If there is no hyphen, that means that the node is of the form of a single +% number (ex.: |5| or |11|). In that case, we are in an analysis which result +% from a specification of node of the form $i$\verb+-|+$j$. In that case, the +% $i$ of the number of row arrives first (and alone) in a |\pgfpointanchor| and, +% the, the $j$ arrives (alone) in the following |\pgfpointanchor|. In order to +% know whether we have a number of row of a number of column, we keep track of +% the number of such treatments by the expandable flag called |nicematrix|. +% \begin{macrocode} + \tl_if_empty:nTF { #2 } + { + \str_case:nVTF { #1 } \c_@@_integers_alist_tl + { + \flag_raise:n { nicematrix } + \int_if_even:nTF { \flag_height:n { nicematrix } } + { \int_eval:n { #1 + \l_@@_first_i_tl - 1 } } + { \int_eval:n { #1 + \l_@@_first_j_tl - 1 } } + } + { #1 } + } +% \end{macrocode} +% If there is an hyphen, we have to see whether we have a node of the form +% $i$|-|$j$, |row-|$i$ or |col-|$j$. +% \begin{macrocode} + { \@@_pgfpointanchor_iii:w { #1 } #2 } + } +% \end{macrocode} % +% \bigskip +% There was an hyphen in the name of the node and that's why we have to retrieve +% the extra hyphen we have put (cf. |\@@_pgfpointanchor_i:nn|). +% \begin{macrocode} +\cs_new:Npn \@@_pgfpointanchor_iii:w #1 #2 - + { + \str_case:nnF { #1 } + { + { row } { row - \int_eval:n { #2 + \l_@@_first_i_tl - 1 } } + { col } { col - \int_eval:n { #2 + \l_@@_first_j_tl - 1 } } + } +% \end{macrocode} +% Now the case of a node of the form $i$|-|$j$. +% \begin{macrocode} + { + \int_eval:n { #1 + \l_@@_first_i_tl - 1 } + - \int_eval:n { #2 + \l_@@_first_j_tl - 1 } + } + } +% \end{macrocode} +% % \medskip % The command |\@@_node_left:nn| puts the left delimiter with the correct size. % The argument |#1| is the delimiter to put. The argument |#2| is the name we @@ -14868,15 +15438,6 @@ version 2005/12/01 or later. } % \end{macrocode} % -% \begin{macrocode} -\@@_msg_new:nn { Key~color~for~Block } - { - The~key~'color'~for~the~command~\token_to_str:N \Block\ - is~deprecated:~you~should~use~'fill'~instead.\\ - This~error~is~fatal. - - } -% \end{macrocode} % % \begin{macrocode} \@@_msg_new:nn { ampersand~in~light-syntax } @@ -14988,6 +15549,16 @@ version 2005/12/01 or later. \seq_use:Nnnn \g_@@_submatrix_names_seq { ~and~ } { ,~ } { ~and~ }. } % \end{macrocode} +% +% \begin{macrocode} +\@@_msg_new:nn { r~or~l~with~preamble } + { + You~can't~use~the~key~'\l_keys_key_str'~in~your~\@@_full_name_env:.~ + You~must~specify~the~alignment~of~your~columns~with~the~preamble~of~ + your~\@@_full_name_env:.\\ + If~you~go~on,~this~key~will~be~ignored. + } +% \end{macrocode} % % \begin{macrocode} \@@_msg_new:nn { Hdotsfor~in~col~0 } @@ -15131,8 +15702,8 @@ version 2005/12/01 or later. For~a~list~of~the~available~keys,~type~H~. } { - The~available~keys~are~(in~alphabetic~order):~-,~c,~draw,~fill,~l,~ - line-width~and~r. + The~available~keys~are~(in~alphabetic~order):~c,~draw,~fill,~l,~ + line-width,~rounded-corners~and~r. } % \end{macrocode} % @@ -15167,12 +15738,13 @@ version 2005/12/01 or later. 'delimiters/color',~ 'extra-height',~ 'hlines',~ + 'hvlines',~ 'left-xshift',~ 'name',~ 'right-xshift',~ 'rules'~(with~the~subkeys~'color'~and~'width'),~ 'slim',~ - 'vlines'~and~'xshift'~(which~set~both~'left-xshift'~ + 'vlines'~and~'xshift'~(which~sets~both~'left-xshift'~ and~'right-xshift').\\ } % \end{macrocode} @@ -15862,9 +16434,21 @@ version 2005/12/01 or later. % \subsection*{Changes between versions 5.10 and 5.11} % % It's now possible, in the |code-before| and in the |\CodeAfter|, to use the -% syntax \verb+|(i-|j)+ for the Tikz node at the intersection of the (potential) +% syntax \verb+(i-|j)+ for the Tikz node at the intersection of the (potential) % horizontal rule number~$i$ and the (potential) vertical rule number~$j$. % +% % \subsection*{Changes between versions 5.11 and 5.12} +% +% Keywords |\CodeBefore| and |\Body| (alternative syntax to the key +% |code-before|). +% +% New key |delimiters/max-width|. +% +% New keys |hlines|, |vlines| and |hvlines| for the command |\SubMatrix| in the +% |\CodeAfter|. +% +% New key |rounded-corners| for the command |\Block|. +% % \PrintIndex % % \tableofcontents diff --git a/macros/latex/contrib/nicematrix/nicematrix.pdf b/macros/latex/contrib/nicematrix/nicematrix.pdf index a8e3ae524e..18b9e7af32 100644 Binary files a/macros/latex/contrib/nicematrix/nicematrix.pdf and b/macros/latex/contrib/nicematrix/nicematrix.pdf differ -- cgit v1.2.3