texlive[58987] Master/texmf-dist: nicematrix (25apr21)

commits+karl at tug.org commits+karl at tug.org
Sun Apr 25 22:00:35 CEST 2021


Revision: 58987
          http://tug.org/svn/texlive?view=revision&revision=58987
Author:   karl
Date:     2021-04-25 22:00:35 +0200 (Sun, 25 Apr 2021)
Log Message:
-----------
nicematrix (25apr21)

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	2021-04-25 20:00:09 UTC (rev 58986)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2021-04-25 20:00:35 UTC (rev 58987)
@@ -114,7 +114,7 @@
 
 L'extension \pkg{nicematrix} est entièrement contenue dans le fichier |nicematrix.sty|. Ce fichier peut être placé
 dans le répertoire courant ou dans une arborescence |texmf|. Le mieux reste néanmoins d'installer \pkg{nicematrix}
-avec une distribution TeX comme MiKTeX ou TeXlive.
+avec une distribution TeX comme MiKTeX, TeXlive ou MacTeX.
 
 \bigskip
 \emph{Remarque} : Si vous utilisez un service LaTeX via Internet (ex. :
@@ -413,7 +413,8 @@
 
 
 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. 
+|\Block| pour placer un élément au centre d'un rectangle de cases
+fusionnées.\footnote{Les espaces situés après une commande \verb|\Block| sont supprimés.}
 
 La commande |\Block| doit être utilisée dans la case supérieure gauche du bloc
 avec deux arguments obligatoires.
@@ -530,6 +531,8 @@
 \item la clé |borders| permet de ne tracer que certaines des bordures du bloc :
 cette clé prend comme valeur une liste d'éléments parmi les suivants : |left|,
 |right|, |top| et |bottom| ;
+\item \colorbox{yellow!50}{\bfseries Nouveau 5.15}\enskip la clé |hvlines| trace
+tous les filets horizontaux et verticaux dans le bloc ;
 \item \colorbox{yellow!50}{\bfseries Nouveau 5.14}\enskip les clés |t| et |b|
 réglent la ligne de base qui sera donnée au bloc quand celui-ci est constitué de
 plusieurs lignes (séparées par la commande |\\|).
@@ -551,7 +554,8 @@
 \begin{NiceTabular}{cwc{2cm}wc{3cm}c}
 rose      & tulipe & marguerite & dahlia \\
 violette  
-& ~emphase#\Block[draw=red,fill=red!15,rounded-corners]{2-2}{\LARGE De très jolies fleurs}@  
+& ~emphase#\Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}@
+                     ~emphase#{\LARGE De très jolies fleurs}@  
    & & souci \\
 pervenche & & & lys \\
 arum      & iris & jacinthe & muguet 
@@ -563,7 +567,7 @@
 \begin{center}
 \begin{NiceTabular}{cwc{2cm}wc{3cm}c}
 rose      & tulipe & marguerite & dahlia \\
-violette  & \Block[draw=red,fill=red!15,rounded-corners]{2-2}
+violette  & \Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}
   {\LARGE De très jolies fleurs} & & souci \\
 pervenche & & & lys \\
 arum      & iris & jacinthe & muguet 
@@ -871,8 +875,9 @@
 \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 du paramètre dimensionnel |\arrayrulewidth|.
+fixer la largeur (on devrait plutôt dire l'épaisseur) des filets dans
+l'environnement. En fait,  cette clé ne fait que fixer la valeur du paramètre
+dimensionnel |\arrayrulewidth|.
 
 \smallskip
 On sait que \pkg{colortbl} propose la commande |\arrayrulecolor| pour spécifier
@@ -883,7 +888,8 @@
 \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.
+l'environnement en question. Cette clé fixe localement la couleur des filets
+(alors que la commande |\arrayrulecolor| agit globalement).
 
 \medskip
 \begin{scope}
@@ -1105,10 +1111,11 @@
  & & & & &1
 \end{NiceTabular}
 
+
 \bigskip
-$\triangleright$ Le concept de coins est aussi utilisé par la commande
-|\arraycolor| dans le |\CodeBefore| qui accepte en option une clé
-|except-corners|: cf.~p.~\pageref{arraycolor}.
+$\triangleright$ Les coins sont également pris en compte par les outils de
+coloriage dans le |\CodeBefore|. Ces outils ne colorient pas les cases qui sont
+dans les coins (cf.~p.~\pageref{color-in-code-before}).
 
 
 \subsection{La commande \textbackslash diagbox}
@@ -1252,12 +1259,16 @@
 
 \subsection{Les outils de nicematrix dans le \textbackslash CodeBefore}
 
+\label{color-in-code-before}
+
 L'extension \pkg{nicematrix} propose des outils (indépendants de \pkg{colortbl})
 pour tracer d'abord les rectangles colorés, puis le contenu des cases et les
 filets. Cette manière de faire est plus dans l'esprit du «modèle du peintre» des
 formats PostScript et \textsc{pdf} et convient donc mieux aux lecteurs de
 \textsc{pdf}. L'inconvénient est qu'elle nécessite plusieurs compilations
-successives.
+successives.\footnote{Si vous utilisez Overleaf, Overleaf effectue
+  automatiquement le nombre de
+  compilations nécessaire.}
 
 \medskip
 L'extension \pkg{nicematrix} fournit une clé |code-before| pour du code qui sera
@@ -1291,6 +1302,12 @@
 couleurs.
 
 \medskip
+\colorbox{yellow!50}{\textbf{Nouveau 5.15}}\enskip Ces commandes ne colorient
+pas les cases qui se trouvent dans les «coins» si la clé |corners| a été
+utilisée. La description de cette clé a été faite p.~\pageref{corners}.
+
+
+\medskip
 \begin{itemize}
 \item La commande |\cellcolor| tient son nom de la commande |\cellcolor| de
 \pkg{colortbl}.
@@ -1355,8 +1372,46 @@
 \end{scope}
 
 
+\bigskip
+\item La commande |\arraycolor| prend en argument obligatoire une couleur et
+colorie tout le tableau (sauf les éventuelles rangées et colonnes extérieures:
+cf.~p.~\pageref{exterior}) avec cette couleur. Ce n'est qu'un cas particulier de
+la commande |\rectanglecolor|.
 
 \bigskip
+\item \label{chessboardcolors}%
+La commande |\chessboardcolors| prend en arguments obligatoires deux
+couleurs et colorie les cases en quinconces avec les deux couleurs.
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+$\begin{pNiceMatrix}[r,margin] 
+\CodeBefore
+  ~emphase#\chessboardcolors{red!15}{blue!15}@
+\Body
+1 & -1 & 1 \\
+-1 & 1 & -1 \\
+1 & -1 & 1 
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}[baseline=1, r, margin]
+\CodeBefore
+  \chessboardcolors{red!15}{blue!15}
+\Body
+1 & -1 & 1 \\
+-1 & 1 & -1 \\
+1 & -1 & 1 
+\end{pNiceMatrix}$
+\end{scope}
+
+\medskip
+On a utilisé la clé |r| qui impose que toutes les colonnes soient alignées à
+droite (cf. p.~\pageref{key-R}).
+
+
+\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
@@ -1451,7 +1506,7 @@
 \begin{BVerbatim}[baseline=c,boxwidth=9cm]
 \begin{NiceTabular}{clr}[hvlines]
 \CodeBefore
-  ~emphase#\rowcolors{2}{blue!10}{}[cols=2-3,restart]@
+  ~emphase#\rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]@
 \Body
 \Block{1-*}{Résultats} \\
 \Block{2-1}{A}& Pierre & 12 \\
@@ -1464,7 +1519,7 @@
 \end{BVerbatim}
 \begin{NiceTabular}{clr}[hvlines,baseline=2]
 \CodeBefore
-  \rowcolors{2}{blue!10}{}[cols=2-3,restart]
+  \rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]
 \Body
 \Block{1-*}{Résultats} \\
 \Block{2-1}{A}& Pierre & 12 \\
@@ -1519,77 +1574,50 @@
 
 
 \bigskip
-\item \label{chessboardcolors}%
-La commande |\chessboardcolors| prend en arguments obligatoires deux
-couleurs et colorie les cases en quinconces avec les deux couleurs.
+On rappelle que toutes les commandes de coloriage que l'on vient de décrire ne
+colorient pas les cases qui sont dans les «coins». Dans l'exemple suivant, on
+utilise la clé |corners| pour demander de considérer le coin \emph{north east} (NE).
 
 \medskip
 \begin{scope}
-\hfuzz=10cm
-\begin{BVerbatim}[baseline=c,boxwidth=9cm]
-$\begin{pNiceMatrix}[r,margin] 
+\hfuzz=11cm
+\begin{BVerbatim}[boxwidth=9cm,baseline=c]
+\begin{NiceTabular}{cccccc}[~emphase#corners=NE@,margin,hvlines,first-row,first-col]
 \CodeBefore
-  ~emphase#\chessboardcolors{red!15}{blue!15}@
+  ~emphase#\rowcolors{1}{blue!15}{}@
 \Body
-1 & -1 & 1 \\
--1 & 1 & -1 \\
-1 & -1 & 1 
-\end{pNiceMatrix}$
+  & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
+0 & 1 \\
+1 & 1 & 1 \\
+2 & 1 & 2 & 1 \\
+3 & 1 & 3 & 3 & 1 \\
+4 & 1 & 4 & 6 & 4 & 1 \\
+5 & 1 & 5 & 10 & 10 & 5 & 1 \\
+6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+\end{NiceTabular}
 \end{BVerbatim}
-$\begin{pNiceMatrix}[baseline=1, r, margin]
+\begin{NiceTabular}{ccccccc}[corners=NE,margin,hvlines,first-row,first-col]
 \CodeBefore
-  \chessboardcolors{red!15}{blue!15}
+  \rowcolors{1}{blue!15}{}
 \Body
-1 & -1 & 1 \\
--1 & 1 & -1 \\
-1 & -1 & 1 
-\end{pNiceMatrix}$
+  & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
+0 & 1 \\
+1 & 1 & 1 \\
+2 & 1 & 2 & 1 \\
+3 & 1 & 3 & 3 & 1 \\
+4 & 1 & 4 & 6 & 4 & 1 \\
+5 & 1 & 5 & 10 & 10 & 5 & 1 \\
+6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+\end{NiceTabular}
 \end{scope}
 
-\medskip
-On a utilisé la clé |r| qui impose que toutes les colonnes soient alignées à
-droite (cf. p.~\pageref{key-R}).
+\end{itemize}
 
-\item La commande |\arraycolor| prend en argument obligatoire une couleur et
-colorie tout le tableau (sauf les éventuelles rangées et colonnes extérieures:
-cf.~p.~\pageref{exterior}) avec cette couleur. Elle est surtout intéressante du
-fait de la clé |except-corners| qu'elle accepte entre crochets en troisième
-argument (optionnel). La définition des coins a été donnée p.~\pageref{corners}
-quand on a présenté la clé~|corners|.
 
-\label{arraycolor}
-
-\medskip
-\begin{BVerbatim}[boxwidth=10cm,baseline=c]
-\begin{NiceTabular}{*{6}{c}}[cell-space-top-limit=3pt]
-\CodeBefore
-  ~emphase#\arraycolor{blue!10}[except-corners=NE]@
-\Body
-1\\
-1&1\\
-1&2&1\\
-1&3&3&1\\
-1&4&6&4&1\\
-1&5&10&10&5&1
-\end{NiceTabular}
-\end{BVerbatim}
-\begin{NiceTabular}{*{6}{c}}[cell-space-top-limit=3pt]
-\CodeBefore
-  \arraycolor{blue!10}[except-corners=NE]
-\Body
-1\\
-1&1\\
-1&2&1\\
-1&3&3&1\\
-1&4&6&4&1\\
-1&5&10&10&5&1
-\end{NiceTabular}
-\end{itemize}
-
 \bigskip
 On remarquera que ces commandes sont compatibles avec les commandes de
 \pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc). Néanmoins,
-l'extension \pkg{booktabs} n'est pas chargée par \pkg{nicematrix}.
+l'extension \pkg{booktabs} n'est \emph{pas} chargée par \pkg{nicematrix}.
 
 \medskip
 \begin{scope}
@@ -2346,7 +2374,7 @@
 \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 $\begin{bNiceMatrix}
 1 & \hspace*{1cm}            & 0 \\[8mm]
-  & ~emphase#\Ddots^{n \text{ fois}}@ &   \\
+  & ~emphase#\Ddots^{n \text{ fois}}@ &    \\
 0 &                          & 1 
 \end{bNiceMatrix}$
 \end{BVerbatim}
@@ -2724,7 +2752,36 @@
 créée par une commande |\SubMatrix|. Ce nom est utilisé pour créer des nœuds
 PGF/Tikz : voir p.~\pageref{node-sub-matrix}.
 
