From adcdf254252f764d8969df03d013bf5da6333873 Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Sun, 10 May 2020 03:02:26 +0000
Subject: CTAN sync 202005100302

---
 macros/latex/contrib/nicematrix/nicematrix.dtx | 3090 ++++++++++++++++--------
 1 file changed, 2137 insertions(+), 953 deletions(-)

(limited to 'macros/latex/contrib/nicematrix/nicematrix.dtx')

diff --git a/macros/latex/contrib/nicematrix/nicematrix.dtx b/macros/latex/contrib/nicematrix/nicematrix.dtx
index 2bd6e5ed43..a78a94ee50 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.dtx
+++ b/macros/latex/contrib/nicematrix/nicematrix.dtx
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{3.15}
-\def\myfiledate{2020/04/06}
+\def\myfileversion{4.0}
+\def\myfiledate{2020/05/08}
 %
 %
 %<*batchfile>
@@ -51,7 +51,6 @@ version 2005/12/01 or later.
 \usepackage[xetex]{geometry}
 \geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
 
-\usepackage{colortbl}
 \usepackage{tikz}
 \usetikzlibrary{fit}
 \usepackage{nicematrix}
@@ -66,13 +65,41 @@ version 2005/12/01 or later.
 \titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
 \titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
 \usepackage{multicol}
-\usepackage{arydshln}
 \setlength{\columnseprule}{0.4pt}
 \usepackage{footnotehyper}
 \usepackage{varwidth}
 \parindent 0pt
 
 \EnableCrossrefs
+\makeatletter
+\ExplSyntaxOn
+\DoNotIndex{\begin,\end}
+\DoNotIndex{\c@iRow,\c@jCol,\theiRow,\thejCol}
+\DoNotIndex{\pgfpicture,\endpgfpicture,\tikzpicture,\endtikzpicture}
+\DoNotIndex{\pgfpoint,\pgfnode,\pgfnodealias,\pgfcoordinate}
+\DoNotIndex{\pgf@x,\pgf@y}
+\DoNotIndex{\int_add:Nn,\int_case:nnTF,\int_compare:nNnTF,\int_compare:nTF,
+  \int_compare_p:nNn,\int_decr:N,\int_eval:n,\int_add:Nn,\int_gdecr:N,\int_gincr:N
+  \int_gset:Nn,\int_gset_eq:NN,\int_gzero:N,\int_gzero_new:N,\int_if_odd:nTF,
+  \int_max:nn,\int_new:N,\int_set:Nn,\int_set_eq:NN,\int_step_inline:nnn,
+  \int_step_variable:nNn,\int_step_variable:nnNn,\int_sub:Nn,\int_use:N,\int_zero:N,
+  \int_zero_new:N,\g_tmpa_int,\l_tmpa_int,\l_tmpb_int
+}
+\DoNotIndex{\dim_abs:n,\dim_add:Nn,\dim_compare:nNnTF,\dim_compare_p:nNn,
+\dim_const:Nn,\dim_eval:n,\dim_gadd:Nn,\dim_gset:Nn,\dim_gset_eq:NN,
+\dim_gset:Nn,\dim_gset_eq:NN,\dim_gsub:Nn,\dim_gzero_new:N,\dim_max:nn,
+\dim_min:nn,\dim_new:N,\dim_ration:nn,\dim_set:Nn,\dim_set_eq:NN,\dim_sub:Nn,
+\dim_use:N,\dim_zero:N,\dim_zero_new:N,\g_tmpa_dim,\l_tmpa_dim,\l_tmpb_dim,
+\c_zero_dim}
+\DoNotIndex{\cs_new_protected:Npn,\cs_new:Npn,\cs_set_eq:NN,
+\cs_set_protected:Npn}
+\DoNotIndex{\bool_if:NTF,\bool_new:N,\bool_set_false:N,\bool_set_true:N,\l_tmpa_bool}
+\DoNotIndex{\group_begin:,\group_end:,\c_math_toggle_token}
+\DoNotIndex{\tl_set:Nn,\l_tmpa_tl}
+\ExplSyntaxOff
+\makeatother
+
+
 \begin{document}
 \DocInput{nicematrix.dtx}
 \end{document}
@@ -96,9 +123,10 @@ version 2005/12/01 or later.
 %
 % \begin{abstract}
 % The LaTeX package \pkg{nicematrix} provides new environments similar to the
-% classical environments |{array}| and |{matrix}| but with some additional
-% features. Among these features are the possibilities to fix the width of the
-% columns and to draw continuous ellipsis dots between the cells of the array.
+% classical environments |{tabular}|, |{array}| and |{matrix}| but with some
+% additional features. Among these features are the possibilities to fix the
+% width of the columns and to draw continuous ellipsis dots between the cells of
+% the array.
 % \end{abstract}
 %
 % \vspace{1cm}
@@ -120,8 +148,7 @@ version 2005/12/01 or later.
 % This package provides some new tools to draw mathematical matrices. The main
 % features are the following:
 % \begin{itemize}\setlength{\itemsep}{0pt}
-% \item continuous dotted lines\footnote{If the class option |draft| is
-% used, these dotted lines will not be drawn for a faster compilation.};
+% \item continuous dotted lines;
 % \item exterior rows and columns for labels;
 % \item a control of the width of the columns.
 % \end{itemize}
@@ -197,12 +224,13 @@ version 2005/12/01 or later.
 % \begin{ttfamily}
 % \setlength{\tabcolsep}{3mm}
 % \begin{tabular}{llll}
-% \{NiceMatrix\}  & \{NiceArray\} & \{pNiceArray\}          \\
-% \{pNiceMatrix\} &               & \{bNiceArray\}          \\
-% \{bNiceMatrix\} &               & \{BNiceArray\}          \\
-% \{BNiceMatrix\} &               & \{vNiceArray\}          \\
-% \{vNiceMatrix\} &               & \{VNiceArray\}          \\
-% \{VNiceMatrix\} &               & \{NiceArrayWithDelims\} \\
+% \{NiceMatrix\}  & \{NiceArray\}  & \{NiceTabular\} \\
+% \{pNiceMatrix\} & \{pNiceArray\} \\
+% \{bNiceMatrix\} & \{bNiceArray\} \\
+% \{BNiceMatrix\} & \{BNiceArray\} \\
+% \{vNiceMatrix\} & \{vNiceArray\} \\
+% \{VNiceMatrix\} & \{VNiceArray\} \\
+%                 & \{NiceArrayWithDelims\}
 % \end{tabular}
 % \end{ttfamily}
 %
@@ -215,16 +243,15 @@ version 2005/12/01 or later.
 % 
 %
 % \medskip
-% The environment |{NiceArray}| is similar to the environment |{array}| of the
-% package |{array}|. However, for technical reasons, in the preamble of the
-% environment |{NiceArray}|, the user must use the letters |L|, |C| and~|R|
+% The environments |{NiceArray}| and |{NiceTabular}| are similar to the
+% environments |{array}| and |{tabular}| of the
+% package |{array}|. However, for technical reasons, in the preamble of these
+% environments, the user must use the letters |L|, |C| and~|R|
 % instead of |l|, |c| and |r|. It's possible to use the constructions
-% |w{...}{...}|, |W{...}{...}|\footnote{However, for the columns of type |w| and
-% |W|, the cells are composed in math mode (in the environments of
-% \pkg{nicematrix}) whereas in |{array}| of \pkg{array}, they are composed in
-% text mode.}, "|", |>{...}|, |<{...}|, |@{...}|, |!{...}| and |*{n}{...}| but
-% the letters |p|, |m| and |b| should not be used. See p.~\pageref{NiceArray}
-% the section relating to |{NiceArray}|.
+% |w{...}{...}|, |W{...}{...}|, "|", |>{...}|, |<{...}|, |@{...}|, |!{...}| and
+% |*{n}{...}| but the letters |p|, |m| and |b| should not be used. 
+%
+% See p.~\pageref{NiceArray} the section relating to |{NiceArray}| and |{NiceTabular}|.
 % 
 % 
 % \section{The continuous dotted lines}
@@ -372,12 +399,12 @@ version 2005/12/01 or later.
 % \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 % $A = \begin{pmatrix}
 % h & i & j & k & l & m \\
-% x &   &   &   &   & x \\
+% x &   &   &   &   & x 
 % \end{pmatrix}$
 % \end{BVerbatim}
 % $A = \begin{pmatrix}
 % h & i & j & k & l & m \\
-% x   &     &     &    &     & x \\
+% x   &     &     &    &     & x 
 % \end{pmatrix}$
 %
 %
@@ -389,12 +416,12 @@ version 2005/12/01 or later.
 % \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 % $B = \begin{pmatrix}
 % h & i & j & k & l & m \\
-% x & \ldots & \ldots  & \ldots & \ldots & x \\
+% x & \ldots & \ldots  & \ldots & \ldots & x 
 % \end{pmatrix}$
 % \end{BVerbatim}
 % $B = \begin{pmatrix}
 % h & i & j & k & l & m \\
-% x   & \ldots   & \ldots  & \ldots & \ldots & x \\
+% x   & \ldots   & \ldots  & \ldots & \ldots & x 
 % \end{pmatrix}$
 %
 % \bigskip
@@ -406,12 +433,12 @@ version 2005/12/01 or later.
 % \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 % $C = \begin{pNiceMatrix}
 % h & i & j & k & l & m \\
-% x & \Ldots & \Ldots & \Ldots & \Ldots & x \\
+% x & \Ldots & \Ldots & \Ldots & \Ldots & x 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
 % $C = \begin{pNiceMatrix}
 % h & i & j & k & l & m \\
-% x & \Ldots & \Ldots  & \Ldots & \Ldots & x \\
+% x & \Ldots & \Ldots  & \Ldots & \Ldots & x 
 % \end{pNiceMatrix}$
 %
 % \bigskip
