texlive[62659] branches/branch2021.final/Master/texmf-dist:

commits+karl at tug.org commits+karl at tug.org
Sat Mar 12 21:34:15 CET 2022


Revision: 62659
          http://tug.org/svn/texlive?view=revision&revision=62659
Author:   karl
Date:     2022-03-12 21:34:14 +0100 (Sat, 12 Mar 2022)
Log Message:
-----------
nicematrix (12mar22) (branch)

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

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

Modified: branches/branch2021.final/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex
===================================================================
--- branches/branch2021.final/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2022-03-12 20:33:36 UTC (rev 62658)
+++ branches/branch2021.final/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex	2022-03-12 20:34:14 UTC (rev 62659)
@@ -1244,7 +1244,7 @@
 tracer des filets horizontaux (de manière similaire à |\hline|) ; 
 
 \item la clé |letter| prend en argument une lettre\footnote{Les lettres
-  suivantes ne sont pas autorisées : \verb+lcrpmbVX:|()[]!@<>+} qui pourra être
+  suivantes ne sont pas autorisées : \verb+lcrpmbVX|()[]!@<>+} qui pourra être
 utilisée par l'utilisateur dans le préambule d'un environnement à préambule
 (comme |{NiceTabular}|) pour spécifier un filet vertical.
 \end{itemize}
@@ -3323,9 +3323,9 @@
 L'extension \pkg{nicematrix} propose aussi une commande |\tabularnote| qui
 permet de spécifier des notes qui seront composées à la fin du tableau avec une
 longueur de ligne égale à la largeur du tableau (hors éventuelles colonnes
-extérieures). Sans surprise, cette commande n'est disponible que dans les
-environnements sans délimiteurs, c'est-à-dire |{NiceTabular}|, |{NiceArray}| et
-|{NiceMatrix}|.
+extérieures spécifiées par |first-col| et |last-col|). Sans surprise, cette
+commande n'est disponible que dans les environnements sans délimiteurs,
+c'est-à-dire |{NiceTabular}|, |{NiceArray}| et |{NiceMatrix}|.
 
 En fait, cette commande n'est disponible que si l'extension \pkg{enumitem} a été
 chargée (avant ou après \pkg{nicematrix}). Les notes sont en effet composées en
@@ -3467,6 +3467,7 @@
 \item |notes/enumitem-keys|
 \item |notes/enumitem-keys-para|
 \item |notes/code-before|
+\item |notes/detect-duplicates|
 \end{itemize}
 Pour la commmodité, il est aussi possible de fixer ces clés dans
 |\NiceMatrixOptions| via une clé |notes| qui prend en argument une liste de
@@ -3601,6 +3602,14 @@
 \end{Verbatim}
 On peut aussi mettre dans cette clé |\raggedright| ou |\RaggedRight| (cette
 dernière est une commande de \pkg{ragged2e}).
+
+\item \colorbox{yellow!50}{\textbf{Nouveau 6.8}}\enskip À partir de la version
+6.8, les doublons dans les notes de tableau sont détectés par défaut: lorsque
+plusieurs commandes |\tabularnote| sont utilisées avec le même argument, une
+seule note est insérée en fin de tableau (mais tous les labels sont marqués). Il
+est possible de désactiver cette fonctionnalité avec la clé
+|notes/detect-duplicates| (sa valeur initiale est |true|).
+
 \end{itemize}
 
 

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

Modified: branches/branch2021.final/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
===================================================================
--- branches/branch2021.final/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2022-03-12 20:33:36 UTC (rev 62658)
+++ branches/branch2021.final/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx	2022-03-12 20:34:14 UTC (rev 62659)
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{6.7}
-\def\myfiledate{2022/03/02}
+\def\myfileversion{6.8}
+\def\myfiledate{2022/03/11}
 %
 %
 %<*batchfile>
@@ -1225,10 +1225,6 @@
 % 11 & 12 & 13 & 14 & 15 
 % \end{NiceArray}\right)$
 %
-% \bigskip
-% It's possible to change in \pkg{nicematrix} the letter used to specify a
-% vertical dotted line with the option |letter-for-dotted-lines| available in
-% |\NiceMatrixOptions|. 
 % 
 % \bigskip
 % \emph{Remark}: In the package \pkg{array} (on which the package
@@ -1254,7 +1250,7 @@
 % user in order to draw horizontal rules (similarly to |\hline|);
 %
 % \item the key |letter| takes in as argument a letter\footnote{The following
-% letters are forbidden: \verb+lcrpmbVX:|()[]!@<>+} that the user will use in
+% letters are forbidden: \verb+lcrpmbVX|()[]!@<>+} that the user will use in
 % the preamble of an environment with preamble (such as |{NiceTabular}| in order
 % to specify a vertical rule.
 % \end{itemize}
@@ -3279,12 +3275,12 @@
 %
 % \subsection{The notes of tabular}
 %
-% The package \pkg{nicematrix} also provides a command |\tabularnote| which gives
-% the ability to specify notes that will be composed at the end of the array
-% with a width of line equal to the width of the array (excepted the potential
-% exterior columns). With no surprise, that command is available only in the
-% environments without delimiters, that is to say |{NiceTabular}|, |{NiceArray}|
-% and |{NiceMatrix}|.
+% The package \pkg{nicematrix} also provides a command |\tabularnote| which
+% gives the ability to specify notes that will be composed at the end of the
+% array with a width of line equal to the width of the array (excepted the
+% potential exterior columns specified by |first-col| and |last-col|). With no
+% surprise, that command is available only in the environments without
+% delimiters, that is to say |{NiceTabular}|, |{NiceArray}| and |{NiceMatrix}|.
 %
 % In fact, this command is available only if the extension \pkg{enumitem} has
 % been loaded (before or after \pkg{nicematrix}). Indeed, the notes are composed
@@ -3552,6 +3548,13 @@
 % \end{Verbatim}
 % It's also possible to add |\raggedright| or |\RaggedRight| in that key (|\RaggedRight|
 % is a command of \pkg{ragged2e}).
+%
+% \item \colorbox{yellow!50}{\textbf{New 6.8}}\enskip Since the version 6.8, the
+% duplicates in the notes of a tabular are detected by default: if several
+% commands |\tabularnote| are used in a tabular with the same argument, only one
+% note is inserted at the end of the tabular (but all the labels are composed,
+% of course). It's possible to de-activate that feature with the key
+% |notes/detect-duplicates| (whose initial value is |true|).
 % \end{itemize}
 %
 %
@@ -5691,6 +5694,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_error:n { \msg_error:nn { nicematrix } }
 \cs_new_protected:Npn \@@_error:nn { \msg_error:nnn { nicematrix } }
+\cs_generate_variant:Nn \@@_error:nn { n x } 
 \cs_new_protected:Npn \@@_error:nnn { \msg_error:nnnn { nicematrix } }
 \cs_new_protected:Npn \@@_fatal:n { \msg_fatal:nn { nicematrix } }
 \cs_new_protected:Npn \@@_fatal:nn { \msg_fatal:nnn { nicematrix } }
@@ -5707,30 +5711,34 @@
 % \bigskip
 % \subsection*{Technical  definitions}
 %
+%   \begin{macrocode}
+\tl_new:N \l_@@_argspec_tl
+%    \end{macrocode}
+% 
+%   \begin{macrocode}
+\cs_generate_variant:Nn \seq_gset_split:Nnn { N V n }
+\cs_generate_variant:Nn \keys_define:nn { n x }
+%    \end{macrocode}
+%
 % \medskip
 %    \begin{macrocode}
