From 120cbc10db92bf43caa6bbf29549667e979beba4 Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Wed, 30 Oct 2019 03:02:02 +0000
Subject: CTAN sync 201910300302

---
 macros/latex/contrib/nicematrix/nicematrix.dtx | 672 ++++++++++++++++---------
 1 file changed, 441 insertions(+), 231 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 47271a5452..4f3effcd14 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.dtx
+++ b/macros/latex/contrib/nicematrix/nicematrix.dtx
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{3.5}
-\def\myfiledate{2019/10/13}
+\def\myfileversion{3.6}
+\def\myfiledate{2019/10/29}
 %
 %
 %<*batchfile>
@@ -67,9 +67,9 @@ c & c & b & a & e
 
 
 \NewDocumentEnvironment {scope} {} {} {}
-\def\interitem{\vskip 7mm plus 2 mm minus 3mm}          
+\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}          
 \def\emphase{\bgroup\color{RoyalPurple}\let\next=}
-\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
 \usepackage{titlesec}
 \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}
@@ -92,9 +92,9 @@ c & c & b & a & e
 %   {
 %     pdfinfo = 
 %      {
-%        Title = { The extension 'nicematrix' } ,
-%        Subject = { A LaTeX extension } ,
-%        Author = { F. Pantigny }
+%        Title = The extension 'nicematrix' ,
+%        Subject = A LaTeX extension ,
+%        Author = F. Pantigny 
 %      }
 %   }
 %
@@ -794,13 +794,13 @@ c & c & b & a & e
 %
 % \medskip
 % \begin{BVerbatim}[baseline=c,boxwidth=12cm]
-% $\begin{pNiceMatrix}[~emphase#code-after = {\line {1-1} {3-3}}@]
+% $\begin{pNiceMatrix}[~emphase#code-after = \line{1-1}{3-3}@]
 % 0 & 0 & 0 \\
 % 0 &   & 0 \\
 % 0 & 0 & 0 
 % \end{pNiceMatrix}$
 % \end{BVerbatim}
-% $\begin{pNiceMatrix}[code-after = {\line {1-1} {3-3}}]
+% $\begin{pNiceMatrix}[code-after = \line{1-1}{3-3}]
 % 0 & 0 & 0 \\
 % 0 &   & 0 \\
 % 0 & 0 & 0 
@@ -898,7 +898,7 @@ c & c & b & a & e
 %
 %
 % \bigskip
-% \section{The exterior row and columns}
+% \section{The exterior rows and columns}
 % The options |first-row|, |last-row|, |first-col| and |last-col| allow the
 % composition of exterior rows and columns in the environments of
 % \pkg{nicematrix}. 
@@ -988,7 +988,7 @@ c & c & b & a & e
 %
 %
 % \emph{Remarks}
-% \begin{itemize}
+% \begin{itemize}[beginpenalty=10000]
 % \item As shown in the previous example, an horizontal rule (drawn by |\hline|)
 % doesn't extend in the exterior columns and a vertical rule (specified by a
 % ``\verb+|+'' in the preamble of the array) doesn't extend in the exterior
@@ -1359,6 +1359,43 @@ c & c & b & a & e
 % \item the characteristics of the dotted lines are also modified.
 % \end{itemize}
 %
+% \section{The counters iRow and jCol}
+%
+% In the cells of the array, it's possible to use the LaTeX counters |iRow| and
+% |jCol| which represents the number of the current row and the number of the
+% current col\footnote{We recall that the first row (if it exists) has the
+% number~$0$ and that the first col (if it exists) has also the number~$0$).}. Of
+% course, the user must not change the value of the these counters which are
+% used internally by \pkg{nicematrix}.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{pNiceMatrix}% don't forget the %
+%     [first-row,
+%      first-col,
+%      code-for-first-row = \mathbf{~emphase#\alph{jCol}@} ,
+%      code-for-first-col = \mathbf{~emphase#\arabic{iRow}@} ]
+% &   &    &    &   \\
+% & 1 & 2  & 3  & 4 \\
+% & 5 & 6  & 7  & 8 \\
+% & 9 & 10 & 11 & 12
+% \end{pNiceMatrix}$
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}[first-row,
+%                    first-col,
+%                    code-for-first-row = \mathbf{\alph{jCol}} ,
+%                    code-for-first-col = \mathbf{\arabic{iRow}} ]
+% &   &    &    &   \\
+% & 1 & 2  & 3  & 4 \\
+% & 5 & 6  & 7  & 8 \\
+% & 9 & 10 & 11 & 12
+% \end{pNiceMatrix}$
+% 
+% \smallskip
+% If LaTeX counters called |iRow| and |jCol| are defined in the document by
+% extensions other than \pkg{nicematrix} (or by the user), they are shadowed in
+% the environements of \pkg{nicematrix}.
+%
 % \section{The option hlines}
 % 
 % You can add horizontal rules between rows in the environments of
@@ -1385,8 +1422,7 @@ c & c & b & a & e
 % If the package \pkg{siunitx} is loaded (before or after \pkg{nicematrix}),
 % it's possible to use the |S| column type of \pkg{siunitx} in the environments
 % of \pkg{nicematrix}. The implementation doesn't use explicitly any private
-% macro of \pkg{siunitx}. The |d| columns of the package \pkg{dcolumn} are not
-% supported by \pkg{nicematrix}.
+% macro of \pkg{siunitx}. 
 % 
 % 
 % \medskip
@@ -1407,6 +1443,8 @@ c & c & b & a & e
 % 7.2  & 0 & \Cdots & 0 
 % \end{pNiceArray}$
 % 
+% On the other hand, the |d| columns of the package \pkg{dcolumn} are not
+% supported by \pkg{nicematrix}.
 %
 % \section{Technical remarks}
 %
@@ -2280,25 +2318,25 @@ c & c & b & a & e
 % $\begin{array}{cc}
 % & 
 % \begin{bNiceArray}{C>{\strut}CCCC}[name=B,first-row]
-%       &        & C_j \\
+%        &        & C_j    \\
 % b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
-% \Vdots &       & \Vdots &       & \Vdots \\
-%        &       & b_{kj}  \\
-%        &       & \Vdots \\
-%  b_{n1}  & \Cdots & b_{nj} & \Cdots & b_{nn} 
+% \Vdots &        & \Vdots &        & \Vdots \\
+%        &        & b_{kj} \\
+%        &        & \Vdots \\
+% b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} 
 % \end{bNiceArray} \\ \\
 % \begin{bNiceArray}{CC>{\strut}CCC}[name=A,first-col]
-%     & a_{11} & \Cdots &  &  & a_{nn} \\
-%     & \Vdots &       &  &  & \Vdots \\
+%     & a_{11} & \Cdots &        &        & a_{nn} \\
+%     & \Vdots &        &        &        & \Vdots \\
 % L_i & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} \\
-%     & \Vdots &       &  &  & \Vdots \\
-%     & a_{n1} & \Cdots &  &  & a_{nn} \\
+%     & \Vdots &        &        &        & \Vdots \\
+%     & a_{n1} & \Cdots &        &        & a_{nn} \\
 % \end{bNiceArray}
 % & 
 % \begin{bNiceArray}{CC>{\strut}CCC}
-%        &         & & & \\
+%        &         &        & & \\
 %        &         & \Vdots \\
-% \Cdots &         & c_{ij}  \\
+% \Cdots &         & c_{ij} \\
 % \\
 % \\
 % \end{bNiceArray} 
@@ -2330,14 +2368,11 @@ c & c & b & a & e
 %
 % \smallskip
 % Of course, the package \pkg{nicematrix} uses the features of the package
-% \pkg{array}. It tries to be independant of its implementation. Unfortunately,
-% it was not possible to be strictly independant: the package \pkg{nicematrix}
+% \pkg{array}. It tries to be independent of its implementation. Unfortunately,
+% it was not possible to be strictly independent: the package \pkg{nicematrix}
 % relies upon the fact that the package |{array}| uses |\ialign| to begin the
 % |\halign|. 
 % 
-% \smallskip
-% The desire to do no modification to existing code leads to complications in
-% the code of this extension.  
 %
 % \subsection{Declaration of the package and extensions loaded}
 %