@@ -424,12 +451,12 @@ version 2005/12/01 or later.
 % \begin{BVerbatim}[baseline=c,boxwidth=10cm]
 % $D = \begin{pNiceMatrix}[~emphase#nullify-dots@]
 % h & i & j & k & l & m \\
-% x & \Ldots & & & & x \\
+% x & \Ldots & & & & x 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
 % $D = \begin{pNiceMatrix}[nullify-dots]
 % h & i & j & k & l & m \\
-% x & \Ldots & &  &  & x \\
+% x & \Ldots & &  &  & x 
 % \end{pNiceMatrix}$
 %
 % \medskip
@@ -558,13 +585,13 @@ version 2005/12/01 or later.
 % $\begin{bNiceMatrix}
 % 1 & \hspace*{1cm}            & 0 \\[8mm]
 %   & ~emphase#\Ddots^{n \text{ times}}@ &   \\
-% 0 &                          & 1 \\
+% 0 &                          & 1 
 % \end{bNiceMatrix}$
 % \end{BVerbatim}
 % $\begin{bNiceMatrix}
 % 1 & \hspace*{1cm}            & 0 \\[8mm]
 %   & \Ddots^{n \text{ times}} &   \\
-% 0 &                          & 1 \\
+% 0 &                          & 1 
 % \end{bNiceMatrix}$
 %
 % \subsection{Customization of the dotted lines}
@@ -918,46 +945,27 @@ version 2005/12/01 or later.
 % \medskip
 % For the readability of the code, an alternative syntax is provided: it's
 % possible to give the instructions of the |\code-after| at the end of the
-% environment, after the keyword |\CodeAfter|.
+% environment, after the keyword |\CodeAfter|. For an example, cf.
+% p.~\pageref{example-CodeAfter}. 
 %
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \NiceMatrixOptions{xdots/shorten = 0.6 em}
-% \begin{pNiceMatrix}
-% I       & 0      & \Cdots  &0     \\
-% 0       & I      & \Ddots  &\Vdots\\
-% \Vdots  &\Ddots  & I       &0     \\
-% 0       &\Cdots  & 0       &I
-% ~emphase#\CodeAfter@
-% ~emphase#\line{2-2}{3-3}@
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{xdots/shorten = 0.6 em}
-% $\begin{pNiceMatrix}
-% I       & 0      & \Cdots  &0     \\
-% 0       & I      & \Ddots  &\Vdots\\
-% \Vdots  &\Ddots  & I       &0     \\
-% 0       &\Cdots  & 0       &I
-% \CodeAfter
-% \line{2-2}{3-3}
-% \end{pNiceMatrix}$
-% \end{scope}
 % 
-% \section{The environment \{NiceArray\} and its variants}
+% \section{The environments \{NiceArray\} and \{NiceTabular\}}
 % \label{NiceArray}
 %
-% The environment |{NiceArray}| is similar to the environment |{array}|. As for
-% |{array}|, the mandatory argument is the preamble of the array. However, for
-% technical reasons, in this preamble, the user must use the letters |L|, |C|
-% and~|R|\footnote{The column types |L|, |C| and |R| are defined locally inside
-% |{NiceArray}| with |\newcolumntype| of \pkg{array}. This definition overrides
-% an eventual previous definition. In fact, the column types |w| and |W| are
-% also redefined.} instead of |l|, |c| and |r|. It's possible
-% to use the constructions |w{...}{...}|, |W{...}{...}|, "|", |>{...}|,
-% |<{...}|, |@{...}|, |!{...}| and |*{n}{...}| but the letters |p|, |m| and |b|
-% should not be used.\footnote{In a command |\multicolumn|, one should also use
-% the letters |L|, |C|, |R|.} 
+% The environments |{NiceArray}| and |{NiceTabular}| are similar to the
+% environments |{array}| and |{tabular}|. The mandatory argument is the preamble
+% of the array. However, for technical reasons, in this preamble, the user must
+% use the letters |L|, |C| and~|R|\footnote{The column types |L|, |C| and |R|
+% are defined locally inside |{NiceArray}| with |\newcolumntype| of \pkg{array}.
+% This definition overrides an eventual previous definition.} instead of |l|,
+% |c| and |r|. In a command |\multicolumn|, one should also use the letters |L|,
+% |C|, |R|.
+%
+% It's possible to use the constructions |p{...}|, |m{...}|, |b{...}|,
+% |w{...}{...}|, |W{...}{...}|, "|", |>{...}|, |<{...}|, |@{...}|, |!{...}| and
+% |*{n}{...}|. However, in the environment |{NiceArray}| (and its variants), the
+% content of the columns of type |w| or |W| is composed in math mode (in
+% |{array}| of \pkg{array}, they are composed in text mode).
 %
 % \bigskip
 % The package \pkg{nicematrix} provides also the variants |{pNiceArray}|, 
@@ -1016,14 +1024,14 @@ version 2005/12/01 or later.
 %    {\downarrow}{\uparrow}{CCC}[margin]
 % 1 & 2 & 3 \\
 % 4 & 5 & 6 \\
-% 7 & 8 & 9 \\
+% 7 & 8 & 9 
 % \end{~emphase#NiceArrayWithDelims@}$
 % \end{BVerbatim}
 % $\begin{NiceArrayWithDelims}
 %    {\downarrow}{\uparrow}{CCC}[margin]
 % 1 & 2 & 3 \\
 % 4 & 5 & 6 \\
-% 7 & 8 & 9 \\
+% 7 & 8 & 9 
 % \end{NiceArrayWithDelims}$
 %
 %
@@ -1036,7 +1044,7 @@ version 2005/12/01 or later.
 %
 % \medskip
 % \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $A = \begin{pNiceMatrix}[baseline=2]
+% $A = \begin{pNiceMatrix}[~emphase#baseline=2@]
 % \frac{1}{\sqrt{1+p^2}} & p & 1-p \\
 % 1 & 1 & 1 \\
 % 1 & p & 1+p
@@ -1170,7 +1178,7 @@ version 2005/12/01 or later.
 % columns which are needed for the composition of the ``last row'' and ``last
 % column''.
 % \begin{itemize}
-% \item For the environments with explicit preamble, like |{NiceArray}| and
+% \item For the environments with explicit preamble, like |{NiceTabular}| and
 % |{pNiceArray}|, the number of columns can obviously be computed from the
 % preamble.
 %
@@ -1184,10 +1192,10 @@ version 2005/12/01 or later.
 % columns during the first compilation and write the result in the |aux| file
 % for the next run.
 % 
-% \textsl{However, it's possible to provide the number of the last row and the number of
-% the last column as values of the options |last-row| and |last-col|, tending to
-% an acceleration of the whole compilation of the document.} That's what we will
-% do throughout the rest of the document.
+% \textsl{However, it's possible to provide the number of the last row and the
+% number of the last column as values of the options |last-row| and |last-col|,
+% tending to an acceleration of the whole compilation of the document.} That's
+% what we will do throughout the rest of the document.
 % \end{itemize}
 % \end{itemize}
 % 
@@ -1343,37 +1351,8 @@ version 2005/12/01 or later.
 % \bigskip
 % It's possible to change in \pkg{nicematrix} the letter used to specify a
 % vertical dotted line with the option |letter-for-dotted-lines| available in
-% |\NiceMatrixOptions|. For example, in this document, we have loaded the
-% package \pkg{arydshln} which uses the letter ``|:|'' to specify a vertical
-% dashed line. Thus, by using |letter-for-dotted-lines|, we can use the
-% vertical lines of both \pkg{arydshln} and \pkg{nicematrix}.
-% 
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \NiceMatrixOptions{letter-for-dotted-lines = I}
-% \arrayrulecolor{blue}
-% \left(\begin{NiceArray}{~emphase#C|C:CIC@}
-% 1 & 2 & 3 & 4 \\
-% 5 & 6 & 7 & 8 \\
-% 9 & 10 & 11 & 12
-% \end{NiceArray}\right)
-% \arrayrulecolor{black}
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{letter-for-dotted-lines = I}
-% \arrayrulecolor{blue}
-% $\left(\begin{NiceArray}{C|C:CIC}
-% 1 & 2 & 3 & 4 \\
-% 5 & 6 & 7 & 8 \\
-% 9 & 10 & 11 & 12
-% \end{NiceArray}\right)$
-% \arrayrulecolor{black}
-% \end{scope}
+% |\NiceMatrixOptions|. 
 % 
-% \smallskip
-% We have used the command |\arrayrulecolor| (de \pkg{colortbl}) to draw in blue
-% the three rules.
-%
 % \bigskip
 % \emph{Remark} : In the package \pkg{array} (on which the package
 % \pkg{nicematrix} relies), horizontal and vertical rules make the array larger
@@ -1462,23 +1441,23 @@ version 2005/12/01 or later.
 % \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
 % ~emphase#\NiceMatrixOptions{columns-width=10mm}@
 % $\begin{pNiceMatrix}
-% a & b \\ c & d \\
+% a & b \\ c & d 
 % \end{pNiceMatrix}
 % = 
 % \begin{pNiceMatrix}
-% 1   & 1245 \\ 345 & 2 \\
+% 1   & 1245 \\ 345 & 2 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
 % \begin{scope}
 % \NiceMatrixOptions{columns-width=10mm}
 % $\begin{pNiceMatrix}
 % a & b \\
-% c & d \\
+% c & d 
 % \end{pNiceMatrix}
 % = 
 % \begin{pNiceMatrix}
 % 1   & 1245 \\
-% 345 & 2 \\
+% 345 & 2 
 % \end{pNiceMatrix}$
 % \end{scope}
 % 
@@ -1496,21 +1475,21 @@ version 2005/12/01 or later.
 % \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
 % ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
 % $\begin{pNiceMatrix}
-% a & b \\ c & d \\
+% a & b \\ c & d 
 % \end{pNiceMatrix}
 % = 
 % \begin{pNiceMatrix}
-% 1   & 1245 \\ 345 & 2 \\
+% 1   & 1245 \\ 345 & 2 
 % \end{pNiceMatrix}$
 % ~emphase#\end{NiceMatrixBlock}@
 % \end{BVerbatim}
 % \begin{NiceMatrixBlock}[auto-columns-width]
 % $\begin{pNiceMatrix}
-% a & b \\ c & d \\
+% a & b \\ c & d 
 % \end{pNiceMatrix}
 % = 
 % \begin{pNiceMatrix}
-% 1   & 1245 \\  345 & 2 \\
+% 1   & 1245 \\  345 & 2 
 % \end{pNiceMatrix}$
 % \end{NiceMatrixBlock}
 %
@@ -1601,6 +1580,181 @@ version 2005/12/01 or later.
 % For technical reasons, you can't write |\Block{|$i$|-|$j$|}{<}|. But you can
 % write |\Block{|$i$|-|$j$|}<>{<}| with the expected result.
 % 
+%
+% \section{The color of the rows and columns}
+%
+% With the classical package \pkg{colortbl}, it's possible to color the cells,
+% rows and columns of a tabular. However, the resulting \textsc{pdf} is not
+% always perfectly displayed by the \textsc{pdf} viewers, in particular in
+% conjonction with rules. With some \textsc{pdf} viewers, some vertical rules
+% seem to vanish. On the other side, some thin horizontal white lines may appear
+% in some circonstances.
+%
+%
+% \medskip
+% The version 4.0 of \pkg{nicematrix} provide similar tools which do not
+% present these drawbacks. This version provides a key |code-before| for some
+% code which will be executed \emph{before} the drawing of the tabular. In this
+% |code-before|, new commands are available: |\cellcolor|, |\rectanglecolor|,
+% |\rowcolor|, |\columncolor|, |\rowcolors| and |\chessboardcolors|.
+%
+% \medskip
+% \begin{itemize}
+% \item The command |\cellcolor| takes its name from the command |\cellcolor| of
+% \pkg{colortbl}.
+%
+% This command takes in arguments a color and a list of cells, each of which
+% with the format $i$-$j$ where $i$ is the number of row and $j$ the number of
+% colummn of the cell.
+%
+%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
+% \begin{NiceTabular}{|C|C|C|}[code-before = ~emphase#\cellcolor{red!15}{3-1,2-2,1-3}@] 
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|C|C|C|}[code-before = \cellcolor{red!15}{3-1,2-2,1-3}]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{scope}
+% 
+% \bigskip
+% \item The command |\rectanglecolor| takes three arguments. The first is the
+% color. The second is the upper-left cell of the rectangle and the third is
+% the lower-right cell of the rectangle. 
+%
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
+% \begin{NiceTabular}{|C|C|C|}[code-before = ~emphase#\rectanglecolor{red!15}{2-2}{3-3}@]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{|C|C|C|}[code-before = \rectanglecolor{red!15}{2-2}{3-3}]
+% \hline
+% a & b & c \\ \hline
+% e & f & g \\ \hline
+% h & i & j \\ \hline
+% \end{NiceTabular}
+% \end{scope}
+% 
+%
+%
+% \bigskip
+% \item The command |\rowcolor| takes its name from the command |\rowcolor| of
+% \pkg{colortbl}. Its first argument is the color and the second is a
+% comma-separated list of rows or interval of rows with the form $a$-$b$ (an
+% interval of the form $a$- represent all the rows from the row $a$ until the end).
+% 
+% \medskip
+% \begin{scope}
+% \hfuzz = 10cm
+% \begin{BVerbatim}[boxwidth=9cm,baseline=c]
+% $\begin{NiceArray}{LLL}[hvlines, ~emphase#code-before = \rowcolor{red!15}{1,3-5,8-}@]
+% a_1 & b_1 & c_1 \\
+% a_2 & b_2 & c_2 \\
+% a_3 & b_3 & c_3 \\
+% a_4 & b_4 & c_4 \\
+% a_5 & b_5 & c_5 \\
+% a_6 & b_6 & c_6 \\
+% a_7 & b_7 & c_7 \\
+% a_8 & b_8 & c_8 \\
+% a_9 & b_9 & c_9 \\
+% a_{10} & b_{10} & c_{10} \\
+% \end{NiceArray}$
+% \end{BVerbatim}
+% $\begin{NiceArray}{LLL}[baseline=4,hvlines, code-before = \rowcolor{red!15}{1,3-5,8-}]
+% a_1 & b_1 & c_1 \\
+% a_2 & b_2 & c_2 \\
+% a_3 & b_3 & c_3 \\
+% a_4 & b_4 & c_4 \\
+% a_5 & b_5 & c_5 \\
+% a_6 & b_6 & c_6 \\
+% a_7 & b_7 & c_7 \\
+% a_8 & b_8 & c_8 \\
+% a_9 & b_9 & c_9 \\
+% a_{10} & b_{10} & c_{10} \\
+% \end{NiceArray}$
+% \end{scope}
+% 
+%
+% \bigskip
+% \item The command |\columncolor| takes its name from the command
+% |\columncolor| of \pkg{colortbl}. Its syntax is similar to the syntaxe of
+% |\rowcolor|.
+% 
+% \bigskip
+% \item The command |\rowcolors| (with a \emph{s}) takes its name from the
+% command |\rowcolors| of \pkg{xcolor}. The \emph{s} emphasizes the fact that
+% there is \emph{two} colors. This command colors alternately the rows of the
+% tabular, beginning with the row whose number is given in first argument. The
+% two other arguments are the colors.
+% 
+% \medskip
+% \begin{scope}
+% \hfuzz=10cm
+% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
+% \begin{NiceTabular}{LR}%
+% [~emphase#code-before = \rowcolor{red!15}{1} \rowcolors{3}{blue!10}{}@]
+% \toprule
+% Town & Habitants \\
+% \midrule
+% Pau & 80000 \\
+% Paris & 2000000 \\
+% Toulouse & 700000 \\
+% Reims & 40000 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{LR}[code-before =\rowcolor{red!15}{1} \rowcolors{3}{blue!10}{}]
+% \toprule
+% Ville & habitants \\
+% \midrule
+% Pau & 80000 \\
+% Paris & 2000000 \\
+% Toulouse & 700000 \\
+% Reims & 40000 \\
+% \bottomrule
+% \end{NiceTabular}
+% \end{scope}
+% 
+% \bigskip
+% \item The command |\chessboardcolors| take in arguments two colors and 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, ~emphase#code-before=\chessboardcolors{red!15}{blue!15}@]
+% 1 & -1 & 1 \\
+% -1 & 1 & -1 \\
+% 1 & -1 & 1 
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[R,baseline=1, margin, code-before = \chessboardcolors{red!15}{blue!15}]
+% 1 & -1 & 1 \\
+% -1 & 1 & -1 \\
+% 1 & -1 & 1 
+% \end{pNiceMatrix}$
+% \end{scope}
+% 
+% \end{itemize}
+%
+%
 % 
 % \section{Advanced features}
 %
@@ -1645,7 +1799,7 @@ version 2005/12/01 or later.
 % e_1 & e_2 & e_3       \\
 % 1   & 2   & 3   & e_1 \\
 % 4   & 5   & 6   & e_2 \\
-% 7   & 8   & 9   & e_3 \\
+% 7   & 8   & 9   & e_3 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
 % \begin{varwidth}{10cm}
@@ -1656,7 +1810,7 @@ version 2005/12/01 or later.
 % e_1 & e_2 & e_3 \\
 % 1   & 2   & 3  & e_1 \\
 % 4   & 5   & 6  & e_2 \\
-% 7   & 8   & 9  & e_3 \\
+% 7   & 8   & 9  & e_3 
 % \end{pNiceMatrix}$
 % \end{varwidth}
 %
@@ -1673,7 +1827,7 @@ version 2005/12/01 or later.
 % 1   & 2   & 3   & e_1 \\
 % 4   & 5   & 6   & e_2 \\
 % 7   & 8   & 9   & e_3 \\
-% \text{image of } e_1 & e_2 & e_3 \\
+% \text{image of } e_1 & e_2 & e_3 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
 % \begin{varwidth}{10cm}
@@ -1684,7 +1838,7 @@ version 2005/12/01 or later.
 % 1   & 2   & 3  & e_1 \\
 % 4   & 5   & 6  & e_2 \\
 % 7   & 8   & 9  & e_3 \\
-% \text{image of } e_1 & e_2 & e_3 \\
+% \text{image of } e_1 & e_2 & e_3 
 % \end{pNiceMatrix}$
 % \end{varwidth}
 %
@@ -1707,7 +1861,7 @@ version 2005/12/01 or later.
 %                             columns-width = 3mm ] 
 % 1 & -2 & 3 & 4 & 5 \\
 % 0 & 3  & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
-% 0 & 1  & 1 & 2 & 3 & L_3 \gets L_1 + L_3 \\
+% 0 & 1  & 1 & 2 & 3 & L_3 \gets L_1 + L_3 
 % \end{bNiceArray}$
 % \end{Verbatim}
 % %
@@ -1716,7 +1870,7 @@ version 2005/12/01 or later.
 %                      columns-width=3mm]
 % 1 & -2 & 3 & 4 & 5 \\
 % 0 & 3  & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
-% 0 & 1  & 1 & 2 & 3 & L_3 \gets L_1 + L_3 \\
+% 0 & 1  & 1 & 2 & 3 & L_3 \gets L_1 + L_3 
 % \end{bNiceArray}\]
 %
 %
@@ -1781,7 +1935,7 @@ version 2005/12/01 or later.
 % \bigskip
 % The package \pkg{nicematrix} also provides commands in order to compose
 % automatically matrices from a general pattern. These commands are
-% |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
+% |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
 % |\VAutoNiceMatrix| and |\BAutoNiceMatrix|.
 %
 % These commands take two mandatory arguments. The first is the format of the
@@ -1818,7 +1972,7 @@ version 2005/12/01 or later.
 % \arrayrulecolor{blue}
 % $\begin{NiceArray}{CCCC}%
 %  [~emphase#hvlines@,first-row,first-col]
-% %   & e & a & b & c \\
+%   & e & a & b & c \\
 % e & e & a & b & c \\
 % a & a & e & c & b \\
 % b & b & c & e & a \\
@@ -1869,7 +2023,7 @@ version 2005/12/01 or later.
 % $\begin{pNiceMatrix}[vlines]
 % 1 & 2 & 3 & 4 & 5 & 6 \\
 % 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
+% 1 & 2 & 3 & 4 & 5 & 6 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
 % \begin{scope}
@@ -1877,7 +2031,7 @@ version 2005/12/01 or later.
 % $\begin{pNiceMatrix}[vlines]
 % 1 & 2 & 3 & 4 & 5 & 6 \\
 % 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
+% 1 & 2 & 3 & 4 & 5 & 6 
 % \end{pNiceMatrix}$
 % \end{scope}
 %
@@ -2156,10 +2310,6 @@ version 2005/12/01 or later.
 % environments of \pkg{nicematrix} are not affected).
 %
 %
-% \subsection{The class option draft}
-%
-% When the class option |draft| is used, the dotted lines are not drawn, for a
-% faster compilation.
 % 
 % \subsection{A technical problem with the argument of
 % \textbackslash\textbackslash}
@@ -2228,14 +2378,14 @@ version 2005/12/01 or later.
 % \end{pNiceMatrix}$
 %
 %
-% \subsection{Obsolete environments}      
+% \subsection{Obsolete environments which have been deleted}     
 % 
 % The version 3.0 of \pkg{nicematrix} has introduced the environment
 % |{pNiceArray}| (and its variants) with the options |first-row|, |last-row|,
 % |first-col| and |last-col|. 
 %
 % Consequently the following environments present in previous versions of
-% \pkg{nicematrix} are deprecated:
+% have been deleted from \pkg{nicematrix}.
 % %
 % \begin{itemize}
 % \item |{NiceArrayCwithDelims}| ;
@@ -2245,12 +2395,9 @@ version 2005/12/01 or later.
 % \item |{pNiceArrayRC}|, |{bNiceArrayRC}|, |{BNiceArrayRC}|, |{vNiceArrayRC}|,
 % |{VNiceArrayRC}|.
 % \end{itemize}
-%       
-% Since the version 3.12, the only way to use these environments is loading
-% \pkg{nicematrix} with the option |obsolete-environments|.
-%
-% However, these environments will certainly be completely deleted in a future
-% version of \pkg{nicematrix}.
+% 
+% However, the definition of those environments is still available (temporarily)
+% at the end of the file |nicematrix.sty| after a command |\file_input_stop:|.
 %
 % \section{Examples}
 %
@@ -2428,7 +2575,7 @@ version 2005/12/01 or later.
 %        & 1 & 1 & 1 &  & 1 \\
 % \Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 &  & 1 \\
 %        & 1 & 1 & 1 &  & 1 \\
-%        & 1 & 1 & 1 & \Ldots & 1 \\
+%        & 1 & 1 & 1 & \Ldots & 1 
 % \end{pNiceMatrix}$
 % \end{Verbatim}
 %
@@ -2442,7 +2589,7 @@ version 2005/12/01 or later.
 %        & 1 & 1 & 1 &  & 1 \\
 % \Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 &  & 1 \\
 %        & 1 & 1 & 1 &  & 1 \\
-%        & 1 & 1 & 1 & \Ldots & 1 \\
+%        & 1 & 1 & 1 & \Ldots & 1 
 % \end{pNiceMatrix}\]
 % \end{scope}
 %
@@ -2457,16 +2604,17 @@ version 2005/12/01 or later.
 % \bigskip
 % \begin{BVerbatim}
 % ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
-% \NiceMatrixOptions{code-for-last-col = \color{blue}\scriptstyle,light-syntax}
+% \NiceMatrixOptions
+%  { last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax}
 % \setlength{\extrarowheight}{1mm}
-% $\begin{pNiceArray}{CCCC:C}[last-col]
+% $\begin{pNiceArray}{CCCC:C}
 %   1  1  1   1   1 ;
 %   2  4  8  16   9 ;
 %   3  9 27  81  36 ;
 %   4 16 64 256 100 
 % \end{pNiceArray}$
 % \medskip
-% $\begin{pNiceArray}{CCCC:C}[last-col]
+% $\begin{pNiceArray}{CCCC:C}
 %   1  1  1   1  1 ;
 %   0  2  6  14  7        { L_2 \gets -2 L_1 + L_2 } ;
 %   0  6 24  78 33        { L_3 \gets -3 L_1 + L_3 } ;
@@ -2475,15 +2623,15 @@ version 2005/12/01 or later.
 % ...
 % ~emphase#\end{NiceMatrixBlock}@
 % \end{BVerbatim}
-% 
+%
 % \bigskip
-% 
-% % \begin{multicols}{2}
+%
+% \begin{multicols}{2}
 % \begin{NiceMatrixBlock}[auto-columns-width]
-% \NiceMatrixOptions{code-for-last-col = \color{blue}\scriptstyle,light-syntax}
+% \NiceMatrixOptions{last-col,code-for-last-col = \color{blue}\scriptstyle,light-syntax}
 % \setlength{\extrarowheight}{1mm}
 %
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
+% \enskip $\begin{pNiceArray}{CCCC:C}
 % 1  1  1   1   1 ;
 % 2  4  8  16   9 ;
 % 3  9 27  81  36 ;
@@ -2492,7 +2640,7 @@ version 2005/12/01 or later.
 %
 % \medskip
 %
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
+% \enskip $\begin{pNiceArray}{CCCC:C}
 % 1  1  1   1  1 ;
 % 0  2  6  14  7 { L_2 \gets -2 L_1 + L_2 } ;
 % 0  6 24  78 33 { L_3 \gets -3 L_1 + L_3 } ;
@@ -2501,7 +2649,7 @@ version 2005/12/01 or later.
 %
 % \medskip
 %
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
+% \enskip $\begin{pNiceArray}{CCCC:C}
 % 1 1  1  1 1 ;
 % 0 1  3  7 \frac72    { L_2 \gets \frac12 L_2 } ;
 % 0 3 12 39 \frac{33}2 { L_3 \gets \frac12 L_3 } ;
@@ -2510,7 +2658,7 @@ version 2005/12/01 or later.
 %
 % \medskip
 %
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
+% \enskip $\begin{pNiceArray}{CCCC:C}
 % 1 1  1   1 1       ;
 % 0 1  3   7 \frac72 ;
 % 0 0  3  18 6        { L_3 \gets -3 L_2 + L_3 } ;
@@ -2519,7 +2667,7 @@ version 2005/12/01 or later.
 %
 % \medskip
 %
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
+% \enskip $\begin{pNiceArray}{CCCC:C}
 % 1 1  1   1 1       ;
 % 0 1  3   7 \frac72 ;
 % 0 0  1   6 2        { L_3 \gets \frac13 L_3 } ;
@@ -2528,7 +2676,7 @@ version 2005/12/01 or later.
 %
 % \medskip
 %
-% \enskip $\begin{pNiceArray}{CCCC:C}[last-col]
+% \enskip $\begin{pNiceArray}{CCCC:C}
 % 1 1 1  1 1       ;
 % 0 1 3  7 \frac72 ;
 % 0 0 1  6 2       ;
@@ -2544,7 +2692,7 @@ version 2005/12/01 or later.
 % \label{highlight}
 % The following examples require Tikz (by default, \pkg{nicematrix} only loads
 % \textsc{pgf}) and the Tikz library |fit|. The following lines in the preamble
-% of your document may do the job:
+% of your document do the job:
 % \begin{verbatim}
 % \usepackage{tikz}
 % \usetikzlibrary{fit}
@@ -2562,6 +2710,8 @@ version 2005/12/01 or later.
 % don't do that, the new nodes will be larger that the nodes created by
 % \pkg{nicematrix}). 
 %
+% \label{example-CodeAfter}
+%
 % \begin{Verbatim}
 % $\begin{pNiceArray}{>{\strut}CCCC}[create-large-nodes,margin,extra-margin = 2pt]
 %   a_{11} & a_{12} & a_{13} & a_{14} \\
@@ -2879,7 +3029,7 @@ version 2005/12/01 or later.
 %     & \Vdots &        &        &        & \Vdots \\
 % L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\
 %     & \Vdots &        &        &        & \Vdots \\
-%     & a_{n1} & \Cdots &        &        & a_{nn} \\
+%     & a_{n1} & \Cdots &        &        & a_{nn} 
 % \end{bNiceArray}
 % & 
 % \end{Verbatim}
@@ -3010,24 +3160,12 @@ version 2005/12/01 or later.
     You~can~go~on~but~you~will~probably~have~other~errors~
     if~you~use~the~functionalities~of~nicematrix.
   }
-\cs_if_exist:NF \l_keys_key_str
-  { \msg_error:nn { nicematrix } { expl3~too~old } }
+\cs_if_exist:NF \l_keys_key_str 
+  { \msg_error:nn { nicematrix } { expl3~too~old } } 
 %    \end{macrocode}
 %
 %
 % \bigskip
-% We test the class option |draft|. In this case, we raise the flag
-% |\c_@@_draft_bool| because we won't draw the dotted lines if the option
-% |draft| is used.
-%    \begin{macrocode}
-\bool_new:N \c_@@_draft_bool
-\DeclareOption { draft } { \bool_set_true:N \c_@@_draft_bool }
-\DeclareOption* { }
-\ProcessOptions \relax
-%    \end{macrocode}
-%
-%
-% 
 % The command for the treatment of the options of |\usepackage| is at the end of
 % this package for technical reasons. 
 % 
@@ -3059,10 +3197,15 @@ version 2005/12/01 or later.
 % \bigskip
 % \subsection*{Technical  definitions}
 %
+%
 %    \begin{macrocode}
+\bool_new:N \c_@@_booktabs_loaded_bool
 \bool_new:N \c_@@_tikz_loaded_bool
 \AtBeginDocument
   {
+    \@ifpackageloaded { booktabs }
+      { \bool_set_true:N \c_@@_booktabs_loaded_bool }
+      { }
     \@ifpackageloaded { tikz }
       { 
 %    \end{macrocode}
@@ -3071,8 +3214,8 @@ version 2005/12/01 or later.
 % between |{pgfpicture}| and |{tikzpicture}| can't be done dynamically with a
 % conditional because, when the Tikz library |external| is loaded by the user,
 % the pair |\tikzpicture|-|\endtikpicture| (or
-% |\begin{tikzpicture}-\end{tikzpicture}| must be statically ``visible'' (even
-% when extenalization is not activated).
+% |\begin{tikzpicture}-\end{tikzpicture}|) must be statically ``visible'' (even
+% when externalization is not activated).
 %
 % That's why we create |\c_@@_pgfortikzpicture_tl| and
 % |\c_@@_endpgfortikzpicture_tl| which will be used to construct in a
@@ -3102,18 +3245,6 @@ version 2005/12/01 or later.
   { }
 %    \end{macrocode}
 %
-% 
-% The following message must be defined right now because it may be used during
-% the loading of the package.
-%    \begin{macrocode}
-\@@_msg_new:nn { Draft~mode }
-  { The~compilation~is~in~draft~mode:~the~dotted~lines~won't~be~drawn. }
-%    \end{macrocode}
-%
-%    \begin{macrocode}
-\bool_if:NT \c_@@_draft_bool { \msg_warning:nn { nicematrix }  { Draft~mode } }
-%    \end{macrocode}
-% 
 %
 % \bigskip
 % We define a command |\iddots| similar to |\ddots| ($\ddots$) but with dots
@@ -3141,146 +3272,312 @@ version 2005/12/01 or later.
 % This definition is a variant of the standard definition of |\ddots|.
 %
 %
-% \bigskip 
-% The following counter will count the environments |{NiceArray}|. The value of
-% this counter will be used to prefix the names of the Tikz nodes created in the
-% array. 
-%    \begin{macrocode}
-\int_new:N \g_@@_env_int
-%    \end{macrocode}
-% 
-%    \begin{macrocode}
-\cs_new:Npn \@@_env: { nm - \int_use:N \g_@@_env_int } 
-\cs_new_protected:Npn \@@_qpoint: #1 
-  { \pgfpointanchor { \@@_env: - #1 } { center } } 
-%    \end{macrocode}
-% 
-% \bigskip
-% We also define a counter to count the environments |{NiceMatrixBlock}|.
-%    \begin{macrocode}
-\int_new:N \g_@@_NiceMatrixBlock_int
-%    \end{macrocode}
-%
-% \bigskip
-% The dimension |\l_@@_columns_width_dim| will be used when the options specify
-% that all the columns must have the same width (but, if the key |columns-width|
-% is used with the special value |auto|, the boolean
-% |l_@@_auto_columns_width_bool| also will be raised).
-%    \begin{macrocode}
-\dim_new:N \l_@@_columns_width_dim
-%    \end{macrocode}
-%
-% \bigskip
-% The sequence |\g_@@_names_seq| will be the list of all the names of
-% environments used (via the option |name|) in the document: two environments
-% must not have the same name. However, it's possible to use the option
-% |allow-duplicate-names|.
-%    \begin{macrocode}
-\seq_new:N \g_@@_names_seq
-%    \end{macrocode}
-%
-
-% \bigskip
-% We want to know if we are in an environment of \pkg{nicematrix} because we
-% will raise an error if the user tries to use nested environments.
-%    \begin{macrocode}
-\bool_new:N \l_@@_in_env_bool
-%    \end{macrocode}
-% 
-%
 % \bigskip
-% If the user uses |{NiceArray}| (and not another environment relying upon
-% |{NiceArrayWithDelims}| like |{pNiceArray}|), we will raise the flag
-% |\l_@@_NiceArray_bool|. We have to know that, because, in |{NiceArray}|, we
-% won't use a structure with |\left| and |\right| and we will use the option of
-% position (|t|, |b| or |c|). 
+% In the |aux| file, we will have the references of the PGF/Tikz nodes created
+% by \pkg{nicematrix}. However, when \pkg{booktabs} is used, some nodes (more
+% precisely, some |row| nodes) will be defined twice because their position will
+% be modified. In order to avoid an error message in this case, we will redefine
+% |\pgfutil@check@rerun| in the |aux| file.
 %    \begin{macrocode}
-\bool_new:N \l_@@_NiceArray_bool
+\AtBeginDocument 
+  {     
+    \@ifpackageloaded { booktabs } 
+      { \iow_now:Nn \@mainaux \nicematrix@redefine@check@rerun } 
+      { } 
+  }
+\cs_set_protected:Npn \nicematrix@redefine@check@rerun
+  {
+    \cs_set_eq:NN \@@_old_pgfutil@check@rerun \pgfutil@check@rerun
 %    \end{macrocode}
-% 
-%
-% \bigskip
+% The new version of |\pgfutil@check@rerun| will not check the PGF nodes whose
+% names start with |nm-| (which is the prefix for the nodes creates by
+% \pkg{nicematrix}). 
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_test_if_math_mode:
-  { 
-    \if_mode_math: \else:
-      \@@_fatal:n { Outside~math~mode } 
-    \fi:
+    \cs_set_protected:Npn \pgfutil@check@rerun ##1 ##2
+      {
+        \str_set:Nx \l_tmpa_str { \tl_range:nnn { ##1 } 1 3 }
+        \str_if_eq:VnF \l_tmpa_str { nm- } 
+          { \@@_old_pgfutil@check@rerun { ##1 } { ##2 } }
+      }    
   }
 %    \end{macrocode}
 %
-% 
-% 
 % \bigskip
-% We have to know whether \pkg{colortbl} is loaded for the redefinition of
-% |\everycr| and |\vline| and for the options |hlines| and |vlines|.
+% We have to know whether \pkg{colortbl} is loaded in particular for the
+% redefinition of |\everycr|.
 %    \begin{macrocode}
 \bool_new:N \c_@@_colortbl_loaded_bool 
 \AtBeginDocument 
   { 
     \@ifpackageloaded { colortbl }
+      { \bool_set_true:N \c_@@_colortbl_loaded_bool }
       { 
-        \bool_set_true:N \c_@@_colortbl_loaded_bool 
-        \cs_set_protected:Npn \@@_vline_i: { { \CT@arc@ \vline } }
-      }
-      { } 
-  }
 %    \end{macrocode}
-%
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. We will use it to store the instruction of color for
+% the rules even if \pkg{colortbl} is not loaded.
 %    \begin{macrocode}
-\colorlet { nicematrix-last-col } { . }
-\colorlet { nicematrix-last-row } { . }
+        \cs_set_protected:Npn \CT@arc@ { }
+        \NewDocumentCommand { \arrayrulecolor } { m }
+          { \tl_gset:Nn \CT@arc@ { \color { #1 } } }
 %    \end{macrocode}
-% 
-% \bigskip
-% The length |\l_@@_inter_dots_dim| is the distance between two dots for the
-% dotted lines. The default value is 0.45~em but it will be changed if the
-% option |small| is used.
+% The following line are from the redefinition of |\hline| of standard LaTeX by
+% \pkg{colortbl} (\pkg{array} does not redefine |\hline|).
 %    \begin{macrocode}
-\dim_new:N \l_@@_inter_dots_dim
-\dim_set:Nn \l_@@_inter_dots_dim { 0.45 em }
+        \cs_set:Npn \hline
+          {
+            \noalign { \ifnum 0 = `} \fi
+            \let \hskip \vskip
+            \let \vrule \hrule
+            \let \@width \@height
+            { \CT@arc@ \vline } 
+            \futurelet \reserved@a
+            \@xhline
+          }
+      }
+  }
 %    \end{macrocode}
 %
 % \bigskip
-% The length |\l_@@_xdots_shorten_dim| is the minimal distance between a
-% node (in fact an anchor of that node) and a dotted line (we say ``minimal''
-% because, by definition, a dotted line is not a continuous line and, therefore,
-% this distance may vary a little).
-%    \begin{macrocode}
-\dim_new:N \l_@@_xdots_shorten_dim
-\dim_set:Nn \l_@@_xdots_shorten_dim { 0.3 em }
-%    \end{macrocode}
-% 
-% \bigskip
-% The length |\l_@@_radius_dim| is the radius of the dots for the dotted lines
-% (for |\hdottedline| and |\dottedline| and for all the other dotted lines when
-% |line-style| is equal to |standard|, which is the initial value). The initial
-% value is 0.53~pt but it will be changed if the option |small| is used (to
-% 0.37~pt).
+% The following command are only for efficiency. It must \emph{not} be protected
+% because it will be used (for instance) in names of \textsc{pgf} nodes.
 %    \begin{macrocode}
-\dim_new:N \l_@@_radius_dim
-\dim_set:Nn \l_@@_radius_dim { 0.53 pt }
+\cs_new:Npn \@@_succ:n #1 { \the \numexpr #1 + 1 \relax }
+\cs_new:Npn \@@_pred:n #1 { \the \numexpr #1 - 1 \relax }
 %    \end{macrocode}
 %
 % \bigskip
-% The name of the current environment or the current command (despite the name
-% which contains \textsl{env}).
+% \textbf{The column S of siunitx}\par\nobreak
+%
+% \medskip
+% We want to know whether the package \pkg{siunitx} is loaded and, if it is
+% loaded, we redefine the |S| columns of \pkg{siunitx}.
 %    \begin{macrocode}
-\str_new:N \g_@@_name_env_str
+\bool_new:N \c_@@_siunitx_loaded_bool 
+\AtBeginDocument 
+  { 
+    \@ifpackageloaded { siunitx }
+      { \bool_set_true:N \c_@@_siunitx_loaded_bool }
+      { } 
+  }
 %    \end{macrocode}
 % 
-% The string |\g_@@_com_or_env_str| will contain the word \emph{command} or
-% \emph{environment} whether we are in a command of \pkg{nicematrix} or a an
-% environment of \pkg{nicematrix}. The default value is \emph{environment}.
-%    \begin{macrocode}
-\str_new:N \g_@@_com_or_env_str
+% \medskip
+% The command |\NC@rewrite@S| is a LaTeX command created by \pkg{siunitx} in
+% connection with the |S| column. In the code of \pkg{siunitx}, this command is
+% defined by:
+% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
+% \renewcommand*{\NC@rewrite@S}[1][]
+%   {
+%     \@temptokena \exp_after:wN
+%       {
+%         \tex_the:D \@temptokena
+%         > { \__siunitx_table_collect_begin: S {#1} }
+%         c
+%         < { \__siunitx_table_print: }
+%       }
+%     \NC@find
+%   } 
+% \end{Verbatim}
+% We want to patch this command (in the environments of \pkg{nicematrix}) in
+% order to have:
+% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
+% \renewcommand*{\NC@rewrite@S}[1][]
+%   {
+%     \@temptokena \exp_after:wN
+%       {
+%         \tex_the:D \@temptokena
+%         > { ~emphase!\@@_Cell:+ \__siunitx_table_collect_begin: S {#1} }
+%         c
+%         < { \__siunitx_table_print: ~emphase!\@@_end_Cell:+ }
+%       }
+%     \NC@find
+%   } 
+% \end{Verbatim}
+% However, we don't want do use explicitly any private command of \pkg{siunitx}.
+% That's why we will extract the name of the two |\__siunitx...| commands by
+% their position in the code of |\NC@rewrite@S|. 
+%
+% Since the command |\NC@rewrite@S| appends some tokens to the \emph{toks} list
+% |\@temptokena|, we use the LaTeX command |\NC@rewrite@S| in a group
+% (|\group_begin:|--|\group_end:|) and we extract the two command names which
+% are in the toks |\@temptokena|. However, this extraction can be done only
+% when \pkg{siunitx} is loaded (and it may be loaded after \pkg{nicematrix})
+% and, in fact, after the beginning of the document --- because some
+% instructions of \pkg{siunitx} are executed in a |\AtBeginDocument|). That's
+% why this extraction will be done only at the first use of an
+% environment of \pkg{nicematrix} with the command |\@@_adapt_S_column:|. 
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_adapt_S_column:
+  {
+    \bool_if:NT \c_@@_siunitx_loaded_bool
+      { 
+        \group_begin:
+        \@temptokena = { }
+%    \end{macrocode}
+% We protect |\NC@find| which is at the end of |\NC@rewrite@S|.
+%    \begin{macrocode}
+        \cs_set_eq:NN \NC@find \prg_do_nothing:
+        \NC@rewrite@S { }
+%    \end{macrocode}
+% Conversion of the \emph{toks} |\@temptokena| in a token list of \pkg{expl3}
+% (the toks are not supported by \pkg{expl3} but we can, nevertheless, use the
+% option |V| for |\tl_gset:NV|).
+%    \begin{macrocode}
+        \tl_gset:NV \g_tmpa_tl \@temptokena 
+        \group_end:
+        \tl_new:N \c_@@_table_collect_begin_tl
+        \tl_set:Nx \l_tmpa_tl { \tl_item:Nn \g_tmpa_tl 2 }
+        \tl_gset:Nx \c_@@_table_collect_begin_tl { \tl_item:Nn \l_tmpa_tl 1 }
+        \tl_new:N \c_@@_table_print_tl
+        \tl_gset:Nx \c_@@_table_print_tl { \tl_item:Nn \g_tmpa_tl { -1 } }
+%    \end{macrocode}
+% The token lists |\c_@@_table_collect_begin_tl| and |\c_@@_table_print_tl|
+% contain now the two commands of \pkg{siunitx}.
+% 
+% \smallskip
+% If the adaptation has been done, the command |\@@_adapt_S_column:| becomes
+% no-op (globally). 
+%    \begin{macrocode}
+        \cs_gset_eq:NN \@@_adapt_S_column: \prg_do_nothing:
+      }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The command |\@@_renew_NC@rewrite@S:| will be used in each environment of
+% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment
+% (only if the boolean |\c_@@_siunitx_loaded_bool| is raised, of course).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_renew_NC@rewrite@S:
+  {
+    \renewcommand*{\NC@rewrite@S}[1][]
+      {
+        \@temptokena \exp_after:wN
+          {
+            \tex_the:D \@temptokena
+            > { \@@_Cell: \c_@@_table_collect_begin_tl S {##1} }
+            c
+            < { \c_@@_table_print_tl \@@_end_Cell: }
+          }
+        \NC@find
+      }
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% \subsection*{Parameters}
+%
+% 
+% \bigskip 
+% The following counter will count the environments |{NiceArray}|. The value of
+% this counter will be used to prefix the names of the Tikz nodes created in the
+% array. 
+%    \begin{macrocode}
+\int_new:N \g_@@_env_int
+%    \end{macrocode}
+%
+% \bigskip
+% The following command is only a syntaxic shortcut. It must \emph{not} be
+% protected (it will be used in names of \textsc{pgf} nodes).
+%    \begin{macrocode}
+\cs_new:Npn \@@_env: { nm - \int_use:N \g_@@_env_int } 
+%    \end{macrocode}
+%
+% \bigskip
+% The following command is only a syntaxic shortcut. The |q| in |qpoint| means 
+% \emph{quick}. 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_qpoint:n #1 
+  { \pgfpointanchor { \@@_env: - #1 } { center } } 
+%    \end{macrocode}
+% 
+% \bigskip
+% the following counter will count the environments |{NiceMatrixBlock}|.
+%    \begin{macrocode}
+\int_new:N \g_@@_NiceMatrixBlock_int
+%    \end{macrocode}
+%
+% \bigskip
+% The dimension |\l_@@_columns_width_dim| will be used when the options specify
+% that all the columns must have the same width (but, if the key |columns-width|
+% is used with the special value |auto|, the boolean
+% |l_@@_auto_columns_width_bool| also will be raised).
+%    \begin{macrocode}
+\dim_new:N \l_@@_columns_width_dim
+%    \end{macrocode}
+%
+% \bigskip
+% The sequence |\g_@@_names_seq| will be the list of all the names of
+% environments used (via the option |name|) in the document: two environments
+% must not have the same name. However, it's possible to use the option
+% |allow-duplicate-names|.
+%    \begin{macrocode}
+\seq_new:N \g_@@_names_seq
+%    \end{macrocode}
+%
+% \bigskip
+% We want to know if we are in an environment of \pkg{nicematrix} because we
+% will raise an error if the user tries to use nested environments.
+%    \begin{macrocode}
+\bool_new:N \l_@@_in_env_bool
+%    \end{macrocode}
+%
+% \bigskip
+% If the user uses |{NiceArray}| (and not another environment relying upon
+% |{NiceArrayWithDelims}| like |{pNiceArray}|), we will raise the flag
+% |\l_@@_NiceArray_bool|. We have to know that, because, in |{NiceArray}|, we
+% won't use a structure with |\left| and |\right| and we will use the option of
+% position (|t|, |b| or |c|). 
+%    \begin{macrocode}
+\bool_new:N \l_@@_NiceArray_bool
+%    \end{macrocode}
+% 
+% \bigskip
+% If the user uses |{NiceTabular}|, we will raise the following flag.
+%    \begin{macrocode}
+\bool_new:N \l_@@_NiceTabular_bool
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_math_mode:
+  { 
+    \if_mode_math: \else:
+      \@@_fatal:n { Outside~math~mode } 
+    \fi:
+  }
+%    \end{macrocode}
+%
+% 
+% \bigskip
+% The following colors will be used to memorize le color of the potential ``first
+% col'' and the potential ``first row''.
+%    \begin{macrocode}
+\colorlet { nicematrix-last-col } { . }
+\colorlet { nicematrix-last-row } { . }
+%    \end{macrocode}
+% \bigskip
+% The following string is the name of the current environment or the current
+% command of \pkg{nicematrix} (despite its name which contains \textsl{env}).
+%    \begin{macrocode}
+\str_new:N \g_@@_name_env_str
+%    \end{macrocode}
+% 
+% \bigskip
+% The following string will contain the word \emph{command} or
+% \emph{environment} whether we are in a command of \pkg{nicematrix} or in an
+% environment of \pkg{nicematrix}. The default value is \emph{environment}.
+%    \begin{macrocode}
+\str_new:N \g_@@_com_or_env_str
 \str_set:Nn \g_@@_com_or_env_str { environment }
 %    \end{macrocode}
 % 
-% The following control sequence will be able to reconstruct the full name of
-% the current command or environment (despite the name which contains
-% \textsl{env}). This command must \emph{not} be protected since it's used in
-% error messages.
+% \bigskip
+% The following command will be able to reconstruct the full name of the current
+% command or environment (despite its name which contains \textsl{env}). This
+% command must \emph{not} be protected since it will be used in error messages.
 %    \begin{macrocode}
 \cs_new:Npn \@@_full_name_env:
   { 
@@ -3291,35 +3588,56 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 % 
 % \bigskip
+% The following token list corresponds to the option |code-after| (it's also
+% possible to set the value of that parameter with the command |\CodeAfter|).
 %    \begin{macrocode}
-\tl_new:N \g_@@_internal_code_after_tl
 \tl_new:N \g_@@_code_after_tl
 %    \end{macrocode}
 % 
-%
 % \bigskip
-% The counters |\l_@@_save_iRow_int| and |\l_@@_save_jCol_int| will be used to
-% save the values of the eventual LaTeX counters |iRow| and |jCol|. These LaTeX
+% The following token list has a function similar to |\g_@@_code_after_tl| but
+% it is used internally by \pkg{nicematrix}. In fact, we have to distinguish
+% between |\g_@@_code_after_tl| and |\g_@@_internal_code_after_tl| because we
+% must take care of the order in which instructions stored in that paremeters
+% are executed.
+%    \begin{macrocode}
+\tl_new:N \g_@@_internal_code_after_tl
+%    \end{macrocode}
+% 
+% \bigskip
+% The counters |\l_@@_old_iRow_int| and |\l_@@_old_jCol_int| will be used to
+% save the values of the potential LaTeX counters |iRow| and |jCol|. These LaTeX
 % counters will be restored at the end of the environment.
 %    \begin{macrocode}
-\int_new:N \l_@@_save_iRow_int
-\int_new:N \l_@@_save_jCol_int
+\int_new:N \l_@@_old_iRow_int
+\int_new:N \l_@@_old_jCol_int
 %    \end{macrocode}
 %
 % The TeX counters |\c@iRow| and |\c@jCol| will be created in the beginning of
 % |{NiceArrayWithDelims}| (if they don't exist previously).
 % 
+% \bigskip
+% A kind of false row will be inserted at the end of the array for the
+% construction of the |col| nodes (and also to fix the width of the columns when
+% |columns-width| is used). When this special row will be created, we will raise
+% the flag |\g_@@_row_of_col_done_bool| in order to avoid some actions set in
+% the redefinition of |\everycr| when the last |\cr| of the |\halign| will occur
+% (after that row of |col| nodes).
 %    \begin{macrocode}
 \bool_new:N \g_@@_row_of_col_done_bool
 %    \end{macrocode}
 % 
+% \bigskip
+% The following flag will be raised when the key |code-before| is used in the
+% environment. Indeed, if there is a |code-before| in the environment, we will
+% manage to have the |row| nodes and the |col| nodes available \emph{before} the 
+% creation of the array.
 %    \begin{macrocode}
-\tl_new:N \l_@@_initial_suffix_tl 
-\tl_new:N \l_@@_initial_anchor_tl 
-\tl_new:N \l_@@_final_suffix_tl 
-\tl_new:N \l_@@_final_anchor_tl 
-%    \end{macrocode}
+\bool_new:N \l_@@_code_before_bool
+%    \end{macrocode} 
 % 
+% \bigskip
+% The following dimensions will be used when drawing the dotted lines.
 %    \begin{macrocode}
 \dim_new:N \l_@@_x_initial_dim
 \dim_new:N \l_@@_y_initial_dim
@@ -3327,25 +3645,37 @@ version 2005/12/01 or later.
 \dim_new:N \l_@@_y_final_dim
 %    \end{macrocode}
 % 
+% \bigskip
+% \pkg{expl3} provides scratch dimension |\l_tmpa_dim| and |\l_tmpd_dim|. We
+% creates two other in the same spirit (if they don't exist yet : that's why we
+% use |\dim_zero_new:N|).
 %    \begin{macrocode}
-\dim_new:N \l_tmpc_dim
-\dim_new:N \l_tmpd_dim
+\dim_zero_new:N \l_tmpc_dim 
+\dim_zero_new:N \l_tmpd_dim
 %    \end{macrocode}
 %
+% \bigskip
+% Some cells will be declared as ``empty'' (for example a cell with the
+% instrution |\Cdot|).
 %    \begin{macrocode}
 \bool_new:N \g_@@_empty_cell_bool
 %    \end{macrocode}
 % 
-% \medskip
-% The token list |\l_@@_xdots_line_style_tl| corresponds to the option |tikz| of the
-% commands |\Cdots|, |\Ldots|, etc. and of the options |line-style| for the
-% environments and |\NiceMatrixOptions|. The constant |\c_@@_standard_tl| will
-% be used in some tests.
+% \bigskip
+% The following dimension will be used to save the current value of
+% |\arraycolsep|.
 %    \begin{macrocode}
-\tl_new:N \l_@@_xdots_line_style_tl
-\tl_const:Nn \c_@@_standard_tl { standard }
-\tl_set_eq:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl
+\dim_new:N \@@_old_arraycolsep_dim 
 %    \end{macrocode}
+%
+% \bigskip
+% The following dimensions will be used internally to compute the width of the
+% potential ``first column'' and ``last column''.
+%    \begin{macrocode}
+\dim_new:N \g_@@_width_last_col_dim
+\dim_new:N \g_@@_width_first_col_dim
+%    \end{macrocode}
+%
 % 
 % \bigskip
 % \textbf{Variables for the exterior rows and columns}\par\nobreak
@@ -3360,8 +3690,7 @@ version 2005/12/01 or later.
 % \item \textbf{First row}\par\nobreak
 % The integer |\l_@@_first_row_int| is the number of the first row of the
 % array. The default value is $1$, but, if the option |first-row| is used,
-% the value will be~$0$. As usual, the global version is for the passage in the
-% |\group_insert_after:N|. 
+% the value will be~$0$. 
 %    \begin{macrocode}
 \int_new:N \l_@@_first_row_int
 \int_set:Nn \l_@@_first_row_int 1
@@ -3409,7 +3738,7 @@ version 2005/12/01 or later.
 % \medskip
 % \item \textbf{Last column}\par\nobreak
 %
-% For the eventual ``last column'', we use an integer. A value of $-2$ means
+% For the potential ``last column'', we use an integer. A value of $-2$ means
 % that there is no last column. A value of $-1$ means that there is a last
 % column but we don't know its value because the user has used the option
 % |last-col| without value (it's possible in an environment without preamble
@@ -3438,138 +3767,13 @@ version 2005/12/01 or later.
 % This boolean is set to |false| at the end of |\@@_pre_array:|.
 % \end{itemize}
 %       
-% \bigskip
-% \textbf{The column S of siunitx}\par\nobreak
-%
-% \medskip
-% We want to know whether the package \pkg{siunitx} is loaded and, if it is
-% loaded, we redefine the |S| columns of \pkg{siunitx}.
-%    \begin{macrocode}
-\bool_new:N \c_@@_siunitx_loaded_bool 
-\AtBeginDocument 
-  { 
-    \@ifpackageloaded { siunitx }
-      { \bool_set_true:N \c_@@_siunitx_loaded_bool }
-      { } 
-  }
-%    \end{macrocode}
-% 
-% \medskip
-% The command |\NC@rewrite@S| is a LaTeX command created by \pkg{siunitx} in
-% connection with the |S| column. In the code of \pkg{siunitx}, this command is
-% defined by:
-% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
-% \renewcommand*{\NC@rewrite@S}[1][]
-%   {
-%     \@temptokena \exp_after:wN
-%       {
-%         \tex_the:D \@temptokena
-%         > { \__siunitx_table_collect_begin: S {#1} }
-%         c
-%         < { \__siunitx_table_print: }
-%       }
-%     \NC@find
-%   } 
-% \end{Verbatim}
-% We want to patch this command (in the environments of \pkg{nicematrix}) in
-% order to have:
-% \begin{Verbatim}[commandchars=\~\!\+, formatcom = \small]
-% \renewcommand*{\NC@rewrite@S}[1][]
-%   {
-%     \@temptokena \exp_after:wN
-%       {
-%         \tex_the:D \@temptokena
-%         > { ~emphase!\@@_Cell:+ \__siunitx_table_collect_begin: S {#1} }
-%         c
-%         < { \__siunitx_table_print: ~emphase!\@@_end_Cell:+ }
-%       }
-%     \NC@find
-%   } 
-% \end{Verbatim}
-% However, we don't want do use explicitly any private command of \pkg{siunitx}.
-% That's why we will extract the name of the two |\__siunitx...| commands by
-% their position in the code of |\NC@rewrite@S|. 
-%
-% Since the command |\NC@rewrite@S| appends some tokens to the \emph{toks} list
-% |\@temptokena|, we use the LaTeX command |\NC@rewrite@S| in a group
-% (|\group_begin:|--|\group_end:|) and we extract the two command names which
-% are in the toks |\@temptokena|. However, this extraction can be done only
-% when \pkg{siunitx} is loaded (and it may be loaded after \pkg{nicematrix})
-% and, in fact, after the beginning of the document --- because some
-% instructions of \pkg{siunitx} are executed in a |\AtBeginDocument|). That's
-% why this extraction will be done only at the first use of an
-% environment of \pkg{nicematrix} with the command |\@@_adapt_S_column:|. 
-%    \begin{macrocode}
-\cs_set_protected:Npn \@@_adapt_S_column:
-  {
-    \bool_if:NT \c_@@_siunitx_loaded_bool
-      { 
-        \group_begin:
-        \@temptokena = { }
-%    \end{macrocode}
-% We protect |\NC@find| which is at the end of |\NC@rewrite@S|.
-%    \begin{macrocode}
-        \cs_set_eq:NN \NC@find \prg_do_nothing:
-        \NC@rewrite@S { }
-%    \end{macrocode}
-% Conversion of the \emph{toks} |\@temptokena| in a token list of \pkg{expl3}
-% (the toks are not supported by \pkg{expl3} but we can, nevertheless, use the
-% option |V| for |\tl_gset:NV|).
-%    \begin{macrocode}
-        \tl_gset:NV \g_tmpa_tl \@temptokena 
-        \group_end:
-        \tl_new:N \c_@@_table_collect_begin_tl
-        \tl_set:Nx \l_tmpa_tl { \tl_item:Nn \g_tmpa_tl 2 }
-        \tl_gset:Nx \c_@@_table_collect_begin_tl { \tl_item:Nn \l_tmpa_tl 1 }
-        \tl_new:N \c_@@_table_print_tl
-        \tl_gset:Nx \c_@@_table_print_tl { \tl_item:Nn \g_tmpa_tl { -1 } }
-%    \end{macrocode}
-% The token lists |\c_@@_table_collect_begin_tl| and |\c_@@_table_print_tl|
-% contain now the two commands of \pkg{siunitx}.
-% 
-% \smallskip
-% If the adaptation has been done, the command |\@@_adapt_S_column:| becomes
-% no-op (globally). 
-%    \begin{macrocode}
-        \cs_gset_eq:NN \@@_adapt_S_column: \prg_do_nothing:
-      }
-  }
-%    \end{macrocode}
-%
-% \bigskip
-% The command |\@@_renew_NC@rewrite@S:| will be used in each environment of
-% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment
-% (only if the boolean |\c_@@_siunitx_loaded_bool| is raised, of course).
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_renew_NC@rewrite@S:
-  {
-    \renewcommand*{\NC@rewrite@S}[1][]
-      {
-        \@temptokena \exp_after:wN
-          {
-            \tex_the:D \@temptokena
-            > { \@@_Cell: \c_@@_table_collect_begin_tl S {##1} }
-            c
-            < { \c_@@_table_print_tl \@@_end_Cell: }
-          }
-        \NC@find
-      }
-  }
-%    \end{macrocode}
 % 
-% \bigskip
-% The following command is only for efficiency. It must \emph{not} be protected
-% because it will be used (for instance) in names of \textsc{pgf} nodes.
-%    \begin{macrocode}
-\cs_new:Npn \@@_succ:n #1 { \the \numexpr #1 + 1 \relax }
-\cs_new:Npn \@@_pred:n #1 { \the \numexpr #1 - 1 \relax }
-%    \end{macrocode}
 % 
 % \subsection*{Command for creation of rectangle nodes}
 %
 % 
-% The following command should be used in a |{pgfpicture}|. It creates an
-% rectangular (empty but with a name) when the four corners are given.
+% The following command should be used in a |{pgfpicture}|. It creates a
+% rectangle (empty but with a name).
 % 
 % |#1| is the name of the node which will be created;
 % |#2| and |#3| are the coordinates of one of the corner of the rectangle;
@@ -3634,16 +3838,64 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 %
 %
-% \bigskip 
-% \subsection*{The options}
-% 
+% \bigskip 
+% \subsection*{The options}
+% 
+% 
+% The following dimensions correspond to the options |cell-space-top-limit| and co
+% (these parameters are inspired by the package \pkg{cellspace}). 
+%    \begin{macrocode}
+\dim_new:N \l_@@_cell_space_top_limit_dim
+\dim_new:N \l_@@_cell_space_bottom_limit_dim
+%    \end{macrocode}
+%
+% \bigskip
+% The following dimension is the distance between two dots for the dotted lines
+% (when |line-style| is equal to |standard|, which is the initial value). The
+% initial value is 0.45~em but it will be changed if the option |small| is used.
+%    \begin{macrocode}
+\dim_new:N \l_@@_inter_dots_dim
+\dim_set:Nn \l_@@_inter_dots_dim { 0.45 em }
+%    \end{macrocode}
+%
+% \bigskip
+% The following dimension is the minimal distance between a node (in fact an
+% anchor of that node) and a dotted line (we say ``minimal'' because, by
+% definition, a dotted line is not a continuous line and, therefore, this
+% distance may vary a little).
+%    \begin{macrocode}
+\dim_new:N \l_@@_xdots_shorten_dim
+\dim_set:Nn \l_@@_xdots_shorten_dim { 0.3 em }
+%    \end{macrocode}
+% 
+% \bigskip
+% The following dimension is the radius of the dots for the dotted lines (when
+% |line-style| is equal to |standard|, which is the initial value). The initial
+% value is 0.53~pt but it will be changed if the option |small| is used.
+%    \begin{macrocode}
+\dim_new:N \l_@@_radius_dim
+\dim_set:Nn \l_@@_radius_dim { 0.53 pt }
+%    \end{macrocode}
+%
+% \bigskip
+% The token list |\l_@@_xdots_line_style_tl| corresponds to the option |tikz| of the
+% commands |\Cdots|, |\Ldots|, etc. and of the options |line-style| for the
+% environments and |\NiceMatrixOptions|. The constant |\c_@@_standard_tl| will
+% be used in some tests.
+%    \begin{macrocode}
+\tl_new:N \l_@@_xdots_line_style_tl
+\tl_const:Nn \c_@@_standard_tl { standard }
+\tl_set_eq:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl
+%    \end{macrocode}
+%
+% \bigskip
 % The boolean |\l_@@_light_syntax_bool| corresponds to the option |light-syntax|.
 %    \begin{macrocode}
 \bool_new:N \l_@@_light_syntax_bool
 %    \end{macrocode}
 % 
 % \bigskip
-% The token list |\l_@@_baseline_str| may contain one of the three values |t|,
+% The string |\l_@@_baseline_str| may contain one of the three values |t|,
 % |c| or |b| as in the option of the environment |{array}|. However, it may also
 % contain an integer (which represents the number of the row to which align the
 % array). 
@@ -3698,7 +3950,7 @@ version 2005/12/01 or later.
 % 
 % 
 % \bigskip
-% The token list |\l_@@_name_str| will contain the optional name of the
+% The string |\l_@@_name_str| will contain the optional name of the
 % environment: this name can be used to access to the Tikz nodes created in the
 % array from outside the environment.  
 %    \begin{macrocode}
@@ -3723,13 +3975,6 @@ version 2005/12/01 or later.
 \dim_new:N \l_@@_right_margin_dim
 %    \end{macrocode}
 %
-% \bigskip
-% The following dimensions will be used internally to compute the width of the
-% potential ``first column'' and ``last column''.
-%    \begin{macrocode}
-\dim_new:N \g_@@_width_last_col_dim
-\dim_new:N \g_@@_width_first_col_dim
-%    \end{macrocode}
 %                              
 % \bigskip
 % The dimensions |\l_@@_extra_left_margin_dim| and
@@ -3809,12 +4054,20 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
 \keys_define:nn { NiceMatrix / Global }
   {
+    cell-space-top-limit .dim_set:N = \l_@@_cell_space_top_limit_dim ,
+    cell-space-top-limit .value_required:n = true ,
+    cell-space-bottom-limit .dim_set:N = \l_@@_cell_space_bottom_limit_dim ,
+    cell-space-bottom-limit .value_required:n = true ,
     xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , 
     max-delimiter-width .bool_set:N = \l_@@_max_delimiter_width_bool ,
     light-syntax .bool_set:N = \l_@@_light_syntax_bool ,
     light-syntax .default:n = true , 
     end-of-row .tl_set:N = \l_@@_end_of_row_tl ,
     end-of-row .value_required:n = true ,
+    first-col .code:n = \int_zero:N \l_@@_first_col_int , 
+    first-row .code:n = \int_zero:N \l_@@_first_row_int ,
+    last-row .int_set:N = \l_@@_last_row_int ,
+    last-row .default:n = -1 ,
     code-for-first-col .tl_set:N = \l_@@_code_for_first_col_tl ,
     code-for-first-col .value_required:n = true ,
     code-for-last-col .tl_set:N = \l_@@_code_for_last_col_tl ,
@@ -3823,7 +4076,6 @@ version 2005/12/01 or later.
     code-for-first-row .value_required:n = true ,
     code-for-last-row .tl_set:N = \l_@@_code_for_last_row_tl ,
     code-for-last-row .value_required:n = true ,
-    small .bool_set:N = \l_@@_small_bool ,
     hlines .bool_set:N = \l_@@_hlines_bool ,
     vlines .bool_set:N = \l_@@_vlines_bool ,
     hvlines .meta:n = { hlines , vlines } , 
@@ -3831,19 +4083,13 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 %
 % \bigskip
-% With the option |renew-dots|, the command |\cdots|, |\ldots|, |\vdots| and
-% |\ddots| are redefined and behave like the commands |\Cdots|, |\Ldots|,
-% |\Vdots| and |\Ddots|. 
+% With the option |renew-dots|, the command |\cdots|, |\ldots|, |\vdots|,
+% |\ddots|, etc. are redefined and behave like the commands |\Cdots|, |\Ldots|,
+% |\Vdots|, |\Ddots|, etc.
 %    \begin{macrocode}
     renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
     renew-dots .value_forbidden:n = true ,
     nullify-dots .bool_set:N = \l_@@_nullify_dots_bool ,
-%    \end{macrocode}
-%
-% \bigskip
-% In some circonstancies, the ``medium nodes'' are created automatically, for
-% example when a dotted line has an ``open'' extremity (idem for the ``large nodes'').
-%    \begin{macrocode}
     create-medium-nodes .bool_set:N = \l_@@_medium_nodes_bool ,
     create-large-nodes .bool_set:N = \l_@@_large_nodes_bool ,
     create-extra-nodes .meta:n = 
@@ -3868,6 +4114,14 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
 \keys_define:nn { NiceMatrix / Env }
   {
+    code-before .code:n = 
+     { 
+       \tl_if_empty:nF { #1 } 
+         {
+           \tl_set:Nn \l_@@_code_before_tl { #1 }
+           \bool_set_true:N \l_@@_code_before_bool 
+         }
+     } ,
 %    \end{macrocode}
 % \bigskip
 % The options |c|, |t| and |b| of the environment |{NiceArray}| have the same
@@ -3900,10 +4154,6 @@ version 2005/12/01 or later.
     name .value_required:n = true ,
     code-after .tl_gset:N = \g_@@_code_after_tl ,
     code-after .value_required:n = true ,
-    first-col .code:n = \int_zero:N \l_@@_first_col_int , 
-    first-row .code:n = \int_zero:N \l_@@_first_row_int ,
-    last-row .int_set:N = \l_@@_last_row_int ,
-    last-row .default:n = -1 ,
   }
 %    \end{macrocode}
 %
@@ -3925,6 +4175,12 @@ version 2005/12/01 or later.
         NiceMatrix / Env ,
       } ,
     NiceMatrix / xdots .inherit:n = NiceMatrix / xdots ,
+    NiceTabular .inherit:n = 
+      {
+        NiceMatrix / Global ,
+        NiceMatrix / Env
+      } ,
+    NiceTabular / xdots .inherit:n = NiceMatrix / xdots ,
     NiceArray .inherit:n = 
       { 
         NiceMatrix / Global ,
@@ -3948,6 +4204,11 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
 \keys_define:nn { NiceMatrix / NiceMatrixOptions }
   { 
+    last-col .code:n = \tl_if_empty:nF { #1 }
+                         { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } } 
+                       \int_zero:N \l_@@_last_col_int ,
+    small .bool_set:N = \l_@@_small_bool ,
+    small .value_forbidden:n = true ,
 %    \end{macrocode}
 %                              
 % With the option |renew-matrix|, the environment |{matrix}| of \pkg{amsmath}
@@ -3981,7 +4242,7 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 %
 % \bigskip
-% Usually, an error is raised when the user tries to give the same to name two
+% Usually, an error is raised when the user tries to give the same name to two
 % distincts environments of \pkg{nicematrix} (theses names are global and not
 % local to the current TeX scope). However, the option |allow-duplicate-names|
 % disables this feature. 
@@ -4041,6 +4302,11 @@ version 2005/12/01 or later.
     r .code:n = \tl_set:Nn \l_@@_type_of_col_tl R ,
     L .code:n = \tl_set:Nn \l_@@_type_of_col_tl L ,
     R .code:n = \tl_set:Nn \l_@@_type_of_col_tl R ,
+    S .code:n = \bool_if:NTF \c_@@_siunitx_loaded_bool
+                  { \tl_set:Nn \l_@@_type_of_col_tl S }
+                  { \@@_error:n { option~S~without~siunitx } } ,
+    small .bool_set:N = \l_@@_small_bool ,
+    small .value_forbidden:n = true ,
     unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix } 
   }
 %    \end{macrocode}
@@ -4060,6 +4326,8 @@ version 2005/12/01 or later.
 % be used without value because the number of columns of the array is read
 % from the preamble of the array.
 %    \begin{macrocode}
+    small .bool_set:N = \l_@@_small_bool ,
+    small .value_forbidden:n = true ,
     last-col .code:n = \tl_if_empty:nF { #1 }
                          { \@@_error:n { last-col~non~empty~for~NiceArray } } 
                        \int_zero:N \l_@@_last_col_int ,
@@ -4077,13 +4345,23 @@ version 2005/12/01 or later.
                          { \@@_error:n { last-col~non~empty~for~NiceArray } } 
                        \int_zero:N \l_@@_last_col_int ,
     first-row .code:n = \int_zero:N \l_@@_first_row_int ,
-    last-row .int_set:N = \l_@@_last_row_int ,
-    last-row .default:n = -1 ,
+    small .bool_set:N = \l_@@_small_bool ,
+    small .value_forbidden:n = true ,
     unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix } 
   }
 %    \end{macrocode}
 %
+% \bigskip
+% We finalise the definition of the set of keys ``|NiceMatrix / NiceTabular|''
+% with the options specific to |{NiceTabular}|. 
 %
+%    \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceTabular }
+  {
+    unknown .code:n = \@@_error:n { Unknown~option~for~NiceTabular } 
+  }
+%    \end{macrocode}
+% 
 % \bigskip
 % \subsection*{Important code used by \{NiceArrayWithDelims\} }
 %
@@ -4110,12 +4388,15 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 % The content of the cell is composed in the box |\l_@@_cell_box| because we want
 % to compute some dimensions of the box. The |\hbox_set_end:| corresponding to
-% this |\hbox_set:Nw| will be in the |\@@_end_Cell:| (and the
+% this |\hbox_set:Nw| will be in the |\@@_end_Cell:| (and the potential
 % |\c_math_toggle_token| also).
 %    \begin{macrocode}
     \hbox_set:Nw \l_@@_cell_box 
-    \c_math_toggle_token
-    \bool_if:NT \l_@@_small_bool \scriptstyle 
+    \bool_if:NF \l_@@_NiceTabular_bool 
+      { 
+        \c_math_toggle_token
+        \bool_if:NT \l_@@_small_bool \scriptstyle 
+      }
 %    \end{macrocode}
 % 
 % We will call \emph{corners} of the matrix the cases which are at the
@@ -4158,12 +4439,12 @@ version 2005/12/01 or later.
     \pgfrememberpicturepositiononpagetrue
     \pgfcoordinate 
       { \@@_env: - row - \int_use:N \c@iRow - base } 
-      \pgfpointorigin 
+      { \pgfpoint \c_zero_dim { 0.5 \arrayrulewidth } }
     \str_if_empty:NF \l_@@_name_str
       {
         \pgfnodealias 
-          { \@@_env: - row - \int_use:N \c@iRow - base } 
           { \l_@@_name_str - row - \int_use:N \c@iRow - base } 
+          { \@@_env: - row - \int_use:N \c@iRow - base } 
       }
     \endpgfpicture
   }
@@ -4199,14 +4480,20 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_end_Cell:
   { 
-    \c_math_toggle_token 
+    \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token 
     \hbox_set_end:
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+    \box_set_ht:Nn \l_@@_cell_box
+      { \box_ht:N \l_@@_cell_box + \l_@@_cell_space_top_limit_dim }
+    \box_set_dp:Nn \l_@@_cell_box
+      { \box_dp:N \l_@@_cell_box + \l_@@_cell_space_bottom_limit_dim }
+%    \end{macrocode}
+%
 % We want to compute in |\g_@@_max_cell_width_dim| the width of the widest cell
 % of the array (except the cells of the ``first column'' and the ``last
 % column''). 
-% 
 %    \begin{macrocode}
     \dim_gset:Nn \g_@@_max_cell_width_dim
       { \dim_max:nn \g_@@_max_cell_width_dim { \box_wd:N \l_@@_cell_box } }
@@ -4242,10 +4529,7 @@ version 2005/12/01 or later.
 % \end{itemize}
 %    \begin{macrocode}
     \bool_if:NTF \g_@@_empty_cell_bool
-      { 
-        \box_use_drop:N \l_@@_cell_box 
-        \bool_gset_false:N \g_@@_empty_cell_bool
-      }
+      { \box_use_drop:N \l_@@_cell_box }
       {
         \dim_compare:nNnTF { \box_wd:N \l_@@_cell_box } > \c_zero_dim
           \@@_node_for_the_cell:
@@ -4300,13 +4584,13 @@ version 2005/12/01 or later.
 % \begin{pNiceMatrix}
 % 1 & 2 & 3 & 4 \\
 % 5 & \Cdots & & 6 \\
-% 7 & \Cdots[color=red] \\
+% 7 & \Cdots[color=red] 
 % \end{pNiceMatrix}
 % \end{BVerbatim}
 % $\begin{pNiceMatrix}
 % 1 & 2 & 3 & 4 \\
 % 5 & \Cdots & & 6 \\
-% 7 & \Cdots[color=red] \\
+% 7 & \Cdots[color=red] 
 % \end{pNiceMatrix}$
 %
 % \smallskip
@@ -4322,29 +4606,23 @@ version 2005/12/01 or later.
 % 
 % 
 % \bigskip
-% We begin with a test of the flag |\c_@@_draft_bool| because, if the key
-% |draft| is used, the dotted lines are not drawn.
 %    \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
-  { \cs_set_protected:Npn \@@_instruction_of_type:nn #1 #2 { } }
-  {
-    \cs_new_protected:Npn \@@_instruction_of_type:nn #1 #2
-      { 
+\cs_new_protected:Npn \@@_instruction_of_type:nn #1 #2
+  { 
 %    \end{macrocode}
 % It's important to use a |\tl_gput_right:cx| and not a |\tl_gput_left:cx|
 % because we want the |\Ddots| lines to be drawn in the order of appearance
 % in the array (for parallelisation).
 %    \begin{macrocode}
-        \tl_gput_right:cx 
-          { g_@@_ #1 _ lines _ tl }
-          { 
-            \use:c { @@ _ draw _ #1 : nnn }
-              { \int_use:N \c@iRow } 
-              { \int_use:N \c@jCol }
-              { \exp_not:n { #2 } } 
-          }
-      }  
-  }
+    \tl_gput_right:cx 
+      { g_@@_ #1 _ lines _ tl }
+      { 
+        \use:c { @@ _ draw _ #1 : nnn }
+          { \int_use:N \c@iRow } 
+          { \int_use:N \c@jCol }
+          { \exp_not:n { #2 } } 
+      }
+  }  
 %    \end{macrocode}
 %
 %  
@@ -4380,58 +4658,126 @@ version 2005/12/01 or later.
 % |\ialign| in the environment |{NiceArrayWithDelims}| but restore the standard
 % version for use in the cells of the array.
 %    \begin{macrocode}
-\cs_set_eq:NN \@@_standard_ialign: \ialign
+\cs_set_eq:NN \@@_old_ialign: \ialign
 %    \end{macrocode}
 % 
-% \bigskip
-% The following must \emph{not} be protected because it begins with |\noalign|. 
-%    \begin{macrocode}
-\cs_new:Npn \@@_everycr: { \noalign { \@@_everycr_i: } }
-%    \end{macrocode}
 %
+% The following command creates a |row| node (and not a row of nodes!).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_everycr_i:
-  { 
-    \int_gzero:N \c@jCol 
+\cs_new_protected:Npn \@@_create_row_node:
+  {
 %    \end{macrocode}
 % The |\hbox:n| (or |\hbox|) is mandatory.
 %    \begin{macrocode}
     \hbox
       {
+        \bool_if:NT \l_@@_code_before_bool
+          { 
+            \vtop
+              {
+                \skip_vertical:N 0.5\arrayrulewidth 
+                \pgfsys@markposition { \@@_env: - row - \@@_succ:n \c@iRow } 
+                \skip_vertical:N -0.5\arrayrulewidth 
+              }
+          }  
         \pgfpicture 
         \pgfrememberpicturepositiononpagetrue
         \pgfcoordinate { \@@_env: - row - \@@_succ:n \c@iRow }  
-          \pgfpointorigin 
+          { \pgfpoint \c_zero_dim { - 0.5 \arrayrulewidth } } 
         \str_if_empty:NF \l_@@_name_str
           {
             \pgfnodealias 
-              { \@@_env: - row - \int_use:N \c@iRow - row } 
-              { \l_@@_name_str - row - \int_use:N \c@iRow - row } 
+              { \l_@@_name_str - row - \int_use:N \c@iRow } 
+              { \@@_env: - row - \int_use:N \c@iRow } 
           }   
         \endpgfpicture  
-      }
+      }  
+  }
 %    \end{macrocode}
-% We add the potential horizontal lines specified by the option |hlines|.
+%
+% 
+%
+% \bigskip
+% The following must \emph{not} be protected because it begins with |\noalign|. 
+%    \begin{macrocode}
+\cs_new:Npn \@@_everycr: { \noalign { \@@_everycr_i: } }
+%    \end{macrocode}
+%
+%
 %    \begin{macrocode}
-    \bool_if:NT \l_@@_hlines_bool
+\cs_new_protected:Npn \@@_everycr_i:
+  { 
+    \int_gzero:N \c@jCol 
+    \bool_if:NF \g_@@_row_of_col_done_bool
       {
+        \@@_create_row_node:
+%    \end{macrocode}
+% We add the potential horizontal lines specified by the option |hlines|.
+%    \begin{macrocode}
+        \bool_if:NT \l_@@_hlines_bool
+          {
 %    \end{macrocode}
 % The counter |\c@iRow| has the value $-1$ only if there is a ``first
 % row'' and that we are before that ``first row'', i.e. just before the
 % beginning of the array. 
 %    \begin{macrocode}
-        \int_compare:nNnT \c@iRow > { -1 }
-          {
-            \bool_if:NF \g_@@_row_of_col_done_bool
+            \int_compare:nNnT \c@iRow > { -1 }
               {
                 \int_compare:nNnF \c@iRow = \l_@@_last_row_int 
-                  {
-                    \bool_if:NTF \c_@@_colortbl_loaded_bool
-                      { { \CT@arc@ \hrule height \arrayrulewidth } } 
-                      { \hrule height \arrayrulewidth } 
-                  }
-              }
+%    \end{macrocode}
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if
+% \pkg{colortbl} is not loaded. We use a TeX group in order to limit the scope
+% of |\CT@arc@|.
+%    \begin{macrocode}
+                  { { \CT@arc@ \hrule height \arrayrulewidth } }
+              } 
+          }
+      }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The command |\@@_newcolumntype| is the command |\newcolumntype| of
+% \pkg{array} without the warnings for redefinitions of columns types (we will
+% use it to redefine the columns types |w|, |W|, |p|, |m| and |b|).
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_newcolumntype #1
+  {
+    \cs_if_free:cT { NC @ find @ #1 }
+      { \NC@list \expandafter { \the \NC@list \NC@do #1 } }
+    \cs_set:cpn {NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
+    \peek_meaning:NTF [ 
+      { \newcol@ #1 }
+      { \newcol@ #1 [ 0 ] }
+  }
+%    \end{macrocode}
+% 
+%
+% \bigskip
+% The following command will be used to redefine the column types |p|, |m| and
+% |b|. That means that it will be used three times. The first argument is the
+% letter of the column type (|p|, |m| or |b|). The second is the letter of
+% position for the environment |{minipage}| (|t|, |c| or |b|).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_define_columntype:nn #1 #2
+  {
+%    \end{macrocode}
+% We don't want a warning for redefinition of the column type. That's why we use
+% |\@@_newcolumntype| and not |\newcolumntype|.
+%    \begin{macrocode}
+    \@@_newcolumntype #1 [ 1 ] 
+      { 
+        > { 
+            \@@_Cell: 
+            \begin { minipage } [ #2 ] { ##1 } 
+            \mode_leave_vertical: \box_use:N \@arstrutbox 
           } 
+%    \end{macrocode}
+% Here, we put |c| but we would have the result with |l| or |r|.
+%    \begin{macrocode}
+        c 
+        < { \box_use:N \@arstrutbox \end { minipage } \@@_end_Cell: } 
       }
   }
 %    \end{macrocode}
@@ -4444,12 +4790,26 @@ version 2005/12/01 or later.
 %   \begin{macrocode}
 \cs_new_protected:Npn \@@_pre_array:
   {
+%    \end{macrocode}
+% If \pkg{booktabs} is loaded, we have to patch the macro |\@BTnormal| which is
+% a macro of \pkg{booktabs}. The macro |\@BTnormal| draws an horizontal rule but
+% it occurs after a vertical skip done by a low level TeX command. When this
+% macro |\@BTnormal| occurs, the |row| node has yet been inserted by
+% \pkg{nicematrix} \emph{before} the vertical skip (and thus, at a wrong place).
+% That why we decide to create a new |row| node (for the same row). We patch the
+% macro |\@BTnormal| to create this |row| node. This new |row| node will
+% overwrite the previous definition of that |row| node and we have managed to
+% avoid the error messages of that redefinition
+% \footnote{cf. |\nicematrix@redefine@check@rerun|}.
+%    \begin{macrocode}
+    \bool_if:NT \c_@@_booktabs_loaded_bool
+      { \tl_put_left:Nn \@BTnormal \@@_create_row_node: }
     \box_clear_new:N \l_@@_cell_box
     \cs_if_exist:NT \theiRow
-      { \int_set_eq:NN \l_@@_save_iRow_int \c@iRow }
+      { \int_set_eq:NN \l_@@_old_iRow_int \c@iRow }
     \int_gzero_new:N \c@iRow
     \cs_if_exist:NT \thejCol
-      { \int_set_eq:NN \l_@@_save_jCol_int \c@jCol }
+      { \int_set_eq:NN \l_@@_old_jCol_int \c@jCol }
     \int_gzero_new:N \c@jCol
     \normalbaselines
 %    \end{macrocode}
@@ -4475,6 +4835,8 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
     \cs_set:Npn \ialign 
       { 
+        \bool_if:NT \l_@@_NiceTabular_bool 
+          { \dim_set_eq:NN \arraycolsep \@@_old_arraycolsep_dim }
         \bool_if:NTF \c_@@_colortbl_loaded_bool
           {
             \CT@everycr 
@@ -4513,31 +4875,24 @@ version 2005/12/01 or later.
 % After its first use, the definition of |\ialign| will revert
 % automatically to its default definition. With this programmation, we will
 % have, in the cells of the array, a clean version of |\ialign|.\footnote{The
-% user will probably not employ directly |\ialign| in the array...  but more
+% user will probably not use directly |\ialign| in the array...  but more
 % likely environments that utilize |\ialign| internally (e.g.: |{substack}|).}
 %    \begin{macrocode}
-        \cs_set_eq:NN \ialign \@@_standard_ialign:
+        \cs_set_eq:NN \ialign \@@_old_ialign:
         \halign 
       }
 %    \end{macrocode}
 %                                                   
-% We define the new column types |L|, |C| and |R| that must be used instead of
-% |l|, |c| and |r| in the preamble of |{NiceArray}|.
-%    \begin{macrocode}
-    \newcolumntype L { > \@@_Cell: l < \@@_end_Cell: }
-    \newcolumntype C { > \@@_Cell: c < \@@_end_Cell: }
-    \newcolumntype R { > \@@_Cell: r < \@@_end_Cell: }
-%    \end{macrocode}    
 % We keep in memory the old versions or |\ldots|, |\cdots|, etc. only because we
 % use them inside |\phantom| commands in order that the new commands |\Ldots|,
 % |\Cdots|, etc. give the same spacing (except when the option |nullify-dots| is
 % used). 
 %    \begin{macrocode}
-    \cs_set_eq:NN \@@_ldots \ldots
-    \cs_set_eq:NN \@@_cdots \cdots
-    \cs_set_eq:NN \@@_vdots \vdots
-    \cs_set_eq:NN \@@_ddots \ddots
-    \cs_set_eq:NN \@@_iddots \iddots
+    \cs_set_eq:NN \@@_old_ldots \ldots
+    \cs_set_eq:NN \@@_old_cdots \cdots
+    \cs_set_eq:NN \@@_old_vdots \vdots
+    \cs_set_eq:NN \@@_old_ddots \ddots
+    \cs_set_eq:NN \@@_old_iddots \iddots
     \cs_set_eq:NN \firsthline \hline
     \cs_set_eq:NN \lasthline \hline
     \cs_set_eq:NN \Ldots \@@_Ldots
@@ -4548,11 +4903,14 @@ version 2005/12/01 or later.
     \cs_set_eq:NN \hdottedline \@@_hdottedline:
     \cs_set_eq:NN \Hspace \@@_Hspace:
     \cs_set_eq:NN \Hdotsfor \@@_Hdotsfor:
+    \cs_set_eq:NN \Vdotsfor \@@_Vdotsfor:
     \cs_set_eq:NN \multicolumn \@@_multicolumn:nnn
     \cs_set_eq:NN \Block \@@_Block:
     \cs_set_eq:NN \rotate \@@_rotate:
     \cs_set_eq:NN \OnlyMainNiceMatrix \@@_OnlyMainNiceMatrix:n
+    \cs_set_eq:NN \dotfill \@@_dotfill:
     \cs_set_eq:NN \CodeAfter \@@_CodeAfter:n
+    \cs_set_eq:NN \slashbox \@@_slashbox:nn
     \bool_if:NT \l_@@_renew_dots_bool
       { 
         \cs_set_eq:NN \ldots \@@_Ldots
@@ -4604,14 +4962,31 @@ version 2005/12/01 or later.
     \cs_set_eq:NN \@ifnextchar \new@ifnextchar
 %    \end{macrocode}
 %
-% We nullify the definitions of the column types |w| and |W| before their
-% redefinition because we want to avoid a warning in the log file for a
-% redefinition of a column type. We must put |\relax| and not
-% |\prg_do_nothing:|.
+% \bigskip
+% We define the new column types |L|, |C| and |R| that must be used instead of
+% |l|, |c| and |r| in the preamble of |{NiceArray}|. We use |\@@_newcolumntype|
+% because it will be slightly quicker thant |\newcolumtype|.
+%    \begin{macrocode}
+    \@@_newcolumntype L { > \@@_Cell: l < \@@_end_Cell: }
+    \@@_newcolumntype C { > \@@_Cell: c < \@@_end_Cell: }
+    \@@_newcolumntype R { > \@@_Cell: r < \@@_end_Cell: }
+%    \end{macrocode}
+%
+% \bigskip
+% We redefine the column types |p|, |m| and |b|. The command
+% |\@@_define_columntype:nn| is only used here.
+%    \begin{macrocode}
+    \@@_define_columntype:nn p t
+    \@@_define_columntype:nn m c
+    \@@_define_columntype:nn b b
+%    \end{macrocode}    
+%
+% \bigskip
+% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead
+% of |\newcolumtype| because we don't want warnings for column types already
+% defined. 
 %    \begin{macrocode}
-    \cs_set_eq:NN \NC@find@w \relax
-    \cs_set_eq:NN \NC@find@W \relax
-    \newcolumntype w [ 2 ]
+    \@@_newcolumntype w [ 2 ]
       {
         > {
             \hbox_set:Nw \l_@@_cell_box
@@ -4630,7 +5005,7 @@ version 2005/12/01 or later.
                { \box_use_drop:N \l_@@_cell_box }  
           }
       }
-    \newcolumntype W [ 2 ]
+    \@@_newcolumntype W [ 2 ]
       {
         > {
             \hbox_set:Nw \l_@@_cell_box
@@ -4726,7 +5101,7 @@ version 2005/12/01 or later.
     \tl_gclear_new:N \g_@@_Vdots_lines_tl
     \tl_gclear_new:N \g_@@_Ddots_lines_tl
     \tl_gclear_new:N \g_@@_Iddots_lines_tl
-    \tl_gclear_new:N \g_@@_Hdotsfor_lines_tl
+    \tl_gclear_new:N \g_@@_HVdotsfor_lines_tl
  }
 %    \end{macrocode}
 % 
@@ -4742,7 +5117,9 @@ version 2005/12/01 or later.
     \str_if_empty:NT \g_@@_name_env_str 
       { \str_gset:Nn \g_@@_name_env_str { NiceArrayWithDelims } } 
     \@@_adapt_S_column:
-    \@@_test_if_math_mode:
+    \bool_if:NTF \l_@@_NiceTabular_bool 
+      \mode_leave_vertical:
+      \@@_test_if_math_mode:
     \bool_if:NT \l_@@_in_env_bool { \@@_fatal:n { Yet~in~env } } 
     \bool_set_true:N \l_@@_in_env_bool
 %    \end{macrocode}
@@ -4785,6 +5162,98 @@ version 2005/12/01 or later.
     { #3 , #5 } 
 %    \end{macrocode}
 % 
+% \bigskip
+% If the key |code-before| is used, we have to create the |col| nodes and the
+% |row| nodes before the creation of the array. First, we have to test whether
+% the size of the array has been written in the |aux| file in a previous run. In 
+% this case, a command |\@@_size_|{\slshape\ttfamily nb_of_env}|:| has been
+% created. 
+%    \begin{macrocode}
+    \bool_if:NT \l_@@_code_before_bool
+      { 
+        \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq }
+          { 
+%    \end{macrocode}
+% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that,
+% in the |code-before| (and in the |code-after|) they represent the numbers of
+% rows and columns of the array (without the potential last row and last column).
+%    \begin{macrocode}
+            \int_zero_new:N \c@iRow
+            \int_set:Nn \c@iRow
+              { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 }
+            \int_zero_new:N \c@jCol
+            \int_set:Nn \c@jCol
+              { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 }
+%    \end{macrocode}
+% We have to adjust the values of |\c@iRow| and |\c@jCol| to take into account
+% the potential last row and last column. A value of $-2$ for
+% |\l_@@_last_row_int| means that there is no last row. Idem for the columns.
+%    \begin{macrocode}
+            \int_compare:nNnF \l_@@_last_row_int = { -2 } 
+              { \int_decr:N \c@iRow } 
+            \int_compare:nNnF \l_@@_last_col_int = { -2 } 
+              { \int_decr:N \c@jCol } 
+%    \end{macrocode}
+%
+% Now, we will create all the |col| nodes and |row| nodes with the informations
+% written in the |aux| file. You use the technique described in the page~1229 of
+% |pgfmanual.pdf|, version~3.1.4b.
+%    \begin{macrocode}
+            \pgfsys@markposition { \@@_env: - position }
+            \pgfsys@getposition { \@@_env: - position } \@@_picture_position: 
+            \pgfpicture
+%    \end{macrocode}
+% First, the creation of the |row| nodes.
+%    \begin{macrocode}
+            \int_step_inline:nnn 
+              { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 1 }
+              { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 + 1 }
+              {
+                \pgfsys@getposition { \@@_env: - row - ##1 } \@@_node_position:
+                \pgfcoordinate { \@@_env: - row - ##1 }
+                  { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+              }
+%    \end{macrocode}
+% Now, the creation of the |col| nodes.
+%    \begin{macrocode}
+            \int_step_inline:nnn 
+              { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 3 }
+              { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 + 1 }
+              {
+                \pgfsys@getposition { \@@_env: - col - ##1 } \@@_node_position:
+                \pgfcoordinate { \@@_env: - col - ##1 }
+                  { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+              }
+            \endpgfpicture
+            \group_begin:
+              \bool_if:NT \c_@@_tikz_loaded_bool
+                {  
+%    \end{macrocode}
+% Be careful: we must \emph{not} put ``|remember picture|'' in the |\pgfset|.
+%    \begin{macrocode}
+                  \pgfset 
+                    { 
+                      every~picture / .style = 
+                       { overlay , name~prefix = \@@_env: - }
+                    }  
+                }  
+              \cs_set_eq:NN \cellcolor \@@_cellcolor:nn
+              \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor:nnn
+              \cs_set_eq:NN \rowcolor \@@_rowcolor:nn
+              \cs_set_eq:NN \rowcolors \@@_rowcolors:nnn
+              \cs_set_eq:NN \columncolor \@@_columncolor:nn
+              \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors:nn
+%    \end{macrocode}
+% We compose the |code-before| in math mode in order to nullify the spaces put
+% by the user between instructions in the |code-before|.
+%    \begin{macrocode}
+              \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
+              \l_@@_code_before_tl 
+              \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
+            \group_end:
+          }
+      }
+%    \end{macrocode}
 % 
 % A value of $-1$ for the counter |\l_@@_last_row_int| means that the user has
 % used the option |last-row| without value, that is to say without specifying
@@ -4897,6 +5366,7 @@ version 2005/12/01 or later.
         \bool_lazy_all:nT 
           { 
             \l_@@_NiceArray_bool 
+            { \bool_not_p:n \l_@@_NiceTabular_bool }
             { \bool_not_p:n \l_@@_vlines_bool } 
             { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
           }
@@ -4908,6 +5378,7 @@ version 2005/12/01 or later.
         \bool_lazy_all:nT
           { 
             \l_@@_NiceArray_bool 
+            { \bool_not_p:n \l_@@_NiceTabular_bool }
             { \bool_not_p:n \l_@@_vlines_bool }
             { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
           }
@@ -4921,6 +5392,22 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
     \hbox_set:Nw \l_@@_the_array_box
 %    \end{macrocode}
+% Here is a trick. We will call |\array| and, at the beginning, |\array| will set
+% |\col@sep| equal to the current value of |\arraycolsep|. In we are in an
+% environment |{NiceTabular}|, we would like that |\array| sets |\col@sep| equal
+% to the current value of |\tabcolsep|. That's why we set |\arraycolsep| equal
+% to |\tabcolsep|. However, the value of |\tabcolsep| in each cell of the array
+% should be equal to the current value of |\tabcolsep| outside |{NiceTabular}|.
+% That's why we save the current value of |\arraycolsep| and we will restore the
+% value just before the |\halign|. It's possible because we do a redefinition of
+% |\ialign| (see just below).
+%    \begin{macrocode}
+    \bool_if:NT \l_@@_NiceTabular_bool 
+      { 
+        \dim_set_eq:NN \@@_old_arraycolsep_dim \arraycolsep
+        \dim_set_eq:NN \arraycolsep \tabcolsep 
+      }
+%    \end{macrocode}
 % If the key |\vlines| is used, we increase |\arraycolsep| by
 % |0.5\arrayrulewidth| in order to reserve space for the width of the vertical
 % rules drawn with Tikz after the end of the array. However, the first
@@ -4932,12 +5419,16 @@ version 2005/12/01 or later.
         \dim_add:Nn \arraycolsep { 0.5 \arrayrulewidth } 
         \skip_horizontal:N  0.5\arrayrulewidth  
       }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
     \skip_horizontal:N \l_@@_left_margin_dim 
     \skip_horizontal:N \l_@@_extra_left_margin_dim 
     \c_math_toggle_token
     \bool_if:NTF \l_@@_light_syntax_bool
-      { \begin { @@-light-syntax } }
-      { \begin { @@-normal-syntax } } 
+      { \use:c { @@-light-syntax } }
+      { \use:c { @@-normal-syntax } }
   }
 %    \end{macrocode}
 %
@@ -4945,8 +5436,8 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
   {  
     \bool_if:NTF \l_@@_light_syntax_bool
-      { \end { @@-light-syntax } }
-      { \end { @@-normal-syntax } }
+      { \use:c { end @@-light-syntax } }
+      { \use:c { end @@-normal-syntax } }
     \c_math_toggle_token
     \skip_horizontal:N \l_@@_right_margin_dim 
     \skip_horizontal:N \l_@@_extra_right_margin_dim 
@@ -4964,7 +5455,7 @@ version 2005/12/01 or later.
 %
 % \bigskip
 % It the user has used the key |last-row| with a value, we control that the
-% given value is correct (since we have just contructed the array, we know the
+% given value is correct (since we have just constructed the array, we know the
 % real number of rows of the array).
 %    \begin{macrocode}
     \int_compare:nNnT \l_@@_last_row_int > { -2 }
@@ -5027,9 +5518,9 @@ version 2005/12/01 or later.
         \str_if_eq:VnTF \l_@@_baseline_str { b }
           { 
            \pgfpicture
-             \@@_qpoint: { row - 1 } 
+             \@@_qpoint:n { row - 1 } 
              \dim_gset_eq:NN \g_tmpa_dim \pgf@y
-             \@@_qpoint: { row - \int_use:N \c@iRow - base }
+             \@@_qpoint:n { row - \int_use:N \c@iRow - base }
              \dim_gsub:Nn \g_tmpa_dim \pgf@y
            \endpgfpicture
            \int_compare:nNnT \l_@@_first_row_int = 0 
@@ -5063,9 +5554,9 @@ version 2005/12/01 or later.
                     \int_set:Nn \l_tmpa_int 1
                   }
                 \pgfpicture
-                \@@_qpoint: { row - 1 } 
+                \@@_qpoint:n { row - 1 } 
                 \dim_gset_eq:NN \g_tmpa_dim \pgf@y
-                \@@_qpoint: { row - \int_use:N \l_tmpa_int - base }
+                \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
                 \dim_gsub:Nn \g_tmpa_dim \pgf@y
                 \endpgfpicture
                 \int_compare:nNnT \l_@@_first_row_int = 0 
@@ -5122,9 +5613,13 @@ version 2005/12/01 or later.
                 \skip_vertical:N -\l_tmpa_dim 
                 \hbox
                   {
-                    \skip_horizontal:N -\arraycolsep 
+                    \bool_if:NTF \l_@@_NiceTabular_bool
+                      { \skip_horizontal:N -\tabcolsep }
+                      { \skip_horizontal:N -\arraycolsep }
                     \box_use_drop:N \l_@@_the_array_box
-                    \skip_horizontal:N -\arraycolsep 
+                    \bool_if:NTF \l_@@_NiceTabular_bool
+                      { \skip_horizontal:N -\tabcolsep }
+                      { \skip_horizontal:N -\arraycolsep }
                   }
 %    \end{macrocode}
 % We take into account the ``last row'' (we have previously computed its total
@@ -5203,16 +5698,16 @@ version 2005/12/01 or later.
         \int_set:Nn \l_tmpa_int 1
       }
     \pgfpicture
-      \@@_qpoint: { row - 1 } 
+      \@@_qpoint:n { row - 1 } 
       \dim_gset_eq:NN \g_tmpa_dim \pgf@y
-      \@@_qpoint: { row - \@@_succ:n \c@iRow }
+      \@@_qpoint:n { row - \@@_succ:n \c@iRow }
       \dim_gadd:Nn \g_tmpa_dim \pgf@y
       \dim_gset:Nn \g_tmpa_dim { 0.5 \g_tmpa_dim }
 %    \end{macrocode}
 % Now, |\g_tmpa_dim| contains the $y$-value of the center of the array (the
 % delimiters are centered in relation with this value).
 %    \begin{macrocode}
-      \@@_qpoint: { row - \int_use:N \l_tmpa_int - base }
+      \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
       \dim_gsub:Nn \g_tmpa_dim \pgf@y
 %    \end{macrocode}
 % We take into account the position of the mathematical axis.
@@ -5314,6 +5809,7 @@ version 2005/12/01 or later.
 % \bigskip
 % When the key |light-syntax| is used, we use an environment which takes its whole
 % body as an argument (with the specifier |b| of \pkg{xparse}). 
+% % \label{code-light-syntax}
 %    \begin{macrocode}
 \NewDocumentEnvironment { @@-light-syntax } { b }
   { 
@@ -5331,8 +5827,31 @@ version 2005/12/01 or later.
           { \@@_fatal:n { double-backslash~in~light-syntax } }
       }
 %    \end{macrocode}
-% The body of the environment, which is stored in the argument |#1|, is now
-% splitted into items (and \emph{not} tokens) 
+% Now, you extract the |code-after| or the body of the environment. Maybe, there
+% is no command |\CodeAfter| in the body. That's why you put a marker
+% |\CodeAfter| after |#1|. If there is yet a |\CodeAfter| in |#1|, this second
+% (or third...) |\CodeAfter| will be catched in the value of
+% |\g_@@_code_after_tl|. That doesn't matter because |\CodeAfter| will be set to 
+% \textsl{no-op} before the execution of |\g_@@_code_after_tl|.
+%    \begin{macrocode}
+    \@@_light_syntax_i #1 \CodeAfter \q_stop
+  }
+%    \end{macrocode}
+% Now, the second part of the environment. It is empty. That's not surprising
+% because we have caught the whole body of the environment with the specifier
+% |b| provided by \pkg{xparse}.
+%    \begin{macrocode}
+  { }
+%    \end{macrocode}
+%
+% 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_light_syntax_i #1\CodeAfter #2\q_stop 
+  {
+    \tl_gput_right:Nn \g_@@_code_after_tl { #2 }
+%    \end{macrocode}
+% The body of the array, which is stored in the argument |#1|, is now
+% splitted into items (and \emph{not} tokens).
 %    \begin{macrocode}
     \seq_gclear_new:N \g_@@_rows_seq
     \tl_set_rescan:Nno \l_@@_end_of_row_tl { } \l_@@_end_of_row_tl
@@ -5361,11 +5880,10 @@ version 2005/12/01 or later.
     \endarray
   }
 %    \end{macrocode}
-% Now, the second part of the environment. It is empty. That's not surprising
-% because we have caught the whole body of the environment with the specifier
-% |b| provided by \pkg{xparse}.
+% 
 %    \begin{macrocode}
-  { }
+\cs_new_protected:Npn \@@_line_with_light_syntax:n #1
+  { \tl_if_empty:nF { #1 } { \\ \@@_line_with_light_syntax_i:n { #1 } } } 
 %    \end{macrocode}
 %
 %    \begin{macrocode}
@@ -5375,22 +5893,10 @@ version 2005/12/01 or later.
     \seq_gset_split:Nnn \g_@@_cells_seq { ~ } { #1 }
     \seq_gpop_left:NN \g_@@_cells_seq \l_tmpa_tl
     \l_tmpa_tl
-    \seq_map_function:NN \g_@@_cells_seq \@@_cell_with_light_syntax:n
+    \seq_map_inline:Nn \g_@@_cells_seq { & ##1 }
   }
 %    \end{macrocode}
-% 
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_line_with_light_syntax:n #1
-  { 
-    \tl_if_empty:nF { #1 }
-      { \\ \@@_line_with_light_syntax_i:n { #1 } }
-  } 
-%    \end{macrocode}
 %
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_cell_with_light_syntax:n #1 { & #1 }
-%    \end{macrocode}
-% 
 % \bigskip
 % The following command is used by the code which detects whether the
 % environment is empty (we raise a fatal error in this case: it's only a
@@ -5410,7 +5916,7 @@ version 2005/12/01 or later.
 %
 % \bigskip
 % The command |\@@_create_col_nodes:| will construct a special last row.
-% That last row is a false row used to create the |col|-nodes and to fix the
+% That last row is a false row used to create the |col| nodes and to fix the
 % width of the columns (when the array is constructed with an option which
 % specify the width of the columns).
 %    \begin{macrocode}
@@ -5421,12 +5927,14 @@ version 2005/12/01 or later.
     \int_compare:nNnT \l_@@_first_col_int = 0 
       { 
         \omit 
-        \skip_horizontal:N -2\arraycolsep
+        \skip_horizontal:N  -2\col@sep 
+        \bool_if:NT \l_@@_code_before_bool
+          { \pgfsys@markposition { \@@_env: - col - 0 } } 
         \pgfpicture 
         \pgfrememberpicturepositiononpagetrue
         \pgfcoordinate { \@@_env: - col - 0 } \pgfpointorigin 
         \str_if_empty:NF \l_@@_name_str
-          { \pgfnodealias { \@@_env: - col - 0 } { \l_@@_name_str - col - 0 } }  
+          { \pgfnodealias { \l_@@_name_str - col - 0 } { \@@_env: - col - 0 } }  
         \endpgfpicture
         & 
       }
@@ -5436,15 +5944,46 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
     \bool_gset_true:N \g_@@_row_of_col_done_bool
 %    \end{macrocode}
-% First, we put a ``|col|'' node on the left of the first column (of course, we
+% First, we put a |col| node on the left of the first column (of course, we
 % have to do that \emph{after} the |\omit|).
 %    \begin{macrocode}
-    \pgfpicture 
-    \pgfrememberpicturepositiononpagetrue
-    \pgfcoordinate { \@@_env: - col - 1 } \pgfpointorigin 
-    \str_if_empty:NF \l_@@_name_str
-      { \pgfnodealias { \@@_env: - col - 1 } { \l_@@_name_str - col - 1 } }  
-    \endpgfpicture
+    \int_compare:nNnTF \l_@@_first_col_int = 0 
+      {
+        \bool_if:NT \l_@@_code_before_bool
+          { 
+            \hbox
+              {
+                \skip_horizontal:N -0.5\arrayrulewidth 
+                \pgfsys@markposition { \@@_env: - col - 1 } 
+                \skip_horizontal:N 0.5\arrayrulewidth 
+              }
+          } 
+        \pgfpicture 
+        \pgfrememberpicturepositiononpagetrue
+        \pgfcoordinate { \@@_env: - col - 1 } 
+          { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim } 
+        \str_if_empty:NF \l_@@_name_str
+          { \pgfnodealias { \l_@@_name_str - col - 1 } { \@@_env: - col - 1 } }  
+        \endpgfpicture
+      }
+      {
+        \bool_if:NT \l_@@_code_before_bool
+          { 
+            \hbox
+              {
+                \skip_horizontal:N 0.5 \arrayrulewidth
+                \pgfsys@markposition { \@@_env: - col - 1 } 
+                \skip_horizontal:N -0.5\arrayrulewidth 
+              }
+          } 
+        \pgfpicture 
+        \pgfrememberpicturepositiononpagetrue
+        \pgfcoordinate { \@@_env: - col - 1 } 
+          { \pgfpoint { 0.5 \arrayrulewidth } \c_zero_dim }       
+        \str_if_empty:NF \l_@@_name_str
+          { \pgfnodealias { \l_@@_name_str - col - 1 } { \@@_env: - col - 1 } }  
+        \endpgfpicture
+      }
 %    \end{macrocode}
 % We compute in |\g_tmpa_skip| the common width of the columns (it's a skip and
 % not a dimension). We use a global variable because we are in a cell of an
@@ -5465,16 +6004,26 @@ version 2005/12/01 or later.
           { \bool_not_p:n \l_@@_block_auto_columns_width_bool }
           { \skip_gset_eq:NN \g_tmpa_skip \g_@@_max_cell_width_dim } 
           { \skip_gset_eq:NN \g_tmpa_skip \l_@@_columns_width_dim } 
-        \skip_gadd:Nn \g_tmpa_skip { 2 \arraycolsep } 
+        \skip_gadd:Nn \g_tmpa_skip { 2 \col@sep } 
       }
     \skip_horizontal:N \g_tmpa_skip
     \hbox
       { 
+        \bool_if:NT \l_@@_code_before_bool
+          { 
+            \hbox
+              {
+                \skip_horizontal:N -0.5\arrayrulewidth 
+                \pgfsys@markposition { \@@_env: - col - 2 } 
+                \skip_horizontal:N 0.5\arrayrulewidth 
+              }
+          }   
         \pgfpicture 
         \pgfrememberpicturepositiononpagetrue
-        \pgfcoordinate { \@@_env: - col - 2 } \pgfpointorigin 
+        \pgfcoordinate { \@@_env: - col - 2 } 
+          { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim } 
         \str_if_empty:NF \l_@@_name_str
-          { \pgfnodealias { \@@_env: - col - 2 } { \l_@@_name_str - col - 2 } } 
+          { \pgfnodealias { \l_@@_name_str - col - 2 } { \@@_env: - col - 2 } } 
         \endpgfpicture
       }
 %    \end{macrocode}
@@ -5486,32 +6035,45 @@ version 2005/12/01 or later.
       { \prg_replicate:nn { \g_@@_col_total_int - 2 } }
       { \prg_replicate:nn { \g_@@_col_total_int - 1 } }
       { 
-         & 
-         \omit
+        & 
+        \omit
 %    \end{macrocode}
 % The incrementation of the counter |\g_tmpa_int| must be done after the |\omit|
 % of the cell.
 %    \begin{macrocode}
-         \int_gincr:N \g_tmpa_int 
-         \skip_horizontal:N \g_tmpa_skip
+        \int_gincr:N \g_tmpa_int 
+        \skip_horizontal:N \g_tmpa_skip
+        \bool_if:NT \l_@@_code_before_bool
+          { 
+            \hbox
+              {
+                \skip_horizontal:N -0.5\arrayrulewidth
+                \pgfsys@markposition { \@@_env: - col - \@@_succ:n \g_tmpa_int } 
+                \skip_horizontal:N 0.5\arrayrulewidth 
+              }
+          }   
 %    \end{macrocode}
-% We create the ``|col|'' node on the right of the current column.
+% We create the |col| node on the right of the current column.
 %    \begin{macrocode}
-         \pgfpicture
-           \pgfrememberpicturepositiononpagetrue
-           \pgfcoordinate { \@@_env: - col - \@@_succ:n \g_tmpa_int } 
-             \pgfpointorigin 
-           \str_if_empty:NF \l_@@_name_str
-             {
-               \pgfnodealias 
-                 { \@@_env: - col - \@@_succ:n \g_tmpa_int } 
-                 { \l_@@_name_str - col - \@@_succ:n \g_tmpa_int }
-             }   
-         \endpgfpicture  
+        \pgfpicture
+          \pgfrememberpicturepositiononpagetrue
+          \pgfcoordinate { \@@_env: - col - \@@_succ:n \g_tmpa_int } 
+            { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim } 
+          \str_if_empty:NF \l_@@_name_str
+            {
+              \pgfnodealias 
+                { \l_@@_name_str - col - \@@_succ:n \g_tmpa_int }
+                { \@@_env: - col - \@@_succ:n \g_tmpa_int } 
+            }   
+        \endpgfpicture  
       }
     \bool_if:NT \g_@@_last_col_found_bool
       {
-        \skip_horizontal:N 2\arraycolsep
+        \bool_if:NT \l_@@_code_before_bool
+          { 
+            \pgfsys@markposition { \@@_env: - col - \@@_succ:n \g_@@_col_total_int }
+          } 
+        \skip_horizontal:N 2\col@sep
         \pgfpicture 
         \pgfrememberpicturepositiononpagetrue
         \pgfcoordinate { \@@_env: - col - \@@_succ:n \g_@@_col_total_int } 
@@ -5519,11 +6081,11 @@ version 2005/12/01 or later.
         \str_if_empty:NF \l_@@_name_str
           { 
             \pgfnodealias 
-              { \@@_env: - col - \@@_succ:n \g_@@_col_total_int } 
               { \l_@@_name_str - col - \@@_succ:n \g_@@_col_total_int } 
+              { \@@_env: - col - \@@_succ:n \g_@@_col_total_int } 
           }  
         \endpgfpicture
-        \skip_horizontal:N -2\arraycolsep
+        \skip_horizontal:N -2\col@sep
       }
     \cr
   }
@@ -5544,7 +6106,7 @@ version 2005/12/01 or later.
 % have to compute some dimensions of this box.
 %    \begin{macrocode}
         \hbox_set:Nw \l_@@_cell_box 
-        \c_math_toggle_token
+        \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token
         \bool_if:NT \l_@@_small_bool \scriptstyle
 %    \end{macrocode}
 % We insert |\l_@@_code_for_first_col_tl|... but we don't insert it in the
@@ -5569,7 +6131,7 @@ version 2005/12/01 or later.
     l
     < 
       { 
-        \c_math_toggle_token
+        \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token
         \hbox_set_end:
         \@@_update_for_first_and_last_row:
 %    \end{macrocode}
@@ -5591,7 +6153,7 @@ version 2005/12/01 or later.
             \skip_horizontal:N \l_@@_left_margin_dim 
             \skip_horizontal:N \l_@@_extra_left_margin_dim
           }
-        \skip_horizontal:N -2\arraycolsep 
+        \skip_horizontal:N -2\col@sep 
       }
   }
 %    \end{macrocode}
@@ -5616,7 +6178,7 @@ version 2005/12/01 or later.
 % have to compute some dimensions of this box.
 %    \begin{macrocode}
         \hbox_set:Nw \l_@@_cell_box 
-          \c_math_toggle_token
+          \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token
           \bool_if:NT \l_@@_small_bool \scriptstyle 
 %    \end{macrocode}
 % We insert |\l_@@_code_for_last_col_tl|... but we don't insert it in the
@@ -5636,7 +6198,7 @@ version 2005/12/01 or later.
     l
     < 
       { 
-        \c_math_toggle_token
+        \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token
         \hbox_set_end:
         \@@_update_for_first_and_last_row:
 %    \end{macrocode}
@@ -5645,7 +6207,7 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
         \dim_gset:Nn \g_@@_width_last_col_dim
           { \dim_max:nn \g_@@_width_last_col_dim { \box_wd:N \l_@@_cell_box } }
-        \skip_horizontal:N -2\arraycolsep 
+        \skip_horizontal:N -2\col@sep 
 %    \end{macrocode}
 % The content of the cell is inserted in an overlapping position.
 % \label{overlap-right}
@@ -5758,14 +6320,14 @@ version 2005/12/01 or later.
         \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
         \exp_args:Nnx \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl 
       }
-      { \end { #1 NiceArray } }
+      { \use:c { end #1 NiceArray } }
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_begin_of_NiceMatrix:nn #1 #2
   {
-    \begin { #1 NiceArray } 
+    \use:c { #1 NiceArray } 
       { 
         * 
           { 
@@ -5787,8 +6349,18 @@ version 2005/12/01 or later.
 \@@_define_env:n V
 %    \end{macrocode}
 %
+% \bigskip
+% \subsection*{The environment \{NiceTabular\}}
+%    \begin{macrocode}
+\NewDocumentEnvironment { NiceTabular } { O { } m ! O { } }
+  { 
+    \keys_set:nn { NiceMatrix / NiceTabular } { #1 , #3 }
+    \bool_set_true:N \l_@@_NiceTabular_bool 
+    \NiceArray { #2 }
+  }
+  { \endNiceArray }
+%    \end{macrocode}
 % 
-%
 % 
 % \bigskip
 % \subsection*{After the construction of the array}
@@ -5873,7 +6445,38 @@ version 2005/12/01 or later.
       }
 %    \end{macrocode}
 % 
-%
+% If the key |code-before| is used, we have to write on the |aux| file the actual
+% size of the array.
+%    \begin{macrocode}
+    \bool_if:NT \l_@@_code_before_bool
+      {
+        \iow_now:Nn \@mainaux \ExplSyntaxOn
+        \iow_now:Nx \@mainaux
+          { \seq_clear_new:c { @@_size _ \int_use:N \g_@@_env_int _ seq } }
+        \iow_now:Nx \@mainaux
+          {
+            \seq_gset_from_clist:cn { @@_size _ \int_use:N \g_@@_env_int _ seq }
+              { 
+                \int_use:N \l_@@_first_row_int , 
+                \int_use:N \g_@@_row_total_int ,
+                \int_use:N \l_@@_first_col_int ,
+%    \end{macrocode}
+% If the user has used a key |last-row| in an environment with preamble (like
+% |{pNiceArray}|) and that that last row has not been found, we have to
+% increment the value because it will be decreased when used in the |code-before|.
+%    \begin{macrocode}
+                \bool_lazy_and:nnTF
+                  { \int_compare_p:nNn \l_@@_last_col_int > { -2 } }
+                  { \bool_not_p:n \g_@@_last_col_found_bool }
+                  \@@_succ:n 
+                  \int_use:N 
+                \g_@@_col_total_int 
+              }
+          }   
+        \iow_now:Nn \@mainaux \ExplSyntaxOff
+      } 
+%    \end{macrocode}
+% 
 % By default, the diagonal lines will be parallelized\footnote{It's possible to
 % use the option |parallelize-diags| to disable this parallelization.}. There
 % are two types of diagonals lines: the $|\Ddots|$ diagonals and the |\Iddots|
@@ -5936,7 +6539,7 @@ version 2005/12/01 or later.
 %
 %
 % \bigskip
-% Now, we really draw the lines. 
+% Now, we really draw the dotted lines. 
 %    \begin{macrocode}
     \@@_draw_dotted_lines:
 %    \end{macrocode}
@@ -5950,7 +6553,7 @@ version 2005/12/01 or later.
     \tl_gclear:N \g_@@_internal_code_after_tl
     \bool_if:NT \c_@@_tikz_loaded_bool
       {  
-        \tikzset 
+        \tikzset
           { 
             every~picture / .style = 
               { 
@@ -5961,6 +6564,16 @@ version 2005/12/01 or later.
           }  
       }
     \cs_set_eq:NN \line \@@_line
+%    \end{macrocode}
+% When |light-syntax| is used, we insert systematically a |\CodeAfter| in the
+% flow. Thus, it's possible to have two instructions |\CodeAfter| and the second
+% one is eventually present in |\g_@@_code_after_tl|. That's why we set
+% |\Code-after| to be \textsl{no-op} now.
+%    \begin{macrocode}
+    \cs_set_eq:NN \CodeAfter \prg_do_nothing:
+%    \end{macrocode}
+% And here's the |code-after|:
+%    \begin{macrocode}
     \g_@@_code_after_tl 
     \tl_gclear:N \g_@@_code_after_tl
     \group_end:
@@ -5994,7 +6607,7 @@ version 2005/12/01 or later.
   {
     \pgfrememberpicturepositiononpagetrue
     \pgf@relevantforpicturesizefalse
-    \g_@@_Hdotsfor_lines_tl
+    \g_@@_HVdotsfor_lines_tl
     \g_@@_Vdots_lines_tl
     \g_@@_Ddots_lines_tl
     \g_@@_Iddots_lines_tl
@@ -6007,8 +6620,8 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_restore_iRow_jCol:
   {
-    \cs_if_exist:NT \theiRow { \int_gset_eq:NN \c@iRow \l_@@_save_iRow_int } 
-    \cs_if_exist:NT \thejCol { \int_gset_eq:NN \c@jCol \l_@@_save_jCol_int } 
+    \cs_if_exist:NT \theiRow { \int_gset_eq:NN \c@iRow \l_@@_old_iRow_int } 
+    \cs_if_exist:NT \thejCol { \int_gset_eq:NN \c@jCol \l_@@_old_jCol_int } 
   }
 %    \end{macrocode}
 %
@@ -6239,10 +6852,6 @@ version 2005/12/01 or later.
 % 
 % \medskip
 %    \begin{macrocode}
-\cs_new:Nn \@@_initial_cell: 
-  { \@@_env: - \int_use:N \l_@@_initial_i_int - \int_use:N \l_@@_initial_j_int }  
-\cs_new:Nn \@@_final_cell: 
-  { \@@_env: - \int_use:N \l_@@_final_i_int - \int_use:N \l_@@_final_j_int }  
 \cs_new_protected:Npn \@@_set_initial_coords:
   { 
     \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
@@ -6255,12 +6864,24 @@ version 2005/12/01 or later.
   }
 \cs_new_protected:Npn \@@_set_initial_coords_from_anchor:n #1
   {
-    \pgfpointanchor \@@_initial_cell: { #1 } 
+    \pgfpointanchor 
+      { 
+        \@@_env: 
+        - \int_use:N \l_@@_initial_i_int 
+        - \int_use:N \l_@@_initial_j_int 
+      }   
+      { #1 } 
     \@@_set_initial_coords:
   }
 \cs_new_protected:Npn \@@_set_final_coords_from_anchor:n #1
   {
-    \pgfpointanchor \@@_final_cell: { #1 } 
+    \pgfpointanchor 
+      { 
+        \@@_env: 
+        - \int_use:N \l_@@_final_i_int 
+        - \int_use:N \l_@@_final_j_int 
+      }   
+      { #1 } 
     \@@_set_final_coords:
   }
 %    \end{macrocode}
@@ -6317,25 +6938,28 @@ version 2005/12/01 or later.
   { 
     \bool_if:NTF \l_@@_initial_open_bool
       {
-        \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+        \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
         \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x 
-        \dim_add:Nn \l_@@_x_initial_dim \arraycolsep 
-        \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int - base }
+        \dim_add:Nn \l_@@_x_initial_dim 
+           { \bool_if:NTF \l_@@_NiceTabular_bool \tabcolsep \arraycolsep } 
+        \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int - base }
         \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
       }
       { \@@_set_initial_coords_from_anchor:n { base~east } }
     \bool_if:NTF \l_@@_final_open_bool
       {
-        \@@_qpoint: { col - \@@_succ:n \l_@@_final_j_int }
+        \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int }
         \dim_set_eq:NN \l_@@_x_final_dim \pgf@x 
-        \dim_sub:Nn \l_@@_x_final_dim \arraycolsep 
-        \@@_qpoint: { row - \int_use:N \l_@@_final_i_int - base }
+        \dim_sub:Nn \l_@@_x_final_dim 
+           { \bool_if:NTF \l_@@_NiceTabular_bool \tabcolsep \arraycolsep } 
+        \@@_qpoint:n { row - \int_use:N \l_@@_final_i_int - base }
         \dim_set_eq:NN \l_@@_y_final_dim \pgf@y
       }
       { \@@_set_final_coords_from_anchor:n { base~west } } 
 %    \end{macrocode}
 % We raise the line of a quantity equal to the radius of the dots because we
-% want the dots really ``on'' the line of texte.
+% want the dots really ``on'' the line of texte. Of course, maybe we should not
+% do that when the option |line-style| is used (?).
 %    \begin{macrocode}
     \dim_add:Nn \l_@@_y_initial_dim \l_@@_radius_dim
     \dim_add:Nn \l_@@_y_final_dim \l_@@_radius_dim
@@ -6393,25 +7017,27 @@ version 2005/12/01 or later.
   {
     \bool_if:NTF \l_@@_initial_open_bool
       { 
-        \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int } 
+        \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int } 
         \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x 
-        \dim_add:Nn \l_@@_x_initial_dim \arraycolsep 
+        \dim_add:Nn \l_@@_x_initial_dim 
+           { \bool_if:NTF \l_@@_NiceTabular_bool \tabcolsep \arraycolsep } 
       }
       { \@@_set_initial_coords_from_anchor:n { mid~east } }
     \bool_if:NTF \l_@@_final_open_bool
       { 
-        \@@_qpoint: { col - \@@_succ:n \l_@@_final_j_int }
+        \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int }
         \dim_set_eq:NN \l_@@_x_final_dim \pgf@x 
-        \dim_sub:Nn \l_@@_x_final_dim \arraycolsep 
+        \dim_sub:Nn \l_@@_x_final_dim 
+           { \bool_if:NTF \l_@@_NiceTabular_bool \tabcolsep \arraycolsep } 
       }
       { \@@_set_final_coords_from_anchor:n { mid~west } }
     \bool_lazy_and:nnTF
       \l_@@_initial_open_bool 
       \l_@@_final_open_bool 
       {
-        \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int }
+        \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
         \dim_set_eq:NN \l_tmpa_dim \pgf@y
-        \@@_qpoint: { row - \@@_succ:n \l_@@_initial_i_int }
+        \@@_qpoint:n { row - \@@_succ:n \l_@@_initial_i_int }
         \dim_set:Nn \l_@@_y_initial_dim { ( \l_tmpa_dim + \pgf@y ) / 2 } 
         \dim_set_eq:NN \l_@@_y_final_dim \l_@@_y_initial_dim
       }     
@@ -6464,6 +7090,8 @@ version 2005/12/01 or later.
 % \item |\l_@@_final_j_int| 
 % \item |\l_@@_final_open_bool|. 
 % \end{itemize}
+%
+% The following function is also used by |\Vdotsfor|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_actually_draw_Vdots:
   {
@@ -6485,13 +7113,13 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
     \bool_if:NTF \l_@@_initial_open_bool
       { 
-        \@@_qpoint: { row - 1 }
+        \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
         \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
       }
       { \@@_set_initial_coords_from_anchor:n { south } }
     \bool_if:NTF \l_@@_final_open_bool
       { 
-        \@@_qpoint: { row - \@@_succ:n \c@iRow }
+        \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int }
         \dim_set_eq:NN \l_@@_y_final_dim \pgf@y 
       }
       { \@@_set_final_coords_from_anchor:n { north } }     
@@ -6499,11 +7127,27 @@ version 2005/12/01 or later.
       {
         \bool_if:NTF \l_@@_final_open_bool
           {
-            \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+            \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
             \dim_set_eq:NN \l_tmpa_dim \pgf@x
-            \@@_qpoint: { col - \@@_succ:n \l_@@_initial_j_int }
+            \@@_qpoint:n { col - \@@_succ:n \l_@@_initial_j_int }
             \dim_set:Nn \l_@@_x_initial_dim { ( \pgf@x + \l_tmpa_dim ) / 2 } 
             \dim_set_eq:NN \l_@@_x_final_dim \l_@@_x_initial_dim
+%    \end{macrocode}
+% We may think that the final user won't use a ``last column'' which contains
+% only a command |\Vdots|. However, if the |\Vdots| is in fact used to draw, not
+% a dotted line, but an arrow (to indicate the number of rows of the matrix), it
+% may be really encountered.
+%    \begin{macrocode}
+            \int_compare:nNnT \l_@@_last_col_int > { -2 }
+              {
+                \int_compare:nNnT \l_@@_initial_j_int = \g_@@_col_total_int
+                  {
+                    \dim_set_eq:NN \l_tmpa_dim \l_@@_right_margin_dim
+                    \dim_add:Nn \l_tmpa_dim \l_@@_extra_right_margin_dim
+                    \dim_add:Nn \l_@@_x_initial_dim \l_tmpa_dim
+                    \dim_add:Nn \l_@@_x_final_dim \l_tmpa_dim
+                  } 
+              }
           }
           { \dim_set_eq:NN \l_@@_x_initial_dim \l_@@_x_final_dim }
       }
@@ -6574,17 +7218,17 @@ version 2005/12/01 or later.
   {
     \bool_if:NTF \l_@@_initial_open_bool
       {
-        \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int }
+        \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
         \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
-        \@@_qpoint: { col - \int_use:N \l_@@_initial_j_int }
+        \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
         \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
       }
       { \@@_set_initial_coords_from_anchor:n { south~east } }
     \bool_if:NTF \l_@@_final_open_bool
       {
-        \@@_qpoint: { row - \@@_succ:n \l_@@_final_i_int }
+        \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int }
         \dim_set_eq:NN \l_@@_y_final_dim \pgf@y
-        \@@_qpoint: { col - \@@_succ:n \l_@@_final_j_int }
+        \@@_qpoint:n { col - \@@_succ:n \l_@@_final_j_int }
         \dim_set_eq:NN \l_@@_x_final_dim \pgf@x
       }
       { \@@_set_final_coords_from_anchor:n { north~west } }     
@@ -6671,17 +7315,17 @@ version 2005/12/01 or later.
   {
     \bool_if:NTF \l_@@_initial_open_bool
       {
-        \@@_qpoint: { row - \int_use:N \l_@@_initial_i_int }
+        \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
         \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
-        \@@_qpoint: { col - \@@_succ:n \l_@@_initial_j_int }
+        \@@_qpoint:n { col - \@@_succ:n \l_@@_initial_j_int }
         \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
       }
       { \@@_set_initial_coords_from_anchor:n { south~west } }
     \bool_if:NTF \l_@@_final_open_bool
       {
-        \@@_qpoint: { row - \@@_succ:n \l_@@_final_i_int }
+        \@@_qpoint:n { row - \@@_succ:n \l_@@_final_i_int }
         \dim_set_eq:NN \l_@@_y_final_dim \pgf@y
-        \@@_qpoint: { col - \int_use:N \l_@@_final_j_int }
+        \@@_qpoint:n { col - \int_use:N \l_@@_final_j_int }
         \dim_set_eq:NN \l_@@_x_final_dim \pgf@x
       }
       { \@@_set_final_coords_from_anchor:n { north~east } } 
@@ -7015,8 +7659,19 @@ version 2005/12/01 or later.
       { 
         \bool_if:nTF { #1 } 
           { \@@_error:n { starred~commands } }
-          { \@@_instruction_of_type:nn { Ldots } { #2 , down = #3 , up = #4 } }  
-        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_ldots }
+          { 
+            \int_compare:nNnTF \c@jCol = 0 
+              { \@@_error:nn { in~first~col } \Ldots }
+              { 
+                \int_compare:nNnTF \c@jCol = \l_@@_last_col_int
+                  { \@@_error:nn { in~last~col } \Ldots }
+                  { 
+                     \@@_instruction_of_type:nn { Ldots } 
+                       { #2 , down = #3 , up = #4 } 
+                  }  
+              }
+          }
+        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_old_ldots }
         \bool_gset_true:N \g_@@_empty_cell_bool
       } 
 %    \end{macrocode}
@@ -7027,8 +7682,19 @@ version 2005/12/01 or later.
       { 
         \bool_if:nTF { #1 } 
           { \@@_error:n { starred~commands } }
-          { \@@_instruction_of_type:nn { Cdots } { #2 , down = #3 , up = #4 } }
-        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_cdots }
+          { 
+            \int_compare:nNnTF \c@jCol = 0 
+              { \@@_error:nn { in~first~col } \Cdots }
+              { 
+                \int_compare:nNnTF \c@jCol = \l_@@_last_col_int
+                  { \@@_error:nn { in~last~col } \Cdots }
+                  { 
+                     \@@_instruction_of_type:nn { Cdots } 
+                       { #2 , down = #3 , up = #4 } 
+                  }  
+              }
+          }
+        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_old_cdots }
         \bool_gset_true:N \g_@@_empty_cell_bool
       } 
 %    \end{macrocode}
@@ -7039,8 +7705,17 @@ version 2005/12/01 or later.
       {
         \bool_if:nTF { #1 } 
           { \@@_error:n { starred~commands } }
-          { \@@_instruction_of_type:nn { Vdots } { #2 , down = #3 , up = #4 } }
-        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_vdots }
+            \int_compare:nNnTF \c@iRow = 0 
+              { \@@_error:nn { in~first~row } \Vdots }
+              { 
+                \int_compare:nNnTF \c@iRow = \l_@@_last_row_int
+                  { \@@_error:nn { in~last~row } \Vdots }
+                  { 
+                     \@@_instruction_of_type:nn { Vdots } 
+                       { #2 , down = #3 , up = #4 } 
+                  }  
+              }
+        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_old_vdots }
         \bool_gset_true:N \g_@@_empty_cell_bool
       } 
 %    \end{macrocode}
@@ -7051,8 +7726,26 @@ version 2005/12/01 or later.
       { 
         \bool_if:nTF { #1 } 
           { \@@_error:n { starred~commands } }
-          { \@@_instruction_of_type:nn { Ddots } { #2 , down = #3 , up = #4 } }
-        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_ddots }
+          { 
+            \int_case:nnF \c@iRow
+              {
+                0                  { \@@_error:nn { in~first~row } \Ddots } 
+                \l_@@_last_row_int { \@@_error:nn { in~last~row } \Ddots }
+              }
+              { 
+                \int_case:nnF \c@jCol
+                  {
+                    0                  { \@@_error:nn { in~first~col } \Ddots }  
+                    \l_@@_last_col_int { \@@_error:nn { in~last~col } \Ddots }  
+                  }
+                  {
+                    \@@_instruction_of_type:nn { Ddots } 
+                      { #2 , down = #3 , up = #4 } 
+                  } 
+       
+              }
+          }          
+        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_old_ddots }
         \bool_gset_true:N \g_@@_empty_cell_bool
       } 
 %    \end{macrocode}
@@ -7063,8 +7756,26 @@ version 2005/12/01 or later.
       { 
         \bool_if:nTF { #1 } 
           { \@@_error:n { starred~commands } }
-          { \@@_instruction_of_type:nn { Iddots } { #2 , down = #3 , up = #4 } }
-        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_iddots }
+          { 
+            \int_case:nnF \c@iRow
+              {
+                0                  { \@@_error:nn { in~first~row } \Iddots } 
+                \l_@@_last_row_int { \@@_error:nn { in~last~row } \Iddots }
+              }
+              { 
+                \int_case:nnF \c@jCol
+                  {
+                    0                  { \@@_error:nn { in~first~col } \Iddots }  
+                    \l_@@_last_col_int { \@@_error:nn { in~last~col } \Iddots }  
+                  }
+                  {
+                    \@@_instruction_of_type:nn { Iddots } 
+                      { #2 , down = #3 , up = #4 } 
+                  } 
+       
+              }
+          }          
+        \bool_if:NF \l_@@_nullify_dots_bool { \phantom \@@_old_iddots }
         \bool_gset_true:N \g_@@_empty_cell_bool
       } 
   }
@@ -7095,7 +7806,7 @@ version 2005/12/01 or later.
     \int_compare:nNnT #1 > 1
       {
         \seq_gput_left:Nx \g_@@_multicolumn_cells_seq
-          { \int_eval:n \c@iRow - \int_use:N \c@jCol }
+          { \int_use:N \c@iRow - \int_use:N \c@jCol }
         \seq_gput_left:Nn \g_@@_multicolumn_sizes_seq { #1 } 
       }
     \int_gadd:Nn \c@jCol { #1 - 1 }
@@ -7105,11 +7816,8 @@ version 2005/12/01 or later.
 %
 % \bigskip
 % The command |\@@_Hdotsfor| will be linked to |\Hdotsfor| in
-% |{NiceArrayWithDelims}|. This command uses an optional argument (as does
-% |\hdotsfor|) but this argument is discarded (in |\hdotsfor|, this argument is 
-% used for fine tuning of the space between two consecutive dots). Tikz nodes
-% are created also the implicit cells of the |\Hdotsfor| (maybe we should modify
-% that point).
+% |{NiceArrayWithDelims}|. Tikz nodes are created also in the implicit cells of
+% the |\Hdotsfor| (maybe we should modify that point).
 %
 % \medskip
 % This command must \emph{not} be protected since it begins with |\multicolumn|. 
@@ -7121,12 +7829,6 @@ version 2005/12/01 or later.
   }
 %    \end{macrocode}
 %
-%    \begin{macrocode}
-\ExplSyntaxOff
-\def \@tempa  { O { } m O { } E { _ ^ } { { } { } } }
-\ExplSyntaxOn
-\tl_set_eq:NN \l_@@_a_signature_tl \@tempa
-%    \end{macrocode}
 %
 % The command |\@@_Hdotsfor_i| is defined with the tools of \pkg{xparse} because
 % it has an optional argument. Note that such a command defined by
@@ -7137,28 +7839,24 @@ version 2005/12/01 or later.
   {
     \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } }
     \tl_set_rescan:Nno  \l_@@_argspec_tl { } \l_@@_argspec_tl
-    \bool_if:NTF \c_@@_draft_bool
-      {  
 %    \end{macrocode}
 % We don't put |!| before the last optionnal argument for homogeneity with
 % |\Cdots|, etc. which have only one optional argument.
 %    \begin{macrocode}
-        \exp_args:NNV \NewDocumentCommand \@@_Hdotsfor_i \l_@@_argspec_tl 
-          { \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { C } { } } } 
-      }
+    \exp_args:NNV \NewDocumentCommand \@@_Hdotsfor_i \l_@@_argspec_tl
       {
-        \exp_args:NNV \NewDocumentCommand \@@_Hdotsfor_i \l_@@_argspec_tl
+        \tl_gput_right:Nx \g_@@_HVdotsfor_lines_tl
           {
-            \tl_gput_right:Nx \g_@@_Hdotsfor_lines_tl
-              {
-                \@@_Hdotsfor:nnnn 
-                  { \int_use:N \c@iRow } 
-                  { \int_use:N \c@jCol } 
-                  { #2 }  
-                  { #1 , #3 , down = #4 , up = #5 }
-              }
-            \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { C } { } }
-          } 
+            \@@_Hdotsfor:nnnn 
+              { \int_use:N \c@iRow } 
+              { \int_use:N \c@jCol } 
+              { #2 }  
+              { 
+                #1 , #3 , 
+                down = \exp_not:n { #4 } , up = \exp_not:n { #5 }
+              } 
+          }
+        \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { C } { } }
       } 
   }
 %    \end{macrocode}
@@ -7240,11 +7938,111 @@ version 2005/12/01 or later.
       { \cs_set:cpn { @@ _ dotted _ #1 - ##1 } { } }
   }
 %    \end{macrocode}
-% 
 %
-% \bigskip
-% The control sequence |\@@_rotate:| will be linked to |\rotate| in
-% |{NiceArrayWithDelims}|. 
+% \bigskip 
+%    \begin{macrocode}
+\AtBeginDocument
+  {
+    \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } }
+    \tl_set_rescan:Nno  \l_@@_argspec_tl { } \l_@@_argspec_tl
+    \exp_args:NNV \NewDocumentCommand \@@_Vdotsfor: \l_@@_argspec_tl
+      {
+        \tl_gput_right:Nx \g_@@_HVdotsfor_lines_tl
+          {
+            \@@_Vdotsfor:nnnn 
+              { \int_use:N \c@iRow } 
+              { \int_use:N \c@jCol } 
+              { #2 }  
+              { 
+                #1 , #3 ,
+                down = \exp_not:n { #4 } , up = \exp_not:n { #5 }
+              } 
+          }
+      } 
+  }
+%    \end{macrocode}
+% Enf of |\AtBeginDocument|.
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_Vdotsfor:nnnn #1 #2 #3 #4
+  { 
+    \bool_set_false:N \l_@@_initial_open_bool
+    \bool_set_false:N \l_@@_final_open_bool
+%    \end{macrocode}
+% For the column, it's easy.
+%    \begin{macrocode}
+    \int_set:Nn \l_@@_initial_j_int { #2 }
+    \int_set_eq:NN \l_@@_final_j_int \l_@@_initial_j_int
+%    \end{macrocode}
+% For the row, it's a bit more complicated.
+%    \begin{macrocode}
+    \int_compare:nNnTF #1 = 1
+      { 
+        \int_set:Nn \l_@@_initial_i_int 1
+        \bool_set_true:N \l_@@_initial_open_bool
+      }
+      {
+        \cs_if_exist:cTF 
+          { 
+            pgf @ sh @ ns @ \@@_env: 
+            - \int_eval:n { #1 - 1 }
+            - \int_use:N \l_@@_initial_j_int
+          }
+          { \int_set:Nn \l_@@_initial_i_int { #1 - 1 } }
+          { 
+            \int_set:Nn \l_@@_initial_i_int { #1 }
+            \bool_set_true:N \l_@@_initial_open_bool
+          }
+      }
+    \int_compare:nNnTF { #1 + #3 -1 } = \c@iRow
+      { 
+        \int_set:Nn \l_@@_final_i_int { #1 + #3 - 1 }
+        \bool_set_true:N \l_@@_final_open_bool
+      }
+      {
+        \cs_if_exist:cTF 
+          { 
+            pgf @ sh @ ns @ \@@_env: 
+            - \int_eval:n { #1 + #3 }
+            - \int_use:N \l_@@_final_j_int
+          }
+          { \int_set:Nn \l_@@_final_i_int { #1 + #3 } }
+          { 
+            \int_set:Nn \l_@@_final_i_int { #1 + #3 - 1 }
+            \bool_set_true:N \l_@@_final_open_bool
+          }
+      }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+    \group_begin:
+    \int_compare:nNnTF { #2 } = 0
+      { \color { nicematrix-first-col } }
+      { 
+        \int_compare:nNnT { #2 } = \g_@@_col_total_int
+          { \color { nicematrix-last-col } }
+      }
+    \keys_set:nn { NiceMatrix / xdots } { #4 }
+    \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+    \@@_actually_draw_Vdots:
+    \group_end:
+%    \end{macrocode}
+%
+% \medskip
+% We declare all the cells concerned by the |\Vdotsfor| as ``dotted'' (for the
+% dotted lines created by |\Cdots|, |\Ldots|, etc., this job is done by
+% |\@@_find_extremities_of_line:nnnn|). This declaration is done by defining a
+% special control sequence (to nil).
+%    \begin{macrocode}
+    \int_step_inline:nnn { #1 } { #1 + #3 - 1 }
+      { \cs_set:cpn { @@ _ dotted _ ##1 - #2 } { } }
+  }
+%    \end{macrocode}
+%
+%
+% \vspace{1cm}
+% The command |\@@_rotate:| will be linked to |\rotate| in
+% |{NiceArrayWithDelims}|.  
 % 
 % The command will exit three levels of groups in order
 % to execute the command 
@@ -7297,12 +8095,6 @@ version 2005/12/01 or later.
   { \int_eval:n { #1 } - \int_eval:n { #2 } }
 %    \end{macrocode}
 %
-%    \begin{macrocode}
-\ExplSyntaxOff
-\def \@tempa  { O { } m m ! O { } E { _ ^ } { { } { } } }
-\ExplSyntaxOn
-\tl_set_eq:NN \l_@@_a_signature_tl \@tempa
-%    \end{macrocode}
 %
 % \medskip
 % With the following construction, the command |\@@_double_int_eval:n| is
@@ -7331,24 +8123,20 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
-  { \cs_new_protected:Npn \@@_line_i:nn #1 #2  { } }
+\cs_new_protected:Npn \@@_line_i:nn #1 #2
   {
-    \cs_new_protected:Npn \@@_line_i:nn #1 #2
+    \bool_set_false:N \l_@@_initial_open_bool
+    \bool_set_false:N \l_@@_final_open_bool
+    \bool_if:nTF
       {
-        \bool_set_false:N \l_@@_initial_open_bool
-        \bool_set_false:N \l_@@_final_open_bool
-        \bool_if:nTF
-          {
-            \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #1 }  
-              || 
-            \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #2 } 
-          }
-          { 
-            \@@_error:nnn { unknown~cell~for~line~in~code-after } { #1 } { #2 }
-          } 
-          { \@@_draw_line_ii:nn { #1 } { #2 } }
+        \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #1 }  
+          || 
+        \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #2 } 
       }
+      { 
+        \@@_error:nnn { unknown~cell~for~line~in~code-after } { #1 } { #2 }
+      } 
+      { \@@_draw_line_ii:nn { #1 } { #2 } }
   }
 %    \end{macrocode}
 %
@@ -7363,35 +8151,243 @@ version 2005/12/01 or later.
 % ``visible'' and that why we do this static construction of the command
 % |\@@_draw_line_ii:|. 
 %    \begin{macrocode}
-        \c_@@_pgfortikzpicture_tl
-        \@@_draw_line_iii:nn { #1 } { #2 }
-        \c_@@_endpgfortikzpicture_tl
+        \c_@@_pgfortikzpicture_tl
+        \@@_draw_line_iii:nn { #1 } { #2 }
+        \c_@@_endpgfortikzpicture_tl
+      }
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% The following command \emph{must} be protected (it's used in the
+% construction of |\@@_draw_line_ii:nn|).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_line_iii:nn #1 #2 
+  {
+    \pgfrememberpicturepositiononpagetrue
+    \pgfpointshapeborder { \@@_env: - #1 } { \@@_qpoint:n { #2 } }
+    \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
+    \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
+    \pgfpointshapeborder { \@@_env: - #2 } { \@@_qpoint:n { #1 } }
+    \dim_set_eq:NN \l_@@_x_final_dim \pgf@x
+    \dim_set_eq:NN \l_@@_y_final_dim \pgf@y
+    \@@_draw_line:
+  }
+%    \end{macrocode}
+% 
+% 
+% The commands |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, and |\Iddots| don't use
+% this command because they have to do other settings (for example, the diagonal
+% lines must be parallelized). 
+%
+% \bigskip
+% \subsection*{Commands available in the code-before}
+%
+% In the beginning of the |code-before|, the command |\@@_rowcolor:nn| will be
+% linked to |\rowcolor| and the command |\@@_columncolor:nn| to |\columncolor|.
+% 
+%    \begin{macrocode}
+\cs_set_protected:Npn \@@_cut_on_hyphen:w #1-#2\q_stop
+  {
+    \tl_set:Nn \l_tmpa_tl { #1 }
+    \tl_set:Nn \l_tmpb_tl { #2 }
+  }
+%    \end{macrocode}
+%
+% 
+% \bigskip
+% Here an example : |\@@_rowcolor:nn {red!15} {1,3,5-7,10-}|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_rowcolor:nn #1 #2
+  { 
+    \tl_if_blank:nF { #1 }
+      {
+        \pgfpicture
+        \pgf@relevantforpicturesizefalse
+        \pgfsetfillcolor { #1 }
+%    \end{macrocode}
+% |\l_tmpa_dim| is the $x$-value of the left side of the rows.
+%    \begin{macrocode}
+        \@@_qpoint:n { col - \@@_succ:n \c@jCol }
+        \dim_set_eq:NN \l_tmpa_dim \pgf@x
+        \clist_map_inline:nn { #2 } 
+          { 
+            \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 }  
+            \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } }  
+            \tl_if_empty:NT \l_tmpb_tl
+              { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } }
+            \int_compare:nNnT \l_tmpb_tl > \c@iRow
+              { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } }
+%    \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 }
+            \pgfpathrectanglecorners
+              { \@@_qpoint:n { row - \l_tmpa_tl } }
+              { \pgfpoint \l_tmpa_dim \pgf@y } 
+          }
+        \pgfusepathqfill
+        \endpgfpicture
+      }
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% Here an example : |\@@_columncolor:nn {red!15} {1,3,5-7,10-}|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_columncolor:nn #1 #2
+  { 
+    \tl_if_blank:nF { #1 }
+      {
+        \pgfpicture
+        \pgf@relevantforpicturesizefalse
+        \pgfsetfillcolor { #1 }
+        \@@_qpoint:n { row - 1 }
+%    \end{macrocode}
+% |\l_tmpa_dim| is the $y$-value of the top of the columns et |\l_tmpb_dim| is
+% the $y$-value of the bottom.
+%    \begin{macrocode}
+        \dim_set_eq:NN \l_tmpa_dim \pgf@y
+        \@@_qpoint:n { row - \@@_succ:n \c@iRow }
+        \dim_set_eq:NN \l_tmpb_dim \pgf@y
+        \clist_map_inline:nn { #2 } 
+          { 
+            \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 }  
+            \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } }   
+            \tl_if_empty:NT \l_tmpb_tl
+              { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } }
+            \int_compare:nNnT \l_tmpb_tl > \c@jCol
+              { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } }
+%    \end{macrocode}
+% Now, the numbers of both columns are in |\l_tmpa_tl| and |\l_tmpb_tl|.
+%    \begin{macrocode}
+            \@@_qpoint:n { col - \l_tmpa_tl }
+            \dim_set_eq:NN \l_tmpc_dim \pgf@x
+            \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl }
+            \pgfpathrectanglecorners
+              { \pgfpoint \l_tmpc_dim \l_tmpa_dim }
+              { \pgfpoint \pgf@x \l_tmpb_dim } 
+          }
+        \pgfusepathqfill
+        \endpgfpicture
+     }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% Here an example : |\@@_cellcolor:nn {red!15}{2-3,3-4,4-5,5-6}|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cellcolor:nn #1 #2
+  {
+    \tl_if_blank:nF { #1 }
+      {
+        \pgfpicture
+        \pgf@relevantforpicturesizefalse
+        \pgfsetfillcolor { #1 }
+        \clist_map_inline:nn { #2 } 
+          {
+            \@@_cut_on_hyphen:w ##1 \q_stop
+            \@@_qpoint:n { row - \l_tmpa_tl } 
+            \bool_lazy_and:nnT 
+              { \int_compare_p:n { \l_tmpa_tl <= \c@iRow } }
+              { \int_compare_p:n { \l_tmpb_tl <= \c@jCol } }
+              { 
+                \dim_set_eq:NN \l_tmpb_dim \pgf@y
+                \@@_qpoint:n { row - \@@_succ:n \l_tmpa_tl }
+                \dim_set_eq:NN \l_tmpa_dim \pgf@y
+                \@@_qpoint:n { col - \l_tmpb_tl }
+                \dim_set_eq:NN \l_tmpc_dim \pgf@x
+                \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl }
+                \dim_set_eq:NN \l_tmpd_dim \pgf@x
+                \pgfpathrectanglecorners
+                  { \pgfpoint \l_tmpc_dim \l_tmpb_dim }
+                  { \pgfpoint \l_tmpd_dim \l_tmpa_dim }
+              }
+          }
+        \pgfusepathqfill
+        \endpgfpicture
+     }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% Here an example : |\@@_rectanglecolor:nn {red!15}{2-3}{5-6}|
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_rectanglecolor:nnn #1 #2 #3
+  {
+    \tl_if_blank:nF { #1 }
+      {
+        \pgfpicture
+        \pgf@relevantforpicturesizefalse
+        \pgfsetfillcolor { #1 }
+        \@@_cut_on_hyphen:w #2 \q_stop
+        \bool_lazy_and:nnT 
+          { \int_compare_p:n { \l_tmpa_tl <= \c@iRow } }
+          { \int_compare_p:n { \l_tmpb_tl <= \c@jCol } }
+          {
+            \@@_qpoint:n { row - \l_tmpa_tl } 
+            \dim_set_eq:NN \l_tmpb_dim \pgf@y
+            \@@_qpoint:n { col - \l_tmpb_tl }
+            \@@_cut_on_hyphen:w #3 \q_stop
+            \int_compare:nNnT \l_tmpa_tl > \c@iRow
+              { \tl_set:Nx \l_tmpa_tl { \int_use:N \c@iRow } }
+            \int_compare:nNnT \l_tmpb_tl > \c@jCol
+              { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } }
+            \dim_set_eq:NN \l_tmpc_dim \pgf@x
+            \@@_qpoint:n { row - \@@_succ:n \l_tmpa_tl }
+            \dim_set_eq:NN \l_tmpa_dim \pgf@y
+            \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl }
+            \dim_set_eq:NN \l_tmpd_dim \pgf@x
+            \pgfpathrectanglecorners
+              { \pgfpoint \l_tmpc_dim \l_tmpb_dim }
+              { \pgfpoint \l_tmpd_dim \l_tmpa_dim }
+            \pgfusepathqfill
+          }
+        \endpgfpicture
+      }
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% The command |\rowcolors| (accessible in the |code-before|) is inspired by the
+% command |\rowcolors| of the package \pkg{xcolor} (with the option |table|).
+% However, the command |\rowcolors| of \pkg{nicematrix} has \emph{not} the
+% optional argument of the command |\rowcolors| of \pkg{xcolor}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_rowcolors:nnn #1 #2 #3
+  {
+    \int_step_inline:nnn { #1 } { \int_use:N \c@iRow }
+      {
+        \int_if_odd:nTF { ##1 }
+          { \@@_rowcolor:nn { #2 } { ##1 } }
+          { \@@_rowcolor:nn { #3 } { ##1 } }
       }
   }
 %    \end{macrocode}
-% 
+%
 % \bigskip
-% The following command \emph{must} be protected (it's used in the
-% construction of |\@@_draw_line_ii:nn|).
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_draw_line_iii:nn #1 #2 
+\cs_new_protected:Npn \@@_chessboardcolors:nn #1 #2
   {
-    \pgfrememberpicturepositiononpagetrue
-    \pgfpointshapeborder { \@@_env: - #1 } { \@@_qpoint: { #2 } }
-    \dim_set_eq:NN \l_@@_x_initial_dim \pgf@x
-    \dim_set_eq:NN \l_@@_y_initial_dim \pgf@y
-    \pgfpointshapeborder { \@@_env: - #2 } { \@@_qpoint: { #1 } }
-    \dim_set_eq:NN \l_@@_x_final_dim \pgf@x
-    \dim_set_eq:NN \l_@@_y_final_dim \pgf@y
-    \@@_draw_line:
+    \int_step_inline:nn { \int_use:N \c@iRow }
+      {
+        \int_step_inline:nn { \int_use:N \c@jCol }
+          {
+            \int_if_even:nTF { ####1 + ##1 }
+              { \@@_cellcolor:nn { #1 } { ####1 - ##1 } }
+              { \@@_cellcolor:nn { #2 } { ####1 - ##1 } }
+          }
+      }
   }
 %    \end{macrocode}
 % 
-% 
-% The commands |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, and |\Iddots| don't use
-% this command because they have to do other settings (for example, the diagonal
-% lines must be parallelized). 
-%
 % \bigskip
 % \subsection*{The vertical rules}
 %
@@ -7465,24 +8461,20 @@ version 2005/12/01 or later.
 % consecutive specifiers ``"|"'' (in a preambule like "ccc||ccc").
 %
 % That's why we have done a redefinition of the macro |\@arrayrule| of
-% \pkg{array} and this redefinition will add |\@@_vline:| instead of |\vline| to
-% the preamble (that definition is in the beginning of |{NiceArrayWithDelims}|).
+% \pkg{array} and this redefinition will add |\@@_vline:| instead of |\vline|
+% in the preamble (that definition is in the beginning of
+% |{NiceArrayWithDelims}|). 
 %
 % Here is the definition of |\@@_vline:|. This definition \emph{must} be
 % protected because you don't want that macro expanded during the construction
 % of the preamble (the tests in |\@@_OnlyMainNiceMatrix:n| must be effective in
-% each row and not once for all when the preamble is constructed).
-% 
-% \medskip
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_vline: { \@@_OnlyMainNiceMatrix:n { \@@_vline_i: } } 
-%    \end{macrocode}
-%
-% If \pkg{colortbl} is loaded, the following macro will be redefined (in a
-% |\AtBeginDocument|) to take into account the color fixed by |\arrayrulecolor|
-% of \pkg{colortbl}. 
+% each row and not once for all when the preamble is constructed). The command
+% |\CT@arc@| is a command of \pkg{colortbl} which sets the color of the rules in
+% the array. The package \pkg{nicematrix} uses it even if \pkg{colortbl} is not
+% loaded.
 %    \begin{macrocode}
-\cs_set_eq:NN \@@_vline_i: \vline
+\cs_new_protected:Npn \@@_vline:
+  { \@@_OnlyMainNiceMatrix:n { { \CT@arc@ \vline } } } 
 %    \end{macrocode}
 %
 % \bigskip
@@ -7493,9 +8485,12 @@ version 2005/12/01 or later.
   {
     \group_begin:
 %    \end{macrocode}
-% The command |\CT@arc@| is a command of color from \pkg{colortbl}.
+%
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if
+% \pkg{colortbl} is not loaded.
 %    \begin{macrocode}
-    \bool_if:NT \c_@@_colortbl_loaded_bool \CT@arc@
+    \CT@arc@
     \pgfpicture 
     \pgfrememberpicturepositiononpagetrue
     \pgf@relevantforpicturesizefalse
@@ -7503,10 +8498,10 @@ version 2005/12/01 or later.
 %    \end{macrocode}
 % First, we compute in |\l_tmpa_dim| the height of the rules we have to draw.
 %    \begin{macrocode}
-    \@@_qpoint: {row - 1 }
+    \@@_qpoint:n { row - 1 }
     \dim_set_eq:NN \l_tmpa_dim \pgf@y
     \pgfusepathqfill
-    \@@_qpoint: { row - \@@_succ:n \c@iRow } 
+    \@@_qpoint:n { row - \@@_succ:n \c@iRow } 
     \dim_sub:Nn \l_tmpa_dim \pgf@y 
     \pgfusepathqfill
 %    \end{macrocode}
@@ -7521,53 +8516,28 @@ version 2005/12/01 or later.
 % We adjust the value of |\l_tmpa_dim| by the width of the horizontal rule just 
 % before the ``last row''.
 %    \begin{macrocode}
-        \@@_qpoint: { row - \@@_succ:n\c@iRow } 
+        \@@_qpoint:n { row - \@@_succ:n\c@iRow } 
         \dim_add:Nn \l_tmpa_dim \pgf@y
-        \@@_qpoint: { row - \@@_succ:n \g_@@_row_total_int } 
+        \@@_qpoint:n { row - \@@_succ:n \g_@@_row_total_int } 
         \dim_sub:Nn \l_tmpa_dim \pgf@y
         \dim_sub:Nn \l_tmpa_dim \l_tmpb_dim
        }
+    \dim_add:Nn \l_tmpa_dim \arrayrulewidth
 %    \end{macrocode}
 %
-% Now, we can draw the lines with a loop. 
+%
+% Now, we can draw the vertical rules with a loop. 
 %    \begin{macrocode}
     \int_step_inline:nnn 
       { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } 
       { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } 
-      {          
-        \pgfpathmoveto
-          {
-            \pgfpointadd
-              { \@@_qpoint: { col - ##1 } }
-              { 
-                \pgfpoint 
-                  { 
-                    -0.5 \arrayrulewidth 
-                    \int_compare:nNnT { ##1 } = 1
-                      { 
-                        \int_compare:nNnT \l_@@_first_col_int = 1
-                          { + \arrayrulewidth }
-                      }
-                  } 
-                  { \l_tmpb_dim } 
-              }
-          }
+      { 
+        \pgfpathmoveto { \@@_qpoint:n { col - ##1 } }
         \pgfpathlineto
           {
             \pgfpointadd
-              { \@@_qpoint: { col - ##1 } }
-              { 
-                \pgfpoint 
-                  { 
-                    -0.5 \arrayrulewidth 
-                    \int_compare:nNnT { ##1 } = 1
-                      { 
-                        \int_compare:nNnT \l_@@_first_col_int = 1
-                          { + \arrayrulewidth }
-                      }
-                  } 
-                  { \l_tmpb_dim + \l_tmpa_dim } 
-              }
+              { \@@_qpoint:n { col - ##1 } }
+              { \pgfpoint \c_zero_dim { \l_tmpb_dim + \l_tmpa_dim } }
           }
       }
     \pgfusepathqstroke
@@ -7581,7 +8551,7 @@ version 2005/12/01 or later.
 % \subsection*{The commands to draw dotted lines to separate columns and rows}
 %
 % These commands don't use the normal nodes, the medium nor the large nodes.
-% They only use the |col|-nodes and the |row|-nodes.
+% They only use the |col| nodes and the |row| nodes.
 %
 % \textbf{Horizontal dotted lines}\par\nobreak
 %
@@ -7589,14 +8559,10 @@ version 2005/12/01 or later.
 % The following command must \emph{not} be protected because it's meant to be
 % expanded in a |\noalign|.
 %    \begin{macrocode}
-\bool_if:NTF \c_@@_draft_bool
-  { \cs_new:Npn \@@_hdottedline: { } }
+\cs_new:Npn \@@_hdottedline: 
   {
-    \cs_new:Npn \@@_hdottedline: 
-      {
-        \noalign { \skip_vertical:N 2\l_@@_radius_dim } 
-        \@@_hdottedline_i:
-      }
+    \noalign { \skip_vertical:N 2\l_@@_radius_dim } 
+    \@@_hdottedline_i:
   }
 %    \end{macrocode}
 %
@@ -7645,7 +8611,7 @@ version 2005/12/01 or later.
 \cs_new_protected:Npn \@@_hdottedline_i:n #1
   {
     \pgfrememberpicturepositiononpagetrue
-    \@@_qpoint: { row - #1 } 
+    \@@_qpoint:n { row - #1 } 
 %    \end{macrocode}
 % We do a translation par |-\l_@@_radius_dim| because we want the dotted line to
 % have exactly the same position as a vertical rule drawn by ``"|"''
@@ -7671,7 +8637,7 @@ version 2005/12/01 or later.
 % \hline 
 % 1 & 2 & 3 & 4 \\
 % \hdottedline 
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 
 % \end{bNiceMatrix}
 % \end{BVerbatim}
 % $\begin{bNiceMatrix}
@@ -7679,7 +8645,7 @@ version 2005/12/01 or later.
 % \hline 
 % 1 & 2 & 3 & 4 \\
 % \hdottedline 
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 
 % \end{bNiceMatrix}$
 %
 % \smallskip
@@ -7693,7 +8659,7 @@ version 2005/12/01 or later.
 % \hline 
 % 1 & 2 & 3 & 4 \\
 % \hdottedline 
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 
 % \end{bNiceMatrix}
 % \end{BVerbatim}
 % $\begin{bNiceMatrix}[margin]
@@ -7701,17 +8667,25 @@ version 2005/12/01 or later.
 % \hline 
 % 1 & 2 & 3 & 4 \\
 % \hdottedline 
-% 1 & 2 & 3 & 4 \\
+% 1 & 2 & 3 & 4 
 % \end{bNiceMatrix}$
 %
 % \medskip
 %    \begin{macrocode}
-    \@@_qpoint: { col - 1 } 
+    \@@_qpoint:n { col - 1 } 
     \dim_set:Nn \l_@@_x_initial_dim 
-      { \pgf@x + \arraycolsep - \l_@@_left_margin_dim } 
-    \@@_qpoint: { col - \@@_succ:n \c@jCol } 
+      { 
+        \pgf@x + 
+        \bool_if:NTF \l_@@_NiceTabular_bool \tabcolsep \arraycolsep 
+        - \l_@@_left_margin_dim 
+      } 
+    \@@_qpoint:n { col - \@@_succ:n \c@jCol } 
     \dim_set:Nn \l_@@_x_final_dim 
-      { \pgf@x - \arraycolsep + \l_@@_right_margin_dim }
+      {            
+        \pgf@x - 
+        \bool_if:NTF \l_@@_NiceTabular_bool \tabcolsep \arraycolsep 
+        + \l_@@_right_margin_dim 
+      }
 %    \end{macrocode}
 % For reasons purely aesthetic, we do an adjustment in the case of a rounded
 % bracket. The correction by |0.5 \l_@@_inter_dots_dim| is \emph{ad hoc} for a
@@ -7743,29 +8717,25 @@ version 2005/12/01 or later.
 %
 % \medskip
 %    \begin{macrocode}
-\bool_if:nTF \c_@@_draft_bool
-  { \cs_new_protected:Npn \@@_vdottedline:n #1 { } }
+\cs_new_protected:Npn \@@_vdottedline:n #1
   {
-    \cs_new_protected:Npn \@@_vdottedline:n #1
-      {
-        \bool_set_true:N \l_@@_initial_open_bool 
-        \bool_set_true:N \l_@@_final_open_bool 
+    \bool_set_true:N \l_@@_initial_open_bool 
+    \bool_set_true:N \l_@@_final_open_bool 
 %    \end{macrocode}
 % We recall that, when externalization is used, |\tikzpicture| and
 % |\endtikzpicture| (or |\pgfpicture| and |\endpgfpicture|) must be directly
 % ``visible''. 
 %    \begin{macrocode}
-        \bool_if:NTF \c_@@_tikz_loaded_bool
-          {
-            \tikzpicture
-            \@@_vdottedline_i:n { #1 }
-            \endtikzpicture
-          }
-          {
-            \pgfpicture
-            \@@_vdottedline_i:n { #1 }
-            \endpgfpicture
-          }
+    \bool_if:NTF \c_@@_tikz_loaded_bool
+      {
+        \tikzpicture
+        \@@_vdottedline_i:n { #1 }
+        \endtikzpicture
+      }
+      {
+        \pgfpicture
+        \@@_vdottedline_i:n { #1 }
+        \endpgfpicture
       }
   }
 %    \end{macrocode}
@@ -7775,11 +8745,13 @@ version 2005/12/01 or later.
 \cs_new_protected:Npn \@@_vdottedline_i:n #1
   {
 %    \end{macrocode}
-% The command |\CT@arc@| is a command of color from \pkg{colortbl}.
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if \pkg{colortbl} is not
+% loaded.
 %    \begin{macrocode}
-    \bool_if:NT \c_@@_colortbl_loaded_bool \CT@arc@
+    \CT@arc@
     \pgfrememberpicturepositiononpagetrue
-    \@@_qpoint: { col - \int_eval:n { #1 + 1 } } 
+    \@@_qpoint:n { col - \int_eval:n { #1 + 1 } } 
 %    \end{macrocode}
 % We do a translation par |-\l_@@_radius_dim| because we want the dotted line to
 % have exactly the same position as a vertical rule drawn by ``"|"''
@@ -7787,13 +8759,13 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
     \dim_set:Nn \l_@@_x_initial_dim { \pgf@x - \l_@@_radius_dim }
     \dim_set:Nn \l_@@_x_final_dim { \pgf@x - \l_@@_radius_dim }
-    \@@_qpoint: { row - 1 } 
+    \@@_qpoint:n { row - 1 } 
 %    \end{macrocode}
 % We arbitrary decrease the height of the dotted line by a quantity equal to
 % |\l_@@_inter_dots_dim| in order to improve the visual impact.
 %    \begin{macrocode}
     \dim_set:Nn \l_@@_y_initial_dim { \pgf@y - 0.5 \l_@@_inter_dots_dim }  
-    \@@_qpoint: { row - \@@_succ:n \c@iRow } 
+    \@@_qpoint:n { row - \@@_succ:n \c@iRow } 
     \dim_set:Nn \l_@@_y_final_dim { \pgf@y + 0.5 \l_@@_inter_dots_dim } 
 %    \end{macrocode}
 % As for now, we have no option to control the style of the lines drawn by
@@ -7984,7 +8956,7 @@ version 2005/12/01 or later.
         \dim_compare:nNnT 
           { \dim_use:c { l_@@_row _ \@@_i: _ min _ dim } } = \c_max_dim
           { 
-            \@@_qpoint: { row - \@@_i: - base }
+            \@@_qpoint:n { row - \@@_i: - base }
             \dim_set:cn { l_@@_row _ \@@_i: _ max _ dim } \pgf@y 
             \dim_set:cn { l_@@_row _ \@@_i: _ min _ dim } \pgf@y 
           }
@@ -7994,7 +8966,7 @@ version 2005/12/01 or later.
         \dim_compare:nNnT 
           { \dim_use:c { l_@@_column _ \@@_j: _ min _ dim } } = \c_max_dim 
           { 
-            \@@_qpoint: { col - \@@_j: }
+            \@@_qpoint:n { col - \@@_j: }
             \dim_set:cn { l_@@_column _ \@@_j: _ max _ dim } \pgf@y 
             \dim_set:cn { l_@@_column _ \@@_j: _ min _ dim } \pgf@y 
           }
@@ -8110,9 +9082,9 @@ version 2005/12/01 or later.
         \dim_set_eq:cc { l_@@_column _ \@@_succ:n \@@_j: _ min _ dim }
           { l_@@_column _ \@@_j: _ max _ dim } 
       }
-%     \end{macrocode}
+%    \end{macrocode}
 % Here, we have to use |\dim_sub:cn| because of the number 1 in the name.
-%     \begin{macrocode}
+%    \begin{macrocode}
     \dim_sub:cn 
       { l_@@_column _ 1 _ min _ dim } 
       \l_@@_left_margin_dim
@@ -8125,7 +9097,7 @@ version 2005/12/01 or later.
 %
 %
 % \bigskip
-% The control sequence |\@@_create_nodes:| is used twice: for the construction
+% The command |\@@_create_nodes:| is used twice: for the construction
 % of the ``medium nodes'' and for the construction of the ``large nodes''. The
 % nodes are constructed with the value of all the dimensions
 % \texttt{l_@@_row_\textsl{i}_min_dim}, \texttt{l_@@_row_\textsl{i}_max_dim},
@@ -8318,13 +9290,13 @@ version 2005/12/01 or later.
         \pgfpicture 
           \pgfrememberpicturepositiononpagetrue
           \pgf@relevantforpicturesizefalse
-          \@@_qpoint: { row - #1 } 
+          \@@_qpoint:n { row - #1 } 
           \dim_set_eq:NN \l_tmpa_dim \pgf@y
-          \@@_qpoint: { col - #2 } 
+          \@@_qpoint:n { col - #2 } 
           \dim_set_eq:NN \l_tmpb_dim \pgf@x
-          \@@_qpoint: { row - \@@_succ:n { #3 } } 
+          \@@_qpoint:n { row - \@@_succ:n { #3 } } 
           \dim_set_eq:NN \l_tmpc_dim \pgf@y
-          \@@_qpoint: { col - \@@_succ:n { #4 } } 
+          \@@_qpoint:n { col - \@@_succ:n { #4 } } 
           \dim_set_eq:NN \l_tmpd_dim \pgf@x
 %    \end{macrocode}
 % 
@@ -8337,24 +9309,19 @@ version 2005/12/01 or later.
               \begin { pgfscope }
               \pgfsetfillcolor { white }
 %    \end{macrocode}
-% Usually, the vertical rules are \emph{before} the |col|-nodes. But there is an
-% exception: if there is no ``first col'', the first vertical rule is after the
-% col node.\footnote{That's true for the vertical rules drawn by ``"|"'' due to
-% the conception of |{array}| (of \pkg{array}) and we have managed to have the
-% same behaviour with |vlines|.}
 % 
-% Since we don't want the white rectangle to erase a part of this
-% first rule, we have to do an adjustment in this case.
-% \emph{after} the ``col node''. 
 %    \begin{macrocode}
-              \int_compare:nNnT { #2 } = 1
+              \pgfpathrectanglecorners 
                 { 
-                  \int_compare:nNnT \l_@@_first_col_int = 1 
-                    { \dim_add:Nn \l_tmpb_dim \arrayrulewidth }
+                  \pgfpoint 
+                    { \l_tmpb_dim + 0.5 \arrayrulewidth }
+                    { \l_tmpa_dim - 0.5 \arrayrulewidth }
+                } 
+                { 
+                  \pgfpoint 
+                    { \l_tmpd_dim - 0.5 \arrayrulewidth }
+                    { \l_tmpc_dim + 0.5 \arrayrulewidth }
                 }
-              \pgfpathrectanglecorners 
-                { \pgfpoint \l_tmpb_dim { \l_tmpa_dim - \arrayrulewidth } } 
-                { \pgfpoint { \l_tmpd_dim - \arrayrulewidth } \l_tmpc_dim }
               \pgfusepathqfill
               \end { pgfscope }
             }
@@ -8398,11 +9365,11 @@ version 2005/12/01 or later.
 % |\pgfcoordinate| on the baseline of the row, in the first column of the array.
 % Now, we retrieve the $y$-value of that node and we store it in |\l_tmpa_dim|.
 %    \begin{macrocode}
-            \pgfextracty \l_tmpa_dim { \@@_qpoint: { row - #1 - base } }
+            \pgfextracty \l_tmpa_dim { \@@_qpoint:n { row - #1 - base } }
 %    \end{macrocode}
 % We retrieve (in |\pgf@x|) the $x$-value of the center of the block.
 %    \begin{macrocode}
-            \@@_qpoint: { #1 - #2 - block } 
+            \@@_qpoint:n { #1 - #2 - block } 
 %    \end{macrocode}
 % We put the label of the block which has been composed in |\l_@@_cell_box|.
 %    \begin{macrocode}
@@ -8418,7 +9385,7 @@ version 2005/12/01 or later.
 % |\l_@@_cell_box|). 
 %    \begin{macrocode}
           { 
-            \pgftransformshift { \@@_qpoint: { #1 - #2 - block } }
+            \pgftransformshift { \@@_qpoint:n { #1 - #2 - block } }
             \pgfnode { rectangle } { center } 
               { \box_use_drop:N \l_@@_cell_box } { } { }
           }   
@@ -8519,9 +9486,106 @@ version 2005/12/01 or later.
 \@@_define_com:nnn V \| \|
 \@@_define_com:nnn B \{ \}
 %    \end{macrocode}
+%
+% \bigskip
+% We define also an command |\AutoNiceMatrix| similar to the environment |{NiceMatrix}|.
+%    \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:
+  }
+%    \end{macrocode}
+% 
+% \subsection*{The redefinition of the command \textbackslash dotfill }
+%
+%    \begin{macrocode}
+\cs_set_eq:NN \@@_dotfill \dotfill
+\cs_new_protected:Npn \@@_dotfill: 
+  { 
+%    \end{macrocode}
+% First, we insert |\@@_dotfill| (which is the saved version of |\dotfill|) in
+% case of use of |\dotfill| ``internally'' in the cell (e.g. |\hbox to 1cm {\dotfill}|).
+%    \begin{macrocode}
+    \@@_dotfill
+    \group_insert_after:N \@@_dotfill_i: 
+  }
+\cs_new_protected:Npn \@@_dotfill_i: { \group_insert_after:N \@@_dotfill_ii: }
+\cs_new_protected:Npn \@@_dotfill_ii: { \group_insert_after:N \@@_dotfill_iii: } 
+%    \end{macrocode}
+% Now, if the box if not empty (unfornately, we can't actually test whether the
+% box is empty and that's why we only consider it's width), we insert
+% |\@@_dotfill| (which is the saved version of |\dotfill|) in the cell of the
+% array, and it will extends, since it's no longer in |\l_@@_cell_box|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_dotfill_iii: 
+  { \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } = \c_zero_dim  \@@_dotfill } 
+%    \end{macrocode}
+% 
+% \subsection*{The command \textbackslash slashbox}
+%
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_slashbox:nn #1 #2
+  {
+    \tl_gput_right:Nx \g_@@_internal_code_after_tl    
+      { 
+        \@@_actually_slashbox:nnnn 
+          { \int_use:N \c@iRow } { \int_use:N \c@jCol } { #1 } { #2 }
+      }
+  }
+%    \end{macrocode}
+% 
+% \medskip
+% The two arguments of |\@@_actually_slashbox:nn| are the number of row and the
+% number of column of the cell to slash. The two other are the elements to draw
+% below and above the diagonal line.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_slashbox:nnnn #1 #2 #3 #4
+  {
+    \pgfpicture
+    \pgf@relevantforpicturesizefalse
+    \pgfrememberpicturepositiononpagetrue
+    \@@_qpoint:n { row - #1 }
+    \dim_set_eq:NN \l_tmpa_dim \pgf@y
+    \@@_qpoint:n { col - #2 }
+    \dim_set_eq:NN \l_tmpb_dim \pgf@x
+    \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+    \@@_qpoint:n { row - \@@_succ:n { #1 } }
+    \dim_set_eq:NN \l_tmpc_dim \pgf@y 
+    \@@_qpoint:n { col - \@@_succ:n { #2 } }
+    \dim_set_eq:NN \l_tmpd_dim \pgf@x
+    \pgfpathlineto { \pgfpoint \l_tmpd_dim \l_tmpc_dim }
+    {
+%    \end{macrocode}
+% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if \pkg{colortbl} is not
+% loaded.
+%    \begin{macrocode}
+       \CT@arc@
+       \pgfsetroundcap
+       \pgfusepathqstroke
+    }
+    \pgfset { inner~sep = 1 pt }
+    \pgfscope
+    \pgftransformshift { \pgfpoint \l_tmpb_dim \l_tmpc_dim }
+    \pgfnode { rectangle } { south~west } { $ #3 $ } { } { }
+    \endpgfscope
+    \pgftransformshift { \pgfpoint \l_tmpd_dim \l_tmpa_dim }
+    \pgfnode { rectangle } { north~east } { $ #4 $  } { } { }
+    \endpgfpicture
+  }
+%    \end{macrocode}
 % 
 % \subsection*{The command \textbackslash CodeAfter}
 %
+% In fact, in this subsection, we define the user command |\CodeAfter| for the
+% case of the ``normal syntax''. For the case of ``light-syntax'', see the
+% definition of the environment |{@@-light-syntax}| on
+% p.~\pageref{code-light-syntax}. 
+% 
 % The command |\CodeAfter| catches everything until the end of the current
 % environment (of \pkg{nicematrix}).
 %
@@ -8542,7 +9606,8 @@ version 2005/12/01 or later.
 % If this is really the end of the current environment (of \pkg{nicematrix}), we
 % put back the command |\end| and its argument in the TeX flow.
 %    \begin{macrocode}
-    \bool_if:NTF { \str_if_eq_p:Vn \g_@@_name_env_str { #1 } }
+    \str_set:NV \l_tmpa_str \@currenvir
+    \bool_if:NTF { \str_if_eq_p:Vn \l_tmpa_str { #1 } }
       { \end { #1 } }
 %    \end{macrocode}
 % It this is not the |\end| we are looking for, we put those tokens in
@@ -8560,6 +9625,18 @@ version 2005/12/01 or later.
 % \bigskip
 % \subsection*{We process the options}
 %
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { obsolete~environments }
+  {
+    The~obsolete~environments~(eg.~{pNiceArrayC})~have~been~deleted~
+    from~the~package~nicematrix.\\
+    However,~if~you~still~want~to~use~them,~you~will~find~the~code~for~
+    those~environments~at~the~end~of~the~file~'nicematrix.sty',~after~
+    a~command~'\token_to_str:N\file_input_stop:'.
+  }
+%    \end{macrocode}
+% 
 % We process the options when the package is loaded (with |\usepackage|) but we
 % recommend to use |\NiceMatrixOptions| instead. 
 %
@@ -8570,7 +9647,6 @@ version 2005/12/01 or later.
 % Of course, the command |\NiceMatrix| must be defined before such an
 % instruction is executed. 
 %    \begin{macrocode}
-\bool_new:N \c_@@_obsolete_environments_bool
 \keys_define:nn { NiceMatrix / Package }
   {
     renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
@@ -8579,9 +9655,7 @@ version 2005/12/01 or later.
     renew-matrix .value_forbidden:n = true ,
     transparent .meta:n = { renew-dots , renew-matrix } ,
     transparent .value_forbidden:n = true,
-    obsolete-environments .bool_set:N = \c_@@_obsolete_environments_bool ,
-    obsolete-environments .value_forbidden:n = true ,
-    obsolete-environments .default:n = true ,
+    obsolete-environments .code:n = \@@_fatal:n { obsolete~environments },
     starred-commands .code:n = 
       \@@_msg_redirect_name:nn { starred~commands } { none } ,
     starred-commands .value_forbidden:n = true ,
@@ -8650,7 +9724,7 @@ version 2005/12/01 or later.
 %    \begin{macrocode}
 \cs_new:Npn \@@_message_hdotsfor:
   {
-    \tl_if_empty:VF \g_@@_Hdotsfor_lines_tl
+    \tl_if_empty:VF \g_@@_HVdotsfor_lines_tl
       { ~Maybe~your~use~of~\token_to_str:N \Hdotsfor\ is~incorrect.}
   }
 %    \end{macrocode}
@@ -8692,7 +9766,47 @@ version 2005/12/01 or later.
   }
 %    \end{macrocode}
 %
-%  
+%    \begin{macrocode}
+\@@_msg_new:nn { in~first~col }
+  {
+    You~can't~use~the~command~#1 in~the~first~column~(number~0)~of~the~array.\\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { in~last~col }
+  {
+    You~can't~use~the~command~#1 in~the~last~column~(exterior)~of~the~array.\\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { in~first~row }
+  {
+    You~can't~use~the~command~#1 in~the~first~row~(number~0)~of~the~array.\\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { in~last~row }
+  {
+    You~can't~use~the~command~#1 in~the~last~row~(exterior)~of~the~array.\\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { option~S~without~siunitx }
+  {
+    You~can't~use~the~option~'S'~in~your~environment~\@@_full_name_env:
+    because~you~have~not~loaded~siunitx.\\
+    If~you~go~on,~this~option~will~be~ignored.
+  }
+%    \end{macrocode}
+% 
 %    \begin{macrocode}  
 \@@_msg_new:nn { bad~option~for~line-style }
   {
@@ -8782,6 +9896,16 @@ version 2005/12/01 or later.
   }
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+\@@_msg_new:nn { last-col~non~empty~for~NiceMatrixOptions }
+  {
+    In~\NiceMatrixoptions,~you~must~use~the~option~
+    'last-col'~without~value.\\
+    However,~you~can~go~on~for~this~time~
+    (the~value~'\l_keys_value_tl'~will~be~ignored). 
+  }
+%    \end{macrocode}
+%
 % 
 %    \begin{macrocode}
 \@@_msg_new:nn { Block~too~large }
@@ -8843,6 +9967,8 @@ version 2005/12/01 or later.
     The~available~options~are~(in~alphabetic~order):~
     allow-duplicate-names,~
     code-for-first-col,~
+    cell-space-bottom-limit,~
+    cell-space-top-limit,~
     code-for-first-row,~
     code-for-last-col,~
     code-for-last-row,~
@@ -8851,8 +9977,12 @@ version 2005/12/01 or later.
     create-large-nodes,~
     end-of-row,~
     exterior-arraycolsep,~
+    first-col,~
+    first-row,~
     hlines,~
     hvlines,~
+    last-col,~
+    last-row,~
     left-margin,~
     letter-for-dotted-lines,~
     light-syntax,~
@@ -8883,6 +10013,8 @@ version 2005/12/01 or later.
     b,~
     baseline,~
     c,~
+    cell-space-bottom-limit,~
+    cell-space-top-limit,~
     code-after,~
     code-for-first-col,~
     code-for-first-row,~
@@ -8934,6 +10066,8 @@ version 2005/12/01 or later.
     b,~
     baseline,~
     c,~
+    cell-space-bottom-limit,~
+    cell-space-top-limit,~
     code-after,~
     code-for-first-col,~
     code-for-first-row,~
@@ -8961,6 +10095,7 @@ version 2005/12/01 or later.
     r~(=R),~
     renew-dots,~
     right-margin,~
+    S,~
     small,~
     t,~
     vlines,~
@@ -8970,6 +10105,54 @@ version 2005/12/01 or later.
   }
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+\@@_msg_new:nnn { Unknown~option~for~NiceTabular }
+  { 
+    The~option~'\tl_use:N\l_keys_key_str'~is~unknown~for~the~environment~
+    \{NiceTabular\}. \\
+    If~you~go~on,~it~will~be~ignored. \\
+    For~a~list~of~the~available~options,~type~H~<return>.
+  }
+  {
+    The~available~options~are~(in~alphabetic~order):~
+    b,~
+    baseline,~
+    c,~
+    cell-space-bottom-limit,~
+    cell-space-top-limit,~
+    code-after,~
+    code-for-first-col,~
+    code-for-first-row,~
+    code-for-last-col,~
+    code-for-last-row,~
+    columns-width,~
+    create-extra-nodes,~
+    create-medium-nodes,~
+    create-large-nodes,~
+    end-of-row,~
+    extra-left-margin,~
+    extra-right-margin,~
+    first-col,~
+    first-row,~
+    hlines,~
+    hvlines,~
+    last-col,~
+    last-row,~
+    left-margin,~
+    light-syntax,~
+    name,~
+    nullify-dots,~
+    parallelize-diags,~
+    renew-dots,~
+    right-margin,~
+    t,~
+    vlines,~
+    xdots/color,~
+    xdots/shorten~and~
+    xdots/line-style.
+  }
+%    \end{macrocode}
+%
 %
 %    \begin{macrocode}
 \@@_msg_new:nnn { Duplicate~name }
@@ -9013,87 +10196,85 @@ version 2005/12/01 or later.
 % completly deleted in a future version.
 %
 %    \begin{macrocode} 
-\bool_if:NT \c_@@_obsolete_environments_bool
+\file_input_stop:
+\NewDocumentEnvironment { pNiceArrayC } { }
   {
-    \NewDocumentEnvironment { pNiceArrayC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \pNiceArray
-      }
-      { \endpNiceArray }
-     \NewDocumentEnvironment { bNiceArrayC } { }
-       {
-         \int_zero:N \l_@@_last_col_int 
-         \bNiceArray
-       }
-       { \endbNiceArray }
-    \NewDocumentEnvironment { BNiceArrayC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \BNiceArray
-      }
-      { \endBNiceArray }
-    \NewDocumentEnvironment { vNiceArrayC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \vNiceArray
-      }
-      { \endvNiceArray }
-    \NewDocumentEnvironment { VNiceArrayC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \VNiceArray
-      }
-      { \endVNiceArray }
-    \NewDocumentEnvironment { pNiceArrayRC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \int_zero:N \l_@@_first_row_int 
-        \pNiceArray
-      }
-      { \endpNiceArray }
-    \NewDocumentEnvironment { bNiceArrayRC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \int_zero:N \l_@@_first_row_int 
-        \bNiceArray
-      }
-      { \endbNiceArray }
-    \NewDocumentEnvironment { BNiceArrayRC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \int_zero:N \l_@@_first_row_int 
-        \BNiceArray
-      }
-      { \endBNiceArray }
-    \NewDocumentEnvironment { vNiceArrayRC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \int_zero:N \l_@@_first_row_int 
-        \vNiceArray
-      }
-      { \endvNiceArray }
-    \NewDocumentEnvironment { VNiceArrayRC } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \int_zero:N \l_@@_first_row_int 
-        \VNiceArray
-      }
-      { \endVNiceArray }
-    \NewDocumentEnvironment { NiceArrayCwithDelims } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \NiceArrayWithDelims
-      }
-      { \endNiceArrayWithDelims }
-    \NewDocumentEnvironment { NiceArrayRCwithDelims } { }
-      {
-        \int_zero:N \l_@@_last_col_int 
-        \int_zero:N \l_@@_first_row_int 
-        \NiceArrayWithDelims
-      }
-      { \endNiceArrayWithDelims }
+    \int_zero:N \l_@@_last_col_int 
+    \pNiceArray
+  }
+  { \endpNiceArray }
+ \NewDocumentEnvironment { bNiceArrayC } { }
+   {
+     \int_zero:N \l_@@_last_col_int 
+     \bNiceArray
+   }
+   { \endbNiceArray }
+\NewDocumentEnvironment { BNiceArrayC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \BNiceArray
+  }
+  { \endBNiceArray }
+\NewDocumentEnvironment { vNiceArrayC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \vNiceArray
+  }
+  { \endvNiceArray }
+\NewDocumentEnvironment { VNiceArrayC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \VNiceArray
+  }
+  { \endVNiceArray }
+\NewDocumentEnvironment { pNiceArrayRC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \int_zero:N \l_@@_first_row_int 
+    \pNiceArray
+  }
+  { \endpNiceArray }
+\NewDocumentEnvironment { bNiceArrayRC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \int_zero:N \l_@@_first_row_int 
+    \bNiceArray
+  }
+  { \endbNiceArray }
+\NewDocumentEnvironment { BNiceArrayRC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \int_zero:N \l_@@_first_row_int 
+    \BNiceArray
   }
+  { \endBNiceArray }
+\NewDocumentEnvironment { vNiceArrayRC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \int_zero:N \l_@@_first_row_int 
+    \vNiceArray
+  }
+  { \endvNiceArray }
+\NewDocumentEnvironment { VNiceArrayRC } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \int_zero:N \l_@@_first_row_int 
+    \VNiceArray
+  }
+  { \endVNiceArray }
+\NewDocumentEnvironment { NiceArrayCwithDelims } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \NiceArrayWithDelims
+  }
+  { \endNiceArrayWithDelims }
+\NewDocumentEnvironment { NiceArrayRCwithDelims } { }
+  {
+    \int_zero:N \l_@@_last_col_int 
+    \int_zero:N \l_@@_first_row_int 
+    \NiceArrayWithDelims
+  }
+  { \endNiceArrayWithDelims }
 %    \end{macrocode}
 %
 %
@@ -9164,8 +10345,6 @@ version 2005/12/01 or later.
 % possible to externalize the Tikz elements constructed by \pkg{nicematrix}
 % because they use the options |overlay| and |remember picture|.} 
 % 
-% \subsection*{Changes between version 2.1 and 2.1.2}
-% Option |draft|: with this option, the dotted lines are not drawn (quicker).
 %
 % \subsection*{Changes between version 2.1.2 and 2.1.3}
 %
@@ -9218,9 +10397,6 @@ version 2005/12/01 or later.
 % 
 % Option |hlines|.
 % 
-% A warning is issued when the |draft| mode is used. In this case, the dotted
-% lines are not drawn.
-%
 %
 % \subsection*{Changes between version 2.3 and 3.0}
 %
@@ -9393,6 +10569,14 @@ version 2005/12/01 or later.
 % 
 % New command |\CodeAfter| (in the environments of \pkg{nicematrix}).
 %
+%
+% \subsection*{Changes between versions 3.15 and 4.0}
+%
+% New environment |{NiceTabular}|
+%
+% Commands to color cells, row and columns with a perfect result in the \textsc{pdf}.
+% 
+% 
 % \PrintIndex
 % 
 % \tableofcontents
-- 
cgit v1.2.3