-\bool_new:N \c_@@_arydshln_loaded_bool
-\bool_new:N \c_@@_booktabs_loaded_bool
-\bool_new:N \c_@@_enumitem_loaded_bool
-\bool_new:N \c_@@_tabularx_loaded_bool
-\bool_new:N \c_@@_tikz_loaded_bool
-\bool_new:N \c_@@_varwidth_loaded_bool
 \hook_gput_code:nnn { begindocument } { . }
   {
     \@ifpackageloaded { varwidth }
-      { \bool_set_true:N \c_@@_varwidth_loaded_bool }
-      { }
+      { \bool_const:Nn \c_@@_varwidth_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c_@@_varwidth_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { arydshln }
-      { \bool_set_true:N \c_@@_arydshln_loaded_bool }
-      { }
+      { \bool_const:Nn \c_@@_arydshln_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c_@@_arydshln_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { booktabs }
-      { \bool_set_true:N \c_@@_booktabs_loaded_bool }
-      { }
+      { \bool_const:Nn \c_@@_booktabs_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c_@@_booktabs_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { enumitem }
-      { \bool_set_true:N \c_@@_enumitem_loaded_bool }
-      { }
+      { \bool_const:Nn \c_@@_enumitem_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c_@@_enumitem_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { tabularx }
-      { \bool_set_true:N \c_@@_tabularx_loaded_bool }
+      { \bool_const:Nn \c_@@_tabularx_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c_@@_tabularx_loaded_bool { \c_false_bool } }
       { }
     \@ifpackageloaded { tikz }
       { 
@@ -5748,11 +5756,12 @@
 % |\AtBeginDocument| the correct version of some commands. The tokens
 % |\exp_not:N| are mandatory.
 %    \begin{macrocode}
-        \bool_set_true:N \c_@@_tikz_loaded_bool 
+        \bool_const:Nn \c_@@_tikz_loaded_bool \c_true_bool
         \tl_const:Nn \c_@@_pgfortikzpicture_tl { \exp_not:N \tikzpicture }
         \tl_const:Nn \c_@@_endpgfortikzpicture_tl { \exp_not:N \endtikzpicture }
       }
       { 
+        \bool_const:Nn \c_@@_tikz_loaded_bool \c_false_bool
         \tl_const:Nn \c_@@_pgfortikzpicture_tl { \exp_not:N \pgfpicture }
         \tl_const:Nn \c_@@_endpgfortikzpicture_tl { \exp_not:N \endpgfpicture }
       }
@@ -5761,22 +5770,25 @@
 % 
 % We test whether the current class is \cls{revtex4-1} (deprecated) or
 % \cls{revtex4-2} because these classes redefines |\array| (of \pkg{array}) in a
-% way incompatible with our programmation. At the date January 2021, the current
+% way incompatible with our programmation. At the date January 2022, the current
 % version \cls{revtex4-2} is 4.2e (compatible with \pkg{booktabs}).
 %
 %    \begin{macrocode}
-\bool_new:N \c_@@_revtex_bool
 \@ifclassloaded { revtex4-1 }
-  { \bool_set_true:N \c_@@_revtex_bool }
-  { }
-\@ifclassloaded { revtex4-2 }
-  { \bool_set_true:N \c_@@_revtex_bool }
-  { }
+  { \bool_const:Nn \c_@@_revtex_bool \c_true_bool }
+  {
+    \@ifclassloaded { revtex4-2 }
+      { \bool_const:Nn \c_@@_revtex_bool \c_true_bool }
+      {
 %    \end{macrocode}
 % Maybe one of the previous classes will be loaded inside another class... We
 % try to detect that situation.
 %    \begin{macrocode}
-\cs_if_exist:NT \rvtx at ifformat@geq { \bool_set_true:N \c_@@_revtex_bool }
+        \cs_if_exist:NT \rvtx at ifformat@geq 
+          { \bool_const:Nn \c_@@_revtex_bool \c_true_bool }
+          { \bool_const:Nn \c_@@_revtex_bool \c_false_bool }
+      }
+  }
 %    \end{macrocode}
 %
 % \bigskip
@@ -5871,11 +5883,11 @@
 % We have to know whether \pkg{colortbl} is loaded in particular for the
 % redefinition of |\everycr|.
 %    \begin{macrocode}
-\bool_new:N \c_@@_colortbl_loaded_bool 
+\bool_new:N \l_@@_colortbl_loaded_bool 
 \hook_gput_code:nnn { begindocument } { . } 
   { 
     \@ifpackageloaded { colortbl }
-      { \bool_set_true:N \c_@@_colortbl_loaded_bool }
+      { \bool_set_true:N \l_@@_colortbl_loaded_bool }
       { 
 %    \end{macrocode}
 % The command |\CT at arc@| is a command of \pkg{colortbl} which sets the color of
@@ -6037,11 +6049,11 @@
 % We want to know whether the package \pkg{siunitx} is loaded and, if it is
 % loaded, we redefine the |S| columns of \pkg{siunitx}.
 %    \begin{macrocode}
-\bool_new:N \c_@@_siunitx_loaded_bool 
+\bool_new:N \l_@@_siunitx_loaded_bool 
 \hook_gput_code:nnn { begindocument } { . } 
   { 
     \@ifpackageloaded { siunitx }
-      { \bool_set_true:N \c_@@_siunitx_loaded_bool }
+      { \bool_set_true:N \l_@@_siunitx_loaded_bool }
       { } 
   }
 %    \end{macrocode}
@@ -6054,7 +6066,7 @@
 %    \begin{macrocode}
 \hook_gput_code:nnn { begindocument } { . }
   {
-    \bool_if:nTF { ! \c_@@_siunitx_loaded_bool }
+    \bool_if:nTF { ! \l_@@_siunitx_loaded_bool }
       { \cs_set_eq:NN \@@_renew_NC at rewrite@S: \prg_do_nothing: }
       {
         \cs_new_protected:Npn \@@_renew_NC at rewrite@S:
@@ -6209,6 +6221,13 @@
 %    \end{macrocode}
 %
 % \bigskip
+% The following key corresponds to the key |notes/detect_duplicates|.
+%    \begin{macrocode}
+\bool_new:N \l_@@_notes_detect_duplicates_bool
+\bool_set_true:N \l_@@_notes_detect_duplicates_bool
+%    \end{macrocode}
+% 
+% \bigskip
 % If the user uses |{NiceArray}| or |{NiceTabular}| the flag
 % |\l_@@_NiceArray_bool| will be raised. 
 %    \begin{macrocode}
@@ -6277,7 +6296,7 @@
 % |vlism| stands for \emph{vertical lines in sub-matrices}.
 %    \begin{macrocode}
 \tl_new:N \l_@@_letter_vlism_tl
-%    \end{macrocode}
+%    \end{macrocode} 
 % 
 % The list of the columns where vertical lines in sub-matrices (vlism) must be
 % drawn. Of course, the actual value of this sequence will be known after the
@@ -6305,7 +6324,8 @@
 % \emph{environment} whether we are in a command of \pkg{nicematrix} or in an
 % environment of \pkg{nicematrix}. The default value is \emph{environment}.
 %    \begin{macrocode} 
-\tl_set:Nn \g_@@_com_or_env_str { environment }
+\tl_new:N \g_@@_com_or_env_str
+\tl_gset:Nn \g_@@_com_or_env_str { environment }
 %    \end{macrocode}
 % 
 % \bigskip
@@ -6356,11 +6376,18 @@
 \int_new:N \l_@@_old_iRow_int
 \int_new:N \l_@@_old_jCol_int
 %    \end{macrocode}
-%
 % The TeX counters |\c at iRow| and |\c at jCol| will be created in the beginning of
 % |{NiceArrayWithDelims}| (if they don't exist previously).
 %
 % \bigskip
+% The following sequence will contain the names (without backslash) of the
+% commands created by |custom-line| (commands used by the final user in order to
+% draw horizontal rules).
+%    \begin{macrocode}
+\seq_new:N \l_@@_custom_line_commands_seq
+%    \end{macrocode}
+% 
+% \bigskip
 % The following token list corresponds to the key |rules/color| available
 % in the environments.
 %    \begin{macrocode}
@@ -6833,14 +6860,19 @@
 %    \end{macrocode}
 % 
 % \bigskip
-% The following counter will be used to count the number of successive tabular
-% notes such as in  
-% |\tabularnote{Note 1}\tabularnote{Note 2}\tabularnote{Note 3}|. 
-% In the tabular, the labels of those nodes are composed as a comma
-% separated list (e.g. \textsuperscript{\textit{a},\textit{b},\textit{c}}).
 %    \begin{macrocode}
-\int_new:N \l_@@_number_of_notes_int
+\seq_new:N \l_@@_notes_labels_seq
 %    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\newcounter{nicematrix_draft}
+\cs_new_protected:Npn \@@_notes_format:n #1
+  { 
+    \setcounter { nicematrix_draft } { #1 }
+    \@@_notes_style:n { nicematrix_draft }
+  }
+%    \end{macrocode}
 % 
 % \bigskip
 % The following function can be redefined by using the key |notes/style|.
@@ -6933,18 +6965,33 @@
               { \@@_error:n { tabularnote~forbidden } }
               {
 %    \end{macrocode}
-% |\l_@@_number_of_notes_int| is used to count the number of successive tabular
-% notes such as in 
-% |\tabularnote{Note 1}\tabularnote{Note 2}\tabularnote{Note 3}|. 
-% We will have to compose the labels of theses notes as a comma separated list
-% (e.g. \textsuperscript{\emph{a},\emph{b},\emph{c}}). 
+% You have to see whether the argument of |\tabularnote| has yet been used as
+% argument of another |\tabularnote| in the same tabular. In that case, there
+% will be only one note (for both commands |\tabularnote|) at the end of the
+% tabular. We search the argument of our command |\tabularnote| in the
+% |\g_@@_tabularnotes_seq|. The position in the sequence will be stored in
+% |\l_tmpa_int| (0 if the text is not in the sequence yet).
 %    \begin{macrocode}
-                \int_incr:N \l_@@_number_of_notes_int
-%    \end{macrocode}
-% We expand the content of the note at the point of use of
-% |\tabularnote| as does |\footnote|.
-%    \begin{macrocode}
-                \seq_gput_right:Nn \g_@@_tabularnotes_seq { #1 } 
+                \int_zero:N \l_tmpa_int
+                \bool_if:NT \l_@@_notes_detect_duplicates_bool
+                  {
+                    \seq_map_indexed_inline:Nn \g_@@_tabularnotes_seq
+                      {
+                        \tl_if_eq:nnT { #1 } { ##2 } 
+                          { \int_set:Nn \l_tmpa_int { ##1 } \seq_map_break: }
+                      }
+                  }
+                \int_compare:nNnTF \l_tmpa_int = 0 
+                  {
+                    \stepcounter { tabularnote }
+                    \seq_put_right:Nx \l_@@_notes_labels_seq
+                      { \@@_notes_format:n { \int_use:c { c @ tabularnote } } }
+                    \seq_gput_right:Nn \g_@@_tabularnotes_seq { #1 } 
+                  }
+                  {
+                    \seq_put_right:Nx \l_@@_notes_labels_seq
+                      { \@@_notes_format:n { \int_use:N \l_tmpa_int } }
+                  }
                 \peek_meaning:NF \tabularnote
                   {
 %    \end{macrocode}
@@ -6962,14 +7009,8 @@
 %    \begin{macrocode}
                         \@@_notes_label_in_tabular:n 
                           { 
-                            \stepcounter { tabularnote }
-                            \@@_notes_style:n { tabularnote } 
-                            \prg_replicate:nn { \l_@@_number_of_notes_int - 1 } 
-                              { 
-                                ,
-                                \stepcounter { tabularnote }
-                                \@@_notes_style:n { tabularnote } 
-                              }
+                            \seq_use:Nnnn 
+                              \l_@@_notes_labels_seq { , } { , } { , }
                           } 
                       }
 %    \end{macrocode}
@@ -6979,7 +7020,7 @@
 %    \begin{macrocode}
                     \addtocounter { tabularnote } { -1 }
                     \refstepcounter { tabularnote }
-                    \int_zero:N \l_@@_number_of_notes_int
+                    \seq_clear:N \l_@@_notes_labels_seq 
                     \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
 %    \end{macrocode}
 % If the command |\tabularnote| is used exactly at the end of the cell, the
@@ -7564,6 +7605,8 @@
           } 
       } ,
     enumitem-keys-para .value_required:n = true ,
+    detect-duplicates .bool_set:N = \l_@@_notes_detect_duplicates_bool ,  
+    detect-duplicates .default:n = true , 
     unknown .code:n  = \@@_error:n { Unknown~key~for~notes } 
   }
 %    \end{macrocode}  
@@ -7684,14 +7727,16 @@
 %    \end{macrocode}
 %
 % \bigskip
-% By default, the specifier used in the preamble of the array (for example in
-% |{pNiceArray}|) to draw a vertical dotted line between two columns is the
-% colon ``|:|''. However, it's possible to change this letter with
-% |letter-for-dotted-lines| and, by the way, the letter ``|:|'' will remain free
-% for other packages (for example \pkg{arydshln}).
+% 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 } } 
@@ -7707,9 +7752,10 @@
 %    \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
-\str_set_eq:NN \l_@@_letter_for_dotted_lines_str \c_colon_str
 %    \end{macrocode}
 %       
 % \bigskip
@@ -8447,7 +8493,7 @@
 %    \begin{macrocode}
     \cs_set_nopar:Npn \ialign 
       { 
-        \bool_if:NTF \c_@@_colortbl_loaded_bool
+        \bool_if:NTF \l_@@_colortbl_loaded_bool
           {
             \CT at everycr 
               { 
@@ -8509,7 +8555,6 @@
     \cs_set_eq:NN \Vdots \@@_Vdots
     \cs_set_eq:NN \Ddots \@@_Ddots
     \cs_set_eq:NN \Iddots \@@_Iddots
-    \cs_set_eq:NN \hdottedline \@@_hdottedline:
     \cs_set_eq:NN \Hline \@@_Hline:
     \cs_set_eq:NN \Hspace \@@_Hspace:
     \cs_set_eq:NN \Hdotsfor \@@_Hdotsfor:
@@ -8522,6 +8567,8 @@
     \cs_set_eq:NN \diagbox \@@_diagbox:nn
     \cs_set_eq:NN \NotEmpty \@@_NotEmpty:
     \cs_set_eq:NN \RowStyle \@@_RowStyle:n
+    \seq_map_inline:Nn \l_@@_custom_line_commands_seq
+      { \cs_set_eq:cc { ##1 } { nicematrix - ##1 } } 
     \bool_if:NT \l_@@_colortbl_like_bool \@@_colortbl_like:
     \bool_if:NT \l_@@_renew_dots_bool \@@_renew_dots:
 %    \end{macrocode}
@@ -8629,12 +8676,12 @@
       {
         \bool_set_true:N \l_@@_last_row_without_value_bool
         \bool_if:NT \g_@@_aux_found_bool
-          { \int_set:Nn \l_@@_last_row_int { \seq_item:Nn \c_@@_size_seq 3 } }   
+          { \int_set:Nn \l_@@_last_row_int { \seq_item:Nn \g_@@_size_seq 3 } }   
       }
     \int_compare:nNnT \l_@@_last_col_int = { -1 }
       {
         \bool_if:NT \g_@@_aux_found_bool
-          { \int_set:Nn \l_@@_last_col_int { \seq_item:Nn \c_@@_size_seq 6 } }   
+          { \int_set:Nn \l_@@_last_col_int { \seq_item:Nn \g_@@_size_seq 6 } }   
       }
 %    \end{macrocode}
 %
@@ -8777,10 +8824,10 @@
 % (with potentially a last exterior row) and |\g_@@_col_total_int| is the number
 % of the last column (with potentially a last exterior column).
 %    \begin{macrocode}
-    \int_set:Nn \c at iRow { \seq_item:Nn \c_@@_size_seq 2 }
-    \int_set:Nn \c at jCol { \seq_item:Nn \c_@@_size_seq 5 }
-    \int_set_eq:NN \g_@@_row_total_int { \seq_item:Nn \c_@@_size_seq 3 }
-    \int_set_eq:NN \g_@@_col_total_int { \seq_item:Nn \c_@@_size_seq 6 }
+    \int_set:Nn \c at iRow { \seq_item:Nn \g_@@_size_seq 2 }
+    \int_set:Nn \c at jCol { \seq_item:Nn \g_@@_size_seq 5 }
+    \int_set_eq:NN \g_@@_row_total_int { \seq_item:Nn \g_@@_size_seq 3 }
+    \int_set_eq:NN \g_@@_col_total_int { \seq_item:Nn \g_@@_size_seq 6 }
 %    \end{macrocode}
 %
 %
@@ -9684,7 +9731,8 @@
       { 
         \str_case_e:nnF { #1 }
           {
-            \l_@@_letter_for_dotted_lines_str { \@@_patch_preamble_xii:n #1 }  
+            \l_@@_letter_for_dotted_lines_str 
+              { \@@_patch_preamble_xii:n #1 }  
             \l_@@_letter_vlism_tl 
               { 
                 \seq_gput_right:Nx \g_@@_cols_vlism_seq 
@@ -9693,15 +9741,6 @@
                   { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } }
                 \@@_patch_preamble:n
               }
-            { : }
-              {
-                \bool_if:NTF \c_@@_arydshln_loaded_bool
-                  {
-                    \tl_gput_right:Nn \g_@@_preamble_tl { : }
-                    \@@_patch_preamble:n
-                  }
-                  { \@@_fatal:n { colon~without~arydshln } }
-              }
           }
 %    \end{macrocode}
 % Now the case of a letter set by the final user for a customized rule. Such
@@ -9724,6 +9763,7 @@
   }
 %    \end{macrocode}
 %
+% 
 % \bigskip
 % Now, we will list all the auxiliary functions for the different types of
 % entries in the preamble of the array.
@@ -10340,8 +10380,7 @@
     \keys_set:nV { WithArrows / X-column } \l_tmpa_tl
     \int_compare:nNnT \l_@@_weight_int < 0 
       { 
-        \exp_args:Nnx \@@_error:nn { negative~weight } 
-          { \int_use:N \l_@@_weight_int }
+        \@@_error:nx { negative~weight } { \int_use:N \l_@@_weight_int }
         \int_set:Nn \l_@@_weight_int { - \l_@@_weight_int }
       }
     \int_gadd:Nn \g_@@_total_X_weight_int \l_@@_weight_int
@@ -11086,7 +11125,7 @@
 %    \begin{macrocode}
     \seq_gclear_new:N \g_@@_rows_seq
     \tl_set_rescan:Nno \l_@@_end_of_row_tl { } \l_@@_end_of_row_tl
-    \exp_args:NNV \seq_gset_split:Nnn \g_@@_rows_seq \l_@@_end_of_row_tl { #1 }
+    \seq_gset_split:NVn \g_@@_rows_seq \l_@@_end_of_row_tl { #1 }
 %    \end{macrocode}
 % If the environment uses the option |last-row| without value (i.e. without
 % saying the number of the rows), we have now the opportunity to know that
@@ -11105,7 +11144,7 @@
 % exit the first cell of the array.
 %    \begin{macrocode}
     \seq_gpop_left:NN \g_@@_rows_seq \l_tmpa_tl 
-    \exp_args:NV \@@_line_with_light_syntax_i:n \l_tmpa_tl
+    \@@_line_with_light_syntax_i:V \l_tmpa_tl
     \seq_map_function:NN \g_@@_rows_seq \@@_line_with_light_syntax:n
     \@@_create_col_nodes:
     \endarray
@@ -11126,8 +11165,10 @@
     \l_tmpa_tl
     \seq_map_inline:Nn \g_@@_cells_seq { & ##1 }
   }
+\cs_generate_variant:Nn \@@_line_with_light_syntax_i:n { V }
 %    \end{macrocode}
 %
+%
 % \bigskip
 % The following command is used by the code which detects whether the
 % environment is empty (we raise a fatal error in this case: it's only a
@@ -11622,6 +11663,7 @@
           { > \@@_cell_begin:w #2 < \@@_cell_end: }
       } 
   }
+\cs_generate_variant:Nn \@@_begin_of_NiceMatrix:nn { n e }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
@@ -11632,7 +11674,7 @@
         \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix } 
         \tl_set:Nn \l_@@_type_of_col_tl c
         \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
-        \exp_args:Nne \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl 
+        \@@_begin_of_NiceMatrix:ne { #1 } \l_@@_type_of_col_tl 
       }
       { \use:c { end #1 NiceArray } }
   }
@@ -11688,8 +11730,7 @@
 % definition of that columns in \pkg{tabularx} (this would result in an error in
 % |{NiceTabularX}|). 
 %    \begin{macrocode}
-    \bool_if:NT \c_@@_tabularx_loaded_bool
-      { \newcolumntype { X } { \@@_X } }
+    \bool_if:NT \c_@@_tabularx_loaded_bool { \newcolumntype { X } { \@@_X } } 
     \str_gset:Nn \g_@@_name_env_str { NiceTabularX }
     \dim_zero_new:N \l_@@_width_dim 
     \dim_set:Nn \l_@@_width_dim { #1 }
@@ -11754,7 +11795,7 @@
 %    \begin{macrocode}
     \tl_gput_right:Nx \g_@@_aux_tl
       { 
-        \seq_gset_from_clist:Nn \exp_not:N \c_@@_size_seq 
+        \seq_gset_from_clist:Nn \exp_not:N \g_@@_size_seq 
           { 
             \int_use:N \l_@@_first_row_int ,
             \int_use:N \c at iRow , 
@@ -13086,7 +13127,7 @@
 \cs_new_protected:Npn \@@_draw_unstandard_dotted_line:
   { 
     \begin { scope }
-    \exp_args:No \@@_draw_unstandard_dotted_line:n 
+    \@@_draw_unstandard_dotted_line:o
       { \l_@@_xdots_line_style_tl , \l_@@_xdots_color_tl } 
   }
 %    \end{macrocode}
@@ -13103,6 +13144,7 @@
       \l_@@_xdots_up_tl
       \l_@@_xdots_down_tl
   }
+\cs_generate_variant:Nn \@@_draw_unstandard_dotted_line:n { o } 
 %    \end{macrocode}
 %
 %    \begin{macrocode}
@@ -14657,8 +14699,8 @@
 % 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: 
+    % letter .code:n = \prg_do_nothing: ,
+    % command .code:n = \prg_do_nothing: 
   }
 %    \end{macrocode}
 %
@@ -14809,8 +14851,13 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_vline_ii:
   {
-    \bool_set_false:N \l_@@_dotted_bool
-    \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl 
+    \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_if:NTF \l_@@_dotted_bool
       \@@_vline_iv: 
       {
@@ -15059,7 +15106,12 @@
 \cs_new_protected:Npn \@@_hline_ii:
   {
     \bool_set_false:N \l_@@_dotted_bool
-    \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl 
+%    \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_if:NTF \l_@@_dotted_bool
       \@@_hline_iv: 
       {
@@ -15323,7 +15375,7 @@
 % 
 % \medskip
 % The following command will create the customized rule (it is executed when the
-% final user uses the key |custom-line| in |\NiceMatrixOptions|). 
+% final user uses the key |custom-line|, for example in |\NiceMatrixOptions|). 
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_custom_line:n #1 
   {
@@ -15380,7 +15432,12 @@
                   \c_@@_forbidden_letters_str \l_@@_letter_str  
                   { \@@_error:n { Forbidden~letter } }
                   {
-                    \exp_args:Nnx \keys_define:nn { NiceMatrix / ColumnTypes }
+%    \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 } } }
@@ -15404,9 +15461,7 @@
                     + \doublerulesep * ( \l_@@_tmpc_int - 1 ) 
                   }
               }
-            \exp_args:NnV \@@_define_h_custom_line:nn 
-              { #1 }
-              \l_@@_rule_width_dim 
+            \@@_define_h_custom_line:nV { #1 } \l_@@_rule_width_dim 
           }
       }
   }
@@ -15413,7 +15468,7 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\str_const:Nn \c_@@_forbidden_letters_str { lcrpmbVX:|()[]!@<> }
+\str_const:Nn \c_@@_forbidden_letters_str { lcrpmbVX|()[]!@<> }
 %    \end{macrocode}
 % 
 % \medskip
@@ -15449,6 +15504,7 @@
     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 }
   }
 %    \end{macrocode}
 % 
@@ -15464,7 +15520,7 @@
 % We use |\cs_set:cpn| and not |\cs_new:cpn| because we want a local definition.
 % Moreover, the command must \emph{not} be protected since it begins with |\noalign|.
 %    \begin{macrocode}
-    \cs_set:cpn \l_@@_command_str
+    \cs_set:cpn { nicematrix - \l_@@_command_str }
       { 
         \noalign
           {
@@ -15473,7 +15529,9 @@
               { \@@_hline:n { #1 , position = \int_eval:n { \c at iRow + 1 } } }
           }
       }
+    \seq_put_left:NV \l_@@_custom_line_commands_seq \l_@@_command_str
   }
+\cs_generate_variant:Nn \@@_define_h_custom_line:nn { n V }
 %    \end{macrocode}
 % 
 % The flag |\l_tmpa_bool| means that the key 'tikz' have been used. When the key
@@ -15500,6 +15558,9 @@
   }
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+\@@_custom_line:n { letter = : , command = hdottedline , dotted }
+%    \end{macrocode}
 %
 % \subsubsection*{The key hvlines}
 %
@@ -18728,6 +18789,7 @@
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
+    allow-letter-for-dotted-lines,~
     footnote,~
     footnotehyper,~
     renew-dots,~and
@@ -18747,6 +18809,14 @@
     transparent .value_forbidden:n = true,
     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 }
@@ -18823,13 +18893,13 @@
 % 
 %
 %    \begin{macrocode}
-\seq_new:N \c_@@_types_of_matrix_seq
-\seq_set_from_clist:Nn \c_@@_types_of_matrix_seq
+\seq_new:N \g_@@_types_of_matrix_seq
+\seq_gset_from_clist:Nn \g_@@_types_of_matrix_seq
   { 
     NiceMatrix ,
     pNiceMatrix , bNiceMatrix , vNiceMatrix, BNiceMatrix, VNiceMatrix 
   } 
-\seq_set_map_x:NNn \c_@@_types_of_matrix_seq \c_@@_types_of_matrix_seq 
+\seq_gset_map_x:NNn \g_@@_types_of_matrix_seq \g_@@_types_of_matrix_seq 
   { \tl_to_str:n { #1 } }
 %    \end{macrocode}
 % 
@@ -18842,7 +18912,7 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_error_too_much_cols:
   { 
-    \seq_if_in:NVTF \c_@@_types_of_matrix_seq \g_@@_name_env_str
+    \seq_if_in:NVTF \g_@@_types_of_matrix_seq \g_@@_name_env_str
       { 
         \int_compare:nNnTF \l_@@_last_col_int = { -2 }
         { \@@_fatal:n { too~much~cols~for~matrix } }
@@ -18994,6 +19064,25 @@
 %    \end{macrocode}
 %
 %    \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~custom-line } 
+  {
+    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>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    color,~
+    command,~
+    dotted,~
+    letter,~
+    multiplicity,~
+    sep-color,~
+    tikz,~and~width.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \@@_msg_new:nn { Unknown~key~for~xdots } 
   {
     As~for~now,~there~is~only~three~keys~available~here:~'color',~'line-style'~
@@ -19117,11 +19206,23 @@
     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.
+    However,~you~can~go~on.
   }
 %    \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 }
   {
     You~can't~use~the~letter~'\l_@@_letter_str'~for~a~customized~line.\\
@@ -19495,6 +19596,7 @@
     bottomrule,~
     code-after,~
     code-before,~
+    detect-duplicates,~
     enumitem-keys,~
     enumitem-keys-para,~
     para,~
@@ -19556,7 +19658,6 @@
     last-col,~
     last-row,~
     left-margin,~
-    letter-for-dotted-lines,~
     light-syntax,~
     notes~(several~subkeys),~
     nullify-dots,~
@@ -20336,6 +20437,13 @@
 %
 % Key |tikz| in the key |borders| of a command |\Block|
 %
+% \subsection*{Changes between version 6.7 and 6.8}
+%
+% In the notes of a tabular (with the command |\tabularnote|), the duplicates
+% are now detected: when several commands |\tabularnote| are used with the same
+% argument, only one note is created at the end of the tabular (but all the
+% labels are present, of course).
+%
 % \PrintIndex
 % 
 % \tableofcontents

Modified: branches/branch2021.final/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty
===================================================================
--- branches/branch2021.final/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2022-03-12 20:33:36 UTC (rev 62658)
+++ branches/branch2021.final/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty	2022-03-12 20:34:14 UTC (rev 62659)
@@ -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.7}
-\def\myfiledate{2022/03/02}
+\def\myfileversion{6.8}
+\def\myfiledate{2022/03/11}
 \RequirePackage{pgfcore}
 \usepgfmodule{shapes}
 \RequirePackage{l3keys2e}
@@ -33,6 +33,7 @@
 \RequirePackage { amsmath }
 \cs_new_protected:Npn \__nicematrix_error:n { \msg_error:nn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_error:nn { \msg_error:nnn { nicematrix } }
+\cs_generate_variant:Nn \__nicematrix_error:nn { n x }
 \cs_new_protected:Npn \__nicematrix_error:nnn { \msg_error:nnnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_fatal:n { \msg_fatal:nn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_fatal:nn { \msg_fatal:nnn { nicematrix } }
@@ -40,48 +41,50 @@
 \cs_new_protected:Npn \__nicematrix_msg_new:nnn { \msg_new:nnnn { nicematrix } }
 \cs_new_protected:Npn \__nicematrix_msg_redirect_name:nn
   { \msg_redirect_name:nnn { nicematrix } }
-\bool_new:N \c__nicematrix_arydshln_loaded_bool
-\bool_new:N \c__nicematrix_booktabs_loaded_bool
-\bool_new:N \c__nicematrix_enumitem_loaded_bool
-\bool_new:N \c__nicematrix_tabularx_loaded_bool
-\bool_new:N \c__nicematrix_tikz_loaded_bool
-\bool_new:N \c__nicematrix_varwidth_loaded_bool
+\tl_new:N \l__nicematrix_argspec_tl
+\cs_generate_variant:Nn \seq_gset_split:Nnn { N V n }
+\cs_generate_variant:Nn \keys_define:nn { n x }
 \hook_gput_code:nnn { begindocument } { . }
   {
     \@ifpackageloaded { varwidth }
-      { \bool_set_true:N \c__nicematrix_varwidth_loaded_bool }
-      { }
+      { \bool_const:Nn \c__nicematrix_varwidth_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c__nicematrix_varwidth_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { arydshln }
-      { \bool_set_true:N \c__nicematrix_arydshln_loaded_bool }
-      { }
+      { \bool_const:Nn \c__nicematrix_arydshln_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c__nicematrix_arydshln_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { booktabs }
-      { \bool_set_true:N \c__nicematrix_booktabs_loaded_bool }
-      { }
+      { \bool_const:Nn \c__nicematrix_booktabs_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c__nicematrix_booktabs_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { enumitem }
-      { \bool_set_true:N \c__nicematrix_enumitem_loaded_bool }
-      { }
+      { \bool_const:Nn \c__nicematrix_enumitem_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c__nicematrix_enumitem_loaded_bool { \c_false_bool } }
     \@ifpackageloaded { tabularx }
-      { \bool_set_true:N \c__nicematrix_tabularx_loaded_bool }
+      { \bool_const:Nn \c__nicematrix_tabularx_loaded_bool { \c_true_bool } }
+      { \bool_const:Nn \c__nicematrix_tabularx_loaded_bool { \c_false_bool } }
       { }
     \@ifpackageloaded { tikz }
       {
-        \bool_set_true:N \c__nicematrix_tikz_loaded_bool
+        \bool_const:Nn \c__nicematrix_tikz_loaded_bool \c_true_bool
         \tl_const:Nn \c__nicematrix_pgfortikzpicture_tl { \exp_not:N \tikzpicture }
         \tl_const:Nn \c__nicematrix_endpgfortikzpicture_tl { \exp_not:N \endtikzpicture }
       }
       {
+        \bool_const:Nn \c__nicematrix_tikz_loaded_bool \c_false_bool
         \tl_const:Nn \c__nicematrix_pgfortikzpicture_tl { \exp_not:N \pgfpicture }
         \tl_const:Nn \c__nicematrix_endpgfortikzpicture_tl { \exp_not:N \endpgfpicture }
       }
   }
-\bool_new:N \c__nicematrix_revtex_bool
 \@ifclassloaded { revtex4-1 }
-  { \bool_set_true:N \c__nicematrix_revtex_bool }
-  { }
-\@ifclassloaded { revtex4-2 }
-  { \bool_set_true:N \c__nicematrix_revtex_bool }
-  { }
-\cs_if_exist:NT \rvtx at ifformat@geq { \bool_set_true:N \c__nicematrix_revtex_bool }
+  { \bool_const:Nn \c__nicematrix_revtex_bool \c_true_bool }
+  {
+    \@ifclassloaded { revtex4-2 }
+      { \bool_const:Nn \c__nicematrix_revtex_bool \c_true_bool }
+      {
+        \cs_if_exist:NT \rvtx at ifformat@geq
+          { \bool_const:Nn \c__nicematrix_revtex_bool \c_true_bool }
+          { \bool_const:Nn \c__nicematrix_revtex_bool \c_false_bool }
+      }
+  }
 \cs_generate_variant:Nn \tl_if_single_token_p:n { V }
 \regex_const:Nn \c__nicematrix_columncolor_regex { \c { columncolor } }
 \cs_new_protected:Npn \__nicematrix_provide_pgfsyspdfmark:
@@ -124,11 +127,11 @@
           { \__nicematrix_old_pgfutil at check@rerun { ##1 } { ##2 } }
       }
   }
-\bool_new:N \c__nicematrix_colortbl_loaded_bool
+\bool_new:N \l__nicematrix_colortbl_loaded_bool
 \hook_gput_code:nnn { begindocument } { . }
   {
     \@ifpackageloaded { colortbl }
-      { \bool_set_true:N \c__nicematrix_colortbl_loaded_bool }
+      { \bool_set_true:N \l__nicematrix_colortbl_loaded_bool }
       {
         \cs_set_protected:Npn \CT at arc@ { }
         \cs_set:Npn \arrayrulecolor #1 # { \CT at arc { #1 } }
@@ -211,16 +214,16 @@
 \cs_new_protected:Npn \__nicematrix_set_CT at drsc@_ii: #1 \q_stop
   { \cs_set:Npn \CT at drsc@ { \color { #1 } } }
 \cs_set_eq:NN \__nicematrix_old_pgfpointanchor \pgfpointanchor
-\bool_new:N \c__nicematrix_siunitx_loaded_bool
+\bool_new:N \l__nicematrix_siunitx_loaded_bool
 \hook_gput_code:nnn { begindocument } { . }
   {
     \@ifpackageloaded { siunitx }
-      { \bool_set_true:N \c__nicematrix_siunitx_loaded_bool }
+      { \bool_set_true:N \l__nicematrix_siunitx_loaded_bool }
       { }
   }
 \hook_gput_code:nnn { begindocument } { . }
   {
-    \bool_if:nTF { ! \c__nicematrix_siunitx_loaded_bool }
+    \bool_if:nTF { ! \l__nicematrix_siunitx_loaded_bool }
       { \cs_set_eq:NN \__nicematrix_renew_NC at rewrite@S: \prg_do_nothing: }
       {
         \cs_new_protected:Npn \__nicematrix_renew_NC at rewrite@S:
@@ -255,6 +258,8 @@
 \dim_new:N \l__nicematrix_width_dim
 \seq_new:N \g__nicematrix_names_seq
 \bool_new:N \l__nicematrix_in_env_bool
+\bool_new:N \l__nicematrix_notes_detect_duplicates_bool
+\bool_set_true:N \l__nicematrix_notes_detect_duplicates_bool
 \bool_new:N \l__nicematrix_NiceArray_bool
 \bool_new:N \l__nicematrix_NiceTabular_bool
 \dim_new:N \l__nicematrix_tabular_width_dim
@@ -273,7 +278,8 @@
 \colorlet { nicematrix-last-col } { . }
 \colorlet { nicematrix-last-row } { . }
 \str_new:N \g__nicematrix_name_env_str
-\tl_set:Nn \g__nicematrix_com_or_env_str { environment }
+\tl_new:N \g__nicematrix_com_or_env_str
+\tl_gset:Nn \g__nicematrix_com_or_env_str { environment }
 \cs_new:Npn \__nicematrix_full_name_env:
   {
     \str_if_eq:VnTF \g__nicematrix_com_or_env_str { command }
@@ -285,6 +291,7 @@
 \tl_new:N \g__nicematrix_internal_code_after_tl
 \int_new:N \l__nicematrix_old_iRow_int
 \int_new:N \l__nicematrix_old_jCol_int
+\seq_new:N \l__nicematrix_custom_line_commands_seq
 \tl_new:N \l__nicematrix_rules_color_tl
 \int_new:N \g__nicematrix_total_X_weight_int
 \bool_new:N \l__nicematrix_X_columns_aux_bool
@@ -381,7 +388,13 @@
 \newcounter { tabularnote }
 \seq_new:N \g__nicematrix_tabularnotes_seq
 \tl_new:N \l__nicematrix_tabularnote_tl
-\int_new:N \l__nicematrix_number_of_notes_int
+\seq_new:N \l__nicematrix_notes_labels_seq
+\newcounter{nicematrix_draft}
+\cs_new_protected:Npn \__nicematrix_notes_format:n #1
+  {
+    \setcounter { nicematrix_draft } { #1 }
+    \__nicematrix_notes_style:n { nicematrix_draft }
+  }
 \cs_new:Npn \__nicematrix_notes_style:n #1 { \textit { \alph { #1 } } }
 \cs_new:Npn \__nicematrix_notes_label_in_tabular:n #1 { \textsuperscript { #1 } }
 \cs_new:Npn \__nicematrix_notes_label_in_list:n #1 { \textsuperscript { #1 } }
@@ -418,8 +431,26 @@
             \bool_if:nTF { ! \l__nicematrix_NiceArray_bool && \l__nicematrix_in_env_bool }
               { \__nicematrix_error:n { tabularnote~forbidden } }
               {
-                \int_incr:N \l__nicematrix_number_of_notes_int
-                \seq_gput_right:Nn \g__nicematrix_tabularnotes_seq { #1 }
+                \int_zero:N \l_tmpa_int
+                \bool_if:NT \l__nicematrix_notes_detect_duplicates_bool
+                  {
+                    \seq_map_indexed_inline:Nn \g__nicematrix_tabularnotes_seq
+                      {
+                        \tl_if_eq:nnT { #1 } { ##2 }
+                          { \int_set:Nn \l_tmpa_int { ##1 } \seq_map_break: }
+                      }
+                  }
+                \int_compare:nNnTF \l_tmpa_int = 0
+                  {
+                    \stepcounter { tabularnote }
+                    \seq_put_right:Nx \l__nicematrix_notes_labels_seq
+                      { \__nicematrix_notes_format:n { \int_use:c { c @ tabularnote } } }
+                    \seq_gput_right:Nn \g__nicematrix_tabularnotes_seq { #1 }
+                  }
+                  {
+                    \seq_put_right:Nx \l__nicematrix_notes_labels_seq
+                      { \__nicematrix_notes_format:n { \int_use:N \l_tmpa_int } }
+                  }
                 \peek_meaning:NF \tabularnote
                   {
                     \hbox_set:Nn \l_tmpa_box
@@ -426,19 +457,13 @@
                       {
                         \__nicematrix_notes_label_in_tabular:n
                           {
-                            \stepcounter { tabularnote }
-                            \__nicematrix_notes_style:n { tabularnote }
-                            \prg_replicate:nn { \l__nicematrix_number_of_notes_int - 1 }
-                              {
-                                ,
-                                \stepcounter { tabularnote }
-                                \__nicematrix_notes_style:n { tabularnote }
-                              }
+                            \seq_use:Nnnn
+                              \l__nicematrix_notes_labels_seq { , } { , } { , }
                           }
                       }
                     \addtocounter { tabularnote } { -1 }
                     \refstepcounter { tabularnote }
-                    \int_zero:N \l__nicematrix_number_of_notes_int
+                    \seq_clear:N \l__nicematrix_notes_labels_seq
                     \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
                     \skip_horizontal:n { \box_wd:N \l_tmpa_box }
                   }
@@ -734,6 +759,8 @@
           }
       } ,
     enumitem-keys-para .value_required:n = true ,
+    detect-duplicates .bool_set:N = \l__nicematrix_notes_detect_duplicates_bool ,
+    detect-duplicates .default:n = true ,
     unknown .code:n  = \__nicematrix_error:n { Unknown~key~for~notes }
   }
 \keys_define:nn { NiceMatrix / delimiters }
@@ -808,6 +835,11 @@
     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 } }
@@ -821,7 +853,6 @@
     unknown .code:n  = \__nicematrix_error:n { Unknown~key~for~NiceMatrixOptions }
   }
 \str_new:N \l__nicematrix_letter_for_dotted_lines_str
-\str_set_eq:NN \l__nicematrix_letter_for_dotted_lines_str \c_colon_str
 \NewDocumentCommand \NiceMatrixOptions { m }
   { \keys_set:nn { NiceMatrix / NiceMatrixOptions } { #1 } }
 \keys_define:nn { NiceMatrix / NiceMatrix }
@@ -1194,7 +1225,7 @@
       }
     \cs_set_nopar:Npn \ialign
       {
-        \bool_if:NTF \c__nicematrix_colortbl_loaded_bool
+        \bool_if:NTF \l__nicematrix_colortbl_loaded_bool
           {
             \CT at everycr
               {
@@ -1231,7 +1262,6 @@
     \cs_set_eq:NN \Vdots \__nicematrix_Vdots
     \cs_set_eq:NN \Ddots \__nicematrix_Ddots
     \cs_set_eq:NN \Iddots \__nicematrix_Iddots
-    \cs_set_eq:NN \hdottedline \__nicematrix_hdottedline:
     \cs_set_eq:NN \Hline \__nicematrix_Hline:
     \cs_set_eq:NN \Hspace \__nicematrix_Hspace:
     \cs_set_eq:NN \Hdotsfor \__nicematrix_Hdotsfor:
@@ -1244,6 +1274,8 @@
     \cs_set_eq:NN \diagbox \__nicematrix_diagbox:nn
     \cs_set_eq:NN \NotEmpty \__nicematrix_NotEmpty:
     \cs_set_eq:NN \RowStyle \__nicematrix_RowStyle:n
+    \seq_map_inline:Nn \l__nicematrix_custom_line_commands_seq
+      { \cs_set_eq:cc { ##1 } { nicematrix - ##1 } }
     \bool_if:NT \l__nicematrix_colortbl_like_bool \__nicematrix_colortbl_like:
     \bool_if:NT \l__nicematrix_renew_dots_bool \__nicematrix_renew_dots:
     \cs_set_eq:NN \multicolumn \__nicematrix_multicolumn:nnn
@@ -1275,12 +1307,12 @@
       {
         \bool_set_true:N \l__nicematrix_last_row_without_value_bool
         \bool_if:NT \g__nicematrix_aux_found_bool
-          { \int_set:Nn \l__nicematrix_last_row_int { \seq_item:Nn \c__nicematrix_size_seq 3 } }
+          { \int_set:Nn \l__nicematrix_last_row_int { \seq_item:Nn \g__nicematrix_size_seq 3 } }
       }
     \int_compare:nNnT \l__nicematrix_last_col_int = { -1 }
       {
         \bool_if:NT \g__nicematrix_aux_found_bool
-          { \int_set:Nn \l__nicematrix_last_col_int { \seq_item:Nn \c__nicematrix_size_seq 6 } }
+          { \int_set:Nn \l__nicematrix_last_col_int { \seq_item:Nn \g__nicematrix_size_seq 6 } }
       }
     \int_compare:nNnT \l__nicematrix_last_row_int > { -2 }
       {
@@ -1330,10 +1362,10 @@
   }
 \cs_new_protected:Npn \__nicematrix_pre_code_before:
   {
-    \int_set:Nn \c at iRow { \seq_item:Nn \c__nicematrix_size_seq 2 }
-    \int_set:Nn \c at jCol { \seq_item:Nn \c__nicematrix_size_seq 5 }
-    \int_set_eq:NN \g__nicematrix_row_total_int { \seq_item:Nn \c__nicematrix_size_seq 3 }
-    \int_set_eq:NN \g__nicematrix_col_total_int { \seq_item:Nn \c__nicematrix_size_seq 6 }
+    \int_set:Nn \c at iRow { \seq_item:Nn \g__nicematrix_size_seq 2 }
+    \int_set:Nn \c at jCol { \seq_item:Nn \g__nicematrix_size_seq 5 }
+    \int_set_eq:NN \g__nicematrix_row_total_int { \seq_item:Nn \g__nicematrix_size_seq 3 }
+    \int_set_eq:NN \g__nicematrix_col_total_int { \seq_item:Nn \g__nicematrix_size_seq 6 }
     \pgfsys at markposition { \__nicematrix_env: - position }
     \pgfsys at getposition { \__nicematrix_env: - position } \__nicematrix_picture_position:
     \pgfpicture
@@ -1801,7 +1833,8 @@
       {
         \str_case_e:nnF { #1 }
           {
-            \l__nicematrix_letter_for_dotted_lines_str { \__nicematrix_patch_preamble_xii:n #1 }
+            \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
@@ -1810,15 +1843,6 @@
                   { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } }
                 \__nicematrix_patch_preamble:n
               }
-            { : }
-              {
-                \bool_if:NTF \c__nicematrix_arydshln_loaded_bool
-                  {
-                    \tl_gput_right:Nn \g__nicematrix_preamble_tl { : }
-                    \__nicematrix_patch_preamble:n
-                  }
-                  { \__nicematrix_fatal:n { colon~without~arydshln } }
-              }
           }
           {
             \keys_set_known:nnN { NiceMatrix / ColumnTypes } { #1 } \l_tmpa_tl
@@ -2176,8 +2200,7 @@
     \keys_set:nV { WithArrows / X-column } \l_tmpa_tl
     \int_compare:nNnT \l__nicematrix_weight_int < 0
       {
-        \exp_args:Nnx \__nicematrix_error:nn { negative~weight }
-          { \int_use:N \l__nicematrix_weight_int }
+        \__nicematrix_error:nx { negative~weight } { \int_use:N \l__nicematrix_weight_int }
         \int_set:Nn \l__nicematrix_weight_int { - \l__nicematrix_weight_int }
       }
     \int_gadd:Nn \g__nicematrix_total_X_weight_int \l__nicematrix_weight_int
@@ -2616,12 +2639,12 @@
     \tl_gput_right:Nn \g_nicematrix_code_after_tl { #2 }
     \seq_gclear_new:N \g__nicematrix_rows_seq
     \tl_set_rescan:Nno \l__nicematrix_end_of_row_tl { } \l__nicematrix_end_of_row_tl
-    \exp_args:NNV \seq_gset_split:Nnn \g__nicematrix_rows_seq \l__nicematrix_end_of_row_tl { #1 }
+    \seq_gset_split:NVn \g__nicematrix_rows_seq \l__nicematrix_end_of_row_tl { #1 }
     \int_compare:nNnT \l__nicematrix_last_row_int = { -1 }
       { \int_set:Nn \l__nicematrix_last_row_int { \seq_count:N \g__nicematrix_rows_seq } }
     \exp_args:NV \__nicematrix_array: \g__nicematrix_preamble_tl
     \seq_gpop_left:NN \g__nicematrix_rows_seq \l_tmpa_tl
-    \exp_args:NV \__nicematrix_line_with_light_syntax_i:n \l_tmpa_tl
+    \__nicematrix_line_with_light_syntax_i:V \l_tmpa_tl
     \seq_map_function:NN \g__nicematrix_rows_seq \__nicematrix_line_with_light_syntax:n
     \__nicematrix_create_col_nodes:
     \endarray
@@ -2636,6 +2659,7 @@
     \l_tmpa_tl
     \seq_map_inline:Nn \g__nicematrix_cells_seq { & ##1 }
   }
+\cs_generate_variant:Nn \__nicematrix_line_with_light_syntax_i:n { V }
 \cs_new_protected:Npn \__nicematrix_analyze_end:Nn #1 #2
   {
     \str_if_eq:VnT \g__nicematrix_name_env_str { #2 }
@@ -2971,6 +2995,7 @@
           { > \__nicematrix_cell_begin:w #2 < \__nicematrix_cell_end: }
       }
   }
+\cs_generate_variant:Nn \__nicematrix_begin_of_NiceMatrix:nn { n e }
 \clist_map_inline:nn { { } , p , b , B , v , V }
   {
     \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
@@ -2978,7 +3003,7 @@
         \str_gset:Nn \g__nicematrix_name_env_str { #1 NiceMatrix }
         \tl_set:Nn \l__nicematrix_type_of_col_tl c
         \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
-        \exp_args:Nne \__nicematrix_begin_of_NiceMatrix:nn { #1 } \l__nicematrix_type_of_col_tl
+        \__nicematrix_begin_of_NiceMatrix:ne { #1 } \l__nicematrix_type_of_col_tl
       }
       { \use:c { end #1 NiceArray } }
   }
@@ -3005,8 +3030,7 @@
   }
 \NewDocumentEnvironment { NiceTabularX } { m O { } m ! O { } }
   {
-    \bool_if:NT \c__nicematrix_tabularx_loaded_bool
-      { \newcolumntype { X } { \__nicematrix_X } }
+    \bool_if:NT \c__nicematrix_tabularx_loaded_bool { \newcolumntype { X } { \__nicematrix_X } }
     \str_gset:Nn \g__nicematrix_name_env_str { NiceTabularX }
     \dim_zero_new:N \l__nicematrix_width_dim
     \dim_set:Nn \l__nicematrix_width_dim { #1 }
@@ -3035,7 +3059,7 @@
       { \int_set_eq:NN \l__nicematrix_last_row_int \g__nicematrix_row_total_int }
     \tl_gput_right:Nx \g__nicematrix_aux_tl
       {
-        \seq_gset_from_clist:Nn \exp_not:N \c__nicematrix_size_seq
+        \seq_gset_from_clist:Nn \exp_not:N \g__nicematrix_size_seq
           {
             \int_use:N \l__nicematrix_first_row_int ,
             \int_use:N \c at iRow ,
@@ -3815,7 +3839,7 @@
 \cs_new_protected:Npn \__nicematrix_draw_unstandard_dotted_line:
   {
     \begin { scope }
-    \exp_args:No \__nicematrix_draw_unstandard_dotted_line:n
+    \__nicematrix_draw_unstandard_dotted_line:o
       { \l__nicematrix_xdots_line_style_tl , \l__nicematrix_xdots_color_tl }
   }
 \cs_new_protected:Npn \__nicematrix_draw_unstandard_dotted_line:n #1
@@ -3825,6 +3849,7 @@
       \l__nicematrix_xdots_up_tl
       \l__nicematrix_xdots_down_tl
   }
+\cs_generate_variant:Nn \__nicematrix_draw_unstandard_dotted_line:n { o }
 \cs_new_protected:Npn \__nicematrix_draw_unstandard_dotted_line:nnn #1 #2 #3
   {
     \draw
@@ -4778,8 +4803,8 @@
     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:
+    % letter .code:n = \prg_do_nothing: ,
+    % command .code:n = \prg_do_nothing:
   }
 \keys_define:nn { NiceMatrix / RulesBis }
   {
@@ -4871,8 +4896,8 @@
    }
 \cs_new_protected:Npn \__nicematrix_vline_ii:
   {
-    \bool_set_false:N \l__nicematrix_dotted_bool
-    \keys_set:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
+    \bool_set_false:N \l__nicematrix_dotted_boo
+    \keys_set_known:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
     \bool_if:NTF \l__nicematrix_dotted_bool
       \__nicematrix_vline_iv:
       {
@@ -5053,7 +5078,7 @@
 \cs_new_protected:Npn \__nicematrix_hline_ii:
   {
     \bool_set_false:N \l__nicematrix_dotted_bool
-    \keys_set:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
+    \keys_set_known:nV { NiceMatrix / RulesBis } \l__nicematrix_other_keys_tl
     \bool_if:NTF \l__nicematrix_dotted_bool
       \__nicematrix_hline_iv:
       {
@@ -5235,7 +5260,7 @@
                   \c__nicematrix_forbidden_letters_str \l__nicematrix_letter_str
                   { \__nicematrix_error:n { Forbidden~letter } }
                   {
-                    \exp_args:Nnx \keys_define:nn { NiceMatrix / ColumnTypes }
+                    \keys_define:nx { NiceMatrix / ColumnTypes }
                       {
                         \l__nicematrix_letter_str .code:n =
                           { \__nicematrix_custom_line_i:n { \exp_not:n { #1 } } }
@@ -5254,13 +5279,11 @@
                     + \doublerulesep * ( \l__nicematrix_tmpc_int - 1 )
                   }
               }
-            \exp_args:NnV \__nicematrix_define_h_custom_line:nn
-              { #1 }
-              \l__nicematrix_rule_width_dim
+            \__nicematrix_define_h_custom_line:nV { #1 } \l__nicematrix_rule_width_dim
           }
       }
   }
-\str_const:Nn \c__nicematrix_forbidden_letters_str { lcrpmbVX:|()[]!@<> }
+\str_const:Nn \c__nicematrix_forbidden_letters_str { lcrpmbVX|()[]!@<> }
 \keys_define:nn { NiceMatrix / Custom-Line }
   {
     % here, we will use change in the future to use .tl_set:N
@@ -5278,10 +5301,11 @@
     width .code:n = \dim_set:Nn \l__nicematrix_rule_width_dim { #1 }
                     \bool_set_true:N \l_tmpb_bool ,
     width .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
   {
-    \cs_set:cpn \l__nicematrix_command_str
+    \cs_set:cpn { nicematrix - \l__nicematrix_command_str }
       {
         \noalign
           {
@@ -5290,7 +5314,9 @@
               { \__nicematrix_hline:n { #1 , position = \int_eval:n { \c at iRow + 1 } } }
           }
       }
+    \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
   {
     \bool_if:NF \l_tmpa_bool
@@ -5309,6 +5335,7 @@
      \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
   {
     \bool_lazy_all:nT
@@ -7331,6 +7358,7 @@
   }
   {
     The~available~keys~are~(in~alphabetic~order):~
+    allow-letter-for-dotted-lines,~
     footnote,~
     footnotehyper,~
     renew-dots,~and
@@ -7346,6 +7374,14 @@
     transparent .value_forbidden:n = true,
     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 }
@@ -7388,17 +7424,17 @@
       }
     \bool_set_true:N \c__nicematrix_footnote_bool
   }
-\seq_new:N \c__nicematrix_types_of_matrix_seq
-\seq_set_from_clist:Nn \c__nicematrix_types_of_matrix_seq
+\seq_new:N \g__nicematrix_types_of_matrix_seq
+\seq_gset_from_clist:Nn \g__nicematrix_types_of_matrix_seq
   {
     NiceMatrix ,
     pNiceMatrix , bNiceMatrix , vNiceMatrix, BNiceMatrix, VNiceMatrix
   }
-\seq_set_map_x:NNn \c__nicematrix_types_of_matrix_seq \c__nicematrix_types_of_matrix_seq
+\seq_gset_map_x:NNn \g__nicematrix_types_of_matrix_seq \g__nicematrix_types_of_matrix_seq
   { \tl_to_str:n { #1 } }
 \cs_new_protected:Npn \__nicematrix_error_too_much_cols:
   {
-    \seq_if_in:NVTF \c__nicematrix_types_of_matrix_seq \g__nicematrix_name_env_str
+    \seq_if_in:NVTF \g__nicematrix_types_of_matrix_seq \g__nicematrix_name_env_str
       {
         \int_compare:nNnTF \l__nicematrix_last_col_int = { -2 }
         { \__nicematrix_fatal:n { too~much~cols~for~matrix } }
@@ -7495,6 +7531,22 @@
     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.
   }
+\__nicematrix_msg_new:nnn { Unknown~key~for~custom-line }
+  {
+    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>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    color,~
+    command,~
+    dotted,~
+    letter,~
+    multiplicity,~
+    sep-color,~
+    tikz,~and~width.
+  }
 \__nicematrix_msg_new:nn { Unknown~key~for~xdots }
   {
     As~for~now,~there~is~only~three~keys~available~here:~'color',~'line-style'~
@@ -7575,8 +7627,17 @@
     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.
+    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 }
   {
     You~can't~use~the~letter~'\l__nicematrix_letter_str'~for~a~customized~line.\\
@@ -7842,6 +7903,7 @@
     bottomrule,~
     code-after,~
     code-before,~
+    detect-duplicates,~
     enumitem-keys,~
     enumitem-keys-para,~
     para,~
@@ -7897,7 +7959,6 @@
     last-col,~
     last-row,~
     left-margin,~
-    letter-for-dotted-lines,~
     light-syntax,~
     notes~(several~subkeys),~
     nullify-dots,~



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