@@ -2353,7 +2388,7 @@ c & c & b & a & e
 %    \begin{macrocode}
 \RequirePackage{tikz}
 \usetikzlibrary{fit}
-\RequirePackage{expl3}[2019/02/15]
+\RequirePackage{expl3}[2019/07/01]
 %    \end{macrocode}
 % 
 % We give the traditionnal declaration of a package written with |expl3|:
@@ -2387,7 +2422,7 @@ c & c & b & a & e
 %    \begin{macrocode}
 \RequirePackage { array }
 \RequirePackage { amsmath }
-\RequirePackage { xparse } [ 2018-10-17 ]
+\RequirePackage { xparse } [ 2018-07-01 ]
 %    \end{macrocode}
 %
 % \bigskip
@@ -2422,6 +2457,13 @@ c & c & b & a & e
   { }
 %    \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 
@@ -2471,7 +2513,7 @@ c & c & b & a & e
 % 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| will be raised).
+% |l_@@_auto_columns_width_bool| also will be raised).
 %    \begin{macrocode}
 \dim_new:N \l_@@_columns_width_dim
 %    \end{macrocode}
@@ -2565,7 +2607,7 @@ c & c & b & a & e
 \dim_set:Nn \l_@@_inter_dots_dim { 0.45 em }
 %    \end{macrocode}
 % The length |\l_@@_radius_dim| is the radius of the dots for the dotted lines.
-% The default value is 0.34~pt but it will changed if the option |small| is
+% The default value is 0.34~pt but it will be changed if the option |small| is
 % used. 
 %    \begin{macrocode}
 \dim_new:N \l_@@_radius_dim
@@ -2582,6 +2624,19 @@ c & c & b & a & e
 \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
+% 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
+%    \end{macrocode}
+%
+% The TeX counters |\c@iRow| and |\c@jCol| will be created in the beginning of
+% the environment |{NiceArrayWithDelims}| (if they don't exist previously).
+% 
 % \bigskip
 % \subsubsection{Variables for the exterior rows and columns}
 %
@@ -2844,7 +2899,7 @@ c & c & b & a & e
 % \bigskip
 % The following flag will be used when the current options specify that all the
 % columns of the array must have the same width equal to the largest width of a
-% cell of the array (except the cell of the potential exterior columns).
+% cell of the array (except the cells of the potential exterior columns).
 %    \begin{macrocode}
 \bool_new:N \l_@@_auto_columns_width_bool
 %    \end{macrocode}
@@ -2918,10 +2973,9 @@ c & c & b & a & e
 %
 % \bigskip
 % An option to test whether the extra nodes will be created (these nodes are the
-% ``medium nodes'' and ``large nodes''). In some circonstancies, the extra nodes
-% are created automatically, for example when a dotted line has an ``open''
-% extremity.\footnote{In fact, we should not because, if there is a |w|~node,
-% the |w|~node is used instead of the ``medium'' node.} 
+% ``medium nodes'' and the ``large nodes''). In some circonstancies, the extra
+% nodes are created automatically, for example when a dotted line has an
+% ``open'' extremity.
 %    \begin{macrocode}
     create-extra-nodes .bool_set:N = \l_@@_extra_nodes_bool ,
     left-margin .dim_set:N = \l_@@_left_margin_dim ,