+\bigskip
+\colorbox{yellow!50}{\textbf{Nouveau 5.15}}\enskip 
+Il est également possible de spécifier des délimiteurs\footnote{Les délimiteurs
+  en question sont \verb|(|, \verb|[| et \verb|\{| et les fermants correspondants.
+  On peut bien sûr aussi mettre des \verb+|+ et des \verb+||+ dans le
+  préambule.} en les plaçant dans le préambule de l'environnement (pour les
+environnements à préambule : |{NiceArray}|, |{pNiceArray}|, etc.). Cette syntaxe
+est inspirée de l'extension \pkg{blkarray}.
 
+Dans le cas de deux délimiteurs successifs (nécessairement un fermant suivi d'un
+ouvrant pour une autre sous-matrice) un espace égal à |\enskip| est inséré
+automatiquement.
+
+\medskip
+\begin{BVerbatim}
+$\begin{pNiceArray}{~emphase#(c)(c)(c)@}
+a_{11} & a_{12}                                     & a_{13} \\
+a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
+a_{31} & a_{32}                                     & a_{33} 
+\end{pNiceArray}$
+\end{BVerbatim}
+
+\[\begin{pNiceArray}{(c)(c)(c)}
+a_{11} & a_{12}                                     & a_{13} \\
+a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
+a_{31} & a_{32}                                     & a_{33} 
+\end{pNiceArray}\]
+
+
+
 \section{Les notes dans les tableaux}
 
 \label{s:notes}
@@ -4480,7 +4537,7 @@
 12 -8   7 5  3 ;
 0  64 -41 1 19 ;
 0   0   0 0  0 { L_3 \gets 3 L_2 + L_3 } 
-\end{pNiceArray}$
+\end{pNiceArray}$\par\nobreak
 
 \smallskip
 \quad $\begin{pNiceArray}{rrrr|r}
@@ -4918,9 +4975,10 @@
 Les versions successives du fichier |nicematrix.sty| fournies par
 TeXLive sont disponibles sur le serveur \textsc{svn} de TeXLive :
 
+\smallskip
 {
 \small
-\url{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
+\nolinkurl{www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
 }
 
 \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	2021-04-25 20:00:09 UTC (rev 58986)
+++ trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2021-04-25 20:00:35 UTC (rev 58987)
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{5.14}
-\def\myfiledate{2021/04/08}
+\def\myfileversion{5.15}
+\def\myfiledate{2021/04/25}
 %
 %
 %<*batchfile>
@@ -159,7 +159,7 @@
 % The package \pkg{nicematrix} is entirely contained in the file
 % |nicematrix.sty|. This file may be put in the current directory or in a
 % |texmf| tree. However, the best is to install \pkg{nicematrix} with a TeX
-% distribution as MiKTeX or TeXlive.
+% distribution as MiKTeX, TeXlive or MacTeX.
 %
 % \bigskip
 % \emph{Remark}: If you use LaTeX via Internet with, for example, Overleaf, you
@@ -457,7 +457,7 @@
 % 
 % In the environments of \pkg{nicematrix}, it's possible to use the command
 % |\Block| in order to place an element in the center of a rectangle of merged
-% cells of the array.
+% cells of the array.\footnote{The spaces after a command \verb|\Block| are deleted.}
 %
 % The command |\Block| must be used in the upper leftmost cell of the array with
 % two arguments. 
@@ -575,6 +575,8 @@
 % \item the key |borders| provides the ability to draw only some borders of the
 % blocks; the value of that key is a (comma-separated) list of elements covered
 % by |left|, |right|, |top| and |bottom|;
+% \item \colorbox{yellow!50}{\bfseries New 5.15}\enskip the keys |hvlines| draws
+% all the vertical and horizontal rules in the block;
 % \item \colorbox{yellow!50}{\bfseries New 5.14}\enskip the keys |t| and |b| fix
 % the base line that will be given to the block when it has a multi-line content
 % (the lines are separated by |\\|). 
@@ -594,7 +596,8 @@
 % \begin{NiceTabular}{cwc{2cm}wc{3cm}c}
 % rose      & tulipe & marguerite & dahlia \\
 % violette  
-% & ~emphase#\Block[draw=red,fill=red!15,rounded-corners]{2-2}{\LARGE De très jolies fleurs}@  
+% & ~emphase#\Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}@
+%                      ~emphase#{\LARGE De très jolies fleurs}@  
 %    & & souci \\
 % pervenche & & & lys \\
 % arum      & iris & jacinthe & muguet 
@@ -605,7 +608,7 @@
 % \begin{center}
 % \begin{NiceTabular}{cwc{2cm}wc{3cm}c}
 % rose      & tulipe & marguerite & dahlia \\
-% violette  & \Block[draw=red,fill=red!15,rounded-corners]{2-2}
+% violette  & \Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}
 %   {\LARGE De très jolies fleurs} & & souci \\
 % pervenche & & & lys \\
 % arum      & iris & jacinthe & muguet 
@@ -907,7 +910,8 @@
 % 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.
+% environment. This key sets the value locally (whereas |\arrayrulecolor| acts
+% globally). 
 % 
 % \medskip
 % \begin{scope}
@@ -1120,10 +1124,11 @@
 %  & & & & &1
 % \end{NiceTabular}
 %
-% \bigskip
-% $\triangleright$ The concept of corner is also used by the command
-% |\arraycolor| in the |\CodeBefore| which takes in as option a key
-% |except-corners|: cf.~p.~\pageref{arraycolor}.
+%
+% \medskip
+% $\triangleright$ The corners are also taken into account by the tools provided
+% by \pkg{nicematrix} to color cells, rows and columns. These tools don't color
+% the cells which are in the corners (cf.~p.~\pageref{color-in-code-before}).
 % 
 % \subsection{The command \textbackslash diagbox}
 %
@@ -1258,11 +1263,15 @@
 %
 % \subsection{The tools of nicematrix in the \textbackslash CodeBefore}
 %
+% \label{color-in-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
+% \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.
+% the \textsc{pdf} viewers. However, it requires several
+% compilations.\footnote{If you use Overleaf, Overleaf will do automatically the
+% right number of compilations.}
 % 
 % \medskip
 % The extension \pkg{nicematrix} provides a key |code-before| for some code that
@@ -1292,7 +1301,13 @@
 %
 % \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.
+% in first position) which is the color model for the specification of the
+% colors.
+%
+% \medskip
+% \colorbox{yellow!50}{\textbf{New 5.15}}\enskip These commands don't color the
+% cells which are in the ``corners'' if the key |corners| is used. This key has
+% been described p.~\pageref{corners}.
 % 
 % \medskip
 % \begin{itemize}
@@ -1359,8 +1374,45 @@
 % \end{NiceTabular}
 % \end{scope}
 % 
+% \bigskip
+% \item The command |\arraycolor| takes in as mandatory argument a color and
+% color the whole tabular with that color (excepted the potential exterior rows
+% and columns: cf.~p.~\pageref{exterior}). It's only a particular case of
+% |\rectanglecolor|. 
 %
+% 
+% \bigskip
+% \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}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% $\begin{pNiceMatrix}[r,margin] 
+% \CodeBefore
+%   ~emphase#\chessboardcolors{red!15}{blue!15}@
+% \Body
+% 1 & -1 & 1 \\
+% -1 & 1 & -1 \\
+% 1 & -1 & 1 
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[r,baseline=1, margin] 
+% \CodeBefore 
+% \chessboardcolors{red!15}{blue!15}
+% \Body
+% 1 & -1 & 1 \\
+% -1 & 1 & -1 \\
+% 1 & -1 & 1 
+% \end{pNiceMatrix}$
+% \end{scope}
+% 
+% \medskip
+% We have used the key |r| which aligns all the columns rightwards (cf.
+% p.~\pageref{key-R}).
+%
+%
 % \bigskip
 % \item The command |\rowcolor| takes its name from the command |\rowcolor| of
 % \pkg{colortbl}. Its first mandatory argument is the color and the second is a
@@ -1425,7 +1477,6 @@
 % (an interval of the form $i$|-| describes in fact the interval of all the rows
 % of the tabular, beginning with the row~$i$).
 % 
-% 
 %
 % \bigskip
 % The last argument of |\rowcolors| is an optional list of pairs key-value (the
@@ -1449,7 +1500,7 @@
 % \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 % \begin{NiceTabular}{clr}[hvlines]
 % \CodeBefore
-%   ~emphase#\rowcolors{2}{blue!10}{}[cols=2-3,restart]@
+%   ~emphase#\rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]@
 % \Body
 % \Block{1-*}{Results} \\
 % John & 12 \\
@@ -1462,7 +1513,7 @@
 % \end{BVerbatim}
 % \begin{NiceTabular}{clr}[hvlines,baseline=2]
 % \CodeBefore
-%  \rowcolors{2}{blue!10}{}[cols=2-3,restart]
+%  \rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]
 % \Body
 % \Block{1-*}{Results} \\
 % \Block{2-1}{A}& John & 12 \\
@@ -1511,82 +1562,53 @@
 % \end{NiceTabular}
 % \end{scope}
 %
-% 
-% \bigskip
-% \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}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $\begin{pNiceMatrix}[r,margin] 
-% \CodeBefore
-%   ~emphase#\chessboardcolors{red!15}{blue!15}@
-% \Body
-% 1 & -1 & 1 \\
-% -1 & 1 & -1 \\
-% 1 & -1 & 1 
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[r,baseline=1, margin] 
-% \CodeBefore 
-% \chessboardcolors{red!15}{blue!15}
-% \Body
-% 1 & -1 & 1 \\
-% -1 & 1 & -1 \\
-% 1 & -1 & 1 
-% \end{pNiceMatrix}$
-% \end{scope}
-% 
-% \medskip
-% We have used the key |r| which aligns all the columns rightwards (cf.
-% p.~\pageref{key-R}).
+% We recall that all the color commands we have described don't color the cells
+% which are in the ``corners''. In the following example, we use the key
+% |corners| to require the determination of the corner \emph{north east} (NE).
 %
 %
-% \item The command |\arraycolor| takes in as mandatory argument a color and
-% color the whole tabular with that color (excepted the potential exterior rows
-% and columns: cf.~p.~\pageref{exterior}). This command is useful thanks to its
-% key |except-corners| (in the third argument, which is a optional argument
-% between square brackets). The definition of these ``corners'' has been given
-% p.~\pageref{corners} when we have presented the key |corners|.
-%
-% \label{arraycolor}
-% 
-%
-% \medskip
-% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
-% \begin{NiceTabular}{*{6}{c}}[cell-space-top-limit=3pt]
+%\medskip
+% \begin{scope}
+% \hfuzz=11cm
+% \begin{BVerbatim}[boxwidth=9cm,baseline=c]
+% \begin{NiceTabular}{cccccc}[~emphase#corners=NE@,margin,hvlines,first-row,first-col]
 % \CodeBefore
-%   ~emphase#\arraycolor{blue!10}[except-corners=NE]@
+%   ~emphase#\rowcolors{1}{blue!15}{}@
 % \Body
-% 1\\
-% 1&1\\
-% 1&2&1\\
-% 1&3&3&1\\
-% 1&4&6&4&1\\
-% 1&5&10&10&5&1
+%   & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
+% 0 & 1 \\
+% 1 & 1 & 1 \\
+% 2 & 1 & 2 & 1 \\
+% 3 & 1 & 3 & 3 & 1 \\
+% 4 & 1 & 4 & 6 & 4 & 1 \\
+% 5 & 1 & 5 & 10 & 10 & 5 & 1 \\
+% 6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
 % \end{NiceTabular}
 % \end{BVerbatim}
-% \begin{NiceTabular}{*{6}{c}}[cell-space-top-limit=3pt]
+% \begin{NiceTabular}{ccccccc}[corners=NE,margin,hvlines,first-row,first-col]
 % \CodeBefore
-%   \arraycolor{blue!10}[except-corners=NE]
+%   \rowcolors{1}{blue!15}{}
 % \Body
-% 1\\
-% 1&1\\
-% 1&2&1\\
-% 1&3&3&1\\
-% 1&4&6&4&1\\
-% 1&5&10&10&5&1
+%   & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
+% 0 & 1 \\
+% 1 & 1 & 1 \\
+% 2 & 1 & 2 & 1 \\
+% 3 & 1 & 3 & 3 & 1 \\
+% 4 & 1 & 4 & 6 & 4 & 1 \\
+% 5 & 1 & 5 & 10 & 10 & 5 & 1 \\
+% 6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
 % \end{NiceTabular}
+% \end{scope}
+%
 % \end{itemize}
 %
 %
-%
 % \bigskip
-% One should remark that these commands are compatible with the commands of
-% \pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc). However,
-% \pkg{booktabs} is not loaded by \pkg{nicematrix}.
+% One should remark that all the previous commands are compatible with the
+% commands of \pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc).
+% However, \pkg{booktabs} is not loaded by \pkg{nicematrix}.
 %
 % \medskip
 % \begin{scope}
@@ -2697,6 +2719,35 @@
 % |\SubMatrix|. That name is used to create PGF/Tikz nodes: cf
 % p.~\pageref{node-sub-matrix}. 
 %
+%
+% \bigskip
+% \colorbox{yellow!50}{\textbf{New 5.15}}\enskip 
+% It's also possible to specify some delimiters\footnote{Those delimiters are
+% \verb|(|, \verb|[|, |\{| and the closing ones. Of course, it's also
+% possible to put \verb+|+ and \verb+||+ in the preamble of the environement.}
+% by placing them in the preamble of the environment (for the environments with
+% a preamble: |{NiceArray}|, |{pNiceArray}|, etc.). This syntax is inspired by
+% the extension \pkg{blkarray}.
+%
+% When there are two successive delimiters (necessarily a closing one following by
+% an opening one for another submatrix), a space equal to |\enskip| is
+% automatically inserted.
+%
+% \medskip
+% \begin{BVerbatim}
+% $\begin{pNiceArray}{~emphase#(c)(c)(c)@}
+% a_{11} & a_{12}                                     & a_{13} \\
+% a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
+% a_{31} & a_{32}                                     & a_{33} 
+% \end{pNiceArray}$
+% \end{BVerbatim}
+%
+% \[\begin{pNiceArray}{(c)(c)(c)}
+% a_{11} & a_{12}                                     & a_{13} \\
+% a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
+% a_{31} & a_{32}                                     & a_{33} 
+% \end{pNiceArray}\]
+%
 % \section{The notes in the tabulars}
 %
 % \label{s:notes}
@@ -3299,8 +3350,7 @@
 %
 % For the environements with delimiters (|{pNiceArray}|, |{pNiceMatrix}|, etc.),
 % it's possible to change the color of the delimiters with the key
-% |delimiters/color|.\footnote{\verb|delimiters-color| is a synonymous
-% (deprecated) for |delimiters/color|.}
+% |delimiters/color|.
 %
 % \medskip
 % \begin{BVerbatim}[boxwidth=12cm,baseline=c]
@@ -4410,7 +4460,7 @@
 % 12 -8   7 5  3 ;
 % 0  64 -41 1 19 ;
 % 0   0   0 0  0 { L_3 \gets 3 L_2 + L_3 } 
-% \end{pNiceArray}$
+% \end{pNiceArray}$\par\nobreak
 %
 % \smallskip
 % \quad $\begin{pNiceArray}{rrrr|r}
@@ -4420,8 +4470,8 @@
 % \end{NiceMatrixBlock}
 %
 % \bigskip
-% However, one can see that the last matrix is not perfectly aligned with the
-% other. That's why, in LaTeX, the parenthesis have not exactly the same width
+% However, one can see that the last matrix is not perfectly aligned with
+% others. That's why, in LaTeX, the parenthesis have not exactly the same width
 % (smaller parenthesis are a bit slimer).
 %
 % \medskip
@@ -4480,7 +4530,7 @@
 % 12 -8   7 5  3 ;
 % 0  64 -41 1 19 ;
 % 0   0   0 0  0 { L_3 \gets 3 L_2 + L_3 } 
-% \end{pNiceArray}$
+% \end{pNiceArray}$\par\nobreak
 %
 % \smallskip
 % \quad $\begin{pNiceArray}{rrrr|r}
@@ -5469,10 +5519,12 @@
 %
 % \bigskip
 % If the user uses |{NiceArray}| or |{NiceTabular}| the flag
-% |\l_@@_NiceArray_bool| will be raised. 
+% |\g_@@_NiceArray_bool| will be raised. 
 %    \begin{macrocode}
-\bool_new:N \l_@@_NiceArray_bool
+\bool_new:N \g_@@_NiceArray_bool
 %    \end{macrocode}
+% In fact, if there is delimiters in the preamble of |{NiceArray}| (eg:
+% |[cccc]|), this boolean will be set to false.
 % 
 % \bigskip
 % If the user uses |{NiceTabular}| or |{NiceTabular*}|, we will raise the
@@ -5731,8 +5783,15 @@
 \seq_new:N \g_@@_pos_of_stroken_blocks_seq
 %    \end{macrocode}
 % 
-%
 % \medskip
+% If the user has used the key |corners| (or the key |hvlines-except-corners|),
+% all the cells which are in an (empty) corner will be stored in the following
+% sequence. 
+%    \begin{macrocode}
+\seq_new:N \l_@@_corners_cells_seq
+%    \end{macrocode}
+% 
+% \medskip
 % The list of the names of the potential |\SubMatrix| in the |\CodeAfter| of an
 % environment. Unfortunately, that list has to be global (we have to use it
 % inside the group for the options of a given |\SubMatrix|).
@@ -5779,6 +5838,9 @@
 \clist_new:N \l_@@_borders_clist
 \dim_new:N \l_@@_rounded_corners_dim
 %    \end{macrocode}
+% The last parameter has no direct link with the [empty] corners of the array
+% (which are computed and taken into account by \pkg{nicematrix} when the key
+% |corners| is used). 
 % 
 % \medskip
 % The following token list correspond to the key |color| of the command
@@ -5816,7 +5878,15 @@
 \bool_new:N \l_@@_draw_first_bool
 %    \end{macrocode}
 % 
+%
 % \medskip
+% The following flag corresponds to the key |hvlines| of the command |\Block|.
+%    \begin{macrocode}
+\bool_new:N \l_@@_hvlines_block_bool
+%    \end{macrocode}
+% 
+%
+% \medskip
 % The blocks which use the key |-| will store their content in a box. These
 % boxes are numbered with the following counter.
 %    \begin{macrocode}
@@ -6051,7 +6121,7 @@
 %    \begin{macrocode}
         \NewDocumentCommand \tabularnote { m }
           {
-            \bool_if:nTF { ! \l_@@_NiceArray_bool && \l_@@_in_env_bool }
+            \bool_if:nTF { ! \g_@@_NiceArray_bool && \l_@@_in_env_bool }
               { \@@_error:n { tabularnote~forbidden } }
               {
 %    \end{macrocode}
@@ -6295,13 +6365,14 @@
 \bool_set_true:N \l_@@_parallelize_diags_bool
 %    \end{macrocode}
 %
-%
 % \bigskip
-% The following parameter correspond to the key |corners|.
+% The following parameter correspond to the key |corners|. The elements of that
+% |clist| must be in |NW|, |SW|, |NE| and |SE|.
 %    \begin{macrocode}
 \clist_new:N \l_@@_corners_clist
 %    \end{macrocode}
 % 
+% \bigskip
 %    \begin{macrocode}
 \dim_new:N \l_@@_notes_above_space_dim 
 \AtBeginDocument { \dim_set:Nn \l_@@_notes_above_space_dim { 1 mm } }
@@ -6713,7 +6784,9 @@
     delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
     delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
     delimiters / color .value_required:n = true ,
-    delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+    delimiters-color .code:n = 
+      \tl_set:Nn \l_@@_delimiters_color_tl { #1 } 
+      \@@_error:n { delimiters-color deleted } ,
     delimiters-color .value_required:n = true ,
     last-col .code:n = \tl_if_empty:nF { #1 }
                          { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } } 
@@ -6829,7 +6902,9 @@
     small .value_forbidden:n = true ,
     delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
     delimiters / color .value_required:n = true ,
-    delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
+    delimiters-color .code:n = 
+      \tl_set:Nn \l_@@_delimiters_color_tl { #1 } 
+      \@@_error:n { delimiters-color deleted } ,
     delimiters-color .value_required:n = true ,
     unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix } 
   }
@@ -6861,8 +6936,9 @@
     notes / bottomrule .default:n = true ,
     tabularnote .tl_set:N = \l_@@_tabularnote_tl ,
     tabularnote .value_required:n = true ,
-    delimiters-color .tl_set:N = \l_@@_delimiters_color_tl ,
-    delimiters-color .value_required:n = true ,
+    delimiters-color .code:n = 
+      \tl_set:Nn \l_@@_delimiters_color_tl { #1 } 
+      \@@_error:n { delimiters-color deleted } ,
     delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
     delimiters / color .value_required:n = true ,
     r .code:n = \@@_error:n { r~or~l~with~preamble } ,
@@ -7615,6 +7691,21 @@
     \seq_gclear:N \g_@@_submatrix_seq
     \bool_if:NT \l_@@_code_before_bool
       { 
+%    \end{macrocode}
+% The list of the cells which are in the (empty) corners is stored in the |aux|
+% file because we have to know it before the execution of the |\CodeBefore| (the
+% commands which color the cells, row and columns won't color the cells which
+% are in the corners).
+%    \begin{macrocode}
+        \seq_if_exist:cT
+          { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq }   
+          { 
+            \seq_set_eq:Nc \l_@@_corners_cells_seq
+              { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq }
+          }
+%    \end{macrocode}
+% Now, we have to reconstruct the |row| nodes and the |col| nodes.
+%    \begin{macrocode}
         \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq }
           { 
 %    \end{macrocode}
@@ -7795,26 +7886,6 @@
     \@@_pre_array_ii:
 %    \end{macrocode}
 %
-% \medskip
-% We compute the width of both delimiters.
-%    \begin{macrocode}
-    \dim_zero_new:N \l_@@_left_delim_dim
-    \dim_zero_new:N \l_@@_right_delim_dim
-    \bool_if:NTF \l_@@_NiceArray_bool
-      { 
-        \dim_gset:Nn \l_@@_left_delim_dim { 2 \arraycolsep }
-        \dim_gset:Nn \l_@@_right_delim_dim { 2 \arraycolsep }
-      }
-      { 
-%    \end{macrocode}
-% The command |\bBigg@| is a command of \pkg{amsmath}.
-%    \begin{macrocode}
-        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l_@@_left_delim_tl $ }
-        \dim_set:Nn \l_@@_left_delim_dim { \box_wd:N \l_tmpa_box }
-        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l_@@_right_delim_tl $ }
-        \dim_set:Nn \l_@@_right_delim_dim { \box_wd:N \l_tmpa_box }
-      }
-%    \end{macrocode}
 % 
 % \medskip
 % The array will be composed in a box (named |\l_@@_the_array_box|) because we
@@ -7840,7 +7911,30 @@
 %
 % Now, the preamble is constructed in |\g_@@_preamble_tl|
 %
+% \medskip
+% We compute the width of both delimiters. We remember that, when the
+% environment |{NiceArray}| is used, it's possible to specify the delimiters in
+% the preamble (eg |[ccc]|).
+%    \begin{macrocode}
+    \dim_zero_new:N \l_@@_left_delim_dim
+    \dim_zero_new:N \l_@@_right_delim_dim
+    \bool_if:NTF \g_@@_NiceArray_bool
+      { 
+        \dim_gset:Nn \l_@@_left_delim_dim { 2 \arraycolsep }
+        \dim_gset:Nn \l_@@_right_delim_dim { 2 \arraycolsep }
+      }
+      { 
+%    \end{macrocode}
+% The command |\bBigg@| is a command of \pkg{amsmath}.
+%    \begin{macrocode}
+        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g_@@_left_delim_tl $ }
+        \dim_set:Nn \l_@@_left_delim_dim { \box_wd:N \l_tmpa_box }
+        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g_@@_right_delim_tl $ }
+        \dim_set:Nn \l_@@_right_delim_dim { \box_wd:N \l_tmpa_box }
+      }
+%    \end{macrocode}
 %
+%
 % 
 % \bigskip
 % Here is the beginning of the box which will contain the array. The
@@ -7898,8 +7992,8 @@
 %
 % \bigskip
 %    \begin{macrocode}
-    \tl_set:Nn \l_@@_left_delim_tl { #1 }
-    \tl_set:Nn \l_@@_right_delim_tl { #2 }
+    \tl_gset:Nn \g_@@_left_delim_tl { #1 }
+    \tl_gset:Nn \g_@@_right_delim_tl { #2 }
     \tl_gset:Nn \g_@@_preamble_tl { #4 }
 %    \end{macrocode}
 %   
@@ -7982,7 +8076,7 @@
 % of |{NiceArray}| (|{pNiceArray}|, |{bNiceArray}|, etc.) because, for
 % |{NiceArray}|, we have the options |t|, |c|, |b| and |baseline|.
 %    \begin{macrocode}
-    \bool_if:NTF \l_@@_NiceArray_bool 
+    \bool_if:NTF \g_@@_NiceArray_bool 
       { \keys_set:nn { NiceMatrix / NiceArray } }
       { \keys_set:nn { NiceMatrix / pNiceArray } }
     { #3 , #5 } 
@@ -8073,7 +8167,7 @@
       }
 %    \end{macrocode}
 %
-% The construction of the real box is different when |\l_@@_NiceArray_bool| is
+% The construction of the real box is different when |\g_@@_NiceArray_bool| is
 % true (|{NiceArray}| or |{NiceTabular}|) and in the other environments because,
 % in |{NiceArray}| or |{NiceTabular}|, we have no delimiter to put (but we have
 % tabular notes to put). We begin with this case. 
@@ -8080,7 +8174,7 @@
 %
 % Remark that, in all cases, |@@_use_arraybox_with_notes_c:| is used.
 %    \begin{macrocode}
-    \bool_if:NTF \l_@@_NiceArray_bool
+    \bool_if:NTF \g_@@_NiceArray_bool
       { 
         \str_case:VnF \l_@@_baseline_tl 
           { 
@@ -8125,7 +8219,7 @@
             \c_math_toggle_token
             \tl_if_empty:NF \l_@@_delimiters_color_tl 
               { \color { \l_@@_delimiters_color_tl } }
-            \exp_after:wN \left \l_@@_left_delim_tl
+            \exp_after:wN \left \g_@@_left_delim_tl
             \vcenter 
               { 
 %    \end{macrocode}
@@ -8156,7 +8250,7 @@
 %    \begin{macrocode}
             \tl_if_empty:NF \l_@@_delimiters_color_tl 
               { \color { \l_@@_delimiters_color_tl } }
-            \exp_after:wN \right \l_@@_right_delim_tl
+            \exp_after:wN \right \g_@@_right_delim_tl
             \c_math_toggle_token
           }
 %    \end{macrocode}
@@ -8167,7 +8261,10 @@
 % when the option |delimiters/max-width| is used.
 %    \begin{macrocode}
         \bool_if:NTF \l_@@_delimiters_max_width_bool 
-          { \@@_put_box_in_flow_bis:nn { #1 } { #2 } }
+          { 
+            \@@_put_box_in_flow_bis:nn 
+              \g_@@_left_delim_tl \g_@@_right_delim_tl
+          } 
           \@@_put_box_in_flow: 
       } 
 %    \end{macrocode}
@@ -8208,7 +8305,7 @@
 % The transformation of the preamble is an operation in several steps.
 %
 % \bigskip
-% The preamble given by the final use is in |\g_@@_preamble_tl| and the modified
+% The preamble given by the final user is in |\g_@@_preamble_tl| and the modified
 % version will be stored in |\g_@@_preamble_tl| also.
 %
 %    \begin{macrocode}
@@ -8297,10 +8394,18 @@
 %    \begin{macrocode}
         \int_zero:N \l_tmpa_int
 %    \end{macrocode}
+% We will raise |\l_tmpa_bool| if we are in |{NiceArray}| and that the first
+% letter of the preamble is a opening delimiter (|[|, |(| of |\{|). In that
+% case, the environment |{NiceArray}| will be transformed to an environment of
+% the form |{xNiceArray}| after the construction of the preamble.
+%    \begin{macrocode}
+        \bool_set_false:N \l_tmpa_bool
+%    \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
+        \bool_if:NT \l_tmpa_bool { \bool_gset_false:N \g_@@_NiceArray_bool } 
         \int_gset_eq:NN \g_@@_static_num_of_col_int \c at jCol
       }
 %    \end{macrocode}
@@ -8325,7 +8430,7 @@
       {
         \bool_lazy_all:nT 
           { 
-            \l_@@_NiceArray_bool 
+            \g_@@_NiceArray_bool 
             { \bool_not_p:n \l_@@_NiceTabular_bool }
             { \tl_if_empty_p:N \l_@@_vlines_clist } 
             { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
@@ -8337,7 +8442,7 @@
       { 
         \bool_lazy_all:nT
           { 
-            \l_@@_NiceArray_bool 
+            \g_@@_NiceArray_bool 
             { \bool_not_p:n \l_@@_NiceTabular_bool }
             { \tl_if_empty_p:N \l_@@_vlines_clist } 
             { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
@@ -8386,9 +8491,9 @@
         (  { \@@_patch_preamble_vii:n #1 }
         [  { \@@_patch_preamble_vii:n #1 }
         \{ { \@@_patch_preamble_vii:n #1 }
-        )  { \@@_patch_preamble_viii:n #1 }       
-        ]  { \@@_patch_preamble_viii:n #1 }       
-        \} { \@@_patch_preamble_viii:n #1 }       
+        )  { \@@_patch_preamble_viii:nn #1 }       
+        ]  { \@@_patch_preamble_viii:nn #1 }       
+        \} { \@@_patch_preamble_viii:nn #1 }       
         C { \@@_error:nn { old~column~type } #1 }
         L { \@@_error:nn { old~column~type } #1 }
         R { \@@_error:nn { old~column~type } #1 }
@@ -8503,14 +8608,14 @@
       {
         > { 
             \@@_Cell: 
-            \begin { minipage } [ #1 ] { #3 } 
+            \begin { minipage } [ #1 ] { \dim_eval:n { #3 } }
             \mode_leave_vertical: 
             \arraybackslash
-            \vrule height \box_ht:N \@arstrutbox depth 0 pt width 0 pt % v. 5.11
+            \vrule height \box_ht:N \@arstrutbox depth 0 pt width 0 pt
           } 
         c 
         < { 
-            \vrule height 0 pt depth \box_dp:N \@arstrutbox width 0 pt % v. 5.11
+            \vrule height 0 pt depth \box_dp:N \@arstrutbox width 0 pt
             \end { minipage } 
             \@@_end_Cell: 
           } 
@@ -8568,56 +8673,106 @@
   }
 %    \end{macrocode}
 %
+% 
 % \medskip
 % For |(|, |[| and |\{|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_patch_preamble_vii:n #1 
   {
-     \bool_if:NT \l_@@_small_bool
-       { \@@_fatal:n { Delimiter~with~small } }
+    \bool_if:NT \l_@@_small_bool
+      { \@@_fatal:n { Delimiter~with~small } }
 %    \end{macrocode}
-% If we are before the column 1, we reserve space for the left delimiter.
+% If we are before the column 1 and not in |{NiceArray}|, we reserve space for
+% the left delimiter. 
 %    \begin{macrocode}
-    \int_compare:nNnT \c at jCol = \c_zero_int
-      { \tl_gput_right:Nx \g_@@_preamble_tl { ! { \enskip } } }
-    \tl_gput_right:Nx \g_@@_internal_code_after_tl
-      { \@@_delimiter:nnn #1 { \@@_succ:n \c at jCol } \c_true_bool }  
-    \@@_patch_preamble:n 
-  }
+    \int_compare:nNnTF \c at jCol = \c_zero_int 
+      { 
+        \bool_if:NTF \g_@@_NiceArray_bool
+          { 
 %    \end{macrocode}
-%
-% \bigskip
-% For |)|, |]| and |\}|.
+% In that case, in fact, the firt letter of the preamble must be considered as
+% the left delimiter of the array.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_patch_preamble_viii:n #1
-  {
-     \bool_if:NT \l_@@_small_bool
-       { \@@_fatal:n { Delimiter~with~small } }
-    \tl_gput_right:Nx \g_@@_internal_code_after_tl
-      { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+            \tl_gset:Nn \g_@@_left_delim_tl { #1 } 
+            \tl_gset:Nn \g_@@_right_delim_tl { . }
 %    \end{macrocode}
-% After this closing delimiter, we have to test whether there is a opening
-% delimiter (we consider that there can't be a second closing delimiter) in
-% order to add an horizontal space (equal to 0.5 em).
+% We raise the boolean |\l_tmpa_bool|, which means that the environment
+% |{NiceArray}| will be transformed to |{xNiceArray}|.
 %    \begin{macrocode}
-    \@@_patch_preamble_viii_i:n
+            \bool_set_true:N \l_tmpa_bool
+            \@@_patch_preamble:n 
+          }
+          {  
+            \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } 
+            \tl_gput_right:Nx \g_@@_internal_code_after_tl
+              { \@@_delimiter:nnn #1 { \@@_succ:n \c at jCol } \c_true_bool }  
+            \@@_patch_preamble_vii_i:n 
+          }
+      }
+      {
+        \tl_gput_right:Nx \g_@@_internal_code_after_tl
+          { \@@_delimiter:nnn #1 { \@@_succ:n \c at jCol } \c_true_bool }  
+        \@@_patch_preamble_vii_i:n 
+      }
   }
 %    \end{macrocode}
 %
+% \bigskip
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_patch_preamble_viii_i:n #1
+\cs_new_protected:Npn \@@_patch_preamble_vii_i:n #1
   {
-    \bool_lazy_any:nT
+    \tl_if_in:nnTF { ( [ \{ ) ] \} } { #1 }
       {
-          { \str_if_eq_p:nn { #1 } ( }
-          { \str_if_eq_p:nn { #1 } [ }
-          { \str_if_eq_p:nn { #1 } \{ }
-          { \str_if_eq_p:nn { #1 } \q_stop }
+        \@@_error:nn { delimiter~after~opening } { #1 } 
+        \@@_patch_preamble:n
       }
-    { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } }
-    \@@_patch_preamble:n #1 
+      { \@@_patch_preamble:n #1 }
   }
 %    \end{macrocode}
+% 
+% \bigskip
+% For |)|, |]| and |\}|. We have two arguments for the following command because
+% we directly read the following letter in the preamble (we have to see whether
+% we have a opening delimiter following and we also have to see whether we are
+% at the end of the preamble because, in that case, our letter must be
+% considered as the right delimiter of the environment).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_viii:nn #1 #2
+  {
+    \bool_if:NT \l_@@_small_bool
+      { \@@_fatal:n { Delimiter~with~small } }
+    \tl_if_in:nnTF { ) ] \} } { #2 }
+      { 
+        \tl_gput_right:Nx \g_@@_internal_code_after_tl
+          { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+        \@@_error:nn { double~closing~delimiter } { #2 } 
+        \@@_patch_preamble:n
+      }
+      { 
+        \tl_if_eq:nnTF { \q_stop } { #2 }
+          {
+            \bool_if:NTF \g_@@_NiceArray_bool 
+              {
+                \tl_gset:Nn \g_@@_right_delim_tl { #1 }
+                \bool_set_true:N \l_tmpa_bool
+              }
+              {
+                \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } 
+                \tl_gput_right:Nx \g_@@_internal_code_after_tl
+                  { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+                \@@_patch_preamble:n #2
+              }
+          }
+          {
+            \tl_if_in:nnT { ( [ \{ } { #2 }
+              { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } }
+            \tl_gput_right:Nx \g_@@_internal_code_after_tl
+              { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+            \@@_patch_preamble:n #2
+          }
+      }
+  }
+%    \end{macrocode}
 %
 %
 %    \begin{macrocode}
@@ -9447,19 +9602,19 @@
 %
 % \interitem
 % The environment |{NiceArray}| is constructed upon the environment
-% |{NiceArrayWithDelims}| but, in fact, there is a flag |\l_@@_NiceArray_bool|.
+% |{NiceArrayWithDelims}| but, in fact, there is a flag |\g_@@_NiceArray_bool|.
 % In |{NiceArrayWithDelims}|, some special code will be executed if this flag is
 % raised. 
 %    \begin{macrocode}
 \NewDocumentEnvironment { NiceArray } { }
   { 
-    \bool_set_true:N \l_@@_NiceArray_bool
+    \bool_gset_true:N \g_@@_NiceArray_bool
     \str_if_empty:NT \g_@@_name_env_str 
       { \str_gset:Nn \g_@@_name_env_str { NiceArray } }  
 %    \end{macrocode}
 % We put . and . for the delimiters but, in fact, that doesn't matter because
 % these arguments won't be used in |{NiceArrayWithDelims}| (because the flag
-% |\l_@@_NiceArray_bool| is raised).
+% |\g_@@_NiceArray_bool| is raised).
 %    \begin{macrocode} 
     \NiceArrayWithDelims . . 
   }
@@ -9676,14 +9831,13 @@
               }
 %    \end{macrocode}
 % We write also the potential content of |\g_@@_pos_of_blocks_seq| (it will be
-% useful if the commands |\rowcolors| is used with the key |respect-blocks|.
+% useful if the command |\rowcolors| is used with the key |respect-blocks|).
 %    \begin{macrocode}
             \seq_gset_from_clist:cn
               { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq }
               { \seq_use:Nnnn \g_@@_pos_of_blocks_seq , , , }
-          }   
-        \iow_now:Nn \@mainaux \ExplSyntaxOff
-      } 
+          }
+      }
 %    \end{macrocode}
 %
 % \medskip
@@ -9755,9 +9909,9 @@
 % 
 % \bigskip
 % The following computes the ``corners'' (made up of empty cells) but if there
-% is no corner to compute, it will do nothing. The corners are computed
-% in |\l_@@_empty_corner_cells_seq| which will contain all the empty cells (and 
-% not in a block) considered in the corners of the array.
+% is no corner to compute, it won't do anything. The corners are computed
+% in |\l_@@_corners_cells_seq| which will contain all the cells which are empty
+% (and not in a block) considered in the corners of the array.
 %    \begin{macrocode}
     \@@_compute_corners:
 %    \end{macrocode}
@@ -9764,7 +9918,7 @@
 %
 % \bigskip
 % The sequence |\g_@@_pos_of_blocks_seq| must be ``adjusted'' (for the case
-% where the user have written something like |\Block{1-}|).
+% where the user have written something like |\Block{1-*}|).
 %    \begin{macrocode}
     \@@_adjust_pos_of_blocks_seq:
 %    \end{macrocode}
@@ -9781,7 +9935,7 @@
       { 
         { \seq_if_empty_p:N \g_@@_pos_of_blocks_seq }
         { \seq_if_empty_p:N \g_@@_pos_of_xdots_seq }
-        { \seq_if_empty_p:N \l_@@_empty_corner_cells_seq }
+        { \seq_if_empty_p:N \l_@@_corners_cells_seq }
       }
       { 
         \cs_set_eq:NN \@@_vline_i:nn \@@_vline_i_complete:nn 
@@ -9868,6 +10022,7 @@
 % 
 % \medskip
 %    \begin{macrocode}
+    \bool_gset_false:N \g_@@_NiceArray_bool
     \str_gclear:N \g_@@_name_env_str
     \@@_restore_iRow_jCol:
 %    \end{macrocode}
@@ -11478,7 +11633,7 @@
 %    \end{macrocode}
 % For the column, it's a bit more complicated.
 %    \begin{macrocode}
-    \int_compare:nNnTF #2 = 1
+    \int_compare:nNnTF { #2 } = 1
       { 
         \int_set:Nn \l_@@_initial_j_int 1
         \bool_set_true:N \l_@@_initial_open_bool
@@ -11909,7 +12064,7 @@
       { 
         \@@_add_to_colors_seq:xn 
           { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
-          { \@@_rectanglecolor:nnn { #3 } { #4 } { 0 pt }} 
+          { \@@_rectanglecolor:nnn { #3 } { #4 } { 0 pt } } 
       }
   }
 %    \end{macrocode}
@@ -11980,10 +12135,7 @@
 % \bigskip
 %    \begin{macrocode}
 \keys_define:nn { NiceMatrix / arraycolor }
-  { 
-    except-corners .clist_set:N = \l_tmpa_clist ,
-    except-corners .default:n = { NW , SW , NE , SE } 
-  }
+  { except-corners .code:n = \@@_error:n { key except-corners } }
 %    \end{macrocode}
 %
 % \bigskip
@@ -11996,70 +12148,14 @@
 \NewDocumentCommand \@@_arraycolor { O { } m O { } }
   {
     \keys_set:nn { NiceMatrix / arraycolor } { #3 }
-%    \end{macrocode}
-% If the key |except-corners| is not used, it's easy: we only have a rectangle
-% fo fill.
-%    \begin{macrocode}
-    \clist_if_empty:NTF \l_tmpa_clist
-      {
-        \@@_rectanglecolor [ #1 ] { #2 } 
-          { 1 - 1 } { \int_use:N \c at iRow - \int_use:N \c at jCol }
-      }
-%    \end{macrocode}
-% The interesting case is when the key |except-corners| is used. In that case,
-% we can't fill now the tabular because we don't know the list of the cells
-% of the corners. That's why we postpone the treatment in the |\CodeAfter|. 
-%    \begin{macrocode}
-      {
-        \tl_gput_left:Nx \g_@@_internal_code_after_tl
-          { 
-            \@@_arraycolor_code_after:nnn 
-              { #1 }  
-              { \exp_not:n { #2 } }  
-              { \l_tmpa_clist }
-          }
-      }
+    \@@_rectanglecolor [ #1 ] { #2 } 
+      { 1 - 1 } 
+      { \int_use:N \c at iRow - \int_use:N \c at jCol } 
   }
 %    \end{macrocode}
 % 
 % \bigskip
-% The following command will be used in the |\CodeAfter|. |#1| is the color
-% model, |#2| the color and |#3| the value of the key |except-corners| (a
-% sublist of |{NW,NE,SW,SE}|). 
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_arraycolor_code_after:nnn #1 #2 #3
-  {
-    \group_begin:
-%    \end{macrocode}
-% First, we compute the corners. 
-%    \begin{macrocode}
-    \clist_set:Nn \l_@@_corners_clist { #3 }
-    \@@_compute_corners:
-%    \end{macrocode}
-% Now, for each cell of the array (excepted the potential exterior rows and
-% columns) we check whether we have to fill that cell. When we have to fill the
-% cell, we do the job by writing an instruction in the |\CodeBefore| (in fact,
-% the ``|\CodeBefore|'' which will be written on the |aux| file for the next
-% run).
-%    \begin{macrocode}
-    \int_step_inline:nn \c at iRow 
-      {
-        \int_step_inline:nn \c at jCol
-          {
-            \seq_if_in:NnF \l_@@_empty_corner_cells_seq { ##1 - ####1 }
-              {
-                \tl_gput_left:Nx \g_nicematrix_code_before_tl
-                  { \@@_cellcolor [ #1 ] { \exp_not:n { #2 } } { ##1 - ####1 } } 
-              }
-          }
-      }
-    \group_end:
-  }
-%    \end{macrocode}
-% 
-%
-% \bigskip
-%    \begin{macrocode}
 \keys_define:nn { NiceMatrix / rowcolors }
   {
     respect-blocks .bool_set:N = \l_@@_respect_blocks_bool ,
@@ -12237,19 +12333,26 @@
   }
 %    \end{macrocode}
 %
-%
-%    \begin{macrocode}
-\cs_new:Npn \@@_cartesian_path: { \@@_cartesian_path:n { 0 pt } }
-%    \end{macrocode}
-% 
 % \bigskip
-% The following command uses two implicit arguments : |\l_@@_rows_tl| and
+% The following command uses two implicit arguments: |\l_@@_rows_tl| and
 % |\l_@@_cols_tl| which are specifications for a set of rows and a set of
 % columns. It creates a path but does \emph{not} fill it. It must be filled by
-% another command after. The argument is the radius of the corners.
+% another command after. The argument is the radius of the corners. We define
+% below a command |\@@_cartesian_path:| which corresponds to a value $0$~pt for
+% the radius of the corners.
+%
+% This command is in particular used in |\@@_rectanglecolor:nnn| (used in
+% |\@@_rectanglecolor|, itself used in |\@@_cellcolor|). 
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cartesian_path:n #1 
   { 
+    \bool_lazy_and:nnT
+      { ! \seq_if_empty_p:N \l_@@_corners_cells_seq }
+      { \dim_compare_p:nNn { #1 } = \c_zero_dim }
+      {
+        \@@_expand_clist:NN \l_@@_cols_tl \c at jCol
+        \@@_expand_clist:NN \l_@@_rows_tl \c at iRow
+      }
 %    \end{macrocode}
 % We begin the loop over the columns.
 %    \begin{macrocode}
@@ -12270,11 +12373,14 @@
         \int_compare:nNnT \l_tmpb_tl > \c at jCol
           { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at jCol } }
 %    \end{macrocode}
+% |\l_tmpc_tl| will contain the number of column.
+%    \begin{macrocode}
+        \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl
+%    \end{macrocode}
 % If we decide to provide the commands |\cellcolor|, |\rectanglecolor|,
-% |\rowcolor|, |\columncolor|, |\rowcolors| and |\chessboardcolors| available in
-% the |code-before| of a |\SubMatrix|, we will have to modify the following
-% line, by adding a kind of offset. We will have also some other rows below in
-% the same command |\@@_cartesian_path:|.
+% |\rowcolor|, |\columncolor|, |\rowcolors| and |\chessboardcolors| in the
+% |code-before| of a |\SubMatrix|, we will have to modify the following line, by
+% adding a kind of offset. We will have also some other lines to modify.
 %    \begin{macrocode}
         \@@_qpoint:n { col - \l_tmpa_tl }
         \int_compare:nNnTF \l_@@_first_col_int = \l_tmpa_tl
@@ -12299,36 +12405,83 @@
 %    \end{macrocode}
 % Now, the numbers of both rows are in |\l_tmpa_tl| and |\l_tmpb_tl|.
 %    \begin{macrocode}
-            \@@_qpoint:n { row - \@@_succ:n \l_tmpb_tl }
-            \dim_set:Nn \l_tmpb_dim { \pgf at y + 0.5 \arrayrulewidth }
-            \@@_qpoint:n { row - \l_tmpa_tl }
-            \dim_set:Nn \l_tmpd_dim { \pgf at y + 0.5 \arrayrulewidth }
-            \pgfsetcornersarced { \pgfpoint { #1 } { #1 } } 
-            \pgfpathrectanglecorners
-              { \pgfpoint \l_tmpc_dim \l_tmpd_dim }
-              { \pgfpoint \l_tmpa_dim \l_tmpb_dim } 
+            \seq_if_in:NxF \l_@@_corners_cells_seq
+              { \l_tmpa_tl - \l_tmpc_tl }
+              {
+                \@@_qpoint:n { row - \@@_succ:n \l_tmpb_tl }
+                \dim_set:Nn \l_tmpb_dim { \pgf at y + 0.5 \arrayrulewidth }
+                \@@_qpoint:n { row - \l_tmpa_tl }
+                \dim_set:Nn \l_tmpd_dim { \pgf at y + 0.5 \arrayrulewidth }
+                \pgfsetcornersarced { \pgfpoint { #1 } { #1 } } 
+                \pgfpathrectanglecorners
+                  { \pgfpoint \l_tmpc_dim \l_tmpd_dim }
+                  { \pgfpoint \l_tmpa_dim \l_tmpb_dim } 
+              }
           }
       }
   }
 %    \end{macrocode}
 %
+% \bigskip
+% The following command corresponds to a radius of the corners equal to $0$~pt.
+% This command is used by the commands |\@@_rowcolors|, |\@@_columncolor| and
+% |\@@_rowcolor:n| (used in |\@@_rowcolor|). 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cartesian_path: { \@@_cartesian_path:n { 0 pt } }
+%    \end{macrocode}
 %
+%
 % \bigskip
+% The following command will be used only with |\l_@@_cols_tl| and |\c at jCol| (first
+% case) or with |\l_@@_rows_tl| and |\c at iRow| (second case). For instance, with
+% |\l_@@_cols_tl| equal to |2,4-6,8-*| and |\c at jCol| equal to |10|, the clist
+% |\l_@@_cols_tl| will be replaced by |2,4,5,6,8,9,10|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_expand_clist:NN #1 #2
+  {
+    \clist_set_eq:NN \l_tmpa_clist #1 
+    \clist_clear:N #1
+    \clist_map_inline:Nn \l_tmpa_clist
+      {
+        \tl_set:Nn \l_tmpa_tl { ##1 }
+        \tl_if_in:NnTF \l_tmpa_tl { - } 
+          { \@@_cut_on_hyphen:w ##1 \q_stop }  
+          { \@@_cut_on_hyphen:w ##1 - ##1 \q_stop }  
+        \bool_lazy_or:nnT
+          { \tl_if_blank_p:V \l_tmpa_tl }
+          { \str_if_eq_p:Vn \l_tmpa_tl { * } }
+          { \tl_set:Nn \l_tmpa_tl { 1 } }  
+        \bool_lazy_or:nnT
+          { \tl_if_blank_p:V \l_tmpb_tl }
+          { \str_if_eq_p:Vn \l_tmpb_tl { * } }
+          { \tl_set:Nx \l_tmpb_tl { \int_use:N #2 } }
+        \int_compare:nNnT \l_tmpb_tl > #2
+          { \tl_set:Nx \l_tmpb_tl { \int_use:N #2 } }
+        \int_step_inline:nnn \l_tmpa_tl \l_tmpb_tl
+          { \clist_put_right:Nn #1 { ####1 } }
+      }
+  }
+%    \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_nicematrix_code_before_tl
-      { 
+    \peek_remove_spaces:n
+      {
+        \tl_gput_right:Nx \g_nicematrix_code_before_tl
+          { 
 %    \end{macrocode}
 % We must not expand the color (|#2|) because the color may contain the token
 % |!| which may be activated by some packages (ex.: \pkg{babel} with the option
 % |french| on latex and pdflatex).
 %    \begin{macrocode}
-        \cellcolor [ #1 ] { \exp_not:n { #2 } } 
-          { \int_use:N \c at iRow - \int_use:N \c at jCol } 
-      }   
+            \cellcolor [ #1 ] { \exp_not:n { #2 } } 
+              { \int_use:N \c at iRow - \int_use:N \c at jCol } 
+          }   
+      }
   }
 %    \end{macrocode}
 % 
@@ -12338,11 +12491,14 @@
 %    \begin{macrocode}
 \NewDocumentCommand \@@_rowcolor_tabular { O { } m }
   {
-    \tl_gput_right:Nx \g_nicematrix_code_before_tl      
-      { 
-        \exp_not:N \rectanglecolor [ #1 ] { \exp_not:n { #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 } }
+    \peek_remove_spaces:n
+      {
+        \tl_gput_right:Nx \g_nicematrix_code_before_tl      
+          { 
+            \exp_not:N \rectanglecolor [ #1 ] { \exp_not:n { #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}
@@ -12522,13 +12678,13 @@
      \int_compare:nNnTF \l_tmpb_tl = { \@@_succ:n \c at jCol } 
        {
          \seq_if_in:NxT
-           \l_@@_empty_corner_cells_seq 
+           \l_@@_corners_cells_seq 
            { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl }
            { \bool_set_false:N \g_tmpa_bool }
        }
        {
          \seq_if_in:NxT
-           \l_@@_empty_corner_cells_seq 
+           \l_@@_corners_cells_seq 
            { \l_tmpa_tl - \l_tmpb_tl }
            { 
              \int_compare:nNnTF \l_tmpb_tl = 1 
@@ -12535,7 +12691,7 @@
                { \bool_set_false:N \g_tmpa_bool }
                {
                  \seq_if_in:NxT
-                   \l_@@_empty_corner_cells_seq 
+                   \l_@@_corners_cells_seq 
                    { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl }
                    { \bool_set_false:N \g_tmpa_bool }
                }
@@ -12609,8 +12765,8 @@
 \cs_new_protected:Npn \@@_draw_vlines:
   {
     \int_step_inline:nnn 
-      { \bool_if:NTF \l_@@_NiceArray_bool 1 2 }
-      { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c at jCol } \c at jCol }
+      { \bool_if:NTF \g_@@_NiceArray_bool 1 2 }
+      { \bool_if:NTF \g_@@_NiceArray_bool { \@@_succ:n \c at jCol } \c at jCol }
       { 
         \tl_if_eq:NnF \l_@@_vlines_clist { all } 
           { \clist_if_in:NnT \l_@@_vlines_clist { ##1 } }
@@ -12702,13 +12858,13 @@
      \int_compare:nNnTF \l_tmpa_tl = { \@@_succ:n \c at iRow }
        {
          \seq_if_in:NxT
-           \l_@@_empty_corner_cells_seq 
+           \l_@@_corners_cells_seq 
            { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl }
            { \bool_set_false:N \g_tmpa_bool }
        }
        {
          \seq_if_in:NxT
-           \l_@@_empty_corner_cells_seq 
+           \l_@@_corners_cells_seq 
            { \l_tmpa_tl - \l_tmpb_tl }
            { 
              \int_compare:nNnTF \l_tmpa_tl = 1 
@@ -12715,7 +12871,7 @@
                { \bool_set_false:N \g_tmpa_bool }
                {
                  \seq_if_in:NxT
-                   \l_@@_empty_corner_cells_seq 
+                   \l_@@_corners_cells_seq 
                    { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl }
                    { \bool_set_false:N \g_tmpa_bool }
                }
@@ -12783,8 +12939,8 @@
 \cs_new_protected:Npn \@@_draw_hlines:
   {
     \int_step_inline:nnn 
-      { \bool_if:NTF \l_@@_NiceArray_bool 1 2 }
-      { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c at iRow } \c at iRow }  
+      { \bool_if:NTF \g_@@_NiceArray_bool 1 2 }
+      { \bool_if:NTF \g_@@_NiceArray_bool { \@@_succ:n \c at iRow } \c at iRow }  
       { 
         \tl_if_eq:NnF \l_@@_hlines_clist { all } 
           { \clist_if_in:NnT \l_@@_hlines_clist { ##1 } }
@@ -12906,10 +13062,10 @@
 \cs_new_protected:Npn \@@_compute_corners:
   {
 %    \end{macrocode}
-% The sequence |\l_@@_empty_corner_cells_seq| will be the sequence of all the
+% The sequence |\l_@@_corners_cells_seq| will be the sequence of all the
 % empty cells (and not in a block) considered in the corners of the array.
 %    \begin{macrocode}
-    \seq_clear_new:N \l_@@_empty_corner_cells_seq
+    \seq_clear_new:N \l_@@_corners_cells_seq
     \clist_map_inline:Nn \l_@@_corners_clist 
       {
         \str_case:nnF { ##1 }
@@ -12925,6 +13081,27 @@
           }
           { \@@_error:nn { bad~corner } { ##1 } }
       }
+%    \end{macrocode}
+% Even if the user has used the key |corners| (or the key
+% |hvlines-except-corners|), the list of cells in the corners may be empty.
+%    \begin{macrocode}
+    \seq_if_empty:NF \l_@@_corners_cells_seq
+      {
+%    \end{macrocode}
+% You write on the |aux| file the list of the cells which are in the (empty)
+% corners because you need that information in the |\CodeBefore| since the
+% commands which color the |rows|, |columns| and |cells| must not color the
+% cells in the corners.
+%    \begin{macrocode}
+        \iow_now:Nn \@mainaux \ExplSyntaxOn
+        \iow_now:Nx \@mainaux
+          {
+            \seq_gset_from_clist:cn
+              { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq }
+              { \seq_use:Nnnn \l_@@_corners_cells_seq , , , }
+          }
+        \iow_now:Nn \@mainaux \ExplSyntaxOff
+      }
   }
 %    \end{macrocode}
 %
@@ -12932,7 +13109,7 @@
 % \bigskip
 % ``Computing a corner'' is determining all the empty cells (which are not in a
 % block) that belong to that corner. These cells will be added to the sequence 
-% |\l_@@_empty_corner_cells_seq|.
+% |\l_@@_corners_cells_seq|.
 % 
 % \medskip
 % The six arguments of |\@@_compute_a_corner:nnnnnn| are as follow:
@@ -13020,7 +13197,7 @@
                   { 
                     \int_set:Nn \l_@@_last_empty_column_int { ####1 } 
                     \seq_put_right:Nn 
-                      \l_@@_empty_corner_cells_seq
+                      \l_@@_corners_cells_seq
                       { ##1 - ####1 }
                   }
               }
@@ -13200,7 +13377,7 @@
 % We do a reduction by |\arraycolsep| for the environments with delimiters (and
 % not for the other).
 %    \begin{macrocode}
-        \bool_if:NTF \l_@@_NiceArray_bool \c_zero_dim \arraycolsep 
+        \bool_if:NTF \g_@@_NiceArray_bool \c_zero_dim \arraycolsep 
         - \l_@@_left_margin_dim 
       } 
     \@@_qpoint:n { col - \@@_succ:n \c at jCol } 
@@ -13207,7 +13384,7 @@
     \dim_set:Nn \l_@@_x_final_dim 
       {            
         \pgf at x - 
-        \bool_if:NTF \l_@@_NiceArray_bool \c_zero_dim \arraycolsep 
+        \bool_if:NTF \g_@@_NiceArray_bool \c_zero_dim \arraycolsep 
         + \l_@@_right_margin_dim 
       }
 %    \end{macrocode}
@@ -13215,9 +13392,9 @@
 % bracket. The correction by |0.5 \l_@@_inter_dots_dim| is \emph{ad hoc} for a
 % better result.
 %    \begin{macrocode}
-    \tl_if_eq:NnF \l_@@_left_delim_tl ( 
+    \tl_if_eq:NnF \g_@@_left_delim_tl ( 
       { \dim_gadd:Nn \l_@@_x_initial_dim  { 0.5 \l_@@_inter_dots_dim } }
-    \tl_if_eq:NnF \l_@@_right_delim_tl ) 
+    \tl_if_eq:NnF \g_@@_right_delim_tl ) 
       { \dim_gsub:Nn \l_@@_x_final_dim { 0.5 \l_@@_inter_dots_dim } }
 %    \end{macrocode}
 %
@@ -13763,8 +13940,13 @@
 % with the syntax $i$|-|$j$) has not be provided by the user, you use |1-1|
 % (that is to say a block of only one cell).
 %    \begin{macrocode}
-    \tl_if_blank:nTF { #2 } { \@@_Block_i 1-1 \q_stop } { \@@_Block_i #2 \q_stop }
-    { #1 } { #3 } { #4 } 
+    \peek_remove_spaces:n
+      {
+        \tl_if_blank:nTF { #2 } 
+          { \@@_Block_i 1-1 \q_stop } 
+          { \@@_Block_i #2 \q_stop }
+        { #1 } { #3 } { #4 } 
+      }
   }
 %    \end{macrocode}
 % 
@@ -14078,6 +14260,8 @@
     color .value_required:n = true ,
     borders .clist_set:N = \l_@@_borders_clist ,
     borders .value_required:n = true ,
+    hvlines .bool_set:N = \l_@@_hvlines_block_bool ,
+    hvlines .default:n = true ,
     line-width .dim_set:N = \l_@@_line_width_dim ,
     line-width .value_required:n = true ,
     l .code:n = \tl_set:Nn \l_@@_hpos_of_block_tl l ,
@@ -14186,6 +14370,19 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
+    \bool_if:NT \l_@@_hvlines_block_bool
+      {
+        \tl_gput_right:Nx \g_nicematrix_code_after_tl
+          { 
+            \@@_hvlines_block:nnn
+              { \exp_not:n { #5 } } 
+              { #1 - #2 } 
+              { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int } 
+          }  
+      }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
     \clist_if_empty:NF \l_@@_borders_clist
       {
         \tl_gput_right:Nx \g_nicematrix_code_after_tl
@@ -14201,10 +14398,17 @@
 %    \begin{macrocode}
     \tl_if_empty:NF \l_@@_fill_tl
       {
+%    \end{macrocode}
+% The command |\@@_extract_brackets| will extract the potential specification of
+% color space at the beginning of |\l_@@_fill_tl| and store it in |\l_tmpa_tl|
+% and store the color itself in |\l_tmpb_tl|.
+%    \begin{macrocode}
+        \exp_last_unbraced:NV \@@_extract_brackets \l_@@_fill_tl \q_stop
         \tl_gput_right:Nx \g_nicematrix_code_before_tl
           { 
             \exp_not:N \roundedrectanglecolor 
-              { \exp_not:V \l_@@_fill_tl } 
+              [ \l_tmpa_tl ]
+              { \exp_not:V \l_tmpb_tl } 
               { #1 - #2 } 
               { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int } 
               { \dim_use:N \l_@@_rounded_corners_dim }
@@ -14486,7 +14690,17 @@
   }
 %    \end{macrocode}
 %
-%
+% \bigskip
+%    \begin{macrocode}
+\NewDocumentCommand \@@_extract_brackets { O { } }
+  {
+    \tl_set:Nn \l_tmpa_tl { #1 }
+    \@@_store_in_tmpb_tl 
+  }
+\cs_new_protected:Npn \@@_store_in_tmpb_tl #1 \q_stop 
+  { \tl_set:Nn \l_tmpb_tl { #1 } }
+%    \end{macrocode}
+% 
 % % \bigskip
 % The first argument of |\@@_stroke_block:nnn| is a list of options for the
 % rectangle that you will stroke. The second argument is the upper-left cell of
@@ -14563,7 +14777,61 @@
   }
 %    \end{macrocode}
 % 
+
 % \bigskip
+% The first argument of |\@@_hvlines_block:nnn| is a list of options for the
+% rules that wewill draw. The second argument is the upper-left cell of the
+% block (with, as usual, the syntax $i$|-|$j$) and the third is the last cell of
+% the block (with the same syntax).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_hvlines_block:nnn #1 #2 #3
+  {
+    \dim_set_eq:NN \l_@@_line_width_dim \arrayrulewidth
+    \keys_set_known:nn { NiceMatrix / BlockBorders } { #1 }
+    \@@_cut_on_hyphen:w #2 \q_stop
+    \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl
+    \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl
+    \@@_cut_on_hyphen:w #3 \q_stop
+    \tl_set:Nx \l_tmpa_tl { \int_eval:n { \l_tmpa_tl + 1 } }
+    \tl_set:Nx \l_tmpb_tl { \int_eval:n { \l_tmpb_tl + 1 } }
+    \pgfpicture
+    \pgfrememberpicturepositiononpagetrue
+    \pgf at relevantforpicturesizefalse
+    \CT at arc@
+    \pgfsetlinewidth { 1.1 \l_@@_line_width_dim }
+%    \end{macrocode}
+% First, the vertical rules.
+%    \begin{macrocode}
+    \@@_qpoint:n { row - \l_tmpa_tl }
+    \dim_set_eq:NN \l_tmpa_dim \pgf at y
+    \@@_qpoint:n { row - \l_tmpc_tl }
+    \dim_set_eq:NN \l_tmpb_dim \pgf at y
+    \int_step_inline:nnn \l_tmpd_tl \l_tmpb_tl
+      {
+        \@@_qpoint:n { col - ##1 }
+        \pgfpathmoveto { \pgfpoint \pgf at x \l_tmpa_dim }
+        \pgfpathlineto { \pgfpoint \pgf at x \l_tmpb_dim }
+        \pgfusepathqstroke
+      } 
+%    \end{macrocode}
+% Now, the horizontal rules.
+%    \begin{macrocode}
+    \@@_qpoint:n { col - \l_tmpb_tl }
+    \dim_set:Nn \l_tmpa_dim { \pgf at x + 0.5 \arrayrulewidth }
+    \@@_qpoint:n { col - \l_tmpd_tl }
+    \dim_set:Nn \l_tmpb_dim { \pgf at x - 0.5 \arrayrulewidth }
+    \int_step_inline:nnn \l_tmpc_tl \l_tmpa_tl
+      {
+        \@@_qpoint:n { row - ##1 }
+        \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
+        \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
+        \pgfusepathqstroke
+      } 
+    \endpgfpicture
+  }
+%    \end{macrocode}
+%
+% \bigskip
 % The first argument of |\@@_stroke_borders_block:nnn| is a list of options for
 % the borders that you will stroke. The second argument is the upper-left cell
 % of the block (with, as usual, the syntax $i$|-|$j$) and the third is the last
@@ -14749,10 +15017,9 @@
 %    \begin{macrocode}
 \NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } } 
   {
-    \group_begin:
-      \bool_set_true:N \l_@@_NiceArray_bool
-      \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ] 
-    \group_end:
+    \bool_gset_true:N \g_@@_NiceArray_bool
+    \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ] 
+    \bool_gset_false: \g_@@_NiceArray_bool
   }
 %    \end{macrocode}
 % 
@@ -14957,10 +15224,10 @@
 % A delimiter in the preamble of the array will write an instruction
 % |\@@_delimiter:nnn| in the |\g_@@_internal_code_after_tl| (and also
 % potentially add instructions in the preamble provided to |\array| in order to
-% add spaces between columns).
+% add space between columns).
 % 
 % \smallskip
-% The first argument is the type of delimiter (|(|, |[|, |\{|, |)|, |]| ou
+% The first argument is the type of delimiter (|(|, |[|, |\{|, |)|, |]| or
 % |\}|). The second argument is the number of colummn. The third argument is a
 % boolean equal to |\c_true_bool| (resp. |\c_false_true|) when the delimiter
 % must be put on the left (resp. right) side.
@@ -15183,7 +15450,7 @@
 % The last value of |\int_step_inline:nnn| is provided by currifycation.
 %    \begin{macrocode}
         \bool_if:NTF \l_@@_submatrix_slim_bool
-          { \int_step_inline:nnn \l_@@_first_i_tl  \l_@@_last_i_tl }
+          { \int_step_inline:nnn \l_@@_first_i_tl \l_@@_last_i_tl }
           { \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int }
           {
             \cs_if_exist:cT 
@@ -15201,67 +15468,85 @@
                   { \dim_max:nn \l_@@_x_final_dim \pgf at x }
               }
           }
-        \@@_qpoint:n { row - \l_@@_first_i_tl - base }
-        \dim_set:Nn \l_@@_y_initial_dim 
-          { \pgf at y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch }
-        \@@_qpoint:n { row - \l_@@_last_i_tl - base }
-        \dim_set:Nn \l_@@_y_final_dim 
-          { \pgf at y - ( \box_dp:N \strutbox ) * \arraystretch }
-        \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int 
+        \dim_compare:nNnTF \l_@@_x_initial_dim = \c_max_dim
+          { \@@_error:nn { impossible~delimiter } { left } }
           {
-            \cs_if_exist:cT 
-              { pgf @ sh @ ns @ \@@_env: - \l_@@_first_i_tl - ##1 }
-              {
-                \pgfpointanchor { \@@_env: - \l_@@_first_i_tl - ##1 } { north }
-                \dim_set:Nn \l_@@_y_initial_dim
-                  { \dim_max:nn \l_@@_y_initial_dim \pgf at y }
-              }
-            \cs_if_exist:cT 
-              { pgf @ sh @ ns @ \@@_env: - \l_@@_last_i_tl - ##1 }
-              {
-                \pgfpointanchor { \@@_env: - \l_@@_last_i_tl - ##1 } { south }
-                \dim_set:Nn \l_@@_y_final_dim
-                  { \dim_min:nn \l_@@_y_final_dim \pgf at y }
-              }
+            \dim_compare:nNnTF \l_@@_x_final_dim = { - \c_max_dim }
+              { \@@_error:nn { impossible~delimiter } { right } }
+              { \@@_sub_matrix_i:nn { #1 } { #4 } }
           }
-        \dim_set:Nn \l_tmpa_dim 
-          { 
-            \l_@@_y_initial_dim - \l_@@_y_final_dim +
-            \l_@@_submatrix_extra_height_dim - \arrayrulewidth 
+        \endpgfpicture
+      }
+    \group_end:
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% |#1| is the left delimiter dans |#2| is the right one.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_sub_matrix_i:nn #1 #2
+  { 
+    \@@_qpoint:n { row - \l_@@_first_i_tl - base }
+    \dim_set:Nn \l_@@_y_initial_dim 
+      { \pgf at y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch }
+    \@@_qpoint:n { row - \l_@@_last_i_tl - base }
+    \dim_set:Nn \l_@@_y_final_dim 
+      { \pgf at y - ( \box_dp:N \strutbox ) * \arraystretch }
+    \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int 
+      {
+        \cs_if_exist:cT 
+          { pgf @ sh @ ns @ \@@_env: - \l_@@_first_i_tl - ##1 }
+          {
+            \pgfpointanchor { \@@_env: - \l_@@_first_i_tl - ##1 } { north }
+            \dim_set:Nn \l_@@_y_initial_dim
+              { \dim_max:nn \l_@@_y_initial_dim \pgf at y }
           }
-        \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+        \cs_if_exist:cT 
+          { pgf @ sh @ ns @ \@@_env: - \l_@@_last_i_tl - ##1 }
+          {
+            \pgfpointanchor { \@@_env: - \l_@@_last_i_tl - ##1 } { south }
+            \dim_set:Nn \l_@@_y_final_dim
+              { \dim_min:nn \l_@@_y_final_dim \pgf at y }
+          }
+      }
+    \dim_set:Nn \l_tmpa_dim 
+      { 
+        \l_@@_y_initial_dim - \l_@@_y_final_dim +
+        \l_@@_submatrix_extra_height_dim - \arrayrulewidth 
+      }
+    \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
 %    \end{macrocode}
 %
 % \bigskip
 % We will draw the rules in the |\SubMatrix|.
 %    \begin{macrocode}
-        \group_begin:
-        \pgfsetlinewidth { 1.1 \arrayrulewidth }
-        \tl_if_empty:NF \l_@@_rules_color_tl
-          { \exp_after:wN \@@_set_CT at arc@: \l_@@_rules_color_tl \q_stop }
-        \CT at arc@ 
+    \group_begin:
+    \pgfsetlinewidth { 1.1 \arrayrulewidth }
+    \tl_if_empty:NF \l_@@_rules_color_tl
+      { \exp_after:wN \@@_set_CT at arc@: \l_@@_rules_color_tl \q_stop }
+    \CT at arc@ 
 %    \end{macrocode}
 % Now, we draw the potential vertical rules specified in the preamble of the
 % environments with the letter fixed with the key |vlines-in-sub-matrix|. The
 % list of the columns where there is such rule to draw is in |\g_@@_cols_vlism_seq|.
 %    \begin{macrocode}
-        \seq_map_inline:Nn \g_@@_cols_vlism_seq 
-          {
-            \int_compare:nNnT \l_@@_first_j_tl < { ##1 } 
-              { 
-                \int_compare:nNnT 
-                  { ##1 } < { \int_eval:n { \l_@@_last_j_tl + 1 } }
-                  {
+    \seq_map_inline:Nn \g_@@_cols_vlism_seq 
+      {
+        \int_compare:nNnT \l_@@_first_j_tl < { ##1 } 
+          { 
+            \int_compare:nNnT 
+              { ##1 } < { \int_eval:n { \l_@@_last_j_tl + 1 } }
+              {
 %    \end{macrocode}
 % First, we extract the value of the abscissa of the rule we have to draw.
 %    \begin{macrocode}
-                    \@@_qpoint:n { col - ##1 }
-                    \pgfpathmoveto { \pgfpoint \pgf at x \l_@@_y_initial_dim }
-                    \pgfpathlineto { \pgfpoint \pgf at x \l_@@_y_final_dim }
-                    \pgfusepathqstroke
-                  }
+                \@@_qpoint:n { col - ##1 }
+                \pgfpathmoveto { \pgfpoint \pgf at x \l_@@_y_initial_dim }
+                \pgfpathlineto { \pgfpoint \pgf at x \l_@@_y_final_dim }
+                \pgfusepathqstroke
               }
           }
+      }
 %    \end{macrocode} 
 %
 % \medskip
@@ -15269,23 +15554,23 @@
 % The last argument of |\int_step_inline:nn| or |\clist_map_inline:Nn| is given
 % by curryfication.
 %    \begin{macrocode}
-        \tl_if_eq:NnTF \l_@@_submatrix_vlines_clist { all }
-          { \int_step_inline:nn { \l_@@_last_j_tl - \l_@@_first_j_tl } }
-          { \clist_map_inline:Nn \l_@@_submatrix_vlines_clist }
+    \tl_if_eq:NnTF \l_@@_submatrix_vlines_clist { all }
+      { \int_step_inline:nn { \l_@@_last_j_tl - \l_@@_first_j_tl } }
+      { \clist_map_inline:Nn \l_@@_submatrix_vlines_clist }
+      {
+        \bool_lazy_and:nnTF
+          { \int_compare_p:nNn { ##1 } > 0 }
+          { 
+             \int_compare_p:nNn 
+               { ##1 } < { \l_@@_last_j_tl - \l_@@_first_j_tl + 1 } } 
           {
-            \bool_lazy_and:nnTF
-              { \int_compare_p:nNn { ##1 } > 0 }
-              { 
-                 \int_compare_p:nNn 
-                   { ##1 } < { \l_@@_last_j_tl - \l_@@_first_j_tl + 1 } } 
-              {
-                \@@_qpoint:n { col - \int_eval:n { ##1 + \l_@@_first_j_tl } }
-                \pgfpathmoveto { \pgfpoint \pgf at x \l_@@_y_initial_dim }
-                \pgfpathlineto { \pgfpoint \pgf at x \l_@@_y_final_dim }
-                \pgfusepathqstroke
-              }
-              { \@@_error:nnn { Wrong~line~in~SubMatrix } { vertical } { ##1 } }
+            \@@_qpoint:n { col - \int_eval:n { ##1 + \l_@@_first_j_tl } }
+            \pgfpathmoveto { \pgfpoint \pgf at x \l_@@_y_initial_dim }
+            \pgfpathlineto { \pgfpoint \pgf at x \l_@@_y_final_dim }
+            \pgfusepathqstroke
           }
+          { \@@_error:nnn { Wrong~line~in~SubMatrix } { vertical } { ##1 } }
+      }
 %    \end{macrocode}
 %
 % \medskip
@@ -15294,50 +15579,50 @@
 % The last argument of |\int_step_inline:nn| or |\clist_map_inline:Nn| is given
 % by curryfication.
 %    \begin{macrocode}
-        \tl_if_eq:NnTF \l_@@_submatrix_hlines_clist { all }
-          { \int_step_inline:nn { \l_@@_last_i_tl - \l_@@_first_i_tl } }
-          { \clist_map_inline:Nn \l_@@_submatrix_hlines_clist }
+    \tl_if_eq:NnTF \l_@@_submatrix_hlines_clist { all }
+      { \int_step_inline:nn { \l_@@_last_i_tl - \l_@@_first_i_tl } }
+      { \clist_map_inline:Nn \l_@@_submatrix_hlines_clist }
+      {
+        \bool_lazy_and:nnTF
+          { \int_compare_p:nNn { ##1 } > 0 }
+          { 
+            \int_compare_p:nNn 
+              { ##1 } < { \l_@@_last_i_tl - \l_@@_first_i_tl + 1 } } 
           {
-            \bool_lazy_and:nnTF
-              { \int_compare_p:nNn { ##1 } > 0 }
-              { 
-                \int_compare_p:nNn 
-                  { ##1 } < { \l_@@_last_i_tl - \l_@@_first_i_tl + 1 } } 
-              {
-                \@@_qpoint:n { row - \int_eval:n { ##1 + \l_@@_first_i_tl } }
+            \@@_qpoint:n { row - \int_eval:n { ##1 + \l_@@_first_i_tl } }
 %    \end{macrocode}
 % We use a group to protect |\l_tmpa_dim| and |\l_tmpb_dim|.
 %    \begin{macrocode}
-                \group_begin:
+            \group_begin:
 %    \end{macrocode}
 % We compute in |\l_tmpa_dim| the $x$-value of the left end of the rule.
 %    \begin{macrocode}
-                \dim_set:Nn \l_tmpa_dim 
-                  { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
-                \str_case:nn { #1 }
-                  {    
-                    (  { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
-                    [  { \dim_sub:Nn \l_tmpa_dim { 0.2 mm } }
-                    \{ { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
-                  }
-                \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
+            \dim_set:Nn \l_tmpa_dim 
+              { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
+            \str_case:nn { #1 }
+              {    
+                (  { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
+                [  { \dim_sub:Nn \l_tmpa_dim { 0.2 mm } }
+                \{ { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
+              }
+            \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
 %    \end{macrocode}
 % We compute in |\l_tmpb_dim| the $x$-value of the right end of the rule.
 %    \begin{macrocode}
-                \dim_set:Nn \l_tmpb_dim 
-                  { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim }
-                \str_case:nn { #4 }
-                  {    
-                    )  { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
-                    ]  { \dim_add:Nn \l_tmpb_dim { 0.2 mm } }
-                    \} { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
-                  }
-                \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
-                \pgfusepathqstroke
-                \group_end:
+            \dim_set:Nn \l_tmpb_dim 
+              { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim }
+            \str_case:nn { #2 }
+              {    
+                )  { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
+                ]  { \dim_add:Nn \l_tmpb_dim { 0.2 mm } }
+                \} { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
               }
-              { \@@_error:nnn { Wrong~line~in~SubMatrix } { horizontal } { ##1 } }
+            \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
+            \pgfusepathqstroke
+            \group_end:
           }
+          { \@@_error:nnn { Wrong~line~in~SubMatrix } { horizontal } { ##1 } }
+      }
 %    \end{macrocode}
 % 
 % \medskip 
@@ -15345,13 +15630,13 @@
 % node with that name for the submatrix (this node does not encompass the
 % delimiters that we will put after).
 %    \begin{macrocode}
-        \str_if_empty:NF \l_@@_submatrix_name_str
-          {
-            \@@_pgf_rect_node:nnnnn \l_@@_submatrix_name_str
-              \l_@@_x_initial_dim \l_@@_y_initial_dim
-              \l_@@_x_final_dim \l_@@_y_final_dim
-          }
-        \group_end:
+    \str_if_empty:NF \l_@@_submatrix_name_str
+      {
+        \@@_pgf_rect_node:nnnnn \l_@@_submatrix_name_str
+          \l_@@_x_initial_dim \l_@@_y_initial_dim
+          \l_@@_x_final_dim \l_@@_y_final_dim
+      }
+    \group_end:
 %    \end{macrocode}
 % The group was for |\CT at arc@| (the color of the rules).
 %
@@ -15359,45 +15644,41 @@
 % Now, we deal with the left delimiter. Of course, the environment
 % |{pgfscope}| is for the |\pgftransformshift|.
 %    \begin{macrocode}
-        \begin { pgfscope }
-        \pgftransformshift 
-          { 
-            \pgfpoint 
-              { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
-              { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
-          } 
-        \str_if_empty:NTF \l_@@_submatrix_name_str
-          { \@@_node_left:nn #1 { } }
-          { \@@_node_left:nn #1 { \@@_env: - \l_@@_submatrix_name_str - left } } 
-        \end { pgfscope }
+    \begin { pgfscope }
+    \pgftransformshift 
+      { 
+        \pgfpoint 
+          { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
+          { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
+      } 
+    \str_if_empty:NTF \l_@@_submatrix_name_str
+      { \@@_node_left:nn #1 { } }
+      { \@@_node_left:nn #1 { \@@_env: - \l_@@_submatrix_name_str - left } } 
+    \end { pgfscope }
 %    \end{macrocode}
 %
 % \medskip
 % Now, we deal with the right delimiter.
 %    \begin{macrocode}
-        \pgftransformshift 
-          { 
-            \pgfpoint 
-              { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim } 
-              { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
-          } 
-        \str_if_empty:NTF \l_@@_submatrix_name_str
-          { \@@_node_right:nn #4 { } }
-          { 
-            \@@_node_right:nn #4 { \@@_env: - \l_@@_submatrix_name_str - right }
-          } 
-        \endpgfpicture
+    \pgftransformshift 
+      { 
+        \pgfpoint 
+          { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim } 
+          { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
+      } 
+    \str_if_empty:NTF \l_@@_submatrix_name_str
+      { \@@_node_right:nn #2 { } }
+      { 
+        \@@_node_right:nn #2 { \@@_env: - \l_@@_submatrix_name_str - right }
+      } 
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-        \cs_set_eq:NN \pgfpointanchor \@@_pgfpointanchor:n
-        \flag_clear_new:n { nicematrix }
-        \l_@@_code_tl
-      }
-    \group_end:
+    \cs_set_eq:NN \pgfpointanchor \@@_pgfpointanchor:n
+    \flag_clear_new:n { nicematrix }
+    \l_@@_code_tl
   }
 %    \end{macrocode}
-% The group was a group for the whole |\SubMatrix|.
 %
 % \bigskip
 % In the key |code| of the command |\SubMatrix| there may be Tikz instructions.
@@ -15613,6 +15894,8 @@
   }
 %    \end{macrocode}
 %
+% \medskip
+% Maybe we will completely delete the key 'transparent' in a future version. 
 %    \begin{macrocode}
 \@@_msg_new:nn { Key~transparent }
   {
@@ -15713,7 +15996,32 @@
 % \bigskip
 % \subsection*{Error messages of the package}
 %
+%
+% The following message will be deleted when we will delete the key
+% |except-corners| for the command |\arraycolor|.
 %    \begin{macrocode}
+\@@_msg_new:nn { key except-corners }
+  {
+    The~key~'except-corners'~has~been~deleted~for~the~command~\token_to_str:N
+    \arraycolor\ in~the~\token_to_str:N \CodeBefore.~You~should~instead~use~
+    the~key~'corners'~in~your~\@@_full_name_env:.\\
+    If~you~go~on,~this~key~will~be~ignored.
+  }
+%    \end{macrocode}
+% 
+%
+% \medskip
+% The following message will be deleted when we will delete the key
+% |delimiters-color| (and keep only the key |delimiters/color|).
+%    \begin{macrocode}
+\@@_msg_new:nn { delimiters-color deleted }
+  { 
+    The~key~'delimiters-color'~has~been~renamed~'delimiters/color'.\\
+    ~However,~you~can~go~on~for~this~time.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \seq_new:N \c_@@_types_of_matrix_seq
 \seq_set_from_clist:Nn \c_@@_types_of_matrix_seq
   { 
@@ -15843,6 +16151,21 @@
   }
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+\@@_msg_new:nn { double~closing~delimiter }
+  {
+    You~can't~put~a~second~closing~delimiter~"#1"~just~after~a~first~closing~
+    delimiter.~This~delimiter~will~be~ignored.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { delimiter~after~opening }
+  {
+    You~can't~put~a~second~delimiter~"#1"~just~after~a~first~opening~
+    delimiter.~This~delimiter~will~be~ignored.
+  }
+%    \end{macrocode}
 % 
 %    \begin{macrocode}  
 \@@_msg_new:nn { bad~option~for~line-style }
@@ -15943,6 +16266,18 @@
     number~is~not~valid.~If~you~go~on,~it~will~be~ignored.
   }
 %    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { impossible~delimiter }
+  {
+    It's~impossible~to~draw~the~#1~delimiter~of~your~
+    \token_to_str:N \SubMatrix\ because~all~the~cells~are~empty~
+    in~that~column.
+    \bool_if:NT \l_@@_submatrix_slim_bool
+      { ~Maybe~you~should~try~without~the~key~'slim'. } \\
+    If~you~go~on,~this~\token_to_str:N \SubMatrix\ will~be~ignored.
+  }
+%    \end{macrocode}
 % 
 %    \begin{macrocode}
 \@@_msg_new:nn { empty~environment }
@@ -16154,8 +16489,8 @@
     For~a~list~of~the~available~keys,~type~H~<return>.
   }
   {
-    The~available~keys~are~(in~alphabetic~order):~borders,~c,~draw,~fill,~l,~ 
-    line-width,~rounded-corners~and~r. 
+    The~available~keys~are~(in~alphabetic~order):~b,~borders,~c,~draw,~fill,~
+    hvlines,~l,~line-width,~rounded-corners,~r~and~t. 
   }
 %    \end{macrocode}
 %
@@ -16468,9 +16803,10 @@
 % The successive versions of the file |nicematrix.sty| provided by TeXLive are available on the
 % \textsc{svn} server of TeXLive:
 %
+% \smallskip
 % {
 % \small
-% \url{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
+% \nolinkurl{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
 % }
 %
 % 
@@ -16918,12 +17254,23 @@
 %
 % \subsection*{Changes between versions 5.13 and 5.14}
 %
-% Nodes of the forme |(1.5)|, |(2.5)|, |(3.5)|, etc. 
+% Nodes of the form |(1.5)|, |(2.5)|, |(3.5)|, etc. 
 % 
 % Keys |t| and |b| for the command |\Block|.
 %
 % Key |corners|. 
 %
+% \subsection*{Changes between versions 5.14 and 5.15}
+%
+% Key |hvlines| for the command |\Block|.
+%
+% The commands provided by \pkg{nicematrix} to color cells, rows and columns
+% don't color the cells which are in the ``corners'' (when the key |corner| is
+% used).
+%
+% It's now possible to specify delimiters for submatrices in the preamble of an
+% environment. 
+% 
 % \PrintIndex
 % 
 % \tableofcontents

Modified: trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2021-04-25 20:00:09 UTC (rev 58986)
+++ trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2021-04-25 20:00:35 UTC (rev 58987)
@@ -18,8 +18,8 @@
 %% and version 1.3 or later is part of all distributions of
 %% LaTeX version 2005/12/01 or later.
 %% 
-\def\myfileversion{5.14}
-\def\myfiledate{2021/04/08}
+\def\myfileversion{5.15}
+\def\myfiledate{2021/04/25}
 \RequirePackage{pgfcore}
 \usepgfmodule{shapes}
 \RequirePackage{l3keys2e}
@@ -263,7 +263,7 @@
 \dim_new:N \g__nicematrix_blocks_dp_dim
 \seq_new:N \g__nicematrix_names_seq
 \bool_new:N \l__nicematrix_in_env_bool
-\bool_new:N \l__nicematrix_NiceArray_bool
+\bool_new:N \g__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
@@ -310,6 +310,7 @@
 \seq_new:N \g__nicematrix_pos_of_blocks_seq
 \seq_new:N \g__nicematrix_pos_of_xdots_seq
 \seq_new:N \g__nicematrix_pos_of_stroken_blocks_seq
+\seq_new:N \l__nicematrix_corners_cells_seq
 \seq_new:N \g__nicematrix_submatrix_names_seq
 \int_new:N \l__nicematrix_row_min_int
 \int_new:N \l__nicematrix_row_max_int
@@ -328,6 +329,7 @@
 \tl_new:N \l__nicematrix_vpos_of_block_tl
 \tl_set:Nn \l__nicematrix_vpos_of_block_tl { c }
 \bool_new:N \l__nicematrix_draw_first_bool
+\bool_new:N \l__nicematrix_hvlines_block_bool
 \int_new:N \g__nicematrix_block_box_int
 \dim_new:N \l__nicematrix_submatrix_extra_height_dim
 \dim_new:N \l__nicematrix_submatrix_left_xshift_dim
@@ -384,7 +386,7 @@
           }
         \NewDocumentCommand \tabularnote { m }
           {
-            \bool_if:nTF { ! \l__nicematrix_NiceArray_bool && \l__nicematrix_in_env_bool }
+            \bool_if:nTF { ! \g__nicematrix_NiceArray_bool && \l__nicematrix_in_env_bool }
               { \__nicematrix_error:n { tabularnote~forbidden } }
               {
                 \int_incr:N \l__nicematrix_number_of_notes_int
@@ -739,7 +741,9 @@
     delimiters / max-width .bool_set:N = \l__nicematrix_delimiters_max_width_bool ,
     delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl ,
     delimiters / color .value_required:n = true ,
-    delimiters-color .tl_set:N = \l__nicematrix_delimiters_color_tl ,
+    delimiters-color .code:n =
+      \tl_set:Nn \l__nicematrix_delimiters_color_tl { #1 }
+      \__nicematrix_error:n { delimiters-color deleted } ,
     delimiters-color .value_required:n = true ,
     last-col .code:n = \tl_if_empty:nF { #1 }
                          { \__nicematrix_error:n { last-col~non~empty~for~NiceMatrixOptions } }
@@ -795,7 +799,9 @@
     small .value_forbidden:n = true ,
     delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl ,
     delimiters / color .value_required:n = true ,
-    delimiters-color .tl_set:N = \l__nicematrix_delimiters_color_tl ,
+    delimiters-color .code:n =
+      \tl_set:Nn \l__nicematrix_delimiters_color_tl { #1 }
+      \__nicematrix_error:n { delimiters-color deleted } ,
     delimiters-color .value_required:n = true ,
     unknown .code:n = \__nicematrix_error:n { Unknown~option~for~NiceMatrix }
   }
@@ -812,8 +818,9 @@
     notes / bottomrule .default:n = true ,
     tabularnote .tl_set:N = \l__nicematrix_tabularnote_tl ,
     tabularnote .value_required:n = true ,
-    delimiters-color .tl_set:N = \l__nicematrix_delimiters_color_tl ,
-    delimiters-color .value_required:n = true ,
+    delimiters-color .code:n =
+      \tl_set:Nn \l__nicematrix_delimiters_color_tl { #1 }
+      \__nicematrix_error:n { delimiters-color deleted } ,
     delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl ,
     delimiters / color .value_required:n = true ,
     r .code:n = \__nicematrix_error:n { r~or~l~with~preamble } ,
@@ -1200,6 +1207,12 @@
     \seq_gclear:N \g__nicematrix_submatrix_seq
     \bool_if:NT \l__nicematrix_code_before_bool
       {
+        \seq_if_exist:cT
+          { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq }
+          {
+            \seq_set_eq:Nc \l__nicematrix_corners_cells_seq
+              { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq }
+          }
         \seq_if_exist:cT { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq }
           {
             \int_zero_new:N \c at iRow
@@ -1307,22 +1320,22 @@
           }
       }
     \__nicematrix_pre_array_ii:
+    \box_clear_new:N \l__nicematrix_the_array_box
+    \bool_if:NT \c__nicematrix_define_L_C_R_bool \__nicematrix_define_L_C_R:
+    \__nicematrix_construct_preamble:
     \dim_zero_new:N \l__nicematrix_left_delim_dim
     \dim_zero_new:N \l__nicematrix_right_delim_dim
-    \bool_if:NTF \l__nicematrix_NiceArray_bool
+    \bool_if:NTF \g__nicematrix_NiceArray_bool
       {
         \dim_gset:Nn \l__nicematrix_left_delim_dim { 2 \arraycolsep }
         \dim_gset:Nn \l__nicematrix_right_delim_dim { 2 \arraycolsep }
       }
       {
-        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l__nicematrix_left_delim_tl $ }
+        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g__nicematrix_left_delim_tl $ }
         \dim_set:Nn \l__nicematrix_left_delim_dim { \box_wd:N \l_tmpa_box }
-        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l__nicematrix_right_delim_tl $ }
+        \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g__nicematrix_right_delim_tl $ }
         \dim_set:Nn \l__nicematrix_right_delim_dim { \box_wd:N \l_tmpa_box }
       }
-    \box_clear_new:N \l__nicematrix_the_array_box
-    \bool_if:NT \c__nicematrix_define_L_C_R_bool \__nicematrix_define_L_C_R:
-    \__nicematrix_construct_preamble:
     \hbox_set:Nw \l__nicematrix_the_array_box
     \skip_horizontal:N \l__nicematrix_left_margin_dim
     \skip_horizontal:N \l__nicematrix_extra_left_margin_dim
@@ -1343,8 +1356,8 @@
     \__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 }
+    \tl_gset:Nn \g__nicematrix_left_delim_tl { #1 }
+    \tl_gset:Nn \g__nicematrix_right_delim_tl { #2 }
     \tl_gset:Nn \g__nicematrix_preamble_tl { #4 }
     \int_gzero:N \g__nicematrix_block_box_int
     \dim_zero:N \g__nicematrix_width_last_col_dim
@@ -1378,7 +1391,7 @@
         \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
+    \bool_if:NTF \g__nicematrix_NiceArray_bool
       { \keys_set:nn { NiceMatrix / NiceArray } }
       { \keys_set:nn { NiceMatrix / pNiceArray } }
     { #3 , #5 }
@@ -1419,7 +1432,7 @@
         \skip_horizontal:N \col at sep
         \skip_horizontal:N \g__nicematrix_width_first_col_dim
       }
-    \bool_if:NTF \l__nicematrix_NiceArray_bool
+    \bool_if:NTF \g__nicematrix_NiceArray_bool
       {
         \str_case:VnF \l__nicematrix_baseline_tl
           {
@@ -1446,7 +1459,7 @@
             \c_math_toggle_token
             \tl_if_empty:NF \l__nicematrix_delimiters_color_tl
               { \color { \l__nicematrix_delimiters_color_tl } }
-            \exp_after:wN \left \l__nicematrix_left_delim_tl
+            \exp_after:wN \left \g__nicematrix_left_delim_tl
             \vcenter
               {
                 \skip_vertical:N -\l_tmpa_dim
@@ -1464,11 +1477,14 @@
               }
             \tl_if_empty:NF \l__nicematrix_delimiters_color_tl
               { \color { \l__nicematrix_delimiters_color_tl } }
-            \exp_after:wN \right \l__nicematrix_right_delim_tl
+            \exp_after:wN \right \g__nicematrix_right_delim_tl
             \c_math_toggle_token
           }
         \bool_if:NTF \l__nicematrix_delimiters_max_width_bool
-          { \__nicematrix_put_box_in_flow_bis:nn { #1 } { #2 } }
+          {
+            \__nicematrix_put_box_in_flow_bis:nn
+              \g__nicematrix_left_delim_tl \g__nicematrix_right_delim_tl
+          }
           \__nicematrix_put_box_in_flow:
       }
     \bool_if:NT \g__nicematrix_last_col_found_bool
@@ -1515,7 +1531,9 @@
           }
         \seq_clear:N \g__nicematrix_cols_vlism_seq
         \int_zero:N \l_tmpa_int
+        \bool_set_false:N \l_tmpa_bool
         \exp_after:wN \__nicematrix_patch_preamble:n \the \@temptokena \q_stop
+        \bool_if:NT \l_tmpa_bool { \bool_gset_false:N \g__nicematrix_NiceArray_bool }
         \int_gset_eq:NN \g__nicematrix_static_num_of_col_int \c at jCol
       }
     \bool_if:NT \l__nicematrix_colortbl_like_bool
@@ -1530,7 +1548,7 @@
       {
         \bool_lazy_all:nT
           {
-            \l__nicematrix_NiceArray_bool
+            \g__nicematrix_NiceArray_bool
             { \bool_not_p:n \l__nicematrix_NiceTabular_bool }
             { \tl_if_empty_p:N \l__nicematrix_vlines_clist }
             { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool }
@@ -1542,7 +1560,7 @@
       {
         \bool_lazy_all:nT
           {
-            \l__nicematrix_NiceArray_bool
+            \g__nicematrix_NiceArray_bool
             { \bool_not_p:n \l__nicematrix_NiceTabular_bool }
             { \tl_if_empty_p:N \l__nicematrix_vlines_clist }
             { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool }
@@ -1576,9 +1594,9 @@
         (  { \__nicematrix_patch_preamble_vii:n #1 }
         [  { \__nicematrix_patch_preamble_vii:n #1 }
         \{ { \__nicematrix_patch_preamble_vii:n #1 }
-        )  { \__nicematrix_patch_preamble_viii:n #1 }
-        ]  { \__nicematrix_patch_preamble_viii:n #1 }
-        \} { \__nicematrix_patch_preamble_viii:n #1 }
+        )  { \__nicematrix_patch_preamble_viii:nn #1 }
+        ]  { \__nicematrix_patch_preamble_viii:nn #1 }
+        \} { \__nicematrix_patch_preamble_viii:nn #1 }
         C { \__nicematrix_error:nn { old~column~type } #1 }
         L { \__nicematrix_error:nn { old~column~type } #1 }
         R { \__nicematrix_error:nn { old~column~type } #1 }
@@ -1661,14 +1679,14 @@
       {
         > {
             \__nicematrix_Cell:
-            \begin { minipage } [ #1 ] { #3 }
+            \begin { minipage } [ #1 ] { \dim_eval:n { #3 } }
             \mode_leave_vertical:
             \arraybackslash
-            \vrule height \box_ht:N \@arstrutbox depth 0 pt width 0 pt % v. 5.11
+            \vrule height \box_ht:N \@arstrutbox depth 0 pt width 0 pt
           }
         c
         < {
-            \vrule height 0 pt depth \box_dp:N \@arstrutbox width 0 pt % v. 5.11
+            \vrule height 0 pt depth \box_dp:N \@arstrutbox width 0 pt
             \end { minipage }
             \__nicematrix_end_Cell:
           }
@@ -1706,33 +1724,73 @@
   }
 \cs_new_protected:Npn \__nicematrix_patch_preamble_vii:n #1
   {
-     \bool_if:NT \l__nicematrix_small_bool
-       { \__nicematrix_fatal:n { Delimiter~with~small } }
-    \int_compare:nNnT \c at jCol = \c_zero_int
-      { \tl_gput_right:Nx \g__nicematrix_preamble_tl { ! { \enskip } } }
-    \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-      { \__nicematrix_delimiter:nnn #1 { \__nicematrix_succ:n \c at jCol } \c_true_bool }
-    \__nicematrix_patch_preamble:n
+    \bool_if:NT \l__nicematrix_small_bool
+      { \__nicematrix_fatal:n { Delimiter~with~small } }
+    \int_compare:nNnTF \c at jCol = \c_zero_int
+      {
+        \bool_if:NTF \g__nicematrix_NiceArray_bool
+          {
+            \tl_gset:Nn \g__nicematrix_left_delim_tl { #1 }
+            \tl_gset:Nn \g__nicematrix_right_delim_tl { . }
+            \bool_set_true:N \l_tmpa_bool
+            \__nicematrix_patch_preamble:n
+          }
+          {
+            \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } }
+            \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+              { \__nicematrix_delimiter:nnn #1 { \__nicematrix_succ:n \c at jCol } \c_true_bool }
+            \__nicematrix_patch_preamble_vii_i:n
+          }
+      }
+      {
+        \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+          { \__nicematrix_delimiter:nnn #1 { \__nicematrix_succ:n \c at jCol } \c_true_bool }
+        \__nicematrix_patch_preamble_vii_i:n
+      }
   }
-\cs_new_protected:Npn \__nicematrix_patch_preamble_viii:n #1
+\cs_new_protected:Npn \__nicematrix_patch_preamble_vii_i:n #1
   {
-     \bool_if:NT \l__nicematrix_small_bool
-       { \__nicematrix_fatal:n { Delimiter~with~small } }
-    \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-      { \__nicematrix_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
-    \__nicematrix_patch_preamble_viii_i:n
+    \tl_if_in:nnTF { ( [ \{ ) ] \} } { #1 }
+      {
+        \__nicematrix_error:nn { delimiter~after~opening } { #1 }
+        \__nicematrix_patch_preamble:n
+      }
+      { \__nicematrix_patch_preamble:n #1 }
   }
-\cs_new_protected:Npn \__nicematrix_patch_preamble_viii_i:n #1
+\cs_new_protected:Npn \__nicematrix_patch_preamble_viii:nn #1 #2
   {
-    \bool_lazy_any:nT
+    \bool_if:NT \l__nicematrix_small_bool
+      { \__nicematrix_fatal:n { Delimiter~with~small } }
+    \tl_if_in:nnTF { ) ] \} } { #2 }
       {
-          { \str_if_eq_p:nn { #1 } ( }
-          { \str_if_eq_p:nn { #1 } [ }
-          { \str_if_eq_p:nn { #1 } \{ }
-          { \str_if_eq_p:nn { #1 } \q_stop }
+        \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+          { \__nicematrix_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+        \__nicematrix_error:nn { double~closing~delimiter } { #2 }
+        \__nicematrix_patch_preamble:n
       }
-    { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } }
-    \__nicematrix_patch_preamble:n #1
+      {
+        \tl_if_eq:nnTF { \q_stop } { #2 }
+          {
+            \bool_if:NTF \g__nicematrix_NiceArray_bool
+              {
+                \tl_gset:Nn \g__nicematrix_right_delim_tl { #1 }
+                \bool_set_true:N \l_tmpa_bool
+              }
+              {
+                \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } }
+                \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+                  { \__nicematrix_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+                \__nicematrix_patch_preamble:n #2
+              }
+          }
+          {
+            \tl_if_in:nnT { ( [ \{ } { #2 }
+              { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } }
+            \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
+              { \__nicematrix_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+            \__nicematrix_patch_preamble:n #2
+          }
+      }
   }
 \cs_new_protected:Npn \__nicematrix_patch_preamble_xi:n #1
   {
@@ -2250,7 +2308,7 @@
   }
 \NewDocumentEnvironment { NiceArray } { }
   {
-    \bool_set_true:N \l__nicematrix_NiceArray_bool
+    \bool_gset_true:N \g__nicematrix_NiceArray_bool
     \str_if_empty:NT \g__nicematrix_name_env_str
       { \str_gset:Nn \g__nicematrix_name_env_str { NiceArray } }
     \NiceArrayWithDelims . .
@@ -2385,7 +2443,6 @@
               { c__nicematrix_pos_of_blocks_ \int_use:N \g__nicematrix_env_int _ seq }
               { \seq_use:Nnnn \g__nicematrix_pos_of_blocks_seq , , , }
           }
-        \iow_now:Nn \@mainaux \ExplSyntaxOff
       }
     \__nicematrix_create_diag_nodes:
     \bool_if:NT \l__nicematrix_parallelize_diags_bool
@@ -2416,7 +2473,7 @@
       {
         { \seq_if_empty_p:N \g__nicematrix_pos_of_blocks_seq }
         { \seq_if_empty_p:N \g__nicematrix_pos_of_xdots_seq }
-        { \seq_if_empty_p:N \l__nicematrix_empty_corner_cells_seq }
+        { \seq_if_empty_p:N \l__nicematrix_corners_cells_seq }
       }
       {
         \cs_set_eq:NN \__nicematrix_vline_i:nn \__nicematrix_vline_i_complete:nn
@@ -2460,6 +2517,7 @@
         \iow_now:Nn \@mainaux \ExplSyntaxOff
         \bool_set_true:N \l__nicematrix_code_before_bool
       }
+    \bool_gset_false:N \g__nicematrix_NiceArray_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@
@@ -3480,7 +3538,7 @@
     \bool_set_false:N \l__nicematrix_final_open_bool
     \int_set:Nn \l__nicematrix_initial_i_int { #1 }
     \int_set_eq:NN \l__nicematrix_final_i_int \l__nicematrix_initial_i_int
-    \int_compare:nNnTF #2 = 1
+    \int_compare:nNnTF { #2 } = 1
       {
         \int_set:Nn \l__nicematrix_initial_j_int 1
         \bool_set_true:N \l__nicematrix_initial_open_bool
@@ -3728,7 +3786,7 @@
       {
         \__nicematrix_add_to_colors_seq:xn
           { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
-          { \__nicematrix_rectanglecolor:nnn { #3 } { #4 } { 0 pt }}
+          { \__nicematrix_rectanglecolor:nnn { #3 } { #4 } { 0 pt } }
       }
   }
 \NewDocumentCommand \__nicematrix_roundedrectanglecolor { O { } m m m m }
@@ -3771,46 +3829,14 @@
       }
   }
 \keys_define:nn { NiceMatrix / arraycolor }
-  {
-    except-corners .clist_set:N = \l_tmpa_clist ,
-    except-corners .default:n = { NW , SW , NE , SE }
-  }
+  { except-corners .code:n = \__nicematrix_error:n { key except-corners } }
 \NewDocumentCommand \__nicematrix_arraycolor { O { } m O { } }
   {
     \keys_set:nn { NiceMatrix / arraycolor } { #3 }
-    \clist_if_empty:NTF \l_tmpa_clist
-      {
-        \__nicematrix_rectanglecolor [ #1 ] { #2 }
-          { 1 - 1 } { \int_use:N \c at iRow - \int_use:N \c at jCol }
-      }
-      {
-        \tl_gput_left:Nx \g__nicematrix_internal_code_after_tl
-          {
-            \__nicematrix_arraycolor_code_after:nnn
-              { #1 }
-              { \exp_not:n { #2 } }
-              { \l_tmpa_clist }
-          }
-      }
+    \__nicematrix_rectanglecolor [ #1 ] { #2 }
+      { 1 - 1 }
+      { \int_use:N \c at iRow - \int_use:N \c at jCol }
   }
-\cs_new_protected:Npn \__nicematrix_arraycolor_code_after:nnn #1 #2 #3
-  {
-    \group_begin:
-    \clist_set:Nn \l__nicematrix_corners_clist { #3 }
-    \__nicematrix_compute_corners:
-    \int_step_inline:nn \c at iRow
-      {
-        \int_step_inline:nn \c at jCol
-          {
-            \seq_if_in:NnF \l__nicematrix_empty_corner_cells_seq { ##1 - ####1 }
-              {
-                \tl_gput_left:Nx \g_nicematrix_code_before_tl
-                  { \__nicematrix_cellcolor [ #1 ] { \exp_not:n { #2 } } { ##1 - ####1 } }
-              }
-          }
-      }
-    \group_end:
-  }
 \keys_define:nn { NiceMatrix / rowcolors }
   {
     respect-blocks .bool_set:N = \l__nicematrix_respect_blocks_bool ,
@@ -3923,9 +3949,15 @@
       \prg_return_true:
       \prg_return_false:
   }
-\cs_new:Npn \__nicematrix_cartesian_path: { \__nicematrix_cartesian_path:n { 0 pt } }
 \cs_new_protected:Npn \__nicematrix_cartesian_path:n #1
   {
+    \bool_lazy_and:nnT
+      { ! \seq_if_empty_p:N \l__nicematrix_corners_cells_seq }
+      { \dim_compare_p:nNn { #1 } = \c_zero_dim }
+      {
+        \__nicematrix_expand_clist:NN \l__nicematrix_cols_tl \c at jCol
+        \__nicematrix_expand_clist:NN \l__nicematrix_rows_tl \c at iRow
+      }
     \clist_map_inline:Nn \l__nicematrix_cols_tl
       {
         \tl_set:Nn \l_tmpa_tl { ##1 }
@@ -3942,6 +3974,7 @@
           { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at jCol } }
         \int_compare:nNnT \l_tmpb_tl > \c at jCol
           { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at jCol } }
+        \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl
         \__nicematrix_qpoint:n { col - \l_tmpa_tl }
         \int_compare:nNnTF \l__nicematrix_first_col_int = \l_tmpa_tl
           { \dim_set:Nn \l_tmpc_dim { \pgf at x - 0.5 \arrayrulewidth } }
@@ -3959,32 +3992,67 @@
               { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at iRow } }
             \int_compare:nNnT \l_tmpb_tl > \c at iRow
               { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at iRow } }
-            \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \l_tmpb_tl }
-            \dim_set:Nn \l_tmpb_dim { \pgf at y + 0.5 \arrayrulewidth }
-            \__nicematrix_qpoint:n { row - \l_tmpa_tl }
-            \dim_set:Nn \l_tmpd_dim { \pgf at y + 0.5 \arrayrulewidth }
-            \pgfsetcornersarced { \pgfpoint { #1 } { #1 } }
-            \pgfpathrectanglecorners
-              { \pgfpoint \l_tmpc_dim \l_tmpd_dim }
-              { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+            \seq_if_in:NxF \l__nicematrix_corners_cells_seq
+              { \l_tmpa_tl - \l_tmpc_tl }
+              {
+                \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \l_tmpb_tl }
+                \dim_set:Nn \l_tmpb_dim { \pgf at y + 0.5 \arrayrulewidth }
+                \__nicematrix_qpoint:n { row - \l_tmpa_tl }
+                \dim_set:Nn \l_tmpd_dim { \pgf at y + 0.5 \arrayrulewidth }
+                \pgfsetcornersarced { \pgfpoint { #1 } { #1 } }
+                \pgfpathrectanglecorners
+                  { \pgfpoint \l_tmpc_dim \l_tmpd_dim }
+                  { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+              }
           }
       }
   }
+\cs_new_protected:Npn \__nicematrix_cartesian_path: { \__nicematrix_cartesian_path:n { 0 pt } }
+\cs_new_protected:Npn \__nicematrix_expand_clist:NN #1 #2
+  {
+    \clist_set_eq:NN \l_tmpa_clist #1
+    \clist_clear:N #1
+    \clist_map_inline:Nn \l_tmpa_clist
+      {
+        \tl_set:Nn \l_tmpa_tl { ##1 }
+        \tl_if_in:NnTF \l_tmpa_tl { - }
+          { \__nicematrix_cut_on_hyphen:w ##1 \q_stop }
+          { \__nicematrix_cut_on_hyphen:w ##1 - ##1 \q_stop }
+        \bool_lazy_or:nnT
+          { \tl_if_blank_p:V \l_tmpa_tl }
+          { \str_if_eq_p:Vn \l_tmpa_tl { * } }
+          { \tl_set:Nn \l_tmpa_tl { 1 } }
+        \bool_lazy_or:nnT
+          { \tl_if_blank_p:V \l_tmpb_tl }
+          { \str_if_eq_p:Vn \l_tmpb_tl { * } }
+          { \tl_set:Nx \l_tmpb_tl { \int_use:N #2 } }
+        \int_compare:nNnT \l_tmpb_tl > #2
+          { \tl_set:Nx \l_tmpb_tl { \int_use:N #2 } }
+        \int_step_inline:nnn \l_tmpa_tl \l_tmpb_tl
+          { \clist_put_right:Nn #1 { ####1 } }
+      }
+  }
 \NewDocumentCommand \__nicematrix_cellcolor_tabular { O { } m }
   {
-    \tl_gput_right:Nx \g_nicematrix_code_before_tl
+    \peek_remove_spaces:n
       {
-        \cellcolor [ #1 ] { \exp_not:n { #2 } }
-          { \int_use:N \c at iRow - \int_use:N \c at jCol }
+        \tl_gput_right:Nx \g_nicematrix_code_before_tl
+          {
+            \cellcolor [ #1 ] { \exp_not:n { #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
+    \peek_remove_spaces:n
       {
-        \exp_not:N \rectanglecolor [ #1 ] { \exp_not:n { #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 } }
+        \tl_gput_right:Nx \g_nicematrix_code_before_tl
+          {
+            \exp_not:N \rectanglecolor [ #1 ] { \exp_not:n { #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 }
@@ -4073,13 +4141,13 @@
      \int_compare:nNnTF \l_tmpb_tl = { \__nicematrix_succ:n \c at jCol }
        {
          \seq_if_in:NxT
-           \l__nicematrix_empty_corner_cells_seq
+           \l__nicematrix_corners_cells_seq
            { \l_tmpa_tl - \__nicematrix_pred:n \l_tmpb_tl }
            { \bool_set_false:N \g_tmpa_bool }
        }
        {
          \seq_if_in:NxT
-           \l__nicematrix_empty_corner_cells_seq
+           \l__nicematrix_corners_cells_seq
            { \l_tmpa_tl - \l_tmpb_tl }
            {
              \int_compare:nNnTF \l_tmpb_tl = 1
@@ -4086,7 +4154,7 @@
                { \bool_set_false:N \g_tmpa_bool }
                {
                  \seq_if_in:NxT
-                   \l__nicematrix_empty_corner_cells_seq
+                   \l__nicematrix_corners_cells_seq
                    { \l_tmpa_tl - \__nicematrix_pred:n \l_tmpb_tl }
                    { \bool_set_false:N \g_tmpa_bool }
                }
@@ -4138,8 +4206,8 @@
 \cs_new_protected:Npn \__nicematrix_draw_vlines:
   {
     \int_step_inline:nnn
-      { \bool_if:NTF \l__nicematrix_NiceArray_bool 1 2 }
-      { \bool_if:NTF \l__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c at jCol } \c at jCol }
+      { \bool_if:NTF \g__nicematrix_NiceArray_bool 1 2 }
+      { \bool_if:NTF \g__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c at jCol } \c at jCol }
       {
         \tl_if_eq:NnF \l__nicematrix_vlines_clist { all }
           { \clist_if_in:NnT \l__nicematrix_vlines_clist { ##1 } }
@@ -4198,13 +4266,13 @@
      \int_compare:nNnTF \l_tmpa_tl = { \__nicematrix_succ:n \c at iRow }
        {
          \seq_if_in:NxT
-           \l__nicematrix_empty_corner_cells_seq
+           \l__nicematrix_corners_cells_seq
            { \__nicematrix_pred:n \l_tmpa_tl - \l_tmpb_tl }
            { \bool_set_false:N \g_tmpa_bool }
        }
        {
          \seq_if_in:NxT
-           \l__nicematrix_empty_corner_cells_seq
+           \l__nicematrix_corners_cells_seq
            { \l_tmpa_tl - \l_tmpb_tl }
            {
              \int_compare:nNnTF \l_tmpa_tl = 1
@@ -4211,7 +4279,7 @@
                { \bool_set_false:N \g_tmpa_bool }
                {
                  \seq_if_in:NxT
-                   \l__nicematrix_empty_corner_cells_seq
+                   \l__nicematrix_corners_cells_seq
                    { \__nicematrix_pred:n \l_tmpa_tl - \l_tmpb_tl }
                    { \bool_set_false:N \g_tmpa_bool }
                }
@@ -4261,8 +4329,8 @@
 \cs_new_protected:Npn \__nicematrix_draw_hlines:
   {
     \int_step_inline:nnn
-      { \bool_if:NTF \l__nicematrix_NiceArray_bool 1 2 }
-      { \bool_if:NTF \l__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c at iRow } \c at iRow }
+      { \bool_if:NTF \g__nicematrix_NiceArray_bool 1 2 }
+      { \bool_if:NTF \g__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c at iRow } \c at iRow }
       {
         \tl_if_eq:NnF \l__nicematrix_hlines_clist { all }
           { \clist_if_in:NnT \l__nicematrix_hlines_clist { ##1 } }
@@ -4334,7 +4402,7 @@
   }
 \cs_new_protected:Npn \__nicematrix_compute_corners:
   {
-    \seq_clear_new:N \l__nicematrix_empty_corner_cells_seq
+    \seq_clear_new:N \l__nicematrix_corners_cells_seq
     \clist_map_inline:Nn \l__nicematrix_corners_clist
       {
         \str_case:nnF { ##1 }
@@ -4350,6 +4418,17 @@
           }
           { \__nicematrix_error:nn { bad~corner } { ##1 } }
       }
+    \seq_if_empty:NF \l__nicematrix_corners_cells_seq
+      {
+        \iow_now:Nn \@mainaux \ExplSyntaxOn
+        \iow_now:Nx \@mainaux
+          {
+            \seq_gset_from_clist:cn
+              { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq }
+              { \seq_use:Nnnn \l__nicematrix_corners_cells_seq , , , }
+          }
+        \iow_now:Nn \@mainaux \ExplSyntaxOff
+      }
   }
 \cs_new_protected:Npn \__nicematrix_compute_a_corner:nnnnnn #1 #2 #3 #4 #5 #6
   {
@@ -4407,7 +4486,7 @@
                   {
                     \int_set:Nn \l__nicematrix_last_empty_column_int { ####1 }
                     \seq_put_right:Nn
-                      \l__nicematrix_empty_corner_cells_seq
+                      \l__nicematrix_corners_cells_seq
                       { ##1 - ####1 }
                   }
               }
@@ -4468,7 +4547,7 @@
     \dim_set:Nn \l__nicematrix_x_initial_dim
       {
         \pgf at x +
-        \bool_if:NTF \l__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep
+        \bool_if:NTF \g__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep
         - \l__nicematrix_left_margin_dim
       }
     \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \c at jCol }
@@ -4475,12 +4554,12 @@
     \dim_set:Nn \l__nicematrix_x_final_dim
       {
         \pgf at x -
-        \bool_if:NTF \l__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep
+        \bool_if:NTF \g__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep
         + \l__nicematrix_right_margin_dim
       }
-    \tl_if_eq:NnF \l__nicematrix_left_delim_tl (
+    \tl_if_eq:NnF \g__nicematrix_left_delim_tl (
       { \dim_gadd:Nn \l__nicematrix_x_initial_dim  { 0.5 \l__nicematrix_inter_dots_dim } }
-    \tl_if_eq:NnF \l__nicematrix_right_delim_tl )
+    \tl_if_eq:NnF \g__nicematrix_right_delim_tl )
       { \dim_gsub:Nn \l__nicematrix_x_final_dim { 0.5 \l__nicematrix_inter_dots_dim } }
     \tl_set_eq:NN \l__nicematrix_xdots_line_style_tl \c__nicematrix_standard_tl
     \__nicematrix_draw_line:
@@ -4763,8 +4842,13 @@
   }
 \NewExpandableDocumentCommand \__nicematrix_Block: { O { } m D < > { } m }
   {
-    \tl_if_blank:nTF { #2 } { \__nicematrix_Block_i 1-1 \q_stop } { \__nicematrix_Block_i #2 \q_stop }
-    { #1 } { #3 } { #4 }
+    \peek_remove_spaces:n
+      {
+        \tl_if_blank:nTF { #2 }
+          { \__nicematrix_Block_i 1-1 \q_stop }
+          { \__nicematrix_Block_i #2 \q_stop }
+        { #1 } { #3 } { #4 }
+      }
   }
 \cs_new:Npn \__nicematrix_Block_i #1-#2 \q_stop { \__nicematrix_Block_ii:nnnnn { #1 } { #2 } }
 \cs_new_protected:Npn \__nicematrix_Block_ii:nnnnn #1 #2 #3 #4 #5
@@ -4962,6 +5046,8 @@
     color .value_required:n = true ,
     borders .clist_set:N = \l__nicematrix_borders_clist ,
     borders .value_required:n = true ,
+    hvlines .bool_set:N = \l__nicematrix_hvlines_block_bool ,
+    hvlines .default:n = true ,
     line-width .dim_set:N = \l__nicematrix_line_width_dim ,
     line-width .value_required:n = true ,
     l .code:n = \tl_set:Nn \l__nicematrix_hpos_of_block_tl l ,
@@ -5028,6 +5114,16 @@
         \seq_gput_right:Nn \g__nicematrix_pos_of_stroken_blocks_seq
            { { #1 } { #2 } { #3 } { #4 } }
       }
+    \bool_if:NT \l__nicematrix_hvlines_block_bool
+      {
+        \tl_gput_right:Nx \g_nicematrix_code_after_tl
+          {
+            \__nicematrix_hvlines_block:nnn
+              { \exp_not:n { #5 } }
+              { #1 - #2 }
+              { \int_use:N \l__nicematrix_last_row_int - \int_use:N \l__nicematrix_last_col_int }
+          }
+      }
     \clist_if_empty:NF \l__nicematrix_borders_clist
       {
         \tl_gput_right:Nx \g_nicematrix_code_after_tl
@@ -5040,10 +5136,12 @@
       }
     \tl_if_empty:NF \l__nicematrix_fill_tl
       {
+        \exp_last_unbraced:NV \__nicematrix_extract_brackets \l__nicematrix_fill_tl \q_stop
         \tl_gput_right:Nx \g_nicematrix_code_before_tl
           {
             \exp_not:N \roundedrectanglecolor
-              { \exp_not:V \l__nicematrix_fill_tl }
+              [ \l_tmpa_tl ]
+              { \exp_not:V \l_tmpb_tl }
               { #1 - #2 }
               { \int_use:N \l__nicematrix_last_row_int - \int_use:N \l__nicematrix_last_col_int }
               { \dim_use:N \l__nicematrix_rounded_corners_dim }
@@ -5204,6 +5302,13 @@
     \endpgfpicture
     \group_end:
   }
+\NewDocumentCommand \__nicematrix_extract_brackets { O { } }
+  {
+    \tl_set:Nn \l_tmpa_tl { #1 }
+    \__nicematrix_store_in_tmpb_tl
+  }
+\cs_new_protected:Npn \__nicematrix_store_in_tmpb_tl #1 \q_stop
+  { \tl_set:Nn \l_tmpb_tl { #1 } }
 \cs_new_protected:Npn \__nicematrix_stroke_block:nnn #1 #2 #3
   {
     \group_begin:
@@ -5261,6 +5366,46 @@
     rounded-corners .dim_set:N = \l__nicematrix_rounded_corners_dim ,
     rounded-corners .default:n = 4 pt
   }
+
+\cs_new_protected:Npn \__nicematrix_hvlines_block:nnn #1 #2 #3
+  {
+    \dim_set_eq:NN \l__nicematrix_line_width_dim \arrayrulewidth
+    \keys_set_known:nn { NiceMatrix / BlockBorders } { #1 }
+    \__nicematrix_cut_on_hyphen:w #2 \q_stop
+    \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl
+    \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl
+    \__nicematrix_cut_on_hyphen:w #3 \q_stop
+    \tl_set:Nx \l_tmpa_tl { \int_eval:n { \l_tmpa_tl + 1 } }
+    \tl_set:Nx \l_tmpb_tl { \int_eval:n { \l_tmpb_tl + 1 } }
+    \pgfpicture
+    \pgfrememberpicturepositiononpagetrue
+    \pgf at relevantforpicturesizefalse
+    \CT at arc@
+    \pgfsetlinewidth { 1.1 \l__nicematrix_line_width_dim }
+    \__nicematrix_qpoint:n { row - \l_tmpa_tl }
+    \dim_set_eq:NN \l_tmpa_dim \pgf at y
+    \__nicematrix_qpoint:n { row - \l_tmpc_tl }
+    \dim_set_eq:NN \l_tmpb_dim \pgf at y
+    \int_step_inline:nnn \l_tmpd_tl \l_tmpb_tl
+      {
+        \__nicematrix_qpoint:n { col - ##1 }
+        \pgfpathmoveto { \pgfpoint \pgf at x \l_tmpa_dim }
+        \pgfpathlineto { \pgfpoint \pgf at x \l_tmpb_dim }
+        \pgfusepathqstroke
+      }
+    \__nicematrix_qpoint:n { col - \l_tmpb_tl }
+    \dim_set:Nn \l_tmpa_dim { \pgf at x + 0.5 \arrayrulewidth }
+    \__nicematrix_qpoint:n { col - \l_tmpd_tl }
+    \dim_set:Nn \l_tmpb_dim { \pgf at x - 0.5 \arrayrulewidth }
+    \int_step_inline:nnn \l_tmpc_tl \l_tmpa_tl
+      {
+        \__nicematrix_qpoint:n { row - ##1 }
+        \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
+        \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
+        \pgfusepathqstroke
+      }
+    \endpgfpicture
+  }
 \cs_new_protected:Npn \__nicematrix_stroke_borders_block:nnn #1 #2 #3
   {
     \dim_set_eq:NN \l__nicematrix_line_width_dim \arrayrulewidth
@@ -5391,10 +5536,9 @@
 \__nicematrix_define_com:nnn B \{ \}
 \NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } }
   {
-    \group_begin:
-      \bool_set_true:N \l__nicematrix_NiceArray_bool
-      \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ]
-    \group_end:
+    \bool_gset_true:N \g__nicematrix_NiceArray_bool
+    \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ]
+    \bool_gset_false: \g__nicematrix_NiceArray_bool
   }
 \cs_set_eq:NN \__nicematrix_old_dotfill \dotfill
 \cs_new_protected:Npn \__nicematrix_dotfill:
@@ -5644,7 +5788,7 @@
         \dim_set_eq:NN \l__nicematrix_x_initial_dim \c_max_dim
         \dim_set:Nn \l__nicematrix_x_final_dim { - \c_max_dim }
         \bool_if:NTF \l__nicematrix_submatrix_slim_bool
-          { \int_step_inline:nnn \l__nicematrix_first_i_tl  \l__nicematrix_last_i_tl }
+          { \int_step_inline:nnn \l__nicematrix_first_i_tl \l__nicematrix_last_i_tl }
           { \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int }
           {
             \cs_if_exist:cT
@@ -5662,141 +5806,151 @@
                   { \dim_max:nn \l__nicematrix_x_final_dim \pgf at x }
               }
           }
-        \__nicematrix_qpoint:n { row - \l__nicematrix_first_i_tl - base }
-        \dim_set:Nn \l__nicematrix_y_initial_dim
-          { \pgf at y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch }
-        \__nicematrix_qpoint:n { row - \l__nicematrix_last_i_tl - base }
-        \dim_set:Nn \l__nicematrix_y_final_dim
-          { \pgf at y - ( \box_dp:N \strutbox ) * \arraystretch }
-        \int_step_inline:nnn \l__nicematrix_first_col_int \g__nicematrix_col_total_int
+        \dim_compare:nNnTF \l__nicematrix_x_initial_dim = \c_max_dim
+          { \__nicematrix_error:nn { impossible~delimiter } { left } }
           {
-            \cs_if_exist:cT
-              { pgf @ sh @ ns @ \__nicematrix_env: - \l__nicematrix_first_i_tl - ##1 }
-              {
-                \pgfpointanchor { \__nicematrix_env: - \l__nicematrix_first_i_tl - ##1 } { north }
-                \dim_set:Nn \l__nicematrix_y_initial_dim
-                  { \dim_max:nn \l__nicematrix_y_initial_dim \pgf at y }
-              }
-            \cs_if_exist:cT
-              { pgf @ sh @ ns @ \__nicematrix_env: - \l__nicematrix_last_i_tl - ##1 }
-              {
-                \pgfpointanchor { \__nicematrix_env: - \l__nicematrix_last_i_tl - ##1 } { south }
-                \dim_set:Nn \l__nicematrix_y_final_dim
-                  { \dim_min:nn \l__nicematrix_y_final_dim \pgf at y }
-              }
+            \dim_compare:nNnTF \l__nicematrix_x_final_dim = { - \c_max_dim }
+              { \__nicematrix_error:nn { impossible~delimiter } { right } }
+              { \__nicematrix_sub_matrix_i:nn { #1 } { #4 } }
           }
-        \dim_set:Nn \l_tmpa_dim
+        \endpgfpicture
+      }
+    \group_end:
+  }
+\cs_new_protected:Npn \__nicematrix_sub_matrix_i:nn #1 #2
+  {
+    \__nicematrix_qpoint:n { row - \l__nicematrix_first_i_tl - base }
+    \dim_set:Nn \l__nicematrix_y_initial_dim
+      { \pgf at y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch }
+    \__nicematrix_qpoint:n { row - \l__nicematrix_last_i_tl - base }
+    \dim_set:Nn \l__nicematrix_y_final_dim
+      { \pgf at y - ( \box_dp:N \strutbox ) * \arraystretch }
+    \int_step_inline:nnn \l__nicematrix_first_col_int \g__nicematrix_col_total_int
+      {
+        \cs_if_exist:cT
+          { pgf @ sh @ ns @ \__nicematrix_env: - \l__nicematrix_first_i_tl - ##1 }
           {
-            \l__nicematrix_y_initial_dim - \l__nicematrix_y_final_dim +
-            \l__nicematrix_submatrix_extra_height_dim - \arrayrulewidth
+            \pgfpointanchor { \__nicematrix_env: - \l__nicematrix_first_i_tl - ##1 } { north }
+            \dim_set:Nn \l__nicematrix_y_initial_dim
+              { \dim_max:nn \l__nicematrix_y_initial_dim \pgf at y }
           }
-        \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
-        \group_begin:
-        \pgfsetlinewidth { 1.1 \arrayrulewidth }
-        \tl_if_empty:NF \l__nicematrix_rules_color_tl
-          { \exp_after:wN \__nicematrix_set_CT at arc@: \l__nicematrix_rules_color_tl \q_stop }
-        \CT at arc@
-        \seq_map_inline:Nn \g__nicematrix_cols_vlism_seq
+        \cs_if_exist:cT
+          { pgf @ sh @ ns @ \__nicematrix_env: - \l__nicematrix_last_i_tl - ##1 }
           {
-            \int_compare:nNnT \l__nicematrix_first_j_tl < { ##1 }
-              {
-                \int_compare:nNnT
-                  { ##1 } < { \int_eval:n { \l__nicematrix_last_j_tl + 1 } }
-                  {
-                    \__nicematrix_qpoint:n { col - ##1 }
-                    \pgfpathmoveto { \pgfpoint \pgf at x \l__nicematrix_y_initial_dim }
-                    \pgfpathlineto { \pgfpoint \pgf at x \l__nicematrix_y_final_dim }
-                    \pgfusepathqstroke
-                  }
-              }
+            \pgfpointanchor { \__nicematrix_env: - \l__nicematrix_last_i_tl - ##1 } { south }
+            \dim_set:Nn \l__nicematrix_y_final_dim
+              { \dim_min:nn \l__nicematrix_y_final_dim \pgf at y }
           }
-        \tl_if_eq:NnTF \l__nicematrix_submatrix_vlines_clist { all }
-          { \int_step_inline:nn { \l__nicematrix_last_j_tl - \l__nicematrix_first_j_tl } }
-          { \clist_map_inline:Nn \l__nicematrix_submatrix_vlines_clist }
+      }
+    \dim_set:Nn \l_tmpa_dim
+      {
+        \l__nicematrix_y_initial_dim - \l__nicematrix_y_final_dim +
+        \l__nicematrix_submatrix_extra_height_dim - \arrayrulewidth
+      }
+    \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+    \group_begin:
+    \pgfsetlinewidth { 1.1 \arrayrulewidth }
+    \tl_if_empty:NF \l__nicematrix_rules_color_tl
+      { \exp_after:wN \__nicematrix_set_CT at arc@: \l__nicematrix_rules_color_tl \q_stop }
+    \CT at arc@
+    \seq_map_inline:Nn \g__nicematrix_cols_vlism_seq
+      {
+        \int_compare:nNnT \l__nicematrix_first_j_tl < { ##1 }
           {
-            \bool_lazy_and:nnTF
-              { \int_compare_p:nNn { ##1 } > 0 }
+            \int_compare:nNnT
+              { ##1 } < { \int_eval:n { \l__nicematrix_last_j_tl + 1 } }
               {
-                 \int_compare_p:nNn
-                   { ##1 } < { \l__nicematrix_last_j_tl - \l__nicematrix_first_j_tl + 1 } }
-              {
-                \__nicematrix_qpoint:n { col - \int_eval:n { ##1 + \l__nicematrix_first_j_tl } }
+                \__nicematrix_qpoint:n { col - ##1 }
                 \pgfpathmoveto { \pgfpoint \pgf at x \l__nicematrix_y_initial_dim }
                 \pgfpathlineto { \pgfpoint \pgf at x \l__nicematrix_y_final_dim }
                 \pgfusepathqstroke
               }
-              { \__nicematrix_error:nnn { Wrong~line~in~SubMatrix } { vertical } { ##1 } }
           }
-        \tl_if_eq:NnTF \l__nicematrix_submatrix_hlines_clist { all }
-          { \int_step_inline:nn { \l__nicematrix_last_i_tl - \l__nicematrix_first_i_tl } }
-          { \clist_map_inline:Nn \l__nicematrix_submatrix_hlines_clist }
+      }
+    \tl_if_eq:NnTF \l__nicematrix_submatrix_vlines_clist { all }
+      { \int_step_inline:nn { \l__nicematrix_last_j_tl - \l__nicematrix_first_j_tl } }
+      { \clist_map_inline:Nn \l__nicematrix_submatrix_vlines_clist }
+      {
+        \bool_lazy_and:nnTF
+          { \int_compare_p:nNn { ##1 } > 0 }
           {
-            \bool_lazy_and:nnTF
-              { \int_compare_p:nNn { ##1 } > 0 }
-              {
-                \int_compare_p:nNn
-                  { ##1 } < { \l__nicematrix_last_i_tl - \l__nicematrix_first_i_tl + 1 } }
-              {
-                \__nicematrix_qpoint:n { row - \int_eval:n { ##1 + \l__nicematrix_first_i_tl } }
-                \group_begin:
-                \dim_set:Nn \l_tmpa_dim
-                  { \l__nicematrix_x_initial_dim - \l__nicematrix_submatrix_left_xshift_dim }
-                \str_case:nn { #1 }
-                  {
-                    (  { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
-                    [  { \dim_sub:Nn \l_tmpa_dim { 0.2 mm } }
-                    \{ { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
-                  }
-                \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
-                \dim_set:Nn \l_tmpb_dim
-                  { \l__nicematrix_x_final_dim + \l__nicematrix_submatrix_right_xshift_dim }
-                \str_case:nn { #4 }
-                  {
-                    )  { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
-                    ]  { \dim_add:Nn \l_tmpb_dim { 0.2 mm } }
-                    \} { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
-                  }
-                \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
-                \pgfusepathqstroke
-                \group_end:
-              }
-              { \__nicematrix_error:nnn { Wrong~line~in~SubMatrix } { horizontal } { ##1 } }
-          }
-        \str_if_empty:NF \l__nicematrix_submatrix_name_str
+             \int_compare_p:nNn
+               { ##1 } < { \l__nicematrix_last_j_tl - \l__nicematrix_first_j_tl + 1 } }
           {
-            \__nicematrix_pgf_rect_node:nnnnn \l__nicematrix_submatrix_name_str
-              \l__nicematrix_x_initial_dim \l__nicematrix_y_initial_dim
-              \l__nicematrix_x_final_dim \l__nicematrix_y_final_dim
+            \__nicematrix_qpoint:n { col - \int_eval:n { ##1 + \l__nicematrix_first_j_tl } }
+            \pgfpathmoveto { \pgfpoint \pgf at x \l__nicematrix_y_initial_dim }
+            \pgfpathlineto { \pgfpoint \pgf at x \l__nicematrix_y_final_dim }
+            \pgfusepathqstroke
           }
-        \group_end:
-        \begin { pgfscope }
-        \pgftransformshift
+          { \__nicematrix_error:nnn { Wrong~line~in~SubMatrix } { vertical } { ##1 } }
+      }
+    \tl_if_eq:NnTF \l__nicematrix_submatrix_hlines_clist { all }
+      { \int_step_inline:nn { \l__nicematrix_last_i_tl - \l__nicematrix_first_i_tl } }
+      { \clist_map_inline:Nn \l__nicematrix_submatrix_hlines_clist }
+      {
+        \bool_lazy_and:nnTF
+          { \int_compare_p:nNn { ##1 } > 0 }
           {
-            \pgfpoint
+            \int_compare_p:nNn
+              { ##1 } < { \l__nicematrix_last_i_tl - \l__nicematrix_first_i_tl + 1 } }
+          {
+            \__nicematrix_qpoint:n { row - \int_eval:n { ##1 + \l__nicematrix_first_i_tl } }
+            \group_begin:
+            \dim_set:Nn \l_tmpa_dim
               { \l__nicematrix_x_initial_dim - \l__nicematrix_submatrix_left_xshift_dim }
-              { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim ) / 2 }
-          }
-        \str_if_empty:NTF \l__nicematrix_submatrix_name_str
-          { \__nicematrix_node_left:nn #1 { } }
-          { \__nicematrix_node_left:nn #1 { \__nicematrix_env: - \l__nicematrix_submatrix_name_str - left } }
-        \end { pgfscope }
-        \pgftransformshift
-          {
-            \pgfpoint
+            \str_case:nn { #1 }
+              {
+                (  { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
+                [  { \dim_sub:Nn \l_tmpa_dim { 0.2 mm } }
+                \{ { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
+              }
+            \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
+            \dim_set:Nn \l_tmpb_dim
               { \l__nicematrix_x_final_dim + \l__nicematrix_submatrix_right_xshift_dim }
-              { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim ) / 2 }
+            \str_case:nn { #2 }
+              {
+                )  { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
+                ]  { \dim_add:Nn \l_tmpb_dim { 0.2 mm } }
+                \} { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
+              }
+            \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
+            \pgfusepathqstroke
+            \group_end:
           }
-        \str_if_empty:NTF \l__nicematrix_submatrix_name_str
-          { \__nicematrix_node_right:nn #4 { } }
-          {
-            \__nicematrix_node_right:nn #4 { \__nicematrix_env: - \l__nicematrix_submatrix_name_str - right }
-          }
-        \endpgfpicture
-        \cs_set_eq:NN \pgfpointanchor \__nicematrix_pgfpointanchor:n
-        \flag_clear_new:n { nicematrix }
-        \l__nicematrix_code_tl
+          { \__nicematrix_error:nnn { Wrong~line~in~SubMatrix } { horizontal } { ##1 } }
       }
+    \str_if_empty:NF \l__nicematrix_submatrix_name_str
+      {
+        \__nicematrix_pgf_rect_node:nnnnn \l__nicematrix_submatrix_name_str
+          \l__nicematrix_x_initial_dim \l__nicematrix_y_initial_dim
+          \l__nicematrix_x_final_dim \l__nicematrix_y_final_dim
+      }
     \group_end:
+    \begin { pgfscope }
+    \pgftransformshift
+      {
+        \pgfpoint
+          { \l__nicematrix_x_initial_dim - \l__nicematrix_submatrix_left_xshift_dim }
+          { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim ) / 2 }
+      }
+    \str_if_empty:NTF \l__nicematrix_submatrix_name_str
+      { \__nicematrix_node_left:nn #1 { } }
+      { \__nicematrix_node_left:nn #1 { \__nicematrix_env: - \l__nicematrix_submatrix_name_str - left } }
+    \end { pgfscope }
+    \pgftransformshift
+      {
+        \pgfpoint
+          { \l__nicematrix_x_final_dim + \l__nicematrix_submatrix_right_xshift_dim }
+          { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim ) / 2 }
+      }
+    \str_if_empty:NTF \l__nicematrix_submatrix_name_str
+      { \__nicematrix_node_right:nn #2 { } }
+      {
+        \__nicematrix_node_right:nn #2 { \__nicematrix_env: - \l__nicematrix_submatrix_name_str - right }
+      }
+    \cs_set_eq:NN \pgfpointanchor \__nicematrix_pgfpointanchor:n
+    \flag_clear_new:n { nicematrix }
+    \l__nicematrix_code_tl
   }
 \cs_set_eq:NN \__nicematrix_old_pgfpointanchor \pgfpointanchor
 \cs_new_protected:Npn \__nicematrix_pgfpointanchor:n #1
@@ -5969,6 +6123,18 @@
       }
     \bool_set_true:N \c__nicematrix_footnote_bool
   }
+\__nicematrix_msg_new:nn { key except-corners }
+  {
+    The~key~'except-corners'~has~been~deleted~for~the~command~\token_to_str:N
+    \arraycolor\ in~the~\token_to_str:N \CodeBefore.~You~should~instead~use~
+    the~key~'corners'~in~your~\__nicematrix_full_name_env:.\\
+    If~you~go~on,~this~key~will~be~ignored.
+  }
+\__nicematrix_msg_new:nn { delimiters-color deleted }
+  {
+    The~key~'delimiters-color'~has~been~renamed~'delimiters/color'.\\
+    ~However,~you~can~go~on~for~this~time.
+  }
 \seq_new:N \c__nicematrix_types_of_matrix_seq
 \seq_set_from_clist:Nn \c__nicematrix_types_of_matrix_seq
   {
@@ -6049,6 +6215,16 @@
     You~can't~use~the~command~#1 in~the~last~row~(exterior)~of~the~array.\\
     If~you~go~on,~this~command~will~be~ignored.
   }
+\__nicematrix_msg_new:nn { double~closing~delimiter }
+  {
+    You~can't~put~a~second~closing~delimiter~"#1"~just~after~a~first~closing~
+    delimiter.~This~delimiter~will~be~ignored.
+  }
+\__nicematrix_msg_new:nn { delimiter~after~opening }
+  {
+    You~can't~put~a~second~delimiter~"#1"~just~after~a~first~opening~
+    delimiter.~This~delimiter~will~be~ignored.
+  }
 \__nicematrix_msg_new:nn { bad~option~for~line-style }
   {
     Since~you~haven't~loaded~Tikz,~the~only~value~you~can~give~to~'line-style'~
@@ -6115,6 +6291,15 @@
     \token_to_str:N \SubMatrix\ of~your~\__nicematrix_full_name_env:\ but~that~
     number~is~not~valid.~If~you~go~on,~it~will~be~ignored.
   }
+\__nicematrix_msg_new:nn { impossible~delimiter }
+  {
+    It's~impossible~to~draw~the~#1~delimiter~of~your~
+    \token_to_str:N \SubMatrix\ because~all~the~cells~are~empty~
+    in~that~column.
+    \bool_if:NT \l__nicematrix_submatrix_slim_bool
+      { ~Maybe~you~should~try~without~the~key~'slim'. } \\
+    If~you~go~on,~this~\token_to_str:N \SubMatrix\ will~be~ignored.
+  }
 \__nicematrix_msg_new:nn { empty~environment }
   { Your~\__nicematrix_full_name_env:\ is~empty.~This~error~is~fatal. }
 \__nicematrix_msg_new:nn { Delimiter~with~small }
@@ -6255,8 +6440,8 @@
     For~a~list~of~the~available~keys,~type~H~<return>.
   }
   {
-    The~available~keys~are~(in~alphabetic~order):~borders,~c,~draw,~fill,~l,~
-    line-width,~rounded-corners~and~r.
+    The~available~keys~are~(in~alphabetic~order):~b,~borders,~c,~draw,~fill,~
+    hvlines,~l,~line-width,~rounded-corners,~r~and~t.
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~CodeAfter }
   {



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