texlive[63723] Master/texmf-dist: nicematrix (25jun22)

commits+karl at tug.org commits+karl at tug.org
Sat Jun 25 22:23:47 CEST 2022


Revision: 63723
          http://tug.org/svn/texlive?view=revision&revision=63723
Author:   karl
Date:     2022-06-25 22:23:47 +0200 (Sat, 25 Jun 2022)
Log Message:
-----------
nicematrix (25jun22)

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

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

Modified: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2022-06-25 20:23:31 UTC (rev 63722)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2022-06-25 20:23:47 UTC (rev 63723)
@@ -136,11 +136,7 @@
 chargée). L'utilisateur final n'a qu'à charger l'extension \pkg{nicematrix} avec
 l'instruction habituelle : |\usepackage{nicematrix}|.
 
-\medskip
-Si vous utilisez une distribution TeX~Live, sachez que TeX~Live 2020 au minimum
-est requis pour faire fonctionner \pkg{nicematrix}.
 
-
 \medskip
 L'idée de \pkg{nicematrix} est de créer des nœuds \textsc{pgf} derrière les
 cases et les positions des filets des tableaux créés par \pkg{array} et de les
@@ -544,9 +540,8 @@
 |tikz|, voir p.~\pageref{tikz-key-examples} ;
 \item la clé |name| donne un nom au nœud Tikz rectangulaire correspondant au
 bloc ; on peut utiliser ce nom avec Tikz dans le |\CodeAfter| (cf.~p.~\pageref{code-after});
-\item \colorbox{yellow!50}{\textbf{Nouveau 6.5}}\enskip la clé
-|respect-arraystretch| évite la remise à $1$ de |\arraystretch| en début de
-bloc (qui a lieu par défaut) ;
+\item la clé |respect-arraystretch| évite la remise à $1$ de |\arraystretch| en
+début de bloc (qui a lieu par défaut) ;
 \item la clé |borders| permet de ne tracer que certaines des bordures du bloc :
 cette clé prend comme valeur une liste d'éléments parmi les suivants : |left|,
 |right|, |top| et |bottom| ; \newline
@@ -1173,12 +1168,11 @@
 \subsection{Commandes pour filets personnalisés}
 \label{custom-line}
 
-\colorbox{yellow!50}{\textbf{Nouveau 6.5}}\enskip Il est possible de définir des
-commandes et des lettres pour des filets personnalisés avec la clé
-|custom-line|, utilisable dans |\NiceMatrixOptions| ou bien dans un
-environnement. Cette clé prend en argument une liste de paires de la forme
-\textsl{clé=valeur}. Il y a d'abord deux clés pour spécifier les outils qui
-permettront d'utiliser ce nouveau type de filet.
+Il est possible de définir des commandes et des lettres pour des filets
+personnalisés avec la clé |custom-line|, utilisable dans |\NiceMatrixOptions| ou
+bien dans un environnement. Cette clé prend en argument une liste de paires de
+la forme \textsl{clé=valeur}. Il y a d'abord deux clés pour spécifier les outils
+qui permettront d'utiliser ce nouveau type de filet.
 
 \begin{itemize}
 \item la clé |command| indique le nom (sans la contre-oblique) d'une commande
@@ -1258,9 +1252,9 @@
 
 Par défaut aucune réservation de place n'est faite par défaut pour le filet qui
 sera tracé avec Tikz. On peut demander une réservation (horizontale pour un
-filet vertical et verticale pour un filet horizontal) avec la clé |width| qui
+filet vertical et verticale pour un filet horizontal) avec la clé |total-width| qui
 est donc en quelque sorte la largeur du filet qui sera tracé (cette largeur
-n'est pas déduite des caractéristiques fournies par la clé |tikz|).
+n'est pas calculée à partir des caractéristiques fournies par la clé |tikz|).
 
 \bigskip
 Voici ce que l'on obtient avec la clé |dotted| de Tikz.
@@ -1272,7 +1266,7 @@
      {
        letter = I , 
        ~emphase#tikz = dotted @ ,
-       ~emphase#width = \pgflinewidth@ 
+       ~emphase#total-width = \pgflinewidth@ 
      }
   }
 
@@ -1290,7 +1284,7 @@
      {
        letter = I , 
        tikz = dotted ,
-       width = \pgflinewidth
+       total-width = \pgflinewidth
      }
   }
 \begin{NiceTabular}{cIcIc}
@@ -1307,10 +1301,12 @@
 Comme on le voit dans l'exemple précédent, les pointillés tracés par la clé
 |dotted| de Tikz ne sont pas ronds. C'est pourquoi l'extension \pkg{nicematrix}
 propose dans la clé |custom-line| une clé |dotted| qui va tracer des pointillés
-ronds. La valeur de la clé |width| est, dans ce cas-là, déjà réglée sur le
-diamètre des points. Ces pointillés ronds sont aussi utilisés par
-\pkg{nicematrix} pour des lignes en pointillées continues créées entre deux
-composantes de la matrice par |\Cdots|, |\Vdots|, etc (voir p.~\pageref{Cdots}).
+ronds. La valeur initiale de la clé |total-width| est, dans ce cas-là, égale au
+diamètre des points (l'utilisateur peut quand même utiliser la clé |total-width|
+pour en changer la valeur). Ces pointillés ronds sont aussi utilisés par
+\pkg{nicematrix} pour des lignes en pointillés continues créées entre deux
+composantes de la matrice par |\Cdots|, |\Vdots|, etc. (voir
+p.~\pageref{Cdots}).
 
 \medskip
 L'extension \pkg{nicematrix} prédéfinit en fait la commande |\hdottedline| et la
@@ -2711,8 +2707,7 @@
 |renew-matrix|.\footnote{Comme toutes les autres options, les options
   |renew-dots|, |renew-matrix| peuvent être fixées avec la commande
   |\NiceMatrixOptions|, mais elles peuvent aussi être passées en option du
-  |\usepackage|. Remarquons que la clé |transparent| est un alias, considéré
-  comme obsolète, pour la conjonction des clés |renew-dots| et |renew-matrix|.}
+  |\usepackage|.}
 
 \smallskip
 
@@ -2791,7 +2786,7 @@
 \begin{itemize}
 \item |color| ;
 \item |radius| ; 
-\item |shorten| ;
+\item |shorten-start|, |shorten-end| et |shorten| ;
 \item |inter| ;
 \item |line-style|.
 \end{itemize}
@@ -2804,7 +2799,7 @@
 \begin{itemize}
 \item |xdots/color| ;
 \item |xdots/radius| ;
-\item |xdots/shorten| ;
+\item |xdots/shorten-start|, |xdots/shorten-end| et |xdots/shorten| ;
 \item |inter| ; 
 \item |xdots/line-style|.
 \end{itemize}
@@ -2832,12 +2827,15 @@
 \textbf{L'option xdots/shorten}\par\nobreak
 
 \smallskip
-L'option |xdots/shorten| indique la marge qui est laissée aux deux extrémités de
-la ligne. Le nom s'inspire des options «|shorten >|» et «|shorten <|» de Tikz,
-mais il faut remarquer que \pkg{nicematrix} ne propose que |xdots/shorten|. La
-valeur initiale de ce paramètre est de $0.3$~em (il est conseillé d'utiliser une
+Les clés |xdots/shorten-start| et |xdots/shorten-end| indiquent la marge qui est
+laissée aux deux extrémités de la ligne. La clé |xdots/shorten| fixe les deux
+clés simultanément. La valeur initiale de $0.3$~em (il est conseillé d'utiliser une
 unité de mesure dépendante de la fonte courante).
 
+\smallskip
+\colorbox{yellow!50}{\textbf{Nouveau 6.10}}\enskip Les clés
+|xdots/shorten-start| et |xdots/shorten-end| ont été introduites dans la
+version~6.10. Les versions précédentes ne proposaient que |xdots/shorten|. 
 
 \medskip
 \colorbox{yellow!50}{\textbf{Nouveau 6.9}}\enskip \textbf{L'option xdots/inter}\par\nobreak
@@ -2962,9 +2960,15 @@
 
 \label{line-in-code-after}
 La commande |\line| permet de tracer directement des lignes en pointillés entre
-les cases. Elle prend deux arguments correspondant aux deux cases à relier,
-chacun de la forme $i$-$j$ où $i$ est le numéro de ligne et $j$ est le numéro de
-colonne. Les options disponibles pour personnaliser les lignes pointillées créées par
+les cases. Elle prend deux arguments correspondant aux cases ou blocs à relier.
+Chacun de ces deux arguments peut être :
+\begin{itemize}
+\item une spécification de case de la forme $i$-$j$ où $i$ est le numéro de
+ligne et $j$ est le numéro de colonne ; 
+\item \colorbox{yellow!50}{\textbf{Nouveau 6.10}}\enskip le nom d'un bloc (créé
+avec la commande |\Block| en utilisant la clé |name| de cette commande).
+\end{itemize}
+ Les options disponibles pour personnaliser les lignes pointillées créées par
 |\Cdots|, |\Vdots|, etc. peuvent aussi être passées à cette commande (cf.
 p.~\pageref{customization}).
 
@@ -3355,7 +3359,7 @@
 \midrule
 Achard~emphase#\tabularnote{La famille Achard est une très ancienne famille du Poitou.}!
 & Jacques & 5 juin 1962 \\
-Lefèbvre~emphase#\tabularnote{Le patronyme Lefèbvre est une altération de Lefébure.}!
+Lefebvre~emphase#\tabularnote{Le patronyme Lefebvre est une altération de Lefébure.}!
 & Mathilde & 23 mai 1988 \\
 Vanesse & Stéphanie & 30 octobre 1994 \\
 Dupont & Chantal & 15 janvier 1998 \\
@@ -3656,11 +3660,11 @@
 \subsection{Commande \textbackslash ShowCellNames}
 
 \colorbox{yellow!50}{\textbf{Nouveau 6.9}} La commande |\ShowCellNames|,
-utilisable dans le |\CodeBefore| et dans le |\CodeAfter| affiche le nom (sous la
+utilisable dans le |\CodeBefore| et le |\CodeAfter| affiche le nom (sous la
 forme $i$-$j$) de chaque case.
 
 
-
+\medskip
 \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
 \begin{NiceTabular}{ccc}[hvlines,cell-space-limits=3pt]
 \CodeBefore
@@ -5422,7 +5426,7 @@
 \end{scope}
 
 \medskip
-Dans ce tableau, les instructions |\SubMatrix| sont exécutés après la
+Dans ce tableau, les instructions |\SubMatrix| sont exécutées après la
 composition du tableau et les traits verticaux sont donc tracés sans espacer les
 colonnes.
 

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

Modified: trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2022-06-25 20:23:31 UTC (rev 63722)
+++ trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2022-06-25 20:23:47 UTC (rev 63723)
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{6.9}
-\def\myfiledate{2022/05/25}
+\def\myfileversion{6.10}
+\def\myfiledate{2022/06/25}
 %
 %
 %<*batchfile>
@@ -181,13 +181,10 @@
 % \medskip
 % This package requires and \textbf{loads} the packages \pkg{l3keys2e},
 % \pkg{array}, \pkg{amsmath}, \pkg{pgfcore} and the module \pkg{shapes} of
-% \textsc{pgf} (\pkg{tikz}, which is a layer over \textsc{pgf} is \emph{not}
+% \textsc{pgf} (\pkg{tikz}, which is a layer over \textsc{pgf}, is \emph{not}
 % loaded). The final user only has to load the package with
 % |\usepackage{nicematrix}|.
 %
-% \medskip
-% If you use TeX~Live as TeX distribution, you should note that TeX~Live 2020 at
-% least is required by \pkg{nicematrix}.
 %
 % \medskip
 % The idea of \pkg{nicematrix} is to create \textsc{pgf} nodes under the cells
@@ -586,9 +583,8 @@
 % \item the key |name| provides a name to the rectangular Tikz node
 % corresponding to the block; it's possible to use that name with Tikz in the
 % |\CodeAfter| of the environment (cf.~p.~\pageref{code-after});
-% \item \colorbox{yellow!50}{\textbf{New 6.5}}\enskip the key
-% |respect-arraystretch| prevents the setting of |\arraystretch| to $1$ at the
-% beginning of the block (which is the behaviour by default) ;
+% \item the key |respect-arraystretch| prevents the setting of |\arraystretch|
+% to $1$ at the beginning of the block (which is the behaviour by default) ;
 % \item the key |borders| provides the ability to draw only some borders of the
 % blocks; the value of that key is a (comma-separated) list of elements covered
 % by |left|, |right|, |top| and |bottom|;\newline
@@ -1188,11 +1184,11 @@
 % \subsection{Commands for customized rules}
 % \label{custom-line}
 % 
-% \colorbox{yellow!50}{\textbf{New 6.5}}\enskip It's also possible to define commands
-% and letters for customized rules with the key |custom-line| available in
-% |\NiceMatrixOptions| and in the options of individual environments. That key
-% takes in as argument a list of \textsl{key=value} pairs. First, there is two
-% keys to define the tools which will be used to use that new type of rule.
+% It's also possible to define commands and letters for customized rules with
+% the key |custom-line| available in |\NiceMatrixOptions| and in the options of
+% individual environments. That key takes in as argument a list of
+% \textsl{key=value} pairs. First, there is two keys to define the tools which
+% will be used to use that new type of rule.
 % 
 % \begin{itemize}
 % \item the key |command| is the name (without the backslahs) of a command that
@@ -1256,10 +1252,10 @@
 % 
 % By default, no space is reserved for the rule that will be drawn with Tikz. It
 % is possible to specify a reservation (horizontal for a vertical rule and
-% vertical for an horizontal one) with the key |width|. That value of that key,
-% is, in some ways, the width of the rule that will be drawn (\pkg{nicematrix}
-% does not compute that width from the characteristics of the rule specified in
-% |tikz|).
+% vertical for an horizontal one) with the key |total-width|. That value of that
+% key, is, in some ways, the width of the rule that will be drawn
+% (\pkg{nicematrix} does not compute that width from the characteristics of the
+% rule specified in |tikz|).
 %
 %
 % \begin{center}
@@ -1285,7 +1281,7 @@
 %      {
 %        letter = I , 
 %        ~emphase#tikz = dotted@ ,
-%        ~emphase#width = \pgflinewidth@ 
+%        ~emphase#total-width = \pgflinewidth@ 
 %      }
 %   }
 %
@@ -1302,7 +1298,7 @@
 %      {
 %        letter = I , 
 %        tikz = dotted ,
-%        width = \pgflinewidth
+%        total-width = \pgflinewidth
 %      }
 %   }
 % \begin{NiceTabular}{cIcIc}
@@ -1318,8 +1314,9 @@
 %
 % As one can see, the dots of a dotted line of Tikz have the shape of a square,
 % and not a circle. That's why the extension \pkg{nicematrix} provides in the
-% key |custom-line| a key |dotted| which will draw rounded dots. The value of
-% the key |width| is, in this case, preset to the diameter of the dots. Those
+% key |custom-line| a key |dotted| which will draw rounded dots. The initial
+% value of the key |total-width| is, in this case, equal to the diameter of the dots
+% (but the user may change the value with the key |total-width| if needed). Those
 % dotted rules are also used by \pkg{nicematrix} to draw continuous dotted rules
 % between cells of the matrix with |\Cdots|, |\Vdots|, etc. (cf. p.~\pageref{Cdots}).
 %
@@ -1880,7 +1877,7 @@
 % preamble of the array). 
 % \end{itemize}
 %
-% \medskip
+% \smallskip
 % \begin{Verbatim}
 % \NewDocumentCommand { \Blue } { } { ~emphase#\columncolor{blue!15}@ }
 % \begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc} 
@@ -1937,7 +1934,7 @@
 % columns of type |p|, |b|, |m| and |X| (which start in
 % vertical mode).}
 % \item The key |bold| enforces
-% bold characters for the cells of the row, both in math mode and text mode.
+% bold characters for the cells of the row, both in math and text mode.
 % \end{itemize}
 % 
 % \medskip
@@ -2683,9 +2680,7 @@
 % |renew-dots| and |renew-matrix|.\footnote{The options |renew-dots|,
 % |renew-matrix| can be fixed with the command
 % |\NiceMatrixOptions| like the other options. However, they can also be fixed
-% as options of the command |\usepackage|. There is also a key |transparent|
-% which is an alias for the conjonction of |renew-dots| and |renew-matrix| but it
-% must be considered as obsolete.}
+% as options of the command |\usepackage|.}
 %
 % \smallskip
 %
@@ -2759,7 +2754,7 @@
 % \begin{itemize}
 % \item |color|;
 % \item |radius|;
-% \item |shorten|;
+% \item |shorten-start|, |shorten-end| and |shorten|;
 % \item |inter|;
 % \item |line-style|.
 % \end{itemize}
@@ -2771,7 +2766,7 @@
 % \begin{itemize}
 % \item |xdots/color|;
 % \item |xdots/radius|;
-% \item |xdots/shorten|;
+% \item |xdots/shorten-start|, |xdots/shorten-end| and |xdots/shorten|;
 % \item |xdots/inter|;
 % \item |xdots/line-style|.
 % \end{itemize}
@@ -2796,12 +2791,16 @@
 % \textbf{The option xdots/shorten}\par\nobreak
 %
 % \smallskip
-% The option |xdots/shorten| fixes the margin of both extremities of the line.
-% The name is derived from the options ``|shorten >|'' and ``|shorten <|'' of
-% Tikz but one should notice that \pkg{nicematrix} only provides
-% |xdots/shorten|. The initial value of this parameter is 0.3~em (it is
-% recommanded to use a unit of length dependent of the current font).
+% The keys |xdots/shorten-start| and |xdots/shorten-end| fix the margin at the
+% extremities of the line. The key |xdots/shorten| fixes both parameters. 
+% The initial value is 0.3~em (it is recommanded to use a unit of length
+% dependent of the current font). 
 % 
+% \smallskip
+% \colorbox{yellow!50}{\textbf{New 6.10}}\enskip The keys |xdots/shorten-start|
+% and |xdots/shorten-end| have been introduced in version 6.10. In the previous
+% versions, there was only |xdots/shorten|.
+% 
 % \bigskip
 % \colorbox{yellow!50}{\textbf{New 6.9}}\enskip 
 % \textbf{The option xdots/inter}\par\nobreak
@@ -2926,11 +2925,17 @@
 % \subsection{The command \textbackslash line in the \textbackslash CodeAfter}
 % 
 % \label{line-in-code-after}
-% The command |\line| draws directly dotted lines between nodes. It takes in two
-% arguments for the two cells to link, both of the form $i$-$j$ where is the
-% number of the row and $j$ is the number of the column. The options available
-% for the customisation of the dotted lines created by |\Cdots|, |\Vdots|, etc.
-% are also available for this command (cf. p.~\pageref{customisation}).
+% The command |\line| draws directly dotted lines between cells or blocks. It takes in two
+% arguments for the cells or blocks to link. Both argument may be:
+% \begin{itemize}
+% \item a specification of cell of the form  $i$-$j$ where is the
+% number of the row and $j$ is the number of the column;
+% \item \colorbox{yellow!50}{\textbf{New 6.10}}\enskip the name of a block
+% (created by the command |\Block| with the key |name| of that command).
+% \end{itemize}
+% The options available for the customisation of the dotted lines created by
+% |\Cdots|, |\Vdots|, etc. are also available for this command (cf.
+% p.~\pageref{customisation}).
 %
 % \bigskip
 % This command may be used, for example, to draw a dotted line between two
@@ -5750,8 +5755,22 @@
 \cs_new_protected:Npn \@@_fatal:n { \msg_fatal:nn { nicematrix } }
 \cs_new_protected:Npn \@@_fatal:nn { \msg_fatal:nnn { nicematrix } }
 \cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { nicematrix } }
-\cs_new_protected:Npn \@@_msg_new:nnn { \msg_new:nnnn { nicematrix } }
 %    \end{macrocode}