@@ -2949,11 +3003,13 @@ c & c & b & a & e
         { \dim_set:Nn \l_@@_columns_width_dim { #1 } } , 
     columns-width .value_required:n = true ,
     name .code:n = 
-      \str_set:Nn \l_tmpa_str { #1 }
-      \seq_if_in:NVTF \g_@@_names_seq \l_tmpa_str
-         { \@@_error:nn { Duplicate~name } { #1 } }
-         { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str }
-      \str_set_eq:NN \l_@@_name_str \l_tmpa_str ,
+      \unless \ifmeasuring@
+          \str_set:Nn \l_tmpa_str { #1 }
+          \seq_if_in:NVTF \g_@@_names_seq \l_tmpa_str
+             { \@@_error:nn { Duplicate~name } { #1 } }
+             { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str }
+          \str_set_eq:NN \l_@@_name_str \l_tmpa_str 
+      \fi ,
     name .value_required:n = true ,
     code-after .tl_gset:N = \g_@@_code_after_tl ,
     code-after .value_required:n = true ,
@@ -3158,21 +3214,21 @@ c & c & b & a & e
 \cs_new_protected:Nn \@@_Cell:
   { 
 %    \end{macrocode}
-% We increment |\g_@@_col_int|, which is the counter of the columns. 
+% We increment |\c@jCol|, which is the counter of the columns. 
 %    \begin{macrocode}
-    \int_gincr:N \g_@@_col_int
+    \int_gincr:N \c@jCol
 %    \end{macrocode}
 % Now, we increment the counter of the rows. We don't do this incrementation in
 % the |\everycr| because some packages, like \pkg{arydshln}, create special rows
 % in the |\halign| that we don't want to take into account. 
 %    \begin{macrocode}
-    \int_compare:nNnT \g_@@_col_int = \c_one_int
+    \int_compare:nNnT \c@jCol = \c_one_int
       { 
         \int_compare:nNnT \l_@@_first_col_int = \c_one_int
           \@@_begin_of_row: 
       }
     \int_gset:Nn \g_@@_col_total_int 
-      { \int_max:nn \g_@@_col_total_int \g_@@_col_int }
+      { \int_max:nn \g_@@_col_total_int \c@jCol }
 %    \end{macrocode}
 % The content of the cell is composed in the box |\l_tmpa_box| because we want
 % to compute some dimensions of the box. The |\hbox_set_end:| corresponding to
@@ -3182,10 +3238,21 @@ c & c & b & a & e
     \hbox_set:Nw \l_tmpa_box 
     \c_math_toggle_token
     \bool_if:NT \l_@@_small_bool \scriptstyle 
-    \int_compare:nNnTF \g_@@_row_int = \c_zero_int 
-      \l_@@_code_for_first_row_tl   
+%    \end{macrocode}
+% 
+% We will call \emph{corners} of the matrix the cases which are at the
+% intersection of the exterior rows and exterior columns (of course, the four
+% corners doesn't always exist simultaneously). In a corner of the matrix, it
+% would be logical to use none of the codes |\l_@@_code_for_first_row_tl| and
+% \emph{al}. As for now, this result is acheived only for the north-west corner
+% (this allows an automatic numerotation of the rows ans the columns with |iRow|
+% and |jCol| with the first col and the first row --- probably the preferential
+% choice for such a numerotation).
+%    \begin{macrocode}
+    \int_compare:nNnTF \c@iRow = \c_zero_int 
+      { \int_compare:nNnT \c@jCol > \c_zero_int \l_@@_code_for_first_row_tl }
       {
-        \int_compare:nNnT \g_@@_row_int = \l_@@_last_row_int
+        \int_compare:nNnT \c@iRow = \l_@@_last_row_int
           \l_@@_code_for_last_row_tl 
       }
   }
@@ -3198,7 +3265,7 @@ c & c & b & a & e
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_begin_of_row:
   {
-    \int_gincr:N \g_@@_row_int 
+    \int_gincr:N \c@iRow 
     \dim_gset_eq:NN \g_@@_dp_ante_last_row_dim \g_@@_dp_last_row_dim 
     \dim_gzero:N \g_@@_dp_last_row_dim 
     \dim_gzero:N \g_@@_ht_last_row_dim 
@@ -3213,14 +3280,14 @@ c & c & b & a & e
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_actualization_for_first_and_last_row:
   {
-    \int_compare:nNnT \g_@@_row_int = \c_zero_int
+    \int_compare:nNnT \c@iRow = \c_zero_int
       { 
         \dim_gset:Nn \g_@@_dp_row_zero_dim
           { \dim_max:nn \g_@@_dp_row_zero_dim { \box_dp:N \l_tmpa_box } }
         \dim_gset:Nn \g_@@_ht_row_zero_dim
           { \dim_max:nn \g_@@_ht_row_zero_dim { \box_ht:N \l_tmpa_box } } 
       }
-    \int_compare:nNnT \g_@@_row_int = \c_one_int
+    \int_compare:nNnT \c@iRow = \c_one_int
       { 
         \dim_gset:Nn \g_@@_ht_row_one_dim
           { \dim_max:nn \g_@@_ht_row_one_dim { \box_ht:N \l_tmpa_box } } 
@@ -3266,14 +3333,14 @@ c & c & b & a & e
       [
         anchor = base ,
         name = nm - \int_use:N \g_@@_env_int -
-                    \int_use:N \g_@@_row_int -
-                    \int_use:N \g_@@_col_int ,
+                    \int_use:N \c@iRow -
+                    \int_use:N \c@jCol ,
         alias = 
           \str_if_empty:NF \l_@@_name_str
             { 
               \l_@@_name_str -
-              \int_use:N \g_@@_row_int -
-              \int_use:N \g_@@_col_int
+              \int_use:N \c@iRow -
+              \int_use:N \c@jCol
             } 
       ] 
     \bgroup 
@@ -3342,14 +3409,14 @@ c & c & b & a & e
               [
                 node~contents = { } ,
                 name = nm - \int_use:N \g_@@_env_int -
-                            \int_use:N \g_@@_row_int -
-                            \int_use:N \g_@@_col_int - w,
+                            \int_use:N \c@iRow -
+                            \int_use:N \c@jCol - w,
                 alias = 
                   \str_if_empty:NF \l_@@_name_str
                     { 
                       \l_@@_name_str -
-                      \int_use:N \g_@@_row_int -
-                      \int_use:N \g_@@_col_int - w 
+                      \int_use:N \c@iRow -
+                      \int_use:N \c@jCol - w 
                     } ,
                 inner~sep = \c_zero_dim ,
                 fit = (@@~south~west) (@@~north~east)
@@ -3414,8 +3481,8 @@ c & c & b & a & e
           { g_@@_ #1 _ lines _ tl }
           { 
             \use:c { @@ _ draw _ #1 : nn } 
-              { \int_use:N \g_@@_row_int } 
-              { \int_use:N \g_@@_col_int }
+              { \int_use:N \c@iRow } 
+              { \int_use:N \c@jCol }
           }
       }  
   }
@@ -3459,17 +3526,17 @@ c & c & b & a & e
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_everycr_i:
   { 
-    \int_gzero:N \g_@@_col_int 
+    \int_gzero:N \c@jCol 
     \bool_if:NT \l_@@_hlines_bool
       {
 %    \end{macrocode}
-% The counter |\g_@@_row_int| has the value $-1$ only if there is a ``first
+% 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 \g_@@_row_int > { -1 }
+        \int_compare:nNnT \c@iRow > { -1 }
           {
-            \int_compare:nNnF \g_@@_row_int = \l_@@_last_row_int  
+            \int_compare:nNnF \c@iRow = \l_@@_last_row_int  
               { 
                 \hrule \@height \arrayrulewidth
                 \skip_vertical:n { - \arrayrulewidth }
@@ -3487,6 +3554,13 @@ c & c & b & a & e
 %   \begin{macrocode}
 \cs_new_protected:Npn \@@_pre_array:
   {
+    \cs_if_exist:NT \theiRow
+      { \int_set_eq:NN \l_@@_save_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_gzero_new:N \c@jCol
+    \normalbaselines
 %    \end{macrocode}
 % If the option |small| is used, we have to do some tuning. In particular, we
 % change the value of |\arraystretch| (this parameter is used in the
@@ -3505,7 +3579,7 @@ c & c & b & a & e
 % \medskip
 % We switch to a global version of the boolean |\g_@@_extra_nodes_bool|,
 % because, in some circonstancies, the boolean will be raised from inside a
-% cell of the |\halign| (in particular in a column of type |w|).
+% cell of the |\halign| (in particular in a column of type~|w|).
 % 
 %    \begin{macrocode}
     \bool_gset_eq:NN \g_@@_extra_nodes_bool \l_@@_extra_nodes_bool
@@ -3614,14 +3688,13 @@ c & c & b & a & e
 %    \end{macrocode}
 % 
 %
-% The counter |\g_@@_row_int| will be used to count the rows of the array (its
+% The counter |\c@iRow| will be used to count the rows of the array (its
 % incrementation will be in the first cell of the row). 
 %    \begin{macrocode}
-    \int_gzero_new:N \g_@@_row_int 
-    \int_gset:Nn \g_@@_row_int { \l_@@_first_row_int - 1 }
+    \int_gset:Nn \c@iRow { \l_@@_first_row_int - 1 }
 %    \end{macrocode}
 %
-% At the end of the environment |{array}|, |\g_@@_row_int| will be the total
+% At the end of the environment |{array}|, |\c@iRow| will be the total
 % number de rows and |\g_@@_row_total_int| will be the number or rows excepted
 % the last row (if |\l_@@_last_row_bool| has been raised with the option
 % |last-row|). 
@@ -3629,18 +3702,18 @@ c & c & b & a & e
     \int_gzero_new:N \g_@@_row_total_int
 %    \end{macrocode}
 %
-% The counter |\g_@@_col_int| will be used to count the columns of the array.
+% The counter |\c@jCol| will be used to count the columns of the array.
 % Since we want to know the total number of columns of the matrix, we also
 % create a counter |\g_@@_col_total_int|. These counters are updated in the
 % command |\@@_Cell:| executed at the beginning of each cell.  
 %    \begin{macrocode}
-    \int_gzero_new:N \g_@@_col_int 
     \int_gzero_new:N \g_@@_col_total_int
 %    \end{macrocode}
 %
 %    \begin{macrocode}
     \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
@@ -3670,7 +3743,17 @@ c & c & b & a & e
         !
           {
             \skip_horizontal:n { 0.53 pt }
-            \bool_gset_true:N \g_@@_extra_nodes_bool
+%    \end{macrocode}
+% If the array is an array with all the columns of the same width, we don't ask
+% for the creation of the extra nodes because we will use the ``|col|'' nodes
+% for the vertical dotted line.
+%    \begin{macrocode}
+            \bool_if:nF
+              { 
+                \l_@@_auto_columns_width_bool 
+                || \dim_compare_p:nNn \l_@@_columns_width_dim > \c_zero_dim
+              }
+              { \bool_gset_true:N \g_@@_extra_nodes_bool }
 %    \end{macrocode}
 %
 % \medskip
@@ -3693,15 +3776,15 @@ c & c & b & a & e
 % ``|:|'' encountered during the parsing has already been taken into account in
 % the |code-after|.
 %    \begin{macrocode}
-            \int_compare:nNnT \g_@@_col_int > \g_@@_last_vdotted_col_int
+            \int_compare:nNnT \c@jCol > \g_@@_last_vdotted_col_int
               {
-                \int_gset_eq:NN \g_@@_last_vdotted_col_int \g_@@_col_int
+                \int_gset_eq:NN \g_@@_last_vdotted_col_int \c@jCol
                 \tl_gput_right:Nx \g_@@_code_after_tl
 %    \end{macrocode}
 % The command |\@@_vdottedline:n| is protected, and, therefore, won't be
 % expanded before writing on |\g_@@_code_after_tl|.
 %    \begin{macrocode}
-                  { \@@_vdottedline:n { \int_use:N \g_@@_col_int } }
+                  { \@@_vdottedline:n { \int_use:N \c@jCol } }
               }
           }
       }
@@ -3899,13 +3982,13 @@ c & c & b & a & e
 % |{NiceMatrixBlock}|), we add a row in the array to fix the width of the
 % columns and construct the ``|col|'' nodes |nm-|\textsl{a}|-col-|\textsl{j}
 % (these nodes will be used by the horizontal open dotted lines and by the
-% potential commands |\@@_vdottedline:n|).
+% commands |\@@_vdottedline:n|).
 % 
 %    \begin{macrocode}
   { 
     \bool_if:nT
       {
-        ( \l_@@_auto_columns_width_bool && ! \l_@@_block_auto_columns_width_bool)
+        \l_@@_auto_columns_width_bool 
         || \dim_compare_p:nNn \l_@@_columns_width_dim > \c_zero_dim
       }
       {
@@ -3916,11 +3999,13 @@ c & c & b & a & e
 % 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}
+        \skip_horizontal:N \arraycolsep
         \tikz [ remember~picture , overlay ]
           \coordinate [ name = nm - \int_use:N \g_@@_env_int - col - 0 ] ;
+        \skip_horizontal:n { - \arraycolsep }
 %    \end{macrocode}
 % We compute in |\g_tmpa_dim| the common width of the columns. We use a global
-% variable because we are in a cell of an |\halign| and that we have to use this
+% variable because we are in a cell of an |\halign| and because we have to use this
 % variable in other cells (of the same row). The affectation of |\g_tmpa_dim|,
 % like all the affectations, must be done after the |\omit| of the cell.
 %    \begin{macrocode}
@@ -3936,18 +4021,20 @@ c & c & b & a & e
           { 
             \dim_gset:Nn \g_tmpa_dim
               { \l_@@_columns_width_dim + 2 \arraycolsep } 
-            }
+          }
         \skip_horizontal:N \g_tmpa_dim
+        \tikz [ remember~picture , overlay ]
+          \coordinate [ name = nm - \int_use:N \g_@@_env_int - col - 1 ] ;
 %    \end{macrocode}
 % We begin a loop over the columns. The integer |\g_tmpa_int| will be the
-% number of columns of the current cell. This integer is not used to fix the
+% number of the current column. This integer is not used to fix the
 % width of the column (since all the columns have the same width equal to
 % |\g_@@_tmpa_dim|) but for the Tikz nodes.
 %    \begin{macrocode}
         \int_gset:Nn \g_tmpa_int 1            
         \bool_if:nTF \g_@@_last_col_found_bool 
+          { \prg_replicate:nn { \g_@@_col_total_int - 3 } }
           { \prg_replicate:nn { \g_@@_col_total_int - 2 } }
-          { \prg_replicate:nn { \g_@@_col_total_int - 1 } }
           { 
              & 
              \omit
@@ -3967,6 +4054,22 @@ c & c & b & a & e
                           col - \int_use:N \g_tmpa_int
                  ] ; 
           }
+%    \end{macrocode}
+% For the last column, we want a special treatment because of the final
+% |\arraycolsep|. 
+%    \begin{macrocode}
+        & 
+        \omit
+        \int_gincr:N \g_tmpa_int 
+        \skip_horizontal:N \g_tmpa_dim
+        \skip_horizontal:n { - \arraycolsep }
+        \tikz [ remember~picture , overlay ]
+          \coordinate             
+            [
+              name = nm - \int_use:N \g_@@_env_int -
+                     col - \int_use:N \g_tmpa_int
+            ] ; 
+        \skip_horizontal:N \arraycolsep
       }
     \endarray
     \c_math_toggle_token
@@ -3982,10 +4085,10 @@ c & c & b & a & e
       {
         \bool_if:NF \l_@@_last_row_without_value_bool
           {
-            \int_compare:nNnF \l_@@_last_row_int = \g_@@_row_int
+            \int_compare:nNnF \l_@@_last_row_int = \c@iRow
               { 
                 \@@_error:n { Wrong~last~row } 
-                \int_gset_eq:NN \l_@@_last_row_int \g_@@_row_int
+                \int_gset_eq:NN \l_@@_last_row_int \c@iRow
               }
           } 
       }
@@ -3997,12 +4100,8 @@ c & c & b & a & e
 %    \begin{macrocode}
     \int_compare:nNnTF \l_@@_first_row_int = \c_zero_int
       { 
-        \dim_set:Nn \l_tmpa_dim
-          { 
-            \g_@@_ht_row_one_dim + \g_@@_dp_row_zero_dim 
-            + \lineskip 
-            + \g_@@_ht_row_zero_dim - \g_@@_ht_row_one_dim 
-          }
+        \dim_set:Nn \l_tmpa_dim 
+          { \g_@@_dp_row_zero_dim + \lineskip + \g_@@_ht_row_zero_dim }
       }
       { \dim_zero:N \l_tmpa_dim }
 %    \end{macrocode}
@@ -4016,11 +4115,7 @@ c & c & b & a & e
     \int_compare:nNnTF \l_@@_last_row_int > { -2 }
       {
         \dim_set:Nn \l_tmpb_dim
-          { 
-            \g_@@_ht_last_row_dim + \g_@@_dp_ante_last_row_dim 
-            + \lineskip
-            + \g_@@_dp_last_row_dim - \g_@@_dp_ante_last_row_dim
-          }
+          { \g_@@_ht_last_row_dim + \lineskip + \g_@@_dp_last_row_dim }
       }
       { \dim_zero:N \l_tmpb_dim }
 %    \end{macrocode}
@@ -4136,7 +4231,7 @@ c & c & b & a & e
         \hbox_set:Nw \l_tmpa_box 
         \c_math_toggle_token
         \bool_if:NT \l_@@_small_bool \scriptstyle
-        \l_@@_code_for_first_col_tl
+        \int_compare:nNnT \c@iRow > \c_zero_int \l_@@_code_for_first_col_tl
       }
     l
     < 
@@ -4173,13 +4268,13 @@ c & c & b & a & e
                 name = 
                   nm -
                   \int_use:N \g_@@_env_int -
-                  \int_use:N \g_@@_row_int -
+                  \int_use:N \c@iRow -
                   0 ,
                 alias = 
                   \str_if_empty:NF \l_@@_name_str
                     { 
                       \l_@@_name_str -
-                      \int_use:N \g_@@_row_int -
+                      \int_use:N \c@iRow -
                       0
                     }
               ]
@@ -4209,9 +4304,9 @@ c & c & b & a & e
 % column'' is really used.
 %    \begin{macrocode}           
         \bool_gset_true:N \g_@@_last_col_found_bool
-        \int_gincr:N \g_@@_col_int
+        \int_gincr:N \c@jCol
         \int_gset:Nn \g_@@_col_total_int
-          { \int_max:nn \g_@@_col_total_int \g_@@_col_int }
+          { \int_max:nn \g_@@_col_total_int \c@jCol }
 %    \end{macrocode}
 % The contents of the cell is constructed in the box |\l_tmpa_box| because we
 % have to compute some dimensions of this box.
@@ -4263,14 +4358,14 @@ c & c & b & a & e
                 name = 
                   nm -
                   \int_use:N \g_@@_env_int -
-                  \int_use:N \g_@@_row_int -
-                  \int_use:N \g_@@_col_int ,
+                  \int_use:N \c@iRow -
+                  \int_use:N \c@jCol ,
                 alias = 
                   \str_if_empty:NF \l_@@_name_str
                     { 
                       \l_@@_name_str -
-                      \int_use:N \g_@@_row_int -
-                      \int_use:N \g_@@_col_int
+                      \int_use:N \c@iRow -
+                      \int_use:N \c@jCol
                     }
               ]
               { \box_use:N \l_tmpa_box } ; 
@@ -4395,10 +4490,6 @@ c & c & b & a & e
 \@@_define_env:n V
 %    \end{macrocode}
 %
-%
-% \bigskip
-% \subsection{Automatic width of the cells}
-%
 % 
 % \bigskip
 % \subsection{How to know whether a cell is ``empty''}
@@ -4504,15 +4595,16 @@ c & c & b & a & e
 % 
 % \subsection{After the construction of the array}
 %
-% The macro |\@@_after_array:| is called (via |\group_insert_after:N|) in
-% |{NiceArrayWithDelims}| and |{NiceMatrix}|. 
 %
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_after_array:
   { 
-    \int_compare:nNnTF \g_@@_row_int > \c_zero_int
+    \int_compare:nNnTF \c@iRow > \c_zero_int
       \@@_after_array_i:
-      { \@@_error:n { Zero~row } }
+      { 
+        \@@_error:n { Zero~row } 
+        \@@_restore_iRow_jCol:
+      }
   }
 %    \end{macrocode}
 %
@@ -4527,22 +4619,22 @@ c & c & b & a & e
     \cs_if_exist:NT \tikz@library@external@loaded
       { \tikzset { external / export = false } } 
 %    \end{macrocode}
-% Now, the definition of |\g_@@_col_int| and
-% |\g_@@_col_total_int| change: |\g_@@_col_int| will be the number of
+% Now, the definition of |\c@jCol| and
+% |\g_@@_col_total_int| change: |\c@jCol| will be the number of
 % columns without the ``last column''; |\g_@@_col_total_int| will be the
 % number of columns with this ``last column''.\footnote{We remind that the
 % potential ``first column'' has the number~$0$.}
 %    \begin{macrocode}
-    \int_gset_eq:NN \g_@@_col_int \g_@@_col_total_int
-    \bool_if:nT \g_@@_last_col_found_bool { \int_gdecr:N \g_@@_col_int } 
+    \int_gset_eq:NN \c@jCol \g_@@_col_total_int
+    \bool_if:nT \g_@@_last_col_found_bool { \int_gdecr:N \c@jCol } 
 %    \end{macrocode}
 %
-% We fix also the value of |\g_@@_row_int| and |\g_@@_row_total_int| with the
+% We fix also the value of |\c@iRow| and |\g_@@_row_total_int| with the
 % same principle.
 %    \begin{macrocode}
-    \int_gset_eq:NN \g_@@_row_total_int \g_@@_row_int
+    \int_gset_eq:NN \g_@@_row_total_int \c@iRow
     \int_compare:nNnT \l_@@_last_row_int > { -1 }
-      { \int_gsub:Nn \g_@@_row_int \c_one_int }
+      { \int_gsub:Nn \c@iRow \c_one_int }
 %    \end{macrocode}
 %
 % In the user has used the option |last-row| without value, we write in the
@@ -4642,17 +4734,26 @@ c & c & b & a & e
     \tikzset 
       { 
         every~picture / .style = 
-         { 
-           overlay ,
-           remember~picture ,
-           name~prefix = nm - \int_use:N \g_@@_env_int - 
-         }
+          { 
+            overlay ,
+            remember~picture ,
+            name~prefix = nm - \int_use:N \g_@@_env_int - 
+          }
       }
     \cs_set_eq:NN \line \@@_line:nn
     \g_@@_code_after_tl 
     \tl_gclear:N \g_@@_code_after_tl
     \group_end:
     \str_gclear:N \g_@@_type_env_str
+    \@@_restore_iRow_jCol:
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new_protected:Nn \@@_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 } 
   }
 %    \end{macrocode}
 %
@@ -4733,7 +4834,7 @@ c & c & b & a & e
 % We test if we are still in the matrix. 
 %    \begin{macrocode}
         \bool_set_false:N \l_@@_final_open_bool
-        \int_compare:nNnTF \l_@@_final_i_int > \g_@@_row_int
+        \int_compare:nNnTF \l_@@_final_i_int > \c@iRow
           {
             \int_compare:nNnT { #3 } = 1
               { \bool_set_true:N \l_@@_final_open_bool }
@@ -4745,7 +4846,7 @@ c & c & b & a & e
                   { \bool_set_true:N \l_@@_final_open_bool }
               }
               {
-                \int_compare:nNnT \l_@@_final_j_int > \g_@@_col_int
+                \int_compare:nNnT \l_@@_final_j_int > \c@jCol
                   { 
                     \int_compare:nNnT { #4 } = 1
                       { \bool_set_true:N \l_@@_final_open_bool }
@@ -4837,7 +4938,7 @@ c & c & b & a & e
                   { \bool_set_true:N \l_@@_initial_open_bool }
               }
               { 
-                \int_compare:nNnT \l_@@_initial_j_int > \g_@@_col_int
+                \int_compare:nNnT \l_@@_initial_j_int > \c@jCol
                   { 
                     \int_compare:nNnT { #4 } = { -1 }
                       { \bool_set_true:N \l_@@_initial_open_bool }
@@ -4941,6 +5042,47 @@ c & c & b & a & e
 \cs_generate_variant:Nn \@@_retrieve_coords:nn { x x }
 %    \end{macrocode}
 %
+% \interitem 
+% For the horizontal lines with open extremities, we must take into account the
+% ``|col|'' nodes created in the environments which have a fixed width of the
+% columns. The following command will recompute the $x$-value of the extremities
+% in this case (erasing the value computed in |\@@_retrieve_coords:nn|).
+%    \begin{macrocode}
+\cs_new_protected:Nn \@@_adjust_with_col_nodes:
+  { 
+    \bool_if:NT \l_@@_initial_open_bool
+      { 
+        \cs_if_exist:cT
+          { pgf@sh@ns@nm - \int_use:N \g_@@_env_int - col - 0 } 
+          {
+            \begin { tikzpicture } [ remember~picture ]
+            \tikz@parse@node \pgfutil@firstofone
+              ( nm - \int_use:N \g_@@_env_int - col - 0 ) 
+            \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
+            \end { tikzpicture }
+          }
+      }       
+    \bool_if:NT \l_@@_final_open_bool
+      { 
+        \cs_if_exist:cT
+          { 
+            pgf@sh@ns@nm - \int_use:N \g_@@_env_int - col - 
+            \int_use:N \c@jCol 
+          } 
+          {
+            \begin { tikzpicture } [ remember~picture ]
+            \tikz@parse@node \pgfutil@firstofone
+              ( 
+                nm - \int_use:N \g_@@_env_int - col - 
+                \int_use:N \c@jCol 
+              ) 
+            \dim_gset:Nn \g_@@_x_final_dim \pgf@x
+            \end { tikzpicture }
+          }
+      }       
+  }
+%    \end{macrocode}
+%
 % \interitem
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_draw_Ldots:nn
@@ -4996,6 +5138,7 @@ c & c & b & a & e
           }
           { .base~west }
       }
+    \@@_adjust_with_col_nodes:
     \bool_if:NT \l_@@_initial_open_bool
       { \dim_gset_eq:NN \g_@@_y_initial_dim \g_@@_y_final_dim }
     \bool_if:NT \l_@@_final_open_bool                 
@@ -5051,6 +5194,7 @@ c & c & b & a & e
                   }
                   { .mid~west }
               }
+            \@@_adjust_with_col_nodes:
             \bool_if:NT \l_@@_initial_open_bool
               { \dim_gset_eq:NN \g_@@_y_initial_dim \g_@@_y_final_dim }
             \bool_if:NT \l_@@_final_open_bool                 
@@ -5365,7 +5509,7 @@ c & c & b & a & e
             \l_tmpb_int
           }
         \begin { tikzpicture } [ overlay ]
-          \int_step_inline:nnnn 0 1 \l_tmpa_int
+          \int_step_inline:nnn 0 \l_tmpa_int
             { 
               \pgfpathcircle 
                 { \pgfpoint { \g_@@_x_initial_dim } { \g_@@_y_initial_dim } }
@@ -5400,7 +5544,7 @@ c & c & b & a & e
 \cs_new_protected:Nn \@@_add_to_empty_cells:
   { 
     \cs_gset:cpx 
-      { @@ _ empty _ \int_use:N \g_@@_row_int - \int_use:N \g_@@_col_int } 
+      { @@ _ empty _ \int_use:N \c@iRow - \int_use:N \c@jCol } 
       { \int_use:N \g_@@_env_int }
   }
 %    \end{macrocode}
@@ -5485,10 +5629,10 @@ c & c & b & a & e
     \int_compare:nNnT #1 > 1
       {
         \seq_gput_left:Nx \g_@@_multicolumn_cells_seq
-          { \int_eval:n \g_@@_row_int - \int_use:N \g_@@_col_int }
+          { \int_eval:n \c@iRow - \int_use:N \c@jCol }
         \seq_gput_left:Nn \g_@@_multicolumn_sizes_seq { #1 } 
       }
-    \int_gadd:Nn \g_@@_col_int { #1 - 1 }
+    \int_gadd:Nn \c@jCol { #1 - 1 }
   }
 %    \end{macrocode}
 %
@@ -5526,8 +5670,8 @@ c & c & b & a & e
         \tl_gput_right:Nx \g_@@_Hdotsfor_lines_tl
           {
             \@@_draw_Hdotsfor:nnn
-              { \int_use:N \g_@@_row_int }
-              { \int_use:N \g_@@_col_int } 
+              { \int_use:N \c@iRow }
+              { \int_use:N \c@jCol } 
               { #2 }
           }
         \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { C } { } }
@@ -5563,7 +5707,7 @@ c & c & b & a & e
             \bool_set_true:N \l_@@_initial_open_bool
           }
       }
-    \int_compare:nNnTF { #2 + #3 -1 } = \g_@@_col_int
+    \int_compare:nNnTF { #2 + #3 -1 } = \c@jCol
       { 
         \int_set:Nn \l_@@_final_j_int { #2 + #3 - 1 }
         \bool_set_true:N \l_@@_final_open_bool
@@ -5601,34 +5745,41 @@ c & c & b & a & e
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_line:nn
   {
-    \dim_zero_new:N \g_@@_x_initial_dim
-    \dim_zero_new:N \g_@@_y_initial_dim
-    \dim_zero_new:N \g_@@_x_final_dim
-    \dim_zero_new:N \g_@@_y_final_dim
-    \bool_set_false:N \l_@@_initial_open_bool
-    \bool_set_false:N \l_@@_final_open_bool
-    \bool_if:nTF
+    \bool_if:NF \c_@@_draft_bool
       {
-        \cs_if_exist_p:c { pgf@sh@ns@nm - \int_use:N \g_@@_env_int - #1 }  
-        && 
-        \cs_if_exist_p:c { pgf@sh@ns@nm - \int_use:N \g_@@_env_int - #2 } 
-      }
-      {
-        \begin { tikzpicture }
-           \path~(#1)~--~(#2)~node[at~start]~(i)~{}~node[at~end]~(f)~{} ;
-           \tikz@parse@node \pgfutil@firstofone ( i )
-           \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
-           \dim_gset:Nn \g_@@_y_initial_dim \pgf@y
-           \tikz@parse@node \pgfutil@firstofone ( f )
-           \dim_gset:Nn \g_@@_x_final_dim \pgf@x
-           \dim_gset:Nn \g_@@_y_final_dim \pgf@y
-        \end { tikzpicture }  
-        \@@_draw_tikz_line:
+        \dim_zero_new:N \g_@@_x_initial_dim
+        \dim_zero_new:N \g_@@_y_initial_dim
+        \dim_zero_new:N \g_@@_x_final_dim
+        \dim_zero_new:N \g_@@_y_final_dim
+        \bool_set_false:N \l_@@_initial_open_bool
+        \bool_set_false:N \l_@@_final_open_bool
+        \bool_if:nTF
+          {
+            \cs_if_exist_p:c { pgf@sh@ns@nm - \int_use:N \g_@@_env_int - #1 }  
+            && 
+            \cs_if_exist_p:c { pgf@sh@ns@nm - \int_use:N \g_@@_env_int - #2 } 
+          }
+          {
+            \begin { tikzpicture }
+               \path~(#1)~--~(#2)~node[at~start]~(i)~{}~node[at~end]~(f)~{} ;
+               \tikz@parse@node \pgfutil@firstofone ( i )
+               \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
+               \dim_gset:Nn \g_@@_y_initial_dim \pgf@y
+               \tikz@parse@node \pgfutil@firstofone ( f )
+               \dim_gset:Nn \g_@@_x_final_dim \pgf@x
+               \dim_gset:Nn \g_@@_y_final_dim \pgf@y
+            \end { tikzpicture }  
+            \@@_draw_tikz_line:
+          }
+          { 
+            \@@_error:nnn { unknown~cell~for~line~in~code-after } 
+              { #1 } { #2 }
+          }
       }
-      { \@@_error:nnn { unknown~cell~for~line~in~code-after } { #1 } { #2 } }
   }
 %    \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). 
@@ -5727,7 +5878,6 @@ c & c & b & a & e
     \int_compare:nNnTF #1 = \c_zero_int
       { \@@_error:n { Use~of~:~in~first~position } }
       {   
-        \@@_create_extra_nodes:
         \bool_if:NF \c_@@_draft_bool
           {
             \dim_zero_new:N \g_@@_x_initial_dim
@@ -5737,50 +5887,63 @@ c & c & b & a & e
             \bool_set_true:N \l_@@_initial_open_bool 
             \bool_set_true:N \l_@@_final_open_bool 
 %    \end{macrocode}
-% In order to have the coordinates of the line to draw, we use the ``large
-% nodes''. 
-%    \begin{macrocode}
-            \begin { tikzpicture } [ remember~picture ]
-              \tikz@parse@node\pgfutil@firstofone
-                ( 1 - #1 - large .north~east )
-              \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
-              \dim_gset:Nn \g_@@_y_initial_dim \pgf@y
-              \tikz@parse@node\pgfutil@firstofone
-                ( \int_use:N \g_@@_row_int - #1 - large .south~east )
-              \dim_gset:Nn \g_@@_x_final_dim \pgf@x
-              \dim_gset:Nn \g_@@_y_final_dim \pgf@y
-            \end { tikzpicture }
-%    \end{macrocode}
-% However, if the previous column was constructed with a letter |w|, we use the
-% |w|-nodes to change the $x$-value of the nodes.
+% If a ``|col|'' node exists (if the array has been constructed with a fixed
+% width of column), we use it.
 %    \begin{macrocode}
-            \cs_if_exist:cT
-              { pgf@sh@ns@nm -\int_use:N \g_@@_env_int - 1 - #1 - w }
+            \cs_if_exist:cTF
+              { pgf@sh@ns@nm -\int_use:N \g_@@_env_int - col - #1 }
               {
                 \begin { tikzpicture } [ remember~picture ]
                   \tikz@parse@node\pgfutil@firstofone
-                    ( 1 - #1 - w .north~east )
+                    ( col - #1 )
                   \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
-                  \tikz@parse@node\pgfutil@firstofone
-                    ( \int_use:N \g_@@_row_int - #1 - w .south~east )
                   \dim_gset:Nn \g_@@_x_final_dim \pgf@x
+                  \dim_gset:Nn \g_@@_y_final_dim \pgf@y
                 \end { tikzpicture }
-                \dim_gadd:Nn \g_@@_x_initial_dim \arraycolsep
-                \dim_gadd:Nn \g_@@_x_final_dim \arraycolsep
+                \dim_gset:Nn \g_@@_y_initial_dim { - \c_max_dim }
+                \int_step_inline:nn \c@jCol 
+                  {
+                    \begin { tikzpicture } [ remember~picture ]
+                      \tikz@parse@node\pgfutil@firstofone
+                        ( 1 - ##1 . north~east )
+                      \dim_gset:Nn \g_@@_y_initial_dim
+                        { \dim_max:nn \g_@@_y_initial_dim \pgf@y }
+                    \end { tikzpicture }
+                  }
               }
 %    \end{macrocode}
-% However, if a node of column exists (if the array has been constructed with a
-% fixed width of column), we use it.
+% If not, we use the ``large node''.
 %    \begin{macrocode}
-            \cs_if_exist:cT
-              { pgf@sh@ns@nm -\int_use:N \g_@@_env_int - col - #1 }
               {
                 \begin { tikzpicture } [ remember~picture ]
                   \tikz@parse@node\pgfutil@firstofone
-                    ( col - #1 )
+                    ( 1 - #1 - large .north~east )
                   \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
+                  \dim_gset:Nn \g_@@_y_initial_dim \pgf@y
+                  \tikz@parse@node\pgfutil@firstofone
+                    ( \int_use:N \c@iRow - #1 - large .south~east )
                   \dim_gset:Nn \g_@@_x_final_dim \pgf@x
+                  \dim_gset:Nn \g_@@_y_final_dim \pgf@y
                 \end { tikzpicture }
+%    \end{macrocode}
+% However, if the previous column was constructed with a letter |w|, we use the
+% |w|-nodes (and we erase the previous computation of the $x$-value of the
+% vertical dotted line).
+%    \begin{macrocode}
+                \cs_if_exist:cT
+                  { pgf@sh@ns@nm -\int_use:N \g_@@_env_int - 1 - #1 - w }
+                  {
+                    \begin { tikzpicture } [ remember~picture ]
+                      \tikz@parse@node\pgfutil@firstofone
+                        ( 1 - #1 - w .north~east )
+                      \dim_gset:Nn \g_@@_x_initial_dim \pgf@x
+                      \tikz@parse@node\pgfutil@firstofone
+                        ( \int_use:N \c@iRow - #1 - w .south~east )
+                      \dim_gset:Nn \g_@@_x_final_dim \pgf@x
+                    \end { tikzpicture }
+                    \dim_gadd:Nn \g_@@_x_initial_dim \arraycolsep
+                    \dim_gadd:Nn \g_@@_x_final_dim \arraycolsep
+                  }
               }
             \@@_draw_tikz_line:
           } 
@@ -5789,7 +5952,6 @@ c & c & b & a & e
 %    \end{macrocode}
 % 
 %
-%
 % \bigskip
 % \subsection{The vertical rules}
 %
@@ -5800,7 +5962,7 @@ c & c & b & a & e
 % with |\newcolumntype|:
 % \begin{Verbatim}[commandchars=\~\#\+]
 %    \newcolumntype { | }
-%      { ! { \int_compare:nNnF \g_@@_row_int = \c_zero_int \vline } } 
+%      { ! { \int_compare:nNnF \c@iRow = \c_zero_int \vline } } 
 % \end{Verbatim}
 % 
 % However, this code fails is the user uses "\DefineShortVerb{\|}" of
@@ -5820,45 +5982,45 @@ c & c & b & a & e
   { 
     \int_compare:nNnTF \l_@@_first_col_int = \c_zero_int 
       { 
-        \int_compare:nNnTF \g_@@_col_int = \c_zero_int
+        \int_compare:nNnTF \c@jCol = \c_zero_int
           {
             \int_compare:nNnTF \l_@@_first_row_int = \c_zero_int
               {     
-                \int_compare:nNnF \g_@@_row_int = \c_zero_int 
+                \int_compare:nNnF \c@iRow = \c_zero_int 
                   { 
-                    \int_compare:nNnF \g_@@_row_int = \l_@@_last_row_int
+                    \int_compare:nNnF \c@iRow = \l_@@_last_row_int
                     \@@_vline_i: 
                   }  
               }
               {
-                \int_compare:nNnF \g_@@_row_int = \c_zero_int
+                \int_compare:nNnF \c@iRow = \c_zero_int
                   { 
-                    \int_compare:nNnF \g_@@_row_int = \l_@@_last_row_int
+                    \int_compare:nNnF \c@iRow = \l_@@_last_row_int
                     \@@_vline_i: 
                   }   
               }    
            }
            {     
-             \int_compare:nNnF \g_@@_row_int = \c_zero_int 
+             \int_compare:nNnF \c@iRow = \c_zero_int 
                { 
-                 \int_compare:nNnF \g_@@_row_int = \l_@@_last_row_int
+                 \int_compare:nNnF \c@iRow = \l_@@_last_row_int
                  \@@_vline_i: 
                }  
            }
       }
       { 
-        \int_compare:nNnTF \g_@@_col_int = \c_zero_int
+        \int_compare:nNnTF \c@jCol = \c_zero_int
           {
-            \int_compare:nNnF \g_@@_row_int = { -1 }
+            \int_compare:nNnF \c@iRow = { -1 }
               { 
-                \int_compare:nNnF \g_@@_row_int = { \l_@@_last_row_int - 1 }
+                \int_compare:nNnF \c@iRow = { \l_@@_last_row_int - 1 }
                   \@@_vline_i:
               } 
           }
           {     
-            \int_compare:nNnF \g_@@_row_int = \c_zero_int 
+            \int_compare:nNnF \c@iRow = \c_zero_int 
               { 
-                \int_compare:nNnF \g_@@_row_int = \l_@@_last_row_int
+                \int_compare:nNnF \c@iRow = \l_@@_last_row_int
                 \@@_vline_i: 
               } 
           }
@@ -6043,7 +6205,7 @@ c & c & b & a & e
 % \bigskip
 % For ``large nodes'', the exterior rows and columns don't interfer.
 % That's why the loop over the rows will start at 1 and the loop over the
-% columns will stop at $|\g_@@_col_int|$ (and not |\g_@@_col_total_int|). Idem
+% columns will stop at $|\c@jCol|$ (and not |\g_@@_col_total_int|). Idem
 % for the rows. 
 %     \begin{macrocode}
       \int_set:Nn \l_@@_first_row_int 1
@@ -6054,7 +6216,7 @@ c & c & b & a & e
 % \texttt{l_@@_column_\textsl{j}_min_dim} and
 % \texttt{l_@@_column_\textsl{j}_max_dim}.  
 %    \begin{macrocode} 
-      \int_step_variable:nNn { \g_@@_row_int - 1 } \@@_i:
+      \int_step_variable:nNn { \c@iRow - 1 } \@@_i:
         { 
           \dim_set:cn { l_@@_row _ \@@_i: _ min _ dim }  
             {
@@ -6067,7 +6229,7 @@ c & c & b & a & e
           \dim_set_eq:cc { l_@@_row _ \int_eval:n { \@@_i: + 1 } _ max _ dim } 
             { l_@@_row_\@@_i: _min_dim } 
         }
-      \int_step_variable:nNn { \g_@@_col_int - 1 } \@@_j:
+      \int_step_variable:nNn { \c@jCol - 1 } \@@_j:
         { 
           \dim_set:cn { l_@@_column _ \@@_j: _ max _ dim }  
             { 
@@ -6086,7 +6248,7 @@ c & c & b & a & e
         { l_@@_column _ 1 _ min _ dim } 
         \l_@@_left_margin_dim
       \dim_add:cn 
-        { l_@@_column _ \int_use:N \g_@@_col_int _ max _ dim } 
+        { l_@@_column _ \int_use:N \c@jCol _ max _ dim } 
         \l_@@_right_margin_dim
 %    \end{macrocode}
 % Now, we can actually create the ``large nodes''.
@@ -6112,7 +6274,7 @@ c & c & b & a & e
         \dim_gset:Nn \g_tmpa_dim \pgf@x 
         \tikz@parse@node \pgfutil@firstofone 
           ( nm - \int_use:N \g_@@_env_int - 1 - 
-                 \int_use:N \g_@@_col_int - large .north~east )
+                 \int_use:N \c@jCol - large .north~east )
         \dim_gset:Nn \g_tmpb_dim \pgf@x 
       \end { tikzpicture }      
       \iow_now:Nn \@mainaux \ExplSyntaxOn 
@@ -6220,7 +6382,8 @@ c & c & b & a & e
         inner~sep = \c_zero_dim ,
         name = nm - \int_use:N \g_@@_env_int - \@@_i: - \@@_j: ,
         alias = 
-          \str_if_empty:NF \l_@@_name_str { \l_@@_name_str - \@@_i: - \@@_j: }
+          \str_if_empty:NF \l_@@_name_str 
+            { \l_@@_name_str - \@@_i: - \@@_j: }
       ] 
       ; 
   }
@@ -6298,10 +6461,10 @@ c & c & b & a & e
     \tl_gput_left:Nx \g_@@_code_after_tl
       {
         \@@_Block_iv:nnnnn
-          { \int_use:N \g_@@_row_int }
-          { \int_use:N \g_@@_col_int }
-          { \int_eval:n { \g_@@_row_int + #1 - 1 } }
-          { \int_eval:n { \g_@@_col_int + #2 - 1 } }
+          { \int_use:N \c@iRow }
+          { \int_use:N \c@jCol }
+          { \int_eval:n { \c@iRow + #1 - 1 } }
+          { \int_eval:n { \c@jCol + #2 - 1 } }
           \exp_not:n { { #3 $ #4 $ } } 
       } 
   }
@@ -6335,8 +6498,8 @@ c & c & b & a & e
   { 
     \bool_if:nTF
       { 
-           \int_compare_p:nNn { #3 } > \g_@@_row_int 
-        || \int_compare_p:nNn { #4 } > \g_@@_col_int 
+           \int_compare_p:nNn { #3 } > \c@iRow 
+        || \int_compare_p:nNn { #4 } > \c@jCol 
       }
       { \msg_error:nnnn { nicematrix } { Block~too~large } { #1 } { #2 } }
       {
@@ -6461,17 +6624,13 @@ c & c & b & a & e
 \@@_msg_new:nn { Wrong~last~row }
   { 
     You~have~used~'last-row=\int_use:N \l_@@_last_row_int'~but~your~environment~
-    \{\g_@@_type_env_str\}~seems~to~have~\int_use:N \g_@@_row_int\ 
-    rows.~If~you~go~on,~the~value~of~\int_use:N \g_@@_row_int\ 
+    \{\g_@@_type_env_str\}~seems~to~have~\int_use:N \c@iRow 
+    rows.~If~you~go~on,~the~value~of~\int_use:N \c@iRow 
     will~be~used~for~last~row.~You~can~avoid~this~problem~by~using~'last-row'~
     without~value~(more~compilations~might~be~necessary).
   }
 %    \end{macrocode}     
 %
-%    \begin{macrocode}
-\@@_msg_new:nn { Draft~mode }
-  { The~compilation~is~in~draft~mode:~the~dotted~lines~won't~be~drawn. }
-%    \end{macrocode}
 %
 %    \begin{macrocode}
 \@@_msg_new:nn { Yet~in~env }
@@ -6616,6 +6775,8 @@ c & c & b & a & e
   }
 %    \end{macrocode}
 %
+% The following message should be changed because, normally, there can be any
+% longer artefact in the environments of \pkg{amsmath}.
 %    \begin{macrocode}
 \@@_msg_new:nnn { Duplicate~name }
   { 
@@ -6623,7 +6784,7 @@ c & c & b & a & e
     the~same~environment~name~twice.~You~can~go~on,~but,~
     maybe,~you~will~have~incorrect~results~especially~ 
     if~you~use~'columns-width=auto'.~If~you~use~nicematrix~inside~some~
-    environments~of~amsmath,~this~error~may~be~an~artefact.~In~this~case, 
+    environments~of~amsmath,~this~error~may~be~an~artefact.~In~this~case,~
     use~the~option~'allow-duplicate-names'.\\
     For~a~list~of~the~names~already~used,~type~H~<return>. \\ 
   }
@@ -6658,14 +6819,24 @@ c & c & b & a & e
     first~position~of~the~preamble~of~the~environment~\{\g_@@_type_env_str\}. \\
     If~you~go~on,~this~dotted~line~will~be~ignored.
   }
-%   \end{macrocode}
+%    \end{macrocode}
 %
 %
 % \subsection{Obsolete environments}
 %
+%    \begin{macrocode}
+\@@_msg_new:nn { Obsolete~environment }
+  {
+    The~environment~\{\@currenvir\}~is~obsolete.~
+    We~should~use~#1~instead.
+  }
+%    \end{macrocode}
+%
 %    \begin{macrocode} 
 \NewDocumentEnvironment { pNiceArrayC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~option~'last-col' }
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \pNiceArray
   }
@@ -6675,6 +6846,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { bNiceArrayC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~option~'last-col' }
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \bNiceArray
   }
@@ -6684,6 +6857,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { BNiceArrayC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~option~'last-col' }
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \BNiceArray
   }
@@ -6693,6 +6868,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { vNiceArrayC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~option~'last-col' }
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \vNiceArray
   }
@@ -6702,6 +6879,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { VNiceArrayC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~option~'last-col' }
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \VNiceArray
   }
@@ -6711,6 +6890,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { pNiceArrayRC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~options~'last-col'~and~'first-row' } 
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \int_set:Nn \l_@@_first_row_int \c_zero_int
     \pNiceArray
@@ -6721,6 +6902,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { bNiceArrayRC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~options~'last-col'~and~'first-row' } 
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \int_set:Nn \l_@@_first_row_int \c_zero_int
     \bNiceArray
@@ -6731,6 +6914,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { BNiceArrayRC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~options~'last-col'~and~'first-row' } 
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \int_set:Nn \l_@@_first_row_int \c_zero_int
     \BNiceArray
@@ -6741,6 +6926,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { vNiceArrayRC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~options~'last-col'~and~'first-row' } 
     \bool_set_true:N \l_@@_last_col_bool
     \int_set:Nn \l_@@_first_row_int \c_zero_int
     \vNiceArray
@@ -6751,6 +6938,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { VNiceArrayRC } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~options~'last-col'~and~'first-row' } 
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \int_set:Nn \l_@@_first_row_int \c_zero_int
     \VNiceArray
@@ -6761,6 +6950,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { NiceArrayCwithDelims } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~option~'last-col' }
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \NiceArrayWithDelims
   }
@@ -6770,6 +6961,8 @@ c & c & b & a & e
 %    \begin{macrocode} 
 \NewDocumentEnvironment { NiceArrayRCwithDelims } { }
   {
+    \msg_info:nnn { nicematrix } { Obsolete~environment } 
+      { the~options~'last-col'~and~'first-row' } 
     \int_set:Nn \l_@@_last_col_int \c_zero_dim
     \int_set:Nn \l_@@_first_row_int \c_zero_int
     \NiceArrayWithDelims
@@ -6778,7 +6971,7 @@ c & c & b & a & e
 %    \end{macrocode}
 %
 % 
-% 
+% \vspace{1cm}
 % \section{History}
 %
 % \subsection*{Changes between versions 1.0 and 1.1}
@@ -6850,15 +7043,15 @@ c & c & b & a & e
 % \subsection*{Changes between version 2.1.2 and 2.1.3}
 %
 % When searching the end of a dotted line from a command like |\Cdots| issued in
-% the ``main matrix'' (not in the column |C|), the cells in the column |C| are
-% considered as outside the matrix. That means that it's possible to do the
-% following matrix with only a |\Cdots| command (and a single |\Vdots|). 
-% \[\begin{pNiceArrayRC}{Wc{5mm}CWc{5mm}}
+% the ``main matrix'' (not in the exterior column), the cells in the exterior
+% column are considered as outside the matrix. That means that it's possible to
+% do the following matrix with only a |\Cdots| command (and a single |\Vdots|).
+% \[\begin{pNiceArray}{Wc{5mm}CWc{5mm}}[first-row,last-col]
 % & C_j & \\
 % \mbox{\Large $0$} & \Vdots & \mbox{\Large $0$} \\
 %              & \strut a & \Cdots &  L_i \\
 % \mbox{\Large $0$} &  & \mbox{\Large $0$} \\
-% \end{pNiceArrayRC}\]
+% \end{pNiceArray}\]
 %
 % \subsection*{Changes between version 2.1.3 and 2.1.4}
 %
@@ -6907,7 +7100,7 @@ c & c & b & a & e
 % Modification of |\Hdotsfor|. Now |\Hdotsfor| erases the |\vlines| (of ``"|"'')
 % as |\hdotsfor| does.
 %
-% Composition of exterior rows and columns of the four sides of the matrix (and
+% Composition of exterior rows and columns on the four sides of the matrix (and
 % not only on two sides) with the options |first-row|, |last-row|, |first-col|
 % and |last-col|.
 %
@@ -6918,8 +7111,8 @@ c & c & b & a & e
 % Error message when the user gives an incorrect value for |last-row|.
 %
 % A dotted line can no longer cross another dotted line (except the dotted lines
-% drawn by |\cdottedline|, |:| (in the preamble of the array) and |\line| in
-% |code-after|. 
+% drawn by |\cdottedline|, the symbol |:| (in the preamble of the array) and
+% |\line| in |code-after|. 
 %
 % The starred versions of |\Cdots|, |\Ldots|, etc. are now deprecated because,
 % with the new implementation, they become pointless. These starred versions
@@ -6960,8 +7153,24 @@ c & c & b & a & e
 % \pkg{nicematrix} when the class \cls{standalone} or the package
 % \pkg{standalone} is used. 
 % 
+% \subsection*{Changes between version 3.4 and 3.5} 
+%
+% Correction on a bug on the two previous versions where the |code-after| was
+% not executed.
 % 
+% \subsection*{Changes between version 3.5 and 3.6} 
+%
+% LaTeX counters |iRow| and |jCol| available in the cells of the array.
+% 
+% Addition of |\normalbaselines| before the construction of the array: in
+% environments like |{align}| of \pkg{amsmath} the value of |\baselineskip| is
+% changed and if the options |first-row| and |last-row| were used in an
+% environment of \pkg{nicematrix}, the position of the delimiters was wrong.
 % 
+% A warning is written in the |.log| file if an obsolete environment is used.
+%
+% There is no longer artificial errors |Duplicate~name| in the environments of
+% \pkg{amsmath}. 
 % \PrintIndex
 % 
 % \tableofcontents
@@ -6970,6 +7179,7 @@ c & c & b & a & e
 % Local Variables:
 % TeX-fold-mode: t
 % TeX-fold-preserve-comments: nil
+% ispell-local-dictionary: english
 % fill-column: 80
 % End:
 
-- 
cgit v1.2.3

