texlive[56008] Master/texmf-dist: nicematrix (31jul20)

commits+karl at tug.org commits+karl at tug.org
Fri Jul 31 23:45:27 CEST 2020


Revision: 56008
          http://tug.org/svn/texlive?view=revision&revision=56008
Author:   karl
Date:     2020-07-31 23:45:27 +0200 (Fri, 31 Jul 2020)
Log Message:
-----------
nicematrix (31jul20)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.pdf
    trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex
    trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf
    trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
    trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty

Modified: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2020-07-31 21:45:10 UTC (rev 56007)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2020-07-31 21:45:27 UTC (rev 56008)
@@ -146,7 +146,7 @@
 \bigskip
 {\bfseries \color{red} Important
 
-Dans cette version 5.0 de \pkg{nicematrix}, on doit utiliser les lettres |l|, |c| et
+Depuis la version 5.0 de \pkg{nicematrix}, on doit utiliser les lettres |l|, |c| et
 |r| dans les préambules des environnements et non plus les lettres |L|, |C| et
 |R|.
 
@@ -168,37 +168,36 @@
 \begin{ttfamily}
 \setlength{\tabcolsep}{3mm}
 \begin{tabular}{llll}
-\{NiceTabular\} & \{NiceArray\}  & \{NiceMatrix\}   \\
-              & \{pNiceArray\} & \{pNiceMatrix\}  \\
-              & \{bNiceArray\} & \{bNiceMatrix\}  \\
-              & \{BNiceArray\} & \{BNiceMatrix\}  \\
-              & \{vNiceArray\} & \{vNiceMatrix\}  \\
-              & \{VNiceArray\} & \{VNiceMatrix\}  
+\{NiceTabular\}  & \{NiceArray\}  & \{NiceMatrix\}   \\
+\{NiceTabular*\} & \{pNiceArray\} & \{pNiceMatrix\}  \\
+               & \{bNiceArray\} & \{bNiceMatrix\}  \\
+               & \{BNiceArray\} & \{BNiceMatrix\}  \\
+               & \{vNiceArray\} & \{vNiceMatrix\}  \\
+               & \{VNiceArray\} & \{VNiceMatrix\}  
 \end{tabular}
 \end{ttfamily}
 
 
 \medskip
-Les environnements |{NiceArray}| et |{NiceTabular}| sont similaires aux environnements |{array}| et |{tabular}| de
+Les environnements |{NiceArray}|, |{NiceTabular}| et |{NiceTabular*}| sont
+similaires aux environnements |{array}|, |{tabular}| et |{tabular*}| de
 l'extension \pkg{array} (qui est chargée par \pkg{nicematrix}).
 
 \medskip
-Néanmoins, dans |{NiceArray}| (et ses variantes), les colonnes de type |w| (ex. : |wc{1cm}|) sont composées en mode
-mathématique alors que dans |{array}| de \pkg{array}, elles sont composées en
-mode texte.
+Les environnements |{pNiceArray}|, |{bNiceArray}|, etc. n'ont pas d'équivalents
+dans \pkg{array}.
 
 \medskip
-Les environnements |{pNiceArray}|, |{bNiceArray}|, etc. n'ont pas d'équivalents dans \pkg{array}.
+Les environnements |{NiceMatrix}|, |{pNiceMatrix}|, etc. sont similaires aux
+environnements correspondants de l'\pkg{amsmath} (qui est chargée par
+\pkg{nicematrix}) : |{matrix}|, |{pmatrix}|, etc.
 
 \medskip
-Les environnements |{NiceMatrix}|, |{pNiceMatrix}|, etc. sont similaires aux environnements correspondants de
-l'\pkg{amsmath} (qui est chargée par \pkg{nicematrix}) : |{matrix}|, |{pmatrix}|, etc.
+Tous les environnements de l'extension \pkg{nicematrix} acceptent, entre
+crochets, une liste optionnelle de paires de la forme \textsl{clé=valeur}.
+{\bfseries Il doit n'y avoir aucun espace devant le crochet ouvrant (|[|) de
+  cette liste d'options.}
 
-\medskip
-Tous les environnements de l'extension \pkg{nicematrix} acceptent, entre crochets, une liste optionnelle de paires
-de la forme \textsl{clé=valeur}. {\bfseries Il doit n'y avoir aucun espace devant le crochet ouvrant (|[|) de cette
-liste d'options.}
-
 \bigskip
 \textbf{Important}
 
@@ -215,8 +214,9 @@
 
 \section{L'espace vertical entre les rangées}
 
-Il est bien connu que certaines rangées des tableaux créés par défault avec LaTeX sont trop proches l'une de
-l'autre. On en donne ci-dessous un exemple classique.
+Il est bien connu que certaines rangées des tableaux créés par défault avec
+LaTeX sont trop proches l'une de l'autre. On en donne ci-dessous un exemple
+classique.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=9cm]
@@ -231,13 +231,17 @@
 \end{pmatrix}$
 
 \bigskip
-En s'inspirant de l'extension \pkg{cellspace} qui traite de ce problème, 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}. 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} et de l'\pkg{amsmath} mais une valeur de $1$~pt serait un bon choix. On conseille de régler leurs
-valeurs avec la commande |\NiceMatrixOptions|.\footnote{On remarquera que ces paramètres s'appliquent aussi aux
-  colonnes de type |S| de \pkg{siunitx} alors que \pkg{cellspace} n'est pas utilisable avec ces colonnes.}
+En s'inspirant de l'extension \pkg{cellspace} qui traite de ce problème,
+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}. 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}
+et de l'\pkg{amsmath} mais une valeur de $1$~pt serait un bon choix. On
+conseille de régler leurs valeurs avec la commande
+|\NiceMatrixOptions|.\footnote{On remarquera que ces paramètres s'appliquent
+  aussi aux colonnes de type |S| de \pkg{siunitx} alors que \pkg{cellspace}
+  n'est pas utilisable avec ces colonnes.}
 
 \medskip
 \begin{Verbatim}
@@ -265,9 +269,10 @@
 \bigskip
 \section{La clé baseline}
 
-L'extension \pkg{nicematrix} propose une option |baseline| pour la position verticale des tableaux. Cette
-option |baseline| prend comme valeur un entier qui indique le numéro de rangée dont la ligne de base servira de
-ligne de base pour le tableau.
+L'extension \pkg{nicematrix} propose une option |baseline| pour la position
+verticale des tableaux. Cette option |baseline| prend comme valeur un entier qui
+indique le numéro de rangée dont la ligne de base servira de ligne de base pour
+le tableau.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=9cm]
@@ -284,17 +289,18 @@
 \end{pNiceMatrix}$
 
 
-\interitem
-L'option |baseline| peut aussi prendre les trois valeurs spéciales |t|, |c| et |b|. Ces trois lettres peuvent aussi
-être utilisées de manière absolue comme pour l'option des environnements |{tabular}| et |{array}| de \pkg{array}.
-La valeur initiale de |baseline| est~|c|.
+\interitem L'option |baseline| peut aussi prendre les trois valeurs spéciales
+|t|, |c| et |b|. Ces trois lettres peuvent aussi être utilisées de manière
+absolue comme pour l'option des environnements |{tabular}| et |{array}| de
+\pkg{array}. La valeur initiale de |baseline| est~|c|.
 
 
 \bigskip