+%
+% With Overleaf, a document is compiled in non-stop mode. When there is an
+% error, there is no way to the user to use the key H in order to have more
+% information. That's why we decide to put that piece of information (for the
+% messages with such information) in the main part of the message when the key
+% |messages-for-Overleaf| is used (at load-time).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_msg_new:nnn #1 #2 #3
+  {
+    \bool_if:NTF \c_@@_messages_for_Overleaf_bool
+      { \msg_new:nnn { nicematrix } { #1 } { #2 \\ #3 } }
+      { \msg_new:nnnn { nicematrix } { #1 } { #2 } { #3 } }
+  }
+
+%    \end{macrocode}
 % 
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_msg_redirect_name:nn 
@@ -5758,7 +5777,7 @@
   { \msg_redirect_name:nnn { nicematrix } }
 %    \end{macrocode}
 %
-%
+% 
 % \bigskip
 % \subsection*{Technical  definitions}
 %
@@ -6212,6 +6231,13 @@
 \int_new:N \g_@@_row_total_int
 \int_new:N \g_@@_col_total_int
 %    \end{macrocode}
+%
+% \bigskip
+% The following parameter will be used by |\@@_create_row_node:| to avoid to
+% create the same row-node twice (at the end of the array).
+%    \begin{macrocode}
+\int_new:N \g_@@_last_row_node_int 
+%    \end{macrocode}
 % 
 % \bigskip
 % The following counter corresponds to the key |nb-rows| of the command
@@ -6301,6 +6327,13 @@
 %    \begin{macrocode}
 \dim_new:N \l_@@_tabular_width_dim
 %    \end{macrocode}
+%
+% \bigskip
+% The following dimension will be used for the total width of composite rules
+% (\emph{total} means that the spaces on both sides are included).
+%    \begin{macrocode}
+\dim_new:N \l_@@_rule_width_dim 
+%    \end{macrocode}
 % 
 % \bigskip
 % If the user uses an environment without preamble, we will raise the following
@@ -6598,8 +6631,7 @@
 %
 % 
 % \medskip
-% If the user has used the key |corners| (or the key |hvlines-except-corners|,
-% even though that key is deprecated), all the cells which are in an (empty)
+% If the user has used the key |corners|, all the cells which are in an (empty)
 % corner will be stored in the following sequence.
 %    \begin{macrocode}
 \seq_new:N \l_@@_corners_cells_seq
@@ -6646,7 +6678,7 @@
 % \medskip
 % The following sequence will be used when the command |\SubMatrix| is used in
 % the |\CodeBefore| (and not in the |\CodeAfter|). It will contain the position of
-% all the sub-matrices specified in the |code-before|. Each sub-matrix is
+% all the sub-matrices specified in the |\CodeBefore|. Each sub-matrix is
 % represented by an ``object'' of the forme |{|$i$|}{|$j$|}{|$k$|}{|$l$|}| 
 % where $i$ and $j$ are the number of row and column of the upper-left cell and 
 % $k$ and $l$ the number of row and column of the lower-right cell.
@@ -7171,7 +7203,7 @@
 % \bigskip
 % By default, the behaviour of |\cline| is changed in the environments of
 % \pkg{nicematrix}: a |\cline| spreads the array by an amount equal to
-% |\arrayrulewidht|. It's possible to disable this feature with the key
+% |\arrayrulewidth|. It's possible to disable this feature with the key
 % |\l_@@_standard_line_bool|. 
 %    \begin{macrocode}
 \bool_new:N \l_@@_standard_cline_bool
@@ -7203,9 +7235,13 @@
 % 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_new:N \l_@@_xdots_shorten_start_dim
+\dim_new:N \l_@@_xdots_shorten_end_dim
 \hook_gput_code:nnn { begindocument } { . } 
-  { \dim_set:Nn \l_@@_xdots_shorten_dim { 0.3 em } }
+  { 
+    \dim_set:Nn \l_@@_xdots_shorten_start_dim { 0.3 em } 
+    \dim_set:Nn \l_@@_xdots_shorten_end_dim { 0.3 em } 
+  }
 %    \end{macrocode}
 % We use a hook only by security in case \cls{revtex4-1} is used (even though it
 % is obsolete).
@@ -7419,12 +7455,23 @@
     color .value_required:n = true ,
     shorten .code:n = 
       \hook_gput_code:nnn { begindocument } { . } 
-        { \dim_set:Nn \l_@@_xdots_shorten_dim { #1 } } ,
+        { 
+          \dim_set:Nn \l_@@_xdots_shorten_start_dim { #1 } 
+          \dim_set:Nn \l_@@_xdots_shorten_end_dim { #1 } 
+        } ,
+    shorten-start .code:n = 
+      \hook_gput_code:nnn { begindocument } { . } 
+        { \dim_set:Nn \l_@@_xdots_shorten_start_dim { #1 } } ,
+    shorten-end .code:n = 
+      \hook_gput_code:nnn { begindocument } { . } 
+        { \dim_set:Nn \l_@@_xdots_shorten_end_dim { #1 } } ,
 %    \end{macrocode}
 % We use a hook only by security in case \cls{revtex4-1}
 % is used (even though it is obsolete). Idem for the following keys.
 %    \begin{macrocode}
     shorten .value_required:n = true ,
+    shorten-start .value_required:n = true ,
+    shorten-end .value_required:n = true ,
     radius .code:n = 
       \hook_gput_code:nnn { begindocument } { . } 
         { \dim_set:Nn \l_@@_xdots_radius_dim { #1 } } ,
@@ -7566,17 +7613,7 @@
 % The key |hvlines-except-corners| is now deprecated (use |hvlines| and
 % |corners| instead).
 %    \begin{macrocode}
-    hvlines-except-corners .code:n = 
-      { 
-        \@@_error:n { hvlines-except-corners } 
-        \group_begin:
-        \globaldefs = 1
-        \@@_msg_redirect_name:nn { hvlines-except-corners } { none }
-        \group_end:
-        \clist_set:Nn \l_@@_corners_clist { #1 }
-        \clist_set:Nn \l_@@_vlines_clist { all }
-        \clist_set:Nn \l_@@_hlines_clist { all }
-      } ,
+    hvlines-except-corners .code:n = \@@_fatal:n { hvlines-except-corners } ,
     hvlines-except-corners .default:n = { NW , SW , NE , SE } ,
     corners .clist_set:N = \l_@@_corners_clist ,
     corners .default:n = { NW , SW , NE , SE } ,
@@ -7783,24 +7820,6 @@
     allow-duplicate-names .code:n = 
       \@@_msg_redirect_name:nn { Duplicate~name } { none } ,
     allow-duplicate-names .value_forbidden:n = true ,
-%    \end{macrocode}
-%
-% \bigskip
-% The key |letter-for-dotted-lines| is now obsolete. You will delete it in a
-% future version.
-%    \begin{macrocode}
-    letter-for-dotted-lines .code:n = 
-      {
-        \@@_error:n { letter-for-dotted-lines }
-        \group_begin:
-        \globaldefs = 1
-        \@@_msg_redirect_name:nn { letter-for-dotted-lines } { none }
-        \group_end:
-        \tl_if_single_token:nTF { #1 }
-          { \str_set:Nx \l_@@_letter_for_dotted_lines_str { #1 } }
-          { \@@_error:n { One~letter~allowed } } 
-      } ,
-    letter-for-dotted-lines .value_required:n = true ,
     notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
     notes .value_required:n = true ,
     sub-matrix .code:n = 
@@ -7811,11 +7830,6 @@
 %    \end{macrocode}
 %
 %
-% The following string will initially be empty. It will be set by the key
-% 'letter-for-dotted-lines'. 
-%    \begin{macrocode}
-\str_new:N \l_@@_letter_for_dotted_lines_str
-%    \end{macrocode}
 %       
 % \bigskip
 % |\NiceMatrixOptions| is the command of the \pkg{nicematrix} package to fix
@@ -7947,7 +7961,7 @@
     \tl_gclear:N \g_@@_post_action_cell_tl
 %    \end{macrocode}
 % At the beginning of the cell, we link |\CodeAfter| to a command which do
-% begins with |\\| (whereas the standard version of |\CodeAfter| begins does
+% begins with |\\| (whereas the standard version of |\CodeAfter| does
 % not).
 %    \begin{macrocode}
     \cs_set_eq:NN \CodeAfter \@@_CodeAfter_i:
@@ -8353,7 +8367,18 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_create_row_node:
   {
+    \int_compare:nNnT \c at iRow > \g_@@_last_row_node_int 
+      { 
+        \int_gset_eq:NN \g_@@_last_row_node_int \c at iRow
+        \@@_create_row_node_i: 
+      }
+  }
 %    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_create_row_node_i:
+  {
+%    \end{macrocode}
 % The |\hbox:n| (or |\hbox|) is mandatory.
 %    \begin{macrocode}
     \hbox
@@ -8786,6 +8811,16 @@
     \seq_gclear_new:N \g_@@_multicolumn_sizes_seq
 %    \end{macrocode}
 % 
+% \bigskip
+% The command |\create_row_node:| will create a row-node (and not a row of
+% nodes!). However, at the end of the array we construct a ``false row'' (for
+% the the col-nodes) and it interfers with the construction of the last row-node
+% of the array. We don't want to create such row-node twice (to avaid warnings
+% or, maybe, errors). That's why the command |\@@_create_row_node:| will use the
+% following counter to avoid such construction.
+%    \begin{macrocode}
+    \int_gset:Nn \g_@@_last_row_node_int { -1 }
+%    \end{macrocode}
 % 
 % \interitem
 % The code in |\@@_pre_array_ii:| is used only here.
@@ -8850,10 +8885,10 @@
 %    \end{macrocode}
 %
 % \bigskip
-% The following command |\@@_pre_array_i:w| will be used when the keyword
+% The following command |\@@_CodeBefore_Body:w| will be used when the keyword
 % |\CodeBefore| is present at the beginning of the environment.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_pre_array_i:w #1 \Body
+\cs_new_protected_nopar:Npn \@@_CodeBefore_Body:w #1 \Body
   {
     \tl_put_right:Nn \l_@@_code_before_tl { #1 }
     \bool_set_true:N \l_@@_code_before_bool
@@ -8970,7 +9005,7 @@
 %    \end{macrocode}
 %
 % We compose the |\CodeBefore| in math mode in order to nullify the spaces put
-% by the user between instructions in the |code-before|.
+% by the user between instructions in the |\CodeBefore|.
 %    \begin{macrocode}
     \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
 %    \end{macrocode}
@@ -9291,10 +9326,10 @@
 % |\CodeBefore| at the beginning of the body of the environment. If that keyword
 % is present, we have now to extract all the content between that keyword
 % |\CodeBefore| and the (other) keyword |\Body|. It's the job that will do the
-% command |\@@_pre_array_i:w|. After that job, the command |\@@_pre_array_i:w|
+% command |\@@_CodeBefore_Body:w|. After that job, the command |\@@_CodeBefore_Body:w|
 % will go on with |\@@_pre_array:|.
 %    \begin{macrocode}
-    \IfBooleanTF { #6 } \@@_pre_array_i:w \@@_pre_array: 
+    \IfBooleanTF { #6 } \@@_CodeBefore_Body:w \@@_pre_array: 
   }
 %    \end{macrocode}
 % 
@@ -9789,18 +9824,13 @@
         \q_stop { }
       }
       { 
-        \str_case_e:nnF { #1 }
-          {
-            \l_@@_letter_for_dotted_lines_str 
-              { \@@_patch_preamble_xii:n #1 }  
-            \l_@@_letter_vlism_tl 
-              { 
-                \seq_gput_right:Nx \g_@@_cols_vlism_seq 
-                  { \int_eval:n { \c at jCol + 1 } }
-                \tl_gput_right:Nx \g_@@_preamble_tl
-                  { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } }
-                \@@_patch_preamble:n
-              }
+        \str_if_eq:nVTF { #1 } \l_@@_letter_vlism_tl 
+          { 
+            \seq_gput_right:Nx \g_@@_cols_vlism_seq 
+              { \int_eval:n { \c at jCol + 1 } }
+            \tl_gput_right:Nx \g_@@_preamble_tl
+              { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } }
+            \@@_patch_preamble:n
           }
 %    \end{macrocode}
 % Now the case of a letter set by the final user for a customized rule. Such
@@ -9814,9 +9844,11 @@
 % will use, instead, letters in the preamble of its array).
 %    \begin{macrocode}
           { 
-            \keys_set_known:nnN { NiceMatrix / ColumnTypes } { #1 } \l_tmpa_tl  
-            \tl_if_empty:NTF \l_tmpa_tl 
-              \@@_patch_preamble:n
+            \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 } 
+              {
+                \keys_set:nn { NiceMatrix / ColumnTypes } { #1 } 
+                \@@_patch_preamble:n 
+              }
               { \@@_fatal:nn { unknown~column~type } { #1 } }
           }
       }
@@ -10485,21 +10517,6 @@
   }
 %    \end{macrocode}
 %
-% \bigskip
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_patch_preamble_xii:n #1
-  {
-    \tl_gput_right:Nn \g_@@_preamble_tl
-      { ! { \skip_horizontal:N 2\l_@@_xdots_radius_dim } }
-%    \end{macrocode}
-% The command |\@@_vdottedline:n| is protected, and, therefore, won't be
-% expanded before writing on |\g_@@_internal_code_after_tl|.
-%    \begin{macrocode}
-    \tl_gput_right:Nx \g_@@_internal_code_after_tl
-      { \@@_vdottedline:n { \int_use:N \c at jCol } }
-    \@@_patch_preamble:n
-  }
-%    \end{macrocode}
 % 
 % \bigskip
 % After a specifier of column, we have to test whether there is one or several
@@ -10908,8 +10925,14 @@
         \@@_create_extra_nodes:
         \seq_if_empty:NF \g_@@_blocks_seq \@@_draw_blocks: 
       }
+%    \end{macrocode}
+% We don't do the following test with |\c at tabularnote| because the value of that
+% counter is not reliable when the command |\ttabbox| of \pkg{floatrow} is used
+% (because |\ttabbox| de-activate |\stepcounter| because if compiles several
+% twice its tabular).
+%    \begin{macrocode}
     \bool_lazy_or:nnT
-      { \int_compare_p:nNn \c at tabularnote > 0 }
+      { ! \seq_if_empty_p:N \g_@@_tabularnotes_seq }
       { ! \tl_if_empty_p:V \l_@@_tabularnote_tl }
       \@@_insert_tabularnotes:
     \end { minipage }
@@ -11881,7 +11904,7 @@
             \seq_gset_from_clist:Nn \exp_not:N \g_@@_pos_of_blocks_seq
               { \seq_use:Nnnn \g_@@_pos_of_blocks_seq , , , }
           }
-      }
+      } 
     \seq_if_empty:NF \g_@@_multicolumn_cells_seq
       {
         \tl_gput_right:Nx \g_@@_aux_tl
@@ -11981,10 +12004,14 @@
         \dim_set:Nn \l_@@_xdots_radius_dim { 0.7 \l_@@_xdots_radius_dim }
         \dim_set:Nn \l_@@_xdots_inter_dim { 0.55 \l_@@_xdots_inter_dim } 
 %    \end{macrocode}
-% The dimension |\l_@@_xdots_shorten_dim| corresponds to the option
-% |xdots/shorten| available to the user. 
+% The dimensions |\l_@@_xdots_shorten_start_dim| and
+% |\l_@@_xdots_shorten_start_dim| correspond to the options
+% |xdots/shorten-start| and |xdots/shorten-end| available to the user. 
 %    \begin{macrocode}
-        \dim_set:Nn \l_@@_xdots_shorten_dim { 0.6 \l_@@_xdots_shorten_dim }
+        \dim_set:Nn \l_@@_xdots_shorten_start_dim 
+          { 0.6 \l_@@_xdots_shorten_start_dim }
+        \dim_set:Nn \l_@@_xdots_shorten_end_dim 
+          { 0.6 \l_@@_xdots_shorten_end_dim }
       }
 %    \end{macrocode}
 %
@@ -13217,8 +13244,8 @@
     \draw 
       [ 
         #1 , 
-        shorten~> = \l_@@_xdots_shorten_dim , 
-        shorten~< = \l_@@_xdots_shorten_dim , 
+        shorten~> = \l_@@_xdots_shorten_end_dim , 
+        shorten~< = \l_@@_xdots_shorten_start_dim , 
       ]
           ( \l_@@_x_initial_dim , \l_@@_y_initial_dim )
 %    \end{macrocode}
@@ -13338,7 +13365,7 @@
             \int_set:Nn \l_tmpa_int 
               { 
                 \dim_ratio:nn 
-                  { \l_@@_l_dim - \l_@@_xdots_shorten_dim } 
+                  { \l_@@_l_dim - \l_@@_xdots_shorten_start_dim } 
                   \l_@@_xdots_inter_dim 
               }
           }
@@ -13349,7 +13376,7 @@
             \int_set:Nn \l_tmpa_int 
               { 
                 \dim_ratio:nn 
-                  { \l_@@_l_dim - \l_@@_xdots_shorten_dim } 
+                  { \l_@@_l_dim - \l_@@_xdots_shorten_end_dim } 
                   \l_@@_xdots_inter_dim 
               }
           }
@@ -13357,7 +13384,10 @@
             \int_set:Nn \l_tmpa_int 
               { 
                 \dim_ratio:nn 
-                  { \l_@@_l_dim - 2 \l_@@_xdots_shorten_dim  } 
+                  { 
+                    \l_@@_l_dim 
+                    - \l_@@_xdots_shorten_start_dim - \l_@@_xdots_shorten_end_dim
+                  } 
                   \l_@@_xdots_inter_dim
               }
           }
@@ -13380,19 +13410,6 @@
       }
 %    \end{macrocode}
 %
-% The length $\ell$ is the length of the dotted line. We note $\Delta$ the
-% length between two dots and $n$ the number of intervals between dots. We note
-% $\delta = \frac12(\ell - n \Delta)$. The distance between the initial
-% extremity of the line and the first dot will be equal to $k\cdot\delta$ where 
-% $k=0$, $1$ or $2$. We first compute this number $k$ in |\l_tmpb_int|.
-%    \begin{macrocode}
-    \int_set:Nn \l_tmpb_int
-      { 
-        \bool_if:NTF \l_@@_initial_open_bool
-          { \bool_if:NTF \l_@@_final_open_bool 1 0 }
-          { \bool_if:NTF \l_@@_final_open_bool 2 1 }
-      }
-%    \end{macrocode}
 % In the loop over the dots, the dimensions |\l_@@_x_initial_dim| and
 % |\l_@@_y_initial_dim| will be used for the coordinates of the dots. But,
 % before the loop, we must move until the first dot.
@@ -13402,17 +13419,21 @@
       {  
         ( \l_@@_x_final_dim - \l_@@_x_initial_dim ) *
         \dim_ratio:nn 
-          { \l_@@_l_dim - \l_@@_xdots_inter_dim * \l_tmpa_int }
+          { 
+            \l_@@_l_dim - \l_@@_xdots_inter_dim * \l_tmpa_int 
+            + \l_@@_xdots_shorten_start_dim - \l_@@_xdots_shorten_end_dim 
+          }
           { 2 \l_@@_l_dim }
-        * \l_tmpb_int
       }
     \dim_gadd:Nn \l_@@_y_initial_dim 
       {   
         ( \l_@@_y_final_dim - \l_@@_y_initial_dim ) * 
         \dim_ratio:nn 
-          { \l_@@_l_dim - \l_@@_xdots_inter_dim * \l_tmpa_int } 
+          { 
+            \l_@@_l_dim - \l_@@_xdots_inter_dim * \l_tmpa_int 
+            + \l_@@_xdots_shorten_start_dim - \l_@@_xdots_shorten_end_dim 
+          }
           { 2 \l_@@_l_dim } 
-        * \l_tmpb_int
       }
     \pgf at relevantforpicturesizefalse
     \int_step_inline:nnn 0 \l_tmpa_int
@@ -13856,13 +13877,25 @@
 % array (in the format $i$-$j$) and draws a dotted line between these cells. 
 % 
 % \medskip
-% First, we write a command with an argument of the format $i$-$j$ and applies
-% the command |\int_eval:n| to $i$ and~$j$ ; this must \emph{not} be protected
-% (and is, of course fully expandable).\footnote{Indeed, we want that the user
-% may use the command |\line| in |\CodeAfter| with LaTeX counters in the
-% arguments --- with the command |\value|.}
+% First, we write a command with the following behaviour:
+% \begin{itemize}
+% \item If the argument is of the format $i$-$j$, our command applies
+% the command |\int_eval:n| to $i$ and~$j$ ; 
+% \item If not (that is to say, when it's a name of a |\Block|), the argument is
+% left unchanged. 
+% \end{itemize}
+% This must \emph{not} be protected (and is, of course fully
+% expandable).\footnote{Indeed, we want that the user may use the command
+% |\line| in |\CodeAfter| with LaTeX counters in the arguments --- with the
+% command |\value|.}
 %    \begin{macrocode}
 \cs_new:Npn \@@_double_int_eval:n #1-#2 \q_stop
+  { 
+    \tl_if_empty:nTF { #2 }
+      { #1 }
+      { \@@_double_int_eval_i:n #1-#2 \q_stop }
+  }
+\cs_new:Npn \@@_double_int_eval_i:n #1-#2- \q_stop
   { \int_eval:n { #1 } - \int_eval:n { #2 } }
 %    \end{macrocode}
 %
@@ -13885,8 +13918,8 @@
           \use:e
             {
               \@@_line_i:nn 
-                { \@@_double_int_eval:n #2 \q_stop }
-                { \@@_double_int_eval:n #3 \q_stop }
+                { \@@_double_int_eval:n #2 - \q_stop }
+                { \@@_double_int_eval:n #3 - \q_stop }
             }
         \group_end:
       } 
@@ -14762,13 +14795,6 @@
     start .int_set:N = \l_@@_start_int ,
     start .initial:n = 1 , 
     end .int_set:N = \l_@@_end_int ,
-%    \end{macrocode}
-% The following keys are no-op because there are keys which may be inherited
-% from a list of pairs \textsl{key=value} of a definition of a customized rule
-% (with the key |custom-line| of |\NiceMatrixOptions|).
-%    \begin{macrocode}
-    % letter .code:n = \prg_do_nothing: ,
-    % command .code:n = \prg_do_nothing: 
   }
 %    \end{macrocode}
 %
@@ -14800,8 +14826,9 @@
     tikz .tl_set:N = \l_@@_tikz_rule_tl , 
     tikz .value_required:n = true ,
     tikz .initial:n = ,
-    width .dim_set:N = \l_@@_rule_width_dim ,
-    width .value_required:n = true 
+    total-width .dim_set:N = \l_@@_rule_width_dim ,
+    total-width .value_required:n = true ,
+    width .meta:n = { total-width = #1 } 
   }
 %    \end{macrocode}
 % 
@@ -14919,13 +14946,8 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_vline_ii:
   {
-    \bool_set_false:N \l_@@_dotted_boo
-%    \end{macrocode}
-% We use |\keys_set_known:nV| and not |\keys_set:nV| because there may be the
-% keys |letter| and |command| in the list (these keys are present if the rule
-% comes from a customized line (created by |custom-line|).
-%    \begin{macrocode}
-    \keys_set_known:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl 
+    \bool_set_false:N \l_@@_dotted_bool
+    \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl 
     \bool_if:NTF \l_@@_dotted_bool
       \@@_vline_iv: 
       {
@@ -14937,8 +14959,8 @@
 %    \end{macrocode}
 % 
 % \bigskip
-% First the case of a standard rule, that is to say a rule which is not dotted
-% (and the user has not used the key |tikz|).
+% First the case of a standard rule: the user has not used the key |dotted| nor
+% the key |tikz|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_vline_iii:
   {
@@ -14948,7 +14970,14 @@
     \@@_qpoint:n { row - \int_use:N \l_@@_local_start_int }
     \dim_set_eq:NN \l_tmpa_dim \pgf at y
     \@@_qpoint:n { col - \int_use:N \l_@@_position_int }
-    \dim_set_eq:NN \l_tmpb_dim \pgf at x
+    \dim_set:Nn \l_tmpb_dim 
+      { 
+        \pgf at x  
+        - 0.5 \l_@@_rule_width_dim 
+        + 
+        ( \arrayrulewidth * \l_@@_multiplicity_int  
+           + \doublerulesep * ( \l_@@_multiplicity_int - 1 ) ) / 2
+      }
     \@@_qpoint:n { row - \int_eval:n { \l_@@_local_end_int + 1 } }
     \dim_set_eq:NN \l_@@_tmpc_dim \pgf at y
     \bool_lazy_all:nT
@@ -15001,8 +15030,8 @@
     \pgfrememberpicturepositiononpagetrue
     \pgf at relevantforpicturesizefalse
     \@@_qpoint:n { col - \int_use:N \l_@@_position_int }
-    \dim_set_eq:NN \l_@@_x_initial_dim \pgf at x 
-    \dim_set_eq:NN \l_@@_x_final_dim \pgf at x 
+    \dim_set:Nn \l_@@_x_initial_dim { \pgf at x - 0.5 \l_@@_rule_width_dim }
+    \dim_set_eq:NN \l_@@_x_final_dim \l_@@_x_initial_dim 
     \@@_qpoint:n { row - \int_use:N \l_@@_local_start_int }
     \dim_set_eq:NN \l_@@_y_initial_dim \pgf at y
     \@@_qpoint:n { row - \int_eval:n { \l_@@_local_end_int + 1 } }
@@ -15057,7 +15086,7 @@
       { 
         \tl_if_eq:NnF \l_@@_vlines_clist { all } 
           { \clist_if_in:NnT \l_@@_vlines_clist { ##1 } }
-          { \@@_vline:n { position = ##1 } }
+          { \@@_vline:n { position = ##1 , total-width = \arrayrulewidth } }
       }
   }
 %    \end{macrocode}
@@ -15174,12 +15203,7 @@
 \cs_new_protected:Npn \@@_hline_ii:
   {
     \bool_set_false:N \l_@@_dotted_bool
-%    \end{macrocode}
-% We use |\keys_set_known:nV| and not |\keys_set:nV| because there may be the
-% keys |letter| and |command| in the list (these keys are present if the rule
-% comes from a customized line (created by |custom-line|).
-%    \begin{macrocode}
-    \keys_set_known:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl 
+    \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl 
     \bool_if:NTF \l_@@_dotted_bool
       \@@_hline_iv: 
       {
@@ -15191,7 +15215,7 @@
 %    \end{macrocode}
 %
 % \bigskip
-% First the case of a standard rule, that is to say a rule which is not dotted.
+% First the case of a standard rule (without the keys |dotted| and |tikz|).
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_hline_iii:
   {
@@ -15201,7 +15225,14 @@
     \@@_qpoint:n { col - \int_use:N \l_@@_local_start_int }
     \dim_set_eq:NN \l_tmpa_dim \pgf at x
     \@@_qpoint:n { row - \int_use:N \l_@@_position_int }
-    \dim_set_eq:NN \l_tmpb_dim \pgf at y
+    \dim_set:Nn \l_tmpb_dim 
+      { 
+        \pgf at y
+        - 0.5 \l_@@_rule_width_dim 
+        + 
+        ( \arrayrulewidth * \l_@@_multiplicity_int  
+           + \doublerulesep * ( \l_@@_multiplicity_int - 1 ) ) / 2
+      }
     \@@_qpoint:n { col - \int_eval:n { \l_@@_local_end_int + 1 } }
     \dim_set_eq:NN \l_@@_tmpc_dim \pgf at x
     \bool_lazy_all:nT
@@ -15294,8 +15325,8 @@
     \pgfrememberpicturepositiononpagetrue
     \pgf at relevantforpicturesizefalse
     \@@_qpoint:n { row - \int_use:N \l_@@_position_int }
-    \dim_set_eq:NN \l_@@_y_initial_dim \pgf at y
-    \dim_set_eq:NN \l_@@_y_final_dim \pgf at y 
+    \dim_set:Nn \l_@@_y_initial_dim { \pgf at y - 0.5 \l_@@_rule_width_dim } 
+    \dim_set_eq:NN \l_@@_y_final_dim \l_@@_y_initial_dim
     \@@_qpoint:n { col - \int_use:N \l_@@_local_start_int }
     \dim_set_eq:NN \l_@@_x_initial_dim \pgf at x
     \int_compare:nNnT \l_@@_local_start_int = 1 
@@ -15371,7 +15402,7 @@
       { 
         \tl_if_eq:NnF \l_@@_hlines_clist { all } 
           { \clist_if_in:NnT \l_@@_hlines_clist { ##1 } }
-          { \@@_hline:n { position = ##1 } }
+          { \@@_hline:n { position = ##1 , total-width = \arrayrulewidth } }
       }
   }
 %    \end{macrocode}
@@ -15452,21 +15483,52 @@
   {
     \str_clear_new:N \l_@@_command_str
     \str_clear_new:N \l_@@_letter_str
-    \dim_zero_new:N \l_@@_rule_width_dim 
+    \keys_set_known:nnN { NiceMatrix / custom-line } { #1 } \l_@@_other_keys_tl
 %    \end{macrocode}
-% The token list |\l_tmpa_tl| is for the key |color|.
+% If the final user only wants to draw horizontal rules, he does not need to
+% specify a letter (for the vertical rules in the preamble of the array). On the
+% other hand, if he only wants to draw vertical rules, he does not need to
+% define a command (which is the tool to draw horizontal rules in the array). Of
+% course, a definition of custom lines with no letter and no command would be point-less.
+% 
 %    \begin{macrocode}
-    \tl_clear:N \l_tmpa_tl
+    \bool_lazy_and:nnTF 
+      { \str_if_empty_p:N \l_@@_letter_str }
+      { \str_if_empty_p:N \l_@@_command_str }
+      { \@@_error:n { No~letter~and~no~command } }
+      { \exp_args:NV \@@_custom_line_i:n \l_@@_other_keys_tl }
+  }
 %    \end{macrocode}
-% The flag |\l_tmpa_bool| will indicate whether the key |tikz| is present.
+% 
+% 
+% 
 %    \begin{macrocode}
-    \bool_set_false:N \l_tmpa_bool
+\keys_define:nn { NiceMatrix / custom-line }
+  {
+    % here, we will use change in the future to use .str_set:N 
+    letter .code:n = \str_set:Nn \l_@@_letter_str { #1 } , 
+    letter .value_required:n = true ,
+    % here, we will use change in the future to use .str_set:N 
+    command .code:n = \str_set:Nn \l_@@_command_str { #1 } , 
+    command .value_required:n = true ,
+  }
 %    \end{macrocode}
-% The flag |\l_tmpb_bool| will indicate whether the key |width| is present.
+%
+% \bigskip
 %    \begin{macrocode}
-    \bool_set_false:N \l_tmpb_bool
-    \keys_set_known:nn { NiceMatrix / Custom-Line } { #1 } 
-    \bool_if:NT \l_tmpa_bool 
+\cs_new_protected:Npn \@@_custom_line_i:n #1 
+  {
+%    \end{macrocode}
+% The following flags will be raised when the keys |tikz|, |dotted| and |color|
+% are used (in the |custom-line|).
+%    \begin{macrocode}
+    \bool_set_false:N \l_@@_tikz_rule_bool
+    \bool_set_false:N \l_@@_dotted_rule_bool
+    \bool_set_false:N \l_@@_color_bool
+%    \end{macrocode}
+%    \begin{macrocode}
+    \keys_set:nn { NiceMatrix / custom-line-bis } { #1 } 
+    \bool_if:NT \l_@@_tikz_rule_bool
       {
 %    \end{macrocode}
 % We can't use |\c_@@_tikz_loaded_bool| to test whether \pkg{tikz} is loaded
@@ -15474,118 +15536,108 @@
 %    \begin{macrocode}
         \cs_if_exist:NF \tikzpicture
           { \@@_error:n { tikz~in~custom-line~without~tikz } }
-        \tl_if_empty:NF \l_tmpa_tl 
+        \bool_if:NT \l_@@_color_bool
           { \@@_error:n { color~in~custom-line~with~tikz } }
       }
-    \bool_if:NT \l_tmpb_bool
+    \bool_if:nT 
       { 
-        \bool_if:NF \l_tmpa_bool 
-          { \@@_error:n { key~width~without~key~tikz } }
+        \int_compare_p:nNn \l_@@_multiplicity_int > 1 
+        && \l_@@_dotted_rule_bool
       }
-%    \end{macrocode}
-% If the final user only wants to draw horizontal rules, he does not need to
-% specify a letter (for the vertical rules in the preamble of the array). On the
-% other hand, if he only wants to draw vertical rules, he does not need to
-% define a command (which is the tool to draw horizontal rules in the array). Of
-% course, a definition of custom lines with no letter and no command would be point-less.
-% 
-%    \begin{macrocode}
-    \bool_lazy_and:nnTF 
-      { \str_if_empty_p:N \l_@@_letter_str }
-      { \str_if_empty_p:N \l_@@_command_str }
-      { \@@_error:n { No~letter~and~no~command } }
+      { \@@_error:n { key~multiplicity~with~dotted } }
+    \str_if_empty:NF \l_@@_letter_str 
       {
-        \str_if_empty:NF \l_@@_letter_str 
+        \int_compare:nTF { \str_count:N \l_@@_letter_str != 1 }
+          { \@@_error:n { Several~letters } }
           {
-            \int_compare:nNnTF { \str_count:N \l_@@_letter_str } = 1 
-              {
-                \exp_args:NnV \tl_if_in:NnTF 
-                  \c_@@_forbidden_letters_str \l_@@_letter_str  
-                  { \@@_error:n { Forbidden~letter } }
-                  {
+            \exp_args:NnV \tl_if_in:NnTF 
+              \c_@@_forbidden_letters_str \l_@@_letter_str  
+              { \@@_error:n { Forbidden~letter } }
+              { 
 %    \end{macrocode}
 % The final user can, locally, redefine a letter of column type. That's
 % compatible with the use of |\keys_define:nn|: the definition is local and may
 % overwrite a previous definition.
 %    \begin{macrocode}
-                    \keys_define:nx { NiceMatrix / ColumnTypes }
-                      {
-                        \l_@@_letter_str .code:n = 
-                          { \@@_custom_line_i:n { \exp_not:n { #1 } } }
-                      } 
-                  } 
-              }
-              { \@@_error:n { Several~letters } }
-          }
-        \str_if_empty:NF \l_@@_command_str
-          { 
+                 \keys_define:nx { NiceMatrix / ColumnTypes }
+                   {
+                     \l_@@_letter_str .code:n = 
+                       { \@@_v_custom_line:n { \exp_not:n { #1 }  } }
+                   }
+               } 
+           }
+       }
+    \str_if_empty:NF \l_@@_command_str { \@@_h_custom_line:n { #1 } }
+  } 
 %    \end{macrocode}
-% The flag |\l_tmpa_bool| means that the key 'tikz' have been used. When the key
-% 'tikz' has not been used, the width of the rule is computed with the
-% multiplicity of the rule.
-%    \begin{macrocode}
-            \bool_if:NF \l_tmpa_bool
-              { 
-                \dim_set:Nn \l_@@_rule_width_dim 
-                  { 
-                    \arrayrulewidth * \l_@@_tmpc_int 
-                    + \doublerulesep * ( \l_@@_tmpc_int - 1 ) 
-                  }
-              }
-            \@@_define_h_custom_line:nV { #1 } \l_@@_rule_width_dim 
-          }
-      }
-  }
-%    \end{macrocode}
 %
+% 
 %    \begin{macrocode}
 \str_const:Nn \c_@@_forbidden_letters_str { lcrpmbVX|()[]!@<> }
 %    \end{macrocode}
 % 
 % \medskip
-% The previous command |\@@_custom_line:n| uses the following set of keys.
+% The previous command |\@@_custom_line_i:n| uses the following set of keys.
 % However, the whole definition of the customized lines (as provided by the
 % final user as argument of |custom-line|) will also be used further with
 % other sets of keys (for instance |{NiceMatrix/Rules}|). That's why the
-% following set of keys has only entries for a few keys. 
+% following set of keys has some keys which are no-op.
 %    \begin{macrocode}
-\keys_define:nn { NiceMatrix / Custom-Line }
+\keys_define:nn { NiceMatrix / custom-line-bis }
   {
-    % here, we will use change in the future to use .tl_set:N 
-    letter .code:n = \str_set:Nn \l_@@_letter_str { #1 } , 
-    letter .value_required:n = true ,
-    % here, we will use change in the future to use .tl_set:N 
-    command .code:n = \str_set:Nn \l_@@_command_str { #1 } , 
-    command .value_required:n = true , 
-    multiplicity .int_set:N = \l_@@_tmpc_int , 
+    multiplicity .int_set:N = \l_@@_multiplicity_int , 
     multiplicity .initial:n = 1 , 
     multiplicity .value_required:n = true ,
-    color .tl_set:N = \l_tmpa_tl , 
-    color .value_required:n = true ,  
+    color .code:n = \bool_set_true:N \l_@@_color_bool ,
+    color .value_required:n = true ,
+    tikz .code:n = \bool_set_true:N \l_@@_tikz_rule_bool ,
+    tikz .value_required:n = true ,
+    dotted .code:n = \bool_set_true:N \l_@@_dotted_rule_bool ,
+    dotted .value_forbidden:n = true ,
+    total-width .code:n = { } , 
+    total-width .value_required:n = true ,
+    width .code:n = { } , 
+    width .value_required:n = true ,
+    sep-color .code:n = { } , 
+    sep-color .value_required:n = true ,
+    unknown .code:n = \@@_error:n { Unknown~key~for~custom-line }
+  }
 %    \end{macrocode}
-% When the key |tikz| is used, the rule will be drawn with Tikz by using the set
-% of keys specified in the value of that key |tikz|.
+%
+% The following keys will indicate whether the keys |dotted|, |tikz| and |color|
+% are used in the use of a |custom-line|.
 %    \begin{macrocode}
-    tikz .code:n = \bool_set_true:N \l_tmpa_bool ,
+\bool_new:N \l_@@_dotted_rule_bool
+\bool_new:N \l_@@_tikz_rule_bool
+\bool_new:N \l_@@_color_bool
 %    \end{macrocode}
-% The key |width| must be used only when the key |tikz| is used. When used, the
-% key |width| specifies the width of the rule: it will be used to reserve space
-% (in the preamble of the array or in the command for the horizontal rules).
+% 
+% \bigskip
+% The following keys are used to determine the total width of the line
+% (including the spaces on both sides of the line). The key |width| is
+% deprecated and has been replaced by the key |total-width|.
+% 
 %    \begin{macrocode}
-    width .code:n = \dim_set:Nn \l_@@_rule_width_dim { #1 } 
-                    \bool_set_true:N \l_tmpb_bool ,
-    width .value_required:n = true , 
-    unknown .code:n = \@@_error:n { Unknown~key~for~custom-line }
+\keys_define:nn { NiceMatrix / custom-line-width }
+  {
+    multiplicity .int_set:N = \l_@@_multiplicity_int , 
+    multiplicity .initial:n = 1 , 
+    multiplicity .value_required:n = true ,
+    tikz .code:n = \bool_set_true:N \l_@@_tikz_rule_bool ,
+    total-width .code:n = \dim_set:Nn \l_@@_rule_width_dim { #1 } 
+                          \bool_set_true:N \l_@@_total_width_bool ,
+    total-width .value_required:n = true , 
+    width .meta:n = { total-width = #1 } ,
+    dotted .code:n = \bool_set_true:N \l_@@_dotted_rule_bool ,
   }
 %    \end{macrocode}
 % 
 % \bigskip
 % The following command will create the command that the final user will use in
-% its array to draw a horizontal rule (hence the `|h|` in the name). |#1| is the
-% whole set of keys to pass to |\@@_line:n| and |#2| is the widht of the whole
-% rule. 
+% its array to draw an horizontal rule (hence the `|h|` in the name). |#1| is the
+% whole set of keys to pass to |\@@_line:n|.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_define_h_custom_line:nn #1 #2 
+\cs_new_protected:Npn \@@_h_custom_line:n #1
   {
 %    \end{macrocode}
 % We use |\cs_set:cpn| and not |\cs_new:cpn| because we want a local definition.
@@ -15595,37 +15647,68 @@
       { 
         \noalign
           {
-            \skip_vertical:n { #2 }
+            \@@_compute_rule_width:n { #1 }
+            \skip_vertical:n { \l_@@_rule_width_dim }
             \tl_gput_right:Nx \g_@@_internal_code_after_tl
-              { \@@_hline:n { #1 , position = \int_eval:n { \c at iRow + 1 } } }
+              { 
+                \@@_hline:n 
+                  { 
+                    #1 , 
+                    position = \int_eval:n { \c at iRow + 1 } ,
+                    total-width = \dim_use:N \l_@@_rule_width_dim
+                  } 
+              }
           }
       }
     \seq_put_left:NV \l_@@_custom_line_commands_seq \l_@@_command_str
   }
-\cs_generate_variant:Nn \@@_define_h_custom_line:nn { n V }
+\cs_generate_variant:Nn \@@_h_custom_line:nn { n V }
 %    \end{macrocode}
 % 
-% The flag |\l_tmpa_bool| means that the key 'tikz' have been used. When the key
-% 'tikz' has not been used, the width of the rule is computed with the
-% multiplicity of the rule.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_custom_line_i:n #1 
+\cs_new_protected:Npn \@@_compute_rule_width:n #1 
   {
-    \bool_if:NF \l_tmpa_bool
-      {
-        \dim_set:Nn \l_@@_rule_width_dim 
-          { 
-            \arrayrulewidth * \l_@@_tmpc_int
-            + \doublerulesep * ( \l_@@_tmpc_int - 1)  
-          } 
+    \bool_set_false:N \l_@@_tikz_rule_bool
+    \bool_set_false:N \l_@@_total_width_bool
+    \bool_set_false:N \l_@@_dotted_rule_bool
+    \keys_set_known:nn { NiceMatrix / custom-line-width } { #1 }
+    \bool_if:NF \l_@@_total_width_bool
+      { 
+        \bool_if:NTF \l_@@_dotted_rule_bool
+          { \dim_set:Nn \l_@@_rule_width_dim { 2 \l_@@_xdots_radius_dim } }
+          {
+            \bool_if:NF \l_@@_tikz_rule_bool
+              { 
+                \dim_set:Nn \l_@@_rule_width_dim 
+                  { 
+                    \arrayrulewidth * \l_@@_multiplicity_int 
+                    + \doublerulesep * ( \l_@@_multiplicity_int - 1 ) 
+                  }
+              }
+          }
       }
+  }
+%    \end{macrocode}
+%
+% 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_v_custom_line:n #1 
+  {
+    \@@_compute_rule_width:n { #1 }
+%    \end{macrocode}
+% In the following line, the |\dim_use:N| is mandatory since we do an expansion.
+%    \begin{macrocode}
     \tl_gput_right:Nx \g_@@_preamble_tl
+      { \exp_not:N ! { \skip_horizontal:n { \dim_use:N \l_@@_rule_width_dim } } }
+    \tl_gput_right:Nx \g_@@_internal_code_after_tl
       { 
-        \exp_not:N ! 
-          { \skip_horizontal:n { \dim_use:N \l_@@_rule_width_dim } } 
+        \@@_vline:n 
+          { 
+            #1 , 
+            position = \int_eval:n { \c at jCol + 1 } ,
+            total-width = \dim_use:N \l_@@_rule_width_dim 
+          } 
       }
-     \tl_gput_right:Nx \g_@@_internal_code_after_tl
-      { \@@_vline:n { #1 , position = \int_eval:n { \c at jCol + 1 } } }
   }
 %    \end{macrocode}
 %
@@ -15641,7 +15724,7 @@
 % |#1|, |#2|, |#3| and |#4|. If this rule would be in the block (it must not be
 % drawn), the boolean |\l_tmpa_bool| is set to |false|.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_test_hline_in_block:nnnnn #1 #2 #3 #4
+\cs_new_protected:Npn \@@_test_hline_in_block:nnnnn #1 #2 #3 #4 #5
   {
     \bool_lazy_all:nT
       {
@@ -15656,7 +15739,7 @@
 %
 % The same for vertical rules.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_test_vline_in_block:nnnnn #1 #2 #3 #4
+\cs_new_protected:Npn \@@_test_vline_in_block:nnnnn #1 #2 #3 #4 #5
   {
     \bool_lazy_all:nT
       {
@@ -15884,62 +15967,7 @@
   }
 %    \end{macrocode}
 %
-% 
-% \bigskip
-% \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.
-%
-% \textbf{Horizontal dotted lines}\par\nobreak
-%
-% \medskip
-% The following command must \emph{not} be protected because it's meant to be
-% expanded in a |\noalign|.
-%    \begin{macrocode}
-\cs_new:Npn \@@_hdottedline: 
-  {
-    \noalign { \skip_vertical:N 2\l_@@_xdots_radius_dim } 
-    \@@_hdottedline_i:
-  }
-%    \end{macrocode}
-%
-% \medskip
-% On the other side, the following command should be protected.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_hdottedline_i:
-  { 
-%    \end{macrocode}
-% We write in the internal |\CodeAfter| the instruction that will actually draw
-% the dotted line. It's not possible to draw this dotted line now because we
-% don't know the length of the line (we don't even know the number of columns).
-%    \begin{macrocode}
-    \tl_gput_right:Nx \g_@@_internal_code_after_tl
-      { \@@_hdottedline:n { \int_use:N \c at iRow } } 
-  }
-%    \end{macrocode}
-%
-%
-% \medskip
-% The command |\@@_hdottedline:n| is the command written in the internal
-% |\CodeAfter| that will actually draw the dotted line. Its argument is the
-% number of the row \emph{before} which we will draw the row.
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_hdottedline:n #1
-  { \@@_hline:n { position = #1 , end = \int_use:N \c at jCol , dotted } } 
-%    \end{macrocode}
-%
-%
-%
-% \bigskip
-% \textbf{Vertical dotted lines}\par\nobreak
-%
-% \medskip
-%    \begin{macrocode}
-\cs_new_protected:Npn \@@_vdottedline:n #1
-  { \@@_vline:n { position = \int_eval:n { #1 + 1 } , dotted } }
-%    \end{macrocode}
-% 
 % \bigskip 
 % \subsection*{The environment \{NiceMatrixBlock\}}
 %
@@ -16935,7 +16963,7 @@
 % |\multicolumn| and the |\diagbox| in that sequence).
 %    \begin{macrocode}
         \seq_gput_left:Nx \g_@@_pos_of_blocks_seq 
-          { { #1 } { #2 } { #3 } { #4 } { \l_@@_block_name_str } } 
+          { { #1 } { #2 } { #3 } { #4 } { \l_@@_block_name_str } }  
       }
 %    \end{macrocode}
 % 
@@ -17441,7 +17469,8 @@
               { 
                 position = ##1 , 
                 start = \l_@@_tmpd_tl , 
-                end = \int_eval:n { \l_tmpb_tl - 1 }
+                end = \int_eval:n { \l_tmpb_tl - 1 } ,
+                total-width = \arrayrulewidth 
               } 
           }
       }
@@ -18096,7 +18125,7 @@
     hvlines .value_forbidden:n = true ,
     name .code:n = 
       \tl_if_empty:nTF { #1 } 
-        { \@@_error:n { Invalid~name~format } }
+        { \@@_error:n { Invalid~name } }
         {
           \regex_match:nnTF { \A[A-Za-z][A-Za-z0-9]*\Z } { #1 }
             { 
@@ -18107,7 +18136,7 @@
                   \seq_gput_right:Nn \g_@@_submatrix_names_seq { #1 }
                 }
             }
-            { \@@_error:n { Invalid~name~format } }
+            { \@@_error:n { Invalid~name } }
         } ,
     rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } ,
     rules .value_required:n = true ,
@@ -18240,10 +18269,10 @@
               }
           }
         \dim_compare:nNnTF \l_@@_x_initial_dim = \c_max_dim
-          { \@@_error:nn { impossible~delimiter } { left } }
+          { \@@_error:nn { Impossible~delimiter } { left } }
           {
             \dim_compare:nNnTF \l_@@_x_final_dim = { - \c_max_dim }
-              { \@@_error:nn { impossible~delimiter } { right } }
+              { \@@_error:nn { Impossible~delimiter } { right } }
               { \@@_sub_matrix_i:nnnn { #1 } { #4 } { #6 } { #7 } }
           }
         \endpgfpicture
@@ -18826,39 +18855,47 @@
 %    \begin{macrocode}
 \NewDocumentCommand \@@_ShowCellNames { }
  {
+   \dim_zero_new:N \g_@@_tmpc_dim
+   \dim_zero_new:N \g_@@_tmpd_dim
+   \dim_zero_new:N \g_@@_tmpe_dim
    \int_step_inline:nn \c at iRow
      {
-       \begin { tikzpicture }
+       \begin { pgfpicture }
        \@@_qpoint:n { row - ##1 } 
        \dim_set_eq:NN \l_tmpa_dim \pgf at y
        \@@_qpoint:n { row - \int_eval:n { ##1 + 1 } } 
        \dim_gset:Nn \g_tmpa_dim { ( \l_tmpa_dim + \pgf at y ) / 2 }
        \dim_gset:Nn \g_tmpb_dim { \l_tmpa_dim - \pgf at y }
-       \end { tikzpicture }
+       \end { pgfpicture }
        \int_step_inline:nn \c at jCol
          {
            \hbox_set:Nn \l_tmpa_box 
              { \normalfont \Large \color { red ! 50 } ##1 - ####1 } 
-           \begin { tikzpicture }
+           \begin { pgfpicture }
            \@@_qpoint:n { col - ####1 } 
-           \dim_set_eq:NN \l_@@_tmpc_dim \pgf at x
+           \dim_gset_eq:NN \g_@@_tmpc_dim \pgf at x
            \@@_qpoint:n { col - \int_eval:n { ####1 + 1 } } 
-           \dim_set:Nn \l_tmpa_dim { \pgf at x - \l_@@_tmpc_dim }
+           \dim_gset:Nn \g_@@_tmpd_dim { \pgf at x - \g_@@_tmpc_dim }
+           \dim_gset_eq:NN \g_@@_tmpe_dim \pgf at x
+           \end { pgfpicture }
            \fp_set:Nn \l_tmpa_fp 
              { 
                \fp_min:nn
                  {
                    \fp_min:nn 
-                     { \dim_ratio:nn { \l_tmpa_dim } { \box_wd:N \l_tmpa_box } }
+                     { \dim_ratio:nn { \g_@@_tmpd_dim } { \box_wd:N \l_tmpa_box } }
                      { \dim_ratio:nn { \g_tmpb_dim } { \box_ht_plus_dp:N \l_tmpa_box } } 
                  }
                  { 1.0 }
              }
            \box_scale:Nnn \l_tmpa_box { \fp_use:N \l_tmpa_fp } { \fp_use:N \l_tmpa_fp }
+           \pgfpicture
+           \pgfrememberpicturepositiononpagetrue
+           \pgf at relevantforpicturesizefalse
            \pgftransformshift 
              { 
                \pgfpoint 
-                 { 0.5 * ( \l_@@_tmpc_dim + \pgf at x ) } 
+                 { 0.5 * ( \g_@@_tmpc_dim + \g_@@_tmpe_dim ) } 
                  { \dim_use:N \g_tmpa_dim } 
              } 
            \pgfnode
@@ -18867,7 +18904,7 @@
              { \box_use:N \l_tmpa_box }
              { }
              { }
-           \end { tikzpicture }
+           \endpgfpicture
          }
      }
  }
@@ -18889,6 +18926,13 @@
 % instruction is executed. 
 %
 % \medskip
+% The boolean |\c_@@_messages_for_Overleaf_bool| corresponds to the key
+% |messages-for-Overleaf|. 
+%    \begin{macrocode}
+\bool_new:N \c_@@_messages_for_Overleaf_bool
+%    \end{macrocode}
+% 
+% \medskip
 % The boolean |\g_@@_footnotehyper_bool| will indicate if the option
 % |footnotehyper| is used.
 %    \begin{macrocode}
@@ -18904,17 +18948,17 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nnn { Unknown~key~for~package } 
+\msg_new:nnnn { nicematrix } { Unknown~key~for~package } 
   { 
     The~key~'\l_keys_key_str'~is~unknown. \\
-    If~you~go~on,~it~will~be~ignored. \\
+    That~key~will~be~ignored. \\
     For~a~list~of~the~available~keys,~type~H~<return>.
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
-    allow-letter-for-dotted-lines,~
     footnote,~
     footnotehyper,~
+    messages-for-Overleaf,~
     renew-dots,~and
     renew-matrix.
   }
@@ -18928,18 +18972,9 @@
     renew-dots .value_forbidden:n = true ,
     renew-matrix .code:n = \@@_renew_matrix: ,
     renew-matrix .value_forbidden:n = true ,
-    transparent .code:n = \@@_fatal:n { Key~transparent } ,
-    transparent .value_forbidden:n = true,
+    messages-for-Overleaf .bool_set:N = \c_@@_messages_for_Overleaf_bool , 
     footnote .bool_set:N = \c_@@_footnote_bool ,
     footnotehyper .bool_set:N = \c_@@_footnotehyper_bool ,
-    allow-letter-for-dotted-lines .code:n =  
-     { 
-       \group_begin:
-       \globaldefs = 1
-       \@@_msg_redirect_name:nn { letter-for-dotted-lines } { none }
-       \group_end: 
-     } ,
-    allow-letter-for-dotted-lines .value_forbidden:n = true , 
     unknown .code:n = \@@_error:n { Unknown~key~for~package } 
   }
 \ProcessKeysOptions { NiceMatrix / Package }
@@ -18954,7 +18989,7 @@
     If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~  
     within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~
     of~the~package~footnotehyper.\\
-    If~you~go~on,~the~package~footnote~won't~be~loaded.
+    The~package~footnote~won't~be~loaded.
   }
 %    \end{macrocode}
 %
@@ -18966,7 +19001,7 @@
     If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~  
     within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~
     of~the~package~footnote.\\ 
-    If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+    The~package~footnotehyper~won't~be~loaded.
   }
 %    \end{macrocode}
 %
@@ -19013,8 +19048,15 @@
 % \bigskip
 % \subsection*{Error messages of the package}
 %
+%    \begin{macrocode}
+\bool_if:NTF \c_@@_messages_for_Overleaf_bool
+  { \str_const:Nn \c_@@_available_keys_str { } }
+  {
+    \str_const:Nn \c_@@_available_keys_str
+      { For~a~list~of~the~available~keys,~type~H~<return>. }
+  }
+%    \end{macrocode}
 % 
-%
 %    \begin{macrocode}
 \seq_new:N \g_@@_types_of_matrix_seq
 \seq_gset_from_clist:Nn \g_@@_types_of_matrix_seq
@@ -19028,10 +19070,10 @@
 % 
 % \bigskip
 % If the user uses too much columns, the command |\@@_error_too_much_cols:| is
-% executed. This command raises an error but try to give the best information to
-% the user in the error message. The command |\seq_if_in:NVTF| is not expandable
-% and that's why we can't put it in the error message itself. We have to do the
-% test before the |\@@_fatal:n|.
+% triggered. This command raises an error but also tries to give the best
+% information to the user in the error message. The command |\seq_if_in:NVTF| is
+% not expandable and that's why we can't put it in the error message itself. We
+% have to do the test before the |\@@_fatal:n|.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_error_too_much_cols:
   { 
@@ -19060,8 +19102,19 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { negative~weight }
   {
+    Negative~weight.\\
     The~weight~of~the~'X'~columns~must~be~positive~and~you~have~used~
-    the~value~'#1'.~If~you~go~on,~the~absolute~value~will~be~used.
+    the~value~'#1'.\\
+    The~absolute~value~will~be~used.
+  }  
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { last~col~not~used }
+  {
+    Column~not~used.\\
+    The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
+    in~your~\@@_full_name_env:.~However,~you~can~go~on.
   }
 %    \end{macrocode}
 % 
@@ -19068,10 +19121,12 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { too~much~cols~for~matrix~with~last~col }
   { 
-    You~try~to~use~more~columns~than~allowed~by~your~
-    \@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~
-    columns~is~\int_eval:n { \l_@@_last_col_int - 1 }~(plus~the~
-    exterior~columns).~This~error~is~fatal.
+    Too~much~columns.\\
+    In~the~row~\int_eval:n { \c at jCol - 1 },~
+    you~try~to~use~more~columns~
+    than~allowed~by~your~\@@_full_name_env:.\@@_message_hdotsfor:\ 
+    The~maximal~number~of~columns~is~\int_eval:n { \l_@@_last_col_int - 1 }~
+    (plus~the~exterior~columns).~This~error~is~fatal.
   }
 %    \end{macrocode}
 % 
@@ -19079,7 +19134,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { too~much~cols~for~matrix }
   { 
-    You~try~to~use~more~columns~than~allowed~by~your~
+    Too~much~columns.\\
+    In~the~row~\int_eval:n { \c at jCol - 1 },~
+    you~try~to~use~more~columns~than~allowed~by~your~
     \@@_full_name_env:.\@@_message_hdotsfor:\ Recall~that~the~maximal~
     number~of~columns~for~a~matrix~is~fixed~by~the~LaTeX~counter~
     'MaxMatrixCols'.~Its~actual~value~is~\int_use:N \c at MaxMatrixCols.~
@@ -19094,7 +19151,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { too~much~cols~for~array }
   { 
-    You~try~to~use~more~columns~than~allowed~by~your~
+    Too~much~columns.\\
+    In~the~row~\int_eval:n { \c at jCol - 1 },~
+    ~you~try~to~use~more~columns~than~allowed~by~your~
     \@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~columns~is~ 
     \int_use:N \g_@@_static_num_of_col_int\ 
     ~(plus~the~potential~exterior~ones).~ 
@@ -19105,27 +19164,21 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { hvlines-except-corners } 
   { 
+    Obsolete~key.\\
     The~key~'hvlines-except-corners'~is~now~obsolete.~You~should~instead~use~the~ 
     keys~'hvlines'~and~'corners'.\\
-    However,~you~can~go~on~for~this~time.~This~message~won't~be~shown~anymore~
-    in~this~document.
+    This~error~is~fatal.
   }
 %    \end{macrocode}
 % 
-%    \begin{macrocode}
-\@@_msg_new:nn { last~col~not~used }
-  {
-    The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
-    in~your~\@@_full_name_env:.~However,~you~can~go~on.
-  }
-%    \end{macrocode}
 % 
 %    \begin{macrocode}
 \@@_msg_new:nn { columns~not~used }
   {
+    Columns~not~used.\\
     The~preamble~of~your~\@@_full_name_env:\ announces~\int_use:N
     \g_@@_static_num_of_col_int\ columns~but~you~use~only~\int_use:N \c at jCol.\\ 
-    You~can~go~on~but~the~columns~you~did~not~used~won't~be~created.
+    The~columns~you~did~not~used~won't~be~created.
   }
 %    \end{macrocode}
 %
@@ -19133,8 +19186,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { in~first~col }
   {
+    Erroneous~use.\\
     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.
+    That~command~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19141,8 +19195,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { in~last~col }
   {
+    Erroneous~use.\\
     You~can't~use~the~command~#1 in~the~last~column~(exterior)~of~the~array.\\
-    If~you~go~on,~this~command~will~be~ignored.
+    That~command~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19149,8 +19204,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { in~first~row }
   {
+    Erroneous~use.\\
     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.
+    That~command~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19158,7 +19214,7 @@
 \@@_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.
+    That~command~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19165,6 +19221,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { double~closing~delimiter }
   {
+    Double~delimiter.\\
     You~can't~put~a~second~closing~delimiter~"#1"~just~after~a~first~closing~
     delimiter.~This~delimiter~will~be~ignored.
   }
@@ -19173,8 +19230,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { delimiter~after~opening }
   {
+    Double~delimiter.\\
     You~can't~put~a~second~delimiter~"#1"~just~after~a~first~opening~
-    delimiter.~This~delimiter~will~be~ignored.
+    delimiter.~That~delimiter~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19181,17 +19239,19 @@
 %    \begin{macrocode}  
 \@@_msg_new:nn { bad~option~for~line-style }
   {
+    Bad~line~style.\\
     Since~you~haven't~loaded~Tikz,~the~only~value~you~can~give~to~'line-style'~
-    is~'standard'.~If~you~go~on,~this~key~will~be~ignored.
+    is~'standard'.~That~key~will~be~ignored.
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nnn { Unknown~key~for~custom-line } 
+\@@_msg_new:nnn { Unknown~key~for~custom-line }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~in~a~'custom-line'.~
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    It~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19201,7 +19261,7 @@
     letter,~
     multiplicity,~
     sep-color,~
-    tikz,~and~width.
+    tikz,~and~tota-width.
   }
 %    \end{macrocode}
 %
@@ -19208,10 +19268,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Unknown~key~for~xdots } 
   {
+    Unknown~key.\\
     As~for~now,~there~is~only~five~keys~available~here:~'color',~'inter',~
     'line-style',~'radius',~
     and~'shorten'~(and~you~try~to~use~'\l_keys_key_str').~
-    If~you~go~on,~this~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19219,66 +19280,65 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Unknown~key~for~rowcolors } 
   {
+    Unknown~key.\\
     As~for~now,~there~is~only~two~keys~available~here:~'cols'~and~'respect-blocks'~ 
-    (and~you~try~to~use~'\l_keys_key_str').~If~you~go~on,~
-    this~key~will~be~ignored. 
+    (and~you~try~to~use~'\l_keys_key_str')\\
+    That~key~will~be~ignored. 
   }
 %    \end{macrocode}
 %
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { ampersand~in~light-syntax }
+\@@_msg_new:nn { Construct~too~large }
   {
-    You~can't~use~an~ampersand~(\token_to_str:N &)~to~separate~columns~because~
-    ~you~have~used~the~key~'light-syntax'.~This~error~is~fatal.
+    Construct~too~large.\\
+    Your~command~\token_to_str:N #1
+    can't~be~drawn~because~your~matrix~is~too~small.\\
+    That~command~will~be~ignored. 
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { Construct~too~large }
+\@@_msg_new:nn { ampersand~in~light-syntax }
   {
-    Your~command~\token_to_str:N #1
-    can't~be~drawn~because~your~matrix~is~too~small.\\
-    If~you~go~on,~this~command~will~be~ignored. 
+    Ampersand~forbidden.\\
+    You~can't~use~an~ampersand~(\token_to_str:N &)~to~separate~columns~because~
+    ~the~key~'light-syntax'~is~in~force.~This~error~is~fatal.
   }
 %    \end{macrocode}
 %
-%
 %    \begin{macrocode}
 \@@_msg_new:nn { double-backslash~in~light-syntax }
   {
-    You~can't~use~\token_to_str:N \\~to~separate~rows~because~you~have~used~ 
-    the~key~'light-syntax'.~You~must~use~the~character~'\l_@@_end_of_row_tl'~
+    Double~backslash~forbidden.\\
+    You~can't~use~\token_to_str:N
+    \\~to~separate~rows~because~the~key~'light-syntax'~
+    is~in~force.~You~must~use~the~character~'\l_@@_end_of_row_tl'~
     (set~by~the~key~'end-of-row').~This~error~is~fatal.
   }
 %    \end{macrocode}
 % 
-%    \begin{macrocode}  
-\@@_msg_new:nn { standard-cline~in~document }
-  {
-    The~key~'standard-cline'~is~available~only~in~the~preamble.\\
-    If~you~go~on~this~command~will~be~ignored.
-  }
-%    \end{macrocode}
 % 
-% 
 %    \begin{macrocode}
 \@@_msg_new:nn { bad~value~for~baseline }
   {
+    Bad~value~for~baseline.\\
     The~value~given~to~'baseline'~(\int_use:N \l_tmpa_int)~is~not~
     valid.~The~value~must~be~between~\int_use:N \l_@@_first_row_int\ and~
-    \int_use:N \g_@@_row_total_int\ or~equal~to~'t',~'c'~or~'b'.\\
-    If~you~go~on,~a~value~of~1~will~be~used.
+    \int_use:N \g_@@_row_total_int\ or~equal~to~'t',~'c'~or~'b'~or~of~
+    the~form~'line-i'.\\
+    A~value~of~1~will~be~used.
   }
 %    \end{macrocode}
 %
 %   \begin{macrocode}
-\@@_msg_new:nn { Invalid~name~format }
+\@@_msg_new:nn { Invalid~name }
   {
+    Invalid~name.\\
     You~can't~give~the~name~'\l_keys_value_tl'~to~a~\token_to_str:N
-    \SubMatrix.\\ 
+    \SubMatrix\ of~your~\@@_full_name_env:.\\ 
     A~name~must~be~accepted~by~the~regular~expression~[A-Za-z][A-Za-z0-9]*.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19285,21 +19345,23 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Wrong~line~in~SubMatrix } 
   { 
+    Wrong~line.\\
     You~try~to~draw~a~#1~line~of~number~'#2'~in~a~
     \token_to_str:N \SubMatrix\ of~your~\@@_full_name_env:\ but~that~  
-    number~is~not~valid.~If~you~go~on,~it~will~be~ignored.
+    number~is~not~valid.~It~will~be~ignored.
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { impossible~delimiter }
+\@@_msg_new:nn { Impossible~delimiter }
   {
+    Impossible~delimiter.\\
     It's~impossible~to~draw~the~#1~delimiter~of~your~
     \token_to_str:N \SubMatrix\ because~all~the~cells~are~empty~
     in~that~column.
     \bool_if:NT \l_@@_submatrix_slim_bool
       { ~Maybe~you~should~try~without~the~key~'slim'. } \\
-    If~you~go~on,~this~\token_to_str:N \SubMatrix\ will~be~ignored.
+    This~\token_to_str:N \SubMatrix\ will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19306,19 +19368,34 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { width~without~X~columns }
   {
+    No~X~column.\\
     You~have~used~the~key~'width'~but~you~have~put~no~'X'~column. \\
-    If~you~go~on,~that~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
+\@@_msg_new:nn { key~multiplicity~with~dotted }
+  {
+    Incompatible~keys. \\
+    You~have~used~the~key~'multiplicity'~with~the~key~'dotted'~
+    in~a~'custom-line'.~They~are~incompatible. \\
+    The~key~'multiplicity'~will~be~discarded.
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
 \@@_msg_new:nn { empty~environment }
-  { Your~\@@_full_name_env:\ is~empty.~This~error~is~fatal. }
+  { 
+    Empty~environment.\\
+    Your~\@@_full_name_env:\ is~empty.~This~error~is~fatal. 
+  }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
 \@@_msg_new:nn { Wrong~use~of~v-center }
   { 
+    Wrong~use~of~v-center.\\
     You~should~not~use~the~key~'v-center'~here~because~your~block~is~not~ 
     mono-row.~However,~you~can~go~on.
   }
@@ -19327,6 +19404,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { No~letter~and~no~command }
   { 
+    Erroneous~use.\\
     Your~use~of~'custom-line'~is~no-op~since~you~don't~have~used~the~
     key~'letter'~(for~a~letter~for~vertical~rules)~nor~the~key~'command'~
     (to~draw~horizontal~rules).\\
@@ -19335,39 +19413,21 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { letter-for-dotted-lines }
-  {
-    The~key~'letter-for-dotted-lines'~is~now~obsolete~(you~should~
-    use~'custom-line'~instead).~However,~you~can~go~on~for~this~time.~
-    If~you~don't~want~to~see~that~message~again,~you~should~
-    load~'nicematrix'~with~the~key~'allow-letter-for-dotted-lines'.~
-    However,~'letter-for-dotted-lines'~will~be~deleted~in~a~future~
-    version~of~'nicematrix'.
-  }
-%    \end{macrocode}
-% 
-%    \begin{macrocode}
 \@@_msg_new:nn { Forbidden~letter }
   {
+    Forbidden~letter.\\
     You~can't~use~the~letter~'\l_@@_letter_str'~for~a~customized~line.\\
-    If~you~go~on,~it~will~be~ignored.
+    It~will~be~ignored.
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { key~width~without~key~tikz }
-  {
-    In~'custom-line',~you~have~used~'width'~without~'tikz'.~That's~not~correct.~
-    If~you~go~on,~that~key~'width'~will~be~discarded.
-  }
-%    \end{macrocode}
-% 
-%    \begin{macrocode}
 \@@_msg_new:nn { Several~letters }
   {
-    You~must~use~only~one~letter~as~value~for~the~key~'letter'~(and~
+    Wrong~name.\\
+    You~must~use~only~one~letter~as~value~for~the~key~'letter'~(and~you~
     have~used~'\l_@@_letter_str').\\
-    If~you~go~on,~it~will~be~ignored.
+    It~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19374,6 +19434,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Delimiter~with~small }
   { 
+    Delimiter~forbidden.\\
     You~can't~put~a~delimiter~in~the~preamble~of~your~\@@_full_name_env:\ 
     because~the~key~'small'~is~in~force.\\
     This~error~is~fatal.
@@ -19383,9 +19444,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { unknown~cell~for~line~in~CodeAfter }
   {
-    Your~command~\token_to_str:N\line\{#1\}\{#2\}~in~the~'code-after'~
+    Unknown~cell.\\
+    Your~command~\token_to_str:N\line\{#1\}\{#2\}~in~
+    the~\token_to_str:N \CodeAfter\ of~your~\@@_full_name_env:\ 
     can't~be~executed~because~a~cell~doesn't~exist.\\
-    If~you~go~on~this~command~will~be~ignored.
+    This~command~\token_to_str:N \line\ will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19393,10 +19456,12 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Duplicate~name~for~SubMatrix }
   {
+    Duplicate~name.\\
     The~name~'#1'~is~already~used~for~a~\token_to_str:N \SubMatrix\ 
     in~this~\@@_full_name_env:.\\
-    If~you~go~on,~this~key~will~be~ignored.\\
-    For~a~list~of~the~names~already~used,~type~H~<return>.
+    This~key~will~be~ignored.\\
+    \bool_if:NF \c_@@_messages_for_Overleaf_bool
+      { For~a~list~of~the~names~already~used,~type~H~<return>. }
   }
   {
     The~names~already~defined~in~this~\@@_full_name_env:\ are:~
@@ -19407,10 +19472,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { r~or~l~with~preamble }
   {
+    Erroneous~use.\\
     You~can't~use~the~key~'\l_keys_key_str'~in~your~\@@_full_name_env:.~
     You~must~specify~the~alignment~of~your~columns~with~the~preamble~of~
     your~\@@_full_name_env:.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19417,6 +19483,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Hdotsfor~in~col~0 }
   {
+    Erroneous~use.\\
     You~can't~use~\token_to_str:N \Hdotsfor\ in~an~exterior~column~of~
     the~array.~This~error~is~fatal.
   }
@@ -19425,10 +19492,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { bad~corner }
   {
-    #1~is~an~incorrect~specification~for~a~corner~(in~the~keys~
-    'corners'~and~'except-corners').~The~available~
-    values~are:~NW,~SW,~NE~and~SE.\\
-    If~you~go~on,~this~specification~of~corner~will~be~ignored.
+    Bad~corner.\\
+    #1~is~an~incorrect~specification~for~a~corner~(in~the~key~
+    'corners').~The~available~values~are:~NW,~SW,~NE~and~SE.\\
+    This~specification~of~corner~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19435,6 +19502,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { bad~border }
   {
+    Bad~border.\\
     \l_keys_key_str\space~is~an~incorrect~specification~for~a~border~
     (in~the~key~'borders'~of~the~command~\token_to_str:N \Block).~
     The~available~values~are:~left,~right,~top~and~bottom~(and~you~can~
@@ -19441,7 +19509,7 @@
     also~use~the~key~'tikz' 
     \bool_if:nF \c_@@_tikz_loaded_bool
       {~if~you~load~the~LaTeX~package~'tikz'}).\\ 
-    If~you~go~on,~this~specification~of~border~will~be~ignored.
+    This~specification~of~border~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19448,9 +19516,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { tikz~key~without~tikz }
   {
+    Tikz~not~loaded.\\
     You~can't~use~the~key~'tikz'~for~the~command~'\token_to_str:N
     \Block'~because~you~have~not~loaded~Tikz.~
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19457,6 +19526,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { last-col~non~empty~for~NiceArray }
   {
+    Erroneous~use.\\
     In~the~\@@_full_name_env:,~you~must~use~the~key~
     'last-col'~without~value.\\
     However,~you~can~go~on~for~this~time~
@@ -19468,6 +19538,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { last-col~non~empty~for~NiceMatrixOptions }
   {
+    Erroneous~use.\\
     In~\NiceMatrixoptions,~you~must~use~the~key~
     'last-col'~without~value.\\
     However,~you~can~go~on~for~this~time~
@@ -19479,6 +19550,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Block~too~large~1 }
   {
+    Block~too~large.\\
     You~try~to~draw~a~block~in~the~cell~#1-#2~of~your~matrix~but~the~matrix~is~
     too~small~for~that~block. \\
   }
@@ -19487,6 +19559,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Block~too~large~2 }
   {
+    Block~too~large.\\
     The~preamble~of~your~\@@_full_name_env:\ announces~\int_use:N
     \g_@@_static_num_of_col_int\
     columns~but~you~use~only~\int_use:N \c at jCol\ and~that's~why~a~block~
@@ -19493,7 +19566,7 @@
     specified~in~the~cell~#1-#2~can't~be~drawn.~You~should~add~some~ampersands~
     (&)~at~the~end~of~the~first~row~of~your~
     \@@_full_name_env:.\\
-    If~you~go~on,this~block~and~maybe~others~will~be~ignored.
+    This~block~and~maybe~others~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19501,6 +19574,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { unknown~column~type }
   {
+    Bad~column~type.\\
     The~column~type~'#1'~in~your~\@@_full_name_env:\ 
     is~unknown. \\
     This~error~is~fatal.
@@ -19508,23 +19582,13 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { colon~without~arydshln }
-  {
-    The~column~type~':'~in~your~\@@_full_name_env:\ 
-    is~unknown.~If~you~want~to~use~':'~of~'arydshln',~you~should~
-    load~that~package.~If~you~want~a~dotted~line~of~'nicematrix',~you~
-    should~use~'\l_@@_letter_for_dotted_lines_str'.\\
-    This~error~is~fatal.
-  }
-%    \end{macrocode}
-% 
-%    \begin{macrocode}
 \@@_msg_new:nn { tabularnote~forbidden }
   {
+    Forbidden~command.\\
     You~can't~use~the~command~\token_to_str:N\tabularnote\ 
     ~in~a~\@@_full_name_env:.~This~command~is~available~only~in~
     \{NiceTabular\},~\{NiceArray\}~and~\{NiceMatrix\}. \\
-    If~you~go~on,~this~command~will~be~ignored.
+    This~command~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19531,10 +19595,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { borders~forbidden }
   {
+    Forbidden~key.\\
     You~can't~use~the~key~'borders'~of~the~command~\token_to_str:N \Block\ 
     because~the~option~'rounded-corners'~
     is~in~force~with~a~non-zero~value.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19541,9 +19606,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { bottomrule~without~booktabs }
   {
+    booktabs~not~loaded.\\
     You~can't~use~the~key~'tabular/bottomrule'~because~you~haven't~
     loaded~'booktabs'.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -19550,15 +19616,17 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { enumitem~not~loaded }
   {
+    enumitem~not~loaded.\\
     You~can't~use~the~command~\token_to_str:N\tabularnote\ 
     ~because~you~haven't~loaded~'enumitem'.\\
-    If~you~go~on,~this~command~will~be~ignored.
+    This~command~will~be~ignored.
   }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\@@_msg_new:nn { tikz~in~custom-line~without~tikz }
+\@@_msg_new:nn { tikz~in~custom-line~without~tikz } 
   {
+    Tikz~not~loaded.\\
     You~have~used~the~key~'tikz'~in~the~definition~of~a~
     customized~line~(with~'custom-line')~but~Tikz~is~not~loaded.~
     You~can~go~on~but~you~will~have~another~error~if~you~actually~
@@ -19569,9 +19637,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { tikz~in~borders~without~tikz }
   {
+    Tikz~not~loaded.\\
     You~have~used~the~key~'tikz'~in~a~key~'borders'~(of~a~
     command~'\token_to_str:N\Block')~but~Tikz~is~not~loaded.~
-    If~you~go~on,~that~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 %    \end{macrocode}
 %
@@ -19578,9 +19647,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { color~in~custom-line~with~tikz }
   {
+    Erroneous~use.\\
     In~a~'custom-line',~you~have~used~both~'tikz'~and~'color',~
     which~is~forbidden~(you~should~use~'color'~inside~the~key~'tikz').~
-    If~you~go~on,~the~key~'color'~will~be~discarded.
+    The~key~'color'~will~be~discarded.
   }
 %    \end{macrocode}
 % 
@@ -19587,6 +19657,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Wrong~last~row }
   { 
+    Wrong~number.\\
     You~have~used~'last-row=\int_use:N \l_@@_last_row_int'~but~your~
     \@@_full_name_env:\ seems~to~have~\int_use:N \c at iRow \ rows.~
     If~you~go~on,~the~value~of~\int_use:N \c at iRow \ will~be~used~for~
@@ -19598,12 +19669,17 @@
 %
 %    \begin{macrocode}
 \@@_msg_new:nn { Yet~in~env }
-  { Environments~of~nicematrix~can't~be~nested.\\ This~error~is~fatal. }
+  { 
+    Nested~environments.\\
+    Environments~of~nicematrix~can't~be~nested.\\ 
+    This~error~is~fatal. 
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
 \@@_msg_new:nn { Outside~math~mode }
   {
+    Outside~math~mode.\\
     The~\@@_full_name_env:\ can~be~used~only~in~math~mode~
     (and~not~in~\token_to_str:N \vcenter).\\
     This~error~is~fatal.
@@ -19613,8 +19689,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { One~letter~allowed }
   { 
+    Bad~name.\\
     The~value~of~key~'\l_keys_key_str'~must~be~of~length~1.\\
-    If~you~go~on,~it~will~be~ignored. 
+    It~will~be~ignored. 
   }
 %    \end{macrocode}
 %
@@ -19621,9 +19698,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { varwidth~not~loaded }
   {
+    varwidth~not~loaded.\\
     You~can't~use~the~column~type~'V'~because~'varwidth'~is~not~
     loaded.\\
-    If~you~go~on,~your~column~will~behave~like~'p'.
+    Your~column~will~behave~like~'p'.
   }
 %    \end{macrocode}
 % 
@@ -19630,9 +19708,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~Block } 
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~command~\token_to_str:N
-    \Block.\\ If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    \Block.\\ It~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~b,~borders,~c,~draw,~fill,~
@@ -19644,6 +19723,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Version~of~siunitx~too~old }
   {
+    siunitx~too~old.\\
     You~can't~use~'S'~columns~because~your~version~of~'siunitx'~
     is~too~old.~You~need~at~least~v~3.0.\\
     This~error~is~fatal.
@@ -19654,10 +19734,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~Brace }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~commands~\token_to_str:N
     \UnderBrace\ and~\token_to_str:N \OverBrace.\\
-    If~you~go~on,~it~will~be~ignored. \\ 
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    It~will~be~ignored. \\ 
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~color,~left-shorten,~
@@ -19669,10 +19750,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~CodeAfter }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown.\\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys~in~\token_to_str:N
-    \CodeAfter,~type~H~<return>. 
+    It~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19687,10 +19768,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~SubMatrix }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown.\\
-    If~you~go~on,~this~key~will~be~ignored. \\
-    For~a~list~of~the~available~keys~in~\token_to_str:N
-    \SubMatrix,~type~H~<return>. 
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19711,9 +19792,10 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~notes } 
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown.\\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys~about~notes,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19733,10 +19815,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~RowStyle } 
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~command~
     \token_to_str:N \RowStyle. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   { 
     The~available~keys~are~(in~alphabetic~order):~
@@ -19753,10 +19836,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~NiceMatrixOptions }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~command~
     \token_to_str:N \NiceMatrixOptions. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   { 
     The~available~keys~are~(in~alphabetic~order):~
@@ -19800,10 +19884,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~NiceArray }
   { 
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
     \{NiceArray\}. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19848,6 +19933,8 @@
     tabularnote,~
     vlines,~
     xdots/color,~
+    xdots/shorten-start,~
+    xdots/shorten-end,~
     xdots/shorten~and~
     xdots/line-style.
   }
@@ -19860,10 +19947,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~NiceMatrix }
   { 
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~
     \@@_full_name_env:. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19907,6 +19995,8 @@
     t,~
     vlines,~
     xdots/color,~
+    xdots/shorten-start,~
+    xdots/shorten-end,~
     xdots/shorten~and~
     xdots/line-style.
   }
@@ -19915,10 +20005,11 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Unknown~key~for~NiceTabular }
   { 
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
     \{NiceTabular\}. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c_@@_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -19962,6 +20053,8 @@
     tabularnote,~
     vlines,~
     xdots/color,~
+    xdots/shorten-start,~
+    xdots/shorten-end,~
     xdots/shorten~and~
     xdots/line-style.
   }
@@ -19971,6 +20064,7 @@
 %    \begin{macrocode}
 \@@_msg_new:nnn { Duplicate~name }
   { 
+    Duplicate~name.\\
     The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
     the~same~environment~name~twice.~You~can~go~on,~but,~
     maybe,~you~will~have~incorrect~results~especially~ 
@@ -19977,7 +20071,7 @@
     if~you~use~'columns-width=auto'.~If~you~don't~want~to~see~this~
     message~again,~use~the~key~'allow-duplicate-names'~in~
     '\token_to_str:N \NiceMatrixOptions'.\\
-    For~a~list~of~the~names~already~used,~type~H~<return>. \\ 
+    \c_@@_available_keys_str
   }
   {
     The~names~already~defined~in~this~document~are:~
@@ -19988,8 +20082,9 @@
 %    \begin{macrocode}
 \@@_msg_new:nn { Option~auto~for~columns-width }
   { 
+    Erroneous~use.\\
     You~can't~give~the~value~'auto'~to~the~key~'columns-width'~here.~
-    If~you~go~on,~the~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 %    \end{macrocode}
 % 
@@ -20167,9 +20262,6 @@
 %
 % The option |columns-width=auto| doesn't need any more a second compilation.
 % 
-% The options |renew-dots|, |renew-matrix| and |transparent| are now available
-% as package options (as said in the documentation).
-%
 % The previous version of \pkg{nicematrix} was incompatible with a recent
 % version of \pkg{expl3} (released 2019/09/30). This version is compatible.
 %
@@ -20416,9 +20508,6 @@
 %
 % It's possible to provide options (between brackets) to the keyword |\CodeAfter|.
 % 
-% A (non fatal) error is raised when the key |transparent|, which is
-% deprecated, is used.
-%
 % \subsection*{Changes between versions 5.10 and 5.11}
 %
 % It's now possible, in the |code-before| and in the |\CodeAfter|, to use the
@@ -20575,6 +20664,14 @@
 %
 % New command |\ShowCellNames| available in the |\CodeBefore| and in the |\CodeAfter|.
 %
+% \subsection*{Changes between version 6.9 and 6.10}
+%
+% New keys |xdots/shorten-start| and |xdots/shorten-end|.
+%
+% It's possible to use |\line| in the |\CodeAfter| between two blocks (and not
+% only two cells).
+%
+%
 % \PrintIndex
 % 
 % \tableofcontents

Modified: trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2022-06-25 20:23:31 UTC (rev 63722)
+++ trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2022-06-25 20:23:47 UTC (rev 63723)
@@ -18,8 +18,8 @@
 %% and version 1.3 or later is part of all distributions of
 %% LaTeX version 2005/12/01 or later.
 %% 
-\def\myfileversion{6.9}
-\def\myfiledate{2022/05/25}
+\def\myfileversion{6.10}
+\def\myfiledate{2022/06/25}
 \RequirePackage{pgfcore}
 \usepgfmodule{shapes}
 \RequirePackage{l3keys2e}
@@ -37,7 +37,13 @@
 \cs_new_protected:Npn \__nicematrix_fatal:n { \msg_fatal:nn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_fatal:nn { \msg_fatal:nnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_msg_new:nn { \msg_new:nnn { nicematrix } }
-\cs_new_protected:Npn \__nicematrix_msg_new:nnn { \msg_new:nnnn { nicematrix } }
+\cs_new_protected:Npn \__nicematrix_msg_new:nnn #1 #2 #3
+  {
+    \bool_if:NTF \c__nicematrix_messages_for_Overleaf_bool
+      { \msg_new:nnn { nicematrix } { #1 } { #2 \\ #3 } }
+      { \msg_new:nnnn { nicematrix } { #1 } { #2 } { #3 } }
+  }
+
 \cs_new_protected:Npn \__nicematrix_msg_redirect_name:nn
   { \msg_redirect_name:nnn { nicematrix } }
 \tl_new:N \l__nicematrix_argspec_tl
@@ -248,6 +254,7 @@
 \dim_set:Nn \l__nicematrix_col_width_dim { -1 cm }
 \int_new:N \g__nicematrix_row_total_int
 \int_new:N \g__nicematrix_col_total_int
+\int_new:N \g__nicematrix_last_row_node_int
 \int_new:N \l__nicematrix_key_nb_rows_int
 \str_new:N \l__nicematrix_hpos_cell_str
 \str_set:Nn \l__nicematrix_hpos_cell_str { c }
@@ -262,6 +269,7 @@
 \bool_new:N \l__nicematrix_NiceArray_bool
 \bool_new:N \l__nicematrix_NiceTabular_bool
 \dim_new:N \l__nicematrix_tabular_width_dim
+\dim_new:N \l__nicematrix_rule_width_dim
 \bool_new:N \l__nicematrix_Matrix_bool
 \bool_new:N \g__nicematrix_rotate_bool
 \bool_new:N \l__nicematrix_X_column_bool
@@ -526,9 +534,13 @@
 \dim_new:N \l__nicematrix_xdots_inter_dim
 \hook_gput_code:nnn { begindocument } { . }
   { \dim_set:Nn \l__nicematrix_xdots_inter_dim { 0.45 em } }
-\dim_new:N \l__nicematrix_xdots_shorten_dim
+\dim_new:N \l__nicematrix_xdots_shorten_start_dim
+\dim_new:N \l__nicematrix_xdots_shorten_end_dim
 \hook_gput_code:nnn { begindocument } { . }
-  { \dim_set:Nn \l__nicematrix_xdots_shorten_dim { 0.3 em } }
+  {
+    \dim_set:Nn \l__nicematrix_xdots_shorten_start_dim { 0.3 em }
+    \dim_set:Nn \l__nicematrix_xdots_shorten_end_dim { 0.3 em }
+  }
 \dim_new:N \l__nicematrix_xdots_radius_dim
 \hook_gput_code:nnn { begindocument } { . }
   { \dim_set:Nn \l__nicematrix_xdots_radius_dim { 0.53 pt } }
@@ -577,8 +589,19 @@
     color .value_required:n = true ,
     shorten .code:n =
       \hook_gput_code:nnn { begindocument } { . }
-        { \dim_set:Nn \l__nicematrix_xdots_shorten_dim { #1 } } ,
+        {
+          \dim_set:Nn \l__nicematrix_xdots_shorten_start_dim { #1 }
+          \dim_set:Nn \l__nicematrix_xdots_shorten_end_dim { #1 }
+        } ,
+    shorten-start .code:n =
+      \hook_gput_code:nnn { begindocument } { . }
+        { \dim_set:Nn \l__nicematrix_xdots_shorten_start_dim { #1 } } ,
+    shorten-end .code:n =
+      \hook_gput_code:nnn { begindocument } { . }
+        { \dim_set:Nn \l__nicematrix_xdots_shorten_end_dim { #1 } } ,
     shorten .value_required:n = true ,
+    shorten-start .value_required:n = true ,
+    shorten-end .value_required:n = true ,
     radius .code:n =
       \hook_gput_code:nnn { begindocument } { . }
         { \dim_set:Nn \l__nicematrix_xdots_radius_dim { #1 } } ,
@@ -681,17 +704,7 @@
   }
 \keys_define:nn { NiceMatrix / Env }
   {
-    hvlines-except-corners .code:n =
-      {
-        \__nicematrix_error:n { hvlines-except-corners }
-        \group_begin:
-        \globaldefs = 1
-        \__nicematrix_msg_redirect_name:nn { hvlines-except-corners } { none }
-        \group_end:
-        \clist_set:Nn \l__nicematrix_corners_clist { #1 }
-        \clist_set:Nn \l__nicematrix_vlines_clist { all }
-        \clist_set:Nn \l__nicematrix_hlines_clist { all }
-      } ,
+    hvlines-except-corners .code:n = \__nicematrix_fatal:n { hvlines-except-corners } ,
     hvlines-except-corners .default:n = { NW , SW , NE , SE } ,
     corners .clist_set:N = \l__nicematrix_corners_clist ,
     corners .default:n = { NW , SW , NE , SE } ,
@@ -840,18 +853,6 @@
     allow-duplicate-names .code:n =
       \__nicematrix_msg_redirect_name:nn { Duplicate~name } { none } ,
     allow-duplicate-names .value_forbidden:n = true ,
-    letter-for-dotted-lines .code:n =
-      {
-        \__nicematrix_error:n { letter-for-dotted-lines }
-        \group_begin:
-        \globaldefs = 1
-        \__nicematrix_msg_redirect_name:nn { letter-for-dotted-lines } { none }
-        \group_end:
-        \tl_if_single_token:nTF { #1 }
-          { \str_set:Nx \l__nicematrix_letter_for_dotted_lines_str { #1 } }
-          { \__nicematrix_error:n { One~letter~allowed } }
-      } ,
-    letter-for-dotted-lines .value_required:n = true ,
     notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
     notes .value_required:n = true ,
     sub-matrix .code:n =
@@ -859,7 +860,6 @@
     sub-matrix .value_required:n = true ,
     unknown .code:n  = \__nicematrix_error:n { Unknown~key~for~NiceMatrixOptions }
   }
-\str_new:N \l__nicematrix_letter_for_dotted_lines_str
 \NewDocumentCommand \NiceMatrixOptions { m }
   { \keys_set:nn { NiceMatrix / NiceMatrixOptions } { #1 } }
 \keys_define:nn { NiceMatrix / NiceMatrix }
@@ -1132,6 +1132,14 @@
 \cs_set_eq:NN \__nicematrix_old_ialign: \ialign
 \cs_new_protected:Npn \__nicematrix_create_row_node:
   {
+    \int_compare:nNnT \c at iRow > \g__nicematrix_last_row_node_int
+      {
+        \int_gset_eq:NN \g__nicematrix_last_row_node_int \c at iRow
+        \__nicematrix_create_row_node_i:
+      }
+  }
+\cs_new_protected:Npn \__nicematrix_create_row_node_i:
+  {
     \hbox
       {
         \bool_if:NT \l__nicematrix_code_before_bool
@@ -1337,6 +1345,7 @@
     \seq_gclear:N \g__nicematrix_pos_of_blocks_seq
     \seq_gclear_new:N \g__nicematrix_multicolumn_cells_seq
     \seq_gclear_new:N \g__nicematrix_multicolumn_sizes_seq
+    \int_gset:Nn \g__nicematrix_last_row_node_int { -1 }
     \__nicematrix_pre_array_ii:
     \box_clear_new:N \l__nicematrix_the_array_box
     \__nicematrix_construct_preamble:
@@ -1361,7 +1370,7 @@
       { \use:c { __nicematrix-light-syntax } }
       { \use:c { __nicematrix-normal-syntax } }
   }
-\cs_new_protected:Npn \__nicematrix_pre_array_i:w #1 \Body
+\cs_new_protected_nopar:Npn \__nicematrix_CodeBefore_Body:w #1 \Body
   {
     \tl_put_right:Nn \l__nicematrix_code_before_tl { #1 }
     \bool_set_true:N \l__nicematrix_code_before_bool
@@ -1588,7 +1597,7 @@
     { #3 , #5 }
     \tl_if_empty:NF \l__nicematrix_rules_color_tl
       { \exp_after:wN \__nicematrix_set_CT at arc@: \l__nicematrix_rules_color_tl \q_stop }
-    \IfBooleanTF { #6 } \__nicematrix_pre_array_i:w \__nicematrix_pre_array:
+    \IfBooleanTF { #6 } \__nicematrix_CodeBefore_Body:w \__nicematrix_pre_array:
   }
   {
     \bool_if:NTF \l__nicematrix_light_syntax_bool
@@ -1839,23 +1848,20 @@
         \q_stop { }
       }
       {
-        \str_case_e:nnF { #1 }
+        \str_if_eq:nVTF { #1 } \l__nicematrix_letter_vlism_tl
           {
-            \l__nicematrix_letter_for_dotted_lines_str
-              { \__nicematrix_patch_preamble_xii:n #1 }
-            \l__nicematrix_letter_vlism_tl
+            \seq_gput_right:Nx \g__nicematrix_cols_vlism_seq
+              { \int_eval:n { \c at jCol + 1 } }
+            \tl_gput_right:Nx \g__nicematrix_preamble_tl
+              { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } }
+            \__nicematrix_patch_preamble:n
+          }
+          {
+            \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 }
               {
-                \seq_gput_right:Nx \g__nicematrix_cols_vlism_seq
-                  { \int_eval:n { \c at jCol + 1 } }
-                \tl_gput_right:Nx \g__nicematrix_preamble_tl
-                  { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } }
+                \keys_set:nn { NiceMatrix / ColumnTypes } { #1 }
                 \__nicematrix_patch_preamble:n
               }
-          }
-          {
-            \keys_set_known:nnN { NiceMatrix / ColumnTypes } { #1 } \l_tmpa_tl
-            \tl_if_empty:NTF \l_tmpa_tl
-              \__nicematrix_patch_preamble:n
               { \__nicematrix_fatal:nn { unknown~column~type } { #1 } }
           }
       }
@@ -2238,14 +2244,6 @@
         \__nicematrix_patch_preamble_xi:n
       }
   }
-\cs_new_protected:Npn \__nicematrix_patch_preamble_xii:n #1
-  {
-    \tl_gput_right:Nn \g__nicematrix_preamble_tl
-      { ! { \skip_horizontal:N 2\l__nicematrix_xdots_radius_dim } }
-    \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-      { \__nicematrix_vdottedline:n { \int_use:N \c at jCol } }
-    \__nicematrix_patch_preamble:n
-  }
 \cs_new_protected:Npn \__nicematrix_patch_preamble_xi:n #1
   {
     \str_if_eq:nnTF { #1 } { < }
@@ -2487,7 +2485,7 @@
         \seq_if_empty:NF \g__nicematrix_blocks_seq \__nicematrix_draw_blocks:
       }
     \bool_lazy_or:nnT
-      { \int_compare_p:nNn \c at tabularnote > 0 }
+      { ! \seq_if_empty_p:N \g__nicematrix_tabularnotes_seq }
       { ! \tl_if_empty_p:V \l__nicematrix_tabularnote_tl }
       \__nicematrix_insert_tabularnotes:
     \end { minipage }
@@ -3148,7 +3146,10 @@
       {
         \dim_set:Nn \l__nicematrix_xdots_radius_dim { 0.7 \l__nicematrix_xdots_radius_dim }
         \dim_set:Nn \l__nicematrix_xdots_inter_dim { 0.55 \l__nicematrix_xdots_inter_dim }
-        \dim_set:Nn \l__nicematrix_xdots_shorten_dim { 0.6 \l__nicematrix_xdots_shorten_dim }
+        \dim_set:Nn \l__nicematrix_xdots_shorten_start_dim
+          { 0.6 \l__nicematrix_xdots_shorten_start_dim }
+        \dim_set:Nn \l__nicematrix_xdots_shorten_end_dim
+          { 0.6 \l__nicematrix_xdots_shorten_end_dim }
       }
     \__nicematrix_draw_dotted_lines:
     \__nicematrix_compute_corners:
@@ -3868,8 +3869,8 @@
     \draw
       [
         #1 ,
-        shorten~> = \l__nicematrix_xdots_shorten_dim ,
-        shorten~< = \l__nicematrix_xdots_shorten_dim ,
+        shorten~> = \l__nicematrix_xdots_shorten_end_dim ,
+        shorten~< = \l__nicematrix_xdots_shorten_start_dim ,
       ]
           ( \l__nicematrix_x_initial_dim , \l__nicematrix_y_initial_dim )
        -- node [ sloped , above ] { $ \scriptstyle #2 $ }
@@ -3958,7 +3959,7 @@
             \int_set:Nn \l_tmpa_int
               {
                 \dim_ratio:nn
-                  { \l__nicematrix_l_dim - \l__nicematrix_xdots_shorten_dim }
+                  { \l__nicematrix_l_dim - \l__nicematrix_xdots_shorten_start_dim }
                   \l__nicematrix_xdots_inter_dim
               }
           }
@@ -3969,7 +3970,7 @@
             \int_set:Nn \l_tmpa_int
               {
                 \dim_ratio:nn
-                  { \l__nicematrix_l_dim - \l__nicematrix_xdots_shorten_dim }
+                  { \l__nicematrix_l_dim - \l__nicematrix_xdots_shorten_end_dim }
                   \l__nicematrix_xdots_inter_dim
               }
           }
@@ -3977,7 +3978,10 @@
             \int_set:Nn \l_tmpa_int
               {
                 \dim_ratio:nn
-                  { \l__nicematrix_l_dim - 2 \l__nicematrix_xdots_shorten_dim  }
+                  {
+                    \l__nicematrix_l_dim
+                    - \l__nicematrix_xdots_shorten_start_dim - \l__nicematrix_xdots_shorten_end_dim
+                  }
                   \l__nicematrix_xdots_inter_dim
               }
           }
@@ -3992,27 +3996,25 @@
         ( \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim ) *
         \dim_ratio:nn \l__nicematrix_xdots_inter_dim \l__nicematrix_l_dim
       }
-    \int_set:Nn \l_tmpb_int
-      {
-        \bool_if:NTF \l__nicematrix_initial_open_bool
-          { \bool_if:NTF \l__nicematrix_final_open_bool 1 0 }
-          { \bool_if:NTF \l__nicematrix_final_open_bool 2 1 }
-      }
     \dim_gadd:Nn \l__nicematrix_x_initial_dim
       {
         ( \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) *
         \dim_ratio:nn
-          { \l__nicematrix_l_dim - \l__nicematrix_xdots_inter_dim * \l_tmpa_int }
+          {
+            \l__nicematrix_l_dim - \l__nicematrix_xdots_inter_dim * \l_tmpa_int
+            + \l__nicematrix_xdots_shorten_start_dim - \l__nicematrix_xdots_shorten_end_dim
+          }
           { 2 \l__nicematrix_l_dim }
-        * \l_tmpb_int
       }
     \dim_gadd:Nn \l__nicematrix_y_initial_dim
       {
         ( \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim ) *
         \dim_ratio:nn
-          { \l__nicematrix_l_dim - \l__nicematrix_xdots_inter_dim * \l_tmpa_int }
+          {
+            \l__nicematrix_l_dim - \l__nicematrix_xdots_inter_dim * \l_tmpa_int
+            + \l__nicematrix_xdots_shorten_start_dim - \l__nicematrix_xdots_shorten_end_dim
+          }
           { 2 \l__nicematrix_l_dim }
-        * \l_tmpb_int
       }
     \pgf at relevantforpicturesizefalse
     \int_step_inline:nnn 0 \l_tmpa_int
@@ -4309,6 +4311,12 @@
   }
 \cs_new_protected:Npn \__nicematrix_rotate: { \bool_gset_true:N \g__nicematrix_rotate_bool }
 \cs_new:Npn \__nicematrix_double_int_eval:n #1-#2 \q_stop
+  {
+    \tl_if_empty:nTF { #2 }
+      { #1 }
+      { \__nicematrix_double_int_eval_i:n #1-#2 \q_stop }
+  }
+\cs_new:Npn \__nicematrix_double_int_eval_i:n #1-#2- \q_stop
   { \int_eval:n { #1 } - \int_eval:n { #2 } }
 \hook_gput_code:nnn { begindocument } { . }
   {
@@ -4322,8 +4330,8 @@
           \use:e
             {
               \__nicematrix_line_i:nn
-                { \__nicematrix_double_int_eval:n #2 \q_stop }
-                { \__nicematrix_double_int_eval:n #3 \q_stop }
+                { \__nicematrix_double_int_eval:n #2 - \q_stop }
+                { \__nicematrix_double_int_eval:n #3 - \q_stop }
             }
         \group_end:
       }
@@ -4820,8 +4828,6 @@
     start .int_set:N = \l__nicematrix_start_int ,
     start .initial:n = 1 ,
     end .int_set:N = \l__nicematrix_end_int ,
-    % letter .code:n = \prg_do_nothing: ,
-    % command .code:n = \prg_do_nothing:
   }
 \keys_define:nn { NiceMatrix / RulesBis }
   {
@@ -4837,8 +4843,9 @@
     tikz .tl_set:N = \l__nicematrix_tikz_rule_tl ,
     tikz .value_required:n = true ,
     tikz .initial:n = ,
-    width .dim_set:N = \l__nicematrix_rule_width_dim ,
-    width .value_required:n = true
+    total-width .dim_set:N = \l__nicematrix_rule_width_dim ,
+    total-width .value_required:n = true ,
+    width .meta:n = { total-width = #1 }
   }
 \cs_new_protected:Npn \__nicematrix_vline:n #1
   {
@@ -4913,8 +4920,8 @@
    }
 \cs_new_protected:Npn \__nicematrix_vline_ii:
   {
-    \bool_set_false:N \l__nicematrix_dotted_boo
-    \keys_set_known:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
+    \bool_set_false:N \l__nicematrix_dotted_bool
+    \keys_set:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
     \bool_if:NTF \l__nicematrix_dotted_bool
       \__nicematrix_vline_iv:
       {
@@ -4931,7 +4938,14 @@
     \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_local_start_int }
     \dim_set_eq:NN \l_tmpa_dim \pgf at y
     \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_position_int }
-    \dim_set_eq:NN \l_tmpb_dim \pgf at x
+    \dim_set:Nn \l_tmpb_dim
+      {
+        \pgf at x
+        - 0.5 \l__nicematrix_rule_width_dim
+        +
+        ( \arrayrulewidth * \l__nicematrix_multiplicity_int
+           + \doublerulesep * ( \l__nicematrix_multiplicity_int - 1 ) ) / 2
+      }
     \__nicematrix_qpoint:n { row - \int_eval:n { \l__nicematrix_local_end_int + 1 } }
     \dim_set_eq:NN \l__nicematrix_tmpc_dim \pgf at y
     \bool_lazy_all:nT
@@ -4977,8 +4991,8 @@
     \pgfrememberpicturepositiononpagetrue
     \pgf at relevantforpicturesizefalse
     \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_position_int }
-    \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf at x
-    \dim_set_eq:NN \l__nicematrix_x_final_dim \pgf at x
+    \dim_set:Nn \l__nicematrix_x_initial_dim { \pgf at x - 0.5 \l__nicematrix_rule_width_dim }
+    \dim_set_eq:NN \l__nicematrix_x_final_dim \l__nicematrix_x_initial_dim
     \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_local_start_int }
     \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf at y
     \__nicematrix_qpoint:n { row - \int_eval:n { \l__nicematrix_local_end_int + 1 } }
@@ -5019,7 +5033,7 @@
       {
         \tl_if_eq:NnF \l__nicematrix_vlines_clist { all }
           { \clist_if_in:NnT \l__nicematrix_vlines_clist { ##1 } }
-          { \__nicematrix_vline:n { position = ##1 } }
+          { \__nicematrix_vline:n { position = ##1 , total-width = \arrayrulewidth } }
       }
   }
 \cs_new_protected:Npn \__nicematrix_hline:n #1
@@ -5095,7 +5109,7 @@
 \cs_new_protected:Npn \__nicematrix_hline_ii:
   {
     \bool_set_false:N \l__nicematrix_dotted_bool
-    \keys_set_known:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
+    \keys_set:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
     \bool_if:NTF \l__nicematrix_dotted_bool
       \__nicematrix_hline_iv:
       {
@@ -5112,7 +5126,14 @@
     \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_local_start_int }
     \dim_set_eq:NN \l_tmpa_dim \pgf at x
     \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_position_int }
-    \dim_set_eq:NN \l_tmpb_dim \pgf at y
+    \dim_set:Nn \l_tmpb_dim
+      {
+        \pgf at y
+        - 0.5 \l__nicematrix_rule_width_dim
+        +
+        ( \arrayrulewidth * \l__nicematrix_multiplicity_int
+           + \doublerulesep * ( \l__nicematrix_multiplicity_int - 1 ) ) / 2
+      }
     \__nicematrix_qpoint:n { col - \int_eval:n { \l__nicematrix_local_end_int + 1 } }
     \dim_set_eq:NN \l__nicematrix_tmpc_dim \pgf at x
     \bool_lazy_all:nT
@@ -5156,8 +5177,8 @@
     \pgfrememberpicturepositiononpagetrue
     \pgf at relevantforpicturesizefalse
     \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_position_int }
-    \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf at y
-    \dim_set_eq:NN \l__nicematrix_y_final_dim \pgf at y
+    \dim_set:Nn \l__nicematrix_y_initial_dim { \pgf at y - 0.5 \l__nicematrix_rule_width_dim }
+    \dim_set_eq:NN \l__nicematrix_y_final_dim \l__nicematrix_y_initial_dim
     \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_local_start_int }
     \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf at x
     \int_compare:nNnT \l__nicematrix_local_start_int = 1
@@ -5214,7 +5235,7 @@
       {
         \tl_if_eq:NnF \l__nicematrix_hlines_clist { all }
           { \clist_if_in:NnT \l__nicematrix_hlines_clist { ##1 } }
-          { \__nicematrix_hline:n { position = ##1 } }
+          { \__nicematrix_hline:n { position = ##1 , total-width = \arrayrulewidth } }
       }
   }
 \cs_set:Npn \__nicematrix_Hline: { \noalign { \ifnum 0 = `} \fi \__nicematrix_Hline_i:n { 1 } }
@@ -5250,113 +5271,156 @@
   {
     \str_clear_new:N \l__nicematrix_command_str
     \str_clear_new:N \l__nicematrix_letter_str
-    \dim_zero_new:N \l__nicematrix_rule_width_dim
-    \tl_clear:N \l_tmpa_tl
-    \bool_set_false:N \l_tmpa_bool
-    \bool_set_false:N \l_tmpb_bool
-    \keys_set_known:nn { NiceMatrix / Custom-Line } { #1 }
-    \bool_if:NT \l_tmpa_bool
+    \keys_set_known:nnN { NiceMatrix / custom-line } { #1 } \l__nicematrix_other_keys_tl
+    \bool_lazy_and:nnTF
+      { \str_if_empty_p:N \l__nicematrix_letter_str }
+      { \str_if_empty_p:N \l__nicematrix_command_str }
+      { \__nicematrix_error:n { No~letter~and~no~command } }
+      { \exp_args:NV \__nicematrix_custom_line_i:n \l__nicematrix_other_keys_tl }
+  }
+\keys_define:nn { NiceMatrix / custom-line }
+  {
+    % here, we will use change in the future to use .str_set:N
+    letter .code:n = \str_set:Nn \l__nicematrix_letter_str { #1 } ,
+    letter .value_required:n = true ,
+    % here, we will use change in the future to use .str_set:N
+    command .code:n = \str_set:Nn \l__nicematrix_command_str { #1 } ,
+    command .value_required:n = true ,
+  }
+\cs_new_protected:Npn \__nicematrix_custom_line_i:n #1
+  {
+    \bool_set_false:N \l__nicematrix_tikz_rule_bool
+    \bool_set_false:N \l__nicematrix_dotted_rule_bool
+    \bool_set_false:N \l__nicematrix_color_bool
+    \keys_set:nn { NiceMatrix / custom-line-bis } { #1 }
+    \bool_if:NT \l__nicematrix_tikz_rule_bool
       {
         \cs_if_exist:NF \tikzpicture
           { \__nicematrix_error:n { tikz~in~custom-line~without~tikz } }
-        \tl_if_empty:NF \l_tmpa_tl
+        \bool_if:NT \l__nicematrix_color_bool
           { \__nicematrix_error:n { color~in~custom-line~with~tikz } }
       }
-    \bool_if:NT \l_tmpb_bool
+    \bool_if:nT
       {
-        \bool_if:NF \l_tmpa_bool
-          { \__nicematrix_error:n { key~width~without~key~tikz } }
+        \int_compare_p:nNn \l__nicematrix_multiplicity_int > 1
+        && \l__nicematrix_dotted_rule_bool
       }
-    \bool_lazy_and:nnTF
-      { \str_if_empty_p:N \l__nicematrix_letter_str }
-      { \str_if_empty_p:N \l__nicematrix_command_str }
-      { \__nicematrix_error:n { No~letter~and~no~command } }
+      { \__nicematrix_error:n { key~multiplicity~with~dotted } }
+    \str_if_empty:NF \l__nicematrix_letter_str
       {
-        \str_if_empty:NF \l__nicematrix_letter_str
+        \int_compare:nTF { \str_count:N \l__nicematrix_letter_str != 1 }
+          { \__nicematrix_error:n { Several~letters } }
           {
-            \int_compare:nNnTF { \str_count:N \l__nicematrix_letter_str } = 1
+            \exp_args:NnV \tl_if_in:NnTF
+              \c__nicematrix_forbidden_letters_str \l__nicematrix_letter_str
+              { \__nicematrix_error:n { Forbidden~letter } }
               {
-                \exp_args:NnV \tl_if_in:NnTF
-                  \c__nicematrix_forbidden_letters_str \l__nicematrix_letter_str
-                  { \__nicematrix_error:n { Forbidden~letter } }
-                  {
-                    \keys_define:nx { NiceMatrix / ColumnTypes }
-                      {
-                        \l__nicematrix_letter_str .code:n =
-                          { \__nicematrix_custom_line_i:n { \exp_not:n { #1 } } }
-                      }
-                  }
-              }
-              { \__nicematrix_error:n { Several~letters } }
-          }
-        \str_if_empty:NF \l__nicematrix_command_str
-          {
-            \bool_if:NF \l_tmpa_bool
-              {
-                \dim_set:Nn \l__nicematrix_rule_width_dim
-                  {
-                    \arrayrulewidth * \l__nicematrix_tmpc_int
-                    + \doublerulesep * ( \l__nicematrix_tmpc_int - 1 )
-                  }
-              }
-            \__nicematrix_define_h_custom_line:nV { #1 } \l__nicematrix_rule_width_dim
-          }
-      }
+                 \keys_define:nx { NiceMatrix / ColumnTypes }
+                   {
+                     \l__nicematrix_letter_str .code:n =
+                       { \__nicematrix_v_custom_line:n { \exp_not:n { #1 }  } }
+                   }
+               }
+           }
+       }
+    \str_if_empty:NF \l__nicematrix_command_str { \__nicematrix_h_custom_line:n { #1 } }
   }
 \str_const:Nn \c__nicematrix_forbidden_letters_str { lcrpmbVX|()[]!@<> }
-\keys_define:nn { NiceMatrix / Custom-Line }
+\keys_define:nn { NiceMatrix / custom-line-bis }
   {
-    % here, we will use change in the future to use .tl_set:N
-    letter .code:n = \str_set:Nn \l__nicematrix_letter_str { #1 } ,
-    letter .value_required:n = true ,
-    % here, we will use change in the future to use .tl_set:N
-    command .code:n = \str_set:Nn \l__nicematrix_command_str { #1 } ,
-    command .value_required:n = true ,
-    multiplicity .int_set:N = \l__nicematrix_tmpc_int ,
+    multiplicity .int_set:N = \l__nicematrix_multiplicity_int ,
     multiplicity .initial:n = 1 ,
     multiplicity .value_required:n = true ,
-    color .tl_set:N = \l_tmpa_tl ,
+    color .code:n = \bool_set_true:N \l__nicematrix_color_bool ,
     color .value_required:n = true ,
-    tikz .code:n = \bool_set_true:N \l_tmpa_bool ,
-    width .code:n = \dim_set:Nn \l__nicematrix_rule_width_dim { #1 }
-                    \bool_set_true:N \l_tmpb_bool ,
+    tikz .code:n = \bool_set_true:N \l__nicematrix_tikz_rule_bool ,
+    tikz .value_required:n = true ,
+    dotted .code:n = \bool_set_true:N \l__nicematrix_dotted_rule_bool ,
+    dotted .value_forbidden:n = true ,
+    total-width .code:n = { } ,
+    total-width .value_required:n = true ,
+    width .code:n = { } ,
     width .value_required:n = true ,
+    sep-color .code:n = { } ,
+    sep-color .value_required:n = true ,
     unknown .code:n = \__nicematrix_error:n { Unknown~key~for~custom-line }
   }
-\cs_new_protected:Npn \__nicematrix_define_h_custom_line:nn #1 #2
+\bool_new:N \l__nicematrix_dotted_rule_bool
+\bool_new:N \l__nicematrix_tikz_rule_bool
+\bool_new:N \l__nicematrix_color_bool
+\keys_define:nn { NiceMatrix / custom-line-width }
   {
+    multiplicity .int_set:N = \l__nicematrix_multiplicity_int ,
+    multiplicity .initial:n = 1 ,
+    multiplicity .value_required:n = true ,
+    tikz .code:n = \bool_set_true:N \l__nicematrix_tikz_rule_bool ,
+    total-width .code:n = \dim_set:Nn \l__nicematrix_rule_width_dim { #1 }
+                          \bool_set_true:N \l__nicematrix_total_width_bool ,
+    total-width .value_required:n = true ,
+    width .meta:n = { total-width = #1 } ,
+    dotted .code:n = \bool_set_true:N \l__nicematrix_dotted_rule_bool ,
+  }
+\cs_new_protected:Npn \__nicematrix_h_custom_line:n #1
+  {
     \cs_set:cpn { nicematrix - \l__nicematrix_command_str }
       {
         \noalign
           {
-            \skip_vertical:n { #2 }
+            \__nicematrix_compute_rule_width:n { #1 }
+            \skip_vertical:n { \l__nicematrix_rule_width_dim }
             \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-              { \__nicematrix_hline:n { #1 , position = \int_eval:n { \c at iRow + 1 } } }
+              {
+                \__nicematrix_hline:n
+                  {
+                    #1 ,
+                    position = \int_eval:n { \c at iRow + 1 } ,
+                    total-width = \dim_use:N \l__nicematrix_rule_width_dim
+                  }
+              }
           }
       }
     \seq_put_left:NV \l__nicematrix_custom_line_commands_seq \l__nicematrix_command_str
   }
-\cs_generate_variant:Nn \__nicematrix_define_h_custom_line:nn { n V }
-\cs_new_protected:Npn \__nicematrix_custom_line_i:n #1
+\cs_generate_variant:Nn \__nicematrix_h_custom_line:nn { n V }
+\cs_new_protected:Npn \__nicematrix_compute_rule_width:n #1
   {
-    \bool_if:NF \l_tmpa_bool
+    \bool_set_false:N \l__nicematrix_tikz_rule_bool
+    \bool_set_false:N \l__nicematrix_total_width_bool
+    \bool_set_false:N \l__nicematrix_dotted_rule_bool
+    \keys_set_known:nn { NiceMatrix / custom-line-width } { #1 }
+    \bool_if:NF \l__nicematrix_total_width_bool
       {
-        \dim_set:Nn \l__nicematrix_rule_width_dim
+        \bool_if:NTF \l__nicematrix_dotted_rule_bool
+          { \dim_set:Nn \l__nicematrix_rule_width_dim { 2 \l__nicematrix_xdots_radius_dim } }
           {
-            \arrayrulewidth * \l__nicematrix_tmpc_int
-            + \doublerulesep * ( \l__nicematrix_tmpc_int - 1)
+            \bool_if:NF \l__nicematrix_tikz_rule_bool
+              {
+                \dim_set:Nn \l__nicematrix_rule_width_dim
+                  {
+                    \arrayrulewidth * \l__nicematrix_multiplicity_int
+                    + \doublerulesep * ( \l__nicematrix_multiplicity_int - 1 )
+                  }
+              }
           }
       }
+  }
+\cs_new_protected:Npn \__nicematrix_v_custom_line:n #1
+  {
+    \__nicematrix_compute_rule_width:n { #1 }
     \tl_gput_right:Nx \g__nicematrix_preamble_tl
+      { \exp_not:N ! { \skip_horizontal:n { \dim_use:N \l__nicematrix_rule_width_dim } } }
+    \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
       {
-        \exp_not:N !
-          { \skip_horizontal:n { \dim_use:N \l__nicematrix_rule_width_dim } }
+        \__nicematrix_vline:n
+          {
+            #1 ,
+            position = \int_eval:n { \c at jCol + 1 } ,
+            total-width = \dim_use:N \l__nicematrix_rule_width_dim
+          }
       }
-     \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-      { \__nicematrix_vline:n { #1 , position = \int_eval:n { \c at jCol + 1 } } }
   }
 \__nicematrix_custom_line:n { letter = : , command = hdottedline , dotted }
-\cs_new_protected:Npn \__nicematrix_test_hline_in_block:nnnnn #1 #2 #3 #4
+\cs_new_protected:Npn \__nicematrix_test_hline_in_block:nnnnn #1 #2 #3 #4 #5
   {
     \bool_lazy_all:nT
       {
@@ -5367,7 +5431,7 @@
       }
       { \bool_gset_false:N \g_tmpa_bool }
   }
-\cs_new_protected:Npn \__nicematrix_test_vline_in_block:nnnnn #1 #2 #3 #4
+\cs_new_protected:Npn \__nicematrix_test_vline_in_block:nnnnn #1 #2 #3 #4 #5
   {
     \bool_lazy_all:nT
       {
@@ -5512,20 +5576,6 @@
           }
       }
   }
-\cs_new:Npn \__nicematrix_hdottedline:
-  {
-    \noalign { \skip_vertical:N 2\l__nicematrix_xdots_radius_dim }
-    \__nicematrix_hdottedline_i:
-  }
-\cs_new_protected:Npn \__nicematrix_hdottedline_i:
-  {
-    \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl
-      { \__nicematrix_hdottedline:n { \int_use:N \c at iRow } }
-  }
-\cs_new_protected:Npn \__nicematrix_hdottedline:n #1
-  { \__nicematrix_hline:n { position = #1 , end = \int_use:N \c at jCol , dotted } }
-\cs_new_protected:Npn \__nicematrix_vdottedline:n #1
-  { \__nicematrix_vline:n { position = \int_eval:n { #1 + 1 } , dotted } }
 \bool_new:N \l__nicematrix_block_auto_columns_width_bool
 \keys_define:nn { NiceMatrix / NiceMatrixBlock }
   {
@@ -6458,7 +6508,8 @@
               {
                 position = ##1 ,
                 start = \l__nicematrix_tmpd_tl ,
-                end = \int_eval:n { \l_tmpb_tl - 1 }
+                end = \int_eval:n { \l_tmpb_tl - 1 } ,
+                total-width = \arrayrulewidth
               }
           }
       }
@@ -6866,7 +6917,7 @@
     hvlines .value_forbidden:n = true ,
     name .code:n =
       \tl_if_empty:nTF { #1 }
-        { \__nicematrix_error:n { Invalid~name~format } }
+        { \__nicematrix_error:n { Invalid~name } }
         {
           \regex_match:nnTF { \A[A-Za-z][A-Za-z0-9]*\Z } { #1 }
             {
@@ -6877,7 +6928,7 @@
                   \seq_gput_right:Nn \g__nicematrix_submatrix_names_seq { #1 }
                 }
             }
-            { \__nicematrix_error:n { Invalid~name~format } }
+            { \__nicematrix_error:n { Invalid~name } }
         } ,
     rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } ,
     rules .value_required:n = true ,
@@ -6973,10 +7024,10 @@
               }
           }
         \dim_compare:nNnTF \l__nicematrix_x_initial_dim = \c_max_dim
-          { \__nicematrix_error:nn { impossible~delimiter } { left } }
+          { \__nicematrix_error:nn { Impossible~delimiter } { left } }
           {
             \dim_compare:nNnTF \l__nicematrix_x_final_dim = { - \c_max_dim }
-              { \__nicematrix_error:nn { impossible~delimiter } { right } }
+              { \__nicematrix_error:nn { Impossible~delimiter } { right } }
               { \__nicematrix_sub_matrix_i:nnnn { #1 } { #4 } { #6 } { #7 } }
           }
         \endpgfpicture
@@ -7370,39 +7421,47 @@
   }
 \NewDocumentCommand \__nicematrix_ShowCellNames { }
  {
+   \dim_zero_new:N \g__nicematrix_tmpc_dim
+   \dim_zero_new:N \g__nicematrix_tmpd_dim
+   \dim_zero_new:N \g__nicematrix_tmpe_dim
    \int_step_inline:nn \c at iRow
      {
-       \begin { tikzpicture }
+       \begin { pgfpicture }
        \__nicematrix_qpoint:n { row - ##1 }
        \dim_set_eq:NN \l_tmpa_dim \pgf at y
        \__nicematrix_qpoint:n { row - \int_eval:n { ##1 + 1 } }
        \dim_gset:Nn \g_tmpa_dim { ( \l_tmpa_dim + \pgf at y ) / 2 }
        \dim_gset:Nn \g_tmpb_dim { \l_tmpa_dim - \pgf at y }
-       \end { tikzpicture }
+       \end { pgfpicture }
        \int_step_inline:nn \c at jCol
          {
            \hbox_set:Nn \l_tmpa_box
              { \normalfont \Large \color { red ! 50 } ##1 - ####1 }
-           \begin { tikzpicture }
+           \begin { pgfpicture }
            \__nicematrix_qpoint:n { col - ####1 }
-           \dim_set_eq:NN \l__nicematrix_tmpc_dim \pgf at x
+           \dim_gset_eq:NN \g__nicematrix_tmpc_dim \pgf at x
            \__nicematrix_qpoint:n { col - \int_eval:n { ####1 + 1 } }
-           \dim_set:Nn \l_tmpa_dim { \pgf at x - \l__nicematrix_tmpc_dim }
+           \dim_gset:Nn \g__nicematrix_tmpd_dim { \pgf at x - \g__nicematrix_tmpc_dim }
+           \dim_gset_eq:NN \g__nicematrix_tmpe_dim \pgf at x
+           \end { pgfpicture }
            \fp_set:Nn \l_tmpa_fp
              {
                \fp_min:nn
                  {
                    \fp_min:nn
-                     { \dim_ratio:nn { \l_tmpa_dim } { \box_wd:N \l_tmpa_box } }
+                     { \dim_ratio:nn { \g__nicematrix_tmpd_dim } { \box_wd:N \l_tmpa_box } }
                      { \dim_ratio:nn { \g_tmpb_dim } { \box_ht_plus_dp:N \l_tmpa_box } }
                  }
                  { 1.0 }
              }
            \box_scale:Nnn \l_tmpa_box { \fp_use:N \l_tmpa_fp } { \fp_use:N \l_tmpa_fp }
+           \pgfpicture
+           \pgfrememberpicturepositiononpagetrue
+           \pgf at relevantforpicturesizefalse
            \pgftransformshift
              {
                \pgfpoint
-                 { 0.5 * ( \l__nicematrix_tmpc_dim + \pgf at x ) }
+                 { 0.5 * ( \g__nicematrix_tmpc_dim + \g__nicematrix_tmpe_dim ) }
                  { \dim_use:N \g_tmpa_dim }
              }
            \pgfnode
@@ -7411,23 +7470,24 @@
              { \box_use:N \l_tmpa_box }
              { }
              { }
-           \end { tikzpicture }
+           \endpgfpicture
          }
      }
  }
+\bool_new:N \c__nicematrix_messages_for_Overleaf_bool
 \bool_new:N \c__nicematrix_footnotehyper_bool
 \bool_new:N \c__nicematrix_footnote_bool
-\__nicematrix_msg_new:nnn { Unknown~key~for~package }
+\msg_new:nnnn { nicematrix } { Unknown~key~for~package }
   {
     The~key~'\l_keys_key_str'~is~unknown. \\
-    If~you~go~on,~it~will~be~ignored. \\
+    That~key~will~be~ignored. \\
     For~a~list~of~the~available~keys,~type~H~<return>.
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
-    allow-letter-for-dotted-lines,~
     footnote,~
     footnotehyper,~
+    messages-for-Overleaf,~
     renew-dots,~and
     renew-matrix.
   }
@@ -7437,18 +7497,9 @@
     renew-dots .value_forbidden:n = true ,
     renew-matrix .code:n = \__nicematrix_renew_matrix: ,
     renew-matrix .value_forbidden:n = true ,
-    transparent .code:n = \__nicematrix_fatal:n { Key~transparent } ,
-    transparent .value_forbidden:n = true,
+    messages-for-Overleaf .bool_set:N = \c__nicematrix_messages_for_Overleaf_bool ,
     footnote .bool_set:N = \c__nicematrix_footnote_bool ,
     footnotehyper .bool_set:N = \c__nicematrix_footnotehyper_bool ,
-    allow-letter-for-dotted-lines .code:n =
-     {
-       \group_begin:
-       \globaldefs = 1
-       \__nicematrix_msg_redirect_name:nn { letter-for-dotted-lines } { none }
-       \group_end:
-     } ,
-    allow-letter-for-dotted-lines .value_forbidden:n = true ,
     unknown .code:n = \__nicematrix_error:n { Unknown~key~for~package }
   }
 \ProcessKeysOptions { NiceMatrix / Package }
@@ -7459,7 +7510,7 @@
     If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
     within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~
     of~the~package~footnotehyper.\\
-    If~you~go~on,~the~package~footnote~won't~be~loaded.
+    The~package~footnote~won't~be~loaded.
   }
 \__nicematrix_msg_new:nn { footnotehyper~with~footnote~package }
   {
@@ -7468,7 +7519,7 @@
     If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
     within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~
     of~the~package~footnote.\\
-    If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+    The~package~footnotehyper~won't~be~loaded.
   }
 \bool_if:NT \c__nicematrix_footnote_bool
   {
@@ -7491,6 +7542,12 @@
       }
     \bool_set_true:N \c__nicematrix_footnote_bool
   }
+\bool_if:NTF \c__nicematrix_messages_for_Overleaf_bool
+  { \str_const:Nn \c__nicematrix_available_keys_str { } }
+  {
+    \str_const:Nn \c__nicematrix_available_keys_str
+      { For~a~list~of~the~available~keys,~type~H~<return>. }
+  }
 \seq_new:N \g__nicematrix_types_of_matrix_seq
 \seq_gset_from_clist:Nn \g__nicematrix_types_of_matrix_seq
   {
@@ -7519,19 +7576,31 @@
   }
 \__nicematrix_msg_new:nn { negative~weight }
   {
+    Negative~weight.\\
     The~weight~of~the~'X'~columns~must~be~positive~and~you~have~used~
-    the~value~'#1'.~If~you~go~on,~the~absolute~value~will~be~used.
+    the~value~'#1'.\\
+    The~absolute~value~will~be~used.
   }
+\__nicematrix_msg_new:nn { last~col~not~used }
+  {
+    Column~not~used.\\
+    The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
+    in~your~\__nicematrix_full_name_env:.~However,~you~can~go~on.
+  }
 \__nicematrix_msg_new:nn { too~much~cols~for~matrix~with~last~col }
   {
-    You~try~to~use~more~columns~than~allowed~by~your~
-    \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ The~maximal~number~of~
-    columns~is~\int_eval:n { \l__nicematrix_last_col_int - 1 }~(plus~the~
-    exterior~columns).~This~error~is~fatal.
+    Too~much~columns.\\
+    In~the~row~\int_eval:n { \c at jCol - 1 },~
+    you~try~to~use~more~columns~
+    than~allowed~by~your~\__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\
+    The~maximal~number~of~columns~is~\int_eval:n { \l__nicematrix_last_col_int - 1 }~
+    (plus~the~exterior~columns).~This~error~is~fatal.
   }
 \__nicematrix_msg_new:nn { too~much~cols~for~matrix }
   {
-    You~try~to~use~more~columns~than~allowed~by~your~
+    Too~much~columns.\\
+    In~the~row~\int_eval:n { \c at jCol - 1 },~
+    you~try~to~use~more~columns~than~allowed~by~your~
     \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ Recall~that~the~maximal~
     number~of~columns~for~a~matrix~is~fixed~by~the~LaTeX~counter~
     'MaxMatrixCols'.~Its~actual~value~is~\int_use:N \c at MaxMatrixCols.~
@@ -7539,7 +7608,9 @@
   }
 \__nicematrix_msg_new:nn { too~much~cols~for~array }
   {
-    You~try~to~use~more~columns~than~allowed~by~your~
+    Too~much~columns.\\
+    In~the~row~\int_eval:n { \c at jCol - 1 },~
+    ~you~try~to~use~more~columns~than~allowed~by~your~
     \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ The~maximal~number~of~columns~is~
     \int_use:N \g__nicematrix_static_num_of_col_int\
     ~(plus~the~potential~exterior~ones).~
@@ -7547,62 +7618,65 @@
   }
 \__nicematrix_msg_new:nn { hvlines-except-corners }
   {
+    Obsolete~key.\\
     The~key~'hvlines-except-corners'~is~now~obsolete.~You~should~instead~use~the~
     keys~'hvlines'~and~'corners'.\\
-    However,~you~can~go~on~for~this~time.~This~message~won't~be~shown~anymore~
-    in~this~document.
+    This~error~is~fatal.
   }
-\__nicematrix_msg_new:nn { last~col~not~used }
-  {
-    The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~
-    in~your~\__nicematrix_full_name_env:.~However,~you~can~go~on.
-  }
 \__nicematrix_msg_new:nn { columns~not~used }
   {
+    Columns~not~used.\\
     The~preamble~of~your~\__nicematrix_full_name_env:\ announces~\int_use:N
     \g__nicematrix_static_num_of_col_int\ columns~but~you~use~only~\int_use:N \c at jCol.\\
-    You~can~go~on~but~the~columns~you~did~not~used~won't~be~created.
+    The~columns~you~did~not~used~won't~be~created.
   }
 \__nicematrix_msg_new:nn { in~first~col }
   {
+    Erroneous~use.\\
     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.
+    That~command~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { in~last~col }
   {
+    Erroneous~use.\\
     You~can't~use~the~command~#1 in~the~last~column~(exterior)~of~the~array.\\
-    If~you~go~on,~this~command~will~be~ignored.
+    That~command~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { in~first~row }
   {
+    Erroneous~use.\\
     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.
+    That~command~will~be~ignored.
   }
 \__nicematrix_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.
+    That~command~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { double~closing~delimiter }
   {
+    Double~delimiter.\\
     You~can't~put~a~second~closing~delimiter~"#1"~just~after~a~first~closing~
     delimiter.~This~delimiter~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { delimiter~after~opening }
   {
+    Double~delimiter.\\
     You~can't~put~a~second~delimiter~"#1"~just~after~a~first~opening~
-    delimiter.~This~delimiter~will~be~ignored.
+    delimiter.~That~delimiter~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { bad~option~for~line-style }
   {
+    Bad~line~style.\\
     Since~you~haven't~loaded~Tikz,~the~only~value~you~can~give~to~'line-style'~
-    is~'standard'.~If~you~go~on,~this~key~will~be~ignored.
+    is~'standard'.~That~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~custom-line }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~in~a~'custom-line'.~
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    It~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -7612,118 +7686,126 @@
     letter,~
     multiplicity,~
     sep-color,~
-    tikz,~and~width.
+    tikz,~and~tota-width.
   }
 \__nicematrix_msg_new:nn { Unknown~key~for~xdots }
   {
+    Unknown~key.\\
     As~for~now,~there~is~only~five~keys~available~here:~'color',~'inter',~
     'line-style',~'radius',~
     and~'shorten'~(and~you~try~to~use~'\l_keys_key_str').~
-    If~you~go~on,~this~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { Unknown~key~for~rowcolors }
   {
+    Unknown~key.\\
     As~for~now,~there~is~only~two~keys~available~here:~'cols'~and~'respect-blocks'~
-    (and~you~try~to~use~'\l_keys_key_str').~If~you~go~on,~
-    this~key~will~be~ignored.
+    (and~you~try~to~use~'\l_keys_key_str')\\
+    That~key~will~be~ignored.
   }
-\__nicematrix_msg_new:nn { ampersand~in~light-syntax }
-  {
-    You~can't~use~an~ampersand~(\token_to_str:N &)~to~separate~columns~because~
-    ~you~have~used~the~key~'light-syntax'.~This~error~is~fatal.
-  }
 \__nicematrix_msg_new:nn { Construct~too~large }
   {
+    Construct~too~large.\\
     Your~command~\token_to_str:N #1
     can't~be~drawn~because~your~matrix~is~too~small.\\
-    If~you~go~on,~this~command~will~be~ignored.
+    That~command~will~be~ignored.
   }
+\__nicematrix_msg_new:nn { ampersand~in~light-syntax }
+  {
+    Ampersand~forbidden.\\
+    You~can't~use~an~ampersand~(\token_to_str:N &)~to~separate~columns~because~
+    ~the~key~'light-syntax'~is~in~force.~This~error~is~fatal.
+  }
 \__nicematrix_msg_new:nn { double-backslash~in~light-syntax }
   {
-    You~can't~use~\token_to_str:N \\~to~separate~rows~because~you~have~used~
-    the~key~'light-syntax'.~You~must~use~the~character~'\l__nicematrix_end_of_row_tl'~
+    Double~backslash~forbidden.\\
+    You~can't~use~\token_to_str:N
+    \\~to~separate~rows~because~the~key~'light-syntax'~
+    is~in~force.~You~must~use~the~character~'\l__nicematrix_end_of_row_tl'~
     (set~by~the~key~'end-of-row').~This~error~is~fatal.
   }
-\__nicematrix_msg_new:nn { standard-cline~in~document }
-  {
-    The~key~'standard-cline'~is~available~only~in~the~preamble.\\
-    If~you~go~on~this~command~will~be~ignored.
-  }
 \__nicematrix_msg_new:nn { bad~value~for~baseline }
   {
+    Bad~value~for~baseline.\\
     The~value~given~to~'baseline'~(\int_use:N \l_tmpa_int)~is~not~
     valid.~The~value~must~be~between~\int_use:N \l__nicematrix_first_row_int\ and~
-    \int_use:N \g__nicematrix_row_total_int\ or~equal~to~'t',~'c'~or~'b'.\\
-    If~you~go~on,~a~value~of~1~will~be~used.
+    \int_use:N \g__nicematrix_row_total_int\ or~equal~to~'t',~'c'~or~'b'~or~of~
+    the~form~'line-i'.\\
+    A~value~of~1~will~be~used.
   }
-\__nicematrix_msg_new:nn { Invalid~name~format }
+\__nicematrix_msg_new:nn { Invalid~name }
   {
+    Invalid~name.\\
     You~can't~give~the~name~'\l_keys_value_tl'~to~a~\token_to_str:N
-    \SubMatrix.\\
+    \SubMatrix\ of~your~\__nicematrix_full_name_env:.\\
     A~name~must~be~accepted~by~the~regular~expression~[A-Za-z][A-Za-z0-9]*.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { Wrong~line~in~SubMatrix }
   {
+    Wrong~line.\\
     You~try~to~draw~a~#1~line~of~number~'#2'~in~a~
     \token_to_str:N \SubMatrix\ of~your~\__nicematrix_full_name_env:\ but~that~
-    number~is~not~valid.~If~you~go~on,~it~will~be~ignored.
+    number~is~not~valid.~It~will~be~ignored.
   }
-\__nicematrix_msg_new:nn { impossible~delimiter }
+\__nicematrix_msg_new:nn { Impossible~delimiter }
   {
+    Impossible~delimiter.\\
     It's~impossible~to~draw~the~#1~delimiter~of~your~
     \token_to_str:N \SubMatrix\ because~all~the~cells~are~empty~
     in~that~column.
     \bool_if:NT \l__nicematrix_submatrix_slim_bool
       { ~Maybe~you~should~try~without~the~key~'slim'. } \\
-    If~you~go~on,~this~\token_to_str:N \SubMatrix\ will~be~ignored.
+    This~\token_to_str:N \SubMatrix\ will~be~ignored.
   }
 \__nicematrix_msg_new:nn { width~without~X~columns }
   {
+    No~X~column.\\
     You~have~used~the~key~'width'~but~you~have~put~no~'X'~column. \\
-    If~you~go~on,~that~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
+\__nicematrix_msg_new:nn { key~multiplicity~with~dotted }
+  {
+    Incompatible~keys. \\
+    You~have~used~the~key~'multiplicity'~with~the~key~'dotted'~
+    in~a~'custom-line'.~They~are~incompatible. \\
+    The~key~'multiplicity'~will~be~discarded.
+  }
 \__nicematrix_msg_new:nn { empty~environment }
-  { Your~\__nicematrix_full_name_env:\ is~empty.~This~error~is~fatal. }
+  {
+    Empty~environment.\\
+    Your~\__nicematrix_full_name_env:\ is~empty.~This~error~is~fatal.
+  }
 \__nicematrix_msg_new:nn { Wrong~use~of~v-center }
   {
+    Wrong~use~of~v-center.\\
     You~should~not~use~the~key~'v-center'~here~because~your~block~is~not~
     mono-row.~However,~you~can~go~on.
   }
 \__nicematrix_msg_new:nn { No~letter~and~no~command }
   {
+    Erroneous~use.\\
     Your~use~of~'custom-line'~is~no-op~since~you~don't~have~used~the~
     key~'letter'~(for~a~letter~for~vertical~rules)~nor~the~key~'command'~
     (to~draw~horizontal~rules).\\
     However,~you~can~go~on.
   }
-\__nicematrix_msg_new:nn { letter-for-dotted-lines }
-  {
-    The~key~'letter-for-dotted-lines'~is~now~obsolete~(you~should~
-    use~'custom-line'~instead).~However,~you~can~go~on~for~this~time.~
-    If~you~don't~want~to~see~that~message~again,~you~should~
-    load~'nicematrix'~with~the~key~'allow-letter-for-dotted-lines'.~
-    However,~'letter-for-dotted-lines'~will~be~deleted~in~a~future~
-    version~of~'nicematrix'.
-  }
 \__nicematrix_msg_new:nn { Forbidden~letter }
   {
+    Forbidden~letter.\\
     You~can't~use~the~letter~'\l__nicematrix_letter_str'~for~a~customized~line.\\
-    If~you~go~on,~it~will~be~ignored.
+    It~will~be~ignored.
   }
-\__nicematrix_msg_new:nn { key~width~without~key~tikz }
-  {
-    In~'custom-line',~you~have~used~'width'~without~'tikz'.~That's~not~correct.~
-    If~you~go~on,~that~key~'width'~will~be~discarded.
-  }
 \__nicematrix_msg_new:nn { Several~letters }
   {
-    You~must~use~only~one~letter~as~value~for~the~key~'letter'~(and~
+    Wrong~name.\\
+    You~must~use~only~one~letter~as~value~for~the~key~'letter'~(and~you~
     have~used~'\l__nicematrix_letter_str').\\
-    If~you~go~on,~it~will~be~ignored.
+    It~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { Delimiter~with~small }
   {
+    Delimiter~forbidden.\\
     You~can't~put~a~delimiter~in~the~preamble~of~your~\__nicematrix_full_name_env:\
     because~the~key~'small'~is~in~force.\\
     This~error~is~fatal.
@@ -7730,16 +7812,20 @@
   }
 \__nicematrix_msg_new:nn { unknown~cell~for~line~in~CodeAfter }
   {
-    Your~command~\token_to_str:N\line\{#1\}\{#2\}~in~the~'code-after'~
+    Unknown~cell.\\
+    Your~command~\token_to_str:N\line\{#1\}\{#2\}~in~
+    the~\token_to_str:N \CodeAfter\ of~your~\__nicematrix_full_name_env:\
     can't~be~executed~because~a~cell~doesn't~exist.\\
-    If~you~go~on~this~command~will~be~ignored.
+    This~command~\token_to_str:N \line\ will~be~ignored.
   }
 \__nicematrix_msg_new:nnn { Duplicate~name~for~SubMatrix }
   {
+    Duplicate~name.\\
     The~name~'#1'~is~already~used~for~a~\token_to_str:N \SubMatrix\
     in~this~\__nicematrix_full_name_env:.\\
-    If~you~go~on,~this~key~will~be~ignored.\\
-    For~a~list~of~the~names~already~used,~type~H~<return>.
+    This~key~will~be~ignored.\\
+    \bool_if:NF \c__nicematrix_messages_for_Overleaf_bool
+      { For~a~list~of~the~names~already~used,~type~H~<return>. }
   }
   {
     The~names~already~defined~in~this~\__nicematrix_full_name_env:\ are:~
@@ -7747,25 +7833,28 @@
   }
 \__nicematrix_msg_new:nn { r~or~l~with~preamble }
   {
+    Erroneous~use.\\
     You~can't~use~the~key~'\l_keys_key_str'~in~your~\__nicematrix_full_name_env:.~
     You~must~specify~the~alignment~of~your~columns~with~the~preamble~of~
     your~\__nicematrix_full_name_env:.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { Hdotsfor~in~col~0 }
   {
+    Erroneous~use.\\
     You~can't~use~\token_to_str:N \Hdotsfor\ in~an~exterior~column~of~
     the~array.~This~error~is~fatal.
   }
 \__nicematrix_msg_new:nn { bad~corner }
   {
-    #1~is~an~incorrect~specification~for~a~corner~(in~the~keys~
-    'corners'~and~'except-corners').~The~available~
-    values~are:~NW,~SW,~NE~and~SE.\\
-    If~you~go~on,~this~specification~of~corner~will~be~ignored.
+    Bad~corner.\\
+    #1~is~an~incorrect~specification~for~a~corner~(in~the~key~
+    'corners').~The~available~values~are:~NW,~SW,~NE~and~SE.\\
+    This~specification~of~corner~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { bad~border }
   {
+    Bad~border.\\
     \l_keys_key_str\space~is~an~incorrect~specification~for~a~border~
     (in~the~key~'borders'~of~the~command~\token_to_str:N \Block).~
     The~available~values~are:~left,~right,~top~and~bottom~(and~you~can~
@@ -7772,16 +7861,18 @@
     also~use~the~key~'tikz'
     \bool_if:nF \c__nicematrix_tikz_loaded_bool
       {~if~you~load~the~LaTeX~package~'tikz'}).\\
-    If~you~go~on,~this~specification~of~border~will~be~ignored.
+    This~specification~of~border~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { tikz~key~without~tikz }
   {
+    Tikz~not~loaded.\\
     You~can't~use~the~key~'tikz'~for~the~command~'\token_to_str:N
     \Block'~because~you~have~not~loaded~Tikz.~
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { last-col~non~empty~for~NiceArray }
   {
+    Erroneous~use.\\
     In~the~\__nicematrix_full_name_env:,~you~must~use~the~key~
     'last-col'~without~value.\\
     However,~you~can~go~on~for~this~time~
@@ -7789,6 +7880,7 @@
   }
 \__nicematrix_msg_new:nn { last-col~non~empty~for~NiceMatrixOptions }
   {
+    Erroneous~use.\\
     In~\NiceMatrixoptions,~you~must~use~the~key~
     'last-col'~without~value.\\
     However,~you~can~go~on~for~this~time~
@@ -7796,11 +7888,13 @@
   }
 \__nicematrix_msg_new:nn { Block~too~large~1 }
   {
+    Block~too~large.\\
     You~try~to~draw~a~block~in~the~cell~#1-#2~of~your~matrix~but~the~matrix~is~
     too~small~for~that~block. \\
   }
 \__nicematrix_msg_new:nn { Block~too~large~2 }
   {
+    Block~too~large.\\
     The~preamble~of~your~\__nicematrix_full_name_env:\ announces~\int_use:N
     \g__nicematrix_static_num_of_col_int\
     columns~but~you~use~only~\int_use:N \c at jCol\ and~that's~why~a~block~
@@ -7807,50 +7901,48 @@
     specified~in~the~cell~#1-#2~can't~be~drawn.~You~should~add~some~ampersands~
     (&)~at~the~end~of~the~first~row~of~your~
     \__nicematrix_full_name_env:.\\
-    If~you~go~on,this~block~and~maybe~others~will~be~ignored.
+    This~block~and~maybe~others~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { unknown~column~type }
   {
+    Bad~column~type.\\
     The~column~type~'#1'~in~your~\__nicematrix_full_name_env:\
     is~unknown. \\
     This~error~is~fatal.
   }
-\__nicematrix_msg_new:nn { colon~without~arydshln }
-  {
-    The~column~type~':'~in~your~\__nicematrix_full_name_env:\
-    is~unknown.~If~you~want~to~use~':'~of~'arydshln',~you~should~
-    load~that~package.~If~you~want~a~dotted~line~of~'nicematrix',~you~
-    should~use~'\l__nicematrix_letter_for_dotted_lines_str'.\\
-    This~error~is~fatal.
-  }
 \__nicematrix_msg_new:nn { tabularnote~forbidden }
   {
+    Forbidden~command.\\
     You~can't~use~the~command~\token_to_str:N\tabularnote\
     ~in~a~\__nicematrix_full_name_env:.~This~command~is~available~only~in~
     \{NiceTabular\},~\{NiceArray\}~and~\{NiceMatrix\}. \\
-    If~you~go~on,~this~command~will~be~ignored.
+    This~command~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { borders~forbidden }
   {
+    Forbidden~key.\\
     You~can't~use~the~key~'borders'~of~the~command~\token_to_str:N \Block\
     because~the~option~'rounded-corners'~
     is~in~force~with~a~non-zero~value.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { bottomrule~without~booktabs }
   {
+    booktabs~not~loaded.\\
     You~can't~use~the~key~'tabular/bottomrule'~because~you~haven't~
     loaded~'booktabs'.\\
-    If~you~go~on,~this~key~will~be~ignored.
+    This~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { enumitem~not~loaded }
   {
+    enumitem~not~loaded.\\
     You~can't~use~the~command~\token_to_str:N\tabularnote\
     ~because~you~haven't~loaded~'enumitem'.\\
-    If~you~go~on,~this~command~will~be~ignored.
+    This~command~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { tikz~in~custom-line~without~tikz }
   {
+    Tikz~not~loaded.\\
     You~have~used~the~key~'tikz'~in~the~definition~of~a~
     customized~line~(with~'custom-line')~but~Tikz~is~not~loaded.~
     You~can~go~on~but~you~will~have~another~error~if~you~actually~
@@ -7858,18 +7950,21 @@
   }
 \__nicematrix_msg_new:nn { tikz~in~borders~without~tikz }
   {
+    Tikz~not~loaded.\\
     You~have~used~the~key~'tikz'~in~a~key~'borders'~(of~a~
     command~'\token_to_str:N\Block')~but~Tikz~is~not~loaded.~
-    If~you~go~on,~that~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { color~in~custom-line~with~tikz }
   {
+    Erroneous~use.\\
     In~a~'custom-line',~you~have~used~both~'tikz'~and~'color',~
     which~is~forbidden~(you~should~use~'color'~inside~the~key~'tikz').~
-    If~you~go~on,~the~key~'color'~will~be~discarded.
+    The~key~'color'~will~be~discarded.
   }
 \__nicematrix_msg_new:nn { Wrong~last~row }
   {
+    Wrong~number.\\
     You~have~used~'last-row=\int_use:N \l__nicematrix_last_row_int'~but~your~
     \__nicematrix_full_name_env:\ seems~to~have~\int_use:N \c at iRow \ rows.~
     If~you~go~on,~the~value~of~\int_use:N \c at iRow \ will~be~used~for~
@@ -7877,9 +7972,14 @@
     without~value~(more~compilations~might~be~necessary).
   }
 \__nicematrix_msg_new:nn { Yet~in~env }
-  { Environments~of~nicematrix~can't~be~nested.\\ This~error~is~fatal. }
+  {
+    Nested~environments.\\
+    Environments~of~nicematrix~can't~be~nested.\\
+    This~error~is~fatal.
+  }
 \__nicematrix_msg_new:nn { Outside~math~mode }
   {
+    Outside~math~mode.\\
     The~\__nicematrix_full_name_env:\ can~be~used~only~in~math~mode~
     (and~not~in~\token_to_str:N \vcenter).\\
     This~error~is~fatal.
@@ -7886,20 +7986,23 @@
   }
 \__nicematrix_msg_new:nn { One~letter~allowed }
   {
+    Bad~name.\\
     The~value~of~key~'\l_keys_key_str'~must~be~of~length~1.\\
-    If~you~go~on,~it~will~be~ignored.
+    It~will~be~ignored.
   }
 \__nicematrix_msg_new:nn { varwidth~not~loaded }
   {
+    varwidth~not~loaded.\\
     You~can't~use~the~column~type~'V'~because~'varwidth'~is~not~
     loaded.\\
-    If~you~go~on,~your~column~will~behave~like~'p'.
+    Your~column~will~behave~like~'p'.
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~Block }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~command~\token_to_str:N
-    \Block.\\ If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    \Block.\\ It~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~b,~borders,~c,~draw,~fill,~
@@ -7908,6 +8011,7 @@
   }
 \__nicematrix_msg_new:nn { Version~of~siunitx~too~old }
   {
+    siunitx~too~old.\\
     You~can't~use~'S'~columns~because~your~version~of~'siunitx'~
     is~too~old.~You~need~at~least~v~3.0.\\
     This~error~is~fatal.
@@ -7914,10 +8018,11 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~Brace }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~commands~\token_to_str:N
     \UnderBrace\ and~\token_to_str:N \OverBrace.\\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    It~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~color,~left-shorten,~
@@ -7926,10 +8031,10 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~CodeAfter }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown.\\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys~in~\token_to_str:N
-    \CodeAfter,~type~H~<return>.
+    It~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -7941,10 +8046,10 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~SubMatrix }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown.\\
-    If~you~go~on,~this~key~will~be~ignored. \\
-    For~a~list~of~the~available~keys~in~\token_to_str:N
-    \SubMatrix,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -7962,9 +8067,10 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~notes }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown.\\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys~about~notes,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -7981,10 +8087,11 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~RowStyle }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~command~
     \token_to_str:N \RowStyle. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -7998,10 +8105,11 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~NiceMatrixOptions }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~command~
     \token_to_str:N \NiceMatrixOptions. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -8042,10 +8150,11 @@
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~NiceArray }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
     \{NiceArray\}. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -8090,15 +8199,18 @@
     tabularnote,~
     vlines,~
     xdots/color,~
+    xdots/shorten-start,~
+    xdots/shorten-end,~
     xdots/shorten~and~
     xdots/line-style.
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~NiceMatrix }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~
     \__nicematrix_full_name_env:. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -8142,15 +8254,18 @@
     t,~
     vlines,~
     xdots/color,~
+    xdots/shorten-start,~
+    xdots/shorten-end,~
     xdots/shorten~and~
     xdots/line-style.
   }
 \__nicematrix_msg_new:nnn { Unknown~key~for~NiceTabular }
   {
+    Unknown~key.\\
     The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
     \{NiceTabular\}. \\
-    If~you~go~on,~it~will~be~ignored. \\
-    For~a~list~of~the~*principal*~available~keys,~type~H~<return>.
+    That~key~will~be~ignored. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
@@ -8194,11 +8309,14 @@
     tabularnote,~
     vlines,~
     xdots/color,~
+    xdots/shorten-start,~
+    xdots/shorten-end,~
     xdots/shorten~and~
     xdots/line-style.
   }
 \__nicematrix_msg_new:nnn { Duplicate~name }
   {
+    Duplicate~name.\\
     The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
     the~same~environment~name~twice.~You~can~go~on,~but,~
     maybe,~you~will~have~incorrect~results~especially~
@@ -8205,7 +8323,7 @@
     if~you~use~'columns-width=auto'.~If~you~don't~want~to~see~this~
     message~again,~use~the~key~'allow-duplicate-names'~in~
     '\token_to_str:N \NiceMatrixOptions'.\\
-    For~a~list~of~the~names~already~used,~type~H~<return>. \\
+    \c__nicematrix_available_keys_str
   }
   {
     The~names~already~defined~in~this~document~are:~
@@ -8213,8 +8331,9 @@
   }
 \__nicematrix_msg_new:nn { Option~auto~for~columns-width }
   {
+    Erroneous~use.\\
     You~can't~give~the~value~'auto'~to~the~key~'columns-width'~here.~
-    If~you~go~on,~the~key~will~be~ignored.
+    That~key~will~be~ignored.
   }
 
 \endinput



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