-Dans l'exemple suivant, on utilise l'option |t| (synonyme de |baseline=t|) immédiatement après un |\item| de liste.
-On remarquera que la présence d'un |\hline| initial n'empêche pas l'alignement sur la ligne de base de la première
-rangée (avec |{tabular}| ou |{array}| de \pkg{array}, il faut utiliser |\firsthline|\footnote{On peut aussi utiliser |\firsthline|
-  dans les environnements de \pkg{nicematrix}.}).
+Dans l'exemple suivant, on utilise l'option |t| (synonyme de |baseline=t|)
+immédiatement après un |\item| de liste. On remarquera que la présence d'un
+|\hline| initial n'empêche pas l'alignement sur la ligne de base de la première
+rangée (avec |{tabular}| ou |{array}| de \pkg{array}, il faut utiliser
+|\firsthline|.
 
 \smallskip
 \begin{BVerbatim}[baseline=c,boxwidth=9cm]
@@ -365,15 +371,17 @@
 \section{Les blocs}
 
 \label{Block}
-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| ne crée pas d'espace par elle-même.
+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| ne crée pas d'espace par elle-même.
 
-La commande |\Block| doit être utilisée dans la case supérieure gauche du bloc avec deux arguments. Le premier
-argument est la taille de ce bloc avec la syntaxe $i$-$j$ où $i$ est le nombre de rangées et $j$ le nombre de
-colonnes du bloc. Le deuxième argument, est, sans surprise, le contenu du bloc.
+La commande |\Block| doit être utilisée dans la case supérieure gauche du bloc
+avec deux arguments. Le premier argument est la taille de ce bloc avec la
+syntaxe $i$-$j$ où $i$ est le nombre de rangées et $j$ le nombre de colonnes du
+bloc. Le deuxième argument, est, sans surprise, le contenu du bloc.
 
-Dans |{NiceTabular}|, le contenu est composé en mode texte. Dans les autres environnements, il est composé en mode
-mathématique. 
+Dans |{NiceTabular}|, le contenu est composé en mode texte. Dans les autres
+environnements, il est composé en mode mathématique.
 
 \medskip
 \begin{BVerbatim}
@@ -397,10 +405,10 @@
 \end{center}
 
 
-\interitem
-On remarquera que le centrage horizontal du contenu des blocs est correct même si un espacement des colonnes a été
-demandé par une instruction comme |!{\qquad}| dans le préambule (ce n'est pas le cas avec |\multicolumn|). Dans
-l'exemple suivant, l'en-tête «Premier groupe» est correctement centré.
+\interitem On remarquera que le centrage horizontal du contenu des blocs est
+correct même si un espacement des colonnes a été demandé par une instruction
+comme |!{\qquad}| dans le préambule (ce n'est pas le cas avec |\multicolumn|).
+Dans l'exemple suivant, l'en-tête «Premier groupe» est correctement centré.
 
 \medskip
 \begin{center}
@@ -458,10 +466,11 @@
 \end{bNiceArray}$
 
 \bigskip
-On peut souhaiter agrandir la taille du «$A$» placé dans le bloc de l'exemple précédent. Comme il est composé en
-mode mathématique, on ne peut pas directement utiliser une commande comme |\large|, |\Large| ou |\LARGE|. C'est
-pourquoi une option à mettre entre chevrons est proposée par |\Block| pour spécifier du code LaTeX qui sera inséré
-\emph{avant} le début du mode mathématique.
+On peut souhaiter agrandir la taille du «$A$» placé dans le bloc de l'exemple
+précédent. Comme il est composé en mode mathématique, on ne peut pas directement
+utiliser une commande comme |\large|, |\Large| ou |\LARGE|. C'est pourquoi une
+option à mettre entre chevrons est proposée par |\Block| pour spécifier du code
+LaTeX qui sera inséré \emph{avant} le début du mode mathématique.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
@@ -484,60 +493,93 @@
 
 \section{Les filets horizontaux et verticaux}
 
-Les techniques habituelles pour tracer des filets peuvent être utilisées dans les environnements de
-\pkg{nicematrix}, à l'exception de |\vline|.
+Les techniques habituelles pour tracer des filets peuvent être utilisées dans
+les environnements de \pkg{nicematrix}, à l'exception de |\vline|. Il y a
+néanmoins quelques petites différences de comportement avec les environnements
+classiques.
 
-\subsection{L'épaisseur et la couleur des filets}
 
-Les environnements de \pkg{nicematrix} proposent une clé |rules/width| pour fixer la largeur (en fait l'épaisseur)
-des filets dans l'environnement. En fait, cette clé ne fait que fixer la valeur de |\arrayrulewidth|.
+\bigskip
+\subsection{Quelques différences avec les environnements classiques}
 
-\smallskip
-On sait que \pkg{colortbl} propose la commande |\arrayrulecolor| pour spécifier la couleur de ces filets.
+\subsubsection{Les filets verticaux}
 
-\smallskip
-Avec \pkg{nicematrix}, il est possible de spécifier une couleur même si \pkg{colortbl} n'est pas chargé. Par souci
-de compatibilité, la commande est nommée également |\arrayrulecolor|. Les environnements de \pkg{nicematrix}
-proposent également une clé |rules/color| qui permet de fixer cette couleur pour l'environnement en question.
+Dans les environnements de \pkg{nicematrix}, les filets verticaux spécifiés par
+\verb+|+ dans le préambule des environnements ne sont jamais coupés, même en cas
+de ligne incomplète ou de double filet horizontal spécifié par |\hline\hline|
+(il n'y a pas besoin d'utiliser \pkg{hhline}).\footnote{Il s'agit là du comportement depuis la version 5.1 de
+  \pkg{nicematrix}. Dans les versions précédentes, le comportement était
+  le comportement par défaut de \pkg{array}.}
 
-\medskip
-\begin{scope}
-\hfuzz=10cm
-\begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-\begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
-\hline
-rose & tulipe & lys \\
-arum & iris & violette \\
-muguet & dahlia & souci \\
-\hline
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{|c|c|} \hline
+Premier & Deuxième \\ ~emphase#\hline\hline@
+Paul \\ \hline
+Marie & Pauline \\ \hline
 \end{NiceTabular}
 \end{BVerbatim}
-\begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
-\hline
-rose & tulipe & lys \\
-arum & iris & violette \\
-muguet & dahlia & souci \\
-\hline
+%
+\begin{NiceTabular}{|c|c|}[c] \hline
+Premier & Deuxième \\ \hline\hline
+Paul \\ \hline
+Marie & Pauline \\ \hline
 \end{NiceTabular}
-\end{scope}
 
-\medskip
-Si on veut définir de nouveaux spécificateurs de colonnes pour des filets (par exemple plus épais ou bien d'une
-couleur spécifique), on aura peut-être intérêt à utiliser la commande |\OnlyMainNiceMatrix| décrite p.~\pageref{OnlyMainNiceMatrix}.
 
+\bigskip
+Si vous utilisez \pkg{booktabs} (qui fournit |\toprule|, |\midrule|,
+|\bottomrule|, etc.) et que vous tenez absolument à mettre des filets verticaux
+(ce qui est contraire à l'esprit à \pkg{booktabs}), vous constaterez que les
+filets tracés par \pkg{nicematrix} sont compatibles avec \pkg{booktabs}.
 
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
+$\begin{NiceArray}{~emphase#|cccc|@} \toprule
+a & b & c & d \\ \midrule
+1 & 2 & 3 & 4 \\
+1 & 2 & 3 & 4 \\ \bottomrule
+\end{NiceArray}$
+\end{BVerbatim}
+%
+$\begin{NiceArray}{|cccc|}
+\toprule
+a & b & c & d \\
+\midrule
+1 & 2 & 3 & 4 \\
+1 & 2 & 3 & 4 \\
+\bottomrule
+\end{NiceArray}$
 
 \bigskip
-\subsection{Une remarque concernant \textbackslash cline}
+Il reste néanmoins possible de définir un spécificateur, nommé par exemple
+\verb|I|, pour tracer des filets verticaux avec le comportement standard de
+\pkg{array} :
+%
+\begin{Verbatim}
+\newcolumntype{I}{!{\vrule}}
+\end{Verbatim}
 
+En fait, en l'occurrence, il serait peut-être plus habile d'insérer
+|\OnlyMainNiceMatrix| (cf. p.~\pageref{OnlyMainNiceMatrix}) :
+\begin{Verbatim}
+\newcolumntype{I}{!{\OnlyMainNiceMatrix{\vrule}}}
+\end{Verbatim}
+
+
+
+\subsubsection{La commande  \textbackslash cline}
+
 \label{remark-cline}
 
-Les traits verticaux et horizontaux que l'on insère avec |\hline| et le spécificateur de colonne «\verb+|+» de
-\pkg{array} rendent le tableau plus large ou plus long d'une quantité égale à la largeur du trait.
+Les traits verticaux et horizontaux que l'on insère avec |\hline| et le
+spécificateur de colonne «\verb+|+» de \pkg{array} rendent le tableau plus large
+ou plus long d'une quantité égale à la largeur du trait (avec \pkg{array} et
+aussi avec \pkg{nicematrix}).
 
 \smallskip
-Pour des raisons historiques, il n'en est pas de même pour la commande |\cline|, comme on peut le voir avec
-l'exemple suivant.
+Pour des raisons historiques, il n'en est pas de même pour la commande |\cline|,
+comme on peut le voir avec l'exemple suivant.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -560,8 +602,9 @@
 \end{scope}
 
 \medskip
-Dans les environnements de \pkg{nicematrix}, cette situation est corrigée (il est néanmoins possible de revenir au
-comportement par défaut de |\cline| avec la clé |standard-cline|).
+Dans les environnements de \pkg{nicematrix}, cette situation est corrigée (il
+est néanmoins possible de revenir au comportement par défaut de |\cline| avec la
+clé |standard-cline|).
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -584,12 +627,63 @@
 \end{scope}
 
 
+
+\subsection{L'épaisseur et la couleur des filets}
+
+Les environnements de \pkg{nicematrix} proposent une clé |rules/width| pour
+fixer la largeur (en fait l'épaisseur) des filets dans l'environnement. En fait,
+cette clé ne fait que fixer la valeur de |\arrayrulewidth|.
+
+\smallskip
+On sait que \pkg{colortbl} propose la commande |\arrayrulecolor| pour spécifier
+la couleur de ces filets.
+
+\smallskip
+Avec \pkg{nicematrix}, il est possible de spécifier une couleur même si
+\pkg{colortbl} n'est pas chargé. Par souci de compatibilité, la commande est
+nommée également |\arrayrulecolor|. Les environnements de \pkg{nicematrix}
+proposent également une clé |rules/color| qui permet de fixer cette couleur pour
+l'environnement en question.
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+\begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
+\hline
+rose & tulipe & lys \\
+arum & iris & violette \\
+muguet & dahlia & souci \\
+\hline
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
+\hline
+rose & tulipe & lys \\
+arum & iris & violette \\
+muguet & dahlia & souci \\
+\hline
+\end{NiceTabular}
+\end{scope}
+
+\medskip
+Si on veut définir de nouveaux spécificateurs de colonnes pour des filets (par
+exemple plus épais ou bien d'une couleur spécifique), on aura peut-être intérêt
+à utiliser la commande |\OnlyMainNiceMatrix| décrite
+p.~\pageref{OnlyMainNiceMatrix}.
+
+
+
+
+
 \bigskip
 \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. 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).
+La clé |hlines| demande un tracé de tous les filets horizontaux et la clé
+|vlines| demande un tracé de tous les filets verticaux. 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
@@ -607,61 +701,15 @@
 \end{pNiceMatrix}$
 
 
-\bigskip
-Il y a néanmoins une différence entre l'utilisation de l'option |vlines| et du spécificateur «\verb+|+» dans le
-préambule de l'environnement : les filets tracés par |vlines| traversent les double-filets horizontaux tracés par
-|\hline\hline| (il n'y a pas besoin d'utiliser \pkg{hhline}).
 
-\medskip
-\begin{BVerbatim}[baseline=c,boxwidth=11.5cm]
-$\begin{NiceMatrix}[~emphase#vlines@] \hline
-a & b & c & d \\ \hline \hline
-1 & 2 & 3 & 4 \\
-1 & 2 & 3 & 4 \\ \hline
-\end{NiceMatrix}$
-\end{BVerbatim}
-%
-$\begin{NiceMatrix}[vlines]
-\hline
-a & b & c & d \\
-\hline \hline
-1 & 2 & 3 & 4 \\
-1 & 2 & 3 & 4 \\
-\hline
-\end{NiceMatrix}$
-
-
-\bigskip
-Si vous utilisez \pkg{booktabs} (qui fournit |\toprule|, |\midrule|, |\bottomrule|, etc.) et que vous tenez
-absolument à mettre des filets verticaux (ce qui est contraire à l'esprit à \pkg{booktabs}), sachez que la clé
-|vlines| est compatible avec \pkg{booktabs}.
-
-\medskip
-\begin{BVerbatim}[baseline=c,boxwidth=11.5cm]
-$\begin{NiceMatrix}[~emphase#vlines@] \toprule
-a & b & c & d \\ \midrule
-1 & 2 & 3 & 4 \\
-1 & 2 & 3 & 4 \\ \bottomrule
-\end{NiceMatrix}$
-\end{BVerbatim}
-%
-$\begin{NiceMatrix}[vlines]
-\toprule
-a & b & c & d \\
-\midrule
-1 & 2 & 3 & 4 \\
-1 & 2 & 3 & 4 \\
-\bottomrule
-\end{NiceMatrix}$
-
-
 \subsection{La clé hvlines}
 \label{hvlines}
 
-La clé |hvlines| demande le tracé de tous les filets horizontaux et verticaux \emph{sauf dans les
-  blocs}.\footnote{En fait, quand la clé |hvlines| (ou la clé |hvlines-except-corners| décrite juste après) est
-  utilisée, les filets ne sont pas non plus tracés dans les blocs virtuels délimités par des cases reliées par des
-  lignes pointillées (cf. p. \pageref{dotted-and-hvlines}).}
+La clé |hvlines| demande le tracé de tous les filets horizontaux et verticaux
+\emph{sauf dans les blocs}.\footnote{En fait, quand la clé |hvlines| (ou la clé
+  |hvlines-except-corners| décrite juste après) est utilisée, les filets ne sont
+  pas non plus tracés dans les blocs virtuels délimités par des cases reliées
+  par des lignes pointillées (cf. p. \pageref{dotted-and-hvlines}).}
 
 \medskip
 \begin{Verbatim}
@@ -685,8 +733,8 @@
 
 \subsection{La clé hvlines-except-corners}
 
-La clé |hvlines-except-corners| demande le tracé de tous les filets horizontaux et verticaux \emph{sauf dans les
-  blocs} et sauf dans les coins vides.
+La clé |hvlines-except-corners| demande le tracé de tous les filets horizontaux
+et verticaux \emph{sauf dans les blocs} et sauf dans les coins vides.
 
 \medskip
 \begin{Verbatim}
@@ -717,8 +765,8 @@
 \end{NiceTabular}
 \end{center}
 
-Comme on le voit, un «coin vide» est constitué de la réunion de tous les rectangles vides partant de la case située 
-exactement dans le coin.
+Comme on le voit, un «coin vide» est constitué de la réunion de tous les
+rectangles vides partant de la case située exactement dans le coin.
 
 \bigskip
 \begin{BVerbatim}[boxwidth=11cm,baseline=c]
@@ -746,8 +794,9 @@
 
 \subsection{La commande \textbackslash diagbox}
 
-La commande |\diagbox| (inspirée par l'extension \pkg{diagbox}) permet, quand elle est utilisée dans une case, de
-couper cette case selon une diagonale descendante.\footnote{L'auteur de ce document considère que ce type de
+La commande |\diagbox| (inspirée par l'extension \pkg{diagbox}) permet, quand
+elle est utilisée dans une case, de couper cette case selon une diagonale
+descendante.\footnote{L'auteur de ce document considère que ce type de
   construction est un piètre choix graphique.}
 
 \medskip
@@ -776,9 +825,10 @@
 \subsection{Filets en pointillés}
 
 
-Dans les environnements de \pkg{nicematrix}, il est possible d'utiliser la commande |\hdottedline| (fournie
-par \pkg{nicematrix}) qui est l'équivalent pour les pointillés des commandes |\hline| et |\hdashline|
-(cette dernière étant une commande de \pkg{arydshln}).
+Dans les environnements de \pkg{nicematrix}, il est possible d'utiliser la
+commande |\hdottedline| (fournie par \pkg{nicematrix}) qui est l'équivalent pour
+les pointillés des commandes |\hline| et |\hdashline| (cette dernière étant une
+commande de \pkg{arydshln}).
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
@@ -798,8 +848,9 @@
 
 
 \bigskip
-Dans les environnements avec un préambule explicite (comme |{NiceTabular}|, |{NiceArray}|, etc.), il est possible
-de dessiner un trait vertical en pointillés avec le spécificateur «|:|».
+Dans les environnements avec un préambule explicite (comme |{NiceTabular}|,
+|{NiceArray}|, etc.), il est possible de dessiner un trait vertical en
+pointillés avec le spécificateur «|:|».
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
@@ -816,15 +867,19 @@
 \end{pNiceArray}$
 
 \bigskip
-Il est possible de changer dans \pkg{nicematrix} la lettre utilisée pour indiquer dans le préambule un trait
-vertical en pointillés avec l'option |letter-for-dotted-lines| disponible dans |\NiceMatrixOptions|.
+Il est possible de changer dans \pkg{nicematrix} la lettre utilisée pour
+indiquer dans le préambule un trait vertical en pointillés avec l'option
+|letter-for-dotted-lines| disponible dans |\NiceMatrixOptions|.
 
 
 \bigskip
-\emph{Remarque} : Quand l'extension \pkg{array} (sur laquelle s'appuie \pkg{nicematrix}) est chargée, les traits
-verticaux et horizontaux que l'on insère rendent le tableau plus large ou plus long d'une quantité égale à la
-largeur du trait\footnote{En fait, cela est vrai pour |\hline| et «\verb+|+» mais pas pour |\cline|.}. Avec
-\pkg{nicematrix}, les lignes en pointillés tracées par |\hdottedline| et «|:|» ont le même effet.
+\emph{Remarque} : Quand l'extension \pkg{array} (sur laquelle s'appuie
+\pkg{nicematrix}) est chargée, les traits verticaux et horizontaux que l'on
+insère rendent le tableau plus large ou plus long d'une quantité égale à la
+largeur du trait\footnote{En fait, cela est vrai pour |\hline| et «\verb+|+»
+  mais pas pour |\cline| : cf. p.~\pageref{remark-cline}}. Avec
+\pkg{nicematrix}, les lignes en pointillés tracées par |\hdottedline| et «|:|»
+ont le même effet.
 
 
 
@@ -831,32 +886,58 @@
 
 \section{Les couleurs des rangées et des colonnes}
 
-L'extension \pkg{colortbl} permet de colorier des cases, des rangées ou des colonnes d'un tableau. Néanmoins,
-l'affichage du \textsc{pdf} résultant n'est pas toujours parfait, en particulier quand on utilise également des
-filets. Dans certains lecteurs de \textsc{pdf}, des filets verticaux semblent disparaître. De fines lignes blanches
-peuvent également apparaître.
+\subsection{Utilisation de colortbl}
 
+Rappelons que l'extension \pkg{colortbl} peut être chargée directement par
+|\usepackage{colortbl}| ou en chargeant l'extension \pkg{xcolor} avec l'option
+|table| : |\usepackage[table]{xcolor}|.
+
 \medskip
-L'extension \pkg{nicematrix} propose des outils similaires qui ne présentent pas ces inconvénients. Elle propose
-une clé |code-before|\footnote{Il existe aussi une clé |code-after| : cf. p.~\pageref{code-after}.} pour du code
-qui sera exécuté \emph{avant} le tracé du tableau. Dans ce |code-before|, de nouvelles commandes sont disponibles :
-|\cellcolor|, |\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors| et |\chessboardcolors|.
-\label{code-before}
+Comme l'extension \pkg{nicematrix} est fondée sur \pkg{array}, il est possible
+d'utiliser \pkg{colortbl} avec \pkg{nicematrix}.
 
 \medskip
-Ces outils sont indépendants de \pkg{colortbl}.\footnote{On peut donc colorier les filets, les cellules, les
-  rangées, les colonnes, etc. sans charger \pkg{colortbl}. Le présent document ne charge pas \pkg{colortbl}.}
+Il y a néanmoins deux inconvénients :
+\begin{itemize}
+\item L'extension \pkg{colortbl} patche \pkg{array}, ce qui entraîne des
+incompatibilités (par exemple avec la commande |\hdotsfor|).
 
+\item L'extension \pkg{colortbl} construit le tableau ligne par ligne, en
+alternant rectangles colorés, filets et contenu des cases. Le \textsc{pdf}
+résultant déroute certains lecteurs de \textsc{pdf} et on a des artefacts
+d'affichage : des filets verticaux semblent disparaître ; au contraire, de fines
+lignes blanches peuvent apparaître. L'extension \pkg{nicematrix} proposent des
+outils qui évitent ces inconvénients.
+\end{itemize}
+
+\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.
+
 \medskip
-Toutes ces commandes acceptent un argument optionnel (entre crochets et en première position) qui est le modèle
-colorimétrique pour la spécification des couleurs.
+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 :
+|\cellcolor|, |\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors| et
+|\chessboardcolors|.
+\label{code-before}
 
 \medskip
+Toutes ces commandes acceptent un argument optionnel (entre crochets et en
+première position) qui est le modèle colorimétrique pour la spécification des
+couleurs.
+
+\medskip
 \begin{itemize}
-\item La commande |\cellcolor| tient son nom de la commande |\cellcolor| de \pkg{colortbl}.
+\item La commande |\cellcolor| tient son nom de la commande |\cellcolor| de
+\pkg{colortbl}.
 
-Elle prend en arguments obligatoires une couleur et une liste de cases sous le format $i$-$j$ où $i$ est le
-numéro de ligne et $j$ le numéro de colonne.
+Elle prend en arguments obligatoires une couleur et une liste de cases sous le
+format $i$-$j$ où $i$ est le numéro de ligne et $j$ le numéro de colonne.
 
 \medskip
 \begin{scope}
@@ -878,8 +959,9 @@
 \end{scope}
 
 \bigskip
-\item La commande |\rectanglecolor| prend trois arguments obligatoires. Le premier est la couleur, les deux
-suivants fournissent la case en haut à gauche et la case en bas à droite du rectangle.
+\item La commande |\rectanglecolor| prend trois arguments obligatoires. Le
+premier est la couleur, les deux suivants fournissent la case en haut à gauche
+et la case en bas à droite du rectangle.
 
 \medskip
 \begin{scope}
@@ -903,9 +985,11 @@
 
 
 \bigskip
-\item La commande |\rowcolor| doit son nom à la commande |\rowcolor| de \pkg{colortbl}. Son premier argument
-obligatoire est la couleur et le deuxième est une liste de numéros de rangées ou bien d'intervalles de rangées sous
-la forme $a$-$b$ (un intervalle de la forme $a$- représente toutes les rangées à partir de la rangée~$a$).
+\item La commande |\rowcolor| doit son nom à la commande |\rowcolor| de
+\pkg{colortbl}. Son premier argument obligatoire est la couleur et le deuxième
+est une liste de numéros de rangées ou bien d'intervalles de rangées sous la
+forme $a$-$b$ (un intervalle de la forme $a$- représente toutes les rangées à
+partir de la rangée~$a$).
 
 \medskip
 
@@ -943,14 +1027,16 @@
 
 
 \bigskip
-\item La commande |\columncolor| doit son nom à la commande |\columncolor| de \pkg{colortbl}. Sa syntaxe est
-similaire à celle de |\rowcolor|.
+\item La commande |\columncolor| doit son nom à la commande |\columncolor| de
+\pkg{colortbl}. Sa syntaxe est similaire à celle de |\rowcolor|.
 
 \bigskip
-\item La commande |\rowcolors| (avec un \emph{s}) doit son nom à la commande |\rowcolors| de
-\pkg{xcolor}\footnote{La commande |\rowcolors| de \pkg{xcolor} est disponible quand \pkg{xcolor} est chargé avec
-  l'option |table|.}. Le \emph{s} rappelle qu'il y a deux couleurs. Elle colorie alternativement les rangées avec
-les deux couleurs à partir de la rangée dont le numéro est donné en premier argument (obligatoire).
+\item La commande |\rowcolors| (avec un \emph{s}) doit son nom à la commande
+|\rowcolors| de \pkg{xcolor}\footnote{La commande |\rowcolors| de \pkg{xcolor}
+  est disponible quand \pkg{xcolor} est chargé avec l'option |table|.}. Le
+\emph{s} rappelle qu'il y a deux couleurs. Elle colorie alternativement les
+rangées avec les deux couleurs à partir de la rangée dont le numéro est donné en
+premier argument (obligatoire).
 
 \medskip
 \begin{scope}
@@ -978,8 +1064,8 @@
 
 
 \bigskip
-\item La commande |\chessboardcolors| prend en arguments obligatoires deux couleurs et colorie les cases en
-quinconces avec les deux couleurs.
+\item La commande |\chessboardcolors| prend en arguments obligatoires deux
+couleurs et colorie les cases en quinconces avec les deux couleurs.
 
 \medskip
 \begin{scope}
@@ -1000,12 +1086,13 @@
 \end{scope}
 
 \medskip
-On a utilisé la clé |r| qui impose que toutes les colonnes soient alignées à droite (cf. p.~\pageref{key-R}).
+On a utilisé la clé |r| qui impose que toutes les colonnes soient alignées à
+droite (cf. p.~\pageref{key-R}).
 \end{itemize}
 
 \bigskip
-On remarquera que ces commandes sont compatibles avec les commandes de \pkg{booktabs} (|\toprule|, |\midrule|,
-|\bottomrule|, etc).
+On remarquera que ces commandes sont compatibles avec les commandes de
+\pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc).
 
 \medskip
 \begin{scope}
@@ -1050,14 +1137,61 @@
 On a utilisé le type de colonne |S| de \pkg{siunitx}.
 
 
+\subsection{Outils de coloriage avec la syntaxe de colortbl}
+
+On peut accéder aux outils de coloriage précédents avec une syntaxe proche de
+celle proposée par \pkg{colortbl}. On doit pour cela utiliser la clé
+|colortbl-like| dans l'environnement concerné.\footnote{Pour le moment, cette
+  clé n'est pas disponible disponible dans |\NiceMatrixOptions|.}
+
+On a alors accès aux trois commandes suivantes :
+\begin{itemize}
+\item |\cellcolor| qui colorie la case courante ;
+\item |\rowcolor| à utiliser dans une case et qui colorie le reste de la rangée
+;
+\item |\columncolor| à utiliser dans le préambule de la même manière que la
+commande éponyme de \pkg{colortbl}\footnote{Contrairement à la commande
+|\columncolor| de \pkg{colortbl}, celle-ci peut apparaître à l'intérieur d'une
+autre commande, elle-même utilisée dans le préambule.}.
+\end{itemize}
+
+\medskip
+\begin{Verbatim}
+\begin{NiceTabular}[colortbl-like]{>{~emphase#\columncolor{blue!15}}@ccc}
+\toprule
+~emphase#\rowcolor{red!15}@
+Nom & Prénom & Année de naissance \\
+\midrule
+Achard & Jacques & 5 juin 1962 \\
+Lefebvre & Mathilde & 23 mai 1988 \\
+Vanesse & Stéphanie & 30 octobre 1994 \\
+Dupont & Chantal & 15 janvier 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{Verbatim}
+
+
+\begin{center}
+\begin{NiceTabular}[colortbl-like]{>{\columncolor{blue!15}}ccc}
+\toprule
+\rowcolor{red!15}
+Nom & Prénom & Année de naissance \\
+\midrule
+Achard & Jacques & 5 juin 1962 \\
+Lefebvre & Mathilde & 23 mai 1988 \\
+Vanesse & Stéphanie & 30 octobre 1994 \\
+Dupont & Chantal & 15 janvier 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+
+
 \section{La largeur des colonnes}
 \label{width}
 
-Dans les environnements avec un préambule explicite (comme |{NiceTabular}|, |{NiceArray}|, etc.), il est possible
-de fixer la largeur d'une colonne avec les lettres classiques |w| et |W| de l'extension \pkg{array}. Dans
-|{NiceTabular}|, les cases des colonnes de ce type sont composées en mode texte mais, dans |{NiceArray}|,
-|{pNiceArray}|, etc., elles sont composées en mode mathématique (alors que dans |{array}| de \pkg{array}, elles
-sont composées en mode texte).
+Dans les environnements avec un préambule explicite (comme |{NiceTabular}|,
+|{NiceArray}|, etc.), il est possible de fixer la largeur d'une colonne avec les
+lettres classiques |w| et |W| de l'extension \pkg{array}.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=9cm]
@@ -1075,8 +1209,9 @@
 
 
 \bigskip
-Dans les environnements de \pkg{nicematrix}, il est aussi possible de fixer la largeur \emph{minimale} de toutes
-les colonnes de la matrice directement avec l'option |columns-width|.
+Dans les environnements de \pkg{nicematrix}, il est aussi possible de fixer la
+largeur \emph{minimale} de toutes les colonnes de la matrice directement avec
+l'option |columns-width|.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1093,15 +1228,17 @@
 \end{pNiceMatrix}$
 
 \medskip
-Notez que l'espace inséré entre deux colonnes (égal à 2 |\tabcolsep| dans |{NiceTabular}| et à 2 |\arraycolsep|
-dans les autres environnements) n'est pas supprimé (il est évidemment possible de le supprimer en mettant
-|\tabcolsep| ou |\arraycolsep| à~$0$ avant).
+Notez que l'espace inséré entre deux colonnes (égal à 2 |\tabcolsep| dans
+|{NiceTabular}| et à 2 |\arraycolsep| dans les autres environnements) n'est pas
+supprimé (il est évidemment possible de le supprimer en mettant |\tabcolsep| ou
+|\arraycolsep| à~$0$ avant).
 
 \bigskip
-Il est possible de donner la valeur spéciale |auto| à l'option |columns-width|: toutes les colonnes du tableau
-auront alors une largeur égale à la largeur de la case la plus large du tableau.\footnote{Le résultat est atteint
-  dès la première compilation (mais PGF/Tikz écrivant des informations dans le fichier |.aux|, un message demandant une
-  deuxième compilation apparaîtra).}\par\nobreak
+Il est possible de donner la valeur spéciale |auto| à l'option |columns-width|:
+toutes les colonnes du tableau auront alors une largeur égale à la largeur de la
+case la plus large du tableau.\footnote{Le résultat est atteint dès la première
+  compilation (mais PGF/Tikz écrivant des informations dans le fichier |.aux|,
+  un message demandant une deuxième compilation apparaîtra).}\par\nobreak
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1118,8 +1255,9 @@
 \end{pNiceMatrix}$
 
 \bigskip
-Sans surprise, il est possible de fixer la largeur minimale de toutes les colonnes de toutes les matrices dans une
-certaine portion de document avec la commande |\NiceMatrixOptions|.\par\nobreak
+Sans surprise, il est possible de fixer la largeur minimale de toutes les
+colonnes de toutes les matrices dans une certaine portion de document avec la
+commande |\NiceMatrixOptions|.\par\nobreak
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
@@ -1147,12 +1285,15 @@
 
 
 \bigskip
-Mais il est aussi possible de fixer une zone dans laquelle toutes les matrices auront leurs colonnes de la même
-largeur, égale à la largeur de la case la plus large de toutes les matrices de la zone. Cette construction utilise
-l'environnement |{NiceMatrixBlock}| avec l'option |auto-columns-width|\footnote{Pour le moment, c'est le seul
-  usage de l'environnement |{NiceMatrixBlock}| mais il pourrait y en avoir davantage dans le futur.}.
-L'environnement |{NiceMatrixBlock}| n'a pas de rapport direct avec la commande |\Block| présentée précédemment dans
-ce document (cf.~p.~\pageref{Block}). 
+Mais il est aussi possible de fixer une zone dans laquelle toutes les matrices
+auront leurs colonnes de la même largeur, égale à la largeur de la case la plus
+large de toutes les matrices de la zone. Cette construction utilise
+l'environnement |{NiceMatrixBlock}| avec l'option
+|auto-columns-width|\footnote{Pour le moment, c'est le seul usage de
+  l'environnement |{NiceMatrixBlock}| mais il pourrait y en avoir davantage dans
+  le futur.}. L'environnement |{NiceMatrixBlock}| n'a pas de rapport direct avec
+la commande |\Block| présentée précédemment dans ce document
+(cf.~p.~\pageref{Block}).
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
@@ -1185,12 +1326,13 @@
 
 \bigskip
 \section{Les rangées et colonnes extérieures}
-Les environnements de \pkg{nicematrix} permettent de composer des rangées et des colonnes «extérieures» grâce aux options
-|first-row|, |last-row|, |first-col| et |last-col|.
+Les environnements de \pkg{nicematrix} permettent de composer des rangées et des
+colonnes «extérieures» grâce aux options |first-row|, |last-row|, |first-col| et
+|last-col|.
 \label{exterior}
 
-Si elle est présente, la «première rangée» (extérieure) est numérotée par $0$ (et non $1$). Il en est de même pour
-la «première colonne». 
+Si elle est présente, la «première rangée» (extérieure) est numérotée par $0$
+(et non $1$). Il en est de même pour la «première colonne».
 
 \begin{Verbatim}
 $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@,nullify-dots]
@@ -1220,29 +1362,34 @@
 Il y a plusieurs remarques à formuler.
 %
 \begin{itemize}[beginpenalty=10000]
-\item Si on utilise un environnement avec préambule explicite (c'est-à-dire |{NiceArray}| ou l'une de ses
-variantes), on ne doit pas mettre dans ce préambule de spécification de colonne pour les éventuelles première et
-dernière colonne : ce sera automatiquement (et nécessairement) une colonne |R| pour la première colonne et une
-colonne |L| pour la dernière.
+\item Si on utilise un environnement avec préambule explicite (c'est-à-dire
+|{NiceArray}| ou l'une de ses variantes), on ne doit pas mettre dans ce
+préambule de spécification de colonne pour les éventuelles première et dernière
+colonne : ce sera automatiquement (et nécessairement) une colonne |R| pour la
+première colonne et une colonne |L| pour la dernière.
 
 \item On peut se demander comment \pkg{nicematrix} détermine le nombre de rangées et de colonnes nécessaires à la
 composition de la «dernière rangée» et de la «dernière colonne».
 
 \begin{itemize}
-\item Dans le cas d'un environnement avec préambule, comme |{NiceTabular}| ou |{pNiceArray}|, le nombre de colonnes
-se déduit évidemment du préambule.
+\item Dans le cas d'un environnement avec préambule, comme |{NiceTabular}| ou
+|{pNiceArray}|, le nombre de colonnes se déduit évidemment du préambule.
 
-\item Dans le cas où l'option |light-syntax| (cf. p. \pageref{light-syntax}) est utilisée, \pkg{nicematrix} profite
-du fait que cette option nécessite de toutes manières le chargement complet du contenu de l'environnement (d'où
-l'impossibilité de mettre du verbatim dans ce cas-là) avant composition du tableau. L'analyse du contenu de
-l'environnement donne le nombre de rangées (mais pas le nombre de colonnes).
+\item Dans le cas où l'option |light-syntax| (cf. p. \pageref{light-syntax}) est
+utilisée, \pkg{nicematrix} profite du fait que cette option nécessite de toutes
+manières le chargement complet du contenu de l'environnement (d'où
+l'impossibilité de mettre du verbatim dans ce cas-là) avant composition du
+tableau. L'analyse du contenu de l'environnement donne le nombre de rangées
+(mais pas le nombre de colonnes).
 
-\item Dans les autres cas, \pkg{nicematrix} détermine le nombre de rangées et de colonnes à la première compilation
-et l'écrit dans le fichier |.aux| pour pouvoir l'utiliser à la compilation suivante.
+\item Dans les autres cas, \pkg{nicematrix} détermine le nombre de rangées et de
+colonnes à la première compilation et l'écrit dans le fichier |.aux| pour
+pouvoir l'utiliser à la compilation suivante.
 
-\textsl{Néanmoins, il est possible de donner le numéro de la dernière rangée et le numéro de la dernière colonne en
-arguments des options |last-row| et |last-col|, ce qui permettra d'accélérer le processus complet de
-compilation.} C'est ce que nous ferons dans la suite.
+\textsl{Néanmoins, il est possible de donner le numéro de la dernière rangée et
+  le numéro de la dernière colonne en arguments des options |last-row| et
+  |last-col|, ce qui permettra d'accélérer le processus complet de compilation.}
+C'est ce que nous ferons dans la suite.
 \end{itemize}
 
 \end{itemize}
@@ -1250,9 +1397,10 @@
 
 
 \bigskip
-On peut contrôler l'apparence de ces rangées et colonnes avec les options |code-for-first-row|,
-|code-for-last-row|, |code-for-first-col| et |code-for-last-col|. Ces options sont des listes de tokens qui seront
-insérées au début de chaque case de la rangée ou de la colonne considérée.
+On peut contrôler l'apparence de ces rangées et colonnes avec les options
+|code-for-first-row|, |code-for-last-row|, |code-for-first-col| et
+|code-for-last-col|. Ces options sont des listes de tokens qui seront insérées
+au début de chaque case de la rangée ou de la colonne considérée.
 
 \begin{Verbatim}
 \NiceMatrixOptions{~emphase#code-for-first-row@ = \color{red},
@@ -1292,17 +1440,21 @@
 
 \emph{Remarques}
 \begin{itemize}[beginpenalty=10000]
-\item Comme on peut le voir dans l'exemple précédent, les filets horizontaux et verticaux ne s'étendent pas dans
-les rangées et colonnes extérieures.
+\item Comme on peut le voir dans l'exemple précédent, les filets horizontaux et
+verticaux ne s'étendent pas dans les rangées et colonnes extérieures.
 
-Néanmoins, si on veut définir de nouveaux spécificateurs de colonnes pour des filets (par exemple plus épais), on
-aura sans doute intérêt à utiliser la commande |\OnlyMainNiceMatrix| décrite p.~\pageref{OnlyMainNiceMatrix}.
-\item Une spécification de couleur présente dans |code-for-first-row| s'applique à une ligne pointillée tracée
-dans cette «première rangée» (sauf si une valeur a été donnée à |xdots/color|). Idem pour les autres.
-\item Sans surprise, une éventuelle option |columns-width| (décrite p.~\pageref{width}) ne s'applique pas à la
-«première colonne» ni à la «dernière colonne».
-\item Pour des raisons techniques, il n'est pas possible d'utiliser l'option de la commande |\\| après la
-«première rangée» ou avant la «dernière rangée» (le placement des délimiteurs serait erroné).
+Néanmoins, si on veut définir de nouveaux spécificateurs de colonnes pour des
+filets (par exemple plus épais), on aura sans doute intérêt à utiliser la
+commande |\OnlyMainNiceMatrix| décrite p.~\pageref{OnlyMainNiceMatrix}.
+\item Une spécification de couleur présente dans |code-for-first-row| s'applique
+à une ligne pointillée tracée dans cette «première rangée» (sauf si une valeur a
+été donnée à |xdots/color|). Idem pour les autres.
+\item Sans surprise, une éventuelle option |columns-width| (décrite
+p.~\pageref{width}) ne s'applique pas à la «première colonne» ni à la «dernière
+colonne».
+\item Pour des raisons techniques, il n'est pas possible d'utiliser l'option de
+la commande |\\| après la «première rangée» ou avant la «dernière rangée» (le
+placement des délimiteurs serait erroné).
 \end{itemize}
 
 
@@ -1312,24 +1464,27 @@
 
 \label{Cdots}
 
-À l'intérieur des environnements de l'extension \pkg{nicematrix}, de nouvelles commandes sont définies : |\Ldots|,
-|\Cdots|, |\Vdots|, |\Ddots|, et |\Iddots|. Ces commandes sont conçues pour être utilisées à la place de |\dots|,
-|\cdots|, |\vdots|, |\ddots| et |\iddots|.\footnote{La commande |\iddots|, définie dans \pkg{nicematrix}, est une
-  variante de |\ddots| avec les points allant vers le haut. Si \pkg{mathdots} est chargée, la
-  version de \pkg{mathdots} est utilisée. Elle correspond à la commande |\adots| de \pkg{unicode-math}.}
-\newcounter{fniddots} 
-\setcounter{fniddots}{\thefootnote}
+À l'intérieur des environnements de l'extension \pkg{nicematrix}, de nouvelles
+commandes sont définies : |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, et |\Iddots|.
+Ces commandes sont conçues pour être utilisées à la place de |\dots|, |\cdots|,
+|\vdots|, |\ddots| et |\iddots|.\footnote{La commande |\iddots|, définie dans
+  \pkg{nicematrix}, est une variante de |\ddots| avec les points allant vers le
+  haut. Si \pkg{mathdots} est chargée, la version de \pkg{mathdots} est
+  utilisée. Elle correspond à la commande |\adots| de \pkg{unicode-math}.}
+\newcounter{fniddots} \setcounter{fniddots}{\thefootnote}
 
 \smallskip
-Chacune de ces commandes doit être utilisée seule dans la case du tableau et elle trace une ligne en pointillés
-entre les premières cases non vides\footnote{La définition précise de ce qui est considéré comme une «case vide»
-  est donnée plus loin (cf. p.~\pageref{empty-cells}).} situées de part et d'autre de la case courante. Bien
-entendu, pour |\Ldots| et |\Cdots|, c'est une ligne horizontale ; pour |\Vdots|, c'est une ligne verticale et pour
-|\Ddots| et |\Iddots|, ce sont des lignes diagonales. On peut changer la couleur d'une ligne avec
-l'option~|color|.\footnote{Il est aussi possible de changer la couleur de toutes ces lignes pointillées avec
-  l'option |xdots/color| (\textsl{xdots} pour rappeler que cela s'applique à |\Cdots|, |\Ldots|, |Vdots|, etc.) :
-  cf. p.~\pageref{customization}).
-}\par\nobreak   
+Chacune de ces commandes doit être utilisée seule dans la case du tableau et
+elle trace une ligne en pointillés entre les premières cases non
+vides\footnote{La définition précise de ce qui est considéré comme une «case
+  vide» est donnée plus loin (cf. p.~\pageref{empty-cells}).} situées de part et
+d'autre de la case courante. Bien entendu, pour |\Ldots| et |\Cdots|, c'est une
+ligne horizontale ; pour |\Vdots|, c'est une ligne verticale et pour |\Ddots| et
+|\Iddots|, ce sont des lignes diagonales. On peut changer la couleur d'une ligne
+avec l'option~|color|.\footnote{Il est aussi possible de changer la couleur de
+  toutes ces lignes pointillées avec l'option |xdots/color| (\textsl{xdots} pour
+  rappeler que cela s'applique à |\Cdots|, |\Ldots|, |Vdots|, etc.) : cf.
+  p.~\pageref{customization}). }\par\nobreak
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1352,8 +1507,8 @@
 
 
 
-\interitem
-Pour représenter la matrice nulle, on peut choisir d'utiliser le codage suivant :\par\nobreak
+\interitem Pour représenter la matrice nulle, on peut choisir d'utiliser le
+codage suivant :\par\nobreak
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1370,9 +1525,10 @@
 \end{bNiceMatrix}$
 
 \bigskip
-On peut néanmoins souhaiter une matrice plus grande. Habituellement, dans un tel cas, les utilisateurs de LaTeX
-ajoutent une nouvelle ligne et une nouvelle colonne. Il est possible d'utiliser la même méthode avec
-\pkg{nicematrix} :\par\nobreak
+On peut néanmoins souhaiter une matrice plus grande. Habituellement, dans un tel
+cas, les utilisateurs de LaTeX ajoutent une nouvelle ligne et une nouvelle
+colonne. Il est possible d'utiliser la même méthode avec \pkg{nicematrix}
+:\par\nobreak
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1391,13 +1547,12 @@
 \end{bNiceMatrix}$
 
 \bigskip
-Dans la première colonne de cet exemple, il y a deux instructions |\Vdots| mais une seule ligne en pointillés sera
-tracée (il n'y a pas d'objets qui se superposent dans le fichier \textsc{pdf} résultant\footnote{Et il n'est pas
-  possible de tracer une ligne |\Ldots| et une ligne |\Cdots| entre les mêmes cases.}).
+Dans la première colonne de cet exemple, il y a deux instructions |\Vdots| mais,
+bien entendu, une seule ligne en pointillés sera.
 
 \bigskip
-En fait, dans cet exemple, il aurait été possible de tracer la même matrice plus rapidement avec le codage suivant
-:\par\nobreak
+En fait, dans cet exemple, il aurait été possible de tracer la même matrice plus
+rapidement avec le codage suivant :\par\nobreak
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1416,15 +1571,19 @@
 \end{bNiceMatrix}$
 
 \bigskip
-Il y a aussi d'autres moyens de changer la taille d'une matrice. On pourrait vouloir utiliser l'argument optionnel
-de la commande~|\\| pour l'espacement vertical et la commande~|\hspace*| dans une case pour l'espacement
-horizontal.\footnote{Dans \pkg{nicematrix}, il faut utiliser |\hspace*| et non |\hspace| car \pkg{nicematrix}
-  utilise \pkg{array}. Remarquons aussi que l'on peut également régler la largeur des colonnes en utilisant l'environnement |{NiceArray}| (ou
-  une de ses variantes) avec une colonne de type~|w| ou |W|: cf. p.~\pageref{width}}
+Il y a aussi d'autres moyens de changer la taille d'une matrice. On pourrait
+vouloir utiliser l'argument optionnel de la commande~|\\| pour l'espacement
+vertical et la commande~|\hspace*| dans une case pour l'espacement
+horizontal.\footnote{Dans \pkg{nicematrix}, il faut utiliser |\hspace*| et non
+  |\hspace| car \pkg{nicematrix} utilise \pkg{array}. Remarquons aussi que l'on
+  peut également régler la largeur des colonnes en utilisant l'environnement
+  |{NiceArray}| (ou une de ses variantes) avec une colonne de type~|w| ou |W|:
+  cf. p.~\pageref{width}}
 
-Toutefois, une commande~|\hspace*| pourrait interférer dans la construction des lignes en pointillés. C'est
-pourquoi l'extension \pkg{nicematrix} fournit une commande~|\Hspace| qui est une variante de |\hspace| transparente
-pour la construction des lignes en pointillés de \pkg{nicematrix}.\par\nobreak
+Toutefois, une commande~|\hspace*| pourrait interférer dans la construction des
+lignes en pointillés. C'est pourquoi l'extension \pkg{nicematrix} fournit une
+commande~|\Hspace| qui est une variante de |\hspace| transparente pour la
+construction des lignes en pointillés de \pkg{nicematrix}.\par\nobreak
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1442,8 +1601,8 @@
 
 \subsection{L'option nullify-dots}
 
-Considérons la matrice suivante qui a été composée classiquement avec l'environnement |{pmatrix}| de
-\pkg{amsmath}.\par\nobreak
+Considérons la matrice suivante qui a été composée classiquement avec
+l'environnement |{pmatrix}| de \pkg{amsmath}.\par\nobreak
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1459,8 +1618,8 @@
 
 
 \bigskip
-Si nous ajoutons des instructions |\ldots| dans la seconde rangée, la géométrie de la matrice est
-modifiée.\par\nobreak
+Si nous ajoutons des instructions |\ldots| dans la seconde rangée, la géométrie
+de la matrice est modifiée.\par\nobreak
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1475,8 +1634,9 @@
 \end{pmatrix}$
 
 \bigskip
-Par défaut, avec \pkg{nicematrix}, si nous remplaçons |{pmatrix}| par |{pNiceMatrix}| et |\ldots| par |\Ldots|, la
-géométrie de la matrice n'est pas changée.\par\nobreak
+Par défaut, avec \pkg{nicematrix}, si nous remplaçons |{pmatrix}| par
+|{pNiceMatrix}| et |\ldots| par |\Ldots|, la géométrie de la matrice n'est pas
+changée.\par\nobreak
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -1491,8 +1651,9 @@
 \end{pNiceMatrix}$
 
 \bigskip
-On pourrait toutefois préférer la géométrie de la première matrice $A$ et vouloir avoir la même géométrie avec une
-ligne en pointillés continue dans la seconde rangée. C'est possible en utilisant l'option |nullify-dots| (et une
+On pourrait toutefois préférer la géométrie de la première matrice $A$ et
+vouloir avoir la même géométrie avec une ligne en pointillés continue dans la
+seconde rangée. C'est possible en utilisant l'option |nullify-dots| (et une
 seule instruction |\Ldots| suffit).\par\nobreak
 
 \medskip
@@ -1508,19 +1669,21 @@
 \end{pNiceMatrix}$
 
 \medskip
-L'option |nullify-dots| «smashe» les instructions |\Ldots| (et ses variantes) horizontalement mais aussi
-verticalement.
+L'option |nullify-dots| «smashe» les instructions |\Ldots| (et ses variantes)
+horizontalement mais aussi verticalement.
 
 
-\subsection{La commande \textbackslash Hdotsfor}
+\subsection{Les commandes \textbackslash Hdotsfor et \textbackslash Vdotsfor}
 
-Certaines personnes utilisent habituellement la commande |\hdotsfor| de l'extension \pkg{amsmath} pour tracer des
-lignes en pointillés horizontales dans une matrice. Dans les environnements de \pkg{nicematrix}, il convient
-d'utiliser |\Hdotsfor| à la place pour avoir les lignes en pointillés similaires à toutes celles tracées par
-l'extension \pkg{nicematrix}.
+Certaines personnes utilisent habituellement la commande |\hdotsfor| de
+l'extension \pkg{amsmath} pour tracer des lignes en pointillés horizontales dans
+une matrice. Dans les environnements de \pkg{nicematrix}, il convient d'utiliser
+|\Hdotsfor| à la place pour avoir les lignes en pointillés similaires à toutes
+celles tracées par l'extension \pkg{nicematrix}.
 
-Comme avec les autres commandes de \pkg{nicematrix} (comme |\Cdots|, |\Ldots|, |\Vdots|, etc.), la ligne en
-pointillés tracée par |\Hdotsfor| s'étend jusqu'au contenu des cases de part et d'autre.
+Comme avec les autres commandes de \pkg{nicematrix} (comme |\Cdots|, |\Ldots|,
+|\Vdots|, etc.), la ligne en pointillés tracée par |\Hdotsfor| s'étend jusqu'au
+contenu des cases de part et d'autre.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=7cm]
@@ -1539,8 +1702,8 @@
 \end{pNiceMatrix}$
 
 \bigskip
-Néanmoins, si ces cases sont vides, la ligne en pointillés s'étend seulement dans les cases spécifiées par
-l'argument de |\Hdotsfor| (par conception).
+Néanmoins, si ces cases sont vides, la ligne en pointillés s'étend seulement
+dans les cases spécifiées par l'argument de |\Hdotsfor| (par conception).
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=7cm]
@@ -1559,18 +1722,59 @@
 \end{pNiceMatrix}$
 
 \medskip
-Remarque : Contrairement à la commande |\hdotsfor| de \pkg{amsmath}, la commande |\Hdotsfor| est utilisable lorsque
-l'extension \pkg{colortbl} est chargée (mais vous risquez d'avoir des problèmes si vous utilisez |\rowcolor| sur la
-même rangée que |\Hdotsfor|).
+Remarque : Contrairement à la commande |\hdotsfor| de \pkg{amsmath}, la commande
+|\Hdotsfor| est utilisable lorsque l'extension \pkg{colortbl} est chargée (mais
+vous risquez d'avoir des problèmes si vous utilisez |\rowcolor| sur la même
+rangée que |\Hdotsfor|).
 
+\bigskip
+L'extension \pkg{nicematrix} propose aussi une commande |\Vdotsfor| similaire à
+|\Hdotsfor| mais traçant des lignes verticales.
+
+\bigskip
+L'exemple suivant utilise à la fois |\Hdotsfor| et |\Vdotsfor|:
+
+\begin{Verbatim}[formatcom=\small\color{gray}]
+\begin{bNiceMatrix}
+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 
+  & ~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}@ \\
+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 
+  & ~emphase#\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)}]
+\end{bNiceMatrix}
+\end{Verbatim}
+
+
+\[\begin{bNiceMatrix}
+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} \\
+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)}]
+\end{bNiceMatrix}\]
+
+
+
 \subsection{Comment créer les lignes en pointillés de manière transparente}
 
-L'extension \pkg{nicematrix} fournit une option appelée |transparent| qui permet d'utiliser du code existant de
-manière transparente dans les environnements de l'\pkg{amsmath} : |{matrix}|, |{pmatrix}|, etc. En fait, cette
-option est un alias pour la conjonction de deux options : |renew-dots| et |renew-matrix|.\footnote{Comme toutes les
-  autres options, les options |renew-dots|, |renew-matrix| et |transparent| peuvent être fixées avec la commande
-  |\NiceMatrixOptions|, mais elles peuvent aussi être passées en option du |\usepackage| (ce sont les trois
-  seules).}
+L'extension \pkg{nicematrix} fournit une option appelée |transparent| qui permet
+d'utiliser du code existant de manière transparente dans les environnements de
+l'\pkg{amsmath} : |{matrix}|, |{pmatrix}|, etc. En fait, cette option est un
+alias pour la conjonction de deux options : |renew-dots| et
+|renew-matrix|.\footnote{Comme toutes les autres options, les options
+  |renew-dots|, |renew-matrix| et |transparent| peuvent être fixées avec la
+  commande |\NiceMatrixOptions|, mais elles peuvent aussi être passées en option
+  du |\usepackage| (ce sont les trois seules).}
 
 \smallskip
 
@@ -1577,20 +1781,22 @@
 \begin{itemize}
 \item L'option |renew-dots|\par\nobreak 
 
-Avec cette option, les commandes |\ldots|, |\cdots|, |\vdots|, |\ddots|, |\iddots|\footnotemark[\thefniddots] et
-|\hdotsfor| sont redéfinies dans les environnements de \pkg{nicematrix} et agissent alors comme |\Ldots|, |\Cdots|,
-|\Vdots|, |\Ddots|, |\Iddots| et |\Hdotsfor| ; la commande |\dots| (points de suspension «automatiques» de
-|amsmath|) est aussi redéfinie et se comporte comme |\Ldots|.
+Avec cette option, les commandes |\ldots|, |\cdots|, |\vdots|, |\ddots|,
+|\iddots|\footnotemark[\thefniddots] et |\hdotsfor| sont redéfinies dans les
+environnements de \pkg{nicematrix} et agissent alors comme |\Ldots|, |\Cdots|,
+|\Vdots|, |\Ddots|, |\Iddots| et |\Hdotsfor| ; la commande |\dots| (points de
+suspension «automatiques» de |amsmath|) est aussi redéfinie et se comporte comme
+|\Ldots|.
 
 \item L'option |renew-matrix|\par\nobreak 
 
-Avec cette option, l'environnement |{matrix}| est redéfini et se comporte comme |{NiceMatrix}| et il en est de même
-pour les cinq variantes.
+Avec cette option, l'environnement |{matrix}| est redéfini et se comporte comme
+|{NiceMatrix}| et il en est de même pour les cinq variantes.
 \end{itemize}
 
 \bigskip 
-Par conséquent, avec l'option |transparent|, un code classique donne directement le résultat fourni par
-\pkg{nicematrix}.\par\nobreak
+Par conséquent, avec l'option |transparent|, un code classique donne directement
+le résultat fourni par \pkg{nicematrix}.\par\nobreak
 
 \bigskip
 \begin{scope}
@@ -1615,10 +1821,12 @@
 
 \subsection{Les labels des lignes en pointillés}
 
-Les commandes |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots| et |\Hdotsfor| (ainsi que la commande |\line| dans
-le |code-after| décrite p.~\pageref{line-in-code-after}) peuvent en fait prendre deux arguments optionnels
-spécifiés par les caractères |_| et |^| pour des labels situés au-dessous et au-dessus de la ligne. Les arguments
-sont composés en mode mathématique avec |\scriptstyle|.
+Les commandes |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots| et |\Hdotsfor|
+(ainsi que la commande |\line| dans le |code-after| décrite
+p.~\pageref{line-in-code-after}) peuvent en fait prendre deux arguments
+optionnels spécifiés par les caractères |_| et |^| pour des labels situés
+au-dessous et au-dessus de la ligne. Les arguments sont composés en mode
+mathématique avec |\scriptstyle|.
 
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 $\begin{bNiceMatrix}
@@ -1637,9 +1845,10 @@
 
 
 \label{customization}
-Les lignes pointillées tracées par |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots| et |\Hdotsfor| (ainsi que par la
-commande |\line| dans le |code-after| décrite p.~\pageref{line-in-code-after}) peuvent être
-paramétrées par trois options (que l'on met entre crochets après la commande) :
+Les lignes pointillées tracées par |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|,
+|\Iddots| et |\Hdotsfor| (ainsi que par la commande |\line| dans le |code-after|
+décrite p.~\pageref{line-in-code-after}) peuvent être paramétrées par trois
+options (que l'on met entre crochets après la commande) :
 %
 \begin{itemize}
 \item |color| ;
@@ -1647,8 +1856,9 @@
 \item |line-style|.
 \end{itemize}
 
-Ces options peuvent aussi être fixées avec |\NiceMatrixOptions| ou bien au niveau d'un environnement mais elles
-doivent alors être préfixées par |xdots|, ce qui fait que leurs noms deviennent :
+Ces options peuvent aussi être fixées avec |\NiceMatrixOptions| ou bien au
+niveau d'un environnement mais elles doivent alors être préfixées par |xdots|,
+ce qui fait que leurs noms deviennent :
 %
 \begin{itemize}
 \item |xdots/color| ;
@@ -1662,8 +1872,9 @@
 \textbf{L'option xdots/color}\par\nobreak
 
 \smallskip
-L'option |xdots/color| indique bien entendu la couleur de la ligne tracée. On remarquera néanmoins que les lignes
-tracées dans les rangées et colonnes extérieures (décrites plus loin) bénificient d'un régime spécial : cf.
+L'option |xdots/color| indique bien entendu la couleur de la ligne tracée. On
+remarquera néanmoins que les lignes tracées dans les rangées et colonnes
+extérieures (décrites plus loin) bénificient d'un régime spécial : cf.
 p.~\pageref{exterior}.
 
 
@@ -1671,10 +1882,11 @@
 \textbf{L'option xdots/shorten}\par\nobreak
 
 \smallskip
-L'option |xdots/shorten| indique la marge qui est laissée aux deux extrémités de la ligne. Le nom s'inspire des options
-«|shorten >|» et «|shorten <|» de Tikz, mais il faut remarquer que \pkg{nicematrix} ne propose que |xdots/shorten|.
-La valeur initiale de ce paramètre est de $0.3$~em (il est conseillé d'utiliser une unité de mesure dépendante de
-la fonte courante).
+L'option |xdots/shorten| indique la marge qui est laissée aux deux extrémités de
+la ligne. Le nom s'inspire des options «|shorten >|» et «|shorten <|» de Tikz,
+mais il faut remarquer que \pkg{nicematrix} ne propose que |xdots/shorten|. La
+valeur initiale de ce paramètre est de $0.3$~em (il est conseillé d'utiliser une
+unité de mesure dépendante de la fonte courante).
 
 
 \bigskip
@@ -1681,11 +1893,13 @@
 \textbf{L'option xdots/line-style}\par\nobreak
 
 \smallskip
-Il faut savoir que, par défaut, les lignes de Tikz tracées avec le paramètre |dotted| sont composées de points
-carrés et non pas ronds.\footnote{La raison de départ est que le format \textsc{pdf} comporte un système de description
-  de lignes en tiretés, qui, puisqu'il est incorporé dans le \textsc{pdf}, est affiché très rapidement par les
-  lecteurs de \textsc{pdf}. Il est facile à partir de ce type de ligne de créer des lignes de points carrés alors
-  qu'une ligne de points ronds doit être construite explicitement point par point.}
+Il faut savoir que, par défaut, les lignes de Tikz tracées avec le paramètre
+|dotted| sont composées de points carrés et non pas ronds.\footnote{La raison de
+  départ est que le format \textsc{pdf} comporte un système de description de
+  lignes en tiretés, qui, puisqu'il est incorporé dans le \textsc{pdf}, est
+  affiché très rapidement par les lecteurs de \textsc{pdf}. Il est facile à
+  partir de ce type de ligne de créer des lignes de points carrés alors qu'une
+  ligne de points ronds doit être construite explicitement point par point.}
 
 \begin{BVerbatim}[baseline=c,boxwidth=9cm]
 \tikz \draw [dotted] (0,0) -- (5,0) ;
@@ -1693,15 +1907,18 @@
 \tikz \draw [dotted] (0,0) -- (5,0) ;
 
 \bigskip
-Voulant proposer des lignes avec des points ronds dans le style de celui de |\ldots| (au moins celui des fontes
-\emph{Computer Modern}), l'extension \pkg{nicematrix} contient en interne son propre système de ligne en pointillés
-(qui, au passage, n'utilise que \pkg{pgf} et non \pkg{tikz}). Ce style est appelé le style |standard|. Cette valeur
-est la valeur initiale du paramètre |xdots/line-style|.
+Voulant proposer des lignes avec des points ronds dans le style de celui de
+|\ldots| (au moins celui des fontes \emph{Computer Modern}), l'extension
+\pkg{nicematrix} contient en interne son propre système de ligne en pointillés
+(qui, au passage, n'utilise que \pkg{pgf} et non \pkg{tikz}). Ce style est
+appelé le style |standard|. Cette valeur est la valeur initiale du paramètre
+|xdots/line-style|.
 
 \bigskip
-Néanmoins (quand Tikz est chargé), on peut utiliser pour |xdots/line-style| n'importe quel style proposé par Tikz,
-c'est-à-dire n'importe quelle suite d'options Tikz applicables à un chemin (à l'exception de «|color|», 
-«|shorten >|» et «|shorten <|»). 
+Néanmoins (quand Tikz est chargé), on peut utiliser pour |xdots/line-style|
+n'importe quel style proposé par Tikz, c'est-à-dire n'importe quelle suite
+d'options Tikz applicables à un chemin (à l'exception de «|color|», 
+«|shorten >|» et «|shorten <|»).
 
 \medskip
 Voici par exemple une matrice tridiagonale avec le style |loosely dotted| :\par\nobreak
@@ -1733,9 +1950,10 @@
 
 \label{dotted-and-hvlines}
 
-On a dit (cf. p. \pageref{hvlines}) que la clé |hvlines| trace tous les filets horizontaux et verticaux, exceptés
-dans les blocs. En fait, avec cette clé, les filets ne sont pas non plus tracés dans les blocs virtuels délimités
-par des cases reliées par des lignes pointillées.
+On a dit (cf. p. \pageref{hvlines}) que la clé |hvlines| trace tous les filets
+horizontaux et verticaux, exceptés dans les blocs. En fait, avec cette clé, les
+filets ne sont pas non plus tracés dans les blocs virtuels délimités par des
+cases reliées par des lignes pointillées.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
@@ -1758,13 +1976,15 @@
 
 \label{code-after}
 
-L'option |code-after| peut être utilisée pour indiquer du code qui sera exécuté après la construction de la
-matrice.\footnote{Il existe aussi une clé |code-before| décrite p.~\pageref{code-before}.}
+L'option |code-after| peut être utilisée pour indiquer du code qui sera exécuté
+après la construction de la matrice.\footnote{Il existe aussi une clé
+  |code-before| décrite p.~\pageref{code-before}.}
 
-Une commande spéciale, nommée |\line| est disponible pour tracer directement des lignes en pointillés entre les
-cases. Elle prend deux arguments correspondant aux deux cases à relier, chacun de la forme $i$-$j$ où $i$ est le
-numéro de ligne et $j$ est le numéro de colonne. Elle peut par exemple être utilisée pour tracer une ligne entre
-deux cases adjacentes comme dans l'exemple suivant.
+Une commande spéciale, nommée |\line| est disponible pour tracer directement des
+lignes en pointillés entre les cases. Elle prend deux arguments correspondant
+aux deux cases à relier, chacun de la forme $i$-$j$ où $i$ est le numéro de
+ligne et $j$ est le numéro de colonne. Elle peut par exemple être utilisée pour
+tracer une ligne entre deux cases adjacentes comme dans l'exemple suivant.
 \label{line-in-code-after}
 
 \medskip
@@ -1788,11 +2008,11 @@
 \end{scope}
 
 \medskip
-Pour améliorer la lisibilité du code, une syntaxe alternative est proposée : on peut spécifier les instructions du
-|code-after| à la fin de l'environnement, après le mot-clé
-|\CodeAfter|\footnote{Dans certaines circonstances, on doit mettre 
-|\omit \CodeAfter|, |\omit| étant un mot-clé de TeX qui annule le motif de la cellule
-courante.}. Pour un exemple, voir page
+Pour améliorer la lisibilité du code, une syntaxe alternative est proposée : on
+peut spécifier les instructions du |code-after| à la fin de l'environnement,
+après le mot-clé |\CodeAfter|\footnote{Dans certaines circonstances, on doit
+  mettre |\omit \CodeAfter|, |\omit| étant un mot-clé de TeX qui annule le motif
+  de la cellule courante.}. Pour un exemple, voir page
 \pageref{exemple-CodeAfter}.
 
 \section{Les notes dans les tableaux}
@@ -1907,7 +2127,8 @@
 
 \item Si plusieurs commandes |\tabularnote{...}| se suivent \emph{sans aucun espace
   entre elles}, les appels de notes correspondants sont composés ensemble,
-séparés par une virgule.
+séparés par une virgule (comme avec l'option |multiple| de \pkg{footmisc} pour
+les notes de pied de page).
 
 \item Si une commande |\tabularnote{...}| se trouve exactement à la fin d'une cellule
 (sans aucun espace après), l'appel de note est composé en débordement vers la
@@ -1960,8 +2181,8 @@
 \subsection{Personnalisation des notes de tableau}
 
 
-Les notes de tableau peuvent être personnalisées grâce à un ensemble de clés disponibles dans
-|\NiceMatrixOptions|. Ces clés ont un nom préfixé par |notes| :
+Les notes de tableau peuvent être personnalisées grâce à un ensemble de clés
+disponibles dans |\NiceMatrixOptions|. Ces clés ont un nom préfixé par |notes| :
 \begin{itemize}
 \item |notes/para| 
 \item |notes/bottomrule| 
@@ -2120,8 +2341,8 @@
 \makeatother
 \end{Verbatim}
 
-La commande |\AtBeginEnvironment| est une commande de l'extension \pkg{etoolbox} qui doit donc
-avoir été chargée au préalable.
+La commande |\AtBeginEnvironment| est une commande de l'extension \pkg{etoolbox}
+qui doit donc avoir été chargée au préalable.
 
 
 \section{Autres fonctionnalités}
@@ -2151,7 +2372,8 @@
 \end{pNiceArray}$
 
 \medskip
-En revanche, les colonnes |d| de l'extension \pkg{dcolumn} ne sont pas prises en charge par \pkg{nicematrix}.
+En revanche, les colonnes |d| de l'extension \pkg{dcolumn} ne sont pas prises en
+charge par \pkg{nicematrix}.
 
 
 
@@ -2159,8 +2381,9 @@
 
 \label{key-R}
 
-Les environnements sans préambule (|{NiceMatrix}|, |{pNiceMatrix}|, |{bNiceMatrix}|, etc.) proposent les options
-|l| et |r| (possédant |L| et |R| comme alias) qui imposent des colonnes alignées à gauche ou à droite.
+Les environnements sans préambule (|{NiceMatrix}|, |{pNiceMatrix}|,
+|{bNiceMatrix}|, etc.) proposent les options |l| et |r| qui imposent des
+colonnes alignées à gauche ou à droite.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
@@ -2175,9 +2398,10 @@
 \end{bNiceMatrix}$
 
 \medskip
-Il existe aussi l'option |S| qui impose que toutes les colonnes soient des colonnes |S| de \pkg{siunitx} (si cette
-extension est chargée).\footnote{Cela reprend une partie des fonctionnalités proposées par les environnements |{pmatrix*}|,
-  |{bmatrix*}|, etc. de \pkg{mathtools}.}
+Il existe aussi l'option |S| qui impose que toutes les colonnes soient des
+colonnes |S| de \pkg{siunitx} (si cette extension est chargée).\footnote{Cela
+  reprend une partie des fonctionnalités proposées par les environnements
+  |{pmatrix*}|, |{bmatrix*}|, etc. de \pkg{mathtools}.}
 
 
 \subsection{La commande \textbackslash rotate}
@@ -2213,8 +2437,8 @@
 \end{varwidth}
 
 \bigskip
-Si la commande |\rotate| est utilisée dans la «dernière rangée» (extérieure à la matrice), les éléments qui
-subissent cette rotation sont alignés vers le haut.
+Si la commande |\rotate| est utilisée dans la «dernière rangée» (extérieure à la
+matrice), les éléments qui subissent cette rotation sont alignés vers le haut.
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=12cm]
@@ -2245,9 +2469,10 @@
 
 \label{small}
 
-Avec l'option |small|, les environnements de l'extension \pkg{nicematrix} sont composés d'une manière proche de ce
-que propose l'environnement |{smallmatrix}| de l'\pkg{amsmath} (et les environnements |{psmallmatrix}|,
-|{bsmallmatrix}|, etc. de \pkg{mathtools}).
+Avec l'option |small|, les environnements de l'extension \pkg{nicematrix} sont
+composés d'une manière proche de ce que propose l'environnement |{smallmatrix}|
+de l'\pkg{amsmath} (et les environnements |{psmallmatrix}|, |{bsmallmatrix}|,
+etc. de \pkg{mathtools}).
 
 \bigskip
 \begin{Verbatim}
@@ -2270,10 +2495,11 @@
 
 
 \bigskip
-On remarquera néanmoins que l'environnement |{NiceMatrix}| avec l'option |small| ne prétend pas être composé
-exactement comme l'environnement |{smallmatrix}|. C'est que les environnements de \pkg{nicematrix} sont tous fondés
-sur |{array}| (de \pkg{array}) alors que ce n'est pas le cas de |{smallmatrix}| (fondé directement sur un |\halign|
-de TeX).
+On remarquera néanmoins que l'environnement |{NiceMatrix}| avec l'option |small|
+ne prétend pas être composé exactement comme l'environnement |{smallmatrix}|.
+C'est que les environnements de \pkg{nicematrix} sont tous fondés sur |{array}|
+(de \pkg{array}) alors que ce n'est pas le cas de |{smallmatrix}| (fondé
+directement sur un |\halign| de TeX).
 
 \medskip
 En fait, l'option |small| correspond aux réglages suivants :
@@ -2286,15 +2512,17 @@
 
 \subsection{Les compteurs iRow et jCol}
 
-Dans les cases du tableau, il est possible d'utiliser les compteurs LaTeX |iRow| et |jCol| qui représentent le
-numéro de la rangée courante et le numéro de la colonne courante\footnote{On rappelle que le numéro de la «première
-  rangée» (si elle existe) est $0$ et que le numéro de la «première colonne» (si elle existe) est $0$ également.}.
-Bien entendu, l'utilisateur ne doit pas modifier les valeurs de ces compteurs qui sont utilisés en interne par
-\pkg{nicematrix}.
+Dans les cases du tableau, il est possible d'utiliser les compteurs LaTeX |iRow|
+et |jCol| qui représentent le numéro de la rangée courante et le numéro de la
+colonne courante\footnote{On rappelle que le numéro de la «première rangée» (si
+  elle existe) est $0$ et que le numéro de la «première colonne» (si elle
+  existe) est $0$ également.}. Bien entendu, l'utilisateur ne doit pas modifier
+les valeurs de ces compteurs qui sont utilisés en interne par \pkg{nicematrix}.
 
-Dans le |code-before| (cf. p. \pageref{code-before}) et dans le |code-after| (cf. p. \pageref{code-after}), |iRow|
-représente le nombre total de rangées (hors éventuelles rangées extérieures) et |jCol| le nombre total de colonnes
-(hors potentielles colonnes extérieures). 
+Dans le |code-before| (cf. p. \pageref{code-before}) et dans le |code-after|
+(cf. p. \pageref{code-after}), |iRow| représente le nombre total de rangées
+(hors éventuelles rangées extérieures) et |jCol| le nombre total de colonnes
+(hors potentielles colonnes extérieures).
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
@@ -2320,20 +2548,22 @@
 \end{pNiceMatrix}$
 
 \medskip
-Si des compteurs LaTeX nommés |iRow| ou |jCol| sont créés dans le document par d'autres extensions que
-\pkg{nicematrix} (ou tout simplement par l'utilisateur final), ces compteurs sont masqués dans les environnements
-de \pkg{nicematrix}.
+Si des compteurs LaTeX nommés |iRow| ou |jCol| sont créés dans le document par
+d'autres extensions que \pkg{nicematrix} (ou tout simplement par l'utilisateur
+final), ces compteurs sont masqués dans les environnements de \pkg{nicematrix}.
 
 
 \bigskip
-L'extension \pkg{nicematrix} propose aussi des commandes pour composer automatiquement des matrices à partir d'un
-motif général. Ces commandes sont nommées |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|,
+L'extension \pkg{nicematrix} propose aussi des commandes pour composer
+automatiquement des matrices à partir d'un motif général. Ces commandes sont
+nommées |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|,
 |\vAutoNiceMatrix|, |\VAutoNiceMatrix| et |\BAutoNiceMatrix|.
 
-Chacune de ces commandes prend deux arguments obligatoires : le premier est la taille de la matrice, sous la forme 
-$n$-$p$, où $n$ est le nombre de rangées et $p$ est le nombre de colonnes et le deuxième est le motif (c'est-à-dire
-simplement des tokens qui seront insérés dans chaque case de la matrice, exceptées celles des éventuelles rangées et
-colonnes extérieures). 
+Chacune de ces commandes prend deux arguments obligatoires : le premier est la
+taille de la matrice, sous la forme $n$-$p$, où $n$ est le nombre de rangées et
+$p$ est le nombre de colonnes et le deuxième est le motif (c'est-à-dire
+simplement des tokens qui seront insérés dans chaque case de la matrice,
+exceptées celles des éventuelles rangées et colonnes extérieures).
 
 \medskip
 \begin{Verbatim}
@@ -2349,11 +2579,13 @@
 
 \label{light-syntax}
 
-L'option |light-syntax| (inspirée de l'extension \pkg{spalign}) permet d'alléger la saisie des matrices, ainsi que
-leur lisibilité dans le source TeX. Lorsque cette option est activée, on doit utiliser le point-virgule comme
-marqueur de fin de rangée et séparer les colonnes par des espaces ou des tabulations. On remarquera toutefois que,
-comme souvent dans le monde TeX, les espaces après les séquences de contrôle ne sont pas comptées et que les
-éléments entre accolades sont considérés comme un tout.
+L'option |light-syntax| (inspirée de l'extension \pkg{spalign}) permet d'alléger
+la saisie des matrices, ainsi que leur lisibilité dans le source TeX. Lorsque
+cette option est activée, on doit utiliser le point-virgule comme marqueur de
+fin de rangée et séparer les colonnes par des espaces ou des tabulations. On
+remarquera toutefois que, comme souvent dans le monde TeX, les espaces après les
+séquences de contrôle ne sont pas comptées et que les éléments entre accolades
+sont considérés comme un tout.
 
 
 \medskip
@@ -2374,22 +2606,27 @@
 \end{bNiceMatrix}$
 
 \medskip
-On peut changer le caractère utilisé pour indiquer les fins de rangées avec l'option |end-of-row|. Comme dit
-précédemment, la valeur initiale de ce paramètre est un point-virgule.
+On peut changer le caractère utilisé pour indiquer les fins de rangées avec
+l'option |end-of-row|. Comme dit précédemment, la valeur initiale de ce
+paramètre est un point-virgule.
 
 \medskip
-Lorsque l'option |light-syntax| est utilisée, il n'est pas possible de mettre d'éléments en verbatim (avec par
-exemple la commande |\verb|) dans les cases du tableau.\footnote{La raison en est que lorsque l'option
-  |light-syntax| est utilisée, le contenu complet de l'environnement est chargé comme un argument de commande TeX.
-  L'environnement ne se comporte plus comme un «vrai» environnement de LaTeX qui se contente d'insérer des
-  commandes avant et après.}
+Lorsque l'option |light-syntax| est utilisée, il n'est pas possible de mettre
+d'éléments en verbatim (avec par exemple la commande
+|\verb|) dans les cases du tableau.\footnote{La raison en est que lorsque l'option |light-syntax|
+  est utilisée, le contenu complet de l'environnement est chargé comme un
+  argument de commande TeX. L'environnement ne se comporte plus comme un «vrai»
+  environnement de LaTeX qui se contente d'insérer des commandes avant et
+  après.}
 
 \subsection{L'environnement \{NiceArrayWithDelims\}}
 
-En fait, l'environnement |{pNiceArray}| et ses variantes sont fondés sur un environnement plus général, appelé
-|{NiceArrayWithDelims}|. Les deux premiers arguments obligatoires de cet environnement sont les délimiteurs gauche
-et droit qui seront utilisés dans la construction de la matrice. Il est possible d'utiliser |{NiceArrayWithDelims}|
-si on a besoin de délimiteurs atypiques ou asymétriques.
+En fait, l'environnement |{pNiceArray}| et ses variantes sont fondés sur un
+environnement plus général, appelé |{NiceArrayWithDelims}|. Les deux premiers
+arguments obligatoires de cet environnement sont les délimiteurs gauche et droit
+qui seront utilisés dans la construction de la matrice. Il est possible
+d'utiliser |{NiceArrayWithDelims}| si on a besoin de délimiteurs atypiques ou
+asymétriques.
 
 \medskip
 \begin{BVerbatim}[baseline=c,boxwidth=11cm]
@@ -2417,28 +2654,33 @@
 
 \subsection{Les nœuds correspondant aux contenus des cases}
 
-L'extension \pkg{nicematrix} crée un nœud PGF-Tikz pour chaque case (non vide) du tableau considéré. Ces nœuds sont
-utilisés, entre autres, pour tracer les lignes en pointillés entre les cases du tableau. 
+L'extension \pkg{nicematrix} crée un nœud PGF-Tikz pour chaque case (non vide)
+du tableau considéré. Ces nœuds sont utilisés, entre autres, pour tracer les
+lignes en pointillés entre les cases du tableau.
 
 \smallskip
-Tous les nœuds du document doivent avoir des noms deux à deux distincts et le nom de ces nœuds doit donc faire
-intervenir le numéro de l'environnement courant. Les environnements créés par \pkg{nicematrix} sont en effet
-numérotés par un compteur global interne. 
+Tous les nœuds du document doivent avoir des noms deux à deux distincts et le
+nom de ces nœuds doit donc faire intervenir le numéro de l'environnement
+courant. Les environnements créés par \pkg{nicematrix} sont en effet numérotés
+par un compteur global interne.
 
 \smallskip
-Si l'environnement concerné a le numéro $n$, alors le nœud de la rangée~$i$ et de la colonne~$j$ a pour nom
-|nm-|$n$|-|$i$|-|$j$. 
+Si l'environnement concerné a le numéro $n$, alors le nœud de la rangée~$i$ et
+de la colonne~$j$ a pour nom |nm-|$n$|-|$i$|-|$j$.
 
 \smallskip
-La commande |\NiceMatrixLastEnv| donne le numéro du dernier de ces environnements (pour LaTeX, il s'agit d'une
-commande — complètement développable — et non d'un compteur).
+La commande |\NiceMatrixLastEnv| donne le numéro du dernier de ces
+environnements (pour LaTeX, il s'agit d'une commande — complètement développable
+— et non d'un compteur).
 
 \smallskip
-Il est néanmoins recommandé de passer plutôt par la clé |name|. Celle-ci permet de donner un nom à l'environnement.
-Une fois l'environnement nommé, les nœuds sont accessibles à travers les noms «\textsl{nom}-$i$-$j$» où
-\textsl{nom} est le nom donné au tableau et $i$ et $j$ les numéros de rangée et de colonne de la case considérée.
-On peut les utiliser avec \textsc{pgf} mais l'utilisateur final préférera sans doute utiliser Tikz (qui est une
-sur-couche de \textsc{pgf}). Il faut néanmoins se souvenir que \pkg{nicematrix} ne charge pas Tikz par défault.
+Il est néanmoins recommandé de passer plutôt par la clé |name|. Celle-ci permet
+de donner un nom à l'environnement. Une fois l'environnement nommé, les nœuds
+sont accessibles à travers les noms «\textsl{nom}-$i$-$j$» où \textsl{nom} est
+le nom donné au tableau et $i$ et $j$ les numéros de rangée et de colonne de la
+case considérée. On peut les utiliser avec \textsc{pgf} mais l'utilisateur final
+préférera sans doute utiliser Tikz (qui est une sur-couche de \textsc{pgf}). Il
+faut néanmoins se souvenir que \pkg{nicematrix} ne charge pas Tikz par défault.
 
 \bigskip
 \begin{BVerbatim}[baseline=c,boxwidth=11cm]
@@ -2463,8 +2705,9 @@
 
 
 \bigskip
-Dans le |code-after|, et si Tikz est chargé, les choses sont plus simples. On peut (et on doit) désigner les nœuds
-sous la forme $i$-$j$ : il n'y a pas besoin de préciser l'environnement qui est évidemment l'environnement courant.
+Dans le |code-after|, et si Tikz est chargé, les choses sont plus simples. On
+peut (et on doit) désigner les nœuds sous la forme $i$-$j$ : il n'y a pas besoin
+de préciser l'environnement qui est évidemment l'environnement courant.
 
 
 \medskip
@@ -2489,8 +2732,7 @@
 
 \bigskip
 Dans l'exemple suivant, nous avons surligné tous les nœuds de la matrice (on
-explique plus loin la technique utilisée : 
-cf. p. \pageref{highlight}).
+explique plus loin la technique utilisée : cf. p. \pageref{highlight}).
 
 \[\begin{pNiceMatrix}
 a & a + b & a + b + c \\
@@ -2521,19 +2763,22 @@
 \subsection{Les «nœuds moyens» et les «nœuds larges»}
 
 
-En fait, l'extension \pkg{nicematrix} peut créer deux séries de nœuds supplémentaires (\emph{extra nodes} en
-anglais) : les «nœuds moyens» (\emph{medium nodes} en anglais) et les «nœuds larges» (\emph{large nodes} en
-anglais). Les premiers sont créés avec l'option |create-medium-nodes| et les seconds avec l'option
-|create-large-nodes|.\footnote{Il existe aussi l'option |create-extra-nodes| qui est un alias pour la conjonction
-de |create-medium-nodes| et |create-large-nodes|.}
+En fait, l'extension \pkg{nicematrix} peut créer deux séries de nœuds
+supplémentaires (\emph{extra nodes} en anglais) : les «nœuds moyens»
+(\emph{medium nodes} en anglais) et les «nœuds larges» (\emph{large nodes} en
+anglais). Les premiers sont créés avec l'option |create-medium-nodes| et les
+seconds avec l'option |create-large-nodes|.\footnote{Il existe aussi l'option
+  |create-extra-nodes| qui est un alias pour la conjonction de
+  |create-medium-nodes| et |create-large-nodes|.}
 
 \medskip
 Ces nœuds ne sont pas utilisés par défault par \pkg{nicematrix}.
 
 \medskip
-Les noms des «nœuds moyens» s'obtiennent en ajoutant le suffixe «|-medium|» au nom des nœuds normaux. Dans
-l'exemple suivant, on a surligné tous les «nœuds moyens». Nous considérons que cet exemple se suffit à lui-même
-comme définition de ces nœuds.
+Les noms des «nœuds moyens» s'obtiennent en ajoutant le suffixe «|-medium|» au
+nom des nœuds normaux. Dans l'exemple suivant, on a surligné tous les «nœuds
+moyens». Nous considérons que cet exemple se suffit à lui-même comme définition
+de ces nœuds.
 \[\begin{pNiceMatrix}[
  create-medium-nodes,
  code-after = {\begin{tikzpicture}
@@ -2558,10 +2803,12 @@
 
 
 \medskip
-Les noms des «nœuds larges» s'obtiennent en ajoutant le suffixe «|-large|» au nom des nœuds normaux. Dans l'exemple
-suivant, on a surligné tous les «nœuds larges». Nous considérons que cet exemple se suffit à lui-même comme
-définition de ces nœuds.\footnote{Il n'y a pas de «nœuds larges» créés dans les rangées et colonnes extérieures
-  (pour ces rangées et colonnes, voir p.~\pageref{exterior}).}
+Les noms des «nœuds larges» s'obtiennent en ajoutant le suffixe «|-large|» au
+nom des nœuds normaux. Dans l'exemple suivant, on a surligné tous les «nœuds
+larges». Nous considérons que cet exemple se suffit à lui-même comme définition
+de ces nœuds.\footnote{Il n'y a pas de «nœuds larges» créés dans les rangées et
+  colonnes extérieures (pour ces rangées et colonnes, voir
+  p.~\pageref{exterior}).}
 
 \[\begin{pNiceMatrix}[
  create-large-nodes,
@@ -2586,14 +2833,16 @@
 
 
 \medskip
-Les «nœuds larges» de la première colonne et de la dernière colonne peuvent apparaître trop petits pour certains
-usages. C'est pourquoi il est possible d'utiliser les options |left-margin| et |right-margin| pour ajouter de
-l'espace des deux côtés du tableau et aussi de l'espace dans les «nœuds larges» de la première colonne et de la
-dernière colonne. Dans l'exemple suivant, nous avons utilisé les options |left-margin| et
-|right-margin|.\footnote{Les options |left-margin| et |right-margin| prennent des dimensions comme valeurs mais, si
-  aucune valeur n'est donnée, c'est la valeur par défaut qui est utilisée et elle est égale à |\arraycolsep| (valeur
-  initial : 5~pt). Il existe aussi une option |margin| pour fixer à la fois
-  |left-margin| et |right-margin|.} 
+Les «nœuds larges» de la première colonne et de la dernière colonne peuvent
+apparaître trop petits pour certains usages. C'est pourquoi il est possible
+d'utiliser les options |left-margin| et |right-margin| pour ajouter de l'espace
+des deux côtés du tableau et aussi de l'espace dans les «nœuds larges» de la
+première colonne et de la dernière colonne. Dans l'exemple suivant, nous avons
+utilisé les options |left-margin| et |right-margin|.\footnote{Les options
+  |left-margin| et |right-margin| prennent des dimensions comme valeurs mais, si
+  aucune valeur n'est donnée, c'est la valeur par défaut qui est utilisée et
+  elle est égale à |\arraycolsep| (valeur initial : 5~pt). Il existe aussi une
+  option |margin| pour fixer à la fois |left-margin| et |right-margin|.}
 \[\begin{pNiceMatrix}[
  create-large-nodes,left-margin,right-margin,
  code-after = {\begin{tikzpicture}
@@ -2616,9 +2865,10 @@
 \end{pNiceMatrix}\]
 
 \medskip
-Il est aussi possible d'ajouter de l'espace sur les côtés du tableau avec les options |extra-left-margin| et
-|extra-right-margin|. Ces marges ne sont pas incorporées dans les «nœuds larges». Dans l'exemple suivant, nous
-avons utilisé |extra-left-margin| et |extra-right-margin| avec la valeur $3$~pt.
+Il est aussi possible d'ajouter de l'espace sur les côtés du tableau avec les
+options |extra-left-margin| et |extra-right-margin|. Ces marges ne sont pas
+incorporées dans les «nœuds larges». Dans l'exemple suivant, nous avons utilisé
+|extra-left-margin| et |extra-right-margin| avec la valeur $3$~pt.
 \[\begin{pNiceMatrix}[
  create-large-nodes,left-margin,right-margin,extra-right-margin=3pt,extra-left-margin=3pt,
  code-after = {\begin{tikzpicture}
@@ -2642,8 +2892,8 @@
 
 
 \bigskip
-\textbf{Attention} : Ces nœuds sont reconstruits à partir des contenus des cases et ne correspondent donc pas
-nécessairement aux cases délimitées par des filets.
+\textbf{Attention} : Ces nœuds sont reconstruits à partir des contenus des cases
+et ne correspondent donc pas nécessairement aux cases délimitées par des filets.
 
 \bigskip
 \begin{minipage}[c]{7.5cm}
@@ -2686,7 +2936,8 @@
 
 \vspace{1cm}
 \begin{minipage}[c]{7cm}
-Voici maintenant tous les «nœuds larges» de ce tableau (sans utilisation de |margin| ni de |extra-margin|). 
+Voici maintenant tous les «nœuds larges» de ce tableau (sans utilisation de
+|margin| ni de |extra-margin|).
 \end{minipage}
 \hspace{1.5cm}
 \begin{scope}
@@ -2715,17 +2966,12 @@
 
 
 
-
-
-
-
-
-
 \subsection{Les nœuds «row» et «col»}
 
-L'extension \pkg{nicematrix} crée un nœud PGF-Tikz indiquant la position potentielle de chaque filet horizontal
-(avec les noms |row-|$i$) et de chaque filet vertical (avec les noms |col-|$j$), comme décrit sur la figure
-ci-dessous. Ces nœuds sont accessibles dans le |code-before| et dans le |code-after|.
+L'extension \pkg{nicematrix} crée un nœud PGF-Tikz indiquant la position
+potentielle de chaque filet horizontal (avec les noms |row-|$i$) et de chaque
+filet vertical (avec les noms |col-|$j$), comme décrit sur la figure ci-dessous.
+Ces nœuds sont accessibles dans le |code-before| et dans le |code-after|.
 \begin{center}
 \begin{NiceTabular}{ccc}[hvlines,rules/width=1pt,rules/color=gray]
 rose & tulipe & lys \\
@@ -2750,8 +2996,9 @@
 
 
 \bigskip
-Si on utilise Tikz (on rappelle que \pkg{nicematrix} ne charge pas Tikz par défaut), on peut donc accéder (dans le
-|code-before| et le |code-after|) à l'intersection du filet horizontal~$i$ et du filet vertical~$j$ avec la syntaxe 
+Si on utilise Tikz (on rappelle que \pkg{nicematrix} ne charge pas Tikz par
+défaut), on peut donc accéder (dans le |code-before| et le |code-after|) à
+l'intersection du filet horizontal~$i$ et du filet vertical~$j$ avec la syntaxe
 |(row-|$i$\verb+-|col-+$j$|)|.
 
 
@@ -2797,18 +3044,116 @@
 \end{NiceMatrix}\]
 
 
+\section{Outils pour les développeurs}
+
+Comme son nom l'indique, la liste de tokens |\g_nicematrix_code_after_tl| est
+publique (conformément aux conventions de LaTeX3, toute variable dont le nom
+débute par |\g_nicematrix| ou |\l_nicematrix| est publique alors que toute variable
+dont le nom débute par |\g__nicematrix| ou par |\l__nicematrix| est privée).
+
+\medskip
+Cette variable contient le code qui constitue le «|code-after|». Le développeur
+peut donc l'utiliser pour y ajouter du code à partir d'une cellule du tableau
+(l'affectation devra être globale, ce qui permettra de sortir de la cellule, qui
+est un groupe au sens de TeX).
+
+\medskip
+\emph{Exemple} : On souhaite écrire une commande |\crossbox| qui barre en croix
+la cellule courante. Cette commande prendra en argument optionnel une liste de
+couples \textsl{clé}-\textsl{valeur} qui sera passée à Tikz avant que la croix
+ne soit tracée.
+
+
+On peut alors programmer cette commande |\crossbox| de la manière suivante, qui
+utilise explicitement la variable publique |\g_nicematrix_code_after_tl|.
+
+
+\begin{scope}
+\fvset{commandchars=\§\¤\μ}
+\begin{Verbatim}
+\ExplSyntaxOn
+\cs_new_protected:Nn \__pantigny_crossbox:nnn
+  {
+    \begin { tikzpicture }
+    \draw [ #3 ] 
+          ( row-#1 -| col-\int_eval:n { #2 + 1 } ) 
+       -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) 
+          ( row-#1 -| col-\int_eval:n #2 ) 
+       -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; 
+    \end { tikzpicture }
+  }
+
+
+\NewDocumentCommand \crossbox { ! O { } }
+  {
+    \tl_gput_right:Nx §emphase¤\g_nicematrix_code_after_tlμ
+      { 
+        \__pantigny_crossbox:nnn 
+          { \int_use:c { c at iRow } } 
+          { \int_use:c { c at jCol } }
+          { \exp_not:n { #1 } }
+      }
+  }
+\ExplSyntaxOff
+\end{Verbatim}
+\end{scope}
+
+
+\ExplSyntaxOn
+\cs_new_protected:Nn \__pantigny_crossbox:nnn
+  {
+    \begin { tikzpicture }
+    \draw [ #3 ] 
+          ( row-#1 -| col-\int_eval:n { #2 + 1 } ) 
+       -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) 
+          ( row-#1 -| col-\int_eval:n #2 ) 
+       -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; 
+    \end { tikzpicture }
+  }
+
+
+\NewDocumentCommand \crossbox { ! O { } }
+  {
+    \tl_gput_right:Nx \g_nicematrix_code_after_tl
+      { 
+        \__pantigny_crossbox:nnn 
+          { \int_use:c { c at iRow } } 
+          { \int_use:c { c at jCol } }
+          { \exp_not:n { #1 } }
+      }
+  }
+\ExplSyntaxOff
+
+\bigskip
+Voici un exemple d'utilisation :
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{NiceTabular}{ccc}[hvlines]
+merlan & requin & cabillaud \\
+baleine & ~emphase#\crossbox[red]@ & morue \\
+mante & raie & poule 
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}[hvlines]
+merlan & requin & cabillaud \\
+baleine & \crossbox[red] & morue \\
+mante & raie & poule 
+\end{NiceTabular}
+
 \section{Remarques techniques}
 
-Première remarque : l'extension \pkg{nicematrix} doit être chargée après l'extension \pkg{underscore}. Si ce n'est
-pas le cas, une erreur est levée.
+Première remarque : l'extension \pkg{nicematrix} doit être chargée après
+l'extension \pkg{underscore}. Si ce n'est pas le cas, une erreur est levée.
 
 \subsection{Pour définir de nouveaux types de colonnes}
 
 \label{OnlyMainNiceMatrix}
 
-L'extension \pkg{nicematrix} fournit la commande |\OnlyMainNiceMatrix| qui est destinée à être utilisée dans des
-définitions de nouveaux types de colonnes. Son argument n'est exécuté que si on se place dans la partie principale
-du tableau, c'est-à-dire que l'on n'est pas dans l'une des éventuelles rangées extérieures.
+L'extension \pkg{nicematrix} fournit la commande |\OnlyMainNiceMatrix| qui est
+destinée à être utilisée dans des définitions de nouveaux types de colonnes. Son
+argument n'est exécuté que si on se place dans la partie principale du tableau,
+c'est-à-dire que l'on n'est pas dans l'une des éventuelles rangées extérieures.
 
 Par exemple, si on souhaite définir un type de colonne |?| pour tracer un trait fort (noir) d'épaisseur 1~pt, on
 pourra écrire\footnote{La commande |\vrule| est une commande de TeX (et non de LaTeX).} :
@@ -2816,7 +3161,9 @@
 \newcolumntype{?}{!{\OnlyMainNiceMatrix{\vrule width 1 pt}}}
 \end{Verbatim}
 
-Le trait fort correspondant ne s'étendra pas dans les rangées extérieures :
+Le trait fort correspondant ne s'étendra pas dans les rangées
+extérieures.\footnote{Un tel filet utilisant les techniques classiques de
+  \pkg{array}, il ne traversera pas les doubles filets horizontaux de |\hline\hline|.}
 
 \medskip
 \begin{scope}
@@ -2839,8 +3186,9 @@
 \end{scope}
 
 \medskip
-Le spécificateur |?| ainsi créé est aussi utilisable dans les environnements |{tabular}| et |{array}| (de
-\pkg{array}) et, dans ce cas, |\OnlyMainNiceMatrix| est sans effet.
+Le spécificateur |?| ainsi créé est aussi utilisable dans les environnements
+|{tabular}| et |{array}| (de \pkg{array}) et, dans ce cas, |\OnlyMainNiceMatrix|
+est sans effet.
 
 
 
@@ -2849,11 +3197,13 @@
 
 \subsection{Lignes diagonales} 
 
-Par défaut, toutes les lignes diagonales\footnote{On parle des lignes créées par |\Ddots| et non des lignes créées
-  par une commande |\line| dans le |code-after|.} d'un même tableau sont «parallélisées». Cela signifie que la
-première diagonale est tracée et que, ensuite, les autres lignes sont tracées parallèlement à la première (par
-rotation autour de l'extrémité la plus à gauche de la ligne). C'est pourquoi la position des instructions |\Ddots|
-dans un tableau peut avoir un effet marqué sur le résultat final.
+Par défaut, toutes les lignes diagonales\footnote{On parle des lignes créées par
+  |\Ddots| et non des lignes créées par une commande |\line| dans le
+  |code-after|.} d'un même tableau sont «parallélisées». Cela signifie que la
+première diagonale est tracée et que, ensuite, les autres lignes sont tracées
+parallèlement à la première (par rotation autour de l'extrémité la plus à gauche
+de la ligne). C'est pourquoi la position des instructions |\Ddots| dans un
+tableau peut avoir un effet marqué sur le résultat final.
 
 \medskip
 Dans les exemples suivants, la première instruction |\Ddots| est marquée en couleur :
@@ -2898,7 +3248,8 @@
 \end{pNiceMatrix}$
 
 \bigskip
-Il est possible de désactiver la parallélisation avec l'option |parallelize-diags| mise à |false|: \par\nobreak
+Il est possible de désactiver la parallélisation avec l'option
+|parallelize-diags| mise à |false|: \par\nobreak
 
 \medskip
 \NiceMatrixOptions{parallelize-diags=false}%
@@ -2919,10 +3270,11 @@
 \subsection{Les cases «vides»}
 
 \label{empty-cells}
-Une instruction comme |\Ldots|, |\Cdots|, etc. essaye de déterminer la première case vide de part et d'autre de la
-case considérée. Néanmoins, une case vide n'est pas nécessairement sans contenu dans le codage TeX (c'est-à-dire
-sans aucun token entre les deux esperluettes~|&|). En effet, une case dont le contenu est |\hspace*{1cm}| peut être
-considérée comme vide.
+Une instruction comme |\Ldots|, |\Cdots|, etc. essaye de déterminer la première
+case vide de part et d'autre de la case considérée. Néanmoins, une case vide
+n'est pas nécessairement sans contenu dans le codage TeX (c'est-à-dire sans
+aucun token entre les deux esperluettes~|&|). En effet, une case dont le contenu
+est |\hspace*{1cm}| peut être considérée comme vide.
 
 \interitem
 Pour \pkg{nicematrix}, les règles précises sont les suivantes :
@@ -2943,10 +3295,12 @@
 \item Chaque case avec un rendu par TeX de largeur nulle est vide.
 
 \medskip
-\item Une case avec une commande |\Hspace| (ou |\Hspace*|) est vide. Cette commande |\Hspace| est une commande
-définie par l'extension \pkg{nicematrix} avec la même signification que |\hspace| excepté que la case où cette
-commande est utilisée est considérée comme vide. Cette commande peut être utilisée pour fixer la largeur des
-colonnes sans interférer avec le tracé des lignes en pointillés par \pkg{nicematrix}.
+\item Une case avec une commande |\Hspace| (ou |\Hspace*|) est vide. Cette
+commande |\Hspace| est une commande définie par l'extension \pkg{nicematrix}
+avec la même signification que |\hspace| excepté que la case où cette commande
+est utilisée est considérée comme vide. Cette commande peut être utilisée pour
+fixer la largeur des colonnes sans interférer avec le tracé des lignes en
+pointillés par \pkg{nicematrix}.
 
 \end{itemize}
 
@@ -2953,21 +3307,27 @@
 
 \subsection{L'option exterior-arraycolsep}
 
-L'environnement |{array}| insère un espace horizontal égal à |\arraycolsep| avant et après chaque colonne. En
-particulier, il y a un espace égal à |\arraycolsep| avant et après le tableau. Cette caractéristique de
-l'environnement |{array}| n'était probablement pas une bonne idée\footnote{Dans la documentation de |{amsmath}|, on
-  peut lire : {\itshape The extra space of |\arraycolsep| that \pkg{array} adds on each side is a waste so we
-    remove it [in |{matrix}|] (perhaps we should instead remove it from array in general, but that's a harder
-    task).}}. L'environnement |{matrix}| et ses variantes (|{pmatrix}|,
-|{vmatrix}|, etc.) de \pkg{amsmath} préfèrent supprimer ces espaces avec des instructions explicites 
-|\hskip -\arraycolsep|\footnote{Et non en insérant |@{}| de part et d'autre du préambule, ce qui fait que la
-  longueur des |\hline| n'est pas modifiée et elle peut paraître trop longue, surtout avec des crochets.}.
-L'extension \pkg{nicematrix} fait de même dans \emph{tous} ses environnements y compris l'environnement
-|{NiceArray}|. Néanmoins, si l'utilisateur souhaite que l'environnement |{NiceArray}| se comporte par défaut comme
-l'environnement |{array}| de \pkg{array} (par exemple pour faciliter l'adaptation d'un document existant), il peut
-contrôler ce comportement avec l'option |exterior-arraycolsep| accessible via la commande |\NiceMatrixOptions|.
-Avec cette option, des espaces extérieurs de longueur |\arraycolsep| seront insérés dans les environnements
-|{NiceArray}| (les autres environnements de l'extension \pkg{nicematrix} ne sont pas affectés).
+L'environnement |{array}| insère un espace horizontal égal à |\arraycolsep|
+avant et après chaque colonne. En particulier, il y a un espace égal à
+|\arraycolsep| avant et après le tableau. Cette caractéristique de
+l'environnement |{array}| n'était probablement pas une bonne idée\footnote{Dans
+  la documentation de |{amsmath}|, on peut lire : {\itshape The extra space of
+    |\arraycolsep| that \pkg{array} adds on each side is a waste so we remove it
+    [in |{matrix}|] (perhaps we should instead remove it from array in general,
+    but that's a harder task).}}. L'environnement |{matrix}| et ses variantes
+(|{pmatrix}|, |{vmatrix}|, etc.) de \pkg{amsmath} préfèrent supprimer ces
+espaces avec des instructions explicites |\hskip -\arraycolsep|\footnote{Et non
+  en insérant |@{}| de part et d'autre du préambule, ce qui fait que la longueur
+  des |\hline| n'est pas modifiée et elle peut paraître trop longue, surtout
+  avec des crochets.}. L'extension \pkg{nicematrix} fait de même dans
+\emph{tous} ses environnements y compris l'environnement |{NiceArray}|.
+Néanmoins, si l'utilisateur souhaite que l'environnement |{NiceArray}| se
+comporte par défaut comme l'environnement |{array}| de \pkg{array} (par exemple
+pour faciliter l'adaptation d'un document existant), il peut contrôler ce
+comportement avec l'option |exterior-arraycolsep| accessible via la commande
+|\NiceMatrixOptions|. Avec cette option, des espaces extérieurs de longueur
+|\arraycolsep| seront insérés dans les environnements |{NiceArray}| (les autres
+environnements de l'extension \pkg{nicematrix} ne sont pas affectés).
 
 
 
@@ -3086,7 +3446,8 @@
 
 Une matrice de permutation.\par\nobreak
 
-À titre d'exemple, on a augmenté la valeur du paramètre |xdots/shorten|.\par\nobreak 
+À titre d'exemple, on a augmenté la valeur du paramètre
+|xdots/shorten|.\par\nobreak
 
 
 \bigskip
@@ -3237,8 +3598,9 @@
 \subsection{Des lignes pointillées qui ne sont plus pointillées}
 
 
-L'option |line-style| permet de changer le style des lignes tracées par |\Ldots|, |\Cdots|, etc. On peut de ce fait
-tracer des lignes qui ne sont plus pointillées.
+L'option |line-style| permet de changer le style des lignes tracées par
+|\Ldots|, |\Cdots|, etc. On peut de ce fait tracer des lignes qui ne sont plus
+pointillées.
 
 \begin{Verbatim}
 \NiceMatrixOptions
@@ -3273,8 +3635,9 @@
 \subsection{Largeur des colonnes}
 
 \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.
+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.
 
 \bigskip
 \begin{BVerbatim}
@@ -3283,7 +3646,7 @@
  { last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax}
 \setlength{\extrarowheight}{1mm}
 $\begin{pNiceArray}{cccc:c}
-  1  1  1   1   1 ;
+  1  1  1   1   1 { } ;
   2  4  8  16   9 ;
   3  9 27  81  36 ;
   4 16 64 256 100 
@@ -3307,7 +3670,7 @@
 \setlength{\extrarowheight}{1mm}
 
 \enskip $\begin{pNiceArray}{cccc:c}
-1  1  1   1   1 ;
+1  1  1   1   1 { } ;
 2  4  8  16   9 ;
 3  9 27  81  36 ;
 4 16 64 256 100 
@@ -3366,8 +3729,9 @@
 \label{highlight}
 
 \medskip
-Les exemples suivants nécessitent d'avoir chargé Tikz (\pkg{nicematrix} ne charge que \textsc{pgf}) ainsi que la
-bibliothèque Tikz |fit|, ce qui peut se faire avec les deux instructions suivantes dans le préambule du document :
+Les exemples suivants nécessitent d'avoir chargé Tikz (\pkg{nicematrix} ne
+charge que \textsc{pgf}) ainsi que la bibliothèque Tikz |fit|, ce qui peut se
+faire avec les deux instructions suivantes dans le préambule du document :
 
 \begin{verbatim}
 \usepackage{tikz}
@@ -3377,13 +3741,15 @@
 
 
 \medskip
-Pour mettre en évidence une case, il est possible de «dessiner» l'un des nœuds (le «nœud normal», le «nœud moyen»
-ou le «nœud large»). Dans l'exemple suivant, on utilise les «nœuds larges» de la diagonale de la matrice (avec la
-clé de Tikz «|name suffix|», il est facile d'utiliser les «nœuds larges»). 
+Pour mettre en évidence une case, il est possible de «dessiner» l'un des nœuds
+(le «nœud normal», le «nœud moyen» ou le «nœud large»). Dans l'exemple suivant,
+on utilise les «nœuds larges» de la diagonale de la matrice (avec la clé de Tikz
+«|name suffix|», il est facile d'utiliser les «nœuds larges»).
 
-Nous redessinons les nœuds avec de nouveaux nœuds en utilisant la bibliothèque \pkg{fit} de Tikz. Comme nous
-voulons recréer des nœuds identiques aux premiers, nous devons fixer |inner sep = 0pt| (si on ne fait
-pas cela, les nouveaux nœuds seront plus grands que les nœuds d'origine créés par \pkg{nicematrix}).
+Nous redessinons les nœuds avec de nouveaux nœuds en utilisant la bibliothèque
+\pkg{fit} de Tikz. Comme nous voulons recréer des nœuds identiques aux premiers,
+nous devons fixer |inner sep = 0pt| (si on ne fait pas cela, les nouveaux nœuds
+seront plus grands que les nœuds d'origine créés par \pkg{nicematrix}).
 
 \label{exemple-CodeAfter}
 
@@ -3419,18 +3785,22 @@
 \end{tikzpicture}
 \end{pNiceArray}\]
 
-On remarquera que les traits que l'on vient de tracer sont dessinés \emph{après} la matrice sans modifier la
-position des composantes de celle-ci. En revanche, les traits tracés par |\hline|, le spécificateur «\verb+|+» ou
-les options |hlines|, |vlines| et |hvlines| «écartent» les composantes de la matrice.\footnote{Pour la commande
-  |\cline|, voir la remarque p.~\pageref{remark-cline}.}
+On remarquera que les traits que l'on vient de tracer sont dessinés \emph{après}
+la matrice sans modifier la position des composantes de celle-ci. En revanche,
+les traits tracés par |\hline|, le spécificateur «\verb+|+» ou les options
+|hlines|, |vlines| et |hvlines| «écartent» les composantes de la
+matrice.\footnote{Pour la commande |\cline|, voir la remarque
+  p.~\pageref{remark-cline}.}
 
-\vspace{1cm}
-Il est possible de colorier une rangée avec |\rowcolor| dans le |code-before| (ou avec |\rowcolor| de
-\pkg{colortbl} dans la première case de la rangée ). Les possibilités de réglages sont néanmoins limitées. C'est
-pourquoi nous présentons ici une autre méthode pour surligner une rangée de la matrice. Nous créons un nœud Tikz 
-rectangulaire qui englobe les nœuds de la deuxième rangée en utilisant les outils de la bibliothèque Tikz
-\pkg{fit}. Ce nœud est rempli après la construction de la matrice. Pour que l'on puisse voir le texte \emph{sous}
-le nœud, nous devons utiliser la transparence avec le |blend mode| égal à |multiply|.
+\vspace{1cm} Il est possible de colorier une rangée avec |\rowcolor| dans le
+|code-before| (ou avec |\rowcolor| de \pkg{colortbl} dans la première case de la
+rangée ). Les possibilités de réglages sont néanmoins limitées. C'est pourquoi
+nous présentons ici une autre méthode pour surligner une rangée de la matrice.
+Nous créons un nœud Tikz rectangulaire qui englobe les nœuds de la deuxième
+rangée en utilisant les outils de la bibliothèque Tikz \pkg{fit}. Ce nœud est
+rempli après la construction de la matrice. Pour que l'on puisse voir le texte
+\emph{sous} le nœud, nous devons utiliser la transparence avec le |blend mode|
+égal à |multiply|.
 
 
 \tikzset{highlight/.style={rectangle,
@@ -3464,9 +3834,10 @@
 
 
 \bigskip
-Ce code échoue avec |latex|-|dvips|-|ps2pdf| parce que Tikz pour |dvips|, pour le moment, ne prend pas en charge
-les \emph{blend modes}. Néanmoins, le code suivant, dans le préambule du document LaTeX, devrait activer les
-\emph{blend modes} pour ce mode de compilation.
+Ce code échoue avec |latex|-|dvips|-|ps2pdf| parce que Tikz pour |dvips|, pour
+le moment, ne prend pas en charge les \emph{blend modes}. Néanmoins, le code
+suivant, dans le préambule du document LaTeX, devrait activer les \emph{blend
+  modes} pour ce mode de compilation.
 
 
 \begin{scope} \small
@@ -3485,11 +3856,12 @@
 |\ExplSyntaxOff|
 \end{scope}
 
-\vspace{1cm}
-On rappelle que dans le cas d'un ensemble de cases fusionnées (avec la commande |\Block|), un nœud Tikz est créé
-pour l'ensemble des cases avec pour nom $i$|-|$j$|-block| où $i$ et $j$ sont les numéros de ligne et de colonne de
-la case en haut à gauche (où a été utilisée la commande |\Block|). Si on a demandé la création des nœuds |medium|,
-alors un nœud de ce type est aussi créé pour ce bloc avec un nom suffixé par |-medium|.
+\vspace{1cm} On rappelle que dans le cas d'un ensemble de cases fusionnées (avec
+la commande |\Block|), un nœud Tikz est créé pour l'ensemble des cases avec pour
+nom $i$|-|$j$|-block| où $i$ et $j$ sont les numéros de ligne et de colonne de
+la case en haut à gauche (où a été utilisée la commande |\Block|). Si on a
+demandé la création des nœuds |medium|, alors un nœud de ce type est aussi créé
+pour ce bloc avec un nom suffixé par |-medium|.
 
 
 
@@ -3561,7 +3933,8 @@
 \end{pNiceArray}\]
 
 \medskip
-Le résultat peut paraître décevant. On peut l'améliorer en utilisant les «nœuds moyens» au lieu des «nœuds normaux».
+Le résultat peut paraître décevant. On peut l'améliorer en utilisant les «nœuds
+moyens» au lieu des «nœuds normaux».
 
 \begin{Verbatim}
 \begin{tikzpicture}[mes-options, ~emphase#name suffix = -medium@]
@@ -3594,7 +3967,8 @@
                           
 \vspace{1cm}
 
-Dans l'exemple suivant, on utilise les «nœuds larges» pour surligner une zone de la matrice.\par\nobreak
+Dans l'exemple suivant, on utilise les «nœuds larges» pour surligner une zone de
+la matrice.\par\nobreak
 \begin{Verbatim}
 \begin{pNiceArray}{>{\strut}cccc}[create-large-nodes,margin,extra-margin=2pt]
   A_{11} & A_{12} & A_{13} & A_{14} \\
@@ -3634,8 +4008,9 @@
 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.
+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}
@@ -3737,8 +4112,9 @@
 
 \section*{Autre documentation}
 
-Le document |nicematrix.pdf| (fourni avec l'extension \pkg{nicematrix}) contient une traduction anglaise de la
-documentation ici présente, ainsi que le code source commenté et un historique des versions.
+Le document |nicematrix.pdf| (fourni avec l'extension \pkg{nicematrix}) contient
+une traduction anglaise de la documentation ici présente, ainsi que le code
+source commenté et un historique des versions.
 
 \end{document}
 

Modified: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2020-07-31 21:45:10 UTC (rev 56007)
+++ trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2020-07-31 21:45:27 UTC (rev 56008)
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{5.0}
-\def\myfiledate{2020/07/15}
+\def\myfileversion{5.1}
+\def\myfiledate{2020/07/31}
 %
 %
 %<*batchfile>
@@ -191,7 +191,7 @@
 % \bigskip
 % {\bfseries \color{red} Important
 %
-% In this version 5.0 of \pkg{nicematrix}, one must use the letters |l|, |c| and
+% Since the version 5.0 of \pkg{nicematrix}, one must use the letters |l|, |c| and
 % |r| in the preambles of the environments and no longer the letters |L|, |C| and
 % |R|.
 %
@@ -212,12 +212,12 @@
 % \begin{ttfamily}
 % \setlength{\tabcolsep}{3mm}
 % \begin{tabular}{llll}
-% \{NiceTabular\} & \{NiceArray\}  & \{NiceMatrix\}   \\
-%                 & \{pNiceArray\} & \{pNiceMatrix\}  \\
-%                 & \{bNiceArray\} & \{bNiceMatrix\}  \\
-%                 & \{BNiceArray\} & \{BNiceMatrix\}  \\
-%                 & \{vNiceArray\} & \{vNiceMatrix\}  \\
-%                 & \{VNiceArray\} & \{VNiceMatrix\}  
+% \{NiceTabular\}  & \{NiceArray\}  & \{NiceMatrix\}   \\
+% \{NiceTabular*\} & \{pNiceArray\} & \{pNiceMatrix\}  \\
+%                  & \{bNiceArray\} & \{bNiceMatrix\}  \\
+%                  & \{BNiceArray\} & \{BNiceMatrix\}  \\
+%                  & \{vNiceArray\} & \{vNiceMatrix\}  \\
+%                  & \{VNiceArray\} & \{VNiceMatrix\}  
 % \end{tabular}
 % \end{ttfamily}
 %
@@ -225,14 +225,10 @@
 % 
 %
 % \medskip
-% The environments |{NiceArray}| and |{NiceTabular}| are similar to the
-% environments |{array}| and |{tabular}| of the package \pkg{array} (which is
-% loaded by \pkg{nicematrix}).
+% The environments |{NiceArray}|, |{NiceTabular}| and |{NiceTabular*}| are
+% similar to the environments |{array}|, |{tabular}| and |{tabular*}| of the
+% package \pkg{array} (which is loaded by \pkg{nicematrix}).
 %
-% However, in |{NiceArray}| (and its variants), the columns of type |w| (e.g.:
-% |wc{1cm}|) are composed in math mode whereas, in |{array}| of \pkg{array},
-% they are composed in text mode.
-%
 % \medskip
 % The environments |{pNiceArray}|, |{bNiceArray}|, etc. have no equivalent in
 % \pkg{array}. 
@@ -318,7 +314,7 @@
 % \section{The vertical position of the arrays}
 %
 % The package \pkg{nicematrix} provides a option |baseline| for the vertical
-% position of the arrays. This option takes as value an integer which is the
+% position of the arrays. This option takes in as value an integer which is the
 % number of the row on which the array will be aligned.
 %
 % \medskip
@@ -348,8 +344,7 @@
 % immediately after an |\item| of list. One should remark that the presence of a
 % |\hline| at the beginning of the array doesn't prevent the alignment of the
 % baseline with the baseline of the first row (with |{tabular}| or |{array}| of
-% \pkg{array}, one must use |\firsthline|\footnote{It's also possible to use
-% |\firsthline| in the environments of \pkg{nicematrix}.}).
+% \pkg{array}, one must use |\firsthline|.
 %
 % \medskip
 % \begin{BVerbatim}[baseline=c,boxwidth=9cm]
@@ -545,61 +540,81 @@
 % \section{The rules}
 % 
 % The usual techniques for the rules may be used in the environments of
-% \pkg{nicematrix} (excepted |\vline|).
+% \pkg{nicematrix} (excepted |\vline|). However, there is some small differences
+% with the classical environments.
 %
+% \bigskip
+% \subsection{Some differences with the classical environments}
 % 
-% \subsection{The thickness and the color of the rules}
-% 
-% The environments of \pkg{nicematrix} provide a key |rules/width| to set the
-% width (in fact the thickness) of the rules in the current environment. In
-% fact, this key merely sets the value of the length |\arrayrulewidth|.
-% 
-% \smallskip
-% It's well known that \pkg{colortbl} provides the command |\arrayrulecolor| in
-% order to specify the color of the rules.
+% \subsubsection{The vertical rules}
 %
-% \smallskip
-% With \pkg{nicematrix}, it's possible to specify the color of the rules even
-% when \pkg{colortbl} is not loaded. For sake of compatibility, the command is
-% also named |\arrayrulecolor|. The environments of \pkg{nicematrix} also
-% provide a key |rules/color| to fix the color of the rules in the current
-% environment.
-% 
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
-% \hline
-% rose & tulipe & lys \\
-% arum & iris & violette \\
-% muguet & dahlia & souci \\
-% \hline
+% In the environments of \pkg{nicematrix}, the vertical rules specified by
+% \verb+|+ in the preambles of the environments are never broken, even by an
+% incomplete row or by a double horizontal rule specified by |\hline\hline|
+% (there is no need to use \pkg{hhline}). \footnote{This is the behaviour since
+% the version 5.1 of \pkg{nicematrix}. Prior to that version, the behaviour was
+% the standard behaviour of \pkg{array}.}
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{|c|c|} \hline
+% First & Second \\ ~emphase#\hline\hline@
+% Peter \\ \hline
+% Mary & George\\ \hline
 % \end{NiceTabular}
 % \end{BVerbatim}
-% \begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
-% \hline
-% rose & tulipe & lys \\
-% arum & iris & violette \\
-% muguet & dahlia & souci \\
-% \hline
+% \begin{NiceTabular}{|c|c|}[c] \hline
+% First & Second \\ \hline\hline
+% Peter \\ \hline
+% Mary  & George \\ \hline
 % \end{NiceTabular}
-% \end{scope}
 %
+% \bigskip
+% If you use \pkg{booktabs} (which provides |\toprule|, |\midrule|,
+% |\bottomrule|, etc.) and if you really want to add vertical rules (which is
+% not in the spirit of \pkg{booktabs}), you should notice that the vertical rules
+% drawn by \pkg{nicematrix} are compatible with \pkg{booktabs}.
+%
 % \medskip
-% If one wishes to define new specifiers for columns in order to draw vertical
-% rules (for example with a specific color or thicker than the standard rules),
-% he should consider the command |\OnlyMainNiceMatrix| described on
-% page~\pageref{OnlyMainNiceMatrix}.
+% \begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
+% $\begin{NiceArray}{~emphase#|cccc|@} \toprule
+% a & b & c & d \\ \midrule
+% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 \\ \bottomrule
+% \end{NiceArray}$
+% \end{BVerbatim}
+% $\begin{NiceArray}{|cccc|}
+% \toprule
+% a & b & c & d \\
+% \midrule
+% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 \\
+% \bottomrule
+% \end{NiceArray}$
+% 
+% \bigskip
+% However, it's still possible to define a specifier (named, for instance, |I|)
+% to draw vertical rules with the standard behaviour of \pkg{array}.
 %
+% \begin{Verbatim}
+% \newcolumntype{I}{!{\vrule}}
+% \end{Verbatim}
+%
+% However, in this case, it is probably more clever to add a command
+% |\OnlyMainNiceMatrix| (cf. p.~\pageref{OnlyMainNiceMatrix}):
+% \begin{Verbatim}
+% \newcolumntype{I}{!{\OnlyMainNiceMatrix{\vrule}}}
+% \end{Verbatim}
+%
 % 
 % \bigskip
-% \subsection{A remark about \textbackslash cline}
+% \subsubsection{The command \textbackslash cline}
 %
 %\label{remark-cline}
 %
 % The horizontal and vertical rules drawn by |\hline| and the specifier
-% ``\verb+|+'' make the array larger or wider by a quantity equal to the width of the rule.
+% ``\verb+|+'' make the array larger or wider by a quantity equal to the width
+% of the rule (with \pkg{array} and also with \pkg{nicematrix}).
 %
 % \smallskip
 % For historical reasons, this is not the case with the command |\cline|, as
@@ -647,6 +662,53 @@
 % \end{NiceTabular}
 % \end{scope}
 %
+% 
+% \subsection{The thickness and the color of the rules}
+% 
+% The environments of \pkg{nicematrix} provide a key |rules/width| to set the
+% width (in fact the thickness) of the rules in the current environment. In
+% fact, this key merely sets the value of the length |\arrayrulewidth|.
+% 
+% \smallskip
+% It's well known that \pkg{colortbl} provides the command |\arrayrulecolor| in
+% order to specify the color of the rules.
+%
+% \smallskip
+% With \pkg{nicematrix}, it's possible to specify the color of the rules even
+% when \pkg{colortbl} is not loaded. For sake of compatibility, the command is
+% also named |\arrayrulecolor|. The environments of \pkg{nicematrix} also
+% provide a key |rules/color| to fix the color of the rules in the current
+% environment.
+% 
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+% \begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
+% \hline
+% rose & tulipe & lys \\
+% arum & iris & violette \\
+% muguet & dahlia & souci \\
+% \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
+% \hline
+% rose & tulipe & lys \\
+% arum & iris & violette \\
+% muguet & dahlia & souci \\
+% \hline
+% \end{NiceTabular}
+% \end{scope}
+%
+% \medskip
+% If one wishes to define new specifiers for columns in order to draw vertical
+% rules (for example with a specific color or thicker than the standard rules),
+% he should consider the command |\OnlyMainNiceMatrix| described on
+% page~\pageref{OnlyMainNiceMatrix}.
+%
+% 
+%
 % \subsection{The keys hlines and vlines}
 % 
 % The key |hlines| draws all the horizontal rules and the key |vlines| draws all
@@ -668,54 +730,8 @@
 % 1 & 2 & 3 & 4 & 5 & 6 
 % \end{pNiceMatrix}$
 %
-% \bigskip
-% However, there is a difference between the key |vlines| and the use of
-% the specifier ``"|"'' in the preamble of the environment: the rules drawn by
-% |vlines| completely cross the double-rules drawn by |\hline\hline| (you don't
-% need \pkg{hhline}).
 %
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11.5cm]
-% $\begin{NiceMatrix}[~emphase#vlines@] \hline
-% a & b & c & d \\ \hline \hline
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\ \hline
-% \end{NiceMatrix}$
-% \end{BVerbatim}
-% $\begin{NiceMatrix}[vlines]
-% \hline
-% a & b & c & d \\
-% \hline \hline
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
-% \hline
-% \end{NiceMatrix}$
 %
-%
-% \bigskip 
-% If you use \pkg{booktabs} (which provides |\toprule|, |midrule|, |bottomrule|,
-% etc.) and you really want to draw vertical rules (something opposed to the
-% spirit of \pkg{booktabs}), you should remark that the key |vlines| in
-% compatible with \pkg{booktabs}.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11.5cm]
-% $\begin{NiceMatrix}[~emphase#vlines@] \toprule
-% a & b & c & d \\ \midrule
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\ \bottomrule
-% \end{NiceMatrix}$
-% \end{BVerbatim}
-% $\begin{NiceMatrix}[vlines]
-% \toprule
-% a & b & c & d \\
-% \midrule
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
-% \bottomrule
-% \end{NiceMatrix}$
-%
-%
 % \subsection{The key hvlines}
 % \label{hvlines}
 %
@@ -888,37 +904,54 @@
 % \emph{Remark} : In the package \pkg{array} (on which the package
 % \pkg{nicematrix} relies), horizontal and vertical rules make the array larger
 % or wider by a quantity equal to the width of the rule\footnote{In fact, this
-% is true only for |\hline| and ``"|"'' but not for |\cline|.}. In
-% \pkg{nicematrix}, the dotted lines drawn by |\hdottedline| and ``|:|'' do
-% likewise. 
+% is true only for |\hline| and ``"|"'' but not for |\cline|: cf
+% p.~\pageref{remark-cline}}. In \pkg{nicematrix}, the dotted lines drawn by
+% |\hdottedline| and ``|:|'' do likewise.
 %
 %
 %
 %\section{The color of the rows and columns}
 %
-% With the classical package \pkg{colortbl}, it's possible to color the cells,
-% rows and columns of a tabular. However, the resulting \textsc{pdf} is not
-% always perfectly displayed by the \textsc{pdf} viewers, in particular in
-% conjonction with rules. With some \textsc{pdf} viewers, some vertical rules
-% seem to vanish. On the other side, some thin horizontal white lines may appear
-% in some circonstances.
+% \subsection{Utilisation of colortbl}
 %
+% We recall that the package \pkg{colortbl} can be loaded directly with
+% |\usepackage{colortbl}| or by loading \pkg{xcolor} with the key |table|:
+% |\usepackage[table]{xcolor}|. 
 %
 % \medskip
-% The package \pkg{nicematrix} provides similar tools which do not present these
-% drawbacks. It provides a key |code-before|\footnote{There is also a key
-% |code-after| : see p.~\pageref{code-after}.} for some code which will be
-% executed \emph{before} the drawing of the tabular. In this |code-before|, new
+% Since the package \pkg{nicematrix} is based on \pkg{array}, it's possible to
+% use \pkg{colortbl} with \pkg{nicematrix}.
+%
+% \medskip
+% However, there is two drawbacks:
+% \begin{itemize}
+% \item The package \pkg{colortbl} patches \pkg{array}, leading to some
+% incompatibilities (for example with the command |\hdotsfor|).
+%
+% \item The package \pkg{colortbl} constructs the array row by row, alterning
+% colored rectangles, rules and contents of the cells. The resulting
+% \textsc{pdf} is difficult to interpret by some \textsc{pdf} viewers and may
+% lead to artefacts on the screen : some rules seem to disappear and on the
+% other side, some thin white lines appear. The package \pkg{nicematrix}
+% provides some tools without those drawbacks.
+% \end{itemize}
+%
+% \subsection{The tools of nicematrix in the code-before}
+%
+% The package \pkg{nicematrix} provides some tools (independent of
+% \pkg{colortbl}) to draw the colored panels first, and, then, the content
+% of the cells and the rules. This strategy is more conform to the ``painting
+% model'' of the formats PostScript and \textsc{pdf} and is more suitable for
+% the \textsc{pdf} viewers. However, it requires several compilations.
+% 
+% \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|.
-% \label{code-before} 
+% \label{code-before}
 %
 % \medskip
-% These commands are independent of \pkg{colortbl}.\footnote{Thus, it's possible
-% to color the rules, the cells, the rows, the columns, etc. without loading
-% \pkg{colortbl}.} 
-% 
-% \medskip
 % All these commands accept an optional argument (between square brackets and
 % in first position) which is the color model for the specification of the colors.
 % 
@@ -927,8 +960,8 @@
 % \item The command |\cellcolor| takes its name from the command |\cellcolor| of
 % \pkg{colortbl}.
 %
-% This command takes in mandatory arguments a color and a list of cells, each of
-% which with the format $i$-$j$ where $i$ is the number of row and $j$ the
+% This command takes in as mandatory arguments a color and a list of cells, each
+% of which with the format $i$-$j$ where $i$ is the number of row and $j$ the
 % number of colummn of the cell.
 %
 %
@@ -1027,7 +1060,7 @@
 % \bigskip
 % \item The command |\rowcolors| (with a \emph{s}) takes its name from the
 % command |\rowcolors| of \pkg{xcolor}\footnote{The command |\rowcolors| of
-% \pkg{color} is available when \pkg{xcolor} is loaded with the
+% \pkg{xcolor} is available when \pkg{xcolor} is loaded with the
 % option~|table|.}. The \emph{s} emphasizes the fact that there is \emph{two}
 % colors. This command colors alternately the rows of the tabular, beginning
 % with the row whose number is given in first (mandatory) argument. The two
@@ -1057,8 +1090,8 @@
 % \end{scope}
 % 
 % \bigskip
-% \item The command |\chessboardcolors| takes in mandatory arguments two colors
-% and colors the cells of the tabular in quincunx with these colors.
+% \item The command |\chessboardcolors| takes in as mandatory arguments two colors
+% and it colors the cells of the tabular in quincunx with these colors.
 %
 % \medskip
 % \begin{scope}
@@ -1091,7 +1124,7 @@
 % \begin{scope}
 % \hfuzz=10cm
 % \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
-% \begin{NiceTabular}[c]{lssss}%
+% \begin{NiceTabular}[c]{lSSSS}%
 % [code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}]
 % ~emphase#\toprule@
 % \Block{2-1}{Product} \\
@@ -1108,7 +1141,7 @@
 % ~emphase#\bottomrule@
 % \end{NiceTabular}
 % \end{BVerbatim}
-% \begin{NiceTabular}[c]{lssss}[code-before = \rowcolor{red!15}{1-2} 
+% \begin{NiceTabular}[c]{lSSSS}[code-before = \rowcolor{red!15}{1-2} 
 % \rowcolors{3}{blue!15}{}]
 % \toprule
 % \Block{2-1}{Product} & 
@@ -1129,15 +1162,63 @@
 % \medskip 
 % We have used the type of column |S| of \pkg{siunitx}.
 %
+%
+% \subsection{Color tools with the syntax of colortbl}
+%
+% It's possible to access the preceding tools with a syntax close to the syntax
+% of \pkg{colortbl}. For that, one must use the key |colortbl-like| in the
+% current environment.\footnote{As of now, this key is not available in |\NiceMatrixOptions|.}
+%
+% There are three commands available (they are inspired by \pkg{colortbl} but
+% are \emph{independent} of \pkg{colortbl}):
+% \begin{itemize}
+% \item |\cellcolor| which colorizes a cell;
+% \item |\rowcolor| which must be used in a cell and which colorizes the end of
+% the row;
+% \item |\columncolor| which must be used in the preamble of the environment
+% with the same syntax as the corresponding command of
+% \pkg{colortbl}\footnote{Unlike the command |\columncolor| of \pkg{colortbl},
+% this command |\columncolor| can appear within another command, itself used in the
+% preamble.}. 
+% \end{itemize}
+%
+% \medskip
+% \begin{Verbatim}
+% \begin{NiceTabular}[colortbl-like]{>{~emphase#\columncolor{blue!15}}@ccc}
+% \toprule
+% ~emphase#\rowcolor{red!15}@
+% Last name & First name & Birth day \\
+% \midrule
+% Achard & Jacques & 5 juin 1962 \\
+% Lefebvre & Mathilde & 23 mai 1988 \\
+% Vanesse & Stephany & 30 octobre 1994 \\
+% Dupont & Chantal & 15 janvier 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{Verbatim}
+%
+%
+% \begin{center}
+% \begin{NiceTabular}[colortbl-like]{>{\columncolor{blue!15}}ccc}
+% \toprule
+% \rowcolor{red!15}
+% Last name & First name & Birth day \\
+% \midrule
+% Achard  & Jacques & 5 juin 1962 \\
+% Lefebvre & Mathilde & 23 mai 1988 \\
+% Vanesse & Stephany & 30 octobre 1994 \\
+% Dupont & Chantal & 15 janvier 1998 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{center}
+%
+%
 % \section{The width of the columns}
 % \label{width}
 %
 % In the environments with an explicit preamble (like |{NiceTabular}|,
 % |{NiceArray}|, etc.), it's possible to fix the width of a given column with
-% the standard letters |w| and |W| of the package \pkg{array}. In
-% |{NiceTabular}|, the cells of such columns are composed in text mode but, in
-% |{NiceArray}|, |{pNiceArray}|, etc., they are composed in math mode (whereas,
-% in |{array}| of \pkg{array}, they are composed in text mode).
+% the standard letters |w| and |W| of the package \pkg{array}. 
 % 
 % \medskip
 % \begin{BVerbatim}[baseline=c,boxwidth=9cm]
@@ -1486,10 +1567,8 @@
 % \end{bNiceMatrix}$
 % 
 % \bigskip
-% In the first column of this exemple, there are two instructions |\Vdots| but
-% only one dotted line is drawn (there is no overlapping graphic objects in the
-% resulting \textsc{pdf}\footnote{And it's not possible to draw a |\Ldots| and a
-% |\Cdots| line between the same cells.}).
+% In the first column of this exemple, there are two instructions |\Vdots| but,
+% of course, only one dotted line is drawn.
 %
 % \bigskip
 % In fact, in this example, it would be possible to draw the same matrix more
@@ -1616,7 +1695,7 @@
 %
 %
 %
-% \subsection{The command \textbackslash Hdotsfor}
+% \subsection{The commands \textbackslash Hdotsfor and \textbackslash Vdotsfor}
 %
 % Some people commonly use the command |\hdotsfor| of \pkg{amsmath} in order to
 % draw horizontal dotted lines in a matrix. In the environments of
@@ -1668,6 +1747,44 @@
 % |\Hdotsfor| may be used when the package \pkg{colortbl} is loaded (but you
 % might have problem if you use |\rowcolor| on the same row as |\Hdotsfor|).
 % 
+% \bigskip
+% The package \pkg{nicematrix} also provides a command |\Vdotsfor| similar to
+% |\Hdotsfor| but for the vertical dotted lines.
+% \bigskip
+% The following example uses both |\Hdotsfor| and |\Vdotsfor|:
+%
+% \begin{Verbatim}[formatcom=\small\color{gray}]
+% \begin{bNiceMatrix}
+% 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 
+%   & ~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}@ \\
+% 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 
+%   & ~emphase#\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)}]
+% \end{bNiceMatrix}
+% \end{Verbatim}
+%
+%
+% \[\begin{bNiceMatrix}
+% 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} \\
+% 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)}]
+% \end{bNiceMatrix}\]
+
+
+
+% 
 % \subsection{How to generate the continuous dotted lines transparently}
 %
 % The package \pkg{nicematrix} provides an option called |transparent| for using
@@ -1995,7 +2112,8 @@
 % \begin{itemize}
 % \item If you have several successive commands |\tabularnote{...}| \emph{with no
 % space at all between them}, the labels of the corresponding notes are composed
-% together, separated by commas.
+% together, separated by commas (this is similar to the option |multiple| of
+% \pkg{footmisc} for the footnotes).
 %
 % \item If a command |\tabularnote{...}| is exactly at the end of a cell (with
 % no space at all after), the label of the note is composed in an overlapping
@@ -2086,7 +2204,7 @@
 % \item |notes/code-before|
 % \end{itemize}
 % For sake of commodity, it is also possible to set these keys in
-% |\NiceMatrixOptions| via a key |notes| which takes as value a list of 
+% |\NiceMatrixOptions| via a key |notes| which takes in as value a list of 
 % pairs \textsl{key=value} where the name of the keys need no longer be
 % prefixed by |notes|:
 % \begin{center}
@@ -2191,7 +2309,7 @@
 % corresponds to the type of list used when the option |para| is in force. Of
 % course, when the option |para| is used, a list of type |inline| (as called by
 % \pkg{enumitem}) is used and the pairs \textsl{key=value} should correspond to
-% such a list of type |inline| . 
+% such a list of type |inline|. 
 %
 % Initial value:\quad |afterlabel = \nobreak, itemjoin = \quad|
 %
@@ -2270,9 +2388,8 @@
 % \label{key-R}
 %
 % The environments without preamble (|{NiceMatrix}|, |{pNiceMatrix}|,
-% |{bNiceMatrix}|, etc.) provide two options |l| and |r| (equivalent at |L| and
-% |R|) which generate all the columns aligned leftwards (or
-% rightwards).
+% |{bNiceMatrix}|, etc.) provide two options |l| and |r| which generate all the
+% columns aligned leftwards (or rightwards).
 % 
 %
 % \medskip
@@ -2451,7 +2568,7 @@
 % |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
 % |\VAutoNiceMatrix| and |\BAutoNiceMatrix|.
 %
-% These commands take two mandatory arguments. The first is the format of the
+% These commands take in two mandatory arguments. The first is the format of the
 % matrix, with the syntax $n$-$p$ where $n$ is the number of rows and $p$ the
 % number of columns. The second argument is the pattern (it's a list of tokens
 % which are inserted in each cell of the constructed matrix, excepted in the
@@ -2924,7 +3041,103 @@
 % 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
 % \end{NiceMatrix}\]
 %
+% \section{Tools for the developpers}
 %
+% As its name implies, the token list |\g_nicematrix_code_after_tl| is public
+% (according to the LaTeX3 conventions, each variable with name beginning with
+% |\g_nicematrix| ou |\l_nicematrix| is public and each variable with name
+% beginning with |\g__nicematrix| or |\l__nicematrix| is private).
+%
+%
+% \medskip
+% This variable contains the code of what we have called the ``|code-after|''.
+% The developper can use it to add code from a cell of the array (the
+% affectation must be global, allowing to exit the cell, which is a TeX group).
+%
+% \medskip
+% \emph{Example} : We want to write a command |\crossbox| to draw a cross in the
+% current cell. This command will take in an optional argument between square
+% brackets for a list of pairs \textsl{key}-\textsl{value} which will be given to
+% Tikz before the drawing.
+%
+% It's possible to program such command |\crossbox| as follows, explicitely
+% using the public variable |\g_nicematrix_code_after_tl|.
+%
+%
+% \begin{scope}
+% \fvset{commandchars=\§\¤\μ}
+% \begin{Verbatim}
+% \ExplSyntaxOn
+% \cs_new_protected:Nn \__pantigny_crossbox:nnn
+%   {
+%     \begin { tikzpicture }
+%     \draw [ #3 ] 
+%           ( row-#1 -| col-\int_eval:n { #2 + 1 } ) 
+%        -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) 
+%           ( row-#1 -| col-\int_eval:n #2 ) 
+%        -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; 
+%     \end { tikzpicture }
+%   }
+%
+%
+% \NewDocumentCommand \crossbox { ! O { } }
+%   {
+%     \tl_gput_right:Nx §emphase¤\g_nicematrix_code_after_tlμ
+%       { 
+%         \__pantigny_crossbox:nnn 
+%           { \int_use:c { c at iRow } } 
+%           { \int_use:c { c at jCol } }
+%           { \exp_not:n { #1 } }
+%       }
+%   }
+% \ExplSyntaxOff
+% \end{Verbatim}
+% \end{scope}
+%
+%
+% \ExplSyntaxOn
+% \cs_new_protected:Nn \__pantigny_crossbox:nnn
+%   {
+%     \begin { tikzpicture }
+%     \draw [ #3 ] 
+%           ( row-#1 -| col-\int_eval:n { #2 + 1 } ) 
+%        -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) 
+%           ( row-#1 -| col-\int_eval:n #2 ) 
+%        -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; 
+%     \end { tikzpicture }
+%   }
+%
+%
+% \NewDocumentCommand \crossbox { ! O { } }
+%   {
+%     \tl_gput_right:Nx \g_nicematrix_code_after_tl
+%       { 
+%         \__pantigny_crossbox:nnn 
+%           { \int_use:c { c at iRow } } 
+%           { \int_use:c { c at jCol } }
+%           { \exp_not:n { #1 } }
+%       }
+%   }
+% \ExplSyntaxOff
+%
+% \bigskip
+% Here is an example of utilisation:
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% \begin{NiceTabular}{ccc}[hvlines]
+% Tokyo & Paris & London \\
+% Cap Town & ~emphase#\crossbox[red]@ & Miami \\
+% Los Angeles & Madrid & Roma
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{ccc}[hvlines]
+% Tokyo & Paris & London \\
+% Cap Town & \crossbox[red] & Miami \\
+% Los Angeles & Madrid & Roma
+% \end{NiceTabular}
+%
+%
 % \section{Technical remarks}
 % 
 % \subsection{Definition of new column types}
@@ -2944,7 +3157,9 @@
 % \newcolumntype{?}{!{\OnlyMainNiceMatrix{\vrule width 1 pt}}}
 % \end{Verbatim}
 %
-% The heavy vertical rule won't extend in the exterior rows:
+% The heavy vertical rule won't extend in the exterior rows.\footnote{Of course,
+% such rule is defined by the classical technics of \pkg{nicematrix} and, for
+% this reason, won't cross the double rules of |\hline\hline|.}
 % \medskip
 % \begin{scope}
 % \newcolumntype{?}{!{\OnlyMainNiceMatrix{\vrule width 1 pt}}}
@@ -3128,8 +3343,8 @@
 %
 % \medskip
 % First, we write a command |\stars| similar the well-known commands 
-% |\arabic|, |\alph|, |\Alph|, etc. which produce a number of stars equal to its argument
-% \footnote{In fact: the value of its argument.}
+% |\arabic|, |\alph|, |\Alph|, etc. which produces a number of stars equal to
+% its argument \footnote{In fact: the value of its argument.}
 % \begin{Verbatim}
 % \ExplSyntaxOn
 % \NewDocumentCommand ~emphase#\stars@ { m }
@@ -3419,7 +3634,7 @@
 %  { last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax}
 % \setlength{\extrarowheight}{1mm}
 % $\begin{pNiceArray}{cccc:c}
-%   1  1  1   1   1 ;
+%   1  1  1   1   1 {} ;
 %   2  4  8  16   9 ;
 %   3  9 27  81  36 ;
 %   4 16 64 256 100 
@@ -3443,7 +3658,7 @@
 % \setlength{\extrarowheight}{1mm}
 %
 % \enskip $\begin{pNiceArray}{cccc:c}
-% 1  1  1   1   1 ;
+% 1  1  1   1   1 {} ;
 % 2  4  8  16   9 ;
 % 3  9 27  81  36 ;
 % 4 16 64 256 100 
@@ -3975,6 +4190,7 @@
 \cs_new_protected:Npn \@@_error:nn { \msg_error:nnn { nicematrix } }
 \cs_new_protected:Npn \@@_error:nnn { \msg_error:nnnn { nicematrix } }
 \cs_new_protected:Npn \@@_fatal:n { \msg_fatal:nn { nicematrix } }
+\cs_new_protected:Npn \@@_fatal:nn { \msg_fatal:nnn { nicematrix } }
 \cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { nicematrix } }
 \cs_new_protected:Npn \@@_msg_new:nnn { \msg_new:nnnn { nicematrix } }
 %    \end{macrocode}
@@ -4360,6 +4576,32 @@
   }
 %    \end{macrocode}
 %
+% \bigskip
+% The following regex will be used to modify the preamble of the array when the
+% key |colortbl-like| is used.
+%    \begin{macrocode}
+\regex_const:Nn \c_@@_columncolor_regex { \c { columncolor } } 
+%    \end{macrocode}
+% 
+% \bigskip
+% If the final user uses \pkg{nicematrix}, PGF/Tikz will write instruction
+% |\pgfsyspdfmark| in the |aux| file. If he changes its mind and no longer loads
+% \pkg{nicematrix}, an error may occur at the next compilation because of
+% remanent instructions |\pgfsyspdfmark| in the |aux| file. With the following
+% code, we avoid that situation.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_provide_pgfsyspdfmark:
+  {
+    \iow_now:Nn \@mainaux 
+      {
+        \ExplSyntaxOn
+        \cs_if_free:NT \pgfsyspdfmark
+          { \cs_set_eq:NN \pgfsyspdfmark \use:nnn }
+        \ExplSyntaxOff
+      }
+    \cs_gset_eq:NN \@@_provide_pgfsyspdfmark: \prg_do_nothing:
+  }
+%    \end{macrocode}
 %
 % \subsection*{Parameters}
 %
@@ -4380,7 +4622,7 @@
     \newcolumntype C c
     \newcolumntype R r
   }
-%    \end{document}
+%    \end{macrocode}
 % 
 % \bigskip 
 % The following counter will count the environments |{NiceArray}|. The value of
@@ -4419,7 +4661,7 @@
 %    \end{macrocode}
 % 
 % \bigskip
-% the following counter will count the environments |{NiceMatrixBlock}|.
+% The following counter will count the environments |{NiceMatrixBlock}|.
 %    \begin{macrocode}
 \int_new:N \g_@@_NiceMatrixBlock_int
 %    \end{macrocode}
@@ -4457,13 +4699,29 @@
 %    \end{macrocode}
 % 
 % \bigskip
-% If the user uses |{NiceTabular}|, we will raise the following flag.
+% If the user uses |{NiceTabular}| or |{NiceTabular*}|, we will raise the
+% following flag. 
 %    \begin{macrocode}
 \bool_new:N \l_@@_NiceTabular_bool
 %    \end{macrocode}
+%
+% \bigskip
+% If the user uses |{NiceTabular*}|, the width of the tabular (in the first
+% argument of the environment |{NiceTabular*}|) will be stored in the following
+% dimension.
+%    \begin{macrocode}
+\dim_new:N \l_@@_tabular_width_dim
+%    \end{macrocode}
 % 
 % \bigskip
+% If the user uses an environment without preamble, we will raise the following
+% flag.
 %    \begin{macrocode}
+\bool_new:N \l_@@_Matrix_bool
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
 \cs_new_protected:Npn \@@_test_if_math_mode:
   { 
     \if_mode_math: \else:
@@ -4512,15 +4770,15 @@
 % The following token list corresponds to the option |code-after| (it's also
 % possible to set the value of that parameter with the command |\CodeAfter|).
 %    \begin{macrocode}
-\tl_new:N \g_@@_code_after_tl
+\tl_new:N \g_nicematrix_code_after_tl
 %    \end{macrocode}
 % 
 % \bigskip
-% The following token list has a function similar to |\g_@@_code_after_tl| but
-% it is used internally by \pkg{nicematrix}. In fact, we have to distinguish
-% between |\g_@@_code_after_tl| and |\g_@@_internal_code_after_tl| because we
-% must take care of the order in which instructions stored in that paremeters
-% are executed.
+% 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
+% |\g_@@_internal_code_after_tl| because we must take care of the order in which
+% instructions stored in that paremeters are executed.
 %    \begin{macrocode}
 \tl_new:N \g_@@_internal_code_after_tl
 %    \end{macrocode}
@@ -4556,11 +4814,18 @@
 %    \end{macrocode}
 % 
 % \bigskip
-% The following flag will be raised when the key |code-before| is used in the
-% environment. Indeed, if there is a |code-before| in the environment, we will
-% manage to have the |row| nodes and the |col| nodes available \emph{before} the 
-% creation of the array.
+% |\l_@@_code_before_tl| may contain two types of informations:
+% \begin{itemize}
+% \item A |code-before| written in the |aux| file by a previous run. When the
+% |aux| file is read, this |code-before| is stored in
+% |\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|.
+% \end{itemize}
 %    \begin{macrocode}
+\tl_new:N \l_@@_code_before_tl
 \bool_new:N \l_@@_code_before_bool
 %    \end{macrocode} 
 % 
@@ -4640,8 +4905,20 @@
 % required by the key |hvlines| (these rules won't be drawn within the virtual
 % blocks corresponding to the dotted lines).
 %
-%
+% \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).
+%    \begin{macrocode}
+\int_new:N \g_@@_static_num_of_col_int
+%    \end{macrocode}
 % 
+% \medskip
+% Used for the color of the blocks.
+%    \begin{macrocode}
+\tl_new:N \l_@@_color_tl
+%    \end{macrocode}
+% 
 % \bigskip
 % \textbf{Variables for the exterior rows and columns}\par\nobreak
 %
@@ -4704,11 +4981,12 @@
 % \item \textbf{Last column}\par\nobreak
 %
 % For the potential ``last column'', we use an integer. A value of $-2$ means
-% that there is no last column. A value of $-1$ means that there is a last
-% column but we don't know its value because the user has used the option
-% |last-col| without value (it's possible in an environment without preamble
-% like |{pNiceMatrix}|). A value of $0$ means that the option |last-col| has
-% been used in an environment with preamble (like |{pNiceArray}|).
+% that there is no last column. A value of $-1$ means that we are in an
+% environment without preamble (e.g. |{bNiceMatrix}|) and there is a last column
+% but we don't know its value because the user has used the option |last-col|
+% without value. A value of $0$ means that the option |last-col| has been used
+% in an environment with preamble (like |{pNiceArray}|): in this case, the key
+% was necessary without argument.
 %    \begin{macrocode}
 \int_new:N \l_@@_last_col_int
 \int_set:Nn \l_@@_last_col_int { -2 }
@@ -4717,7 +4995,7 @@
 % However, we have also a boolean. Consider the following code: 
 % \begin{center}
 % \begin{BVerbatim}
-% \begin{pNiceArray}{CC}[last-col]
+% \begin{pNiceArray}{cc}[last-col]
 % 1 & 2 \\
 % 3 & 4
 % \end{pNiceArray}
@@ -4984,6 +5262,15 @@
 % \bigskip 
 % \subsection*{The options}
 % 
+% By default, the commands |\cellcolor| and |\rowcolor| are available for the
+% user in the cells of the tabular (the user may use the commands provided by
+% |\colortbl|). However, if the key |colortbl-like| is used, these
+% commands are available.
+%    \begin{macrocode}
+\bool_new:N \l_@@_colortbl_like_bool
+%    \end{macrocode}
+% 
+% \bigskip
 % By default, the behaviour of |\cline| is changed in the environments of
 % \pkg{nicematrix}: a |\cline| spreads the array by an amount equal to
 % |\arrayrulewidht|. It's possible to disable this feature with the key
@@ -5075,9 +5362,9 @@
 % \bigskip
 % The flag |\l_@@_hlines_bool| corresponds to the key |hlines|, the flag
 % |\l_@@_vlines_bool| to the key |vlines| and the flag |hvlines| to the key
-% |hvlines|. Since version 4.1, the key |hvlines| is no longer a mere alias for
-% the conjonction of |hlines| and |vlines|. Indeed, with |hvlines|, the vertical
-% and horizontal rules are \emph{not} drawn within the blocks (created by |\Block|).
+% |hvlines|. The key |hvlines| is not a mere alias for the conjonction of
+% |hlines| and |vlines|. Indeed, with |hvlines|, the vertical and horizontal
+% rules are \emph{not} drawn within the blocks (created by |\Block|).
 %    \begin{macrocode}
 \bool_new:N \l_@@_hlines_bool
 \bool_new:N \l_@@_vlines_bool
@@ -5295,7 +5582,7 @@
     extra-right-margin .dim_set:N = \l_@@_extra_right_margin_dim ,
     extra-margin .meta:n = 
       { extra-left-margin = #1 , extra-right-margin = #1 } ,
-    extra-margin .value_required:n = true 
+    extra-margin .value_required:n = true ,
   }
 %    \end{macrocode}
 %
@@ -5311,7 +5598,7 @@
       { 
         \tl_if_empty:nF { #1 } 
           {
-            \tl_set:Nn \l_@@_code_before_tl { #1 }
+            \tl_put_right:Nn \l_@@_code_before_tl { #1 }
             \bool_set_true:N \l_@@_code_before_bool 
           }
       } ,
@@ -5345,8 +5632,12 @@
           \str_set_eq:NN \l_@@_name_str \l_tmpa_str 
         } ,
     name .value_required:n = true ,
-    code-after .tl_gset:N = \g_@@_code_after_tl ,
+    code-after .tl_gset:N = \g_nicematrix_code_after_tl ,
     code-after .value_required:n = true ,
+    colortbl-like .code:n = 
+      \bool_set_true:N \l_@@_colortbl_like_bool 
+      \bool_set_true:N \l_@@_code_before_bool ,
+    colortbl-like .value_forbidden:n = true
   }
 %    \end{macrocode}
 %
@@ -5412,9 +5703,7 @@
 \keys_define:nn { NiceMatrix }
   { 
     NiceMatrixOptions .inherit:n = 
-      { 
-        NiceMatrix / Global ,
-      } ,
+      { NiceMatrix / Global } ,
     NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots ,
     NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules ,
     NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes ,
@@ -5556,8 +5845,6 @@
                          { \int_set:Nn \l_@@_last_col_int { #1 } } ,
     l .code:n = \tl_set:Nn \l_@@_type_of_col_tl l ,
     r .code:n = \tl_set:Nn \l_@@_type_of_col_tl r ,
-    L .code:n = \tl_set:Nn \l_@@_type_of_col_tl l ,
-    R .code:n = \tl_set:Nn \l_@@_type_of_col_tl r ,
     S .code:n = \bool_if:NTF \c_@@_siunitx_loaded_bool
                   { \tl_set:Nn \l_@@_type_of_col_tl S }
                   { \@@_error:n { option~S~without~siunitx } } ,
@@ -5900,17 +6187,34 @@
 % redefinition of |\array| incompatible with our use of |\array|. 
 %
 %    \begin{macrocode}
+\cs_new_protected:Npn \@@_revtex_array:
+  {
+    \cs_set_eq:NN \@acoll \@arrayacol 
+    \cs_set_eq:NN \@acolr \@arrayacol 
+    \cs_set_eq:NN \@acol \@arrayacol 
+    \cs_set:Npn \@halignto { }
+    \@array at array
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \cs_new_protected:Npn \@@_array:
   {
     \bool_if:NTF \c_@@_revtex_bool
+      \@@_revtex_array:
       { 
-        \cs_set_eq:NN \@acoll \@arrayacol 
-        \cs_set_eq:NN \@acolr \@arrayacol 
-        \cs_set_eq:NN \@acol \@arrayacol 
-        \cs_set:Npn \@halignto { }
-        \@array at array
+        \bool_if:NTF \l_@@_NiceTabular_bool
+          { \dim_set_eq:NN \col at sep \tabcolsep }
+          { \dim_set_eq:NN \col at sep \arraycolsep }
+        \dim_compare:nNnTF \l_@@_tabular_width_dim = \c_zero_dim
+          { \cs_set:Npn \@halignto { } }
+          { \cs_set:Npx \@halignto { to \dim_use:N \l_@@_tabular_width_dim } }
+%    \end{macrocode}
+% It \pkg{colortbl} is loaded, |\@tabarray| has been redefined to incorporate
+% |\CT at start|. 
+%    \begin{macrocode}
+        \@tabarray 
       }
-      \array
 %    \end{macrocode}
 % |\l_@@_baseline_str| may have the value |t|, |c| or |b|. However, if the value
 % is |b|, we compose the |\array| (of \pkg{array}) with the option |t| and the
@@ -6008,12 +6312,10 @@
 % \bigskip
 % The command |\@@_newcolumntype| is the command |\newcolumntype| of
 % \pkg{array} without the warnings for redefinitions of columns types (we will
-% use it to redefine the columns types |w|, |W|, |p|, |m| and |b|).
+% use it to redefine the columns types |w| and |W|).
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_newcolumntype #1
   {
-    % \cs_if_free:cT { NC @ find @ #1 } 
-    %   { \NC at list \exp_after:wN { \the \NC at list \NC at do #1 } }
     \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
     \peek_meaning:NTF [ 
       { \newcol@ #1 }
@@ -6023,31 +6325,29 @@
 % 
 %
 % \bigskip
-% The following command will be used to redefine the column types |p|, |m| and
-% |b|. That means that it will be used three times. The first argument is the
-% letter of the column type (|p|, |m| or |b|). The second is the letter of
-% position for the environment |{minipage}| (|t|, |c| or |b|).
+% When the key |renew-dots| is used, the following code will be executed.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_define_columntype:nn #1 #2
-  {
+\cs_set_protected:Npn \@@_renew_dots:
+  { 
+    \cs_set_eq:NN \ldots \@@_Ldots
+    \cs_set_eq:NN \cdots \@@_Cdots
+    \cs_set_eq:NN \vdots \@@_Vdots
+    \cs_set_eq:NN \ddots \@@_Ddots
+    \cs_set_eq:NN \iddots \@@_Iddots
+    \cs_set_eq:NN \dots \@@_Ldots
+    \cs_set_eq:NN \hdotsfor \@@_Hdotsfor:
+  }
 %    \end{macrocode}
-% We don't want a warning for redefinition of the column type. That's why we use
-% |\@@_newcolumntype| and not |\newcolumntype|.
+%
+% \bigskip
+% When the key |colortbl-like| is used, the following code will be executed.
 %    \begin{macrocode}
-    \@@_newcolumntype #1 [ 1 ] 
-      { 
-        > { 
-            \@@_Cell: 
-            \begin { minipage } [ #2 ] { ##1 } 
-            \mode_leave_vertical: \box_use:N \@arstrutbox 
-          } 
-%    \end{macrocode}
-% Here, we put |c| but we would have the result with |l| or |r|.
-%    \begin{macrocode}
-        c 
-        < { \box_use:N \@arstrutbox \end { minipage } \@@_end_Cell: } 
+\cs_new_protected:Npn \@@_colortbl_like:
+      {
+        \cs_set_eq:NN \cellcolor \@@_cellcolor_tabular
+        \cs_set_eq:NN \rowcolor \@@_rowcolor_tabular
+        \cs_set_eq:NN \columncolor \@@_columncolor_preamble
       }
-  }
 %    \end{macrocode}
 % 
 % \bigskip
@@ -6103,8 +6403,6 @@
 %    \begin{macrocode}
     \cs_set:Npn \ialign 
       { 
-        \bool_if:NT \l_@@_NiceTabular_bool 
-          { \dim_set_eq:NN \arraycolsep \@@_old_arraycolsep_dim }
         \bool_if:NTF \c_@@_colortbl_loaded_bool
           {
             \CT at everycr 
@@ -6159,8 +6457,6 @@
     \cs_set_eq:NN \@@_old_vdots \vdots
     \cs_set_eq:NN \@@_old_ddots \ddots
     \cs_set_eq:NN \@@_old_iddots \iddots
-    \cs_set_eq:NN \firsthline \hline
-    \cs_set_eq:NN \lasthline \hline
     \bool_if:NTF \l_@@_standard_cline_bool
       { \cs_set_eq:NN \cline \@@_standard_cline }
       { \cs_set_eq:NN \cline \@@_cline }
@@ -6180,16 +6476,8 @@
     \cs_set_eq:NN \dotfill \@@_dotfill:
     \cs_set_eq:NN \CodeAfter \@@_CodeAfter:n
     \cs_set_eq:NN \diagbox \@@_diagbox:nn
-    \bool_if:NT \l_@@_renew_dots_bool
-      { 
-        \cs_set_eq:NN \ldots \@@_Ldots
-        \cs_set_eq:NN \cdots \@@_Cdots
-        \cs_set_eq:NN \vdots \@@_Vdots
-        \cs_set_eq:NN \ddots \@@_Ddots
-        \cs_set_eq:NN \iddots \@@_Iddots
-        \cs_set_eq:NN \dots \@@_Ldots
-        \cs_set_eq:NN \hdotsfor \@@_Hdotsfor:
-      }
+    \bool_if:NT \l_@@_colortbl_like_bool \@@_colortbl_like:
+    \bool_if:NT \l_@@_renew_dots_bool \@@_renew_dots:
 %    \end{macrocode}
 % 
 %
@@ -6231,135 +6519,11 @@
     \cs_set_eq:NN \@ifnextchar \new at ifnextchar
 %    \end{macrocode}
 %
-%
-% \bigskip
-% We redefine the column types |p|, |m| and |b|. The command
-% |\@@_define_columntype:nn| is only used here.
 %    \begin{macrocode}
-    \@@_define_columntype:nn p t
-    \@@_define_columntype:nn m c
-    \@@_define_columntype:nn b b
-%    \end{macrocode}    
-%
-% \bigskip
-% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead
-% of |\newcolumtype| because we don't want warnings for column types already
-% defined. 
-%    \begin{macrocode}
-    \@@_newcolumntype w [ 2 ]
-      {
-        > {
-            \hbox_set:Nw \l_@@_cell_box
-            \@@_Cell:
-          }
+    \@@_renew_NC at rewrite@S:
 %    \end{macrocode}
-% |\@@_true_c:| will be replaced statically by |c| at the end of the construction
-% of the preamble.
-%    \begin{macrocode}
-        \@@_true_c:
-        < {
-            \@@_end_Cell:
-            \hbox_set_end:
-%    \end{macrocode}
-% The construction with |\@@_foldcase:| (defined below) should be replaced by
-% |\str_foldcase:n| when that command of \pkg{expl3} will be widespread. That
-% construction is only for giving the user the ability to write |wC{1cm}|
-% instead of |wc{1cm}| for homogeneity with the letters |L|, |C| and |R| used
-% elsewhere in the preamble instead of |l|, |c| and |r|.
-%    \begin{macrocode}
-            \tl_set:Nn \l_tmpa_tl { ##1 }
-            \makebox [ ##2 ] [ \@@_foldcase: ] 
-              { \box_use_drop:N \l_@@_cell_box }  
-          }
-      }
-    \@@_newcolumntype W [ 2 ]
-      {
-        > {
-            \hbox_set:Nw \l_@@_cell_box
-            \@@_Cell:
-          }
-%    \end{macrocode}
-% |\@@_true_c:| will be replaced statically by |c| at the end of the construction
-% of the preamble.
-%    \begin{macrocode}
-        \@@_true_c:
-        < {
-            \@@_end_Cell:
-            \hbox_set_end:
-            \cs_set_eq:NN \hss \hfil
-            \tl_set:Nn \l_tmpa_tl { ##1 }
-            \makebox [ ##2 ] [ \@@_foldcase: ] 
-              { \box_use_drop:N \l_@@_cell_box } 
-          }
-      }
-%    \end{macrocode}
-%                               
-% \bigskip
-% By default, the letter used to specify a dotted line in the preamble of an
-% environment of \pkg{nicematrix} (for example in |{pNiceArray}|) is the letter
-% |:|. However, this letter is used by some packages, for example
-% \pkg{arydshln}. That's why it's possible to change the letter used by
-% \pkg{nicematrix} with the option |letter-for-dotted-lines| which changes the
-% value of |\l_@@_letter_for_dotted_lines_str|. We rescan this string (which is
-% always of length~1) in particular for the case where |pdflatex| is used with
-% \pkg{french-babel} (the colon is activated by \pkg{french-babel} at the
-% beginning of the document).
-%    \begin{macrocode}
-    \tl_set_rescan:Nno  
-      \l_@@_letter_for_dotted_lines_str { } \l_@@_letter_for_dotted_lines_str  
-    \exp_args:NV \newcolumntype \l_@@_letter_for_dotted_lines_str
-      {
-        !
-          {
-%    \end{macrocode}
 % 
-% \medskip
-% The following code because we want the dotted line to have exactly the same
-% position as a vertical rule drawn by ``"|"'' (considering the rule having a
-% width equal to the diameter of the dots).
 %    \begin{macrocode}
-            \int_compare:nNnF \c at iRow = 0 
-              { 
-                \int_compare:nNnF \c at iRow = \l_@@_last_row_int
-                  { \skip_horizontal:N 2\l_@@_radius_dim }
-              }
-%    \end{macrocode}
-%
-% \medskip
-% Consider the following code:
-% \begin{center}
-% \begin{BVerbatim}
-% \begin{NiceArray}{C:CC:C}
-% a & b
-% c & d \\
-% e & f & g & h \\
-% i & j & k & l 
-% \end{NiceArray}
-% \end{BVerbatim}
-% \end{center}
-% The first ``|:|'' in the preamble will be encountered during the first row of
-% the environment |{NiceArray}| but the second one will be encountered only in
-% the third row. We have to issue a command |\vdottedline:n| in the |code-after|
-% only one time for each ``|:|'' in the preamble. That's why we keep a counter
-% |\g_@@_last_vdotted_col_int| and with this counter, we know whether a letter
-% ``|:|'' encountered during the parsing has already been taken into account in
-% the |code-after|.
-%    \begin{macrocode}
-            \int_compare:nNnT \c at jCol > \g_@@_last_vdotted_col_int
-              {
-                \int_gset_eq:NN \g_@@_last_vdotted_col_int \c at jCol
-                \tl_gput_right:Nx \g_@@_internal_code_after_tl
-%    \end{macrocode}
-% The command |\@@_vdottedline:n| is protected, and, therefore, won't be
-% expanded before writing on |\g_@@_internal_code_after_tl|.
-%    \begin{macrocode}
-                  { \@@_vdottedline:n { \int_use:N \c at jCol } }
-              }
-          }
-      }
-    \int_gzero_new:N \g_@@_last_vdotted_col_int
-    \@@_renew_NC at rewrite@S:
-    \int_gset:Nn \g_@@_last_vdotted_col_int { -1 }
     \bool_gset_false:N \g_@@_last_col_found_bool 
 %    \end{macrocode}
 %
@@ -6374,24 +6538,15 @@
     \tl_gclear_new:N \g_@@_Ddots_lines_tl
     \tl_gclear_new:N \g_@@_Iddots_lines_tl
     \tl_gclear_new:N \g_@@_HVdotsfor_lines_tl
-  }
 %    \end{macrocode}
 %
 % \medskip
-% The following command will be deleted when we will consider |\str_lowercase:n|
-% as widespread.
 %    \begin{macrocode}
-\cs_set:Npn \@@_foldcase:
-  {
-    \tl_case:NnF \l_tmpa_tl
-      {
-        C { c }
-        L { l }
-        R { r }
-      }
-      { \l_tmpa_tl }
+    \tl_gclear_new:N \g_@@_code_before_tl
   }
 %    \end{macrocode}
+% This is the end of |\@@_pre_array:|.
+%
 % 
 % \bigskip
 % \subsection*{The environment \{NiceArrayWithDelims\}}
@@ -6399,7 +6554,8 @@
 %    \begin{macrocode}
 \NewDocumentEnvironment { NiceArrayWithDelims } { m m O { } m ! O { } }
   { 
-    \bool_if:NT \c_@@_footnote_bool { \begin { savenotes } }
+    \@@_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
@@ -6467,6 +6623,14 @@
 % In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the
 % positions of the cells with a |\diagbox|.
 % 
+%    \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
@@ -6485,7 +6649,6 @@
 %    \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
@@ -6678,13 +6841,6 @@
 %    \end{macrocode}
 %
 % \bigskip
-% We construct the preamble of the array in |\l_tmpa_tl|.
-%    \begin{macrocode}
-    \tl_set:Nn \l_tmpa_tl { #4 }
-%    \end{macrocode}
-%
-%
-% \bigskip
 % If the user has loaded |nicematrix| with the option |define-L-C-R|, he will be
 % able to use |L|, |C| and |R| instead of |l|, |c| and |r| in the preambles of
 % the environments of \pkg{nicematrix} (it's a compatibility mode since |L|, |C|
@@ -6692,76 +6848,16 @@
 %    \begin{macrocode}
     \bool_if:NT \c_@@_define_L_C_R_bool \@@_define_L_C_R:
 %    \end{macrocode}
-% 
-% \bigskip
-% We will do an ``expansion''\footnote{This ``expansion'' expands all the
-% constructions with |*| and with the new column types defined by
-% |\newcolumntype|.} of the preamble (with the tools of \pkg{array}
-% itself) and a replacement of the specifiers |c|, |l| and |r| by the specifiers
-% |C|, |L| and |R|.
-% 
-% 
-% We store our preamble in the token register |\@temptokena| (those
-% ``token registers'' are not supported by \pkg{expl3}).
-%    \begin{macrocode}
-    \@temptokena \exp_after:wN { \l_tmpa_tl }
-%    \end{macrocode}
-% Initialisation of a flag used by \pkg{array} to detect the end of the expansion.
-%    \begin{macrocode}
-    \@tempswatrue
-%    \end{macrocode}
-% The following line actually does the expansion (it's has been copied from
-% |array.sty|). 
-%    \begin{macrocode}
-    \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
-%    \end{macrocode}
-% We put back the preamble in our token list |\l_tmpa_tl|.
-%    \begin{macrocode}
-    \tl_gset:NV \l_tmpa_tl \@temptokena
-%    \end{macrocode}
-% 
-% We do the replacement of letters |c|, |l| and |r| (these column types can't be
-% redefined by |\newcolumtype| of \pkg{array} and that's why we have to do the
-% job ``by hand'' after expansion of the preamble). 
-%    \begin{macrocode}
-    \tl_replace_all:Nnn \l_tmpa_tl c { > \@@_Cell: c < \@@_end_Cell: }
-    \tl_replace_all:Nnn \l_tmpa_tl l { > \@@_Cell: l < \@@_end_Cell: }
-    \tl_replace_all:Nnn \l_tmpa_tl r { > \@@_Cell: r < \@@_end_Cell: }
-    \tl_replace_all:Nnn \l_tmpa_tl \@@_true_c: c
-%    \end{macrocode}
 %
 % \bigskip
-% We complete the preamble with the potential ``exterior columns''.
+% The preamble will be constructed in |\g_@@_preamble_tl|. 
 %    \begin{macrocode}
-    \int_compare:nNnTF \l_@@_first_col_int = 0
-      { \tl_put_left:NV \l_tmpa_tl \c_@@_preamble_first_col_tl }
-      {
-        \bool_lazy_all:nT 
-          { 
-            \l_@@_NiceArray_bool 
-            { \bool_not_p:n \l_@@_NiceTabular_bool }
-            { \bool_not_p:n \l_@@_vlines_bool } 
-            { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
-          }
-          { \tl_put_left:Nn \l_tmpa_tl { @ { } } }
-      }
-    \int_compare:nNnTF \l_@@_last_col_int > { -1 }
-      { \tl_put_right:NV \l_tmpa_tl \c_@@_preamble_last_col_tl }
-      { 
-        \bool_lazy_all:nT
-          { 
-            \l_@@_NiceArray_bool 
-            { \bool_not_p:n \l_@@_NiceTabular_bool }
-            { \bool_not_p:n \l_@@_vlines_bool }
-            { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
-          }
-          { \tl_put_right:Nn \l_tmpa_tl { @ { } } }
-      }
-    \tl_put_right:Nn \l_tmpa_tl { > { \@@_error_too_much_cols: } l } 
+    \@@_construct_preamble:n { #4 }
 %    \end{macrocode}
-% Now, the preamble is constructed in |\l_tmpa_tl|
 %
+% Now, the preamble is constructed in |\g_@@_preamble_tl|
 %
+%
 % 
 % \bigskip
 % Here is the beginning of the box which will contain the array. The
@@ -6768,38 +6864,9 @@
 % |\hbox_set_end:| corresponding to this |\hbox_set:Nw| will be in the second
 % part of the environment (and the closing |\c_math_toggle_token| also).
 %    \begin{macrocode}
-    \hbox_set:Nw \l_@@_the_array_box
+    \hbox_set:Nw \l_@@_the_array_box 
 %    \end{macrocode}
-% Here is a trick. We will call |\array| and, at the beginning, |\array| will set
-% |\col at sep| equal to the current value of |\arraycolsep|. In we are in an
-% environment |{NiceTabular}|, we would like that |\array| sets |\col at sep| equal
-% to the current value of |\tabcolsep|. That's why we set |\arraycolsep| equal
-% to |\tabcolsep|. However, the value of |\tabcolsep| in each cell of the array
-% should be equal to the current value of |\tabcolsep| outside |{NiceTabular}|.
-% That's why we save the current value of |\arraycolsep| and we will restore the
-% value just before the |\halign|. It's possible because we do a redefinition of
-% |\ialign| (see just below).
-%    \begin{macrocode}
-    \bool_if:NT \l_@@_NiceTabular_bool 
-      { 
-        \dim_set_eq:NN \@@_old_arraycolsep_dim \arraycolsep
-        \dim_set_eq:NN \arraycolsep \tabcolsep 
-      }
-%    \end{macrocode}
-% If the key |\vlines| is used, we increase |\arraycolsep| by
-% |0.5\arrayrulewidth| in order to reserve space for the width of the vertical
-% rules drawn with Tikz after the end of the array. However, the first
-% |\arraycolsep| is used once (between columns, |\arraycolsep| is used twice).
-% That's why we add a |0.5\arrayrulewidth| more.
-%    \begin{macrocode}
-    \bool_if:NT \l_@@_vlines_bool
-      { 
-        \dim_add:Nn \arraycolsep { 0.5 \arrayrulewidth } 
-        \skip_horizontal:N  0.5\arrayrulewidth  
-      }
-%    \end{macrocode}
 %
-%
 %    \begin{macrocode}
     \skip_horizontal:N \l_@@_left_margin_dim 
     \skip_horizontal:N \l_@@_extra_left_margin_dim 
@@ -6819,14 +6886,6 @@
     \c_math_toggle_token
     \skip_horizontal:N \l_@@_right_margin_dim 
     \skip_horizontal:N \l_@@_extra_right_margin_dim 
-%    \end{macrocode}
-% If the key |\vlines| is used, we have increased |\arraycolsep| by
-% |0.5\arrayrulewidth| in order to reserve space for the width of the vertical
-% rules drawn with Tikz after the end of the array. However, the last
-% |\arraycolsep| is used once (between columns, |\arraycolsep| is used twice).
-% That's why we add a |0.5 \arrayrulewidth| more.
-%    \begin{macrocode}
-    \bool_if:NT \l_@@_vlines_bool { \skip_horizontal:N 0.5\arrayrulewidth } 
     \hbox_set_end:
 %    \end{macrocode}
 % End of the construction of the array (in the box |\l_@@_the_array_box|).
@@ -6856,7 +6915,17 @@
 % has the number~$0$.} 
 %    \begin{macrocode}
     \int_gset_eq:NN \c at jCol \g_@@_col_total_int
-    \bool_if:nT \g_@@_last_col_found_bool { \int_gdecr:N \c at jCol } 
+    \bool_if:nTF \g_@@_last_col_found_bool 
+      { \int_gdecr:N \c at jCol } 
+      {
+        \int_compare:nNnT \l_@@_last_col_int > { -1 }
+          { \@@_error:n { last~col~not~used } }
+      }
+    \bool_if:NF \l_@@_Matrix_bool
+      {    
+        \int_compare:nNnT \c at jCol < \g_@@_static_num_of_col_int 
+          { \@@_error:n { columns~not~used } }
+      }
 %    \end{macrocode}
 %
 % We fix also the value of |\c at iRow| and |\g_@@_row_total_int| with the
@@ -6883,68 +6952,17 @@
 %
 % The construction of the real box is different when |\l_@@_NiceArray_bool| is
 % true (|{NiceArray}| or |{NiceTabular}|) and in the other environments because,
-% in |{NiceArray}| or |{NiceTabular}|, we have to take into account the value of
-% |baseline| and we have no delimiter to put. We begin with this case.
+% in |{NiceArray}| or |{NiceTabular}|, we have no delimiter to put. We begin
+% with this case. 
 %    \begin{macrocode}
     \bool_if:NTF \l_@@_NiceArray_bool
       { 
-%    \end{macrocode}
-% Remember that, when the key |b| is used, the |{array}| (of \pkg{array}) is
-% constructed with the option |t| (and not |b|). Now, we do the translation to
-% take into account the option |b|.
-%    \begin{macrocode}
-        \str_if_eq:VnTF \l_@@_baseline_str { b }
+        \str_case:VnF \l_@@_baseline_str 
           { 
-            \pgfpicture
-              \@@_qpoint:n { row - 1 } 
-              \dim_gset_eq:NN \g_tmpa_dim \pgf at y
-              \@@_qpoint:n { row - \int_use:N \c at iRow - base }
-              \dim_gsub:Nn \g_tmpa_dim \pgf at y
-            \endpgfpicture
-            \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth 
-            \int_compare:nNnT \l_@@_first_row_int = 0 
-              {
-                \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim 
-                \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim 
-              }
-            \box_move_up:nn \g_tmpa_dim { \@@_use_array_box_with_notes: } 
+            b \@@_use_arraybox_with_notes_b: 
+            c \@@_use_arraybox_with_notes_c:
           }
-          { 
-            \str_if_eq:VnTF \l_@@_baseline_str { c }
-              { \@@_use_array_box_with_notes: } 
-              {
-%    \end{macrocode}
-% We convert a value of |t| to a value of |1|.
-%    \begin{macrocode}
-                \str_if_eq:VnT \l_@@_baseline_str { t } 
-                  { \str_set:Nn \l_@@_baseline_str { 1 } } 
-%    \end{macrocode}
-% Now, we convert the value of |\l_@@_baseline_str| (which should represent an
-% integer) to an integer stored in |\l_tmpa_int|.
-%    \begin{macrocode}
-                \int_set:Nn \l_tmpa_int \l_@@_baseline_str
-                \bool_lazy_or:nnT
-                  { \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int }
-                  { \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int }
-                  { 
-                    \@@_error:n { bad~value~for~baseline }
-                    \int_set:Nn \l_tmpa_int 1
-                  }
-                \pgfpicture
-                \@@_qpoint:n { row - 1 } 
-                \dim_gset_eq:NN \g_tmpa_dim \pgf at y
-                \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
-                \dim_gsub:Nn \g_tmpa_dim \pgf at y
-                \endpgfpicture
-                \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
-                \int_compare:nNnT \l_@@_first_row_int = 0 
-                  {
-                    \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim 
-                    \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim 
-                  }
-                \box_move_up:nn \g_tmpa_dim { \@@_use_array_box_with_notes: }  
-              }
-          }
+          \@@_use_arraybox_with_notes:
       } 
 %    \end{macrocode}
 %
@@ -6994,7 +7012,7 @@
                     \bool_if:NTF \l_@@_NiceTabular_bool
                       { \skip_horizontal:N -\tabcolsep }
                       { \skip_horizontal:N -\arraycolsep }
-                    \@@_use_array_box_with_notes:
+                    \@@_use_arraybox_with_notes_c:
                     \bool_if:NTF \l_@@_NiceTabular_bool
                       { \skip_horizontal:N -\tabcolsep }
                       { \skip_horizontal:N -\arraycolsep }
@@ -7033,14 +7051,356 @@
       }
     \@@_after_array:
     \egroup 
-    \bool_if:NT \c_@@_footnote_bool { \end { savenotes } }
+    \bool_if:NT \c_@@_footnote_bool \endsavenotes 
   }
 %    \end{macrocode}
 % This is the end of the environment |{NiceArrayWithDelims}|.
 %
 %
+% \subsection*{We construct the preamble of the array}
 %
+% The transformation of the preamble is an operation in several steps.
+%
 % \bigskip
+% The argument of |\@@_construct_preamble:n| is the preamble as given by the
+% final user to the environement |{NiceTabular}| (or a variant). The preamble
+% will be constructed in |\g_@@_preamble_tl|.
+% 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_construct_preamble:n #1
+  {
+%    \end{macrocode}
+% First, we will do an ``expansion'' of the preamble with the tools of the
+% package \pkg{array} itself. This ``expansion'' will expand all the constructions
+% with |*| and with all column types (defined by the user or by various packages
+% using |\newcolumntype|).
+%
+% Since we use the tools of \pkg{array} to do this expansion, we will have a
+% programmation which is not in the style of \pkg{expl3}.
+% 
+%
+% \bigskip
+% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead
+% of |\newcolumtype| because we don't want warnings for column types already
+% defined. These redefinitions are in fact \emph{protections} of the letters |w| 
+% and |W|. We don't want these columns type expanded because we will do the
+% patch ourselves after. We want to be able the standard column types |w| and
+% |W| in potential |{tabular}| of \pkg{array} in some cells of our array. That's
+% why we do those redefinitions in a TeX group.
+%   \begin{macrocode}
+    \group_begin:
+%    \end{macrocode}
+% 
+% If we are in an environment without explicit preamble, we have nothing to do
+% (excepted the treatment on both sides of the preamble which will be done at
+% the end).
+%    \begin{macrocode}
+    \bool_if:NTF \l_@@_Matrix_bool
+      { \tl_gset:Nn \g_@@_preamble_tl { #1 } }
+      {
+        \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } }
+        \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } }
+%    \end{macrocode}
+%
+% First, we have to store our preamble in the token register |\@temptokena|
+% (those ``token registers'' are not supported by \pkg{expl3}).
+%    \begin{macrocode}
+        \@temptokena { #1 }
+%    \end{macrocode}
+% Initialisation of a flag used by \pkg{array} to detect the end of the expansion.
+%    \begin{macrocode}
+        \@tempswatrue
+%    \end{macrocode}
+% The following line actually does the expansion (it's has been copied from
+% |array.sty|). 
+%    \begin{macrocode}
+        \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
+%    \end{macrocode}
+%
+% \bigskip
+% Now, we have to ``patch'' that preamble by transforming some columns. 
+% We will insert in the TeX flow the preamble in its actual form (that is to say
+% after the ``expansion'') following by a marker |\q_stop| and we will consume
+% these tokens constructing the (new form of the) preamble in
+% |\g_@@_preamble_tl|. This is done recursively with the command
+% |\@@_patch_preamble:n|. In the same time, we will count the columns with the
+% counter |\c at jCol|.
+%    \begin{macrocode}
+        \int_gzero_new:N \c at jCol
+        \bool_if:NTF \l_@@_vlines_bool
+          { 
+            \tl_gset:Nn \g_@@_preamble_tl 
+              { ! { \skip_horizontal:N \arrayrulewidth } }
+          }
+          { \tl_gclear:N \g_@@_preamble_tl }
+%    \end{macrocode}
+% The counter |\l_tmpa_int| will be count the number of consecutive occurrences
+% of the symbole \verb+|+.
+%    \begin{macrocode}
+        \int_zero:N \l_tmpa_int
+%    \end{macrocode}
+% Now, we actually patch the preamble (and it is constructed in
+% |\g_@@_preamble_tl|). 
+%    \begin{macrocode}
+        \exp_after:wN \@@_patch_preamble:n \the \@temptokena \q_stop
+        \int_gset_eq:NN \g_@@_static_num_of_col_int \c at jCol
+      }
+%    \end{macrocode}
+%
+% \medskip
+% Now, we replace |\columncolor| by |\@@_columncolor_preamble|.
+%    \begin{macrocode}
+    \bool_if:NT \l_@@_colortbl_like_bool
+      {
+        \regex_replace_all:NnN 
+          \c_@@_columncolor_regex
+          { \c { @@_columncolor_preamble } }  
+          \g_@@_preamble_tl
+      }
+%    \end{macrocode}
+% 
+% \bigskip
+% We complete the preamble with the potential ``exterior columns''.
+%    \begin{macrocode}
+    \int_compare:nNnTF \l_@@_first_col_int = 0
+      { \tl_gput_left:NV \g_@@_preamble_tl \c_@@_preamble_first_col_tl }
+      {
+        \bool_lazy_all:nT 
+          { 
+            \l_@@_NiceArray_bool 
+            { \bool_not_p:n \l_@@_NiceTabular_bool }
+            { \bool_not_p:n \l_@@_vlines_bool } 
+            { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+          }
+          { \tl_gput_left:Nn \g_@@_preamble_tl { @ { } } }
+      }
+    \int_compare:nNnTF \l_@@_last_col_int > { -1 }
+      { \tl_gput_right:NV \g_@@_preamble_tl \c_@@_preamble_last_col_tl }
+      { 
+        \bool_lazy_all:nT
+          { 
+            \l_@@_NiceArray_bool 
+            { \bool_not_p:n \l_@@_NiceTabular_bool }
+            { \bool_not_p:n \l_@@_vlines_bool }
+            { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+          }
+          { \tl_gput_right:Nn \g_@@_preamble_tl { @ { } } }
+      }
+%    \end{macrocode}
+% We add a last column to raise a good error message when the user put more
+% columns than allowed by its preamble. However, for technical reasons, it's not
+% possible to do that in |{NiceTabular*}| (|\l_@@_tabular_width_dim|=0pt).
+%    \begin{macrocode}
+    \dim_compare:nNnT \l_@@_tabular_width_dim = \c_zero_dim 
+      { 
+        \tl_gput_right:Nn 
+          \g_@@_preamble_tl 
+          { > { \@@_error_too_much_cols: } l }
+      } 
+%    \end{macrocode}
+%
+% \medskip
+% Now, we have to close the TeX group which was opened for the redefinition of
+% the columns of type |w| and |W|. 
+%    \begin{macrocode}
+    \group_end:
+  }
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble:n #1
+  {
+    \str_case:nnF { #1 }
+      {
+        c { \@@_patch_preamble_i:n #1 }
+        l { \@@_patch_preamble_i:n #1 }
+        r { \@@_patch_preamble_i:n #1 }
+        > { \@@_patch_preamble_ii:nn #1 }
+        < { \@@_patch_preamble_ii:nn #1 }
+        ! { \@@_patch_preamble_ii:nn #1 }
+        @ { \@@_patch_preamble_ii:nn #1 }
+        | { \@@_patch_preamble_iii:n #1 }
+        p { \@@_patch_preamble_iv:nnn t #1 }
+        m { \@@_patch_preamble_iv:nnn c #1 }
+        b { \@@_patch_preamble_iv:nnn b #1 }
+        \@@_w: { \@@_patch_preamble_v:nnnn { }                          #1 } 
+        \@@_W: { \@@_patch_preamble_v:nnnn { \cs_set_eq:NN \hss \hfil } #1 } 
+        \@@_true_c: { \@@_patch_preamble_vi:n #1 }
+        \q_stop { }
+      }
+      { 
+        \str_if_eq:VnTF \l_@@_letter_for_dotted_lines_str { #1 }
+          { \@@_patch_preamble_vii:n #1 }
+          { \@@_fatal:nn { unknown~column~type } { #1 } }
+      }
+  }
+%    \end{macrocode}
+% 
+% \medskip
+% For |c|, |l| and |r|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_i:n #1
+  { 
+    \tl_gput_right:Nn \g_@@_preamble_tl { > \@@_Cell: #1 < \@@_end_Cell: } 
+%    \end{macrocode}
+% We increment the counter of columns.
+%    \begin{macrocode}
+    \int_gincr:N \c at jCol
+    \bool_if:NT \l_@@_vlines_bool
+      { 
+        \tl_gput_right:Nn \g_@@_preamble_tl 
+          { ! { \skip_horizontal:N \arrayrulewidth } }
+      }
+    \@@_patch_preamble:n
+  }
+%    \end{macrocode}
+%
+% \medskip
+% For |>|, |<|, |!| and |@|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_ii:nn #1 #2
+  {  
+    \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } }
+    \@@_patch_preamble:n
+  }
+%    \end{macrocode}
+%
+% 
+% \medskip
+% For \verb+|+
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iii:n #1
+  { 
+%    \end{macrocode}
+% |\l_tmpa_int| is the number of successive occurrences of \verb+|+
+%    \begin{macrocode}
+    \int_incr:N \l_tmpa_int 
+    \@@_patch_preamble_iii_i:n
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iii_i:n #1
+  {
+    \str_if_eq:nnTF { #1 } | 
+      { \@@_patch_preamble_iii:n | }
+      { 
+        \tl_gput_right:Nx \g_@@_preamble_tl
+          { 
+            \exp_not:N ! 
+              { 
+                \skip_horizontal:n 
+                  { 
+                    \dim_eval:n 
+                      { 
+                        \arrayrulewidth * \l_tmpa_int 
+                        + \doublerulesep * ( \l_tmpa_int - 1) 
+                      } 
+                  } 
+              } 
+          }
+        \tl_gput_right:Nx \g_@@_internal_code_after_tl
+          { \@@_vline:nn { \int_use:N \c at jCol } { \int_use:N \l_tmpa_int } }
+        \int_zero:N \l_tmpa_int
+        \@@_patch_preamble:n #1 
+      }
+  }
+%    \end{macrocode}
+%
+% 
+% \medskip
+% For |p|, |m| and |b|
+%    \begin{macrocode}  
+\cs_new_protected:Npn \@@_patch_preamble_iv:nnn #1 #2 #3
+  {  
+    \tl_gput_right:Nn \g_@@_preamble_tl
+      {
+        > { 
+            \@@_Cell: 
+            \begin { minipage } [ #1 ] { #3 } 
+            \mode_leave_vertical: 
+            \box_use:N \@arstrutbox 
+          } 
+        c 
+        < { \box_use:N \@arstrutbox \end { minipage } \@@_end_Cell: } 
+      }
+%    \end{macrocode}
+% We increment the counter of columns.
+%    \begin{macrocode}
+    \int_gincr:N \c at jCol
+    \@@_patch_preamble:n
+  }
+%    \end{macrocode}
+% 
+% \medskip
+% For |w| and |W|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_v:nnnn #1 #2 #3 #4
+  {  
+    \tl_gput_right:Nn \g_@@_preamble_tl
+      {
+        > {
+            \hbox_set:Nw \l_@@_cell_box
+            \@@_Cell:
+          }
+        c
+        < {
+            \@@_end_Cell:
+            #1
+            \hbox_set_end:
+            \makebox [ #4 ] [ #3 ] { \box_use_drop:N \l_@@_cell_box }   
+          }
+      }
+%    \end{macrocode}
+% We increment the counter of columns.
+%    \begin{macrocode}
+    \int_gincr:N \c at jCol
+    \@@_patch_preamble:n
+  }
+%    \end{macrocode}
+%
+% \medskip
+% For |\@@_true_c:| which will appear in our redefinition of the columns of type
+% |S| (of \pkg{siunitx}).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vi:n #1
+  {
+    \tl_gput_right:Nn \g_@@_preamble_tl { c }
+%    \end{macrocode}
+% We increment the counter of columns.
+%    \begin{macrocode}
+    \int_gincr:N \c at jCol
+    \bool_if:NT \l_@@_vlines_bool
+      { 
+        \tl_gput_right:Nn \g_@@_preamble_tl 
+          { ! { \skip_horizontal:N \arrayrulewidth } }
+      }
+    \@@_patch_preamble:n
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vii:n #1
+  {
+%    \end{macrocode}
+% Here, we have a problem in the cases of the use in the first column or the ``last
+% one''. 
+%    \begin{macrocode}
+    \tl_gput_right:Nn \g_@@_preamble_tl
+      { ! { \skip_horizontal:N 2\l_@@_radius_dim } }
+%    \end{macrocode}
+% The command |\@@_vdottedline:n| is protected, and, therefore, won't be
+% expanded before writing on |\g_@@_internal_code_after_tl|.
+%    \begin{macrocode}
+    \tl_gput_right:Nx \g_@@_internal_code_after_tl
+      { \@@_vdottedline:n { \int_use:N \c at jCol } }
+    \@@_patch_preamble:n
+  }
+%    \end{macrocode}
+% 
+% 
+% \bigskip
 % The command |\@@_put_box_in_flow:| puts the box |\l_tmpa_box| (which contains
 % the array) in the flow. It is used for the environments with delimiters.
 % First, we have to modify the height and the depth to take back into account
@@ -7107,7 +7467,7 @@
 %
 % \bigskip
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_use_array_box_with_notes:
+\cs_new_protected:Npn \@@_use_arraybox_with_notes_c:
   {
     \int_compare:nNnTF \c at tabularnote = 0
       { \box_use_drop:N \l_@@_the_array_box }
@@ -7169,7 +7529,69 @@
   }
 %    \end{macrocode}
 % 
+% \medskip
+% The case of |baseline| equal to |b|. Remember that, when the key |b| is used,
+% the |{array}| (of \pkg{array}) is constructed with the option |t| (and not
+% |b|). Now, we do the translation to take into account the option |b|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes_b:
+  {
+    \pgfpicture
+      \@@_qpoint:n { row - 1 } 
+      \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+      \@@_qpoint:n { row - \int_use:N \c at iRow - base }
+      \dim_gsub:Nn \g_tmpa_dim \pgf at y
+    \endpgfpicture
+    \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth 
+    \int_compare:nNnT \l_@@_first_row_int = 0 
+      {
+        \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim 
+        \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim 
+      }
+    \box_move_up:nn \g_tmpa_dim { \@@_use_arraybox_with_notes_c: } 
+  }
+%    \end{macrocode}  
+%
+% \medskip
+% Now, the general case (hence the |g| in the name).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes:
+  {
+%    \end{macrocode}
+% We convert a value of |t| to a value of |1|.
+%    \begin{macrocode}
+    \str_if_eq:VnT \l_@@_baseline_str { t } 
+      { \str_set:Nn \l_@@_baseline_str { 1 } } 
+%    \end{macrocode}
+% Now, we convert the value of |\l_@@_baseline_str| (which should represent an
+% integer) to an integer stored in |\l_tmpa_int|.
+%    \begin{macrocode}
+    \int_set:Nn \l_tmpa_int \l_@@_baseline_str
+    \bool_lazy_or:nnT
+      { \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int }
+      { \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int }
+      { 
+        \@@_error:n { bad~value~for~baseline }
+        \int_set:Nn \l_tmpa_int 1
+      }
+    \pgfpicture
+    \@@_qpoint:n { row - 1 } 
+    \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+    \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
+    \dim_gsub:Nn \g_tmpa_dim \pgf at y
+    \endpgfpicture
+    \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+    \int_compare:nNnT \l_@@_first_row_int = 0 
+      {
+        \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim 
+        \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim 
+      }
+    \box_move_up:nn \g_tmpa_dim { \@@_use_arraybox_with_notes_c: }  
+  }
+%    \end{macrocode}
 % 
+%
+% 
 % \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
@@ -7226,9 +7648,9 @@
 % \interitem
 % The construction of the array in the environment |{NiceArrayWithDelims}| is,
 % in fact, done by the environment |{@@-light-syntax}| or by the environment
-% |{@@-normal-syntax}| (whether the option |light-syntax| is used or not). When
-% the key |light-syntax| is not used, the construction is a standard
-% environment (and, thus, it's possible to use verbatim in the arrray).
+% |{@@-normal-syntax}| (whether the option |light-syntax| is in force or not).
+% When the key |light-syntax| is not used, the construction is a standard
+% environment (and, thus, it's possible to use verbatim in the array).
 %    \begin{macrocode} 
 \NewDocumentEnvironment { @@-normal-syntax } { }
 %    \end{macrocode}
@@ -7239,13 +7661,12 @@
 % by LaTeX for incorrect nested environments).
 %    \begin{macrocode}
   { 
-    \peek_meaning_ignore_spaces:NTF \end 
-      { \@@_analyze_end:Nn }
+    \peek_meaning_ignore_spaces:NTF \end \@@_analyze_end:Nn 
 %    \end{macrocode}
 % Here is the call to |\array| (we have a dedicated macro |\@@_array:| because
 % of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}).
 %    \begin{macrocode}
-      { \exp_args:NV \@@_array: \l_tmpa_tl }
+      { \exp_args:NV \@@_array: \g_@@_preamble_tl }
   }
   { 
     \@@_create_col_nodes:
@@ -7255,8 +7676,8 @@
 %
 % 
 % \bigskip
-% When the key |light-syntax| is used, we use an environment which takes its whole
-% body as an argument (with the specifier |b| of \pkg{xparse}). 
+% When the key |light-syntax| is in force, we use an environment which takes its
+% whole body as an argument (with the specifier |b| of \pkg{xparse}). 
 % % \label{code-light-syntax}
 %    \begin{macrocode}
 \NewDocumentEnvironment { @@-light-syntax } { b }
@@ -7275,12 +7696,13 @@
           { \@@_fatal:n { double-backslash~in~light-syntax } }
       }
 %    \end{macrocode}
-% Now, you extract the |code-after| or the body of the environment. Maybe, there
+% Now, you extract the |code-after| of the body of the environment. Maybe, there
 % is no command |\CodeAfter| in the body. That's why you put a marker
 % |\CodeAfter| after |#1|. If there is yet a |\CodeAfter| in |#1|, this second
 % (or third...) |\CodeAfter| will be catched in the value of
-% |\g_@@_code_after_tl|. That doesn't matter because |\CodeAfter| will be set to 
-% \textsl{no-op} before the execution of |\g_@@_code_after_tl|.
+% |\g_nicematrix_code_after_tl|. That doesn't matter because |\CodeAfter| will
+% be set to \textsl{no-op} before the execution of
+% |\g_nicematrix_code_after_tl|.
 %    \begin{macrocode}
     \@@_light_syntax_i #1 \CodeAfter \q_stop
   }
@@ -7296,7 +7718,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_light_syntax_i #1\CodeAfter #2\q_stop 
   {
-    \tl_gput_right:Nn \g_@@_code_after_tl { #2 }
+    \tl_gput_right:Nn \g_nicematrix_code_after_tl { #2 }
 %    \end{macrocode}
 % The body of the array, which is stored in the argument |#1|, is now
 % splitted into items (and \emph{not} tokens).
@@ -7316,7 +7738,7 @@
 % Here is the call to |\array| (we have a dedicated macro |\@@_array:| because
 % of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}).
 %    \begin{macrocode}
-    \exp_args:NV \@@_array: \l_tmpa_tl 
+    \exp_args:NV \@@_array: \g_@@_preamble_tl 
 %    \end{macrocode}
 % We need a global affectation because, when executing |\l_tmpa_tl|, we will
 % exit the first cell of the array.
@@ -7700,80 +8122,36 @@
 % We create the variants of the environment |{NiceArrayWithDelims}|. 
 %
 %   \begin{macrocode}
-\NewDocumentEnvironment { pNiceArray } { }
+\cs_new_protected:Npn \@@_def_env:nnn #1 #2 #3
   {
-    \str_if_empty:NT \g_@@_name_env_str 
-      { \str_gset:Nn \g_@@_name_env_str { pNiceArray } } 
-    \@@_test_if_math_mode:
-    \NiceArrayWithDelims ( )
+    \NewDocumentEnvironment { #1 NiceArray } { }
+      {
+        \str_if_empty:NT \g_@@_name_env_str 
+          { \str_gset:Nn \g_@@_name_env_str { #1 NiceArray } } 
+        \@@_test_if_math_mode:
+        \NiceArrayWithDelims #2 #3
+      }
+      { \endNiceArrayWithDelims }
   }
-  { \endNiceArrayWithDelims }
 %    \end{macrocode}
 %               
 %   \begin{macrocode}
-\NewDocumentEnvironment { bNiceArray } { }
-  {
-    \str_if_empty:NT \g_@@_name_env_str 
-      { \str_gset:Nn \g_@@_name_env_str { bNiceArray } } 
-    \@@_test_if_math_mode:
-    \NiceArrayWithDelims [ ]
-  }
-  { \endNiceArrayWithDelims }
+\@@_def_env:nnn p ( ) 
+\@@_def_env:nnn b [ ]
+\@@_def_env:nnn B \{ \}
+\@@_def_env:nnn v | |
+\@@_def_env:nnn V \| \|
 %    \end{macrocode}
-%               
-%   \begin{macrocode}
-\NewDocumentEnvironment { BNiceArray } { }
-  {
-    \str_if_empty:NT \g_@@_name_env_str 
-      { \str_gset:Nn \g_@@_name_env_str { BNiceArray } } 
-    \@@_test_if_math_mode:
-    \NiceArrayWithDelims \{ \}
-  }
-  { \endNiceArrayWithDelims }
-%    \end{macrocode} 
-%               
-%   \begin{macrocode}
-\NewDocumentEnvironment { vNiceArray } { }
-  {
-    \str_if_empty:NT \g_@@_name_env_str 
-      { \str_gset:Nn \g_@@_name_env_str { vNiceArray } } 
-    \@@_test_if_math_mode:
-    \NiceArrayWithDelims | |
-  }
-  { \endNiceArrayWithDelims }
-%    \end{macrocode}
-%               
-%   \begin{macrocode}
-\NewDocumentEnvironment { VNiceArray } { }
-  {
-    \str_if_empty:NT \g_@@_name_env_str 
-      { \str_gset:Nn \g_@@_name_env_str { VNiceArray } } 
-    \@@_test_if_math_mode:
-    \NiceArrayWithDelims \| \|
-  }
-  { \endNiceArrayWithDelims }
-%    \end{macrocode}
+% 
 %
 % \bigskip
 % \subsection*{The environment \{NiceMatrix\} and its variants}
 %
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_define_env:n #1
-  {
-    \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
-      {
-        \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix } 
-        \tl_set:Nn \l_@@_type_of_col_tl c
-        \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
-        \exp_args:Nnx \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl 
-      }
-      { \use:c { end #1 NiceArray } }
-  }
-%    \end{macrocode}
 %
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_begin_of_NiceMatrix:nn #1 #2
   {
+    \bool_set_true:N \l_@@_Matrix_bool
     \use:c { #1 NiceArray } 
       { 
         * 
@@ -7782,22 +8160,28 @@
               \c at MaxMatrixCols
               { \@@_pred:n \l_@@_last_col_int }
           } 
-          #2
+          { > \@@_Cell: #2 < \@@_end_Cell: }
       } 
   }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
-\@@_define_env:n { }
-\@@_define_env:n p 
-\@@_define_env:n b 
-\@@_define_env:n B
-\@@_define_env:n v
-\@@_define_env:n V
+\clist_map_inline:nn { { } , p , b , B , v , V }
+  {
+    \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
+      {
+        \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix } 
+        \tl_set:Nn \l_@@_type_of_col_tl c
+        \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
+        \exp_args:Nnx \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl 
+      }
+      { \use:c { end #1 NiceArray } }
+  }
 %    \end{macrocode}
 %
 % \bigskip
-% \subsection*{The environment \{NiceTabular\}}
+% \subsection*{The environments \{NiceTabular\}  and \{NiceTabular*\}}
+%
 %    \begin{macrocode}
 \NewDocumentEnvironment { NiceTabular } { O { } m ! O { } }
   { 
@@ -7808,8 +8192,21 @@
   }
   { \endNiceArray }
 %    \end{macrocode}
+%
+% \bigskip 
+%    \begin{macrocode}
+\NewDocumentEnvironment { NiceTabular* } { m O { } m ! O { } }
+  { 
+    \str_gset:Nn \g_@@_name_env_str { NiceTabular* }
+    \dim_set:Nn \l_@@_tabular_width_dim { #1 }
+    \keys_set:nn { NiceMatrix / NiceTabular } { #2 , #4 }
+    \bool_set_true:N \l_@@_NiceTabular_bool 
+    \NiceArray { #3 }
+  }
+  { \endNiceArray }
+%    \end{macrocode}
+%
 % 
-% 
 % \bigskip
 % \subsection*{After the construction of the array}
 %
@@ -7924,6 +8321,8 @@
         \iow_now:Nn \@mainaux \ExplSyntaxOff
       } 
 %    \end{macrocode}
+%
+%
 % 
 % By default, the diagonal lines will be parallelized\footnote{It's possible to
 % use the option |parallelize-diags| to disable this parallelization.}. There
@@ -8025,7 +8424,7 @@
 %    \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
-% one may be present in |\g_@@_code_after_tl|. That's why we set
+% may be in |\g_nicematrix_code_after_tl|. That's why we set
 % |\Code-after| to be \textsl{no-op} now.
 %    \begin{macrocode}
     \cs_set_eq:NN \CodeAfter \prg_do_nothing:
@@ -8032,9 +8431,42 @@
 %    \end{macrocode}
 % And here's the |code-after|:
 %    \begin{macrocode}
-    \g_@@_code_after_tl 
-    \tl_gclear:N \g_@@_code_after_tl
+    \g_nicematrix_code_after_tl 
+    \tl_gclear:N \g_nicematrix_code_after_tl
     \group_end:
+%    \end{macrocode}
+% 
+% 
+% \medskip
+% |\g_@@_code_before_tl| is for instructions in the cells of the array such as
+% |\rowcolor| and |\cellcolor| (when the key |colortbl-like| is in
+% force). These instructions will be written on the |aux| file to be added to
+% the |code-before| in the next run.
+%    \begin{macrocode}
+    \tl_if_empty:NF \g_@@_code_before_tl
+      {
+%    \end{macrocode}
+% The command |\rowcolor| in tabular will in fact use |\rectanglecolor| in order
+% to follow the behaviour of |\rowcolor| of \pkg{colortbl}. That's why there may
+% be a command |\rectanglecolor| in |\g_@@_code_before_tl|. In order to avoid an
+% error during the expansion, we define a protected version of |\rectanglecolor|.
+%    \begin{macrocode}
+        \cs_set_protected:Npn \rectanglecolor { }
+        \cs_set_protected:Npn \columncolor { }
+        \iow_now:Nn \@mainaux \ExplSyntaxOn
+        \iow_now:Nx \@mainaux
+          {
+            \tl_gset:cn 
+              { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl }
+              { \g_@@_code_before_tl }
+          }
+        \iow_now:Nn \@mainaux \ExplSyntaxOff
+        \bool_set_true:N \l_@@_code_before_bool
+      }
+%    \end{macrocode}
+% 
+% \medskip
+%    \begin{macrocode}
     \str_gclear:N \g_@@_name_env_str
     \@@_restore_iRow_jCol:
 %    \end{macrocode}
@@ -9264,7 +9696,7 @@
       \@@_old_multicolumn 
       { #1 } 
 %    \end{macrocode}
-% We will have to replace |\tl_lower_case:n| in some times
+% We will have to replace |\tl_lower_case:n| in the future 
 % since |\tl_lower_case:n| seems to be deprecated.
 %    \begin{macrocode}
       { 
@@ -9671,7 +10103,7 @@
 % lines must be parallelized). 
 %
 % \bigskip
-% \subsection*{Commands available in the code-before}
+% \subsection*{Colors of cells, rows and columns}
 %
 % In the beginning of the |code-before|, the command |\@@_rowcolor:nn| will be
 % linked to |\rowcolor| and the command |\@@_columncolor:nn| to |\columncolor|.
@@ -9893,8 +10325,50 @@
       } 
   }
 %    \end{macrocode}
+%
+% \bigskip
+% When the user uses the key |colortbl-like|, the following command will
+% be linked to |\cellcolor| in the tabular.
+%    \begin{macrocode}
+\NewDocumentCommand \@@_cellcolor_tabular { O { } m }
+  {
+    \tl_gput_right:Nx \g_@@_code_before_tl
+      { \cellcolor [ #1 ] { #2 } { \int_use:N \c at iRow - \int_use:N \c at jCol } }  
+  }
+%    \end{macrocode}
 % 
 % \bigskip
+% When the user uses the key |rowcolor-in-tabular|, the following command will
+% be linked to |\rowcolor| in the tabular.
+%    \begin{macrocode}
+\NewDocumentCommand \@@_rowcolor_tabular { O { } m }
+  {
+    \tl_gput_right:Nx \g_@@_code_before_tl      
+      { 
+        \exp_not:N \rectanglecolor [ #1 ] { #2 } 
+          { \int_use:N \c at iRow - \int_use:N \c at jCol } 
+          { \int_use:N \c at iRow - \exp_not:n { \int_use:N \c at jCol } }
+      }  
+  }
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\NewDocumentCommand \@@_columncolor_preamble { O { } m }
+  { 
+    \int_compare:nNnT \c at iRow = 1
+      {
+%    \end{macrocode}
+% You use |gput_left| because we want the specification of colors for the
+% columns drawn before the specifications of color for the rows (and the cells).
+%    \begin{macrocode}
+        \tl_gput_left:Nx \g_@@_code_before_tl
+          { \exp_not:N \columncolor [ #1 ] { #2 } { \int_use:N \c at jCol } }
+      }
+  }
+%    \end{macrocode}
+% 
+% \bigskip
 % \subsection*{The vertical rules}
 %
 % We give to the user the possibility to define new types of columns (with
@@ -9951,36 +10425,54 @@
 % |\int_compare:nNnT \c at iRow < \l_@@_last_row_int|).
 % 
 % 
-% \medskip
-% In fact, independently of |\OnlyMainNiceMatrix|, which is a convenience given
-% to the user, we have to modify the behaviour of the standard specifier ``"|"''.
 %
-% 
-% Remark first that the natural way to do that would be to redefine the
-% specifier ``"|"'' with |\newcolumntype|:
-% \begin{Verbatim}[commandchars=\~\#\+]
-%    \newcolumntype { | } { ! { \OnlyMainNiceMatrix \vline } } 
-% \end{Verbatim}
-% 
-% However, this code fails if the user uses "\DefineShortVerb{\|}" of
-% \pkg{fancyvrb}. Moreover, it would not be able to deal correctly with two
-% consecutive specifiers ``"|"'' (in a preambule like "ccc||ccc").
 %
-% That's why we have done a redefinition of the macro |\@arrayrule| of
-% \pkg{array} and this redefinition will add |\@@_vline:| instead of |\vline|
-% in the preamble (that definition is in the beginning of
-% |{NiceArrayWithDelims}|). 
+% \bigskip
+% The following command will be executed in the |internal-code-after|. |#1| is
+% the number the column where to draw the rule and |#2| is the number of
+% consecutive occurrences of \verb+|+.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_vline:nn #1 #2
+  {
+    \bool_if:NTF \c_@@_tikz_loaded_bool
+      {
+        \tikzpicture
+        \@@_vline_i:nn { #1 } { #2 }
+        \endtikzpicture
+      }
+      {
+        \pgfpicture
+        \@@_vline_i:nn { #1 } { #2 }
+        \endpgfpicture
+      }
+  }
+%    \end{macrocode}
 %
-% Here is the definition of |\@@_vline:|. This definition \emph{must} be
-% protected because you don't want that macro expanded during the construction
-% of the preamble (the tests in |\@@_OnlyMainNiceMatrix:n| must be effective in
-% each row and not once for all when the preamble is constructed). The command
-% |\CT at 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.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_vline:
-  { \@@_OnlyMainNiceMatrix:n { { \CT at arc@ \vline } } } 
+\cs_new_protected:Npn \@@_vline_i:nn #1 #2 
+  {
+    \CT at arc@
+    \pgfrememberpicturepositiononpagetrue
+    \pgf at relevantforpicturesizefalse
+    \pgfsetlinewidth { 1.1 \arrayrulewidth }
+    \pgfsetrectcap
+    \@@_qpoint:n { row - 1 }
+    \dim_set_eq:NN \l_tmpa_dim \pgf at y
+    \@@_qpoint:n { col - \int_eval:n { #1 + 1 } }
+    \dim_set_eq:NN \l_tmpb_dim \pgf at x
+    \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+    \@@_qpoint:n { row - \@@_succ:n \c at iRow }
+    \dim_set_eq:NN \l_tmpc_dim \pgf at y
+    \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+    \prg_replicate:nn { #2 - 1 }
+      {
+        \dim_sub:Nn \l_tmpb_dim \arrayrulewidth
+        \dim_sub:Nn \l_tmpb_dim \doublerulesep
+        \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+        \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+      }
+    \pgfusepathqstroke
+  }
 %    \end{macrocode}
 %
 % \bigskip
@@ -10454,7 +10946,7 @@
 \cs_new_protected:Npn \@@_hdottedline_i:
   { 
 %    \end{macrocode}
-% We write in the code-after the instruction that will potentially draw the
+% We write in the code-after the instruction that will actually draw the
 % dotted line.  It's not possible to draw this dotted line now because we don't
 % know the length of the line (we don't even know the number of columns).
 %    \begin{macrocode}
@@ -11145,6 +11637,8 @@
   {
     tikz .tl_set:N = \l_@@_tikz_tl ,
     tikz .value_required:n = true ,
+    color .tl_set:N = \l_@@_color_tl ,
+    color .value_required:n = true ,
   }
 %    \end{macrocode}
 %
@@ -11160,13 +11654,25 @@
 \cs_new_protected:Npn \@@_Block_iii:nnnnnn #1 #2 #3 #4 #5 #6
   { 
 %    \end{macrocode}
-% The group is for the keys (even if, as of now, there is only one key, called
-% |tikz| and not documented).
+% The group is for the keys.
 %    \begin{macrocode}
     \group_begin:
     \keys_set:nn { NiceMatrix / Block } { #5 }
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+    \tl_if_empty:NF \l_@@_color_tl
+      {
+        \tl_gput_right:Nx \g_@@_code_before_tl
+          { 
+            \exp_not:N \rectanglecolor 
+              { \l_@@_color_tl } 
+              { #1 - #2 } 
+              { #3 - #4 } 
+          }  
+      }
+%    \end{macrocode}
+% 
 % \medskip
 %    \begin{macrocode}
      \cs_set_protected:Npn \diagbox ##1 ##2
@@ -11174,7 +11680,8 @@
          \tl_gput_right:Nx \g_@@_internal_code_after_tl    
            { 
              \@@_actually_diagbox:nnnnnn 
-               { #1 } { #2 } { #3 } { #4 } { ##1 } { ##2 }
+               { #1 } { #2 } { #3 } { #4 } 
+               { \exp_not:n { ##1 } } { \exp_not:n { ##2 } }
            }
        }  
 %    \end{macrocode}
@@ -11258,7 +11765,7 @@
 %
 % We construct the node for the block with the name |(#1-#2-block)|.
 %
-% The function |\@@_pgf_rect_node:nnnnn| takes as arguments the name of the node
+% The function |\@@_pgf_rect_node:nnnnn| takes in as arguments the name of the node
 % and the four coordinates of two opposite corner points of the rectangle.
 %    \begin{macrocode}
           \begin { pgfscope }
@@ -11318,7 +11825,7 @@
 % 
 % \medskip
 % If the creation of the ``medium nodes'' is required, we create a ``medium
-% node'' for the block. The function |\@@_pgf_rect_node:nnnnn| takes as
+% node'' for the block. The function |\@@_pgf_rect_node:nnnnn| takes in as
 % arguments the name of the node and two \textsc{pgf} points.
 %    \begin{macrocode}
         \bool_if:NT \l_@@_medium_nodes_bool
@@ -11528,8 +12035,8 @@
           { \int_use:N \c at jCol } 
           { \int_use:N \c at iRow } 
           { \int_use:N \c at jCol } 
-          { #1 } 
-          { #2 }
+          { \exp_not:n { #1 } } 
+          { \exp_not:n { #2 } }
       }
 %    \end{macrocode}
 % We put the cell with |\diagbox| in the sequence |\g_@@_pos_of_blocks_seq|
@@ -11611,7 +12118,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_CodeAfter:n #1 \end
   {
-    \tl_gput_right:Nn \g_@@_code_after_tl { #1 }
+    \tl_gput_right:Nn \g_nicematrix_code_after_tl { #1 }
     \@@_CodeAfter_i:n
   }
 %    \end{macrocode}
@@ -11628,11 +12135,11 @@
       { \end { #1 } }
 %    \end{macrocode}
 % If this is not the |\end| we are looking for, we put those tokens in
-% |\g_@@_code_after_tl| and we go on searching for the next command |\end| with
-% a recursive call to the command |\@@_CodeAfter:n|.
+% |\g_nicematrix_code_after_tl| and we go on searching for the next command
+% |\end| with a recursive call to the command |\@@_CodeAfter:n|.
 %    \begin{macrocode}
       { 
-        \tl_gput_right:Nn \g_@@_code_after_tl { \end { #1 } } 
+        \tl_gput_right:Nn \g_nicematrix_code_after_tl { \end { #1 } } 
         \@@_CodeAfter:n
       } 
   }
@@ -11767,15 +12274,26 @@
 % \bigskip
 % \subsection*{Error messages of the package}
 %
+% The following command converts all the elements of a sequence (which are token
+% lists) into strings. 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_convert_to_str_seq:N #1
+  {
+    \seq_clear:N \l_tmpa_seq
+    \seq_map_inline:Nn #1 
+      {
+        \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
+      }
+    \seq_set_eq:NN #1 \l_tmpa_seq
+  }
+%    \end{macrocode}
 % 
-% The following command creates a sequence of strings (|str|) from a |clist|. Be
-% careful: we use |\seq_set_map:NNn| and the name of that function will maybe
-% change to |\eq_set_map_x:NNn|.
+% The following command creates a sequence of strings (|str|) from a |clist|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_set_seq_of_str_from_clist:Nn #1 #2
   {
     \seq_set_from_clist:Nn #1 { #2 }
-    \seq_set_map:NNn #1 #1 { \tl_to_str:n { ##1 } }
+    \@@_convert_to_str_seq:N #1
   }
 %    \end{macrocode}
 % 
@@ -11824,8 +12342,8 @@
   { 
     You~try~to~use~more~columns~than~allowed~by~your~
     \@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~
-    columns~is~\int_eval:n { \l_@@_last_col_int - 1 }~(plus~the~potential~
-    exterior~ones).~This~error~is~fatal. 
+    columns~is~\int_eval:n { \l_@@_last_col_int - 1 }~(plus~the~
+    exterior~columns).~This~error~is~fatal.
   }
 %    \end{macrocode}
 % 
@@ -11837,7 +12355,7 @@
     \@@_full_name_env:.\@@_message_hdotsfor:\ Recall~that~the~maximal~
     number~of~columns~for~a~matrix~is~fixed~by~the~LaTeX~counter~
     'MaxMatrixCols'.~Its~actual~value~is~\int_use:N \c at MaxMatrixCols.~
-    This~error~is~fatal.  
+    This~error~is~fatal.
   }
 %    \end{macrocode}
 %
@@ -11850,12 +12368,32 @@
   { 
     You~try~to~use~more~columns~than~allowed~by~your~
     \@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~columns~is~ 
-    \int_eval:n { \c at jCol - 1 }~(plus~the~potential~exterior~ones).~
+    \int_use:N \g_@@_static_num_of_col_int\ 
+    ~(plus~the~potential~exterior~ones).~ 
     This~error~is~fatal.
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
+\@@_msg_new:nn { last~col~not~used }
+  {
+    The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
+    in~your~\@@_full_name_env:.~However,~you~can~go~on.
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { columns~not~used }
+  {
+    The~preamble~of~your~\@@_full_name_env:\ announces~\int_use:N
+    \g_@@_static_num_of_col_int\
+    columns~but~you~use~only~\int_use:N \c at jCol.\\
+    However,~you~can~go~on.
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
 \@@_msg_new:nn { in~first~col }
   {
     You~can't~use~the~command~#1 in~the~first~column~(number~0)~of~the~array.\\
@@ -11998,6 +12536,15 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
+\@@_msg_new:nn { unknown~column~type }
+  {
+    The~column~type~'#1'~in~your~\@@_full_name_env:\ 
+    is~unknown. \\
+    This~error~is~fatal.
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
 \@@_msg_new:nn { angle~option~in~NiceTabular }
   {
     You~should~not~the~option~between~angle~brackets~(<~and~>)~for~a~command~
@@ -12100,9 +12647,9 @@
   { 
     The~available~options~are~(in~alphabetic~order):~
     allow-duplicate-names,~
-    code-for-first-col,~
     cell-space-bottom-limit,~
     cell-space-top-limit,~
+    code-for-first-col,~
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
@@ -12154,6 +12701,7 @@
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
+    colortbl-like,~
     columns-width,~
     create-extra-nodes,~
     create-medium-nodes,~
@@ -12209,6 +12757,7 @@
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
+    colortbl-like,~
     columns-width,~
     create-extra-nodes,~
     create-medium-nodes,~
@@ -12219,7 +12768,7 @@
     first-row,~
     hlines,~
     hvlines,~
-    l~(=L),~
+    l,~
     last-col,~
     last-row,~
     left-margin,~
@@ -12226,7 +12775,7 @@
     light-syntax,~
     name,~
     nullify-dots,~
-    r~(=R),~
+    r,~
     renew-dots,~
     right-margin,~
     rules/color,~
@@ -12261,6 +12810,7 @@
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
+    colortbl-like,~
     columns-width,~
     create-extra-nodes,~
     create-medium-nodes,~
@@ -12647,6 +13197,18 @@
 %
 % Command |\tabularnote|
 %
+% \subsection*{Changes between versions 5.0 and 5.1}
+%
+% The vertical rules specified by \verb+|+ in the preamble are not broken by
+% |\hline\hline| (and other).
+% 
+% Environment |{NiceTabular*}|
+%
+% Command |\Vdotsfor| similar to |\Hdotsfor|
+%
+% The variable |\g_nicematrix_code_after_tl| is now public.
+%
+%
 % \PrintIndex
 % 
 % \tableofcontents

Modified: trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2020-07-31 21:45:10 UTC (rev 56007)
+++ trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2020-07-31 21:45:27 UTC (rev 56008)
@@ -18,8 +18,9 @@
 %% and version 1.3 or later is part of all distributions of
 %% LaTeX version 2005/12/01 or later.
 %% 
-\def\myfileversion{5.0}
-\def\myfiledate{2020/07/15}
+\def\myfileversion{5.1}
+\def\myfiledate{2020/07/31}
+
 \RequirePackage{pgfcore}
 \usepgfmodule{shapes}
 \RequirePackage{l3keys2e}
@@ -35,6 +36,7 @@
 \cs_new_protected:Npn \__nicematrix_error:nn { \msg_error:nnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_error:nnn { \msg_error:nnnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_fatal:n { \msg_fatal:nn { nicematrix } }
+\cs_new_protected:Npn \__nicematrix_fatal:nn { \msg_fatal:nnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_msg_new:nn { \msg_new:nnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_msg_new:nnn { \msg_new:nnnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_msg_redirect_name:nn
@@ -208,6 +210,18 @@
           }
       }
   }
+\regex_const:Nn \c__nicematrix_columncolor_regex { \c { columncolor } }
+\cs_new_protected:Npn \__nicematrix_provide_pgfsyspdfmark:
+  {
+    \iow_now:Nn \@mainaux
+      {
+        \ExplSyntaxOn
+        \cs_if_free:NT \pgfsyspdfmark
+          { \cs_set_eq:NN \pgfsyspdfmark \use:nnn }
+        \ExplSyntaxOff
+      }
+    \cs_gset_eq:NN \__nicematrix_provide_pgfsyspdfmark: \prg_do_nothing:
+  }
 \bool_new:N \c__nicematrix_define_L_C_R_bool
 \cs_new_protected:Npn \__nicematrix_define_L_C_R:
   {
@@ -227,6 +241,8 @@
 \bool_new:N \l__nicematrix_in_env_bool
 \bool_new:N \l__nicematrix_NiceArray_bool
 \bool_new:N \l__nicematrix_NiceTabular_bool
+\dim_new:N \l__nicematrix_tabular_width_dim
+\bool_new:N \l__nicematrix_Matrix_bool
 \cs_new_protected:Npn \__nicematrix_test_if_math_mode:
   {
     \if_mode_math: \else:
@@ -243,12 +259,13 @@
       { command \space \c_backslash_str \g__nicematrix_name_env_str }
       { environment \space \{ \g__nicematrix_name_env_str \} }
   }
-\tl_new:N \g__nicematrix_code_after_tl
+\tl_new:N \g_nicematrix_code_after_tl
 \tl_new:N \g__nicematrix_internal_code_after_tl
 \int_new:N \l__nicematrix_old_iRow_int
 \int_new:N \l__nicematrix_old_jCol_int
 \tl_new:N \l__nicematrix_rules_color_tl
 \bool_new:N \g__nicematrix_row_of_col_done_bool
+\tl_new:N \l__nicematrix_code_before_tl
 \bool_new:N \l__nicematrix_code_before_bool
 \dim_new:N \l__nicematrix_x_initial_dim
 \dim_new:N \l__nicematrix_y_initial_dim
@@ -263,6 +280,8 @@
 \seq_new:N \g__nicematrix_blocks_seq
 \seq_new:N \g__nicematrix_pos_of_blocks_seq
 \seq_new:N \g__nicematrix_pos_of_xdots_seq
+\int_new:N \g__nicematrix_static_num_of_col_int
+\tl_new:N \l__nicematrix_color_tl
 \int_new:N \l__nicematrix_first_row_int
 \int_set:Nn \l__nicematrix_first_row_int 1
 \int_new:N \l__nicematrix_first_col_int
@@ -386,6 +405,7 @@
       { }
     \end { pgfscope }
   }
+\bool_new:N \l__nicematrix_colortbl_like_bool
 \bool_new:N \l__nicematrix_standard_cline_bool
 \dim_new:N \l__nicematrix_cell_space_top_limit_dim
 \dim_new:N \l__nicematrix_cell_space_bottom_limit_dim
@@ -501,7 +521,7 @@
     extra-right-margin .dim_set:N = \l__nicematrix_extra_right_margin_dim ,
     extra-margin .meta:n =
       { extra-left-margin = #1 , extra-right-margin = #1 } ,
-    extra-margin .value_required:n = true
+    extra-margin .value_required:n = true ,
   }
 \keys_define:nn { NiceMatrix / Env }
   {
@@ -511,7 +531,7 @@
       {
         \tl_if_empty:nF { #1 }
           {
-            \tl_set:Nn \l__nicematrix_code_before_tl { #1 }
+            \tl_put_right:Nn \l__nicematrix_code_before_tl { #1 }
             \bool_set_true:N \l__nicematrix_code_before_bool
           }
       } ,
@@ -535,8 +555,12 @@
           \str_set_eq:NN \l__nicematrix_name_str \l_tmpa_str
         } ,
     name .value_required:n = true ,
-    code-after .tl_gset:N = \g__nicematrix_code_after_tl ,
+    code-after .tl_gset:N = \g_nicematrix_code_after_tl ,
     code-after .value_required:n = true ,
+    colortbl-like .code:n =
+      \bool_set_true:N \l__nicematrix_colortbl_like_bool
+      \bool_set_true:N \l__nicematrix_code_before_bool ,
+    colortbl-like .value_forbidden:n = true
   }
 \keys_define:nn { NiceMatrix / notes }
   {
@@ -593,9 +617,7 @@
 \keys_define:nn { NiceMatrix }
   {
     NiceMatrixOptions .inherit:n =
-      {
-        NiceMatrix / Global ,
-      } ,
+      { NiceMatrix / Global } ,
     NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots ,
     NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules ,
     NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes ,
@@ -672,8 +694,6 @@
                          { \int_set:Nn \l__nicematrix_last_col_int { #1 } } ,
     l .code:n = \tl_set:Nn \l__nicematrix_type_of_col_tl l ,
     r .code:n = \tl_set:Nn \l__nicematrix_type_of_col_tl r ,
-    L .code:n = \tl_set:Nn \l__nicematrix_type_of_col_tl l ,
-    R .code:n = \tl_set:Nn \l__nicematrix_type_of_col_tl r ,
     S .code:n = \bool_if:NTF \c__nicematrix_siunitx_loaded_bool
                   { \tl_set:Nn \l__nicematrix_type_of_col_tl S }
                   { \__nicematrix_error:n { option~S~without~siunitx } } ,
@@ -835,17 +855,27 @@
           { \exp_not:n { #2 } }
       }
   }
+\cs_new_protected:Npn \__nicematrix_revtex_array:
+  {
+    \cs_set_eq:NN \@acoll \@arrayacol
+    \cs_set_eq:NN \@acolr \@arrayacol
+    \cs_set_eq:NN \@acol \@arrayacol
+    \cs_set:Npn \@halignto { }
+    \@array at array
+  }
 \cs_new_protected:Npn \__nicematrix_array:
   {
     \bool_if:NTF \c__nicematrix_revtex_bool
+      \__nicematrix_revtex_array:
       {
-        \cs_set_eq:NN \@acoll \@arrayacol
-        \cs_set_eq:NN \@acolr \@arrayacol
-        \cs_set_eq:NN \@acol \@arrayacol
-        \cs_set:Npn \@halignto { }
-        \@array at array
+        \bool_if:NTF \l__nicematrix_NiceTabular_bool
+          { \dim_set_eq:NN \col at sep \tabcolsep }
+          { \dim_set_eq:NN \col at sep \arraycolsep }
+        \dim_compare:nNnTF \l__nicematrix_tabular_width_dim = \c_zero_dim
+          { \cs_set:Npn \@halignto { } }
+          { \cs_set:Npx \@halignto { to \dim_use:N \l__nicematrix_tabular_width_dim } }
+        \@tabarray
       }
-      \array
     [ \str_if_eq:VnTF \l__nicematrix_baseline_str c c t ]
   }
 \cs_set_eq:NN \__nicematrix_old_ialign: \ialign
@@ -894,26 +924,27 @@
   }
 \cs_set_protected:Npn \__nicematrix_newcolumntype #1
   {
-    % \cs_if_free:cT { NC @ find @ #1 }
-    %   { \NC at list \exp_after:wN { \the \NC at list \NC at do #1 } }
     \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
     \peek_meaning:NTF [
       { \newcol@ #1 }
       { \newcol@ #1 [ 0 ] }
   }
-\cs_new_protected:Npn \__nicematrix_define_columntype:nn #1 #2
+\cs_set_protected:Npn \__nicematrix_renew_dots:
   {
-    \__nicematrix_newcolumntype #1 [ 1 ]
+    \cs_set_eq:NN \ldots \__nicematrix_Ldots
+    \cs_set_eq:NN \cdots \__nicematrix_Cdots
+    \cs_set_eq:NN \vdots \__nicematrix_Vdots
+    \cs_set_eq:NN \ddots \__nicematrix_Ddots
+    \cs_set_eq:NN \iddots \__nicematrix_Iddots
+    \cs_set_eq:NN \dots \__nicematrix_Ldots
+    \cs_set_eq:NN \hdotsfor \__nicematrix_Hdotsfor:
+  }
+\cs_new_protected:Npn \__nicematrix_colortbl_like:
       {
-        > {
-            \__nicematrix_Cell:
-            \begin { minipage } [ #2 ] { ##1 }
-            \mode_leave_vertical: \box_use:N \@arstrutbox
-          }
-        c
-        < { \box_use:N \@arstrutbox \end { minipage } \__nicematrix_end_Cell: }
+        \cs_set_eq:NN \cellcolor \__nicematrix_cellcolor_tabular
+        \cs_set_eq:NN \rowcolor \__nicematrix_rowcolor_tabular
+        \cs_set_eq:NN \columncolor \__nicematrix_columncolor_preamble
       }
-  }
 \cs_new_protected:Npn \__nicematrix_pre_array:
   {
     \bool_if:NT \c__nicematrix_booktabs_loaded_bool
@@ -933,8 +964,6 @@
       }
     \cs_set:Npn \ialign
       {
-        \bool_if:NT \l__nicematrix_NiceTabular_bool
-          { \dim_set_eq:NN \arraycolsep \__nicematrix_old_arraycolsep_dim }
         \bool_if:NTF \c__nicematrix_colortbl_loaded_bool
           {
             \CT at everycr
@@ -964,8 +993,6 @@
     \cs_set_eq:NN \__nicematrix_old_vdots \vdots
     \cs_set_eq:NN \__nicematrix_old_ddots \ddots
     \cs_set_eq:NN \__nicematrix_old_iddots \iddots
-    \cs_set_eq:NN \firsthline \hline
-    \cs_set_eq:NN \lasthline \hline
     \bool_if:NTF \l__nicematrix_standard_cline_bool
       { \cs_set_eq:NN \cline \__nicematrix_standard_cline }
       { \cs_set_eq:NN \cline \__nicematrix_cline }
@@ -985,16 +1012,8 @@
     \cs_set_eq:NN \dotfill \__nicematrix_dotfill:
     \cs_set_eq:NN \CodeAfter \__nicematrix_CodeAfter:n
     \cs_set_eq:NN \diagbox \__nicematrix_diagbox:nn
-    \bool_if:NT \l__nicematrix_renew_dots_bool
-      {
-        \cs_set_eq:NN \ldots \__nicematrix_Ldots
-        \cs_set_eq:NN \cdots \__nicematrix_Cdots
-        \cs_set_eq:NN \vdots \__nicematrix_Vdots
-        \cs_set_eq:NN \ddots \__nicematrix_Ddots
-        \cs_set_eq:NN \iddots \__nicematrix_Iddots
-        \cs_set_eq:NN \dots \__nicematrix_Ldots
-        \cs_set_eq:NN \hdotsfor \__nicematrix_Hdotsfor:
-      }
+    \bool_if:NT \l__nicematrix_colortbl_like_bool \__nicematrix_colortbl_like:
+    \bool_if:NT \l__nicematrix_renew_dots_bool \__nicematrix_renew_dots:
     \seq_gclear_new:N \g__nicematrix_multicolumn_cells_seq
     \seq_gclear_new:N \g__nicematrix_multicolumn_sizes_seq
     \int_gset:Nn \c at iRow { \l__nicematrix_first_row_int - 1 }
@@ -1001,62 +1020,7 @@
     \int_gzero_new:N \g__nicematrix_row_total_int
     \int_gzero_new:N \g__nicematrix_col_total_int
     \cs_set_eq:NN \@ifnextchar \new at ifnextchar
-    \__nicematrix_define_columntype:nn p t
-    \__nicematrix_define_columntype:nn m c
-    \__nicematrix_define_columntype:nn b b
-    \__nicematrix_newcolumntype w [ 2 ]
-      {
-        > {
-            \hbox_set:Nw \l__nicematrix_cell_box
-            \__nicematrix_Cell:
-          }
-        \__nicematrix_true_c:
-        < {
-            \__nicematrix_end_Cell:
-            \hbox_set_end:
-            \tl_set:Nn \l_tmpa_tl { ##1 }
-            \makebox [ ##2 ] [ \__nicematrix_foldcase: ]
-              { \box_use_drop:N \l__nicematrix_cell_box }
-          }
-      }
-    \__nicematrix_newcolumntype W [ 2 ]
-      {
-        > {
-            \hbox_set:Nw \l__nicematrix_cell_box
-            \__nicematrix_Cell:
-          }
-        \__nicematrix_true_c:
-        < {
-            \__nicematrix_end_Cell:
-            \hbox_set_end:
-            \cs_set_eq:NN \hss \hfil
-            \tl_set:Nn \l_tmpa_tl { ##1 }
-            \makebox [ ##2 ] [ \__nicematrix_foldcase: ]
-              { \box_use_drop:N \l__nicematrix_cell_box }
-          }
-      }
-    \tl_set_rescan:Nno
-      \l__nicematrix_letter_for_dotted_lines_str { } \l__nicematrix_letter_for_dotted_lines_str
-    \exp_args:NV \newcolumntype \l__nicematrix_letter_for_dotted_lines_str
-      {
-        !
-          {
-            \int_compare:nNnF \c at iRow = 0
-              {
-                \int_compare:nNnF \c at iRow = \l__nicematrix_last_row_int
-                  { \skip_horizontal:N 2\l__nicematrix_radius_dim }
-              }
-            \int_compare:nNnT \c at jCol > \g__nicematrix_last_vdotted_col_int
-              {
-                \int_gset_eq:NN \g__nicematrix_last_vdotted_col_int \c at jCol
-                \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-                  { \__nicematrix_vdottedline:n { \int_use:N \c at jCol } }
-              }
-          }
-      }
-    \int_gzero_new:N \g__nicematrix_last_vdotted_col_int
     \__nicematrix_renew_NC at rewrite@S:
-    \int_gset:Nn \g__nicematrix_last_vdotted_col_int { -1 }
     \bool_gset_false:N \g__nicematrix_last_col_found_bool
     \tl_gclear_new:N \g__nicematrix_Cdots_lines_tl
     \tl_gclear_new:N \g__nicematrix_Ldots_lines_tl
@@ -1064,20 +1028,12 @@
     \tl_gclear_new:N \g__nicematrix_Ddots_lines_tl
     \tl_gclear_new:N \g__nicematrix_Iddots_lines_tl
     \tl_gclear_new:N \g__nicematrix_HVdotsfor_lines_tl
+    \tl_gclear_new:N \g__nicematrix_code_before_tl
   }
-\cs_set:Npn \__nicematrix_foldcase:
-  {
-    \tl_case:NnF \l_tmpa_tl
-      {
-        C { c }
-        L { l }
-        R { r }
-      }
-      { \l_tmpa_tl }
-  }
 \NewDocumentEnvironment { NiceArrayWithDelims } { m m O { } m ! O { } }
   {
-    \bool_if:NT \c__nicematrix_footnote_bool { \begin { savenotes } }
+    \__nicematrix_provide_pgfsyspdfmark:
+    \bool_if:NT \c__nicematrix_footnote_bool \savenotes
     \bgroup
     \tl_set:Nn \l__nicematrix_left_delim_tl { #1 }
     \tl_set:Nn \l__nicematrix_right_delim_tl { #2 }
@@ -1103,6 +1059,12 @@
     \cs_set_protected:Npn \@arrayrule { \@addtopreamble \__nicematrix_vline: }
     \seq_clear:N \g__nicematrix_blocks_seq
     \seq_clear:N \g__nicematrix_pos_of_blocks_seq
+    \tl_if_exist:cT { g__nicematrix_code_before_ \int_use:N \g__nicematrix_env_int _ tl }
+      {
+        \bool_set_true:N \l__nicematrix_code_before_bool
+        \exp_args:NNv \tl_put_right:Nn \l__nicematrix_code_before_tl
+          { g__nicematrix_code_before_ \int_use:N \g__nicematrix_env_int _ tl }
+      }
     \bool_if:NTF \l__nicematrix_NiceArray_bool
       { \keys_set:nn { NiceMatrix / NiceArray } }
       { \keys_set:nn { NiceMatrix / pNiceArray } }
@@ -1226,52 +1188,9 @@
         \dim_set:Nn \l__nicematrix_right_delim_dim { \box_wd:N \l_tmpa_box }
       }
     \box_clear_new:N \l__nicematrix_the_array_box
-    \tl_set:Nn \l_tmpa_tl { #4 }
     \bool_if:NT \c__nicematrix_define_L_C_R_bool \__nicematrix_define_L_C_R:
-    \@temptokena \exp_after:wN { \l_tmpa_tl }
-    \@tempswatrue
-    \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
-    \tl_gset:NV \l_tmpa_tl \@temptokena
-    \tl_replace_all:Nnn \l_tmpa_tl c { > \__nicematrix_Cell: c < \__nicematrix_end_Cell: }
-    \tl_replace_all:Nnn \l_tmpa_tl l { > \__nicematrix_Cell: l < \__nicematrix_end_Cell: }
-    \tl_replace_all:Nnn \l_tmpa_tl r { > \__nicematrix_Cell: r < \__nicematrix_end_Cell: }
-    \tl_replace_all:Nnn \l_tmpa_tl \__nicematrix_true_c: c
-    \int_compare:nNnTF \l__nicematrix_first_col_int = 0
-      { \tl_put_left:NV \l_tmpa_tl \c__nicematrix_preamble_first_col_tl }
-      {
-        \bool_lazy_all:nT
-          {
-            \l__nicematrix_NiceArray_bool
-            { \bool_not_p:n \l__nicematrix_NiceTabular_bool }
-            { \bool_not_p:n \l__nicematrix_vlines_bool }
-            { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool }
-          }
-          { \tl_put_left:Nn \l_tmpa_tl { @ { } } }
-      }
-    \int_compare:nNnTF \l__nicematrix_last_col_int > { -1 }
-      { \tl_put_right:NV \l_tmpa_tl \c__nicematrix_preamble_last_col_tl }
-      {
-        \bool_lazy_all:nT
-          {
-            \l__nicematrix_NiceArray_bool
-            { \bool_not_p:n \l__nicematrix_NiceTabular_bool }
-            { \bool_not_p:n \l__nicematrix_vlines_bool }
-            { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool }
-          }
-          { \tl_put_right:Nn \l_tmpa_tl { @ { } } }
-      }
-    \tl_put_right:Nn \l_tmpa_tl { > { \__nicematrix_error_too_much_cols: } l }
+    \__nicematrix_construct_preamble:n { #4 }
     \hbox_set:Nw \l__nicematrix_the_array_box
-    \bool_if:NT \l__nicematrix_NiceTabular_bool
-      {
-        \dim_set_eq:NN \__nicematrix_old_arraycolsep_dim \arraycolsep
-        \dim_set_eq:NN \arraycolsep \tabcolsep
-      }
-    \bool_if:NT \l__nicematrix_vlines_bool
-      {
-        \dim_add:Nn \arraycolsep { 0.5 \arrayrulewidth }
-        \skip_horizontal:N  0.5\arrayrulewidth
-      }
     \skip_horizontal:N \l__nicematrix_left_margin_dim
     \skip_horizontal:N \l__nicematrix_extra_left_margin_dim
     \c_math_toggle_token
@@ -1286,7 +1205,6 @@
     \c_math_toggle_token
     \skip_horizontal:N \l__nicematrix_right_margin_dim
     \skip_horizontal:N \l__nicematrix_extra_right_margin_dim
-    \bool_if:NT \l__nicematrix_vlines_bool { \skip_horizontal:N 0.5\arrayrulewidth }
     \hbox_set_end:
     \int_compare:nNnT \l__nicematrix_last_row_int > { -2 }
       {
@@ -1300,7 +1218,17 @@
           }
       }
     \int_gset_eq:NN \c at jCol \g__nicematrix_col_total_int
-    \bool_if:nT \g__nicematrix_last_col_found_bool { \int_gdecr:N \c at jCol }
+    \bool_if:nTF \g__nicematrix_last_col_found_bool
+      { \int_gdecr:N \c at jCol }
+      {
+        \int_compare:nNnT \l__nicematrix_last_col_int > { -1 }
+          { \__nicematrix_error:n { last~col~not~used } }
+      }
+    \bool_if:NF \l__nicematrix_Matrix_bool
+      {
+        \int_compare:nNnT \c at jCol < \g__nicematrix_static_num_of_col_int
+          { \__nicematrix_error:n { columns~not~used } }
+      }
     \int_gset_eq:NN \g__nicematrix_row_total_int \c at iRow
     \int_compare:nNnT \l__nicematrix_last_row_int > { -1 } { \int_gdecr:N \c at iRow }
     \int_compare:nNnT \l__nicematrix_first_col_int = 0
@@ -1310,51 +1238,12 @@
       }
     \bool_if:NTF \l__nicematrix_NiceArray_bool
       {
-        \str_if_eq:VnTF \l__nicematrix_baseline_str { b }
+        \str_case:VnF \l__nicematrix_baseline_str
           {
-            \pgfpicture
-              \__nicematrix_qpoint:n { row - 1 }
-              \dim_gset_eq:NN \g_tmpa_dim \pgf at y
-              \__nicematrix_qpoint:n { row - \int_use:N \c at iRow - base }
-              \dim_gsub:Nn \g_tmpa_dim \pgf at y
-            \endpgfpicture
-            \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
-            \int_compare:nNnT \l__nicematrix_first_row_int = 0
-              {
-                \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_ht_row_zero_dim
-                \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_dp_row_zero_dim
-              }
-            \box_move_up:nn \g_tmpa_dim { \__nicematrix_use_array_box_with_notes: }
+            b \__nicematrix_use_arraybox_with_notes_b:
+            c \__nicematrix_use_arraybox_with_notes_c:
           }
-          {
-            \str_if_eq:VnTF \l__nicematrix_baseline_str { c }
-              { \__nicematrix_use_array_box_with_notes: }
-              {
-                \str_if_eq:VnT \l__nicematrix_baseline_str { t }
-                  { \str_set:Nn \l__nicematrix_baseline_str { 1 } }
-                \int_set:Nn \l_tmpa_int \l__nicematrix_baseline_str
-                \bool_lazy_or:nnT
-                  { \int_compare_p:nNn \l_tmpa_int < \l__nicematrix_first_row_int }
-                  { \int_compare_p:nNn \l_tmpa_int > \g__nicematrix_row_total_int }
-                  {
-                    \__nicematrix_error:n { bad~value~for~baseline }
-                    \int_set:Nn \l_tmpa_int 1
-                  }
-                \pgfpicture
-                \__nicematrix_qpoint:n { row - 1 }
-                \dim_gset_eq:NN \g_tmpa_dim \pgf at y
-                \__nicematrix_qpoint:n { row - \int_use:N \l_tmpa_int - base }
-                \dim_gsub:Nn \g_tmpa_dim \pgf at y
-                \endpgfpicture
-                \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
-                \int_compare:nNnT \l__nicematrix_first_row_int = 0
-                  {
-                    \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_ht_row_zero_dim
-                    \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_dp_row_zero_dim
-                  }
-                \box_move_up:nn \g_tmpa_dim { \__nicematrix_use_array_box_with_notes: }
-              }
-          }
+          \__nicematrix_use_arraybox_with_notes:
       }
       {
         \int_compare:nNnTF \l__nicematrix_first_row_int = 0
@@ -1382,7 +1271,7 @@
                     \bool_if:NTF \l__nicematrix_NiceTabular_bool
                       { \skip_horizontal:N -\tabcolsep }
                       { \skip_horizontal:N -\arraycolsep }
-                    \__nicematrix_use_array_box_with_notes:
+                    \__nicematrix_use_arraybox_with_notes_c:
                     \bool_if:NTF \l__nicematrix_NiceTabular_bool
                       { \skip_horizontal:N -\tabcolsep }
                       { \skip_horizontal:N -\arraycolsep }
@@ -1404,8 +1293,195 @@
       }
     \__nicematrix_after_array:
     \egroup
-    \bool_if:NT \c__nicematrix_footnote_bool { \end { savenotes } }
+    \bool_if:NT \c__nicematrix_footnote_bool \endsavenotes
   }
+\cs_new_protected:Npn \__nicematrix_construct_preamble:n #1
+  {
+    \group_begin:
+    \bool_if:NTF \l__nicematrix_Matrix_bool
+      { \tl_gset:Nn \g__nicematrix_preamble_tl { #1 } }
+      {
+        \__nicematrix_newcolumntype w [ 2 ] { \__nicematrix_w: { ##1 } { ##2 } }
+        \__nicematrix_newcolumntype W [ 2 ] { \__nicematrix_W: { ##1 } { ##2 } }
+        \@temptokena { #1 }
+        \@tempswatrue
+        \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
+        \int_gzero_new:N \c at jCol
+        \bool_if:NTF \l__nicematrix_vlines_bool
+          {
+            \tl_gset:Nn \g__nicematrix_preamble_tl
+              { ! { \skip_horizontal:N \arrayrulewidth } }
+          }
+          { \tl_gclear:N \g__nicematrix_preamble_tl }
+        \int_zero:N \l_tmpa_int
+        \exp_after:wN \__nicematrix_patch_preamble:n \the \@temptokena \q_stop
+        \int_gset_eq:NN \g__nicematrix_static_num_of_col_int \c at jCol
+      }
+    \bool_if:NT \l__nicematrix_colortbl_like_bool
+      {
+        \regex_replace_all:NnN
+          \c__nicematrix_columncolor_regex
+          { \c { __nicematrix_columncolor_preamble } }
+          \g__nicematrix_preamble_tl
+      }
+    \int_compare:nNnTF \l__nicematrix_first_col_int = 0
+      { \tl_gput_left:NV \g__nicematrix_preamble_tl \c__nicematrix_preamble_first_col_tl }
+      {
+        \bool_lazy_all:nT
+          {
+            \l__nicematrix_NiceArray_bool
+            { \bool_not_p:n \l__nicematrix_NiceTabular_bool }
+            { \bool_not_p:n \l__nicematrix_vlines_bool }
+            { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool }
+          }
+          { \tl_gput_left:Nn \g__nicematrix_preamble_tl { @ { } } }
+      }
+    \int_compare:nNnTF \l__nicematrix_last_col_int > { -1 }
+      { \tl_gput_right:NV \g__nicematrix_preamble_tl \c__nicematrix_preamble_last_col_tl }
+      {
+        \bool_lazy_all:nT
+          {
+            \l__nicematrix_NiceArray_bool
+            { \bool_not_p:n \l__nicematrix_NiceTabular_bool }
+            { \bool_not_p:n \l__nicematrix_vlines_bool }
+            { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool }
+          }
+          { \tl_gput_right:Nn \g__nicematrix_preamble_tl { @ { } } }
+      }
+    \dim_compare:nNnT \l__nicematrix_tabular_width_dim = \c_zero_dim
+      {
+        \tl_gput_right:Nn
+          \g__nicematrix_preamble_tl
+          { > { \__nicematrix_error_too_much_cols: } l }
+      }
+    \group_end:
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble:n #1
+  {
+    \str_case:nnF { #1 }
+      {
+        c { \__nicematrix_patch_preamble_i:n #1 }
+        l { \__nicematrix_patch_preamble_i:n #1 }
+        r { \__nicematrix_patch_preamble_i:n #1 }
+        > { \__nicematrix_patch_preamble_ii:nn #1 }
+        < { \__nicematrix_patch_preamble_ii:nn #1 }
+        ! { \__nicematrix_patch_preamble_ii:nn #1 }
+        @ { \__nicematrix_patch_preamble_ii:nn #1 }
+        | { \__nicematrix_patch_preamble_iii:n #1 }
+        p { \__nicematrix_patch_preamble_iv:nnn t #1 }
+        m { \__nicematrix_patch_preamble_iv:nnn c #1 }
+        b { \__nicematrix_patch_preamble_iv:nnn b #1 }
+        \__nicematrix_w: { \__nicematrix_patch_preamble_v:nnnn { }                          #1 }
+        \__nicematrix_W: { \__nicematrix_patch_preamble_v:nnnn { \cs_set_eq:NN \hss \hfil } #1 }
+        \__nicematrix_true_c: { \__nicematrix_patch_preamble_vi:n #1 }
+        \q_stop { }
+      }
+      {
+        \str_if_eq:VnTF \l__nicematrix_letter_for_dotted_lines_str { #1 }
+          { \__nicematrix_patch_preamble_vii:n #1 }
+          { \__nicematrix_fatal:nn { unknown~column~type } { #1 } }
+      }
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_i:n #1
+  {
+    \tl_gput_right:Nn \g__nicematrix_preamble_tl { > \__nicematrix_Cell: #1 < \__nicematrix_end_Cell: }
+    \int_gincr:N \c at jCol
+    \bool_if:NT \l__nicematrix_vlines_bool
+      {
+        \tl_gput_right:Nn \g__nicematrix_preamble_tl
+          { ! { \skip_horizontal:N \arrayrulewidth } }
+      }
+    \__nicematrix_patch_preamble:n
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_ii:nn #1 #2
+  {
+    \tl_gput_right:Nn \g__nicematrix_preamble_tl { #1 { #2 } }
+    \__nicematrix_patch_preamble:n
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_iii:n #1
+  {
+    \int_incr:N \l_tmpa_int
+    \__nicematrix_patch_preamble_iii_i:n
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_iii_i:n #1
+  {
+    \str_if_eq:nnTF { #1 } |
+      { \__nicematrix_patch_preamble_iii:n | }
+      {
+        \tl_gput_right:Nx \g__nicematrix_preamble_tl
+          {
+            \exp_not:N !
+              {
+                \skip_horizontal:n
+                  {
+                    \dim_eval:n
+                      {
+                        \arrayrulewidth * \l_tmpa_int
+                        + \doublerulesep * ( \l_tmpa_int - 1)
+                      }
+                  }
+              }
+          }
+        \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+          { \__nicematrix_vline:nn { \int_use:N \c at jCol } { \int_use:N \l_tmpa_int } }
+        \int_zero:N \l_tmpa_int
+        \__nicematrix_patch_preamble:n #1
+      }
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_iv:nnn #1 #2 #3
+  {
+    \tl_gput_right:Nn \g__nicematrix_preamble_tl
+      {
+        > {
+            \__nicematrix_Cell:
+            \begin { minipage } [ #1 ] { #3 }
+            \mode_leave_vertical:
+            \box_use:N \@arstrutbox
+          }
+        c
+        < { \box_use:N \@arstrutbox \end { minipage } \__nicematrix_end_Cell: }
+      }
+    \int_gincr:N \c at jCol
+    \__nicematrix_patch_preamble:n
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_v:nnnn #1 #2 #3 #4
+  {
+    \tl_gput_right:Nn \g__nicematrix_preamble_tl
+      {
+        > {
+            \hbox_set:Nw \l__nicematrix_cell_box
+            \__nicematrix_Cell:
+          }
+        c
+        < {
+            \__nicematrix_end_Cell:
+            #1
+            \hbox_set_end:
+            \makebox [ #4 ] [ #3 ] { \box_use_drop:N \l__nicematrix_cell_box }
+          }
+      }
+    \int_gincr:N \c at jCol
+    \__nicematrix_patch_preamble:n
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_vi:n #1
+  {
+    \tl_gput_right:Nn \g__nicematrix_preamble_tl { c }
+    \int_gincr:N \c at jCol
+    \bool_if:NT \l__nicematrix_vlines_bool
+      {
+        \tl_gput_right:Nn \g__nicematrix_preamble_tl
+          { ! { \skip_horizontal:N \arrayrulewidth } }
+      }
+    \__nicematrix_patch_preamble:n
+  }
+\cs_new_protected:Npn \__nicematrix_patch_preamble_vii:n #1
+  {
+    \tl_gput_right:Nn \g__nicematrix_preamble_tl
+      { ! { \skip_horizontal:N 2\l__nicematrix_radius_dim } }
+    \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+      { \__nicematrix_vdottedline:n { \int_use:N \c at jCol } }
+    \__nicematrix_patch_preamble:n
+  }
 \cs_new_protected:Npn \__nicematrix_put_box_in_flow:
   {
     \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + \l_tmpa_dim }
@@ -1444,7 +1520,7 @@
     \box_move_up:nn \g_tmpa_dim { \box_use_drop:N \l_tmpa_box }
     \box_use_drop:N \l_tmpa_box
   }
-\cs_new_protected:Npn \__nicematrix_use_array_box_with_notes:
+\cs_new_protected:Npn \__nicematrix_use_arraybox_with_notes_c:
   {
     \int_compare:nNnTF \c at tabularnote = 0
       { \box_use_drop:N \l__nicematrix_the_array_box }
@@ -1483,6 +1559,48 @@
         \int_gzero:N \c at tabularnote
       }
   }
+\cs_new_protected:Npn \__nicematrix_use_arraybox_with_notes_b:
+  {
+    \pgfpicture
+      \__nicematrix_qpoint:n { row - 1 }
+      \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+      \__nicematrix_qpoint:n { row - \int_use:N \c at iRow - base }
+      \dim_gsub:Nn \g_tmpa_dim \pgf at y
+    \endpgfpicture
+    \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+    \int_compare:nNnT \l__nicematrix_first_row_int = 0
+      {
+        \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_ht_row_zero_dim
+        \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_dp_row_zero_dim
+      }
+    \box_move_up:nn \g_tmpa_dim { \__nicematrix_use_arraybox_with_notes_c: }
+  }
+\cs_new_protected:Npn \__nicematrix_use_arraybox_with_notes:
+  {
+    \str_if_eq:VnT \l__nicematrix_baseline_str { t }
+      { \str_set:Nn \l__nicematrix_baseline_str { 1 } }
+    \int_set:Nn \l_tmpa_int \l__nicematrix_baseline_str
+    \bool_lazy_or:nnT
+      { \int_compare_p:nNn \l_tmpa_int < \l__nicematrix_first_row_int }
+      { \int_compare_p:nNn \l_tmpa_int > \g__nicematrix_row_total_int }
+      {
+        \__nicematrix_error:n { bad~value~for~baseline }
+        \int_set:Nn \l_tmpa_int 1
+      }
+    \pgfpicture
+    \__nicematrix_qpoint:n { row - 1 }
+    \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+    \__nicematrix_qpoint:n { row - \int_use:N \l_tmpa_int - base }
+    \dim_gsub:Nn \g_tmpa_dim \pgf at y
+    \endpgfpicture
+    \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+    \int_compare:nNnT \l__nicematrix_first_row_int = 0
+      {
+        \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_ht_row_zero_dim
+        \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_dp_row_zero_dim
+      }
+    \box_move_up:nn \g_tmpa_dim { \__nicematrix_use_arraybox_with_notes_c: }
+  }
 \cs_new_protected:Npn \__nicematrix_put_box_in_flow_bis:nn #1 #2
   {
     \dim_zero_new:N \l__nicematrix_real_left_delim_dim
@@ -1522,9 +1640,8 @@
   }
 \NewDocumentEnvironment { __nicematrix-normal-syntax } { }
   {
-    \peek_meaning_ignore_spaces:NTF \end
-      { \__nicematrix_analyze_end:Nn }
-      { \exp_args:NV \__nicematrix_array: \l_tmpa_tl }
+    \peek_meaning_ignore_spaces:NTF \end \__nicematrix_analyze_end:Nn
+      { \exp_args:NV \__nicematrix_array: \g__nicematrix_preamble_tl }
   }
   {
     \__nicematrix_create_col_nodes:
@@ -1545,13 +1662,13 @@
   { }
 \cs_new_protected:Npn \__nicematrix_light_syntax_i #1\CodeAfter #2\q_stop
   {
-    \tl_gput_right:Nn \g__nicematrix_code_after_tl { #2 }
+    \tl_gput_right:Nn \g_nicematrix_code_after_tl { #2 }
     \seq_gclear_new:N \g__nicematrix_rows_seq
     \tl_set_rescan:Nno \l__nicematrix_end_of_row_tl { } \l__nicematrix_end_of_row_tl
     \exp_args:NNV \seq_gset_split:Nnn \g__nicematrix_rows_seq \l__nicematrix_end_of_row_tl { #1 }
     \int_compare:nNnT \l__nicematrix_last_row_int = { -1 }
       { \int_set:Nn \l__nicematrix_last_row_int { \seq_count:N \g__nicematrix_rows_seq } }
-    \exp_args:NV \__nicematrix_array: \l_tmpa_tl
+    \exp_args:NV \__nicematrix_array: \g__nicematrix_preamble_tl
     \seq_gpop_left:NN \g__nicematrix_rows_seq \l_tmpa_tl
     \exp_args:NV \__nicematrix_line_with_light_syntax_i:n \l_tmpa_tl
     \seq_map_function:NN \g__nicematrix_rows_seq \__nicematrix_line_with_light_syntax:n
@@ -1803,59 +1920,25 @@
     \NiceArrayWithDelims . .
   }
   { \endNiceArrayWithDelims }
-\NewDocumentEnvironment { pNiceArray } { }
+\cs_new_protected:Npn \__nicematrix_def_env:nnn #1 #2 #3
   {
-    \str_if_empty:NT \g__nicematrix_name_env_str
-      { \str_gset:Nn \g__nicematrix_name_env_str { pNiceArray } }
-    \__nicematrix_test_if_math_mode:
-    \NiceArrayWithDelims ( )
-  }
-  { \endNiceArrayWithDelims }
-\NewDocumentEnvironment { bNiceArray } { }
-  {
-    \str_if_empty:NT \g__nicematrix_name_env_str
-      { \str_gset:Nn \g__nicematrix_name_env_str { bNiceArray } }
-    \__nicematrix_test_if_math_mode:
-    \NiceArrayWithDelims [ ]
-  }
-  { \endNiceArrayWithDelims }
-\NewDocumentEnvironment { BNiceArray } { }
-  {
-    \str_if_empty:NT \g__nicematrix_name_env_str
-      { \str_gset:Nn \g__nicematrix_name_env_str { BNiceArray } }
-    \__nicematrix_test_if_math_mode:
-    \NiceArrayWithDelims \{ \}
-  }
-  { \endNiceArrayWithDelims }
-\NewDocumentEnvironment { vNiceArray } { }
-  {
-    \str_if_empty:NT \g__nicematrix_name_env_str
-      { \str_gset:Nn \g__nicematrix_name_env_str { vNiceArray } }
-    \__nicematrix_test_if_math_mode:
-    \NiceArrayWithDelims | |
-  }
-  { \endNiceArrayWithDelims }
-\NewDocumentEnvironment { VNiceArray } { }
-  {
-    \str_if_empty:NT \g__nicematrix_name_env_str
-      { \str_gset:Nn \g__nicematrix_name_env_str { VNiceArray } }
-    \__nicematrix_test_if_math_mode:
-    \NiceArrayWithDelims \| \|
-  }
-  { \endNiceArrayWithDelims }
-\cs_new_protected:Npn \__nicematrix_define_env:n #1
-  {
-    \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
+    \NewDocumentEnvironment { #1 NiceArray } { }
       {
-        \str_gset:Nn \g__nicematrix_name_env_str { #1 NiceMatrix }
-        \tl_set:Nn \l__nicematrix_type_of_col_tl c
-        \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
-        \exp_args:Nnx \__nicematrix_begin_of_NiceMatrix:nn { #1 } \l__nicematrix_type_of_col_tl
+        \str_if_empty:NT \g__nicematrix_name_env_str
+          { \str_gset:Nn \g__nicematrix_name_env_str { #1 NiceArray } }
+        \__nicematrix_test_if_math_mode:
+        \NiceArrayWithDelims #2 #3
       }
-      { \use:c { end #1 NiceArray } }
+      { \endNiceArrayWithDelims }
   }
+\__nicematrix_def_env:nnn p ( )
+\__nicematrix_def_env:nnn b [ ]
+\__nicematrix_def_env:nnn B \{ \}
+\__nicematrix_def_env:nnn v | |
+\__nicematrix_def_env:nnn V \| \|
 \cs_new_protected:Npn \__nicematrix_begin_of_NiceMatrix:nn #1 #2
   {
+    \bool_set_true:N \l__nicematrix_Matrix_bool
     \use:c { #1 NiceArray }
       {
         *
@@ -1864,15 +1947,20 @@
               \c at MaxMatrixCols
               { \__nicematrix_pred:n \l__nicematrix_last_col_int }
           }
-          #2
+          { > \__nicematrix_Cell: #2 < \__nicematrix_end_Cell: }
       }
   }
-\__nicematrix_define_env:n { }
-\__nicematrix_define_env:n p
-\__nicematrix_define_env:n b
-\__nicematrix_define_env:n B
-\__nicematrix_define_env:n v
-\__nicematrix_define_env:n V
+\clist_map_inline:nn { { } , p , b , B , v , V }
+  {
+    \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
+      {
+        \str_gset:Nn \g__nicematrix_name_env_str { #1 NiceMatrix }
+        \tl_set:Nn \l__nicematrix_type_of_col_tl c
+        \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
+        \exp_args:Nnx \__nicematrix_begin_of_NiceMatrix:nn { #1 } \l__nicematrix_type_of_col_tl
+      }
+      { \use:c { end #1 NiceArray } }
+  }
 \NewDocumentEnvironment { NiceTabular } { O { } m ! O { } }
   {
     \str_gset:Nn \g__nicematrix_name_env_str { NiceTabular }
@@ -1881,6 +1969,15 @@
     \NiceArray { #2 }
   }
   { \endNiceArray }
+\NewDocumentEnvironment { NiceTabular* } { m O { } m ! O { } }
+  {
+    \str_gset:Nn \g__nicematrix_name_env_str { NiceTabular* }
+    \dim_set:Nn \l__nicematrix_tabular_width_dim { #1 }
+    \keys_set:nn { NiceMatrix / NiceTabular } { #2 , #4 }
+    \bool_set_true:N \l__nicematrix_NiceTabular_bool
+    \NiceArray { #3 }
+  }
+  { \endNiceArray }
 \cs_new_protected:Npn \__nicematrix_after_array:
   {
     \group_begin:
@@ -2004,9 +2101,23 @@
       }
     \cs_set_eq:NN \line \__nicematrix_line
     \cs_set_eq:NN \CodeAfter \prg_do_nothing:
-    \g__nicematrix_code_after_tl
-    \tl_gclear:N \g__nicematrix_code_after_tl
+    \g_nicematrix_code_after_tl
+    \tl_gclear:N \g_nicematrix_code_after_tl
     \group_end:
+    \tl_if_empty:NF \g__nicematrix_code_before_tl
+      {
+        \cs_set_protected:Npn \rectanglecolor { }
+        \cs_set_protected:Npn \columncolor { }
+        \iow_now:Nn \@mainaux \ExplSyntaxOn
+        \iow_now:Nx \@mainaux
+          {
+            \tl_gset:cn
+              { g__nicematrix_code_before_ \int_use:N \g__nicematrix_env_int _ tl }
+              { \g__nicematrix_code_before_tl }
+          }
+        \iow_now:Nn \@mainaux \ExplSyntaxOff
+        \bool_set_true:N \l__nicematrix_code_before_bool
+      }
     \str_gclear:N \g__nicematrix_name_env_str
     \__nicematrix_restore_iRow_jCol:
     \cs_gset_eq:NN \CT at arc@ \__nicematrix_old_CT at arc@
@@ -3212,6 +3323,28 @@
           }
       }
   }
+\NewDocumentCommand \__nicematrix_cellcolor_tabular { O { } m }
+  {
+    \tl_gput_right:Nx \g__nicematrix_code_before_tl
+      { \cellcolor [ #1 ] { #2 } { \int_use:N \c at iRow - \int_use:N \c at jCol } }
+  }
+\NewDocumentCommand \__nicematrix_rowcolor_tabular { O { } m }
+  {
+    \tl_gput_right:Nx \g__nicematrix_code_before_tl
+      {
+        \exp_not:N \rectanglecolor [ #1 ] { #2 }
+          { \int_use:N \c at iRow - \int_use:N \c at jCol }
+          { \int_use:N \c at iRow - \exp_not:n { \int_use:N \c at jCol } }
+      }
+  }
+\NewDocumentCommand \__nicematrix_columncolor_preamble { O { } m }
+  {
+    \int_compare:nNnT \c at iRow = 1
+      {
+        \tl_gput_left:Nx \g__nicematrix_code_before_tl
+          { \exp_not:N \columncolor [ #1 ] { #2 } { \int_use:N \c at jCol } }
+      }
+  }
 \cs_set_eq:NN \OnlyMainNiceMatrix \use:n
 \cs_new_protected:Npn \__nicematrix_OnlyMainNiceMatrix:n #1
   {
@@ -3231,8 +3364,44 @@
     \int_compare:nNnF \c at iRow = 0
       { \int_compare:nNnF \c at iRow = \l__nicematrix_last_row_int { #1 } }
   }
-\cs_new_protected:Npn \__nicematrix_vline:
-  { \__nicematrix_OnlyMainNiceMatrix:n { { \CT at arc@ \vline } } }
+\cs_new_protected:Npn \__nicematrix_vline:nn #1 #2
+  {
+    \bool_if:NTF \c__nicematrix_tikz_loaded_bool
+      {
+        \tikzpicture
+        \__nicematrix_vline_i:nn { #1 } { #2 }
+        \endtikzpicture
+      }
+      {
+        \pgfpicture
+        \__nicematrix_vline_i:nn { #1 } { #2 }
+        \endpgfpicture
+      }
+  }
+\cs_new_protected:Npn \__nicematrix_vline_i:nn #1 #2
+  {
+    \CT at arc@
+    \pgfrememberpicturepositiononpagetrue
+    \pgf at relevantforpicturesizefalse
+    \pgfsetlinewidth { 1.1 \arrayrulewidth }
+    \pgfsetrectcap
+    \__nicematrix_qpoint:n { row - 1 }
+    \dim_set_eq:NN \l_tmpa_dim \pgf at y
+    \__nicematrix_qpoint:n { col - \int_eval:n { #1 + 1 } }
+    \dim_set_eq:NN \l_tmpb_dim \pgf at x
+    \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+    \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \c at iRow }
+    \dim_set_eq:NN \l_tmpc_dim \pgf at y
+    \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+    \prg_replicate:nn { #2 - 1 }
+      {
+        \dim_sub:Nn \l_tmpb_dim \arrayrulewidth
+        \dim_sub:Nn \l_tmpb_dim \doublerulesep
+        \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+        \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+      }
+    \pgfusepathqstroke
+  }
 \cs_new_protected:Npn \__nicematrix_draw_vlines:
   {
     \group_begin:
@@ -3854,6 +4023,8 @@
   {
     tikz .tl_set:N = \l__nicematrix_tikz_tl ,
     tikz .value_required:n = true ,
+    color .tl_set:N = \l__nicematrix_color_tl ,
+    color .value_required:n = true ,
   }
 \cs_new_protected:Npn \__nicematrix_draw_blocks:
   { \seq_map_inline:Nn \g__nicematrix_blocks_seq { \__nicematrix_Block_iii:nnnnnn ##1 } }
@@ -3861,12 +4032,23 @@
   {
     \group_begin:
     \keys_set:nn { NiceMatrix / Block } { #5 }
+    \tl_if_empty:NF \l__nicematrix_color_tl
+      {
+        \tl_gput_right:Nx \g__nicematrix_code_before_tl
+          {
+            \exp_not:N \rectanglecolor
+              { \l__nicematrix_color_tl }
+              { #1 - #2 }
+              { #3 - #4 }
+          }
+      }
      \cs_set_protected:Npn \diagbox ##1 ##2
        {
          \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
            {
              \__nicematrix_actually_diagbox:nnnnnn
-               { #1 } { #2 } { #3 } { #4 } { ##1 } { ##2 }
+               { #1 } { #2 } { #3 } { #4 }
+               { \exp_not:n { ##1 } } { \exp_not:n { ##2 } }
            }
        }
     \bool_lazy_or:nnTF
@@ -4046,8 +4228,8 @@
           { \int_use:N \c at jCol }
           { \int_use:N \c at iRow }
           { \int_use:N \c at jCol }
-          { #1 }
-          { #2 }
+          { \exp_not:n { #1 } }
+          { \exp_not:n { #2 } }
       }
     \seq_gput_right:Nx \g__nicematrix_pos_of_blocks_seq
       {
@@ -4090,7 +4272,7 @@
   }
 \cs_new_protected:Npn \__nicematrix_CodeAfter:n #1 \end
   {
-    \tl_gput_right:Nn \g__nicematrix_code_after_tl { #1 }
+    \tl_gput_right:Nn \g_nicematrix_code_after_tl { #1 }
     \__nicematrix_CodeAfter_i:n
   }
 \cs_new_protected:Npn \__nicematrix_CodeAfter_i:n #1
@@ -4098,7 +4280,7 @@
     \str_if_eq:eeTF \@currenvir { #1 }
       { \end { #1 } }
       {
-        \tl_gput_right:Nn \g__nicematrix_code_after_tl { \end { #1 } }
+        \tl_gput_right:Nn \g_nicematrix_code_after_tl { \end { #1 } }
         \__nicematrix_CodeAfter:n
       }
   }
@@ -4174,10 +4356,19 @@
       }
     \bool_set_true:N \c__nicematrix_footnote_bool
   }
+\cs_new_protected:Npn \__nicematrix_convert_to_str_seq:N #1
+  {
+    \seq_clear:N \l_tmpa_seq
+    \seq_map_inline:Nn #1
+      {
+        \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
+      }
+    \seq_set_eq:NN #1 \l_tmpa_seq
+  }
 \cs_new_protected:Npn \__nicematrix_set_seq_of_str_from_clist:Nn #1 #2
   {
     \seq_set_from_clist:Nn #1 { #2 }
-    \seq_set_map:NNn #1 #1 { \tl_to_str:n { ##1 } }
+    \__nicematrix_convert_to_str_seq:N #1
   }
 \__nicematrix_set_seq_of_str_from_clist:Nn \c__nicematrix_types_of_matrix_seq
   {
@@ -4206,8 +4397,8 @@
   {
     You~try~to~use~more~columns~than~allowed~by~your~
     \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ The~maximal~number~of~
-    columns~is~\int_eval:n { \l__nicematrix_last_col_int - 1 }~(plus~the~potential~
-    exterior~ones).~This~error~is~fatal.
+    columns~is~\int_eval:n { \l__nicematrix_last_col_int - 1 }~(plus~the~
+    exterior~columns).~This~error~is~fatal.
   }
 \__nicematrix_msg_new:nn { too~much~cols~for~matrix }
   {
@@ -4221,9 +4412,22 @@
   {
     You~try~to~use~more~columns~than~allowed~by~your~
     \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ The~maximal~number~of~columns~is~
-    \int_eval:n { \c at jCol - 1 }~(plus~the~potential~exterior~ones).~
+    \int_use:N \g__nicematrix_static_num_of_col_int\
+    ~(plus~the~potential~exterior~ones).~
     This~error~is~fatal.
   }
+\__nicematrix_msg_new:nn { last~col~not~used }
+  {
+    The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
+    in~your~\__nicematrix_full_name_env:.~However,~you~can~go~on.
+  }
+\__nicematrix_msg_new:nn { columns~not~used }
+  {
+    The~preamble~of~your~\__nicematrix_full_name_env:\ announces~\int_use:N
+    \g__nicematrix_static_num_of_col_int\
+    columns~but~you~use~only~\int_use:N \c at jCol.\\
+    However,~you~can~go~on.
+  }
 \__nicematrix_msg_new:nn { in~first~col }
   {
     You~can't~use~the~command~#1 in~the~first~column~(number~0)~of~the~array.\\
@@ -4311,6 +4515,12 @@
     You~try~to~draw~a~block~in~the~cell~#1-#2~of~your~matrix~but~the~matrix~is~
     too~small~for~that~block. \\
   }
+\__nicematrix_msg_new:nn { unknown~column~type }
+  {
+    The~column~type~'#1'~in~your~\__nicematrix_full_name_env:\
+    is~unknown. \\
+    This~error~is~fatal.
+  }
 \__nicematrix_msg_new:nn { angle~option~in~NiceTabular }
   {
     You~should~not~the~option~between~angle~brackets~(<~and~>)~for~a~command~
@@ -4384,9 +4594,9 @@
   {
     The~available~options~are~(in~alphabetic~order):~
     allow-duplicate-names,~
-    code-for-first-col,~
     cell-space-bottom-limit,~
     cell-space-top-limit,~
+    code-for-first-col,~
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
@@ -4435,6 +4645,7 @@
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
+    colortbl-like,~
     columns-width,~
     create-extra-nodes,~
     create-medium-nodes,~
@@ -4483,6 +4694,7 @@
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
+    colortbl-like,~
     columns-width,~
     create-extra-nodes,~
     create-medium-nodes,~
@@ -4493,7 +4705,7 @@
     first-row,~
     hlines,~
     hvlines,~
-    l~(=L),~
+    l,~
     last-col,~
     last-row,~
     left-margin,~
@@ -4500,7 +4712,7 @@
     light-syntax,~
     name,~
     nullify-dots,~
-    r~(=R),~
+    r,~
     renew-dots,~
     right-margin,~
     rules/color,~
@@ -4532,6 +4744,7 @@
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
+    colortbl-like,~
     columns-width,~
     create-extra-nodes,~
     create-medium-nodes,~



More information about the tex-live-commits mailing list.