texlive[67135] Master/texmf-dist: nicematrix (16may23)
commits+karl at tug.org
commits+karl at tug.org
Tue May 16 22:22:30 CEST 2023
Revision: 67135
http://tug.org/svn/texlive?view=revision&revision=67135
Author: karl
Date: 2023-05-16 22:22:30 +0200 (Tue, 16 May 2023)
Log Message:
-----------
nicematrix (16may23)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/nicematrix/README.md
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.ins
trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty
Added Paths:
-----------
trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-code.pdf
trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.tex
trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx
Removed Paths:
-------------
trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
Modified: trunk/Master/texmf-dist/doc/latex/nicematrix/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nicematrix/README.md 2023-05-16 20:22:00 UTC (rev 67134)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/README.md 2023-05-16 20:22:30 UTC (rev 67135)
@@ -19,7 +19,7 @@
For a manual installation:
-* put the files `nicematrix.ins` and `nicematrix.dtx` in the same directory;
+* put the files `nicematrix.ins` and `nicematrix-code.dtx` in the same directory;
* run `latex nicematrix.ins` in that directory.
The file `nicematrix.sty` will be generated.
Added: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-code.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-code.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-code.pdf 2023-05-16 20:22:00 UTC (rev 67134)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-code.pdf 2023-05-16 20:22:30 UTC (rev 67135)
Property changes on: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-code.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
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 2023-05-16 20:22:00 UTC (rev 67134)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex 2023-05-16 20:22:30 UTC (rev 67135)
@@ -17,6 +17,8 @@
\usepackage{siunitx}
\usepackage{verbatim}
\usepackage{caption}
+\usepackage{tocloft}
+\setlength{\cftsubsecnumwidth}{3em} % for the numbers of subsections of the TOC
% On utilise \MakeShortVerb de shortvrb et pas \DefineShortVerb de fancyvrb
% car on ne veut pas que le contenu des petits éléments en verbatim soit colorié
@@ -42,19 +44,7 @@
\usepackage{tcolorbox}
\usepackage{adjustbox}
\usepackage[auto-lang=false]{lipsum}
-\usepackage[hyperfootnotes = false]{hyperref}
-\hypersetup
- {
- pdfinfo =
- {
- Title = L’extension nicematrix ,
- Subject = Une extension LaTeX ,
- Author = F. Pantigny
- }
- }
-
-
\NewDocumentEnvironment {scope} {} {} {}
\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
@@ -67,8 +57,28 @@
\NewDocumentCommand{\Definition}{m}
{{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
+\usepackage{makeidx}
+\makeindex
+\NewDocumentCommand{\indexcommand}{m}{\index{#1@\texttt{\textbackslash #1}}}
+\NewDocumentCommand{\indexenv}{m}{\index{#1@\texttt{\{#1\}}}}
+
+
+\usepackage[hyperfootnotes = false]{hyperref}
+
+\hypersetup
+ {
+ pdfinfo =
+ {
+ Title = L’extension nicematrix ,
+ Subject = Une extension LaTeX ,
+ Author = F. Pantigny
+ }
+ }
+
+
+
\begin{document}
\VerbatimFootnotes
@@ -155,7 +165,7 @@
pour être utilisées à la compilation suivante. C'est pourquoi l'utilisation de
\pkg{nicematrix} nécessite \textbf{plusieurs compilations
successives}.\footnote{Si vous utilisez Overleaf, Overleaf effectue
- automatiquement le nombre de compilations nécessaire.}
+ automatiquement un nombre de compilations suffisant.}
\medskip
La plupart des fonctionnalités de \pkg{nicematrix} sont accessibles sans avoir à
@@ -163,6 +173,7 @@
chargé par défaut).
\medskip
+\indexcommand{NiceMatrixOptions}
Une commande|\NiceMatrixOptions| est fournie pour régler les options (la portée
des options fixées par cette commande est le groupe TeX courant : elles sont
semi-globales).
@@ -172,6 +183,23 @@
\section{Les environnements de cette extension}
+
+\indexenv{NiceTabular}
+\indexenv{NiceTabular*}
+\indexenv{NiceArray}
+\indexenv{pNiceArray}
+\indexenv{bNiceArray}
+\indexenv{BNiceArray}
+\indexenv{vNiceArray}
+\indexenv{VNiceArray}
+\indexenv{NiceMatrix}
+\indexenv{pNiceMatrix}
+\indexenv{bNiceMatrix}
+\indexenv{BNiceMatrix}
+\indexenv{vNiceMatrix}
+\indexenv{VNiceMatrix}
+
+
L'extension \pkg{nicematrix} définit les nouveaux environnements suivants :
\medskip
@@ -227,6 +255,9 @@
\section{L'espace vertical entre les rangées}
\label{cell-space}
+\index{cell-space-top-limit}
+\index{cell-space-bottom-limit}
+\index{cell-space-limits}
Il est bien connu que certaines rangées des tableaux créés par défaut avec
LaTeX sont trop proches l'une de l'autre. On en donne ci-dessous un exemple
@@ -248,7 +279,7 @@
En s'inspirant de l'extension \pkg{cellspace} qui traite de ce problème,
l'extension \pkg{nicematrix} propose deux clés |cell-space-top-limit| et
|cell-space-bottom-limit| qui sont similaires aux deux paramètres
-|\cellspacetoplimit| et |\cellspacebottomlimit| proposés par \pkg{cellspace}.
+|\cellspacetoplimit| et |\cellspacebottomlimit| proposés par \pkg{cellspace}.\index{cellspace@\pkg{cellspace} (extension)}
Il existe aussi une clé |cell-space-limits| pour régler simultanément les deux
paramètres.
@@ -284,6 +315,8 @@
\medskip
\section{La clé baseline}
+\index{baseline (clé pour un environnement)}
+
L'extension \pkg{nicematrix} propose une option |baseline| pour la position
verticale des tableaux. Cette option |baseline| prend comme valeur un entier qui
indique le numéro de rangée dont la ligne de base servira de ligne de base pour
@@ -420,6 +453,8 @@
\section{Les blocs}
\label{Block}
+\index{Blocs@\textbf{Blocs dans les tableaux}|(}
+\indexcommand{Block}
\subsection{Cas général}
@@ -499,27 +534,35 @@
La commande |\Block| accepte en premier argument optionnel (entre crochets) une
liste de couples \textsl{clé=valeur}. Les clés sont les suivantes :
\begin{itemize}
-\item la clé \Definition{fill} prend en argument une couleur et remplit le bloc
+\item \index{fill (clé de \texttt{\textbackslash Block})}
+la clé \Definition{fill} prend en argument une couleur et remplit le bloc
avec cette couleur ;
-\item la clé \Definition{draw} prend en argument une couleur et trace le cadre
+\item \index{draw (clé de \texttt{\textbackslash Block})}
+la clé \Definition{draw} prend en argument une couleur et trace le cadre
avec cette couleur (la valeur par défaut de cette clé est la couleur courante
des filets du tableau) ;
-\item la clé \Definition{color} prend en argument une couleur et l'applique au
+\item \index{color!clé de \texttt{\textbackslash Block}}
+la clé \Definition{color} prend en argument une couleur et l'applique au
contenu et trace également le cadre avec cette couleur ;
-\item les clés \Definition{hlines}, \Definition{vlines} et \Definition{hvlines}
+\item \index{vlines!clé de \texttt{\textbackslash Block}} \index{hvlines!clé de
+ \texttt{\textbackslash Block}} \index{hlines!clé de \texttt{\textbackslash Block}}
+les clés \Definition{hlines}, \Definition{vlines} et \Definition{hvlines}
tracent les filets correspondants dans le bloc\footnote{Néanmoins, les filets ne
sont pas tracés dans les sous-blocs du bloc, conformément à l'esprit de
\pkg{nicematrix}: les filets ne sont pas tracés dans les blocs (cf.
section~\ref{rules} p.~\pageref{rules}).} ;
-\item la clé \Definition{line-width} fixe la largeur utilisée pour tracer les
+\item \index{line-width (clé de \texttt{\textbackslash Block})}
+la clé \Definition{line-width} fixe la largeur utilisée pour tracer les
filets (n'a d'intérêt que si |draw|, |hvlines|,
|hlines| ou |vlines| est utilisée) ;
-\item la clé \Definition{rounded-corners} impose des coins arrondis (pour le
+\item \index{rounded-corners!clé de \texttt{\textbackslash Block}} \index{Coins arrondis!pour un bloc}
+la clé \Definition{rounded-corners} impose des coins arrondis (pour le
cadre dessiné par |draw| et le fond dessiné par |fill|)
avec un rayon égal à la valeur de cette clé (la valeur par défaut est
4~pt\footnote{Cette valeur par défaut est la valeur initiale des \emph{rounded
corners} de TikZ.}) ;
-\item quand la clé \Definition{tikz} est utilisée, le chemin TikZ correspondant
+\item \index{tikzz at tikz!clé de \texttt{\textbackslash Block}}
+quand la clé \Definition{tikz} est utilisée, le chemin TikZ correspondant
au rectangle délimitant le bloc est exécuté avec TikZ\footnote{TikZ doit être
chargé préalablement (par défaut, \pkg{nicematrix} ne charge que
\textsc{pgf}), faute de quoi, une erreur sera levée.} en utilisant comme
@@ -526,12 +569,15 @@
options la valeur de cette clé |tikz| (qui doit donc être une liste de clés TikZ
applicables à un chemin de TikZ). Pour des exemples d'utilisation de cette clé
|tikz|, voir p.~\pageref{tikz-key-examples} ;
-\item la clé \Definition{name} donne un nom au nœud TikZ rectangulaire
+\item \index{name!clé de \texttt{\textbackslash Block}}
+la clé \Definition{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 la clé \Definition{respect-arraystretch} évite la remise à $1$ de
+\item \index{respect-arraystretch (clé de \texttt{\textbackslash Block})}
+la clé \Definition{respect-arraystretch} évite la remise à $1$ de
|\arraystretch| en début de bloc (qui a lieu par défaut) ;
-\item la clé \Definition{borders} permet de ne tracer que certaines des bordures
+\item \index{borders (clé de \texttt{\textbackslash Block})} \index{tikzz at tikz!clé de «borders» de \texttt{\textbackslash Block}}
+la clé \Definition{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| ; on peut en fait, dans la liste qui est la
valeur de la clé |borders| mettre une entrée de la forme
@@ -538,13 +584,13 @@
|tikz={|\textsl{liste}|}| où \textsl{liste} est une liste de couples
\textsl{clé=valeur} de TikZ spécifiant les caractéristiques graphiques des
traits qui seront dessinés (pour un exemple, voir p.~\pageref{tiretes}).
-
-\item \colorbox{yellow!50}{\textbf{Nouveau 6.15}}\par\nobreak Par défaut, les
-filets ne sont pas tracés dans les blocs (voir à ce sujet la partie sur les
-filets, section~\ref{rules} p.~\pageref{rules}). Néanmoins, si la clé
-\Definition{transparent} est utilisée, les filets seront tracés. Pour un
+\item \index{transparent (clé de \texttt{\textbackslash Block})}
+Par défaut, les filets ne sont pas tracés dans les blocs (voir à ce sujet
+la partie sur les filets, section~\ref{rules} p.~\pageref{rules}). Néanmoins, si
+la clé \Definition{transparent} est utilisée, les filets seront tracés. Pour un
example, voir la section~\ref{tikz-key-examples},
-page~\pageref{tikz-key-examples}.
+page~\pageref{tikz-key-examples}. Attention : cette clé n'implique pas du tout
+que le contenu du bloc sera transparent.
\end{itemize}
@@ -818,8 +864,10 @@
\texttt{c} est déjà prise pour le positionnement horizontal.}, |t|, |b|, |T| et~|B|.
+
\begin{itemize}
-\item Avec la clé |v-center|, le contenu du bloc est centré verticalement.
+\item \index{v-center (clé de \texttt{\textbackslash Block)})}
+Avec la clé |v-center|, le contenu du bloc est centré verticalement.
\item Avec la clé |t|, la ligne de base du contenu du bloc est alignée avec la
ligne de base de la première rangée concernée par le bloc.
@@ -934,10 +982,11 @@
\end{scope}
+\index{Blocs@\textbf{Blocs dans les tableaux}|)}
-
\section{Les filets horizontaux et verticaux}
\label{rules}
+\index{Filets@\textbf{Filets dans les tableaux}|(}
Les techniques habituelles pour tracer des filets peuvent être utilisées dans
les environnements de \pkg{nicematrix}, à l'exception de |\vline|. Il y a
@@ -980,6 +1029,7 @@
\medskip
+\index{booktabs@\pkg{booktabs} (extension)}
Si vous utilisez \pkg{booktabs} (qui fournit |\toprule|, |\midrule|,
|\bottomrule|, etc.) et que vous tenez absolument à mettre des filets verticaux
(ce qui est contraire à l'esprit à \pkg{booktabs}), vous constaterez que les
@@ -1017,6 +1067,7 @@
\subsubsection{La commande \textbackslash cline}
\label{remark-cline}
+\index{cline@\texttt{\textbackslash cline} (commande de LaTeX)}
Les traits verticaux et horizontaux que l'on insère avec |\hline| et le
spécificateur de colonne «\verb+|+» de \pkg{array} rendent le tableau plus large
@@ -1048,6 +1099,7 @@
\end{scope}
\medskip
+\index{standard-cline}
Dans les environnements de \pkg{nicematrix}, cette situation est corrigée (il
est néanmoins possible de revenir au comportement par défaut de |\cline| avec la
clé |standard-cline|).
@@ -1079,6 +1131,11 @@
\subsection{L'épaisseur et la couleur des filets}
+\indexcommand{arrayrulewidth}
+\index{Couleur!des filets}
+\index{width!sous-clé de «rules»}
+\index{rules (clé pour un environnement)}
+
Les environnements de \pkg{nicematrix} proposent une clé |rules/width| pour
fixer la largeur (on devrait plutôt dire l'épaisseur) des filets dans
l'environnement. En fait, cette clé ne fait que fixer la valeur du paramètre
@@ -1089,6 +1146,7 @@
la couleur de ces filets.
\smallskip
+\indexcommand{arrayrulecolor}
Avec \pkg{nicematrix}, il est possible de spécifier une couleur même si
\pkg{colortbl} n'est pas chargé. Par souci de compatibilité, la commande est
nommée également |\arrayrulecolor|. Les environnements de \pkg{nicematrix}
@@ -1122,6 +1180,8 @@
\medskip
\subsection{Les outils de nicematrix pour tracer des filets}
+
+
Les outils proposés par \pkg{nicematrix} pour tracer des filets sont les
suivants :
\begin{itemize}
@@ -1128,7 +1188,8 @@
\item les clés |hlines|, |vlines|, |hvlines| et |hvlines-except-borders|;
\item le spécificateur «\verb+|+» dans le préambule (pour les environnements à
préambule) ;
-\item la commande |\Hline|.
+\item \indexcommand{Hline}
+la commande |\Hline|.
\end{itemize}
\medskip
@@ -1160,6 +1221,11 @@
\medskip
\subsubsection{Les clés hlines et vlines}
+\index{hlines|see{Filets}}
+\index{hlines!clé pour un environnement}
+\index{vlines|see{Filets}}
+\index{vlines!clé pour un environnement}
+
\medskip
Les clés |hlines| et |vlines| (qui, bien sûr, tracent des filets horizontaux et
verticaux) prennent comme valeur une liste de numéros qui sont les numéros des
@@ -1188,6 +1254,9 @@
\subsubsection{Les clés hvlines et hvlines-except-borders}
\label{hvlines}
+\index{hvlines|see{Filets}}
+\index{hvlines!clé pour un environnement}
+\index{hvlines-except-borders}
La clé |hvlines|, qui ne prend pas de valeur, est la conjonction des clés
|hlines| et |vlines|.
@@ -1228,6 +1297,9 @@
\subsubsection{Les coins (vides)}
\label{corners}
+\index{Coins (les --- vides)}
+\index{corners (clé d'un environnement)}
+
Les quatre coins d'un tableau seront notés |NW|, |SW|, |NE| et |SE| (\emph{north west}, \emph{south west}, \emph{north
east} et \emph{south east} en anglais).
@@ -1241,6 +1313,7 @@
une «case vide» est donnée plus loin (cf. p.~\pageref{empty-cells}).}
\smallskip
+\indexcommand{NotEmpty}
On peut néanmoins imposer à une case sans contenu d'être considérée
comme non vide par \pkg{nicematrix} avec la commande |\NotEmpty|.
@@ -1340,6 +1413,8 @@
\subsection{La commande \textbackslash diagbox}
+\indexcommand{diagbox}
+
La commande |\diagbox| (inspirée par l'extension \pkg{diagbox}) permet, quand
elle est utilisée dans une case, de couper cette case selon une diagonale
descendante.
@@ -1369,7 +1444,12 @@
\subsection{Commandes pour filets personnalisés}
\label{custom-line}
+\index{command (clé de «custom-line»)}
+\index{ccommand (clé de «custom-line»)}
+\index{letter (clé de «custom-line»)}
+\index{custom-line|(}
+
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
@@ -1411,6 +1491,9 @@
entre les filets (comme on peut le faire avec \pkg{colortbl} par exemple).
\begin{itemize}
+\index{multiplicity (clé de «custom-line»)}
+\index{color!clé de «custom-line»}
+\index{sep-color (clé de «custom-line»)}
\item la clé |multiplicity| indique le nombre de traits successifs qui seront
tracés : par exemple, une valeur de~$2$ va créer des filets doubles comme créés
en standard par |\hline\hline| ou bien \verb+||+ dans le préambule d'un
@@ -1458,6 +1541,9 @@
\item \emph{Deuxième possibilité}\par\nobreak
+\index{tikzz at tikz!clé de «custom-line»}
+\index{total-width (clé de «custom-line»)}
+
On peut utiliser la clé |tikz| (si TikZ est chargé, \pkg{nicematrix} ne
chargeant par défaut que \textsc{pgf}). Dans ce cas-là, le filet est tracé
directement avec TikZ en utilisant comme paramètres la valeur de la clé |tikz|
@@ -1511,6 +1597,9 @@
\medskip
\item \emph{Troisième possibilité} : la clé |dotted|\par\nobreak
\label{dotted}
+\index{dotted (clé de «custom-line»)}
+\indexcommand{hdottedline}
+\indexcommand{cdottedline}
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}
@@ -1587,13 +1676,17 @@
\end{pNiceArray}$
\end{itemize}
+\index{custom-line|)}
+\index{Filets@\textbf{Filets dans les tableaux}|)}
+\section{Les couleurs des rangées et des colonnes}
+\index{Couleur!de fond pour les cases}
-\section{Les couleurs des rangées et des colonnes}
-
\subsection{Utilisation de colortbl}
+\index{colortbl@\pkg{colortbl} (extension)}
+
Rappelons que l'extension \pkg{colortbl} peut être chargée directement par
|\usepackage{colortbl}| ou en chargeant l'extension \pkg{xcolor} avec l'option
|table| : |\usepackage[table]{xcolor}|.
@@ -1637,6 +1730,9 @@
\subsection{Les outils de nicematrix dans le \textbackslash CodeBefore}
\label{color-in-code-before}
+\index{code-before!clé pour un environnement}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}}
+\index{Body@\texttt{\textbackslash Body}|see{\texttt{\textbackslash CodeBefore}}}
L'extension \pkg{nicematrix} propose des outils (indépendants de \pkg{colortbl})
pour tracer d'abord les rectangles colorés, puis le contenu des cases et les
@@ -1644,8 +1740,7 @@
formats PostScript et \textsc{pdf} et convient donc mieux aux lecteurs de
\textsc{pdf}. L'inconvénient est qu'elle nécessite plusieurs compilations
successives.\footnote{Si vous utilisez Overleaf, Overleaf effectue
- automatiquement le nombre de
- compilations nécessaire.}
+ automatiquement un nombre de compilations suffisant.}
\medskip
L'extension \pkg{nicematrix} fournit une clé |code-before| pour du code qui sera
@@ -1666,7 +1761,7 @@
L'argument optionnel entre crochets est une liste de couples \textsl{clé=valeur}
qui seront présentées au fur et à mesure. \footnote{Les clés disponibles sont
\texttt{create-cell-nodes}, \texttt{sub-matrix} (et ses sous-clés) et
- \texttt{delimiters-color}.}
+ \texttt{delimiters/color}.}
\smallskip
De nouvelles commandes sont disponibles dans ce |\CodeBefore|: |\cellcolor|,
@@ -1676,6 +1771,20 @@
position des filets éventuels sont également accessibles : cf.
p.~\pageref{nodes-i}.}
\label{code-before}
+\index{cellcolor@\texttt{\textbackslash cellcolor}!commande du
+ \texttt{\textbackslash CodeBefore}}
+\index{rectanglecolor@\texttt{\textbackslash rectanglecolor} (commande du
+ \texttt{\textbackslash CodeBefore})}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!commande du \texttt{\textbackslash CodeBefore}}
+\index{columncolor@\texttt{\textbackslash columncolor}!commande du
+ \texttt{\textbackslash CodeBefore}}
+\index{rowcolors@\texttt{\textbackslash rowcolors} (commande du \texttt{\textbackslash CodeBefore})}
+\index{rowlistcolor@\texttt{\textbackslash rowlistcolors} (commande du
+ \texttt{\textbackslash CodeBefore})}
+\index{chessboardcolors@\texttt{\textbackslash chessboardcolors}!(commande
+ du \texttt{\textbackslash CodeBefore})}
+\index{arraycolor@\texttt{\textbackslash arraycolor} (commande du \texttt{\textbackslash
+ CodeBefore)}}
\medskip
@@ -1695,7 +1804,9 @@
\begin{itemize}
\item le modèle colorimétrique (|RGB|, |rgb|, |HTML|, etc.) comme spécifié par
l'extension \pkg{xcolor} ;
-\item \colorbox{yellow!50}{\textbf{Nouveau 6.18}}
+\item \index{opacity (clé des commandes comme\newline \texttt{\textbackslash
+ rowcolor}, etc.)}
+\colorbox{yellow!50}{\textbf{Nouveau 6.18}}
une spécification d'opacité selon la forme \texttt{opacity = \textsl{valeur}}.
\end{itemize}
@@ -1878,6 +1989,9 @@
\textsl{clé=valeur} comme argument optionnel en dernière position (l'argument
optionnel en première position correspond à l'espace colorimétrique). Les clés
disponibles sont |cols|, |restart| et |respect-blocks|.
+\index{cols (clé de \texttt{\textbackslash rowcolors} du \texttt{\textbackslash CodeBefore})}
+\index{restart (clé de \texttt{\textbackslash rowcolors} du \texttt{\textbackslash CodeBefore})}
+\index{respect-blocks (clé de \texttt{\textbackslash rowcolors} du\newline \texttt{\textbackslash CodeBefore})}
\begin{itemize}
\item La clé |cols| décrit un ensemble de colonnes sur lesquelles portera
l'effet de |\rowcolors|. Cet ensemble de colonnes est une liste d'intervalles de
@@ -1888,13 +2002,11 @@
couleur.\footnote{Autrement, la couleur d'une rangée ne dépend que de la parité
de son numéro absolu.}
-
\item Avec la clé |respect-blocks|, qui est de type booléen, les «rangées»
colorées alternativement peuvent s'étendre sur plusieurs rangées réelles du
tableau pour englober les blocs (créés par la commande |\Block| : cf.~p.~\pageref{Block}).
\end{itemize}
-
\medskip
\begin{scope}
\hfuzz=10cm
@@ -1965,11 +2077,6 @@
\end{NiceTabular}
\end{scope}
-
-
-
-
-
\medskip
\item L'extension \pkg{nicematrix} propose aussi une commande \Definition{\textbackslash
rowlistcolors}. Cette commande généralise la commande |\rowcolors|: au lieu de
@@ -2014,6 +2121,9 @@
tableau : cf~p.~\pageref{iRow}. Cela permet un ajustement de la gradation des
couleurs à la taille du tableau.}).
+\index{definecolorseries@\texttt{\textbackslash definecolorseries} (commande de \pkg{xcolor})}
+\index{resetcolorseries@\texttt{\textbackslash resetcolorseries} (commande de \pkg{xcolor})}
+
\smallskip
\begin{BVerbatim}[boxwidth=12cm,baseline=c]
\begin{NiceTabular}{c}
@@ -2055,6 +2165,7 @@
utilise la clé |corners| pour demander de considérer le coin \emph{north east} (NE).
\medskip
+\index{corners (clé d'un environnement)|textit}
\begin{scope}
\hfuzz=11cm
\begin{BVerbatim}[boxwidth=9cm,baseline=c]
@@ -2087,14 +2198,13 @@
\end{NiceTabular}
\end{scope}
-
-
-\medskip
+\bigskip
On remarquera que ces commandes sont compatibles avec les commandes de
\pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc). Néanmoins,
l'extension \pkg{booktabs} n'est \emph{pas} chargée par \pkg{nicematrix}.
\medskip
+\index{rotate@\texttt{\textbackslash rotate}|textit}
\begin{scope}
\hfuzz=10cm
\begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
@@ -2139,6 +2249,8 @@
\end{NiceTabular}
\end{scope}
+\index{S (les colonnes S de \pkg{siunitx})|textit}
+
\medskip
On a utilisé le type de colonne |S| de \pkg{siunitx}.
@@ -2146,6 +2258,11 @@
\subsection{Outils de coloriage avec la syntaxe de colortbl}
\label{colortbl-like}
+\index{colortbl-like}
+\index{cellcolor@\texttt{\textbackslash cellcolor}!commande en tableau}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!commande en tableau}
+\index{columncolor@\texttt{\textbackslash columncolor}!commande dans le
+ préambule d'un environnement}
On peut accéder aux outils de coloriage précédents avec une syntaxe proche de
celle proposée par \pkg{colortbl} (même si \pkg{colortbl} n'est pas chargé). On
@@ -2202,7 +2319,12 @@
\section{La commande \textbackslash RowStyle}
\label{RowStyle}
+\indexcommand{RowStyle}
+\index{cell-space-top-limit}
+\index{cell-space-bottom-limit}
+\index{cell-space-limits}
+
La commande |\RowStyle| prend en argument des instructions de mise en forme qui
seront appliquées à chacune des cases restantes sur la rangée en cours.
@@ -2210,7 +2332,8 @@
Elle prend aussi en premier argument optionnel, entre crochets, une liste de
couples \textsl{clé=valeur}.
\begin{itemize}
-\item La clé |nb-rows| indique le nombre de rangées consécutives concernées par
+\item \index{nb-rows (clé de \texttt{\textbackslash RowStyle})}
+La clé |nb-rows| indique le nombre de rangées consécutives concernées par
les spécifications de cette commande (une valeur |*| signifie que toutes les
rangées restantes seront concernées).
\item Les clés |cell-space-top-limit|, |cell-space-bottom-limit|
@@ -2217,13 +2340,17 @@
et |cell-space-limits| sont disponibles avec le même effet que les clés globales
de même nom (cf. p.~\pageref{cell-space}).
-\item La clé |rowcolor| fixe la couleur de fond et la clé |color| fixe la
+\item
+\index{rowcolor (clé de \texttt{\textbackslash RowStyle})}
+\index{color!clé de \texttt{\textbackslash RowStyle}}
+La clé |rowcolor| fixe la couleur de fond et la clé |color| fixe la
couleur du texte.\footnote{La clé |color| utilise la commande |\color| mais
insère aussi une instruction |\leavevmode| devant. Cela évite un espace
vertical parasite dans les cases qui correspondent à des colonnes de type
|p|, |b|, |m|, |X| et |V| (qui débutent en mode vertical).}
-\item La clé |bold| impose des caractères gras aux éléments de la rangée, qu'ils
+\item \index{bold (clé de \texttt{\textbackslash RowStyle})}
+La clé |bold| impose des caractères gras aux éléments de la rangée, qu'ils
soient en mode texte ou bien en mode mathématique.
\end{itemize}
@@ -2238,6 +2365,7 @@
I & II & III & IV
\end{NiceTabular}
\end{BVerbatim}
+\index{rotate@\texttt{\textbackslash rotate}|textit}
\begin{NiceTabular}{cccc}
\hline
\RowStyle[cell-space-limits=3pt]{\rotate}
@@ -2253,6 +2381,7 @@
\section{La largeur des colonnes}
\label{width}
+\index{Largeur@\textbf{Largeur des colonnes}|(}
\subsection{Techniques de base}
@@ -2276,6 +2405,7 @@
\medskip
+\index{columns-width}
Dans les environnements de \pkg{nicematrix}, il est aussi possible de fixer la
largeur \emph{minimale} de toutes les colonnes (à l'exception des éventuelles
colonnes extérieures: cf. p.~\pageref{exterior}) directement avec l'option
@@ -2353,6 +2483,8 @@
\medskip
+\index{NiceMatrixBlock@\texttt{\{NiceMatrixBlock\}}}
+\index{auto-columns-width!(clé de \texttt{\{NiceMatrixBlock\}})}
Mais il est aussi possible de fixer une zone dans laquelle toutes les matrices
auront leurs colonnes de la même largeur, égale à la largeur de la case la plus
large de toutes les matrices de la zone. Cette construction utilise
@@ -2390,8 +2522,11 @@
\subsection{Les colonnes X}
-
\label{colonne-X}
+\index{tabularx@\pkg{tabularx} (extension)}
+\index{NiceTabularX@\texttt{\{NiceTabularX\}}}
+\index{X (les colonnes X)}
+\index{width!clé de \texttt{\{NiceTabular\}}}
L'environnement |{NiceTabular}| propose aussi des colonnes |X| similaires à
celles proposées par l'environnement |{tabularx}| de l'extension éponyme.
@@ -2447,6 +2582,8 @@
\subsection{Les colonnes V de varwidth}
\label{varwidth}
+\index{varwidth@\pkg{varwidth} (extension)}
+\index{V (les colonnes V de \pkg{varwidth})}
Rappelons d'abord le fonctionnement d'un environnement |{varwidth}| de
l'extension éponyme \pkg{varwidth}. Un tel environnement est similaire à
@@ -2537,9 +2674,16 @@
version 0.92). Par exemple, avec LuaLaTeX, elle ne fonctionne pas si le contenu
commence par une instruction |\color|.
+\index{Largeur@\textbf{Largeur des colonnes}|)}
\medskip
\section{Les rangées et colonnes extérieures}
+
+\index{first-row}
+\index{last-row}
+\index{first-col}
+\index{last-col}
+
Les environnements de \pkg{nicematrix} permettent de composer des rangées et des
colonnes «extérieures» grâce aux options |first-row|, |last-row|, |first-col| et
|last-col|. C'est particulièrement intéressant pour les matrices (mathématiques).
@@ -2611,9 +2755,11 @@
\end{itemize}
-
-
\medskip
+\index{code-for-first-row}
+\index{code-for-first-col}
+\index{code-for-last-row}
+\index{code-for-last-col}
On peut contrôler l'apparence de ces rangées et colonnes avec les options
|code-for-first-row|, |code-for-last-row|, |code-for-first-col| et
|code-for-last-col|. Ces options sont des listes de tokens qui seront insérées
@@ -2678,9 +2824,19 @@
+
\section{Les lignes en pointillés continues}
\label{Cdots}
+\index{Pointillés@\textbf{Pointillés (lignes en ---)}|(}
+\index{Lignes en pointillés|see{Pointillés}}
+\indexcommand{Ldots}
+\indexcommand{Cdots}
+\index{Ddots@\texttt{\textbackslash Ddots}|textbf}
+\index{Iddots@\texttt{\textbackslash Iddots}|textbf}
+\indexcommand{Vdots}
+\index{mathdots@\pkg{mathdots} (extension)}
+\index{xdots (et ses sous-clés)}
À l'intérieur des environnements de l'extension \pkg{nicematrix}, de nouvelles
commandes sont définies : |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots| et |\Iddots|.
@@ -2796,6 +2952,7 @@
|{NiceArray}| (ou une de ses variantes) avec une colonne de type~|w| ou |W|:
cf. p.~\pageref{width}}
+\indexcommand{Hspace}
Toutefois, une commande~|\hspace*| pourrait interférer dans la construction des
lignes en pointillés. C'est pourquoi l'extension \pkg{nicematrix} fournit une
commande~|\Hspace| qui est une variante de |\hspace| transparente pour la
@@ -2817,6 +2974,8 @@
\subsection{L'option nullify-dots}
+\index{nullify-dots}
+
Considérons la matrice suivante qui a été composée classiquement avec
l'environnement |{pmatrix}| de \pkg{amsmath}.\par\nobreak
@@ -2891,6 +3050,9 @@
\subsection{Les commandes \textbackslash Hdotsfor et \textbackslash Vdotsfor}
+\indexcommand{Hdotsfor}
+\indexcommand{Vdotsfor}
+
Certaines personnes utilisent habituellement la commande |\hdotsfor| de
l'extension \pkg{amsmath} pour tracer des lignes en pointillés horizontales dans
une matrice. Dans les environnements de \pkg{nicematrix}, il convient d'utiliser
@@ -2985,6 +3147,9 @@
\subsection{Comment créer les lignes en pointillés de manière transparente}
+\index{renew-matrix}
+\index{renew-dots}
+
Si on a un document déjà tapé qui contient un grand nombre de matrices avec des
points de suspension, on peut souhaiter utiliser les lignes pointillées de
\pkg{nicematrix} sans avoir à modifier chaque matrice. Pour cela,
@@ -3061,8 +3226,15 @@
\subsection{Personnalisation des lignes en pointillés}
+\label{customization}
+\index{color!clé pour les lignes pointillées}
+\index{radius (clé pour les lignes pointillées)}
+\index{inter (clé pour les lignes pointillées)}
+\index{line-style (clé pour les lignes pointillées)}
+\index{shorten (clé pour les lignes pointillées)}
+\index{shorten-end (clé pour les lignes pointillées)}
+\index{shorten-start (clé pour les lignes pointillées)}
-\label{customization}
Les lignes pointillées tracées par |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|,
|\Iddots|, |\Hdotsfor| et |\Vdotsfor| (ainsi que par la commande |\line| dans le
|\CodeAfter| décrite p.~\pageref{line-in-code-after}) peuvent être paramétrées
@@ -3217,8 +3389,12 @@
0 & \Cdots& 0 & 0
\end{bNiceMatrix}$
+\index{Pointillés@\textbf{Pointillés (lignes en ---)}|)}
+
\section{Délimiteurs dans le préambule de l'environnement}
+\index{blkarray@\pkg{blkarray} (extension)}
+
\colorbox{yellow!50}{\textbf{Modifié 6.16}}\enskip Pour les environnements à
préambule (|{NiceArray}|, |{pNiceArray}|, etc.), il est possible de placer des
délimiteurs verticaux directement dans le préambule.\footnote{Cette syntaxe est
@@ -3226,6 +3402,10 @@
\label{delimiters-in-preamble}%
\smallskip
+\index{left@\texttt{\textbackslash left} : utilisé par \pkg{nicematrix}\newline pour des
+ délimiteurs\newline dans les préambules}
+\index{right@\texttt{\textbackslash right} : utilisé par \pkg{nicematrix}\newline pour des
+ délimiteurs\newline dans les préambules}
Les délimiteurs ouvrants doivent être précédés du mot-clé |\left| et les
délimiteurs fermants du mot-clé |\right|. Les mots-clés |\left| et |\right| n'ont
pas d'obligation à être utilisés par paires.
@@ -3293,6 +3473,9 @@
\section{Le \textbackslash CodeAfter}
+\index{CodeAfter@\texttt{\textbackslash CodeAfter}|(}
+\index{code-after}
+
\label{code-after}
On a présenté p.~\pageref{code-before} la clé |code-before|. Il existe en fait
une clé similaire |code-after| qui peut être utilisée pour indiquer du code qui
@@ -3299,6 +3482,7 @@
sera exécuté \emph{après} la construction du tableau.
\medskip
+\index{sub-matrix (clé de \texttt{\textbackslash CodeAfter}, avec sous-clés)}
Pour améliorer la lisibilité du code, une syntaxe alternative est proposée : on
peut spécifier les instructions du |code-after| à la fin de l'environnement,
après le mot-clé |\CodeAfter|. Bien que ce soit un mot-clé, |\CodeAfter| accepte
@@ -3322,6 +3506,7 @@
\subsection{La commande \textbackslash line dans le \textbackslash CodeAfter}
\label{line-in-code-after}
+\index{line@\texttt{\textbackslash line} (commande du \texttt{\textbackslash CodeAfter})}
La commande |\line| permet de tracer directement des lignes en pointillés entre
les cases. Elle prend deux arguments correspondant aux cases ou blocs à relier.
Chacun de ces deux arguments peut être :
@@ -3389,6 +3574,9 @@
CodeAfter (et le \textbackslash CodeBefore)}
\label{sub-matrix}
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})|textbf}
La commande |\SubMatrix| permet de positionner des délimiteurs sur une partie du
tableau, partie qui est considérée comme une sous-matrice. La commande
@@ -3496,25 +3684,36 @@
Les clés disponibles pour la commande |\SubMatrix| sont les suivantes :
%
\begin{itemize}
-\item \Definition{left-xshift} et \Definition{right-xshift} déplacent
+\item
+\index{left-xshift (clé de \texttt{\textbackslash SubMatrix})}
+\index{right-xshift (clé de \texttt{\textbackslash SubMatrix})}
+\index{xshift (clé de \texttt{\textbackslash SubMatrix})}
+\Definition{left-xshift} et \Definition{right-xshift} déplacent
horizontalement les délimiteurs (il existe aussi la clé \Definition{xshift} qui
permet de régler simultanément ces deux clés) ;
-\item \Definition{extra-height} ajoute une quantité à la hauteur totale des
+\item \index{extra-height (clé de \texttt{\textbackslash SubMatrix})}
+\Definition{extra-height} ajoute une quantité à la hauteur totale des
délimiteurs (hauteur~|\ht| + profondeur |\dp|) ;
-\item \Definition{delimiters/color} permet de fixer la couleur des délimiteurs (cette clé
+\item \index{delimiters!---/color pour \texttt{\textbackslash SubMatrix}}
+\Definition{delimiters/color} permet de fixer la couleur des délimiteurs (cette clé
est également disponible dans |\NiceMatrixOptions| et au niveau des
environnements à délimiteurs ou comme option de |\CodeAfter|) ;
-\item \Definition{slim} qui est une clé booléenne : lorsqu'elle est utilisée la position
+\item \index{slim (clé de \texttt{\textbackslash SubMatrix})}
+\Definition{slim} qui est une clé booléenne : lorsqu'elle est utilisée la position
horizontale des délimiteurs est calculée uniquement sur le contenu des cases
de la sous-matrice alors, que, dans le cas général, elle est calculée sur le
contenu des cases des colonnes mises en jeu (voir exemple ci-dessous) ;
-\item \Definition{vlines} contient une liste de numéros de filets verticaux à tracer dans
+\item \index{vlines!clé de \texttt{\textbackslash SubMatrix}}
+\Definition{vlines} contient une liste de numéros de filets verticaux à tracer dans
la sous-matrice (si cette clé est utilisée sans valeur, tous les filets
verticaux sont tracés) ;
-\item \Definition{hlines} est similaire à |vlines| mais pour les filets horizontaux ;
-\item \Definition{hvlines}, qui s'utilise sans valeur, trace tous les filets dans la
+\item \index{hlines!clé de \texttt{\textbackslash SubMatrix}}
+\Definition{hlines} est similaire à |vlines| mais pour les filets horizontaux ;
+\item \index{hvlines!clé de \texttt{\textbackslash SubMatrix}}
+\Definition{hvlines}, qui s'utilise sans valeur, trace tous les filets dans la
sous-matrice ;
-\item \Definition{code} permet d'insérer du code, en particulier du code TikZ, après la
+\item \index{code (clé de \texttt{\textbackslash SubMatrix})}
+\Definition{code} permet d'insérer du code, en particulier du code TikZ, après la
construction de la matrice. Cette clé est décrite en détail plus loin.
\end{itemize}
On remarquera que tous les filets sont dessinés après la construction du tableau
@@ -3633,13 +3832,13 @@
\vspace{1cm}
-\colorbox{yellow!50}{\textbf{Nouveau 6.16}}\enskip La clé |code| de la commande
-|\SubMatrix| permet d'insérer du code après la création de la matrice. Elle a
-surtout pour vocation d'être utilisée pour insérer des instructions TikZ,
-sachant que, dans les instructions TikZ insérées dans cette clé, les nœuds de la
-forme |i-j| et \verb+i-|j+ sont interprétés avec |i| et |j| étant des numéros de
-ligne et colonne \emph{relatifs à la sous-matrice}.\footnote{Attention : la
- syntaxe \texttt{j\string|-i} n'est autorisée.}
+La clé |code| de la commande |\SubMatrix| permet d'insérer du code après la
+création de la matrice. Elle a surtout pour vocation d'être utilisée pour
+insérer des instructions TikZ, sachant que, dans les instructions TikZ insérées
+dans cette clé, les nœuds de la forme |i-j| et \verb+i-|j+ sont interprétés avec
+|i| et |j| étant des numéros de ligne et colonne \emph{relatifs à la
+ sous-matrice}.\footnote{Attention : la syntaxe \texttt{j\string|-i} n'est
+ \emph{pas} autorisée.}
\medskip
\begin{scope}
@@ -3683,6 +3882,14 @@
\subsection{Les commandes \textbackslash OverBrace et \textbackslash
UnderBrace dans le \textbackslash CodeAfter}
+\index{UncerBrace@\texttt{\textbackslash UnderBrace} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})}
+\index{OverBrace@\texttt{\textbackslash OverBrace} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})}
+
+
Les commandes |\OverBrace| and |\UnderBrace| permettent de placer des accolades
horizontales sur une partie du tableau. Ces commandes prennent trois arguments :
\begin{itemize}
@@ -3716,6 +3923,18 @@
\end{pNiceMatrix}$
\bigskip
+Attention : Aucun espace vertical n'est réservé par \pkg{nicematrix} pour ces
+accolades.\footnote{Voir à ce sujet: \url{https://tex.stackexchange.com/questions/685755}}
+
+\bigskip
+\index{color!clé de \texttt{\textbackslash OverBrace} et \texttt{\textbackslash
+ UnderBrace}}
+\index{yshift (clé de \texttt{\textbackslash OverBrace} et \texttt{\textbackslash
+ UnderBrace})}
+\index{left-shorten (clé de \texttt{\textbackslash OverBrace} et\newline \texttt{\textbackslash
+ UnderBrace})}
+\index{right-shorten (clé de \texttt{\textbackslash OverBrace} et\newline \texttt{\textbackslash
+ UnderBrace})}
Les commandes |\OverBrace| et |\UnderBrace| acceptent en fait un premier
argument optionnel (entre crochets) pour une liste de couples
\textsl{clé=valeur}. Les clés disponibles sont les suivantes :
@@ -3751,6 +3970,7 @@
\OverBrace[shorten,yshift=3pt]{1-4}{2-6}{B}
\end{pNiceMatrix}$
+\index{CodeAfter@\texttt{\textbackslash CodeAfter}|)}
\section{Les légendes et les notes dans les tableaux}
@@ -3758,6 +3978,15 @@
\subsection{La légendes des tableaux}
+\label{s:caption}
+
+\index{caption (clé de \texttt{\{NiceTabular\}})}
+\index{short-caption}
+\index{label (clé de \texttt{\{NiceTabular\}})}
+\index{caption-above}
+\index{Legende@\textbf{Légende des tableaux}}
+
+
L'environnement |{NiceTabular}| propose des clés |caption|, |short-caption| et
|label| à utiliser lorsque le tableau est inséré dans un environnment flottant
(typiquement un environnement |{table}|).
@@ -3766,8 +3995,9 @@
L'intérêt d'utiliser cette clé |caption| plutôt que la commande classique
|\caption| est que la légende, si elle est longue, est justifiée à la largeur du
tableau (hors éventuelles colonnes extérieures spécifiées par |first-col| et
-|last-col|). Il n'y a pas besoin d'avoir recours à l'extension
-\pkg{threeparttable} ou l'extension \pkg{floatrow}.
+|last-col| : cf.~\ref{exterior}, p.~\pageref{exterior}). Il n'y a pas besoin
+d'avoir recours à l'extension \pkg{threeparttable} ou l'extension
+\pkg{floatrow}.
\smallskip
Par défaut, la légende est placée au-dessous du tableau. Pour avoir la légende
@@ -3779,11 +4009,19 @@
classique |\caption| et la clé |label| correspond bien sûr à la commande |\label|.
\smallskip
-Voir table \ref{t:tabularnote}, p.~\pageref{t:tabularnote} un exemple
+Voir table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}, un exemple
d'utilisation des clés |caption| et |label|.
+\smallskip
+Ces fonctionnalités sont compatibles avec l'extension \pkg{caption}.
+
\subsection{Les notes de pied de page}
+\index{footnote@\pkg{footnote} (extension)}
+\index{footnote (clé)}
+\index{footnotehyper@\pkg{footnotehyper} (extension)}
+\index{footnotehyper (clé)}
+
\smallskip
L'extension \pkg{nicematrix} permet, en utilisant \pkg{footnote} ou bien
\pkg{footnotehyper}, d'extraire les notes insérées avec |\footnote| dans un
@@ -3812,16 +4050,21 @@
\subsection{Les notes de tableaux}
+\index{nota@\textbf{Notes dans les tableaux}|(}
+
\label{tabularnote}
+\index{tabularnote@\texttt{\textbackslash tabularnote}}
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 spécifiées par |first-col| et |last-col|). Sans surprise, cette
-commande n'est disponible que dans |{NiceTabular}|, |{NiceTabular*}| and
-|{NiceTabularX}|.
+extérieures spécifiées par |first-col| et |last-col|: cf.~\ref{exterior},
+p.~\pageref{exterior}). Sans surprise, cette commande n'est disponible que dans
+|{NiceTabular}|, |{NiceTabular*}| et |{NiceTabularX}|.
+
+\index{enumitem@\pkg{enumitem} (extension requise pour utiliser\newline \texttt{\textbackslash tabularnote})}
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
fin de tableau selon un type de liste défini par l'extension \pkg{enumitem}.
@@ -3883,9 +4126,13 @@
\item Si la clé |notes/para| est utilisée, les notes sont composées à la fin du
tableau en un seul paragraphe.
-\item Il existe une clé |tabularnote| qui permet d'insérer du texte dans la zone
+\item \index{tabularnote (clé de \texttt{\{NiceTabular\}})}
+Il existe une clé |tabularnote| qui permet d'insérer du texte dans la zone
des notes avant les notes numérotées.
+\index{tabularnote@\texttt{\{TabularNote\}}}
+\index{notes (clé pour paramétrer les notes de\newline tableau)}
+
Une syntaxe alternative est proposée : il est possible d'utiliser
l'environnement |{TabularNote}| à la fin de l'environnement |{NiceTabular}|
(mais \emph{avant} l'éventuel |\CodeAfter|).
@@ -3903,6 +4150,12 @@
\item Il est possible de référencer une note de tableau (avec la commande
|\label| placée après le |\tabularnote|).
+
+\item \colorbox{yellow!50}{\textbf{Nouveau 6.19}} La commande |\tabularnote|
+admet un argument optionnel (entre crochets) qui permet de changer le symbole de
+l'appel de note.
+
+\emph{Exemple} : |\tabularnote[$\star$]{Une note...}|.
\end{itemize}
%
Voir sur la table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}, certaines de ces
@@ -3917,8 +4170,8 @@
\NiceMatrixOptions{caption-above}
\begin{NiceTabular}{@{}llc@{}}%
[
- caption = Un tableau dont la légende a été rentrée avec la clé \texttt{caption}
- ~emphase#\tabularnote{On peut mettre une note dans la légende.}! ,
+ caption = Un tableau dont la légende a été rentrée avec la clé \texttt{caption}%
+ ~emphase#\tabularnote[$\star$]{On peut mettre une note dans la légende.}! ,
label = t:tabularnote ,
tabularnote = Un peu de texte avant les notes. ,
notes/bottomrule
@@ -3944,8 +4197,8 @@
\NiceMatrixOptions{caption-above}
\begin{NiceTabular}{@{}llc@{}}%
[
- caption = Un tableau dont la légende a été rentrée avec la clé \texttt{caption}
- \tabularnote{On peut mettre une note dans la légende.} ,
+ caption = Un tableau dont la légende a été rentrée avec la clé \texttt{caption}%
+ \tabularnote[$\star$]{On peut mettre une note dans la légende.} ,
label = t:tabularnote,
tabularnote = Un peu de texte avant les notes. ,
notes/bottomrule
@@ -3967,10 +4220,19 @@
-
\subsection{Personnalisation des notes de tableau}
+\index{para (sous-clé de «notes»)}
+\index{bottomrule (sous-clé de «notes»)}
+\index{style (sous-clé de «notes»)}
+\index{label-in-tabular (sous-clé de «notes»)}
+\index{label-in-list (sous-clé de «notes»)}
+\index{enumitem-keys (sous-clé de «notes»)}
+\index{enumitem-keys-para (sous-clé de «notes»)}
+\index{code-before!sous-clé de «notes»}
+\index{detect-duplicates (sous-clé de «notes»)}
+
Les notes de tableau peuvent être personnalisées grâce à un ensemble de clés
disponibles dans |\NiceMatrixOptions|. Ces clés ont un nom préfixé par |notes| :
\begin{itemize}
@@ -3984,7 +4246,7 @@
\item |notes/code-before|
\item |notes/detect-duplicates|
\end{itemize}
-Pour la commmodité, il est aussi possible de fixer ces clés dans
+Pour la commodité, il est aussi possible de fixer ces clés dans
|\NiceMatrixOptions| via une clé |notes| qui prend en argument une liste de
paires \textsl{clé=valeur} où le nom des clés n'a plus à être préfixé par
|notes|:
@@ -4121,6 +4383,7 @@
Valeur initiale : |true|
\end{itemize}
+\index{nota@\textbf{Notes dans les tableaux}|)}
\medskip
@@ -4129,6 +4392,7 @@
\subsection{Utilisation de \{NiceTabular\} avec threeparttable}
+\index{threeparttable@\pkg{threeparttable} (extension)}
Si vous souhaitez utiliser les environnements |{NiceTabular}|, |{NiceTabular*}|
ou |{NiceTabularX}| dans un environnement |{threeparttable}| de l'extension
@@ -4141,8 +4405,9 @@
\makeatother
\end{Verbatim}
-Néanmoins, les fonctionnalités proposées par \pkg{nicematrix} rendent peu
-utile l'utilisation de \pkg{threeparttable} en conjonction avec \pkg{nicematrix}.
+Néanmoins, les fonctionnalités proposées par \pkg{nicematrix} rendent peu utile
+l'utilisation de \pkg{threeparttable} en conjonction avec \pkg{nicematrix} (voir
+la clé |caption| à la partie \ref{s:caption}, p.~\pageref{s:caption}).
\section{Autres fonctionnalités}
@@ -4150,6 +4415,8 @@
\subsection{La clé rounded-corners de \{NiceTabular\}}
\label{tabular-rounded-corners}
+\index{rounded-corners!clé de \texttt{\{NiceTabular\}}}
+\index{Coins arrondis!pour un tableau}
\colorbox{yellow!50}{\textbf{Nouveau 6.18}}\par\nobreak
@@ -4198,6 +4465,9 @@
\subsection{Commande \textbackslash ShowCellNames}
+\index{ShowCellNames@\texttt{\textbackslash ShowCellNames} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})}
La commande |\ShowCellNames|, utilisable dans le |\CodeBefore| et le
|\CodeAfter| affiche le nom (sous la forme $i$-$j$) de chaque case. Quand elle
@@ -4225,6 +4495,10 @@
\subsection{Utilisation du type de colonne S de siunitx}
+
+\index{S (les colonnes S de \pkg{siunitx})}
+\index{siunitx@\pkg{siunitx} (extension)}
+
Si l'extension \pkg{siunitx} est chargée (avant ou après \pkg{nicematrix}), il est possible d'utiliser les colonnes
de type |S| de \pkg{siunitx} dans les environnements de \pkg{nicematrix}. L'implémentation n'utilise explicitement
aucune macro privée de \pkg{siunitx}.
@@ -4256,6 +4530,7 @@
\subsection{Type de colonne par défaut dans \{NiceMatrix\}}
\label{columns-type}
+\index{columns-type (clé de \texttt{\{NiceMatrix\}}, etc.)}
Les environnements sans préambule (|{NiceMatrix}|, |{pNiceMatrix}|, etc.) ainsi
que la commande |\pAutoNiceMatrix| et ses variantes, acceptent la clé
@@ -4285,6 +4560,7 @@
\subsection{La commande \textbackslash rotate}
\label{rotate}
+\index{rotate@\texttt{\textbackslash rotate}}
Utilisée au début d'une case, la commande |\rotate| (fournie par \pkg{nicematrix}) compose le contenu après une
rotation de 90° dans le sens direct.
@@ -4318,6 +4594,12 @@
\end{varwidth}
\medskip
+\index{first-row|textit}
+\index{last-row|textit}
+\index{code-for-first-row|textit}
+\index{code-for-last-row|textit}
+\index{last-col|textit}
+\index{code-for-last-col|textit}
Si la commande |\rotate| est utilisée dans la «dernière rangée» (extérieure à la
matrice), les éléments qui subissent cette rotation sont alignés vers le haut.
@@ -4349,7 +4631,10 @@
\subsection{L'option small}
\label{small}
+\index{small (clé pour un environnement)}
+\index{smallmatrix@\texttt{\{smallmatrix\}} (envionnement de \pkg{amsmath})}
+
Avec l'option |small|, les environnements de l'extension \pkg{nicematrix} sont
composés d'une manière proche de ce que propose l'environnement |{smallmatrix}|
de l'\pkg{amsmath} (et les environnements |{psmallmatrix}|, |{bsmallmatrix}|,
@@ -4401,6 +4686,8 @@
\subsection{Les compteurs iRow et jCol}
\label{iRow}
+\index{iRow (compteur LaTeX)}
+\index{jCol (compteur LaTeX)}
Dans les cases du tableau, il est possible d'utiliser les compteurs LaTeX |iRow|
et |jCol| qui représentent le numéro de la rangée courante et le numéro de la
@@ -4444,6 +4731,12 @@
\medskip
+\indexcommand{AutoNiceMatrix}
+\indexcommand{pAutoNiceMatrix}
+\indexcommand{bAutoNiceMatrix}
+\indexcommand{vAutoNiceMatrix}
+\indexcommand{VAutoNiceMatrix}
+\indexcommand{BAutoNiceMatrix}
L'extension \pkg{nicematrix} propose aussi des commandes pour composer
automatiquement des matrices à partir d'un motif général. Ces commandes sont
nommées |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|,
@@ -4460,16 +4753,12 @@
$C = ~emphase#\pAutoNiceMatrix@{3-3}{C_{\arabic{iRow},\arabic{jCol}}}$
\end{Verbatim}
-
-
-
\[C = \pAutoNiceMatrix{3-3}{C_{\arabic{iRow},\arabic{jCol}}}\]
-
-
\subsection{L'option light-syntax}
\label{light-syntax}
+\index{light-syntax}
L'option |light-syntax| (inspirée de l'extension \pkg{spalign}) permet d'alléger
la saisie des matrices, ainsi que leur lisibilité dans le source TeX. Lorsque
@@ -4498,6 +4787,7 @@
\end{bNiceMatrix}$
\medskip
+\index{end-of-row (à utiliser avec light-syntax)}
On peut changer le caractère utilisé pour indiquer les fins de rangées avec
l'option |end-of-row|. Comme dit précédemment, la valeur initiale de ce
paramètre est un point-virgule.
@@ -4514,6 +4804,10 @@
\subsection{Couleur des délimiteurs}
+\index{delimiters!---/color pour un environnement}
+\index{color!pour les délimiteurs de matrices}
+\index{Couleur!des délimiteurs de matrices}
+
Pour les environnements avec délimiteurs (|{pNiceArray}|, |{pNiceMatrix}|,
etc.), il est possible de changer la couleur des délimiteurs avec la clé
|delimiters/color|.
@@ -4532,7 +4826,8 @@
\medskip
Cette couleur s'applique aussi aux délimiteurs tracés par |\SubMatrix|
-(cf.~p.~\pageref{sub-matrix}).
+(cf.~p.~\pageref{sub-matrix}) et aux délimiteurs spécifiés directement dans le
+préambule des environnements à préambule (cf.~p.~\pageref{delimiters-in-preamble}).
\subsection{L'environnement \{NiceArrayWithDelims\}}
@@ -4539,6 +4834,8 @@
\label{NiceArrayWithDelims}
+\index{NiceArrayWithDelims@\texttt{\{NiceArrayWithDelims\}}}
+
En fait, l'environnement |{pNiceArray}| et ses variantes sont fondés sur un
environnement plus général, appelé |{NiceArrayWithDelims}|. Les deux premiers
arguments obligatoires de cet environnement sont les délimiteurs gauche et droit
@@ -4566,6 +4863,8 @@
\subsection{La commande \textbackslash OnlyMainNiceMatrix}
+\indexcommand{OnlyMainNiceMatrix}
+
La commande |\OnlyMainNiceMatrix| n'exécute son argument que si on se trouve
dans le tableau principal, c'est-à-dire que l'on n'est pas dans les rangées
extérieures. Si elle est utilisée hors d'un environnement de \pkg{nicematrix},
@@ -4577,8 +4876,9 @@
\section{Utilisation de TikZ avec nicematrix}
\label{name}\label{PGF-nodes}
+\index{tikza at TikZ (utilisation avec \pkg{nicematrix})}
+\index{noeud@\textbf{Nœuds PGF/Tikz}|(}
-
\subsection{Les nœuds correspondant aux contenus des cases}
L'extension \pkg{nicematrix} crée un nœud PGF-TikZ\footnote{On rappelle que TikZ
@@ -4609,11 +4909,13 @@
de la colonne~$j$ a pour nom |nm-|$n$|-|$i$|-|$j$.
\smallskip
+\indexcommand{NiceMatrixLastEnv}
La commande |\NiceMatrixLastEnv| donne le numéro du dernier de ces
environnements (pour LaTeX, il s'agit d'une commande — complètement développable
— et non d'un compteur).
\smallskip
+\index{name!clé pour un environnement}
Il est néanmoins recommandé de passer plutôt par la clé |name|. Celle-ci permet
de donner un nom à l'environnement. Une fois l'environnement nommé, les nœuds
sont accessibles à travers les noms «\textsl{nom}-$i$-$j$» où \textsl{nom} est
@@ -4723,6 +5025,8 @@
\subsubsection{La clé pgf-node-code}
+\index{pgf-node-code}
+
\colorbox{yellow!50}{\textbf{Nouveau 6.17}}\enskip \textbf{Pour les utilisateurs
expérimentés}, \pkg{nicematrix} fournit la clé |pgf-node-code| qui correspond à
du code PGF qui sera exécuté à la création, par PGF, des nœuds correspondants aux
@@ -4734,6 +5038,9 @@
\subsubsection{Les colonnes V de varwidth}
\label{node-V}
+\index{V (les colonnes V de \pkg{varwidth})}
+\index{varwidth@\pkg{varwidth} (extension)}
+
Quand l'extension \pkg{varwidth} est chargée, les colonnes de type |V| définies
par \pkg{varwidth} sont prises en charge par \pkg{nicematrix}. Il peut être
intéressant de préciser que, pour une case située dans une colonne de type
@@ -4770,6 +5077,9 @@
\subsection{Les «nœuds moyens» et les «nœuds larges»}
+\index{create-medium-nodes}
+\index{create-large-nodes}
+\index{create-extra-nodes}
En fait, l'extension \pkg{nicematrix} peut créer deux séries de nœuds
supplémentaires (\emph{extra nodes} en anglais) : les «nœuds moyens»
@@ -4840,6 +5150,8 @@
\medskip
+\index{left-margin}
+\index{right-margin}
Les «nœuds larges» de la première colonne et de la dernière colonne peuvent
apparaître trop petits pour certains usages. C'est pourquoi il est possible
d'utiliser les options |left-margin| et |right-margin| pour ajouter de l'espace
@@ -4872,6 +5184,8 @@
\end{pNiceMatrix}\]
\medskip
+\index{extra-left-margin}
+\index{extra-right-margin}
Il est aussi possible d'ajouter de l'espace sur les côtés du tableau avec les
options |extra-left-margin| et |extra-right-margin|. Ces marges ne sont pas
incorporées dans les «nœuds larges». Dans l'exemple suivant, nous avons utilisé
@@ -4978,6 +5292,8 @@
Les nœuds que l'on vient de décrire ne sont pas accessibles par défaut dans le
|\CodeBefore| (décrit p.~\pageref{code-before}). \par\nobreak
+
+\index{create-cell-nodes (clé de \texttt{\textbackslash CodeBefore})}
On peut rendre ces nœuds accessibles dans le |\CodeBefore| en utilisant la clé
|create-cell-nodes| du mot-clé |\CodeBefore| (dans ce cas-là, les nœuds sont
créés une première fois avant la construction du tableau en utilisant des
@@ -5124,7 +5440,7 @@
\end{pNiceArray}$
-\subsection{Les nœuds correspondants aux commandes \textbackslash SubMatrix}
+\subsection{Les nœuds correspondant aux commandes \textbackslash SubMatrix}
\label{node-sub-matrix}
@@ -5131,6 +5447,12 @@
La commande |\SubMatrix| disponible dans le |\CodeAfter| a été présentée
p.~\pageref{sub-matrix}.
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})}
+\index{name!clé de \texttt{\textbackslash SubMatrix}}
+
+
\smallskip
Si une commande |\SubMatrix| est utilisée avec la clé |name| sous la forme
|name=|\textsl{\ttfamily MonNom}, trois nœuds PGF-TikZ sont créés avec les noms
@@ -5162,9 +5484,14 @@
\end{tikzpicture}
\end{pNiceMatrix}\]
+\index{noeud@\textbf{Nœuds PGF/Tikz}|)}
+
\section{API pour les développeurs}
+\indexcommand{g\_nicematrix\_code\_before\_tl}
+\indexcommand{g\_nicematrix\_code\_after\_tl}
+
L'extension \pkg{nicematrix} fournit deux variables internes mais publiques\footnote{Conformément aux conventions de LaTeX3,
toute variable dont le nom commence par |\g_nicematrix| ou |\l_nicematrix| est
publique alors que toute variable dont le nom débute par |\g__nicematrix| ou
@@ -5187,9 +5514,6 @@
compilation supplémentaire (car les instructions sont écrites dans le fichier
|aux| pour être utilisées à la compilation suivante).
-
-
-
\medskip
\emph{Exemple} : On souhaite écrire une commande |\crossbox| qui barre en croix
la case courante. Cette commande prendra en argument optionnel une liste de
@@ -5201,6 +5525,8 @@
utilise explicitement la variable publique |\g_nicematrix_code_before_tl|.
+\index{crossbox@\texttt{\textbackslash crossbox} (définie dans un exemple)|textit}
+
\begin{scope}
\fvset{commandchars=\§\¤\μ}
\begin{Verbatim}
@@ -5283,6 +5609,9 @@
\subsection{Lignes diagonales}
\label{parallelization}
+\index{parallelize-diags}
+\index{Ddots@\texttt{\textbackslash Ddots}}
+\index{Iddots@\texttt{\textbackslash Iddots}}
Par défaut, toutes les lignes diagonales\footnote{On parle des lignes créées par
|\Ddots| et non des lignes créées par une commande |\line| dans le
@@ -5295,8 +5624,6 @@
\medskip
Dans les exemples suivants, la première instruction |\Ddots| est marquée en couleur :
-
-
\medskip
\begin{scope}
\begin{minipage}{9.5cm}
@@ -5355,6 +5682,8 @@
\end{scope}
\medskip
+\index{draw-first (clé de \texttt{\textbackslash Ddots} et
+ \texttt{\textbackslash Iddots})}
On peut choisir l'instruction |\Ddots| qui sera tracée en premier (et qui
servira pour tracer les suivantes quand la parallélisation est activée) avec la
clé |draw-first| : |\Ddots[draw-first]|\rlap{.}
@@ -5407,6 +5736,8 @@
\subsection{L'option exterior-arraycolsep}
+\index{exterior-arraycolsep}
+
L'environnement |{array}| insère un espace horizontal égal à |\arraycolsep|
avant et après chaque colonne. En particulier, il y a un espace égal à
|\arraycolsep| avant et après le tableau. Cette caractéristique de
@@ -5434,6 +5765,7 @@
\subsection{Incompatibilités}
+\index{Incompatibilités}
\medskip
L'extension \pkg{nicematrix} n'est pas compatible avec la classe \cls{ieeeaccess}
@@ -5483,6 +5815,8 @@
\subsection{Utilisation de la clé «tikz» de la commande \textbackslash Block}
+\index{tikzz at tikz!clé de \texttt{\textbackslash Block}|textit}
+
\label{tikz-key-examples}
La clé |tikz| de la commande |\Block| n'est disponible que lorsque TikZ est
@@ -5529,11 +5863,18 @@
\bigskip
+
Dans l'exemple suivant, on utilise la clé |tikz| pour hachurer une ligne du
tableau. On remarquera que l'on utilise la clé |transparent| de la commande
-|\Block| pour que les filets soient tracés dans le bloc.\footnote{Par défaut, les filets ne sont pas tracés dans les blocs créés avec la commande
-\texttt{\textbackslash Block} : cf.~section~\ref{rules} p.~\pageref{rules}}
+|\Block| pour que les filets soient tracés dans le bloc.\footnote{Par défaut,
+ les filets ne sont pas tracés dans les blocs créés avec la commande
+ \texttt{\textbackslash Block} : cf.~section~\ref{rules} p.~\pageref{rules}}
+\index{transparent (clé de \texttt{\textbackslash Block})|textit}
+\index{columncolor@\texttt{\textbackslash columncolor}!commande du
+ \texttt{\textbackslash CodeBefore}|textit}
+
+
\begin{Verbatim}
\begin{NiceTabular}{ccc}[hvlines]
\CodeBefore
@@ -5560,6 +5901,7 @@
\subsection{Utilisation avec tcolorbox}
\label{tcolorbox}
+\index{tcolorbox@\pkg{tcolorbox} (extension)|textit}
Voici un exemple d'utilisation de |{NiceTabular}| dans une commande |\tcbox| de
\pkg{tcolorbox}. On a utilisé la clé |hvlines-except-borders| pour faire afficher
@@ -5602,6 +5944,11 @@
}
\end{BVerbatim}
+
+\index{hvlines-except-borders|textit}
+\index{rules (clé pour un environnement)|textit}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!commande du \texttt{\textbackslash CodeBefore}|textit}
+
\medskip
\begin{center}
\tcbset
@@ -5643,6 +5990,13 @@
\subsection{Notes dans les tableaux}
+\index{nota@\textbf{Notes dans les tableaux}|textit}
+\index{tabularnote@\texttt{\textbackslash tabularnote}|textit}
+\index{notes (clé pour paramétrer les notes de\newline tableau)|textit}
+\index{style (sous-clé de «notes»)|textit}
+\index{enumitem-keys (sous-clé de «notes»)|textit}
+\index{enumitem@\pkg{enumitem} (extension requise pour utiliser\newline \texttt{\textbackslash tabularnote})|textit}
+
\label{ex:notes}
Les outils de \pkg{nicematrix} pour les notes dans les tableaux ont été
@@ -5744,6 +6098,9 @@
\subsection{Lignes en pointillés}
+\index{Pointillés@\textbf{Pointillés (lignes en ---)}|textit}
+
+
Un exemple pour le résultant de deux polynômes :
\par\nobreak
\medskip
@@ -5760,6 +6117,9 @@
\end{vNiceArray}
\end{BVerbatim}
+
+\index{Ddots@\texttt{\textbackslash Ddots}|textit}
+
\medskip
\begin{scope}
@@ -5778,6 +6138,9 @@
\vspace{2cm}
Un exemple avec un système linéaire:
+\index{last-col|textit}
+\index{code-for-last-col|textit}
+
\begin{Verbatim}
$\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
1 & 1 & 1 &\Cdots & & 1 & 0 & \\
@@ -5808,9 +6171,8 @@
|\Ldots|, |\Cdots|, etc. On peut de ce fait tracer des lignes qui ne sont plus
pointillées.
+\index{line-style (clé pour les lignes pointillées)|textit}
-
-
\begin{Verbatim}[formatcom=\small\color{gray}]
\NiceMatrixOptions{code-for-first-row = \scriptstyle,code-for-first-col = \scriptstyle }
\setcounter{MaxMatrixCols}{12}
@@ -5832,6 +6194,8 @@
\end{pNiceMatrix}\]
\end{Verbatim}
+\index{code-for-first-row|textit}
+\index{code-for-last-col|textit}
\begin{scope}
\NiceMatrixOptions{code-for-first-row = \scriptstyle,code-for-first-col = \scriptstyle }
@@ -5893,6 +6257,8 @@
\label{tiretes}
+\index{tikzz at tikz!clé de «borders» de \texttt{\textbackslash Block}|textit}
+
Dans l'exemple suivant, on utilise des commandes |\Block| pour tracer des filets
en tiretés. Cet exemple nécessite que TikZ soit chargé (par
|\usepackage{tikz}|).
@@ -5937,6 +6303,8 @@
largeur commune à toutes les colonnes, ce que l'on fait dans l'exemple suivant
avec l'environnement |{NiceMatrixBlock}| et l'option |auto-columns-width|.
+\index{NiceMatrixBlock@\texttt{\{NiceMatrixBlock\}}|textit}
+
\begin{Verbatim}[formatcom=\small\color{gray}]
~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
\NiceMatrixOptions
@@ -5978,6 +6346,7 @@
\end{Verbatim}
\medskip
+\index{auto-columns-width!(clé de \texttt{\{NiceMatrixBlock\}})|textit}
\begin{NiceMatrixBlock}[auto-columns-width]
\NiceMatrixOptions
{
@@ -6021,6 +6390,8 @@
largeur suivant leur taille.
\medskip
+\index{max-width (sous-clé de «delimiters»)}
+\index{delimiters!---/max-width}
Pour résoudre ce problème, on peut demander que les délimiteurs soient composés
avec leur largeur maximale grâce à la clé booléenne |delimiters/max-width|.
@@ -6093,6 +6464,9 @@
Bien sûr, ce tableau ne pourra pas être coupé par un saut de page.
\medskip
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})|textit}
\begin{Verbatim}
\setlength{\extrarowheight}{1mm}
\[\begin{NiceMatrix}%
@@ -6150,6 +6524,7 @@
colonnes.
\medskip
+\index{vlines-in-sub-matrix}
En fait, on peut avec la clé |vlines-in-sub-matrix| choisir un spécificateur
dans le préambule du tableau pour indiquer des filets verticaux qui seront
tracés dans les |\SubMatrix| uniquement (en espaçant les colonnes).
@@ -6224,6 +6599,7 @@
\subsection{Comment surligner les cases d'une matrice}
\label{highlight}
+\index{draw (clé de \texttt{\textbackslash Block})|textit}
\medskip
Pour mettre en évidence une case d'une matrice, il est possible de «dessiner»
@@ -6263,6 +6639,9 @@
|colortbl-like| − même si \pkg{colortbl} n'est pas chargé).
+\index{colortbl-like|textit}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!commande en tableau|textit}
+
\begin{Verbatim}
\begin{pNiceArray}{>{\strut}cccc}[margin, extra-margin=2pt,colortbl-like]
~emphase#\rowcolor{red!15}@A_{11} & A_{12} & A_{13} & A_{14} \\
@@ -6311,6 +6690,7 @@
fit=#1}}
\medskip
+\index{highlight (style TikZ défini dans\newline un exemple)|textit}
\begin{Verbatim}
\tikzset{highlight/.style={rectangle,
fill=red!15,
@@ -6328,6 +6708,9 @@
\end{bNiceMatrix}$
\end{Verbatim}
+\index{create-cell-nodes (clé de \texttt{\textbackslash CodeBefore})|textit}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}|textit}
+
\[\begin{bNiceMatrix}
\CodeBefore [create-cell-nodes]
\tikz \node [highlight = (2-1) (2-3)] {} ;
@@ -6376,6 +6759,9 @@
Le résultat peut paraître décevant. On peut l'améliorer en utilisant les «nœuds
moyens» au lieu des «nœuds normaux».
+\index{create-medium-nodes|textit}
+\index{create-cell-nodes (clé de \texttt{\textbackslash CodeBefore})|textit}
+
\begin{Verbatim}
\[\begin{pNiceArray}{ccc}[last-col, margin = 2pt, create-medium-nodes]
\CodeBefore [create-cell-nodes]
@@ -6409,7 +6795,14 @@
\subsection{Utilisation de \textbackslash SubMatrix dans le \textbackslash CodeBefore}
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (commande du
+\texttt{\textbackslash CodeAfter}\newline et du
+\texttt{\textbackslash CodeBefore})|textit}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}|textit}
+\index{CodeAfter@\texttt{\textbackslash CodeAfter}|textit}
+\index{create-cell-nodes (clé de \texttt{\textbackslash CodeBefore})|textit}
+
\label{submatrix-in-codebefore}
Dans l'exemple suivant, on illustre le produit mathématique de deux matrices.
@@ -6493,6 +6886,11 @@
\subsection{Un tableau triangulaire}
\label{triangular}
+\index{pgf-node-code|textit}
+\index{Coins (les --- vides)|textit}
+\index{chessboardcolors@\texttt{\textbackslash chessboardcolors}!(commande
+ du \texttt{\textbackslash CodeBefore})|textit}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}|textit}
Dans l'exemple suivant, on utilise le style PGF/Tikz |nicematrix/cell-node| pour faire
tourner le contenu des cases (rotation que l'on compense ensuite en faisant
@@ -6549,14 +6947,22 @@
\end{NiceTabular}}
\end{center}
+\cleardoublepage
+\phantomsection
+\addcontentsline{toc}{section}{Index}
+\printindex
+
\section*{Autre documentation}
Le document |nicematrix.pdf| (fourni avec l'extension \pkg{nicematrix}) contient
-une traduction anglaise de la documentation ici présente, ainsi que le code
-source commenté et un historique des versions.
+une traduction anglaise de la documentation ici présente ainsi qu'un historique
+des versions.
+Le document |nicematrix-code.pdf| (fourni également avec l'extension \pkg{nicematrix}
+contient le code LaTeX commenté (à partir du fichier |nicematrix-code.dtx|).
+
\medskip
Les versions successives du fichier |nicematrix.sty| fournies par
TeXLive sont disponibles sur le serveur \textsc{svn} de TeXLive :
Modified: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf
===================================================================
(Binary files differ)
Added: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.tex 2023-05-16 20:22:30 UTC (rev 67135)
@@ -0,0 +1,7484 @@
+% -*- coding: utf-8 ; -*- This file should be compiled with XeLaTeX only
+\documentclass[dvipsnames]{article}% dvipsnames is for xcolor (loaded by Tikz, loaded by nicematrix)
+\usepackage{xltxtra}
+
+\usepackage{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+
+\usepackage{nicematrix}
+
+\usepackage{tikz}
+\usetikzlibrary{fit,patterns,arrows.meta,decorations.pathmorphing}
+
+\usepackage{enumitem}
+\usepackage{siunitx}
+\usepackage{verbatim}
+\usepackage{caption}
+\usepackage{tocloft}
+\setlength{\cftsubsecnumwidth}{3em} % for the numbers of subsections of the TOC
+
+% On utilise \MakeShortVerb de shortvrb et pas \DefineShortVerb de fancyvrb
+% car on ne veut pas que le contenu des petits éléments en verbatim soit colorié
+% en gris
+\usepackage{shortvrb}
+\MakeShortVerb{\|}
+
+\usepackage{fancyvrb}
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
+
+\usepackage{titlesec}
+\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
+\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
+
+\def\LetterAt{@}
+
+\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+
+\usepackage{footnote}
+\usepackage{booktabs}
+\usepackage{varwidth}
+\usepackage{tcolorbox}
+\usepackage{adjustbox}
+\usepackage[auto-lang=false]{lipsum}
+
+\NewDocumentEnvironment {scope} {} {} {}
+
+\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
+\NewDocumentCommand {\cls} {m} {\textsf{#1}}
+
+\setlength{\parindent}{0pt}
+\skip \footins = 2 \bigskipamount
+
+
+\NewDocumentCommand{\Definition}{m}
+ {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
+
+\usepackage{makeidx}
+\makeindex
+
+\NewDocumentCommand{\indexcommand}{m}{\index{#1@\texttt{\textbackslash #1}}}
+
+\NewDocumentCommand{\indexenv}{m}{\index{#1@\texttt{\{#1\}}}}
+
+\usepackage[hyperfootnotes = false]{hyperref}
+
+\hypersetup
+ {
+ pdfinfo =
+ {
+ Title = The package 'nicematrix' ,
+ Subject = A LaTeX package ,
+ Author = F. Pantigny
+ }
+ }
+
+
+
+\begin{document}
+
+\VerbatimFootnotes
+
+
+\title{The package \pkg{nicematrix}\thanks{This document corresponds to the version~\myfileversion\space of \pkg{nicematrix},
+at the date of~\myfiledate.}} \author{F. Pantigny \\ \texttt{fpantigny at wanadoo.fr}}
+
+
+\maketitle
+
+\begin{abstract}
+The LaTeX package \pkg{nicematrix} provides new environments similar to the
+classical environments |{tabular}|, |{array}| and |{matrix}| of \pkg{array}
+and \pkg{amsmath} but with extended features.
+\end{abstract}
+
+
+
+
+\vspace{1cm}
+\hspace{1cm}
+$\begin{bNiceArray}{cccc}[first-row,first-col,
+ code-for-first-col=\color{blue}\scriptstyle,
+ code-for-first-row=\color{blue}\scriptstyle,
+ columns-width = auto]
+ & C_1 & C_2 & \Cdots & C_n \\
+L_1 & a_{11} & a_{12} & \Cdots & a_{1n} \\
+L_2 & a_{21} & a_{22} & \Cdots & a_{2n} \\
+\Vdots & \Vdots & \Vdots & \Ddots & \Vdots\\
+L_n & a_{n1} & a_{n2} & \Cdots & a_{nn}
+\end{bNiceArray}$\hspace{2cm}
+\begin{NiceTabular}{lSSSS}[code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}]
+\toprule
+\Block{2-1}{Product} & \multicolumn{3}{c}{dimensions (cm)} & \Block{2-1}{\rotate Price} \\
+\cmidrule(rl){2-4}
+ & L & l & h \\
+\midrule
+small & 3 & 5.5 & 1 & 30 \\
+standard & 5.5 & 8 & 1.5 & 50.5 \\
+premium & 8.5 & 10.5 & 2 & 80 \\
+extra & 8.5 & 10 & 1.5 & 85.5 \\
+special & 12 & 12 & 0.5 & 70 \\
+\bottomrule
+\end{NiceTabular}
+
+\vspace{1cm}
+The package \pkg{nicematrix} is entirely contained in the file
+|nicematrix.sty|. This file may be put in the current directory or in a
+|texmf| tree. However, the best is to install \pkg{nicematrix} with a TeX
+distribution such as MiKTeX, TeX Live or MacTeX.
+
+\medskip
+\emph{Remark}\par\nobreak
+
+If you use LaTeX via Internet with, for example, Overleaf, you
+can upload the file |nicematrix.sty| in the repertory of your
+project in order to take full advantage of the latest version de
+\pkg{nicematrix}.\footnote{The latest version of the file
+|nicematrix.sty| may be downloaded from the \textsc{svn} server of
+TeXLive:\newline
+\small
+\url{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}}
+
+\medskip
+This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by
+the classical workflow |latex|-|dvips|-|ps2pdf| (or Adobe Distiller).
+\textsl{However, the file nicematrix.dtx of the present documentation should
+be compiled with XeLaTeX.}
+
+\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}
+loaded). The final user only has to load the package with
+|\usepackage{nicematrix}|.
+
+
+\medskip
+The idea of \pkg{nicematrix} is to create \textsc{pgf} nodes under the cells
+and the positions of the rules of the tabular created by \pkg{array} and to
+use these nodes to develop new features. As usual with \textsc{pgf}, the
+coordinates of these nodes are written in the |aux| to be used on the next
+compilation and that's why \pkg{nicematrix} may need \textbf{several
+compilations}.\footnote{If you use Overleaf, Overleaf will do automatically
+a sufficient number of compilations.}
+
+\medskip
+Most features of \pkg{nicematrix} may be used without explicit use of
+\textsc{pgf} or Tikz (which, in fact, is not loaded by default).
+
+\medskip
+\indexcommand{NiceMatrixOptions}
+A command |\NiceMatrixOptions| is provided to fix the options (the
+scope of the options fixed by this command is the current TeX group: they are
+semi-global).
+
+
+
+\newpage
+
+\section{The environments of this package}
+
+The package \pkg{nicematrix} defines the following new environments.
+
+\medskip
+\begin{ttfamily}
+\setlength{\tabcolsep}{3mm}
+\begin{tabular}{llll}
+\{NiceTabular\} & \{NiceArray\} & \{NiceMatrix\} \\
+\{NiceTabular*\} & \{pNiceArray\} & \{pNiceMatrix\} \\
+\{NiceTabularX\} & \{bNiceArray\} & \{bNiceMatrix\} \\
+ & \{BNiceArray\} & \{BNiceMatrix\} \\
+ & \{vNiceArray\} & \{vNiceMatrix\} \\
+ & \{VNiceArray\} & \{VNiceMatrix\}
+\end{tabular}
+\end{ttfamily}
+
+%
+\medskip
+The environments |{NiceArray}|, |{NiceTabular}| and |{NiceTabular*}| are
+similar to the environments |{array}|, |{tabular}| and |{tabular*}| of the
+package \pkg{array} (which is loaded by \pkg{nicematrix}).
+
+\medskip
+The environments |{pNiceArray}|, |{bNiceArray}|, etc. have no equivalent in
+\pkg{array}.
+
+\medskip
+The environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. are similar to the
+corresponding environments of \pkg{amsmath} (which is loaded by
+\pkg{nicematrix}): |{matrix}|, |{pmatrix}|, etc.
+
+\medskip
+The environment |{NiceTabularX}| is similar to the environment |{tabularx}|
+from the eponymous package.\footnote{In fact, it's possible to use directly the
+|X| columns in the environment |{NiceTabular}| (and the required
+width for the tabular is fixed by the key |width|): cf. p.~\pageref{X-columns}}.
+
+\medskip
+\textbf{It's recommended to use primarily the classical environments and to use the
+environments of \pkg{nicematrix} only when some feature provided by these
+environments is used (this will save memory).}
+
+\medskip
+All the environments of the package \pkg{nicematrix} accept, between square
+brackets, an optional list of \textsl{key=value} pairs. \textbf{There must be
+no space before the opening bracket (|[|) of this list of options.}
+
+
+\section{The vertical space between the rows}
+
+\label{cell-space}
+\index{cell-space-top-limit}
+\index{cell-space-bottom-limit}
+\index{cell-space-limits}
+
+
+It's well known that some rows of the arrays created by default with LaTeX
+are, by default, too close to each other. Here is a classical example.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+$\begin{pmatrix}
+\frac{1}{2} & -\frac{1}{2} \\
+\frac{1}{3} & \frac{1}{4} \\
+\end{pmatrix}$
+\end{BVerbatim}
+$\begin{pmatrix}
+\frac{1}{2} & -\frac{1}{2} \\
+\frac{1}{3} & \frac{1}{4} \\
+\end{pmatrix}$
+
+\bigskip
+Inspired by the package \pkg{cellspace} which deals with that problem, the
+package \pkg{nicematrix} provides two keys |cell-space-top-limit| and
+|cell-space-bottom-limit| similar to the parameters of \pkg{cellspace} called
+|\cellspacetoplimit| and
+|\cellspacebottomlimit|.\index{cellspace@\pkg{cellspace} (package)}
+
+There is also a key |cell-space-limits| to set both parameters at once.
+
+The initial value of these parameters is $0$~pt in order to have for the
+environments of \pkg{nicematrix} the same behaviour as those of \pkg{array}
+and \pkg{amsmath}. However, a value of $1$~pt would probably be a good choice
+and we suggest to set them with |\NiceMatrixOptions|.\footnote{One should
+remark that these parameters apply also to the columns of type |S| of
+\pkg{siunitx} whereas the package \pkg{cellspace} is not able to act on such
+columns of type~|S|.}
+
+\medskip
+\begin{Verbatim}
+\NiceMatrixOptions{~emphase#cell-space-limits = 1pt@}
+\end{Verbatim}
+
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+$\begin{pNiceMatrix}
+\frac12 & -\frac12 \\
+\frac13 & \frac14 \\
+\end{pNiceMatrix}$
+\end{BVerbatim}
+\begin{scope}
+\NiceMatrixOptions{cell-space-limits = 1pt}
+$\begin{pNiceMatrix}
+\frac12 & -\frac12 \\
+\frac13 & \frac14 \\
+\end{pNiceMatrix}$
+\end{scope}
+
+
+
+
+
+\bigskip
+\section{The vertical position of the arrays}
+
+\index{baseline (key for an environment)}
+
+The package \pkg{nicematrix} provides a option |baseline| for the vertical
+position of the arrays. This option takes in as value an integer which is the
+number of the row on which the array will be aligned.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+$A = \begin{pNiceMatrix}[~emphase#baseline=2@]
+\frac{1}{\sqrt{1+p^2}} & p & 1-p \\
+1 & 1 & 1 \\
+1 & p & 1+p
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$A = \begin{pNiceMatrix}[baseline=2]
+\frac{1}{\sqrt{1+p^2}} & p & 1-p \\
+1 & 1 & 1 \\
+1 & p & 1+p
+\end{pNiceMatrix}$
+
+
+\medskip
+It's also possible to use the option |baseline| with one of the special values
+|t|, |c| or |b|. These letters may also be used absolutely like the option of
+the environments |{tabular}| and |{array}| of \pkg{array}. The initial value
+of |baseline| is~|c|.
+
+
+\medskip
+In the following example, we use the option |t| (equivalent to |baseline=t|)
+immediately after an |\item| of list. One should remark that the presence of a
+|\hline| at the beginning of the array doesn't prevent the alignment of the
+baseline with the baseline of the first row (with |{tabular}| or |{array}| of
+\pkg{array}, one must use |\firsthline|).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{enumerate}
+\item an item
+\smallskip
+\item \renewcommand{\arraystretch}{1.2}
+$\begin{NiceArray}~emphase#[t]@{lcccccc}
+\hline
+n & 0 & 1 & 2 & 3 & 4 & 5 \\
+u_n & 1 & 2 & 4 & 8 & 16 & 32
+\hline
+\end{NiceArray}$
+\end{enumerate}
+\end{BVerbatim}
+\begin{minipage}{5cm}
+\begin{enumerate}
+\item an item
+\smallskip
+\item \renewcommand{\arraystretch}{1.2}
+$\begin{NiceArray}[t]{lcccccc}
+\hline
+n & 0 & 1 & 2 & 3 & 4 & 5 \\
+u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
+\hline
+\end{NiceArray}$
+\end{enumerate}
+\end{minipage}
+
+\medskip
+However, it's also possible to use the tools of
+\pkg{booktabs}\footnote{The extension \pkg{booktabs} is \emph{not} loaded
+by \pkg{nicematrix}.}: |\toprule|,
+|\bottomrule|, |\midrule|, etc.\par\nobreak
+
+\smallskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{enumerate}
+\item an item
+\smallskip
+\item
+$\begin{NiceArray}[t]{lcccccc}
+~emphase#\toprule@
+n & 0 & 1 & 2 & 3 & 4 & 5 \\
+~emphase#\midrule@
+u_n & 1 & 2 & 4 & 8 & 16 & 32
+~emphase#\bottomrule@
+\end{NiceArray}$
+\end{enumerate}
+\end{BVerbatim}
+\begin{minipage}{5cm}
+\begin{enumerate}
+\item an item
+\smallskip
+\item
+$\begin{NiceArray}[t]{lcccccc}
+\toprule
+n & 0 & 1 & 2 & 3 & 4 & 5 \\
+\midrule
+u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
+\bottomrule
+\end{NiceArray}$
+\end{enumerate}
+\end{minipage}
+
+\bigskip
+It's also possible to use the key |baseline| to align a matrix on an
+horizontal rule (drawn by |\hline|). In this aim, one should give the value
+|line-|\textsl{i} where \textsl{i} is the number of the row \emph{following} the
+horizontal rule.
+
+\smallskip
+\begin{Verbatim}
+\NiceMatrixOptions{cell-space-limits=1pt}
+\end{Verbatim}
+
+\smallskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+$A=\begin{pNiceArray}{cc|cc}~emphase#[baseline=line-3]@
+\dfrac{1}{A} & \dfrac{1}{B} & 0 & 0 \\
+\dfrac{1}{C} & \dfrac{1}{D} & 0 & 0 \\
+\hline
+0 & 0 & A & B \\
+0 & 0 & D & D \\
+\end{pNiceArray}$
+\end{BVerbatim}
+\begin{scope}
+\NiceMatrixOptions{cell-space-limits=1pt}
+\raisebox{-5mm}{$A=\begin{pNiceArray}{cc|cc}[baseline=line-3]
+\dfrac{1}{A} & \dfrac{1}{B} & 0 & 0 \\
+\dfrac{1}{C} & \dfrac{1}{D} & 0 & 0 \\
+\hline
+0 & 0 & A & B \\
+0 & 0 & D & D \\
+\end{pNiceArray}$}
+\end{scope}
+
+
+\section{The blocks}
+\label{Block}
+
+\index{Blocks@\textbf{Blocks in the tabulars}|(}
+\indexcommand{Block}
+
+
+\subsection{General case}
+
+In the environments of \pkg{nicematrix}, it's possible to use the command
+|\Block| in order to place an element in the center of a rectangle of merged
+cells of the array.\footnote{The spaces after a command |\Block| are deleted.}
+
+The command |\Block| must be used in the upper leftmost cell of the array with
+two arguments.
+
+\begin{itemize}
+\item The first argument is the size of the block with the syntax
+$i$|-|$j$ where $i$ is the number of rows of the block and $j$ its number
+of columns.
+
+If this argument is empty, its default
+value is |1-1|. If the number of rows is not specified, or equal to |*|, the
+block extends until the last row (idem for the columns).
+
+\item The second argument is the content of the block. It's possible to use
+|\\| in that content to have a content on several lines. In |{NiceTabular}|,
+|{NiceTabular*}| and |{NiceTabularX}|, the content of the block is composed in
+text mode whereas, in the other environments, it is composed in math mode.
+\end{itemize}
+
+
+\interitem
+Here is an example of utilisation of the command |\Block| in mathematical matrices.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+~emphase#\Block{3-3}{A}@ & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+\end{BVerbatim}
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block{3-3}{A} & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+
+\bigskip
+One may wish to raise the size of the ``$A$'' placed in the block of the
+previous example. Since this element is composed in math mode, it's not
+possible to use directly a command like |\large|, |\Large| and |\LARGE|.
+That's why the command |\Block| provides an option between angle brackets to
+specify some TeX code which will be inserted before the beginning of the
+math mode.\footnote{This argument between angular brackets may also be used to
+insert a command of font such as |\bfseries| when the command |\\| is used in
+the content of the block.}
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block{3-3}~emphase#<\Large>@{A} & & & 0 \\
+0 & & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+\end{BVerbatim}
+\begin{scope}
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block{3-3}<\Large>{A} & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+\end{scope}
+
+
+
+\interitem
+In fact, the command |\Block| accepts as first optional argument (between
+square brackets) a list of couples \textsl{key=value}. The available keys are as
+follows:
+\begin{itemize}
+\item \index{fill (key of \texttt{\textbackslash Block})}
+the key \Definition{fill} takes in as value a color and fills the block
+with that color;
+\item \index{draw (key of \texttt{\textbackslash Block})}
+the key \Definition{draw} takes in as value a color and strokes the
+frame of the block with that color (the default value of that key is the
+current color of the rules of the array);
+\item \index{color!key of \texttt{\textbackslash Block}}
+the key \Definition{color} takes in as value a color and apply that
+color the content of the block but draws also the frame of the block with that
+color;
+\item \index{vlines!key of \texttt{\textbackslash Block}}
+\index{hvlines!key of \texttt{\textbackslash Block}}
+\index{hlines!key of \texttt{\textbackslash Block}}
+the keys \Definition{hlines}, \Definition{vlines} and
+\Definition{hvlines} draw all the corresponding rules in the
+block;\footnote{However, the rules are not drawn in the sub-blocks of the
+block, as always with \pkg{nicematrix}: the rules are not drawn in the blocks
+(cf. section~\ref{rules} p.~\pageref{rules}).}
+\item \index{line-width (key of \texttt{\textbackslash Block})}
+the key \Definition{line-width} is the width of the rules (is relevant
+only when one of the keys |draw|, |hvlines|, |vlines| and |hlines| is used);
+\item \index{rounded-corners!key of \texttt{\textbackslash Block}}
+\index{Corners (rounded ---)!for a block}
+the key \Definition{rounded-corners} requires rounded corners (for the
+frame drawn by |draw| and the shape drawn by |fill|) with a radius equal to
+the value of that key (the default value is 4~pt\footnote{This value is the
+initial value of the \emph{rounded corners} of Tikz.});
+\item \index{tikzz at tikz!key of \texttt{\textbackslash Block}}
+when the key \Definition{tikz} is used, the Tikz path corresponding of
+the rectangle which delimits the block is executed with Tikz\footnote{Tikz
+should be loaded (by default, \pkg{nicematrix} only loads \textsc{pgf}) and,
+if it's not, an error will be raised.} by using as options the value of that
+key |tikz| (which must be a list of keys allowed for a Tikz path). For
+examples, cf. p.~\pageref{tikz-key-examples};
+\item \index{name!key of \texttt{\textbackslash Block}}
+the key \Definition{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 \index{respect-arraystretch (key of \texttt{\textbackslash Block})}
+the key \Definition{respect-arraystretch} prevents the setting of
+|\arraystretch| to $1$ at the beginning of the block (which is the behaviour
+by default) ;
+\item \index{borders (key of \texttt{\textbackslash Block})}
+\index{tikzz at tikz!key of ``borders'' de \texttt{\textbackslash Block}}
+the key \Definition{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|; it's possible, in
+fact, in the list which is the value of the key |borders|, to add an entry of
+the form |tikz={|\textsl{list}|}| where \textsl{list} is a list of couples
+\textsl{key=value} of Tikz specifying the graphical characteristics of the
+lines that will be drawn (for an example, see p.~\pageref{dashed}).
+\item \index{transparent (key of \texttt{\textbackslash Block})}
+By default, the rules are not drawn in the blocks (see the section about
+the rules: section~\ref{rules} p.~\pageref{rules}). However, if the key
+\Definition{transparent} is used, the rules are drawn. For an example, see
+section~\ref{tikz-key-examples} on page~\pageref{tikz-key-examples}. Caution:
+that key does not imply that the content of the block will be transparent!
+\end{itemize}
+
+There is also keys for the horizontal and vertical positions of the content of
+the block: cf.~\ref{horizontal-block} p.~\pageref{horizontal-block}.
+
+\interitem
+{\bfseries One must remark that, by default, the commands |\Blocks| don't create space}.
+There is exception only for the blocks mono-row and the blocks mono-column as
+explained just below.
+
+\medskip
+In the following example, we have had to enlarge by hand the columns 2 and 3
+(with the construction |w{c}{...}| of \pkg{array}).
+
+\bigskip
+\begin{BVerbatim}
+\begin{NiceTabular}{cw{c}{2cm}w{c}{3cm}c}
+rose & tulip & daisy & dahlia \\
+violet
+& ~emphase#\Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}@
+ ~emphase#{\LARGE Some beautiful flowers}@
+ & & marigold \\
+iris & & & lis \\
+arum & periwinkle & forget-me-not & hyacinth
+\end{NiceTabular}
+\end{BVerbatim}
+
+\medskip
+\begin{center}
+\begin{NiceTabular}{cw{c}{2cm}w{c}{3cm}c}
+rose & tulip & daisy & dahlia \\
+violet & \Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}
+ {\LARGE Some beautiful flowers} & & marigold \\
+ iris & & & lis \\
+ arum & periwinkle & forget-me-not & hyacinth
+\end{NiceTabular}
+\end{center}
+
+\subsection{The mono-column blocks}
+
+The mono-column blocks have a special behaviour.
+
+\begin{itemize}
+\item The natural width of the contents of these blocks is taken into account
+for the width of the current column.
+
+In the columns with a fixed width (columns |w{...}{...}|, |W{...}{...}|,
+|p{...}|, |b{...}|, |m{...}|, |V| and |X|), the content of the block is
+formatted as a paragraph of that width.
+
+\item The specification of the horizontal position provided by the type of
+column (|c|, |r| or |l|) is taken into account for the blocks (but the
+|\Block| may have its own specification of alignment:
+cf.~\ref{horizontal-block} p.~\pageref{horizontal-block}).
+
+\item The specifications of font specified for the column by a construction
+|>{...}| in the preamble of the array are taken into account for the
+mono-column blocks of that column (this behaviour is probably expected).
+\end{itemize}
+
+
+\bigskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=12cm]
+\begin{NiceTabular}{~LetterAt{}>{\bfseries}lr~LetterAt{}} \hline
+\Block{2-1}{John} & 12 \\
+ & 13 \\ \hline
+Steph & 8 \\ \hline
+\Block{3-1}{Sarah} & 18 \\
+ & 17 \\
+ & 15 \\ \hline
+Ashley & 20 \\ \hline
+Henry & 14 \\ \hline
+\Block{2-1}{Madison} & 15 \\
+ & 19 \\ \hline
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{@{}>{\bfseries}lr@{}}[baseline=c] \hline
+\Block{2-1}{John} & 12 \\
+ & 13 \\ \hline
+Steph & 8 \\ \hline
+\Block{3-1}{Sarah} & 18 \\
+ & 17 \\
+ & 15 \\ \hline
+Ashley & 20 \\ \hline
+Henry & 14 \\ \hline
+\Block{2-1}{Madison} & 15 \\
+ & 19 \\ \hline
+\end{NiceTabular}
+\end{scope}
+
+
+\subsection{The mono-row blocks}
+
+For the mono-row blocks, the natural height and depth are taken into account
+for the height and depth of the current row (as does a standard |\multicolumn|
+of LaTeX).
+
+\subsection{The mono-cell blocks}
+
+A mono-cell block inherits all the properties of the mono-row blocks and
+mono-column blocks.
+
+\medskip
+At first sight, one may think that there is no point using a mono-cell block.
+However, there are some good reasons to use such a block.
+\begin{itemize}
+\item It's possible to use the command |\\| in a (mono-cell) block.
+
+\item It's possible to use the option of horizontal alignment of the block in
+derogation of the type of column given in the preamble of the array.
+
+\item It's possible do draw a frame around the cell with the key |draw| of the
+command |\Block| and to fill the background with rounded corners with the keys
+|fill| and |rounded-corners|.\footnote{If one simply wishes to color the
+background of a unique cell, there is no point using the command |\Block|:
+it's possible to use the command |\cellcolor| (when the key |colortbl-like| is
+used).}
+
+\item It's possible to draw one or several borders of the cell with the key |borders|.
+\end{itemize}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{cc}
+\toprule
+Writer & ~emphase#\Block[l]{}{year\\ of birth}@ \\
+\midrule
+Hugo & 1802 \\
+Balzac & 1799 \\
+\bottomrule
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{cc}
+\toprule
+Writer & \Block[l]{}{year\\ of birth} \\
+\midrule
+Hugo & 1802 \\
+Balzac & 1799 \\
+\bottomrule
+\end{NiceTabular}
+
+\medskip
+We recall that if the first mandatory argument of |\Block| is left blank, the
+block is mono-cell.\footnote{One may consider that the default value of the
+first mandatory argument of |\Block| is |1-1|.}
+
+
+
+
+\subsection{Horizontal position of the content of the block}
+
+\label{horizontal-block}
+
+The command |\Block| accepts the keys |l|, |c| and |r| for the horizontal
+position of its content.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+\end{BVerbatim}
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block[r]{3-3}<\LARGE>{A} & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+
+
+\medskip
+By default, the horizontal position of the content of a block is computed
+by using the positions of the \emph{contents} of the columns implied in that
+block. That's why, in the following example, the header ``First group'' is
+correctly centered despite the instruction |!{\qquad}| in the preamble which
+has been used to increase the space between the columns (this
+is not the behaviour of |\multicolumn|).
+
+\medskip
+\begin{center}
+\fvset{commandchars=\~\#\+}
+\begin{BVerbatim}
+\begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc@{}}
+\toprule
+Rank & ~emphase#\Block{1-3}{First group}+ & & & \Block{1-3}{Second group} \\
+ & 1A & 1B & 1C & 2A & 2B & 2C \\
+\midrule
+ 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+ 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+ 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+ 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+\bottomrule
+\end{NiceTabular}
+\end{BVerbatim}
+\end{center}
+
+\bigskip
+\begin{center}
+\begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
+\toprule
+Rank & \Block{1-3}{First group} & & & \Block{1-3}{Second group} \\
+ & 1A & 1B & 1C & 2A & 2B & 2C \\
+\midrule
+ 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+ 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+ 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+ 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+
+\medskip
+In order to have an horizontal positionning of the content of the block
+computed with the limits of the columns of the LaTeX array (and not with the
+contents of those columns), one may use the key |L|, |R| and |C| of the
+command |\Block|.
+
+\medskip
+Here is the same example with the key |C| for the first block.
+
+\medskip
+\begin{center}
+\fvset{commandchars=\~\#\+}
+\begin{BVerbatim}
+\begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc@{}}
+\toprule
+Rank & ~emphase#\Block[C]{1-3}{First group}+ & & & \Block{1-3}{Second group} \\
+ & 1A & 1B & 1C & 2A & 2B & 2C \\
+\midrule
+ 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+ 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+ 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+ 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+\bottomrule
+\end{NiceTabular}
+\end{BVerbatim}
+\end{center}
+
+\bigskip
+\begin{center}
+\begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
+\toprule
+Rank & \Block[C]{1-3}{First group} & & & \Block{1-3}{Second group} \\
+ & 1A & 1B & 1C & 2A & 2B & 2C \\
+\midrule
+ 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+ 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+ 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+ 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+
+
+\subsection{Vertical position of the content of the block}
+
+
+For the vertical position, the command |\Blocks| accepts the keys
+|v-center|\footnote{That key could not have been named |c| since the key |c|
+is used for the horizontal alignement.},
+|t|, |b|, |T| and |B|.
+
+
+\begin{itemize}
+\item \index{v-center (key of \texttt{\textbackslash Block})}
+With the key |v-center|, the content of the block is vertically centered.
+\item With the key |t|, the baseline of the content of the block is aligned
+With the basline of the first row concerned by the block).
+\item with the key |b|, the baseline of the last row of the content of the
+block (we recall that the content of a block may contains several lines
+separated by |\\|) is aligned with the baseline of the last of the rows of the
+array involved in the block.
+\item With the key |T|, the content of the block is set upwards.
+
+\colorbox{yellow!50}{\textbf{Modification 6.18}}\enskip No vertical margin is
+added. However, the contents of the block is (always) composed by
+\pkg{nicematrix} in a |{minipage}|, a |{tabular}| or an |{array}| and, hence,
+there will still remain a margin (in most cases).
+
+\item With the key |B|, the content of the block is set downwards.
+\end{itemize}
+
+When no key is given, the key |v-center| applies (excepted in the mono-row blocks).
+
+
+
+\medskip
+\begin{scope}
+\NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
+
+\begin{BVerbatim}
+\NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
+\end{BVerbatim}
+
+\bigskip
+
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#t@,l]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,t,l]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#b@,r]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,b,r]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#T@,l]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,T,l]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#B@,r]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,B,r]{4-2}{two\\lines}
+ & & \Huge Un\\
+ & & deux \\
+ & & trois \\
+ & & \Huge quatre \\
+text & text \\
+\end{NiceTabular}
+
+
+\end{scope}
+
+\index{Blocks@\textbf{Blocks in the tabulars}|)}
+
+
+\section{The rules}
+
+\label{rules}
+\index{Rules@\textbf{Rules in the tabulars}|(}
+\index{Lines in the tabulars|see{Rules}}
+
+The usual techniques for the rules may be used in the environments of
+\pkg{nicematrix} (excepted |\vline|). However, there is some small differences
+with the classical environments.
+
+\bigskip
+\subsection{Some differences with the classical environments}
+
+\subsubsection{The vertical rules}
+
+In the environments of \pkg{nicematrix}, the vertical rules specified by
+\verb+|+ in the preambles of the environments are never broken, even by an
+incomplete row or by a double horizontal rule specified by |\hline\hline|
+(there is no need to use the package~\pkg{hhline}).
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{|c|c|} \hline
+First & Second \\ ~emphase#\hline\hline@
+Peter \\ \hline
+Mary & George\\ \hline
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{|c|c|}[c] \hline
+First & Second \\ \hline\hline
+Peter \\ \hline
+Mary & George \\ \hline
+\end{NiceTabular}
+
+
+\bigskip
+However, the vertical rules are not drawn in the blocks (created by |\Block|:
+cf.~p.~\pageref{Block}) nor in the corners (created by the key |corner|:
+cf.~p.~\pageref{corners}) nor in the potential exterior rows (created by the
+keys |first-row| and |last-row|: cf.~p.~\pageref{exterior}).
+
+\bigskip
+\index{booktabs@\pkg{booktabs} (package)}
+If you use \pkg{booktabs} (which provides |\toprule|, |\midrule|,
+|\bottomrule|, etc.) and if you really want to add vertical rules (which is
+not in the spirit of \pkg{booktabs}), you should notice that the vertical rules
+drawn by \pkg{nicematrix} are compatible with \pkg{booktabs}.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
+$\begin{NiceArray}{~emphase#|cccc|@} \toprule
+a & b & c & d \\ \midrule
+1 & 2 & 3 & 4 \\
+1 & 2 & 3 & 4 \\ \bottomrule
+\end{NiceArray}$
+\end{BVerbatim}
+$\begin{NiceArray}{|cccc|}
+\toprule
+a & b & c & d \\
+\midrule
+1 & 2 & 3 & 4 \\
+1 & 2 & 3 & 4 \\
+\bottomrule
+\end{NiceArray}$
+
+\bigskip
+However, it's still possible to define a specifier (named, for instance, |I|)
+to draw vertical rules with the standard behaviour of \pkg{array}.
+
+\begin{Verbatim}
+\newcolumntype{I}{!{\vrule}}
+\end{Verbatim}
+
+
+\bigskip
+\subsubsection{The command \textbackslash cline}
+
+\label{remark-cline}
+\index{cline@\texttt{\textbackslash cline} (LaTeX command)}
+
+The horizontal and vertical rules drawn by |\hline| and the specifier
+``\verb+|+'' make the array larger or wider by a quantity equal to the width
+of the rule (with \pkg{array} and also with \pkg{nicematrix}).
+
+\smallskip
+For historical reasons, this is not the case with the command |\cline|, as
+shown by the following example.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\setlength{\arrayrulewidth}{2pt}
+\begin{tabular}{cccc} \hline
+A&B&C&D \\ ~emphase#\cline{2-2}@
+A&B&C&D \\ \hline
+\end{tabular}
+\end{BVerbatim}
+\begin{scope}
+\setlength{\arrayrulewidth}{2pt}
+\begin{tabular}[c]{cccc}
+\hline
+A&B&C&D \\
+\cline{2-2}
+A&B&C&D \\
+\hline
+\end{tabular}
+\end{scope}
+
+\medskip
+\index{standard-cline}
+In the environments of \pkg{nicematrix}, this situation is corrected (it's
+still possible to go to the standard behaviour of |\cline| with the key |standard-cline|).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\setlength{\arrayrulewidth}{2pt}
+\begin{NiceTabular}{cccc} \hline
+A&B&C&D \\ ~emphase#\cline{2}@
+A&B&C&D \\ \hline
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{scope}
+\setlength{\arrayrulewidth}{2pt}
+\begin{NiceTabular}[c]{cccc}
+\hline
+A&B&C&D \\
+\cline{2}
+A&B&C&D \\
+\hline
+\end{NiceTabular}
+\end{scope}
+
+\medskip
+In the environments of \pkg{nicematrix}, an instruction |\cline{|\textsl{\texttt{i}}|}|
+is equivalent to |\cline{|\textsl{\texttt{i}}|-|\textsl{\texttt{i}}|}|.
+
+
+\subsection{The thickness and the color of the rules}
+
+\indexcommand{arrayrulewidth}
+\index{Colour!of the rules}
+\index{width!subkey of ``rules''}
+\index{rules (key for an environment)}
+
+The environments of \pkg{nicematrix} provide a key |rules/width| to set the
+width (in fact the thickness) of the rules in the current environment. In
+fact, this key merely sets the value of the length |\arrayrulewidth|.
+
+\smallskip
+It's well known that \pkg{colortbl} provides the command |\arrayrulecolor| in
+order to specify the color of the rules.
+
+\smallskip
+\indexcommand{arrayrulecolor}
+With \pkg{nicematrix}, it's possible to specify the color of the rules even
+when \pkg{colortbl} is not loaded. For sake of compatibility, the command is
+also named |\arrayrulecolor|. The environments of \pkg{nicematrix} also
+provide a key |rules/color| to fix the color of the rules in the current
+environment. This key sets the value locally (whereas |\arrayrulecolor| acts
+globally!).
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+\begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
+\hline
+rose & tulipe & lys \\
+arum & iris & violette \\
+muguet & dahlia & souci \\
+\hline
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
+\hline
+rose & tulipe & lys \\
+arum & iris & violette \\
+muguet & dahlia & souci \\
+\hline
+\end{NiceTabular}
+\end{scope}
+
+
+
+\subsection{The tools of nicematrix for the rules}
+
+Here are the tools provided by \pkg{nicematrix} for the rules.
+\begin{itemize}
+\item the keys |hlines|, |vlines|, |hvlines| and |hvlines-except-borders|;
+\item the specifier ``\verb+|+'' in the preamble (for the environments with
+preamble);
+\item \indexcommand{Hline}
+the command |\Hline|.
+\end{itemize}
+
+\medskip
+\textbf{All these tools don't draw the rules in the blocks nor in the
+empty corners (when the key |corners| is used), nor in the exterior rows and
+columns.}
+\begin{itemize}
+\item These blocks are:
+\begin{itemize}
+\item the blocks created by the command |\Block|\footnote{And also the command |\multicolumn| but
+it's recommended to use instead |\Block| in the environments of
+\pkg{nicematrix}.} presented
+p.~\pageref{Block};
+\item the blocks implicitely delimited by the continuous dotted lines created
+by |\Cdots|, |\Vdots|, etc. (cf.~p.~\pageref{Cdots}).
+\end{itemize}
+\item The corners are created by the key |corners| explained below (see
+p.~\pageref{corners}).
+\item For the exterior rows and columns, see~p.~\pageref{exterior}.
+\end{itemize}
+
+In particular, this remark explains the difference between the standard
+command |\hline| and the command |\Hline| provided by \pkg{nicematrix}.
+
+The key |\Hline| takes in an optional argument (between square brackets) which
+is a list of \textsl{key=value} pairs. For the description of those keys, see
+|custom-line| on p.~\pageref{custom-line}.
+
+\subsubsection{The keys hlines and vlines}
+
+\index{hlines|see{Rules}}
+\index{hlines!key for an environment}
+\index{vlines|see{Rules}}
+\index{vlines!key for an environment}
+
+The keys |hlines| and |vlines| (which draw, of course, horizontal and vertical
+rules) take in as value a list of numbers which are the numbers of the rules
+to draw.\footnote{It's possible to put in that list some intervals of integers
+with the syntax $i$|-|$j$.}
+
+In fact, for the environments with delimiters (such as |{pNiceMatrix}| or
+|{bNiceArray}|), the key |vlines| don't draw the exterior rules (this is
+certainly the expected behaviour).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{pNiceMatrix}[~emphase#vlines@,rules/width=0.2pt]
+1 & 2 & 3 & 4 & 5 & 6 \\
+1 & 2 & 3 & 4 & 5 & 6 \\
+1 & 2 & 3 & 4 & 5 & 6
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}[vlines,rules/width=0.2pt]
+1 & 2 & 3 & 4 & 5 & 6 \\
+1 & 2 & 3 & 4 & 5 & 6 \\
+1 & 2 & 3 & 4 & 5 & 6
+\end{pNiceMatrix}$
+
+
+
+\subsubsection{The keys hvlines and hvlines-except-borders}
+\label{hvlines}
+
+\index{hvlines|see{Rules}}
+\index{hvlines!key for an environment}
+\index{hvlines-except-borders}
+
+
+The key |hvlines| (no value) is the conjonction of the keys |hlines| and |vlines|.
+
+\smallskip
+\begin{Verbatim}
+\setlength{\arrayrulewidth}{1pt}
+\begin{NiceTabular}{cccc}[~emphase#hvlines@,rules/color=blue]
+rose & tulipe & marguerite & dahlia \\
+violette & \Block[draw=red]{2-2}{\LARGE fleurs} & & souci \\
+pervenche & & & lys \\
+arum & iris & jacinthe & muguet
+\end{NiceTabular}
+\end{Verbatim}
+
+\begin{center}
+\setlength{\arrayrulewidth}{1pt}
+\begin{NiceTabular}{cccc}[hvlines,rules/color=blue]
+rose & tulipe & marguerite & dahlia \\
+violette & \Block[draw=red]{2-2}{\LARGE fleurs} & & souci \\
+pervenche & & & lys \\
+arum & iris & jacinthe & muguet
+\end{NiceTabular}
+\end{center}
+
+\bigskip
+It's worth noting that, when the key |rounded-corners| is used for the
+environment |{NiceTabular}|, the key |hvlines| draws rounded corners for the
+exterior frame of the tabular: cf. part~\ref{tabular-rounded-corners},
+p.~\pageref{tabular-rounded-corners}.
+
+\bigskip
+The key |hvlines-except-borders| is similar to the key |hvlines| but does not
+draw the rules on the horizontal and vertical borders of the array. For an
+example of use of that key, see the part ``Use with tcolorbox'',
+p.~\pageref{tcolorbox}.
+
+\subsubsection{The (empty) corners}
+
+\label{corners}
+\index{Corners (the empty ---)}
+\index{corners (key of an environment)}
+
+The four |corners| of an array will be designed by |NW|, |SW|, |NE| and |SE|
+(\emph{north west}, \emph{south west}, \emph{north east} and \emph{south east}).
+
+For each of these corners, we will call \emph{empty corner} (or simply
+\emph{corner}) the reunion of all the empty rectangles starting from the cell
+actually in the corner of the array.\footnote{For sake of completeness, we
+should also say that a cell contained in a block (even an empty cell) is not
+taken into account for the determination of the corners. That behaviour is
+natural. The precise definition of a ``non-empty cell'' is given below (cf.
+p.~\pageref{empty-cells}).}
+
+However, it's possible, for a cell without content, to require \pkg{nicematrix}
+to consider that cell as not empty with the key |\NotEmpty|.
+
+\bigskip
+\begin{minipage}{9cm}
+In the example on the right (where B is in the center of a block of size
+$2\times2$), we have colored in blue the four (empty) corners of the array.
+\end{minipage}\hspace{2cm}%
+\begin{NiceTabular}{*{6}{c}}[cell-space-top-limit=3pt]
+\CodeBefore
+ \rectanglecolor{blue!10}{1-1}{4-2}
+ \rectanglecolor{blue!10}{1-1}{1-4}
+ \rectanglecolor{blue!10}{1-6}{3-6}
+ \rectanglecolor{blue!10}{7-1}{9-1}
+ \rectanglecolor{blue!10}{7-5}{9-6}
+\Body
+ & & & & A \\
+ & & A & A & A \\
+ & & & A \\
+ & & A & A & A & A \\
+A & A & A & A & A & A \\
+A & A & A & A & A & A \\
+ & A & A & A \\
+ & \Block{2-2}{B} & & A \\
+ & & & A \\
+\end{NiceTabular}
+
+\bigskip
+When the key |corners|\footnote{The key |corners| that we describe now
+has no direct link with the key |rounded-corners| described in the part
+\ref{tabular-rounded-corners}, p.~\pageref{tabular-rounded-corners}} is used,
+\pkg{nicematrix} computes the (empty) corners and these corners will be taken
+into account by the tools for drawing the rules (the rules won't be drawn in
+the corners).
+
+\bigskip
+\begin{BVerbatim}[boxwidth=11cm,baseline=c]
+\NiceMatrixOptions{cell-space-top-limit=3pt}
+\begin{NiceTabular}{*{6}{c}}[~emphase#corners@,hvlines]
+ & & & & A \\
+ & & A & A & A \\
+ & & & A \\
+ & & A & A & A & A \\
+A & A & A & A & A & A \\
+A & A & A & A & A & A \\
+ & A & A & A \\
+ & \Block{2-2}{B} & & A \\
+ & & & A \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{*{6}{c}}[corners,hvlines,cell-space-top-limit=3pt]
+ & & & & A \\
+ & & A & A & A \\
+ & & & A \\
+ & & A & A & A & A \\
+A & A & A & A & A & A \\
+A & A & A & A & A & A \\
+ & A & A & A \\
+ & \Block{2-2}{B} & & A \\
+ & & & A \\
+\end{NiceTabular}
+
+
+\bigskip
+It's also possible to provide to the key |corners| a (comma-separated) list of
+corners (designed by |NW|, |SW|, |NE| and |SE|).
+
+\medskip
+\begin{BVerbatim}[boxwidth=11cm,baseline=c]
+\NiceMatrixOptions{cell-space-top-limit=3pt}
+\begin{NiceTabular}{*{6}{c}}[~emphase#corners=NE@,hvlines]
+1\\
+1&1\\
+1&2&1\\
+1&3&3&1\\
+1&4&6&4&1\\
+ & & & & &1
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{*{6}{c}}[c,corners=NE,hvlines,cell-space-top-limit=3pt]
+1\\
+1&1\\
+1&2&1\\
+1&3&3&1\\
+1&4&6&4&1\\
+ & & & & &1
+\end{NiceTabular}
+
+
+\medskip
+$\triangleright$ The corners are also taken into account by the tools provided
+by \pkg{nicematrix} to color cells, rows and columns. These tools don't color
+the cells which are in the corners (cf.~p.~\pageref{color-in-code-before}).
+
+\subsection{The command \textbackslash diagbox}
+
+\indexcommand{diagbox}
+
+The command |\diagbox| (inspired by the package \pkg{diagbox}), allows, when
+it is used in a cell, to slash that cell diagonally downwards.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$\begin{NiceArray}{*{5}{c}}[hvlines]
+~emphase#\diagbox{x}{y}@ & e & a & b & c \\
+e & e & a & b & c \\
+a & a & e & c & b \\
+b & b & c & e & a \\
+c & c & b & a & e
+\end{NiceArray}$
+\end{BVerbatim}
+$\begin{NiceArray}{*{5}{c}}[hvlines]
+\diagbox{x}{y} & e & a & b & c \\
+e & e & a & b & c \\
+a & a & e & c & b \\
+b & b & c & e & a \\
+c & c & b & a & e
+\end{NiceArray}$
+
+\medskip
+It's possible to use the command |\diagbox| in a |\Block|.
+
+
+
+
+\subsection{Commands for customized rules}
+
+\label{custom-line}
+\index{command (key of ``custom-line'')}
+\index{ccommand (key of ``custom-line'')}
+\index{letter (key of ``custom-line'')}
+\index{custom-line|(}
+
+
+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 three 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 backslash) of a command that
+will be created by \pkg{nicematrix} and that will be available for the final
+user in order to draw horizontal rules (similarly to |\hline|);
+
+\item the key |ccommand| is the name (without the backslash) of a command
+that will be created by \pkg{nicematrix} and that will be available for the
+final user to order to draw partial horizontal rules (similarly to |\cline|,
+hence the name |ccommand|): the argument of that command is a list of
+intervals of columns specified by the syntax~$i$ or $i$-$j$.\footnote{It's
+recommended to use such commands only once in a row because each use will
+create space between the rows corresponding to the total width of the rule.}
+
+\item the key |letter| takes in as argument a letter\footnote{The following
+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}
+
+\bigskip
+We will now speak of the keys which describe the rule itself. Those keys may
+also be used in the (optional) argument of an individual command |\Hline|.
+
+There is three possibilities.
+
+\begin{itemize}
+\item \emph{First possibility}\par\nobreak
+
+It's possible to specify composite rules, with a color and a color for the
+inter-rule space (as possible with \pkg{colortbl} for instance).
+
+\begin{itemize}
+\index{multiplicity (key of ``custom-line'')}
+\index{color!key of ``custom-line''}
+\index{sep-color (key of ``custom-line'')}
+\item the key |multiplicity| is the number of consecutive rules that will be
+drawn: for instance, a value of $2$ will create double rules such those
+created by |\hline\hline| or \verb+||+ in the preamble of an environment;
+
+\item the key |color| sets the color of the rules ;
+
+\item the key |sep-color| sets the color between two successive rules (should be
+used only in conjonction with |multiplicity|).
+\end{itemize}
+
+\medskip
+That system may be used, in particular, for the definition of commands and
+letters to draw rules with a specific color (and those rules will respect the
+blocks and corners as do all the rules of \pkg{nicematrix}).
+
+\medskip
+\begin{Verbatim}
+\begin{NiceTabular}{lcIcIc}~emphase#[custom-line = {letter=I, color=blue}]@
+\hline
+ & \Block{1-3}{dimensions} \\
+ & L & l & h \\
+\hline
+Product A & 3 & 1 & 2 \\
+Product B & 1 & 3 & 4 \\
+Product C & 5 & 4 & 1 \\
+\hline
+\end{NiceTabular}
+\end{Verbatim}
+
+
+\begin{center}
+\begin{NiceTabular}{lcIcIc}[custom-line = {letter=I, color=blue}]
+\hline
+ & \Block{1-3}{dimensions} \\
+ & L & l & H \\
+\hline
+Product A & 3 & 1 & 2 \\
+Product B & 1 & 3 & 4 \\
+Product C & 5 & 4 & 1 \\
+\hline
+\end{NiceTabular}
+\end{center}
+
+
+\bigskip
+\item \emph{Second possibility}\par\nobreak
+
+\index{tikzz at tikz!key of ``custom-line''}
+\index{total-width (key of ``custom-line'')}
+
+It's possible to use the key |tikz| (if Tikz is loaded). In that case, the
+rule is drawn directly with Tikz by using as parameters the value of the key
+|tikz| which must be a list of \textsl{key=value} pairs which may be applied
+to a Tikz path.
+
+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 |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|).
+
+
+
+\bigskip
+Here is an example with the key |dotted| of Tikz.
+
+\begin{BVerbatim}[boxwidth=9cm,baseline=c]
+\NiceMatrixOptions
+ {
+ custom-line =
+ {
+ letter = I ,
+ ~emphase#tikz = dotted@ ,
+ ~emphase#total-width = \pgflinewidth@
+ }
+ }
+
+\begin{NiceTabular}{cIcIc}
+one & two & three \\
+four & five & six \\
+seven & eight & nine
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{scope}
+\NiceMatrixOptions
+ {
+ custom-line =
+ {
+ letter = I ,
+ tikz = dotted ,
+ total-width = \pgflinewidth
+ }
+ }
+\begin{NiceTabular}{cIcIc}
+one & two & three \\
+four & five & six \\
+seven & eight & nine
+\end{NiceTabular}
+\end{scope}
+
+\bigskip
+\item \emph{Third possibility} : the key |dotted|
+\label{dotted}
+\index{dotted (key of ``custom-line'')}
+\indexcommand{hdottedline}
+\indexcommand{cdottedline}
+
+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 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}).
+
+In fact, \pkg{nicematrix} defines by default the commands |\hdottedline| and
+|\cdottedline |and the letter ``|:|'' for those dotted
+rules.\footnote{However, it's possible to overwrite those definitions with a
+|custom-line| (in order, for example, to switch to dashed lines).}
+
+\smallskip
+\begin{BVerbatim}
+
+\NiceMatrixOptions % ~textsl#present in nicematrix.sty@
+ {
+ custom-line =
+ {
+ letter = : ,
+ command = hdottedline ,
+ ccommand = cdottedline ,
+ ~emphase#dotted@
+ }
+ }
+\end{BVerbatim}
+
+Thus, it's possible to use the commands |\hdottedline| and |\cdottedline |to
+draw horizontal dotted rules.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 \\
+~emphase#\hdottedline@
+6 & 7 & 8 & 9 & 10 \\
+~emphase#\cdottedline{1,4-5}@
+11 & 12 & 13 & 14 & 15
+\end{pNiceMatrix}
+\end{BVerbatim}
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 \\
+\hdottedline
+6 & 7 & 8 & 9 & 10 \\
+\cdottedline{1,4-5}
+11 & 12 & 13 & 14 & 15
+\end{pNiceMatrix}$
+
+
+\bigskip
+In the environments with an explicit preamble (like |{NiceTabular}|,
+|{NiceArray}|, etc.), it's possible to draw a vertical dotted line with the
+specifier ``|:|''.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
+\left(\begin{NiceArray}{cccc~emphase#:@c}
+1 & 2 & 3 & 4 & 5 \\
+6 & 7 & 8 & 9 & 10 \\
+11 & 12 & 13 & 14 & 15
+\end{NiceArray}\right)
+\end{BVerbatim}
+$\left(\begin{NiceArray}{cccc:c}
+1 & 2 & 3 & 4 & 5 \\
+6 & 7 & 8 & 9 & 10 \\
+11 & 12 & 13 & 14 & 15
+\end{NiceArray}\right)$
+
+\end{itemize}
+
+\index{custom-line|)}
+\index{Rules@\textbf{Rules in the tabulars}|)}
+
+
+\section{The color of the rows and columns}
+
+\index{Colour!of the cells}
+
+\subsection{Use of colortbl}
+
+\index{colortbl@\pkg{colortbl} (package)}
+
+We recall that the package \pkg{colortbl} can be loaded directly with
+|\usepackage{colortbl}| or by loading \pkg{xcolor} with the key |table|:
+|\usepackage[table]{xcolor}|.
+
+\medskip
+Since the package \pkg{nicematrix} is based on \pkg{array}, it's possible to
+use \pkg{colortbl} with \pkg{nicematrix}.
+
+\medskip
+However, there is two drawbacks:
+\begin{itemize}
+\item The package \pkg{colortbl} patches \pkg{array}, leading to some
+incompatibilities (for instance with the command |\hdotsfor|).
+
+\item The package \pkg{colortbl} constructs the array row by row, alterning
+colored rectangles, rules and contents of the cells. The resulting
+\textsc{pdf} is difficult to interpret by some \textsc{pdf} viewers and may
+lead to artefacts on the screen.
+\begin{itemize}
+\item Some rules seem to disappear. This is because many PDF viewers give
+priority to graphical element drawn posteriorly (which is in the spirit of the
+``painting model'' of PostScript and PDF). Concerning this problem, MuPDF
+(which is used, for instance, by SumatraPDF) gives better results than Adobe
+Reader).
+\item A thin white line may appear between two cells of the same color. This
+phenomenon occurs when each cell is colored with its own instruction |fill|
+(the PostScript operator |fill| noted |f| in PDF). This is the case with
+\pkg{colortbl}: each cell is colored on its own, even when |\columncolor| or
+|\rowcolor| is used.
+
+As for this phenomenon, Adobe Reader gives better results than MuPDF.
+\end{itemize}
+
+The package \pkg{nicematrix} provides tools to avoid those problems.
+\end{itemize}
+
+\subsection{The tools of nicematrix in the \textbackslash CodeBefore}
+
+\label{color-in-code-before}
+\index{code-before!key for an environment}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}}
+\index{Body@\texttt{\textbackslash Body}|see{\texttt{\textbackslash CodeBefore}}}
+
+The package \pkg{nicematrix} provides some tools (independent of \pkg{colortbl})
+to draw the colored panels first, and, then, the content of the cells and the
+rules. This strategy is more conform to the ``painting model'' of the formats
+PostScript and \textsc{pdf} and is more suitable for the \textsc{pdf} viewers.
+However, it requires several compilations.\footnote{If you use Overleaf,
+ Overleaf will do automatically a sufficient number of compilations.}
+
+\medskip
+The extension \pkg{nicematrix} provides a key |code-before| for some code that
+will be executed before the drawing of the tabular.
+
+\medskip
+An alternative syntax is provided: it's possible to put the content of that
+|code-before| between the keywords |\CodeBefore| and |\Body| at the beginning
+of the environment.
+
+\begin{Verbatim}
+\begin{pNiceArray}{~textsl#preamble@}
+~emphase#\CodeBefore [~textsl#options@]@
+ ~textsl#instructions of the code-before@
+~emphase#\Body@
+ ~textsl#contents of the environment@
+\end{pNiceArray}
+\end{Verbatim}
+
+\smallskip
+The optional argument between square brackets is a list of \textsl{key=value}
+pairs which will be presented progressively in this
+documentation.\footnote{The available keys are |create-cell-nodes|,
+|sub-matrix| (and its subkeys) and \texttt{delimiters-color}.}
+
+\medskip
+New commands are available in that |\CodeBefore|: |\cellcolor|,
+|\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors|,
+|\rowlistcolors|, |\chessboardcolors| and |\arraycolor|.\footnote{Remark that,
+in the |\CodeBefore|, PGF/Tikz nodes of the form ``\verb+(i-|j)+'' are
+also available to indicate the position to the potential rules:
+cf.~p.~\pageref{nodes-i}.}
+\label{code-before}
+
+\index{cellcolor@\texttt{\textbackslash cellcolor}!command of
+ \texttt{\textbackslash CodeBefore}}
+\index{rectanglecolor@\texttt{\textbackslash rectanglecolor} (command of
+ \texttt{\textbackslash CodeBefore})}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!command of \texttt{\textbackslash CodeBefore}}
+\index{columncolor@\texttt{\textbackslash columncolor}!command of
+ \texttt{\textbackslash CodeBefore}}
+\index{rowcolors@\texttt{\textbackslash rowcolors} (command of \texttt{\textbackslash CodeBefore})}
+\index{rowlistcolor@\texttt{\textbackslash rowlistcolors} (command of
+ \texttt{\textbackslash CodeBefore})}
+\index{chessboardcolors@\texttt{\textbackslash chessboardcolors}!(commande
+ du \texttt{\textbackslash CodeBefore})}
+\index{arraycolor@\texttt{\textbackslash arraycolor} (command of \texttt{\textbackslash
+ CodeBefore)}}
+
+\medskip
+These commands don't color the cells which are in the ``corners'' if the key
+|corners| is used. That key has been described p.~\pageref{corners}.
+
+\medskip
+These commands respect the rounded corners if the key |rounded-corners|
+(described in the part \ref{tabular-rounded-corners} at the
+page~\pageref{tabular-rounded-corners}) has been used.
+
+\medskip
+All these commands accept an optional argument, between square brackets and
+in first position. That optional argument may contain two elements (separated
+by a comma)
+\begin{itemize}
+\item the colorimetric space (|RGB|, |rgb|, |HTML|, etc) as specified by the
+the extension \pkg{xcolor};
+\item \index{opacity (key of commands such as\newline \texttt{\textbackslash rowcolor}, etc.)}
+\colorbox{yellow!50}{\textbf{New 6.18}}\par\nobreak
+a specification of opacity f the form \texttt{opacity = \textsl{value}}.
+\end{itemize}
+
+\bigskip
+
+We describe now in detail those commands.
+
+\medskip
+\begin{itemize}
+\item The command \Definition{\textbackslash cellcolor} takes its name from
+the command |\cellcolor| of \pkg{colortbl}.
+
+This command takes in as mandatory arguments a color and a list of cells, each
+of which with the format $i$-$j$ where $i$ is the number of the row and $j$ the
+number of the colummn of the cell. In fact, despite its name, this command may
+be used to color a whole row (with the syntax $i$-) or a whole column (with the
+syntax -$j$).
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[boxwidth=10cm,baseline=c]
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ ~emphase#\cellcolor[HTML]{FFFF88}{3-1,2-2,-3}@
+\Body
+a & b & c \\
+e & f & g \\
+h & i & j \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ \cellcolor[HTML]{FFFF88}{3-1,2-2,-3}
+\Body
+a & b & c \\
+e & f & g \\
+h & i & j \\
+\end{NiceTabular}
+\end{scope}
+
+\bigskip
+\item The command \Definition{\textbackslash rectanglecolor} takes three
+mandatory arguments. The first is the color. The second is the upper-left cell
+of the rectangle and the third is the lower-right cell of the rectangle.
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[boxwidth=10cm,baseline=c]
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@
+\Body
+a & b & c \\
+e & f & g \\
+h & i & j \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ \rectanglecolor{blue!15}{2-2}{3-3}
+\Body
+a & b & c \\
+e & f & g \\
+h & i & j \\
+\end{NiceTabular}
+\end{scope}
+
+\bigskip
+\item The command \Definition{\textbackslash arraycolor} takes in as mandatory
+argument a color and color the whole tabular with that color (excepted the
+potential exterior rows and columns: cf.~p.~\pageref{exterior}). It's only a
+particular case of |\rectanglecolor|.
+
+
+\bigskip
+\item The command \Definition{\textbackslash chessboardcolors} takes in as
+mandatory arguments two colors and it colors the cells of the tabular in
+quincunx with these colors.
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+$\begin{pNiceMatrix}[r,margin]
+\CodeBefore
+ ~emphase#\chessboardcolors{red!15}{blue!15}@
+\Body
+1 & -1 & 1 \\
+-1 & 1 & -1 \\
+1 & -1 & 1
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}[r,baseline=1, margin]
+\CodeBefore
+\chessboardcolors{red!15}{blue!15}
+\Body
+1 & -1 & 1 \\
+-1 & 1 & -1 \\
+1 & -1 & 1
+\end{pNiceMatrix}$
+\end{scope}
+
+\medskip
+We have used the key |r| which aligns all the columns rightwards (cf.
+p.~\pageref{columns-width}).
+
+
+\bigskip
+\item The command \Definition{\textbackslash rowcolor} takes its name from the
+command |\rowcolor| of \pkg{colortbl}. Its first mandatory argument is the
+color and the second is a comma-separated list of rows or interval of rows
+with the form $a$-$b$ (an interval of the form $a$- represent all the rows
+from the row $a$ until the end).
+
+\medskip
+\begin{scope}
+\hfuzz = 10cm
+\begin{BVerbatim}[boxwidth=9cm,baseline=c]
+$\begin{NiceArray}{lll}[hvlines]
+\CodeBefore
+ ~emphase#\rowcolor{red!15}{1,3-5,8-}@
+\Body
+a_1 & b_1 & c_1 \\
+a_2 & b_2 & c_2 \\
+a_3 & b_3 & c_3 \\
+a_4 & b_4 & c_4 \\
+a_5 & b_5 & c_5 \\
+a_6 & b_6 & c_6 \\
+a_7 & b_7 & c_7 \\
+a_8 & b_8 & c_8 \\
+a_9 & b_9 & c_9 \\
+a_{10} & b_{10} & c_{10} \\
+\end{NiceArray}$
+\end{BVerbatim}
+$\begin{NiceArray}{lll}[baseline=4,hvlines]
+\CodeBefore
+\rowcolor{red!15}{1,3-5,8-}
+\Body
+a_1 & b_1 & c_1 \\
+a_2 & b_2 & c_2 \\
+a_3 & b_3 & c_3 \\
+a_4 & b_4 & c_4 \\
+a_5 & b_5 & c_5 \\
+a_6 & b_6 & c_6 \\
+a_7 & b_7 & c_7 \\
+a_8 & b_8 & c_8 \\
+a_9 & b_9 & c_9 \\
+a_{10} & b_{10} & c_{10} \\
+\end{NiceArray}$
+\end{scope}
+
+
+\bigskip
+\item The command \Definition{\textbackslash columncolor} takes its name from
+the command |\columncolor| of \pkg{colortbl}. Its syntax is similar to the
+syntax of |\rowcolor|.
+
+\bigskip
+\item The command \Definition{\textbackslash rowcolors} (with a \emph{s})
+takes its name from the command |\rowcolors| of \pkg{colortbl}. The \emph{s}
+emphasizes the fact that there is \emph{two} colors. This command colors
+alternately the rows of the tabular with the two colors (provided in second
+and third argument), beginning with the row whose number is given in first
+(mandatory) argument.
+
+In fact, the first (mandatory) argument is, more generally, a comma separated
+list of intervals describing the rows involved in the action of |\rowcolors|
+(an interval of the form $i$|-| describes in fact the interval of all the rows
+of the tabular, beginning with the row~$i$).
+
+
+\bigskip
+The last argument of |\rowcolors| is an optional list of pairs
+\textsl{key=value} (the optional argument in the first position corresponds to
+the colorimetric space). The available keys are |cols|, |restart| and
+|respect-blocks|.
+
+\index{cols (key of \texttt{\textbackslash rowcolors} of \texttt{\textbackslash CodeBefore})}
+\index{restart (key of \texttt{\textbackslash rowcolors} of \texttt{\textbackslash CodeBefore})}
+\index{respect-blocks (key of \texttt{\textbackslash rowcolors} du\newline \texttt{\textbackslash CodeBefore})}
+
+\begin{itemize}
+\item The key |cols| describes a set of columns. The command |\rowcolors| will
+color only the cells of these columns. The value is a comma-separated list of
+intervals of the form $i$-$j$ (where $i$ or $j$ may be replaced by |*|).
+\item With the key |restart|, each interval of rows (specified by the first
+mandatory argument) begins with the same color.\footnote{Otherwise, the color
+of a given row relies only upon the parity of its absolute number.}
+\item With the key |respect-blocks| the ``rows'' alternately colored may extend over
+several rows if they have to incorporate blocks (created with the command
+|\Block|: cf.~p.~\pageref{Block}).
+\end{itemize}
+
+\medskip
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{clr}[hvlines]
+\CodeBefore
+ ~emphase#\rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]@
+\Body
+\Block{1-*}{Results} \\
+John & 12 \\
+Stephen & 8 \\
+Sarah & 18 \\
+Ashley & 20 \\
+Henry & 14 \\
+Madison & 15
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{clr}[hvlines,baseline=2]
+\CodeBefore
+ \rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]
+\Body
+\Block{1-*}{Results} \\
+\Block{2-1}{A}& John & 12 \\
+ & Stephen & 8 \\
+\Block{4-1}{B}& Sarah & 18 \\
+ & Ashley & 20 \\
+ & Henry & 14 \\
+ & Madison & 15
+\end{NiceTabular}
+\end{scope}
+
+\vspace{1cm}
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{lr}[hvlines]
+\CodeBefore
+ ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@
+\Body
+\Block{2-1}{John} & 12 \\
+ & 13 \\
+Steph & 8 \\
+\Block{3-1}{Sarah} & 18 \\
+ & 17 \\
+ & 15 \\
+Ashley & 20 \\
+Henry & 14 \\
+\Block{2-1}{Madison} & 15 \\
+ & 19
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{lr}[hvlines,baseline=c]
+\CodeBefore
+ \rowcolors{1}{blue!10}{}[respect-blocks]
+\Body
+\Block{2-1}{John} & 12 \\
+ & 13 \\
+Steph & 8 \\
+\Block{3-1}{Sarah} & 18 \\
+ & 17 \\
+ & 15 \\
+Ashley & 20 \\
+Henry & 14 \\
+\Block{2-1}{Madison} & 15 \\
+ & 19
+\end{NiceTabular}
+\end{scope}
+
+
+
+
+\bigskip
+\item The extension \pkg{nicematrix} provides also a command
+\Definition{\textbackslash rowlistcolors}. This command generalises the
+command |\rowcolors|: instead of two successive arguments for the colors, this
+command takes in an argument which is a (comma-separated) list of colors. In
+that list, the symbol |=| represent a color identical to the previous one.
+
+\smallskip
+\begin{BVerbatim}[boxwidth=10cm,baseline=c]
+\begin{NiceTabular}{c}
+\CodeBefore
+ ~emphase#\rowlistcolors{1}{red!15,blue!15,green!15}@
+\Body
+Peter \\
+James \\
+Abigail \\
+Elisabeth \\
+Claudius \\
+Jane \\
+Alexandra \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{c}
+\CodeBefore
+ \rowlistcolors{1}{red!15,blue!15,green!15}
+\Body
+Peter \\
+James \\
+Abigail \\
+Elisabeth \\
+Claudius \\
+Jane \\
+Alexandra \\
+\end{NiceTabular}
+
+\bigskip
+It's also possible to use in the command |\rowlistcolors| a color series
+defined by the command |\definecolorseries| of \pkg{xcolor} (and initialized
+with the command |\resetcolorseries|\footnote{For the initialization, in the
+following example, you have used the counter |iRow| which, when used in the
+|\CodeBefore| (and in the |\CodeAfter|) corresponds to the number of rows of
+the array: cf.~p~\pageref{iRow}. That leads to an adjustement of the gradation
+of the colors to the size of the tabular.}).
+
+\index{definecolorseries@\texttt{\textbackslash definecolorseries} (command of \pkg{xcolor})}
+\index{resetcolorseries@\texttt{\textbackslash resetcolorseries} (command of \pkg{xcolor})}
+
+\smallskip
+\begin{BVerbatim}[boxwidth=12.5cm,baseline=c]
+\begin{NiceTabular}{c}
+\CodeBefore
+ ~emphase#\definecolorseries{BlueWhite}{rgb}{last}{blue}{white}@
+ ~emphase#\resetcolorseries{\value{iRow}}{BlueWhite}@
+ ~emphase#\rowlistcolors{1}{BlueWhite!!+}@
+\Body
+Peter \\
+James \\
+Abigail \\
+Elisabeth \\
+Claudius \\
+Jane \\
+Alexandra \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{c}
+\CodeBefore
+ \definecolorseries{BlueWhite}{rgb}{last}{blue}{white}
+ \resetcolorseries[\value{iRow}]{BlueWhite}
+ \rowlistcolors{1}{BlueWhite!!+}
+\Body
+Peter \\
+James \\
+Abigail \\
+Elisabeth \\
+Claudius \\
+Jane \\
+Alexandra \\
+\end{NiceTabular}
+\end{itemize}
+
+\vspace{1cm}
+We recall that all the color commands we have described don't color the cells
+which are in the ``corners''. In the following example, we use the key
+|corners| to require the determination of the corner \emph{north east} (NE).
+
+\medskip
+\index{corners (key of an environment)|textit}
+\begin{scope}
+\hfuzz=11cm
+\begin{BVerbatim}[boxwidth=9cm,baseline=c]
+\begin{NiceTabular}{cccccc}[~emphase#corners=NE@,margin,hvlines,first-row,first-col]
+\CodeBefore
+ ~emphase#\rowlistcolors{1}{blue!15, }@
+\Body
+ & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
+0 & 1 \\
+1 & 1 & 1 \\
+2 & 1 & 2 & 1 \\
+3 & 1 & 3 & 3 & 1 \\
+4 & 1 & 4 & 6 & 4 & 1 \\
+5 & 1 & 5 & 10 & 10 & 5 & 1 \\
+6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccccccc}[corners=NE,margin,hvlines,first-row,first-col]
+\CodeBefore
+ \rowlistcolors{1}{blue!15, }
+\Body
+ & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
+0 & 1 \\
+1 & 1 & 1 \\
+2 & 1 & 2 & 1 \\
+3 & 1 & 3 & 3 & 1 \\
+4 & 1 & 4 & 6 & 4 & 1 \\
+5 & 1 & 5 & 10 & 10 & 5 & 1 \\
+6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+\end{NiceTabular}
+\end{scope}
+
+
+\bigskip
+One should remark that all the previous commands are compatible with the
+commands of \pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc).
+However, \pkg{booktabs} is \emph{not} loaded by \pkg{nicematrix}.
+
+\medskip
+\index{rotate@\texttt{\textbackslash rotate}|textit}
+\begin{scope}
+\hfuzz=10cm
+\begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
+\begin{NiceTabular}[c]{lSSSS}
+\CodeBefore
+ \rowcolor{red!15}{1-2}
+ \rowcolors{3}{blue!15}{}
+\Body
+~emphase#\toprule@
+\Block{2-1}{Product} &
+\Block{1-3}{dimensions (cm)} & & &
+\Block{2-1}{\rotate Price} \\
+~emphase#\cmidrule(rl){2-4}@
+ & L & l & h \\
+~emphase#\midrule@
+small & 3 & 5.5 & 1 & 30 \\
+standard & 5.5 & 8 & 1.5 & 50.5 \\
+premium & 8.5 & 10.5 & 2 & 80 \\
+extra & 8.5 & 10 & 1.5 & 85.5 \\
+special & 12 & 12 & 0.5 & 70 \\
+~emphase#\bottomrule@
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}[c]{lSSSS}
+\CodeBefore
+ \rowcolor{red!15}{1-2}
+ \rowcolors{3}{blue!15}{}
+\Body
+\toprule
+\Block{2-1}{Product} &
+\Block{1-3}{dimensions (cm)} & & &
+\Block{2-1}{\rotate Price} \\
+\cmidrule(rl){2-4}
+ & L & l & h \\
+\midrule
+small & 3 & 5.5 & 1 & 30 \\
+standard & 5.5 & 8 & 1.5 & 50.5 \\
+premium & 8.5 & 10.5 & 2 & 80 \\
+extra & 8.5 & 10 & 1.5 & 85.5 \\
+special & 12 & 12 & 0.5 & 70 \\
+\bottomrule
+\end{NiceTabular}
+\end{scope}
+
+\index{S (the columns S of \pkg{siunitx})|textit}
+\medskip
+We have used the type of column |S| of \pkg{siunitx}.
+
+
+\subsection{Color tools with the syntax of colortbl}
+
+\index{colortbl-like}
+\index{cellcolor@\texttt{\textbackslash cellcolor}!command in tabular}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!command in tabular}
+\index{columncolor@\texttt{\textbackslash columncolor}!command in the preamble
+ of an environment}
+
+
+It's possible to access the preceding tools with a syntax close to the syntax
+of \pkg{colortbl}. For that, one must use the key |colortbl-like| in the
+current environment.\footnote{Up to now, this key is \emph{not} available in |\NiceMatrixOptions|.}
+
+There are three commands available (they are inspired by \pkg{colortbl} but
+are \emph{independent} of \pkg{colortbl}):
+\begin{itemize}
+\item |\cellcolor| which colorizes a cell;\footnote{However, this command
+|\cellcolor| will delete the following spaces, which does not the command
+|\cellcolor| of \pkg{colortbl}.}
+\item |\rowcolor| which must be used in a cell and which colorizes the end of
+the row;
+\item |\columncolor| which must be used in the preamble of the environment
+with the same syntax as the corresponding command of
+\pkg{colortbl} (however, unlike the command |\columncolor| of \pkg{colortbl},
+this command |\columncolor| can appear within another command, itself used in the
+preamble of the array).
+\end{itemize}
+
+\smallskip
+\begin{Verbatim}
+\NewDocumentCommand { \Blue } { } { ~emphase#\columncolor{blue!15}@ }
+\begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc}
+\toprule
+~emphase#\rowcolor{red!15}@
+Last name & First name & Birth day \\
+\midrule
+Achard & Jacques & 5 juin 1962 \\
+Lefebvre & Mathilde & 23 mai 1988 \\
+Vanesse & Stephany & 30 octobre 1994 \\
+Dupont & Chantal & 15 janvier 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{Verbatim}
+
+
+\begin{center}
+\NewDocumentCommand { \Blue } { } { \columncolor{blue!15} }
+\begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc}
+\toprule
+\rowcolor{red!15}
+Last name & First name & Birth day \\
+\midrule
+Achard & Jacques & 5 juin 1962 \\
+Lefebvre & Mathilde & 23 mai 1988 \\
+Vanesse & Stephany & 30 octobre 1994 \\
+Dupont & Chantal & 15 janvier 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+
+\section{The command \textbackslash RowStyle}
+
+\label{RowStyle}
+\indexcommand{RowStyle}
+\index{cell-space-top-limit}
+\index{cell-space-bottom-limit}
+\index{cell-space-limits}
+
+
+The command |\RowStyle| takes in as argument some formatting intructions that
+will be applied to each cell on the rest of the current row.
+
+\medskip
+That command also takes in as optional argument (between square brackets)
+a list of \textsl{key=value} pairs.
+\begin{itemize}
+\item \index{nb-rows (key of \texttt{\textbackslash RowStyle})} The key |nb-rows| sets
+the number of rows to which the specifications of the current command will
+apply (with the special value |*|, it will apply to all the following rows).
+\item The keys |cell-space-top-limit|, |cell-space-bottom-limit| and
+|cell-space-limits| are available with the same meaning that the corresponding
+global keys (cf. p.~\pageref{cell-space}).
+\item \index{rowcolor (key of \texttt{\textbackslash RowStyle})}
+\index{color!key of \texttt{\textbackslash RowStyle}}
+The key |rowcolor| sets
+the color of the background and the key |color| sets the
+color of the text.\footnote{The key |color| uses the command
+|\color| but inserts also an instruction |\leavevmode| before. This
+instruction prevents a extra vertical space in the cells which belong to
+columns of type |p|, |b|, |m|, |X| and |V| (which start in
+vertical mode).}
+\item \index{bold (key of \texttt{\textbackslash RowStyle})} The key |bold|
+enforces bold characters for the cells of the row, both in math and text mode.
+\end{itemize}
+
+\medskip
+\begin{BVerbatim}[boxwidth=12cm,baseline=c]
+\begin{NiceTabular}{cccc}
+\hline
+~emphase#\RowStyle[cell-space-limits=3pt]{\rotate}@
+first & second & third & fourth \\
+~emphase#\RowStyle[nb-rows=2,rowcolor=blue!50,color=white]{\sffamily}@
+1 & 2 & 3 & 4 \\
+I & II & III & IV
+\end{NiceTabular}
+\end{BVerbatim}
+\index{rotate@\texttt{\textbackslash rotate}|textit}
+\begin{NiceTabular}{cccc}
+\hline
+\RowStyle[cell-space-limits=3pt]{\rotate}
+first & second & third & fourth \\
+\RowStyle[nb-rows=2,rowcolor=blue!50,color=white]{\sffamily}
+1 & 2 & 3 & 4 \\
+I & II & III & IV \\
+\end{NiceTabular}
+
+\medskip
+The command |\rotate| is described p.~\pageref{rotate}.
+
+\section{The width of the columns}
+
+\label{width}
+\index{width@\textbf{Width of the columns}|(}
+
+\subsection{Basic tools}
+
+In the environments with an explicit preamble (like |{NiceTabular}|,
+|{NiceArray}|, etc.), it's possible to fix the width of a given column with
+the standard letters |w|, |W|, |p|, |b| and |m| of the package \pkg{array}.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{NiceTabular}{~emphase#W{c}{2cm}@cc}[hvlines]
+Paris & New York & Madrid \\
+Berlin & London & Roma \\
+Rio & Tokyo & Oslo
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{W{c}{2cm}cc}[hvlines]
+Paris & New York & Madrid \\
+Berlin & London & Roma \\
+Rio & Tokyo & Oslo
+\end{NiceTabular}
+
+
+\bigskip
+\index{columns-width}
+In the environments of \pkg{nicematrix}, it's also possible to fix the \emph{minimal}
+width of all the columns (excepted the potential exterior columns: cf. p.~\pageref{exterior}) directly
+with the key |columns-width|.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$\begin{pNiceMatrix}[~emphase#columns-width = 1cm@]
+1 & 12 & -123 \\
+12 & 0 & 0 \\
+4 & 1 & 2
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}[columns-width = 1cm]
+1 & 12 & -123 \\
+12 & 0 & 0 \\
+4 & 1 & 2
+\end{pNiceMatrix}$
+
+\medskip
+Note that the space inserted between two columns (equal to 2 |\tabcolsep| in
+|{NiceTabular}| and to 2 |\arraycolsep| in the other environments)
+is not suppressed (of course, it's possible to suppress this space by setting
+|\tabcolsep| or |\arraycolsep| equal to $0$~pt before the environment).
+
+\bigskip
+It's possible to give the special value |auto| to the option |columns-width|:
+all the columns of the array will have a width equal to the widest cell of the
+array.\footnote{The result is achieved with only one compilation (but PGF/Tikz
+will have written informations in the |aux| file and a message requiring a
+second compilation will appear).}\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$\begin{pNiceMatrix}[~emphase#columns-width = auto@]
+1 & 12 & -123 \\
+12 & 0 & 0 \\
+4 & 1 & 2
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}[columns-width = auto]
+1 & 12 & -123 \\
+12 & 0 & 0 \\
+4 & 1 & 2
+\end{pNiceMatrix}$
+
+\bigskip
+Without surprise, it's possible to fix the minimal width of the columns of all
+the arrays of a current scope with the command
+|\NiceMatrixOptions|.\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
+~emphase#\NiceMatrixOptions{columns-width=10mm}@
+$\begin{pNiceMatrix}
+a & b \\ c & d
+\end{pNiceMatrix}
+=
+\begin{pNiceMatrix}
+1 & 1245 \\ 345 & 2
+\end{pNiceMatrix}$
+\end{BVerbatim}
+\begin{scope}
+\NiceMatrixOptions{columns-width=10mm}
+$\begin{pNiceMatrix}
+a & b \\
+c & d
+\end{pNiceMatrix}
+=
+\begin{pNiceMatrix}
+1 & 1245 \\
+345 & 2
+\end{pNiceMatrix}$
+\end{scope}
+
+
+\bigskip
+\index{NiceMatrixBlock@\texttt{\{NiceMatrixBlock\}}}
+\index{auto-columns-width!(key of \texttt{\{NiceMatrixBlock\}})}
+It's also possible to fix a zone where all the matrices will have their
+columns of the same width, equal to the widest cell of all the matrices. This
+construction uses the environment |{NiceMatrixBlock}| with the option
+|auto-columns-width|\footnote{At this time, this is the only usage of the
+environment |{NiceMatrixBlock}| but it may have other usages in the future.}.
+The environment |{NiceMatrixBlock}| has no direct link with the command
+|\Block| presented previously in this document (cf.~p.~\pageref{Block}).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
+~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
+$\begin{array}{c}
+\begin{bNiceMatrix}
+ 9 & 17 \\ -2 & 5
+ \end{bNiceMatrix} \\ \\
+\begin{bNiceMatrix}
+ 1 & 1245345 \\ 345 & 2
+\end{bNiceMatrix}
+\end{array}$
+~emphase#\end{NiceMatrixBlock}@
+\end{BVerbatim}
+\begin{NiceMatrixBlock}[auto-columns-width]
+$\begin{array}{c}
+\begin{bNiceMatrix}
+ 9 & 17 \\ -2 & 5
+ \end{bNiceMatrix} \\ \\
+\begin{bNiceMatrix}
+ 1 & 1245345 \\ 345 & 2
+\end{bNiceMatrix}
+\end{array}$
+\end{NiceMatrixBlock}
+
+\subsection{The columns X}
+
+\label{X-columns}
+\index{tabularx@\pkg{tabularx} (package)}
+\index{NiceTabularX@\texttt{\{NiceTabularX\}}}
+\index{X (the columns X)}
+\index{width!key of \texttt{\{NiceTabular\}}}
+
+The environment |{NiceTabular}| provides |X| columns similar to those provided
+by the environment |{tabularx}| of the eponymous package.
+
+The required width of the tabular may be specified with the key |width| (in
+|{NiceTabular}| or in |\NiceMatrixOptions|). The initial value of this
+parameter is |\linewidth| (and not |\textwidth|).
+
+For sake of similarity with the environment |{tabularx}|, \pkg{nicematrix}
+also provides an environment |{NiceTabularX}| with a syntax similar to the
+syntax of |{tabularx}|, that is to say with a first mandatory argument
+which is the width of the tabular.\footnote{If \pkg{tabularx} is loaded, one
+must use |{NiceTabularX}| (and not |{NiceTabular}|) in order to use the
+columns |X| (this point comes from a conflict in the definitions of the
+specifier |X|).}
+
+As with the packages \pkg{tabu}\footnote{The extension \pkg{tabu} is now
+considered as deprecated.} and \pkg{tabularray}, the specifier |X| takes
+in an optional argument (between square brackets) which is a list of keys.
+\begin{itemize}
+\item It's possible to give a weight for the column by providing a positive
+integer directly as argument of the specifier |X|. For example, a column
+|X[2]| will have a width double of the width of a column~|X| (which has a
+weight equal to $1$).\footnote{The negative values of the weight, as provided
+by \pkg{tabu} (which is now obsolete), are \emph{not} supported by \pkg{nicematrix}.
+If such a value is used, an error will be raised.}
+\item It's possible to specify an horizontal alignment with one of the
+letters |l|, |c| and |r| (which insert respectively |\raggedright|,
+|\centering| and |\raggedleft| followed by |\arraybackslash|).
+\item It's possible to specify a vertical alignment with one of the keys
+|t| (alias |p|), |m| and |b| (which construct respectively columns of type
+|p|, |m| and |b|). The default value is |t|.
+\end{itemize}
+
+\begin{Verbatim}
+\begin{NiceTabular}~emphase#[width=9cm]{X[2,l]X[l]}@[hvlines]
+a rather long text which fits on several lines
+& a rather long text which fits on several lines \\
+a shorter text & a shorter text
+\end{NiceTabular}
+\end{Verbatim}
+
+\begin{center}
+\begin{NiceTabular}[width=9cm]{X[2,l]X[l]}[hvlines]
+a rather long text which fits on several lines
+& a rather long text which fits on several lines \\
+a shorter text & a shorter text
+\end{NiceTabular}
+\end{center}
+
+
+\subsection{The columns V of varwidth}
+
+\label{varwidth}
+\index{varwidth@\pkg{varwidth} (package)}
+\index{V (the columns V of \pkg{varwidth})}
+
+
+Let's recall first the behaviour of the environment |{varwidth}| of the
+eponymous package \pkg{varwidth}. That environment is similar to the classical
+environment |{minipage}| but the width provided in the argument is only the
+\emph{maximal} width of the created box. In the general case, the width of the
+box constructed by an environment |{varwidth}| is the natural width of its
+contents.
+
+\medskip
+That point is illustrated on the following examples.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=6cm]
+\fbox{%
+\begin{~emphase#varwidth@}{8cm}
+\begin{itemize}
+\item first item
+\item second item
+\end{itemize}
+\end{~emphase#varwidth@}}
+\end{BVerbatim}
+\fbox{\begin{varwidth}{8cm}
+\begin{itemize}
+\item first item
+\item second item
+\end{itemize}
+\end{varwidth}}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=6cm]
+\fbox{%
+\begin{~emphase#minipage@}{8cm}
+\begin{itemize}
+\item first item
+\item second item
+\end{itemize}
+\end{~emphase#minipage@}}
+\end{BVerbatim}
+\fbox{\begin{minipage}{8cm}
+\begin{itemize}
+\item first item
+\item second item
+\end{itemize}
+\end{minipage}}
+
+
+\bigskip
+The package \pkg{varwidth} provides also the column type |V|. A column of type
+|V{|$\langle$\textsl{dim}$\rangle$|}| encapsulates all its cells in a
+|{varwidth}| with the argument $\langle$\textsl{dim}$\rangle$ (and does also some tuning).
+
+\smallskip
+When the package \pkg{varwidth} is loaded, the columns |V| of \pkg{varwidth}
+are supported by \pkg{nicematrix}.
+
+\medskip
+\begin{Verbatim}
+\begin{NiceTabular}[corners=NW,hvlines]{~emphase#V{3cm}V{3cm}V{3cm}@}
+& some text & some very very very long text \\
+some very very very long text \\
+some very very very long text
+\end{NiceTabular}
+\end{Verbatim}
+
+\medskip
+\begin{center}
+\begin{NiceTabular}[corners=NW,hvlines]{V{3cm}V{3cm}V{3cm}}
+& some text & some very very very long text \\
+some very very very long text \\
+some very very very long text
+\end{NiceTabular}
+\end{center}
+
+\bigskip
+Concerning \pkg{nicematrix}, one of the
+interests of this type of columns is that, for a cell of a column of type~|V|,
+the PGF/Tikz node created by \pkg{nicematrix} for the content of that cell has
+a width adjusted to the content of the cell : cf. p.~\pageref{node-V}.
+
+
+\bigskip
+The columns |V| of \pkg{nicematrix} supports the keys |t|, |p|, |m|, |b|, |l|,
+|c| and |r| also supported by the columns |X|: see their description in the
+section~\ref{X-columns}, p.~\pageref{X-columns}.
+
+\bigskip
+One should remark that the extension \pkg{varwidth} (at least in its version
+0.92) has some problems: for instance, with LuaLaTeX, it does not work when
+the content begins with |\color|.
+
+\index{width@\textbf{Width of the columns}|)}
+
+
+\bigskip
+\section{The exterior rows and columns}
+
+\index{first-row}
+\index{last-row}
+\index{first-col}
+\index{last-col}
+
+The options |first-row|, |last-row|, |first-col| and |last-col| allow the
+composition of exterior rows and columns in the environments of
+\pkg{nicematrix}. It's particularly interesting for the (mathematical)
+matrices.
+\label{exterior}
+
+A potential ``first row'' (exterior) has the number $0$ (and not $1$). Idem
+for the potential ``first column''.
+
+\begin{Verbatim}
+$\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@,nullify-dots]
+ & C_1 & \Cdots & & C_4 & \\
+L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+\Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+ & a_{31} & a_{32} & a_{33} & a_{34} & \\
+L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+ & C_1 & \Cdots & & C_4 &
+\end{pNiceMatrix}$
+\end{Verbatim}
+
+\[\begin{pNiceMatrix}[first-row,last-row,first-col,last-col,nullify-dots]
+ & C_1 & \Cdots & & C_4 & \\
+L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+\Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+ & a_{31} & a_{32} & a_{33} & a_{34} & \\
+L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+ & C_1 & \Cdots & & C_4 &
+\end{pNiceMatrix}\]
+
+\medskip
+The dotted lines have been drawn with the tools presented p.~\pageref{Cdots}.
+
+\bigskip
+We have several remarks to do.
+\begin{itemize}[beginpenalty=10000]
+\item For the environments with an explicit preamble (i.e. |{NiceTabular}|,
+|{NiceArray}| and its variants), no letter must be given in that preamble for
+the potential first column and the potential last column: they will
+automatically (and necessarily) be of type |r| for the first column and |l|
+for the last one.\footnote{The users wishing exterior columns with another
+type of alignment should consider the command |\SubMatrix| available in the
+|\CodeAfter| (cf.~p.~\pageref{sub-matrix}).}
+\item One may wonder how \pkg{nicematrix} determines the number of rows and
+columns which are needed for the composition of the ``last row'' and ``last
+column''.
+\begin{itemize}
+\item For the environments with explicit preamble, like |{NiceTabular}| and
+|{pNiceArray}|, the number of columns can obviously be computed from the
+preamble.
+
+\item When the option |light-syntax| (cf. p. \pageref{light-syntax}) is used,
+\pkg{nicematrix} has, in any case, to load the whole body of the environment
+(and that's why it's not possible to put verbatim material in the array with
+the option |light-syntax|). The analysis of this whole body gives the number
+of rows and the number of columns.
+
+\item In the other cases, \pkg{nicematrix} compute the number of rows and
+columns during the first compilation and write the result in the |aux| file
+for the next run.
+
+\textsl{However, it's possible to provide the number of the last row and the
+number of the last column as values of the options |last-row| and |last-col|,
+tending to an acceleration of the whole compilation of the document.} That's
+what we will do throughout the rest of the document.
+\end{itemize}
+\end{itemize}
+
+\bigskip
+\index{code-for-first-row}
+\index{code-for-first-col}
+\index{code-for-last-row}
+\index{code-for-last-col}
+It's possible to control the appearance of these rows and columns with options
+|code-for-first-row|, |code-for-last-row|, |code-for-first-col| and
+|code-for-last-col|. These options specify tokens that will be inserted before
+each cell of the corresponding row or column.
+
+
+\begin{Verbatim}
+\NiceMatrixOptions{~emphase#code-for-first-row@ = \color{red},
+ ~emphase#code-for-first-col@ = \color{blue},
+ ~emphase#code-for-last-row@ = \color{green},
+ ~emphase#code-for-last-col@ = \color{magenta}}
+$\begin{pNiceArray}{cc|cc}[first-row,last-row=5,first-col,last-col,nullify-dots]
+ & C_1 & \Cdots & & C_4 & \\
+L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+\Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+\hline
+ & a_{31} & a_{32} & a_{33} & a_{34} & \\
+L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+ & C_1 & \Cdots & & C_4 &
+\end{pNiceArray}$
+\end{Verbatim}
+
+\begin{scope}
+\NiceMatrixOptions{code-for-first-row = \color{red},
+ code-for-first-col = \color{blue},
+ code-for-last-row = \color{green},
+ code-for-last-col = \color{magenta}}
+\begin{displaymath}
+\begin{pNiceArray}{cc|cc}[first-row,last-row=5,first-col,last-col,nullify-dots]
+ & C_1 & \multicolumn1c{\Cdots} & & C_4 & \\
+L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
+\Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
+\hline
+ & a_{31} & a_{32} & a_{33} & a_{34} & \\
+L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
+ & C_1 & \multicolumn1c{\Cdots} & & C_4 &
+\end{pNiceArray}
+\end{displaymath}
+\end{scope}
+
+
+\emph{Remarks}
+\begin{itemize}[beginpenalty=10000]
+\item As shown in the previous example, the horizontal and vertical rules
+don't extend in the exterior rows and columns. This remark also applies to the
+customized rules created by the key |custom-line|
+(cf.~p.~\pageref{custom-line}).
+
+\item A specification of color present in |code-for-first-row| also applies to
+a dotted line drawn in that exterior ``first row'' (excepted if a value has
+been given to |xdots/color|). Idem for the other exterior rows and columns.
+
+\item Logically, the potential option |columns-width| (described
+p.~\pageref{width}) doesn't apply to the ``first column'' and ``last column''.
+
+\item For technical reasons, it's not possible to use the option of the
+command |\\| after the ``first row'' or before the ``last row''. The placement
+of the delimiters would be wrong. If you are looking for a workaround,
+consider the command |\SubMatrix| in the |\CodeAfter| described
+p.~\pageref{sub-matrix}.
+\end{itemize}
+
+
+
+
+
+\section{The continuous dotted lines}
+
+\label{Cdots}
+\index{dotted@\textbf{Dotted lines}|(}
+\indexcommand{Ldots}
+\indexcommand{Cdots}
+\index{Ddots@\texttt{\textbackslash Ddots}|textbf}
+\index{Iddots@\texttt{\textbackslash Iddots}|textbf}
+\indexcommand{Vdots}
+\index{mathdots@\pkg{mathdots} (package)}
+\index{xdots (and its subkeys)}
+
+Inside the environments of the package \pkg{nicematrix}, new commands are
+defined: |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, and |\Iddots|. These commands
+are intended to be used in place of |\dots|, |\cdots|, |\vdots|, |\ddots| and
+|\iddots|.\footnote{The command |\iddots|, defined in \pkg{nicematrix}, is a
+variant of |\ddots| with dots going forward. If |mathdots| is loaded, the
+version of |mathdots| is used. It corresponds to the command |\adots| of
+\pkg{unicode-math}.}
+\newcounter{fniddots}
+\setcounter{fniddots}{\thefootnote}
+
+\smallskip
+Each of them must be used alone in the cell of the array and it draws a dotted
+line between the first non-empty cells\footnote{The precise definition of a
+``non-empty cell'' is given below (cf. p.~\pageref{empty-cells}).} on both
+sides of the current cell. Of course, for |\Ldots| and |\Cdots|, it's an
+horizontal line; for |\Vdots|, it's a vertical line and for |\Ddots| and
+|\Iddots| diagonal ones. It's possible to change the color of these lines
+with the option |color|.\footnote{It's also possible to change the color of
+all these dotted lines with the option |xdots/color| (\textsl{xdots} to
+remind that it works for |\Cdots|, |\Ldots|, |\Vdots|, etc.): cf. p.
+\pageref{customisation}.}\par\nobreak
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{bNiceMatrix}
+a_1 & \Cdots & & & a_1 \\
+\Vdots & a_2 & \Cdots & & a_2 \\
+ & \Vdots & \Ddots[color=red] \\
+\\
+a_1 & a_2 & & & a_n
+\end{bNiceMatrix}
+\end{BVerbatim}
+$\begin{bNiceMatrix}
+a_1 & \Cdots & & & a_1 \\
+\Vdots & a_2 & \Cdots & & a_2 \\
+ & \Vdots & \Ddots[color=red] \\
+\\
+a_1 & a_2 & & & a_n
+\end{bNiceMatrix}$
+
+\interitem
+In order to represent the null matrix, one can use the following
+codage:\par\nobreak
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{bNiceMatrix}
+0 & \Cdots & 0 \\
+\Vdots & & \Vdots \\
+0 & \Cdots & 0
+\end{bNiceMatrix}
+\end{BVerbatim}
+$\begin{bNiceMatrix}
+0 & \Cdots & 0 \\
+\Vdots & & \Vdots \\
+0 & \Cdots & 0
+\end{bNiceMatrix}$
+
+\bigskip
+However, one may want a larger matrix. Usually, in such a case, the users of
+LaTeX add a new row and a new column. It's possible to use the same method
+with \pkg{nicematrix}:\par\nobreak
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{bNiceMatrix}
+0 & \Cdots & \Cdots & 0 \\
+\Vdots & & & \Vdots \\
+\Vdots & & & \Vdots \\
+0 & \Cdots & \Cdots & 0
+\end{bNiceMatrix}
+\end{BVerbatim}
+$\begin{bNiceMatrix}
+0 & \Cdots & \Cdots & 0 \\
+\Vdots & & & \Vdots \\
+\Vdots & & & \Vdots \\
+0 & \Cdots & \Cdots & 0
+\end{bNiceMatrix}$
+
+\bigskip
+In the first column of this example, there are two instructions |\Vdots| but,
+of course, only one dotted line is drawn.
+
+\bigskip
+In fact, in this example, it would be possible to draw the same matrix more
+easily with the following code:\par\nobreak
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{bNiceMatrix}
+0 & \Cdots & & 0 \\
+\Vdots & & & \\
+ & & & \Vdots \\
+0 & & \Cdots & 0
+\end{bNiceMatrix}
+\end{BVerbatim}
+$\begin{bNiceMatrix}
+0 & \Cdots & & 0 \\
+\Vdots & & & \\
+ & & & \Vdots \\
+0 & & \Cdots & 0
+\end{bNiceMatrix}$
+
+\bigskip
+There are also other means to change the size of the matrix. Someone might
+want to use the optional argument of the command~|\\| for the vertical
+dimension and a command~|\hspace*| in a cell for the horizontal
+dimension.\footnote{In \pkg{nicematrix}, one should use |\hspace*| and not
+|\hspace| for such an usage because \pkg{nicematrix} loads \pkg{array}. One
+may also remark that it's possible to fix the width of a column by using the
+environment |{NiceArray}| (or one of its variants) with a column of type~|w|
+or~|W|: see p.~\pageref{width}}
+
+\indexcommand{Hspace}
+However, a command~|\hspace*| might interfer with the construction of the
+dotted lines. That's why the package \pkg{nicematrix} provides a
+command~|\Hspace| which is a variant of |\hspace| transparent for the dotted
+lines of \pkg{nicematrix}.\par\nobreak
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{bNiceMatrix}
+0 & \Cdots & ~emphase#\Hspace*{1cm}@ & 0 \\
+\Vdots & & & \Vdots \\~emphase#[1cm]@
+0 & \Cdots & & 0
+\end{bNiceMatrix}
+\end{BVerbatim}
+$\begin{bNiceMatrix}
+0 & \Cdots & \Hspace*{1cm} & 0 \\
+\Vdots & & & \Vdots \\[1cm]
+0 & \Cdots & & 0
+\end{bNiceMatrix}$
+
+\subsection{The option nullify-dots}
+
+\index{nullify-dots}
+
+Consider the following matrix composed classicaly with the environment
+|{pmatrix}| of \pkg{amsmath}.\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$A = \begin{pmatrix}
+h & i & j & k & l & m \\
+x & & & & & x
+\end{pmatrix}$
+\end{BVerbatim}
+$A = \begin{pmatrix}
+h & i & j & k & l & m \\
+x & & & & & x
+\end{pmatrix}$
+
+
+\bigskip
+If we add |\ldots| instructions in the second row, the geometry of the
+matrix is modified.\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$B = \begin{pmatrix}
+h & i & j & k & l & m \\
+x & \ldots & \ldots & \ldots & \ldots & x
+\end{pmatrix}$
+\end{BVerbatim}
+$B = \begin{pmatrix}
+h & i & j & k & l & m \\
+x & \ldots & \ldots & \ldots & \ldots & x
+\end{pmatrix}$
+
+\bigskip
+By default, with \pkg{nicematrix}, if we replace |{pmatrix}| by
+|{pNiceMatrix}| and |\ldots| by |\Ldots|, the geometry of the matrix is not
+changed.\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$C = \begin{pNiceMatrix}
+h & i & j & k & l & m \\
+x & \Ldots & \Ldots & \Ldots & \Ldots & x
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$C = \begin{pNiceMatrix}
+h & i & j & k & l & m \\
+x & \Ldots & \Ldots & \Ldots & \Ldots & x
+\end{pNiceMatrix}$
+
+\bigskip
+However, one may prefer the geometry of the first matrix $A$ and would like to
+have such a geometry with a dotted line in the second row. It's possible by
+using the option |nullify-dots| (and only one instruction |\Ldots| is
+necessary).\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$D = \begin{pNiceMatrix}[~emphase#nullify-dots@]
+h & i & j & k & l & m \\
+x & \Ldots & & & & x
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$D = \begin{pNiceMatrix}[nullify-dots]
+h & i & j & k & l & m \\
+x & \Ldots & & & & x
+\end{pNiceMatrix}$
+
+\medskip
+The option |nullify-dots| smashes the instructions |\Ldots| (and the variants)
+horizontally but also vertically.
+
+
+
+\subsection{The commands \textbackslash Hdotsfor and \textbackslash Vdotsfor}
+
+\indexcommand{Hdotsfor}
+\indexcommand{Vdotsfor}
+
+Some people commonly use the command |\hdotsfor| of \pkg{amsmath} in order to
+draw horizontal dotted lines in a matrix. In the environments of
+\pkg{nicematrix}, one should use instead |\Hdotsfor| in order to draw dotted
+lines similar to the other dotted lines drawn by the package \pkg{nicematrix}.
+
+As with the other commands of \pkg{nicematrix} (like |\Cdots|, |\Ldots|,
+|\Vdots|, etc.), the dotted line drawn with |\Hdotsfor| extends until the
+contents of the cells on both sides.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=7cm]
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 \\
+1 & ~emphase#\Hdotsfor{3}@ & 5 \\
+1 & 2 & 3 & 4 & 5 \\
+1 & 2 & 3 & 4 & 5
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 \\
+1 & \Hdotsfor{3} & 5 \\
+1 & 2 & 3 & 4 & 5 \\
+1 & 2 & 3 & 4 & 5
+\end{pNiceMatrix}$
+
+\bigskip
+However, if these cells are empty, the dotted line extends only in the cells
+specified by the argument of |\Hdotsfor| (by design).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=7cm]
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 \\
+ & ~emphase#\Hdotsfor{3}@ \\
+1 & 2 & 3 & 4 & 5 \\
+1 & 2 & 3 & 4 & 5
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 \\
+ & \Hdotsfor{3} \\
+1 & 2 & 3 & 4 & 5 \\
+1 & 2 & 3 & 4 & 5
+\end{pNiceMatrix}$
+
+\medskip
+Remark: Unlike the command |\hdotsfor| of \pkg{amsmath}, the command
+|\Hdotsfor| may be used even when the package \pkg{colortbl}\footnote{We
+recall that when \pkg{xcolor} is loaded with the option |table|, the
+package \pkg{colortbl} is loaded.} is loaded (but you might have problem if
+you use |\rowcolor| on the same row as |\Hdotsfor|).
+
+\bigskip
+The package \pkg{nicematrix} also provides a command |\Vdotsfor| similar to
+|\Hdotsfor| but for the vertical dotted lines.
+\bigskip
+The following example uses both |\Hdotsfor| and |\Vdotsfor|:
+
+\begin{Verbatim}[formatcom=\small\color{gray}]
+\begin{bNiceMatrix}
+C[a_1,a_1] & \Cdots & C[a_1,a_n]
+ & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\
+\Vdots & \Ddots & \Vdots
+ & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\
+C[a_n,a_1] & \Cdots & C[a_n,a_n]
+ & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\
+\rule{0pt}{15mm}\NotEmpty & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\
+C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n]
+ & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\
+\Vdots & \Ddots & \Vdots
+ & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\
+C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n]
+ & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}]
+\end{bNiceMatrix}
+\end{Verbatim}
+
+
+\[\begin{bNiceMatrix}
+C[a_1,a_1] & \Cdots & C[a_1,a_n] & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\
+\Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\
+C[a_n,a_1] & \Cdots & C[a_n,a_n] & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\
+\rule{0pt}{15mm}\NotEmpty & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\
+C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\
+\Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\
+C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n] & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}]
+\end{bNiceMatrix}\]
+
+
+
+
+\subsection{How to generate the continuous dotted lines transparently}
+
+\index{renew-matrix}
+\index{renew-dots}
+
+Imagine you have a document with a great number of mathematical matrices with
+ellipsis. You may wish to use the dotted lines of \pkg{nicematrix} without
+having to modify the code of each matrix. It's possible with the keys.
+|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|.}
+
+\smallskip
+
+\begin{itemize}
+\item The option |renew-dots|\par\nobreak
+
+With this option, the commands |\ldots|, |\cdots|, |\vdots|, |\ddots|,
+|\iddots|\footnotemark[\thefniddots] and |\hdotsfor| are redefined within the
+environments provided by \pkg{nicematrix} and behave like |\Ldots|, |\Cdots|,
+|\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor|; the command |\dots|
+(``automatic dots'' of |amsmath|) is also redefined to behave like |\Ldots|.
+
+\item The option |renew-matrix|\par\nobreak
+
+With this option, the environment |{matrix}| is redefined and behave like
+|{NiceMatrix}|, and so on for the five variants.
+\end{itemize}
+
+\bigskip
+Therefore, with the keys |renew-dots| and |renew-matrix|, a classical code
+gives directly the ouput of \pkg{nicematrix}.\par\nobreak
+
+\bigskip
+\begin{scope}
+\NiceMatrixOptions{renew-dots,renew-matrix}
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+~emphase#\NiceMatrixOptions{renew-dots,renew-matrix}@
+\begin{pmatrix}
+1 & \cdots & \cdots & 1 \\
+0 & \ddots & & \vdots \\
+\vdots & \ddots & \ddots & \vdots \\
+0 & \cdots & 0 & 1
+\end{pmatrix}
+\end{BVerbatim}
+$\begin{pmatrix}
+1 & \cdots & \cdots & 1 \\
+0 & \ddots & & \vdots \\
+\vdots & \ddots & \ddots & \vdots \\
+0 & \cdots & 0 & 1
+\end{pmatrix}$
+\end{scope}
+
+\subsection{The labels of the dotted lines}
+
+The commands |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor|
+(and the command |\line| in the |\CodeAfter| which is described
+p.~\pageref{line-in-code-after}) accept two optional arguments specified
+by the tokens |_| and |^| for labels positionned below and above the line. The
+arguments are composed in math mode with |\scriptstyle|.
+
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$\begin{bNiceMatrix}
+1 & \hspace*{1cm} & 0 \\[8mm]
+ & ~emphase#\Ddots^{n \text{ times}}@ & \\
+0 & & 1
+\end{bNiceMatrix}$
+\end{BVerbatim}
+$\begin{bNiceMatrix}
+1 & \hspace*{1cm} & 0 \\[8mm]
+ & \Ddots^{n \text{ times}} & \\
+0 & & 1
+\end{bNiceMatrix}$
+
+\subsection{Customisation of the dotted lines}
+
+\label{customisation}
+\index{color!key for the dotted rules}
+\index{radius (key for the dotted rules)}
+\index{inter (key for the dotted rules)}
+\index{line-style (key for the dotted rules)}
+\index{shorten (key for the dotted rules)}
+\index{shorten-end (key for the dotted rules)}
+\index{shorten-start (key for the dotted rules)}
+
+The dotted lines drawn by |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots|,
+|\Hdotsfor| and |\Vdotsfor| (and by the command |\line| in the |\CodeAfter|
+which is described p.~\pageref{line-in-code-after}) may be customized by the following
+options (specified between square brackets after the command):
+\begin{itemize}
+\item |color|;
+\item |radius|;
+\item |shorten-start|, |shorten-end| and |shorten|;
+\item |inter|;
+\item |line-style|.
+\end{itemize}
+
+These options may also be fixed with |\NiceMatrixOptions|, as options of
+|\CodeAfter| or at the level of a given environment but, in those cases, they
+must be prefixed by |xdots| (\textsl{xdots} to remind that it works for
+|\Cdots|, |\Ldots|, |\Vdots|, etc.), and, thus have for names:
+\begin{itemize}
+\item |xdots/color|;
+\item |xdots/radius|;
+\item |xdots/shorten-start|, |xdots/shorten-end| and |xdots/shorten|;
+\item |xdots/inter|;
+\item |xdots/line-style|.
+\end{itemize}
+
+For the clarity of the explanations, we will use those names.
+
+\bigskip
+\textbf{The option xdots/color}\par\nobreak
+
+\smallskip
+The option |xdots/color| fixes the color or the dotted line. However, one should
+remark that the dotted lines drawn in the exterior rows and columns have a
+special treatment: cf. p.~\pageref{exterior}.
+
+\bigskip
+\textbf{The option xdots/radius}\par\nobreak
+
+The option |radius| fixes the radius of the dots. The initial value is 0.53~pt.
+
+\bigskip
+\textbf{The option xdots/shorten}\par\nobreak
+
+\smallskip
+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).
+
+\bigskip
+\textbf{The option xdots/inter}\par\nobreak
+
+\smallskip
+The option |xdots/inter| fixes the length between the dots. The initial value
+is 0.45~em (it is recommanded to use a unit of length dependent of the current
+font).
+
+\bigskip
+\textbf{The option xdots/line-style}\par\nobreak
+
+\smallskip
+It should be pointed that, by default, the lines drawn by Tikz with the
+parameter |dotted| are composed of square dots (and not rounded
+ones).\footnote{The first reason of this behaviour is that the \textsc{pdf}
+format includes a description for dashed lines. The lines specified with this
+descriptor are displayed very efficiently by the \textsc{pdf} readers. It's
+easy, starting from these dashed lines,
+to create a line composed by square dots whereas a line of rounded dots needs
+a specification of each dot in the \textsc{pdf} file. Nevertheless, you can
+have a look at the following page to see how to have dotted rules with rounded
+dots in Tikz:\newline \small
+\url{https://tex.stackexchange.com/questions/52848/tikz-line-with-large-dots}}
+
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\tikz \draw [dotted] (0,0) -- (5,0) ;
+\end{BVerbatim}
+\tikz \draw [dotted] (0,0) -- (5,0) ;
+
+\medskip
+In order to provide lines with rounded dots in the style of those provided by
+|\ldots| (at least with the \emph{Computer Modern} fonts), the package
+\pkg{nicematrix} embeds its own system to draw a dotted line (and this system
+uses \textsc{pgf} and not Tikz). This style is called |standard| and that's
+the initial value of the parameter |xdots/line-style|.
+
+However (when Tikz is loaded) it's possible to use for |xdots/line-style| any style
+provided by Tikz, that is to say any sequence of options provided by Tikz for
+the Tizk pathes (with the exception of ``|color|'', ``|shorten >|'' and
+``|shorten <|'').
+
+\medskip
+Here is for example a tridiagonal matrix with the style |loosely dotted|:\par\nobreak
+
+\medskip
+\begin{BVerbatim}[baseline=c]
+$\begin{pNiceMatrix}[nullify-dots,~emphase#xdots/line-style=loosely dotted@]
+a & b & 0 & & \Cdots & 0 \\
+b & a & b & \Ddots & & \Vdots \\
+0 & b & a & \Ddots & & \\
+ & \Ddots & \Ddots & \Ddots & & 0 \\
+\Vdots & & & & & b \\
+0 & \Cdots & & 0 & b & a
+\end{pNiceMatrix}$
+\end{BVerbatim}
+
+
+\[\begin{pNiceMatrix}[nullify-dots,xdots/line-style=loosely dotted]
+a & b & 0 & & \Cdots & 0 \\
+b & a & b & \Ddots & & \Vdots \\
+0 & b & a & \Ddots & & \\
+ & \Ddots & \Ddots & \Ddots & & 0 \\
+\Vdots & & & & & b \\
+0 & \Cdots & & 0 & b & a
+\end{pNiceMatrix}\]
+
+
+\subsection{The dotted lines and the rules}
+
+\label{dotted-and-rules}
+
+The dotted lines determine virtual blocks which have the same behaviour
+regarding the rules (the rules specified by the specifier \verb+|+ in the
+preamble, by the command |\Hline|, by the keys |hlines|, |vlines|,
+|hvlines| and |hvlines-except-borders| and by the tools created by
+|custom-line| are not drawn within the
+blocks).\footnote{On the other side, the command |\line| in the
+|\CodeAfter| (cf.~p.~\pageref{line-in-code-after}) does \emph{not} create
+block.}
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{bNiceMatrix}[margin,~emphase#hvlines@]
+\Block{3-3}<\LARGE>{A} & & & 0 \\
+& \hspace*{1cm} & & \Vdots \\
+& & & 0 \\
+0 & \Cdots& 0 & 0
+\end{bNiceMatrix}$
+\end{BVerbatim}
+$\begin{bNiceMatrix}[margin,hvlines]
+\Block{3-3}<\LARGE>{A} & & & 0 \\
+& \hspace*{1cm} & & \Vdots \\
+& & & 0 \\
+0 & \Cdots& 0 & 0
+\end{bNiceMatrix}$
+
+\index{dotted@\textbf{Dotted lines}|)}
+
+\section{Delimiters in the preamble of the environment}
+
+\index{blkarray@\pkg{blkarray} (package)}
+
+\label{delimiters-in-preamble}
+
+In the environments with preamble (|{NiceArray}|, |{pNiceArray}|, etc.), it's
+possible to put vertical delimiters directly in the preamble of the
+environment.\footnote{This syntax is inspired by the extension \pkg{blkarray}.}
+
+\smallskip
+\index{left@\texttt{\textbackslash left} : used by \pkg{nicematrix} for\newline
+ delimiters in the preambles}
+\index{right@\texttt{\textbackslash right} : used by \pkg{nicematrix} for\newline
+ delimiters in the preambles}
+The opening delimiters should be prefixed by the keyword |\left| and the
+closing delimiters by the keyword |\right|. It's not mandatory to use
+|\left| and |\right| pair-wise.
+
+\smallskip
+All the vertical extensible delimiters of LaTeX are allowed.
+
+\medskip
+Here is a example which uses the delimiters |\lgroup| and |\rgroup|.
+
+\smallskip
+\begin{BVerbatim}
+$\begin{NiceArray}{~emphase#\left\lgroup@ ccc~emphase#\right\rgroup@ l}
+1 & 2 & 3 &
+4 & 1 & 6 &
+7 & 8 & 9 & \scriptstyle L_3 \gets L_3 + L_1 + L_2
+\end{NiceArray}$
+\end{BVerbatim}
+
+\[\begin{NiceArray}{\left\lgroup ccc\right\rgroup l}
+1 & 2 & 3 & \\
+4 & 1 & 6 & \\
+7 & 8 & 9 & \scriptstyle L_3 \gets L_3 + L_1 + L_2
+\end{NiceArray}\]
+
+\medskip
+For this example, it would also have been possible to use the environment
+|{NiceArrayWithDelims}| (cf. the section \ref{NiceArrayWithDelims},
+p.~\pageref{NiceArrayWithDelims}) and the key |last-col| (cf. p.~\pageref{exterior}).
+
+\bigskip
+There is a particular case: for the delimiters |(|, |[| and |\{| (and the
+corresponding closing delimiters), the prefixes |\left| et |\right| are
+optional.\footnote{For the delimiters |[| and |]|, the prefixes remain mandatory
+when there is a conflict of notation with the square brackets for the options
+of some descriptors of columns.}
+
+
+
+\bigskip
+When there are two successive delimiters (necessarily a closing one following by
+an opening one for another submatrix), a space equal to |\enskip| is
+automatically inserted.
+
+\medskip
+\begin{BVerbatim}
+$\begin{pNiceArray}{~emphase#(c)(c)(c)@}
+a_{11} & a_{12} & a_{13} \\
+a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
+a_{31} & a_{32} & a_{33}
+\end{pNiceArray}$
+\end{BVerbatim}
+
+\[\begin{pNiceArray}{(c)(c)(c)}
+a_{11} & a_{12} & a_{13} \\
+a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
+a_{31} & a_{32} & a_{33}
+\end{pNiceArray}\]
+
+
+\bigskip
+For more complex constructions, in particular with delimiters spanning only a
+\emph{subset} of the rows of the array, one should consider the command
+|\SubMatrix| available in the |\CodeAfter|. See the section~\ref{sub-matrix},
+p.~\pageref{sub-matrix}.
+
+\section{The \textbackslash CodeAfter}
+
+\index{CodeAfter@\texttt{\textbackslash CodeAfter}|(}
+\index{code-after}
+
+\label{code-after}
+The option |code-after| may be used to give some code that will be executed
+\emph{after} the construction of the matrix.\footnote{There is also a key
+|code-before| described p.~\pageref{code-before}.}
+
+\medskip
+\index{sub-matrix (key of \texttt{\textbackslash CodeAfter}, with subkeys)}
+For the legibility of the code, an alternative syntax is provided: it's
+possible to give the instructions of the |code-after| at the end of the
+environment, after the keyword |\CodeAfter|. Although |\CodeAfter| is a
+keyword, it takes in an optional argument (between square
+brackets).\footnote{Here are the keys accepted in that argument:
+|delimiters/color|, |rules| and its sub-keys and |sub-matrix| (linked to the
+command |\SubMatrix|) and its sub-keys.}
+
+
+\medskip
+The experienced users may, for instance, use the PGF/Tikz nodes created by
+\pkg{nicematrix} in the |\CodeAfter|. These nodes are described further
+beginning on p.~\pageref{PGF-nodes}.
+
+\medskip
+Moreover, several special commands are available in the |\CodeAfter|: |line|,
+|\SubMatrix|, |\OverBrace| and |\UnderBrace|. We will now present these commands.
+
+\subsection{The command \textbackslash line in the \textbackslash CodeAfter}
+
+\label{line-in-code-after}
+\index{line@\texttt{\textbackslash line} (command of \texttt{\textbackslash CodeAfter})}
+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 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
+adjacent cells.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=11cm]
+\NiceMatrixOptions{xdots/shorten = 0.6 em}
+\begin{pNiceMatrix}
+I & 0 & \Cdots &0 \\
+0 & I & \Ddots &\Vdots\\
+\Vdots &\Ddots & I &0 \\
+0 &\Cdots & 0 &I
+~emphase#\CodeAfter \line{2-2}{3-3}@
+\end{pNiceMatrix}
+\end{BVerbatim}
+\begin{scope}
+\NiceMatrixOptions{xdots/shorten = 0.6 em}
+$\begin{pNiceMatrix}
+I & 0 & \Cdots &0 \\
+0 & I & \Ddots &\Vdots\\
+\Vdots &\Ddots & I &0 \\
+0 &\Cdots & 0 &I
+\CodeAfter \line{2-2}{3-3}
+\end{pNiceMatrix}$
+\end{scope}
+
+\bigskip
+It can also be used to draw a diagonal line not parallel to the other diagonal
+lines (by default, the dotted lines drawn by |\Ddots| are ``parallelized'':
+cf.~p.~\pageref{parallelization}).
+
+\medskip
+\begin{BVerbatim}
+\begin{bNiceMatrix}
+1 & \Cdots & & 1 & 2 & \Cdots & 2 \\
+0 & \Ddots & & \Vdots & \Vdots & \hspace*{2.5cm} & \Vdots \\
+\Vdots & \Ddots & & & & & \\
+0 & \Cdots & 0 & 1 & 2 & \Cdots & 2
+~emphase#\CodeAfter \line[shorten=6pt]{1-5}{4-7}@
+\end{bNiceMatrix}
+\end{BVerbatim}
+\[\begin{bNiceMatrix}
+1 & \Cdots & & 1 & 2 & \Cdots & 2 \\
+0 & \Ddots & & \Vdots & \Vdots & \hspace*{2.5cm} & \Vdots \\
+\Vdots & \Ddots & & & & & \\
+0 & \Cdots & 0 & 1 & 2 & \Cdots & 2
+\CodeAfter \line[shorten=6pt]{1-5}{4-7}
+\end{bNiceMatrix}\]
+
+
+
+
+\subsection{The command \textbackslash SubMatrix in the \textbackslash
+CodeAfter (and the \textbackslash CodeBefore)}
+
+\label{sub-matrix}
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})|textbf}
+
+
+The command |\SubMatrix| provides a way to put delimiters on a portion
+of the array considered as a submatrix. The command |\SubMatrix| takes in five
+arguments:
+\begin{itemize}
+\item the first argument is the left delimiter, which may be any extensible delimiter
+provided by LaTeX : |(|, |[|, |\{|, |\langle|, |\lgroup|, |\lfloor|, etc. but also
+the null delimiter |.|;
+\item the second argument is the upper-left corner of the submatrix with the
+syntax $i$|-|$j$ where $i$ the number of row and $j$ the number of column;
+\item the third argument is the lower-right corner with the same syntax;
+\item the fourth argument is the right delimiter;
+\item the last argument, which is optional, is a list of \textsl{key=value}
+pairs.\footnote{There is no optional argument between square brackets in first
+position because a square bracket just after |\SubMatrix| must be interpreted
+as the first (mandatory) argument of the command |\SubMatrix|: that bracket is
+the left delimiter of the sub-matrix to construct (eg.:
+|\SubMatrix[{2-2}{4-7}]|).}
+\end{itemize}
+
+One should remark that the command |\SubMatrix| draws the delimiters \emph{after} the
+construction of the array: no space is inserted by the command |\SubMatrix|
+itself. That's why, in the following example, we have used the key |margin|
+and you have added by hand some space between the third and fourth column with
+|@{\hspace{1.5em}}| in the preamble of the array.
+
+\medskip
+\begin{scope}
+\hfuzz=15cm
+\fvset{commandchars=\~\#\+}%
+\begin{BVerbatim}[boxwidth=11cm,baseline=c]
+\[\begin{NiceArray}{ccc~emphase#@{\hspace{1.5em}}+c}[cell-space-limits=2pt,~emphase#margin+]
+ 1 & 1 & 1 & x \\
+\dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
+ 1 & 2 & 3 & z
+\CodeAfter
+ ~emphase#\SubMatrix({1-1}{3-3})+
+ ~emphase#\SubMatrix({1-4}{3-4})+
+\end{NiceArray}\]
+\end{BVerbatim}
+\end{scope}
+$\begin{NiceArray}{ccc@{\hspace{1.5em}}c}[cell-space-limits=2pt,margin]
+ 1 & 1 & 1 & x \\
+\dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
+ 1 & 2 & 3 & z
+\CodeAfter
+ \SubMatrix({1-1}{3-3})
+ \SubMatrix({1-4}{3-4})
+\end{NiceArray}$
+
+\medskip
+Eventually, in this example, it would probably have been easier to put the
+delimiters directly in the preamble of |{NiceArray}| (see
+section~\ref{delimiters-in-preamble}, p.~\pageref{delimiters-in-preamble})
+with the following construction.
+
+\medskip
+\begin{scope}
+\hfuzz=15cm
+\begin{BVerbatim}[boxwidth=11cm,baseline=c]
+$\begin{NiceArray}{~emphase#(ccc)(c)@}[cell-space-limits=2pt]
+ 1 & 1 & 1 & x \\
+\dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
+ 1 & 2 & 3 & z
+\end{NiceArray}$
+\end{BVerbatim}
+\end{scope}
+$\begin{NiceArray}{(ccc)(c)}[cell-space-limits=2pt]
+ 1 & 1 & 1 & x \\
+\dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
+ 1 & 2 & 3 & z
+\end{NiceArray}$
+
+\bigskip
+In fact, the command |\SubMatrix| also takes in two optional arguments
+specified by the traditional symbols |^| and |_| for material in superscript
+and subscript.
+
+\medskip
+\begin{scope}
+\hfuzz=15cm
+\begin{BVerbatim}[boxwidth=11cm,baseline=c]
+$\begin{bNiceMatrix}[right-margin=1em]
+1 & 1 & 1 \\
+1 & a & b \\
+1 & c & d
+\CodeAfter
+ ~emphase#\SubMatrix[{2-2}{3-3}]^{T}@
+\end{bNiceMatrix}$
+\end{BVerbatim}
+$\begin{bNiceMatrix}[right-margin=1em]
+1 & 1 & 1 \\
+1 & a & b \\
+1 & c & d
+\CodeAfter
+ \SubMatrix[{2-2}{3-3}]^{T}
+\end{bNiceMatrix}$
+\end{scope}
+
+
+\bigskip
+The options of the command |\SubMatrix| are as follows:
+\begin{itemize}
+\item
+\index{left-xshift (key of \texttt{\textbackslash SubMatrix})}
+\index{right-xshift (key of \texttt{\textbackslash SubMatrix})}
+\index{xshift (key of \texttt{\textbackslash SubMatrix})}
+\Definition{left-xshift} and \Definition{right-xshift} shift
+horizontally the delimiters (there exists also the key \Definition{xshift}
+which fixes both parameters);
+\item \index{extra-height (key of \texttt{\textbackslash SubMatrix})}
+\Definition{extra-height} adds a quantity to the total height of the
+delimiters (height |\ht| + depth |\dp|);
+\item \index{delimiters!---/color pour \texttt{\textbackslash SubMatrix}}
+\Definition{delimiters/color} fixes the color of the delimiters (also
+available in |\NiceMatrixOptions|, in the environments with delimiters and as
+option of the keyword |\CodeAfter|);
+\item \index{slim (key of \texttt{\textbackslash SubMatrix})}
+\Definition{slim} is a boolean key: when that key is in force, the horizontal
+position of the delimiters is computed by using only the contents of the cells
+of the submatrix whereas, in the general case, the position is computed by
+taking into account the cells of the whole columns implied in the submatrix
+(see example below). ;
+\item \index{vlines!key of \texttt{\textbackslash SubMatrix}}
+\Definition{vlines} contents a list of numbers of vertical rules that
+will be drawn in the sub-matrix (if this key is used without value, all the
+vertical rules of the sub-matrix are drawn);
+\item \index{hlines!key of \texttt{\textbackslash SubMatrix}}
+\Definition{hlines} is similar to |vlines| but for the horizontal rules;
+\item \index{hvlines!key of \texttt{\textbackslash SubMatrix}}
+\Definition{hvlines}, which must be used without value, draws all the
+vertical and horizontal rules;
+\item \index{code (key of \texttt{\textbackslash SubMatrix})}
+\Definition{code} insert code, especially TikZ code, after the
+construcion of the submatrix. That key is detailed below.
+\end{itemize}
+One should remark that the keys add their rules after the construction of
+the main matrix: no space is added between the rows and the columns of the
+array for theses rules.
+
+\bigskip
+All these keys are also available in |\NiceMatrixOptions|, at the level of the
+environments of \pkg{nicematrix} or as option of the command |\CodeAfter| with
+the prefix |sub-matrix| which means that their names are therefore
+|sub-matrix/left-xshift|, |sub-matrix/right-xshift|, |sub-matrix/xshift|, etc.
+
+\bigskip
+\begin{scope}
+\hfuzz=12cm
+\fvset{commandchars=\~\#\!}%
+\begin{BVerbatim}[baseline=c,boxwidth=11cm]
+$\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
+ & & \frac12 \\
+ & & \frac14 \\[1mm]
+a & b & \frac12a+\frac14b \\
+c & d & \frac12c+\frac14d \\
+\CodeAfter
+ \SubMatrix({1-3}{2-3})
+ \SubMatrix({3-1}{4-2})
+ \SubMatrix({3-3}{4-3})
+\end{NiceArray}$
+\end{BVerbatim}
+\end{scope}
+$\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
+ & & \frac12 \\
+ & & \frac14 \\[1mm]
+a & b & \frac12a+\frac14b \\
+c & d & \frac12c+\frac14d \\
+\CodeAfter
+ \SubMatrix({1-3}{2-3})
+ \SubMatrix({3-1}{4-2})
+ \SubMatrix({3-3}{4-3})
+\end{NiceArray}$
+
+\medskip
+Here is the same example with the key |slim| used for one of the submatrices.
+
+\medskip
+\begin{scope}
+\hfuzz=12cm
+\fvset{commandchars=\~\#\!}%
+\begin{BVerbatim}[baseline=c,boxwidth=11cm]
+$\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
+ & & \frac12 \\
+ & & \frac14 \\[1mm]
+a & b & \frac12a+\frac14b \\
+c & d & \frac12c+\frac14d \\
+\CodeAfter
+ \SubMatrix({1-3}{2-3})[~emphase#slim!]
+ \SubMatrix({3-1}{4-2})
+ \SubMatrix({3-3}{4-3})
+\end{NiceArray}$
+\end{BVerbatim}
+\end{scope}
+$\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
+ & & \frac12 \\
+ & & \frac14 \\[1mm]
+a & b & \frac12a+\frac14b \\
+c & d & \frac12c+\frac14d \\
+\CodeAfter
+ \SubMatrix({1-3}{2-3})[slim]
+ \SubMatrix({3-1}{4-2})
+ \SubMatrix({3-3}{4-3})
+\end{NiceArray}$
+
+
+\bigskip
+There is also a key |name| which gives a name to the submatrix created by
+|\SubMatrix|. That name is used to create PGF/Tikz nodes: cf
+p.~\pageref{node-sub-matrix}.
+
+
+\bigskip
+Despite its name, the command |\SubMatrix| may also be used within a
+|{NiceTabular}|. Here is an example (which uses |\bottomrule| and
+|\toprule| of \pkg{booktabs}).
+
+\medskip
+\begin{BVerbatim}[baseline=c]
+\begin{NiceTabular}{~@{}ll~@{}}
+\toprule
+Part A & the first part \\
+\Block{2-1}{Part B} & a first sub-part \\
+ & a second sub-part \\
+\bottomrule
+\CodeAfter
+ ~emphase#\SubMatrix{\{}{2-2}{3-2}{.}@
+\end{NiceTabular}
+\end{BVerbatim}
+\hspace{2cm}
+\begin{NiceTabular}{@{}ll@{}}
+\toprule
+Part A & the first part \\
+\Block{2-1}{Part B} & a first sub-part \\
+ & a second sub-part \\
+\bottomrule
+\CodeAfter
+ \SubMatrix{\{}{2-2}{3-2}{.}
+\end{NiceTabular}
+
+\bigskip
+The command |\SubMatrix| is, in fact, also available in the |\CodeBefore|. By
+using |\SubMatrix| in the |\CodeBefore|, the delimiters drawn by those
+commands |\SubMatrix| are taken into account to limit the continuous dotted
+lines (drawn by |\Cdots|, |\Vdots|, etc.) which have an open extremity.
+
+For an example, see voir \ref{submatrix-in-codebefore}
+p.~\pageref{submatrix-in-codebefore}.
+
+
+\vspace{1cm}
+The key |code| of the command |\SubMatrix| allows the insertion of code after
+the construction of the submatrix. It's meant to be used to insert TikZ
+instructions because, in the TikZ instructions inserted by that code, the
+nodes of the form |i-j| and \verb+i-|j+ are interpreted with |i| and |j| as
+numbers of row and columns \emph{relative to the submatrix}.\footnote{Be
+careful: the syntax \verb+j|-i+ is \emph{not} allowed.}
+
+\medskip
+\begin{scope}
+\fvset{commandchars=\~\#\!}%
+\begin{Verbatim}
+$\begin{NiceArray}{ccc@{}w{c}{5mm}@{}ccc}
+ & & && -1 & 1 & 2 \\
+ & & && 0 & 3 & 4 \\
+ & & && 0 & 0 & 5 \\
+ 1 & 2 & 3 && -1 & 7 & 25 \\
+ 0 & 4 & 5 && 0 & 12 & 41 \\
+ 0 & 0 & 6 && 0 & 0 & 30
+\CodeAfter
+ ~emphase#\NewDocumentCommand{\MyDraw}{}{\tikz \draw [blue] (2-|1) -| (3-|2) -| (4-|3) ;}!
+ \SubMatrix({1-5}{3-7})[~emphase#code = \MyDraw!]
+ \SubMatrix({4-1}{6-3})[~emphase#code = \MyDraw!]
+ \SubMatrix({4-5}{6-7})[~emphase#code = \MyDraw!]
+\end{NiceArray}$
+\end{Verbatim}
+\end{scope}
+
+
+\[\begin{NiceArray}{ccc@{}w{c}{5mm}@{}ccc}
+ & & && -1 & 1 & 2 \\
+ & & && 0 & 3 & 4 \\
+ & & && 0 & 0 & 5 \\
+ 1 & 2 & 3 && -1 & 7 & 25 \\
+ 0 & 4 & 5 && 0 & 12 & 41 \\
+ 0 & 0 & 6 && 0 & 0 & 30
+\CodeAfter
+ \NewDocumentCommand{\MyDraw}{}{\tikz \draw [blue] (2-|1) -| (3-|2) -| (4-|3) ;}
+ \SubMatrix({1-5}{3-7})[code = \MyDraw ]
+ \SubMatrix({4-1}{6-3})[code = \MyDraw ]
+ \SubMatrix({4-5}{6-7})[code = \MyDraw ]
+\end{NiceArray}\]
+
+\medskip
+As we see, the drawing done by our command |\MyDraw| is \emph{relative} to the
+submatrix to which it is applied.
+
+\subsection{The commands \textbackslash OverBrace and \textbackslash
+UnderBrace in the \textbackslash CodeAfter}
+
+\index{UncerBrace@\texttt{\textbackslash UnderBrace} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})}
+\index{OverBrace@\texttt{\textbackslash OverBrace} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})}
+
+The commands |\OverBrace| and |\UnderBrace| provide a way to put
+horizontal braces on a part of the array. These commands take in three
+arguments:
+\begin{itemize}
+\item the first argument is the upper-left corner of the submatrix with the
+syntax $i$|-|$j$ where $i$ the number of row and $j$ the number of column;
+\item the second argument is the lower-right corner with the same syntax;
+\item the third argument is the label of the brace that will be put by
+\pkg{nicematrix} (with \textsc{pgf}) above the brace (for the command
+|\OverBrace|) or under the brace (for |\UnderBrace|).
+\end{itemize}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 & 6 \\
+11 & 12 & 13 & 14 & 15 & 16 \\
+\CodeAfter
+ ~emphase#\OverBrace{1-1}{2-3}{A}@
+ ~emphase#\OverBrace{1-4}{2-6}{B}@
+\end{pNiceMatrix}
+\end{BVerbatim}
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 & 6 \\
+11 & 12 & 13 & 14 & 15 & 16 \\
+\CodeAfter
+ \OverBrace{1-1}{2-3}{A}
+ \OverBrace{1-4}{2-6}{B}
+\end{pNiceMatrix}$
+
+\bigskip
+Caution : There is no vertical space reserved for those braces.\footnote{See:
+ \url{https://tex.stackexchange.com/questions/685755}}
+
+
+\bigskip
+\index{color!key of \texttt{\textbackslash OverBrace} and \texttt{\textbackslash
+ UnderBrace}}
+\index{yshift (key of \texttt{\textbackslash OverBrace} and \texttt{\textbackslash
+ UnderBrace})}
+\index{left-shorten (key of \texttt{\textbackslash OverBrace} and\newline \texttt{\textbackslash
+ UnderBrace})}
+\index{right-shorten (key of \texttt{\textbackslash OverBrace} and\newline \texttt{\textbackslash
+ UnderBrace})}
+
+In fact, the commands |\OverBrace| and |\UnderBrace| take in an optional
+argument (in first position and between square brackets) for a list of
+\textsl{key=value} pairs. The available keys are:
+\begin{itemize}
+\item |left-shorten| and |right-shorten| which do not take in value; when the
+key |left-shorten| is used, the abscissa of the left extremity of the brace is
+computed with the contents of the cells of the involved sub-array, otherwise,
+the position of the potential vertical rule is used (idem for
+|right-shorten|).
+
+\item |shorten|, which is the conjunction of the keys |left-shorten| and
+|right-shorten|;
+
+\item |yshift|, which shifts vertically the brace (and its label);
+
+\item |color|, which sets the color of the brace (and its label).
+\end{itemize}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 & 6 \\
+11 & 12 & 13 & 14 & 15 & 16 \\
+\CodeAfter
+ \OverBrace~emphase#[shorten,yshift=3pt]@{1-1}{2-3}{A}
+ \OverBrace~emphase#[shorten,yshift=3pt]@{1-4}{2-6}{B}
+\end{pNiceMatrix}
+\end{BVerbatim}
+$\begin{pNiceMatrix}
+1 & 2 & 3 & 4 & 5 & 6 \\
+11 & 12 & 13 & 14 & 15 & 16 \\
+\CodeAfter
+ \OverBrace[shorten,yshift=3pt]{1-1}{2-3}{A}
+ \OverBrace[shorten,yshift=3pt]{1-4}{2-6}{B}
+\end{pNiceMatrix}$
+
+\index{CodeAfter@\texttt{\textbackslash CodeAfter}|)}
+
+\section{Captions and notes in the tabulars}
+
+\label{s:notes}
+
+\subsection{Caption of a tabular}
+
+\label{s:caption}
+
+\index{caption (key of \texttt{\{NiceTabular\}})}
+\index{short-caption}
+\index{label (key of \texttt{\{NiceTabular\}})}
+\index{caption-above}
+\index{caption@\textbf{Captions of the tabulars}}
+
+\smallskip
+The environment |{NiceTabular}| provides the keys |caption|, |short-caption|
+and |label| which may be used when the tabular is inserted in a floating
+environment (typically the environment |{table}|).
+
+\smallskip
+With the key |caption|, the caption, when it is long, is wrapped at the width of
+the tabular (excepted the potential exterior columns specified by |first-col|
+and |last-col|: cf.~\ref{exterior}, p.~\pageref{exterior}), without the use of
+the package \pkg{threeparttable} or the package \pkg{floatrow}.
+
+\smallskip
+By default, the caption is composed below the tabular. With the key
+|caption-above|, available in |\NiceMatrixOptions|, the caption will be
+composed above the tabular.
+
+\smallskip
+The key |short-caption| corresponds to the optional argument of the clasical
+command |\caption| and the key |label| corresponds, of course, to the command
+|\label|.
+
+\smallskip
+See table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}, for an example of
+use the keys |caption| and |label|.
+
+\smallskip
+These functionnalities are compatible with the extension \pkg{caption}.
+
+\subsection{The footnotes}
+
+\index{footnote@\pkg{footnote} (package)}
+\index{footnote (key)}
+\index{footnotehyper@\pkg{footnotehyper} (package)}
+\index{footnotehyper (key)}
+
+\smallskip
+The package \pkg{nicematrix} allows, by using \pkg{footnote} or
+\pkg{footnotehyper}, the extraction of the notes inserted by |\footnote| in the
+environments of \pkg{nicematrix} and their composition in the foot of the page
+with the other notes of the document.
+
+\smallskip
+If \pkg{nicematrix} is loaded with the option |footnote| (with
+|\usepackage[footnote]{nicematrix}| or with |\PassOptionsToPackage|), the
+package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
+extract the footnotes.
+
+\smallskip
+If \pkg{nicematrix} is loaded with the option |footnotehyper|, the package
+\pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
+extract footnotes.
+
+\smallskip
+Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
+The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
+and should be used preferently. The package \pkg{footnote} has some drawbacks,
+in particular: it must be loaded after the package \pkg{xcolor} and it is not
+perfectly compatible with \pkg{hyperref}.
+
+
+\subsection{The notes of tabular}
+
+\index{nota@\textbf{Notes in the tabulars}|(}
+\index{tabularnote@\texttt{\textbackslash tabularnote}}
+
+
+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|: cf.~\ref{exterior},
+p.~\pageref{exterior}). With no surprise, that command is available only in the
+environments |{NiceTabular}|, |{NiceTabular*}| and |{NiceTabularX}|.
+
+In fact, this command is available only if the extension \pkg{enumitem}
+\index{enumitem@\pkg{enumitem} (package required to use\newline \texttt{\textbackslash tabularnote})} has
+been loaded (before or after \pkg{nicematrix}). Indeed, the notes are composed
+at the end of the array with a type of list provided by the package
+\pkg{enumitem}.
+
+\begin{scope}
+\fvset{commandchars=\~\#\!}
+\begin{Verbatim}
+\begin{NiceTabular}{@{}llr@{}}
+\toprule \RowStyle{\bfseries}
+Last name & First name & Birth day \\
+\midrule
+Achard\tabularnote{~emphase#Achard is an old family of the Poitou.!}
+& Jacques & 5 juin 1962 \\
+Lefebvre\tabularnote{~emphase#The name Lefebvre is an alteration of the name Lefebure.!}
+& Mathilde & 23 mai 1988 \\
+Vanesse & Stephany & 30 octobre 1994 \\
+Dupont & Chantal & 15 janvier 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{Verbatim}
+\end{scope}
+
+\begin{center}
+\begin{NiceTabular}{@{}llr@{}}
+\toprule \RowStyle{\bfseries}
+Last name & First name & Birth day \\
+\midrule
+Achard\tabularnote{Achard is an old family of the Poitou.}
+& Jacques & June 5, 2005 \\
+Lefebvre\tabularnote{The name Lefebvre is an alteration of the name Lefebure.}
+& Mathilde & January 23, 1975 \\
+Vanesse & Stephany & October 30, 1994 \\
+Dupont & Chantal & January 15, 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+
+
+\bigskip
+\begin{itemize}
+\item If you have several successive commands |\tabularnote{...}| \emph{with no
+space at all between them}, the labels of the corresponding notes are composed
+together, separated by commas (this is similar to the option |multiple| of
+\pkg{footmisc} for the footnotes).
+
+\item If a command |\tabularnote{...}| is exactly at the end of a cell (with
+no space at all after), the label of the note is composed in an overlapping
+position (towards the right). This structure may provide a better alignment of
+the cells of a given column.
+
+\item If the key |notes/para| is used, the notes are composed at the end of
+the array in a single paragraph (as with the key |para| of \pkg{threeparttable}).
+
+\item \index{tabularnote (key of \texttt{\{NiceTabular\}})}
+There is a key |tabularnote| which provides a way to insert some text in
+the zone of the notes before the numbered tabular notes.
+
+\index{tabularnote@\texttt{\{TabularNote\}}}
+An alternative syntax is available with the environment |{TabularNote}|. That
+environment should be used at the end of the environment |{NiceTabular}| (but
+\emph{before} a potential instruction |\CodeAfter|).
+
+\item If the package \pkg{booktabs} has been loaded (before or after
+\pkg{nicematrix}), the key |notes/bottomrule| draws a |\bottomrule| of
+\pkg{booktabs} \emph{after} the notes.
+
+\item The command |\tabularnote| may be used \emph{before}
+the environment of \pkg{nicematrix}. Thus, it's possible to use it on the
+title inserted by |\caption| in an environment |{table}| of LaTeX (or in a
+command |\captionof| of the package \pkg{caption}). It's also possible, as
+expected, to use the command |\tabularnote| in the caption provided by the
+\emph{key} |caption| of the environment |{NiceTabaular}|.
+
+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 control that feature with
+the key |notes/detect-duplicates|.\footnote{For technical reasons, the final
+user is not allowed to put several commands |\tabularnote| with exactly the
+same argument in the caption of the tabular.}
+
+\item It's possible to create a reference to a tabular note created by |\tabularnote|
+(with the usual command |\label| used after the |\tabularnote|).
+
+\item \colorbox{yellow!50}{\textbf{New 6.19}} The command |\tabularnote| has an
+optional argument (between square brackets) to change the symbol of the
+reference of the note.
+
+\emph{Example}: |\tabularnote[$\star$]{A footnote...}|
+\end{itemize}
+%
+For an illustration of some of those remarks, see table
+\ref{t:tabularnote}, p.~\pageref{t:tabularnote}. This table has been composed
+with the following code (the package \pkg{caption} has been loaded in this document).
+
+\begin{center}
+\fvset{commandchars=\~\#\!}
+\begin{Verbatim}[formatcom=\small\color{gray}]
+\begin{table}
+\centering
+\NiceMatrixOptions{caption-above}
+\begin{NiceTabular}{@{}llc@{}
+ [
+ caption = A tabular whose caption has been specified by the key
+ \texttt{caption}~emphase#\tabularnote[$\star$]{It's possible to put a tabular note in the caption}! ,
+ label = t:tabularnote ,
+ tabularnote = Some text before the notes. ,
+ notes/bottomrule
+ ]
+\toprule
+Last name & First name & Length of life \\
+\midrule
+Churchill & Wiston & 91\\
+Nightingale~emphase#\tabularnote{Considered as the first nurse of history}!%
+~emphase#\tabularnote{Nicknamed ``the Lady with the Lamp''.}!
+& Florence~emphase#\tabularnote{This note is shared by two references.}! & 90 \\
+Schoelcher & Victor & 89~emphase#\tabularnote{The label of the note is overlapping.}!\\
+Touchet & Marie~emphase#\tabularnote{This note is shared by two references.}! & 89 \\
+Wallis & John & 87 \\
+\bottomrule
+\end{NiceTabular}
+\end{table}
+\end{Verbatim}
+\end{center}
+
+
+\begin{table}[hbt]
+\centering
+\NiceMatrixOptions{caption-above}
+\begin{NiceTabular}{@{}llc@{}}[
+ caption = A tabular whose caption has been specified by the key
+ \texttt{caption}\tabularnote[$\star$]{It's possible to put a tabular note in the caption} ,
+ label = t:tabularnote ,
+ tabularnote = Some text before the notes. ,
+ notes/bottomrule
+ ]
+\toprule
+Last name & First name & Length of life \\
+\midrule
+Churchill & Wiston & 91\\
+Nightingale\tabularnote{Considered as the first nurse of
+history.}\tabularnote{Nicknamed ``the Lady with the Lamp''.}
+& Florence\tabularnote{This note is shared by two references.} & 90 \\
+Schoelcher & Victor & 89\tabularnote{The label of the note is overlapping.}\\
+Touchet & Marie\tabularnote{This note is shared by two references.} & 89 \\
+Wallis & John & 87 \\
+\bottomrule
+\end{NiceTabular}
+\end{table}
+
+
+\subsection{Customisation of the tabular notes}
+
+\index{para (subkey of ``notes'')}
+\index{bottomrule (subkey of ``notes'')}
+\index{style (subkey of ``notes'')}
+\index{label-in-tabular (subkey of ``notes'')}
+\index{label-in-list (subkey of ``notes'')}
+\index{enumitem-keys (subkey of ``notes'')}
+\index{enumitem-keys-para (subkey of ``notes'')}
+\index{code-before!subkey of ``notes''}
+\index{detect-duplicates (subkey of ``notes'')}
+
+
+The tabular notes can be customized with a set of keys available in
+|\NiceMatrixOptions|. The name of these keys is prefixed by |notes|.
+\begin{itemize}
+\item |notes/para|
+\item |notes/bottomrule|
+\item |notes/style|
+\item |notes/label-in-tabular|
+\item |notes/label-in-list|
+\item |notes/enumitem-keys|
+\item |notes/enumitem-keys-para|
+\item |notes/code-before|
+\end{itemize}
+For sake of commodity, it is also possible to set these keys in
+|\NiceMatrixOptions| via a key |notes| which takes in as value a list of
+pairs \textsl{key=value} where the name of the keys need no longer be
+prefixed by |notes|:
+\begin{center}
+\begin{BVerbatim}[formatcom = \small \color{gray}]
+\NiceMatrixOptions
+ {
+ notes =
+ {
+ bottomrule ,
+ style = ... ,
+ label-in-tabular = ... ,
+ enumitem-keys =
+ {
+ labelsep = ... ,
+ align = ... ,
+ ...
+ }
+ }
+ }
+\end{BVerbatim}
+\end{center}
+
+
+\bigskip
+We detail these keys.
+
+\begin{itemize}[itemsep=\medskipamount]
+\item The key |notes/para| requires the composition of the notes (at the end of
+the tabular) in a single paragraph.
+
+Initial value: |false|
+
+That key is also available within a given environment.
+
+\item The key |notes/bottomrule| adds a |\bottomrule| of \pkg{booktabs}
+\emph{after} the notes. Of course, that rule is drawn only if there is really
+notes in the tabular. The package \pkg{booktabs} must have been loaded (before
+or after the package \pkg{nicematrix}). If it is not, an error is raised.
+
+Initial value: |false|
+
+That key is also available within a given environment.
+
+\item The key |notes/style| is a command whose argument is specified by |#1|
+and which gives the style of numerotation of the notes. That style will be
+used by |\ref| when referencing a tabular note marked with a command |\label|.
+The labels formatted by that style are used, separated by commas, when the user
+puts several consecutive commands |\tabularnote|. The marker |#1| is meant to
+be the name of a LaTeX counter.
+
+Initial value: |\textit{\alph{#1}}|
+
+Another possible value should be a mere |\arabic{#1}|
+
+\item The key |notes/label-in-tabular| is a command whose argument is
+specified by |#1| which is used when formatting the label of a note in the
+tabular. Internally, this number of note has already been formatted by
+|notes/style| before sent to that command.
+
+Initial value: |\textsuperscript{#1}|
+
+In French, it's a tradition of putting a small space before the label of note.
+That tuning could be acheived by the following code:
+%
+\begin{Verbatim}
+\NiceMatrixOptions{notes/label-in-tabular = \,\textsuperscript{~#1}}
+\end{Verbatim}
+
+
+\item The key |notes/label-in-list| is a command whose argument is specified
+by |#1| which is used when formatting the label in the list of notes at the
+end of the tabular. Internally, this number of note has already been formatted by
+|notes/style| before sent to that command.
+
+Initial value: |\textsuperscript{#1}|
+
+In French, the labels of notes are not composed in upper position when
+composing the notes. Such behaviour could be acheived by:
+\begin{Verbatim}
+\NiceMatrixOptions{notes/label-in-list = ~#1.\nobreak\hspace{0.25em}}
+\end{Verbatim}
+The command |\nobreak| is for the event that the option |para| is used.
+
+
+\item The notes are composed at the end of the tabular by using internally a
+style of list of \pkg{enumitem}. This style of list is defined as follows (with, of
+course, keys of \pkg{enumitem}):
+
+|noitemsep , leftmargin = * , align = left , labelsep = 0pt|
+
+The specification |align = left| in that style requires a
+composition of the label leftwards in the box affected to that label.
+With that tuning, the notes are composed flush left, which is pleasant when
+composing tabulars in the spirit of \pkg{booktabs} (see for example the
+table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}).
+
+\medskip
+The key |notes/enumitem-keys| specifies a list of pairs
+\textsl{key=value} (following the specifications of \pkg{enumitem}) to
+customize that style of list (it uses internally the command |\setlist*| of
+\pkg{enumitem}).
+
+
+\item The key |notes/enumitem-keys-para| is similar to the previous one but
+corresponds to the type of list used when the option |para| is in force. Of
+course, when the option |para| is used, a list of type |inline| (as called by
+\pkg{enumitem}) is used and the pairs \textsl{key=value} should correspond to
+such a list of type |inline|.
+
+Initially, the style of list is defined by:\quad
+|afterlabel = \nobreak, itemjoin = \quad|
+
+
+\item The key |notes/code-before| is a token list inserted by \pkg{nicematrix}
+just before the composition of the notes at the end of the tabular.
+
+Initial value: \textsl{empty}
+
+For example, if one wishes to compose all the notes in gray and |\footnotesize|,
+he should use that key:
+\begin{Verbatim}
+\NiceMatrixOptions{notes/code-before = \footnotesize \color{gray}}
+\end{Verbatim}
+It's also possible to add |\raggedright| or |\RaggedRight| in that key (|\RaggedRight|
+is a command of \pkg{ragged2e}).
+
+\item The key |notes/detect-duplicates| activates the detection of the commands
+|\tabularnotes| with the same argument.
+
+Initial value : |true|
+\end{itemize}
+
+\index{nota@\textbf{Notes in the tabulars}|)}
+
+\bigskip
+For an example of customisation of the tabular notes, see p.~\pageref{ex:notes}.
+
+
+\subsection{Use of \{NiceTabular\} with threeparttable}
+
+\index{threeparttable@\pkg{threeparttable} (package)}
+
+If you wish to use an environment |{NiceTabular}|, |{NiceTabular*}| or
+|{NiceTabularX}| in an environment |{threeparttable}| of the eponymous package,
+you have to patch |{threeparttable}| with the following code (with a version of
+LaTeX at least 2020/10/01).
+\begin{Verbatim}[commandchars=\~\#\!]
+\makeatletter
+\AddToHook{env/threeparttable/begin}
+ {\TPT at hookin{NiceTabular}\TPT at hookin{NiceTabular*}\TPT at hookin{NiceTabularX}}
+\makeatother
+\end{Verbatim}
+
+Nevertheless, the use of \pkg{threeparttable} in conjonction with
+\pkg{nicematrix} seems rather point-less because of the functionalities
+provided by \pkg{nicematrix} (see the key |caption| in the section
+\ref{s:caption}, p.~\pageref{s:caption}).
+
+
+\section{Other features}
+
+\subsection{The key rounded-corners of \{NiceTabular\}}
+
+\label{tabular-rounded-corners}
+\index{rounded-corners!key of \texttt{\{NiceTabular\}}}
+\index{Corners (rounded ---)!for a tabular}
+
+\colorbox{yellow!50}{\textbf{New 6.18}}\par\nobreak
+
+\smallskip
+The key |rounded-corners| that we will describe now has no direct link with
+the key |corners| (which is used to specify ``empty corners'') described in
+the part~\ref{corners}, p.~\pageref{corners}.
+
+\smallskip
+The environment |{NiceTabular}| provides a key |rounded-corners| which specify
+that the tabular should have rounded corners with a radius equal to the value of
+that key (the default value is 4~pt\footnote{This value is the initial value of
+ the \emph{rounded corners} of Tikz.}). More precisely, that key has two
+effects that we describe now.
+\begin{itemize}
+\item All the commands for coloring the cells, columns and rows (in the
+|\CodeBefore| but also directly in the array when the key |colortbl-like| is
+used) will respect those rounded corners.
+
+\item When the key |hvlines| is used, the exterior rules will be drawn with
+rounded corners.
+\end{itemize}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{NiceTabular}
+ [hvlines,~emphase#rounded-corners@]
+ {ccc}
+\CodeBefore
+ \rowcolor{red!15}{1}
+\Body
+Last name & First name & Profession \\
+Arvy & Jacques & Physicist \\
+Jalon & Amandine & Physicist
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}[hvlines,rounded-corners]
+\CodeBefore
+ \rowcolor{red!15}{1}
+\Body
+Last name & First name & Profession \\
+Arvy & Jacques & Physicist \\
+Jalon & Amandine & Physicist
+\end{NiceTabular}
+
+
+\subsection{Command \textbackslash ShowCellNames}
+
+\index{ShowCellNames@\texttt{\textbackslash ShowCellNames} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})}
+
+
+The command |\ShowCellNames|, which may be used in the |\CodeBefore| and in
+the |\CodeAfter| displays the name (with the form $i$-$j$) of each cell. When
+used in the |\CodeAfter|, that command applies a semi-transparent white
+rectangle to fade the array (caution: some \textsc{pdf} readers don't support
+transparency).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+\begin{NiceTabular}{ccc}[hvlines,cell-space-limits=3pt]
+ \Block{2-2}{} & & test \\
+ & & blabla \\
+ & some text & nothing
+~emphase#\CodeAfter \ShowCellNames@
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}[hvlines,cell-space-limits=3pt]
+ \Block{2-2}{} & & test \\
+ & & blabla \\
+ & some text & nothing
+\CodeAfter \ShowCellNames
+\end{NiceTabular}
+
+
+\subsection{Use of the column type S of siunitx}
+
+\index{S (the columns S of \pkg{siunitx})}
+\index{siunitx@\pkg{siunitx} (package)}
+
+If the package \pkg{siunitx} is loaded (before or after \pkg{nicematrix}),
+it's possible to use the |S| column type of \pkg{siunitx} in the environments
+of \pkg{nicematrix}. The implementation doesn't use explicitly any private
+macro of \pkg{siunitx}.
+
+
+\medskip
+\begin{BVerbatim}[baseline = c, boxwidth = 11cm]
+$\begin{pNiceArray}{~emphase#S at cW{c}{1cm}c}[nullify-dots,first-row]
+{C_1} & \Cdots & & C_n \\
+2.3 & 0 & \Cdots & 0 \\
+12.4 & \Vdots & & \Vdots \\
+1.45 \\
+7.2 & 0 & \Cdots & 0
+\end{pNiceArray}$
+\end{BVerbatim}
+$\begin{pNiceArray}{ScW{c}{1cm}c}[nullify-dots,first-row]
+{C_1} & \Cdots & & C_n \\
+2.3 & 0 & \Cdots & 0 \\
+12.4 & \Vdots & & \Vdots \\
+1.45 \\
+7.2 & 0 & \Cdots & 0
+\end{pNiceArray}$
+
+\medskip
+On the other hand, the |d| columns of the package \pkg{dcolumn} are not
+supported by \pkg{nicematrix}.
+
+
+\subsection{Default column type in \{NiceMatrix\}}
+
+\label{columns-width}
+\index{columns-type (key of \texttt{\{NiceMatrix\}}, etc.)}
+
+The environments without preamble (|{NiceMatrix}|, |{pNiceMatrix}|,
+|{bNiceMatrix}|, etc.) and the commande |\pAutoNiceMatrix| (and its variants)
+provide an option |columns-type| to specify the type of column which will be
+used (the initial value is, of course, |c|).
+
+The keys |l| and |r| are shortcuts for |columns-type=l| and |columns-type=r|.
+
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$\begin{bNiceMatrix}[r]
+\cos x & - \sin x \\
+\sin x & \cos x
+\end{bNiceMatrix}$
+\end{BVerbatim}
+$\begin{bNiceMatrix}[r]
+\cos x & - \sin x \\
+\sin x & \cos x
+\end{bNiceMatrix}$
+
+\medskip
+The key |columns-type| is available in |\NiceMatrixOptions| but with the
+prefix |matrix|, which means that its name is, within |\NiceMatrixOptions| :
+|matrix/columns-type|.
+
+\subsection{The command \textbackslash rotate}
+
+\label{rotate}
+\index{rotate@\texttt{\textbackslash rotate}}
+
+The package \pkg{nicematrix} provides a command |\rotate|. When used in the
+beginning of a cell, this command composes the contents of the cell after a
+rotation of 90° in the direct sens.
+
+In the following command, we use that command in the
+|code-for-first-row|.\footnote{It can also be used in |\RowStyle|
+(cf.~p.~\pageref{RowStyle}.)}
+
+\bigskip
+
+\begin{BVerbatim}[baseline=c,boxwidth=12cm]
+\NiceMatrixOptions%
+ {code-for-first-row = \scriptstyle ~emphase#\rotate@ \text{image of },
+ code-for-last-col = \scriptstyle }
+$A = \begin{pNiceMatrix}[first-row,last-col=4]
+e_1 & e_2 & e_3 \\
+1 & 2 & 3 & e_1 \\
+4 & 5 & 6 & e_2 \\
+7 & 8 & 9 & e_3
+\end{pNiceMatrix}$
+\end{BVerbatim}
+\begin{varwidth}{10cm}
+\NiceMatrixOptions%
+ {code-for-first-row = \scriptstyle\rotate \text{image of },
+ code-for-last-col = \scriptstyle }
+$ A = \begin{pNiceMatrix}[first-row,last-col=4]
+e_1 & e_2 & e_3 \\
+1 & 2 & 3 & e_1 \\
+4 & 5 & 6 & e_2 \\
+7 & 8 & 9 & e_3
+\end{pNiceMatrix}$
+\end{varwidth}
+
+\bigskip
+If the command |\rotate| is used in the ``last row'' (exterior to the matrix),
+the corresponding elements are aligned upwards as shown below.
+
+\bigskip
+\index{first-row|textit}
+\index{last-row|textit}
+\index{code-for-first-row|textit}
+\index{code-for-last-row|textit}
+\index{last-col|textit}
+\index{code-for-last-col|textit}
+
+\begin{BVerbatim}[baseline=c,boxwidth=12cm]
+\NiceMatrixOptions%
+ {code-for-last-row = \scriptstyle ~emphase#\rotate@ ,
+ code-for-last-col = \scriptstyle }
+$A = \begin{pNiceMatrix}[last-row=4,last-col=4]
+1 & 2 & 3 & e_1 \\
+4 & 5 & 6 & e_2 \\
+7 & 8 & 9 & e_3 \\
+\text{image of } e_1 & e_2 & e_3
+\end{pNiceMatrix}$
+\end{BVerbatim}
+\begin{varwidth}{10cm}
+\NiceMatrixOptions%
+ {code-for-last-row = \scriptstyle\rotate ,
+ code-for-last-col = \scriptstyle }%
+$A = \begin{pNiceMatrix}[last-row=4,last-col=4]
+1 & 2 & 3 & e_1 \\
+4 & 5 & 6 & e_2 \\
+7 & 8 & 9 & e_3 \\
+\text{image of } e_1 & e_2 & e_3
+\end{pNiceMatrix}$
+\end{varwidth}
+
+
+
+\subsection{The option small}
+
+\label{small}
+\index{small (key for an environment)}
+\index{smallmatrix@\texttt{\{smallmatrix\}} (environment of \pkg{amsmath})}
+
+
+With the option |small|, the environments of the package \pkg{nicematrix}
+are composed in a way similar to the environment |{smallmatrix}| of the
+package \pkg{amsmath} (and the environments |{psmallmatrix}|,
+|{bsmallmatrix}|, etc. of the package \pkg{mathtools}).
+
+\bigskip
+\begin{Verbatim}
+$\begin{bNiceArray}{cccc|c}[~emphase#small@,
+ last-col,
+ code-for-last-col = \scriptscriptstyle,
+ columns-width = 3mm ]
+1 & -2 & 3 & 4 & 5 \\
+0 & 3 & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
+0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3
+\end{bNiceArray}$
+\end{Verbatim}
+%
+\[\begin{bNiceArray}{cccc|c}[small, last-col,
+ code-for-last-col = \scriptscriptstyle,
+ columns-width=3mm]
+1 & -2 & 3 & 4 & 5 \\
+0 & 3 & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
+0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3
+\end{bNiceArray}\]
+
+
+\bigskip
+One should note that the environment |{NiceMatrix}| with the option |small| is
+not composed \emph{exactly} as the environment |{smallmatrix}|. Indeed, all
+the environments of \pkg{nicematrix} are constructed upon |{array}| (of the
+package \pkg{array}) whereas the environment |{smallmatrix}| is constructed
+directly with an |\halign| of TeX.
+
+\medskip
+In fact, the option |small| corresponds to the following tuning:
+\begin{itemize}
+\item the cells of the array are composed with |\scriptstyle|;
+\item |\arraystretch| is set to $0.47$;
+\item |\arraycolsep| is set to $1.45$~pt;
+\item the characteristics of the dotted lines are also modified.
+\end{itemize}
+
+\medskip
+When the key |small| is in force, some functionalities of \pkg{nicematrix} are
+no longer available: for example, it's no longer possible to put vertical
+delimiters directly in the preamble of an environment with preamble (cf.
+section \ref{delimiters-in-preamble}, p.~\pageref{delimiters-in-preamble}).
+
+
+\subsection{The counters iRow and jCol}
+
+\label{iRow}
+\index{iRow (LaTeX counter)}
+\index{jCol (LaTeX counter)}
+
+In the cells of the array, it's possible to use the LaTeX counters |iRow| and
+|jCol| which represent the number of the current row and the number of the
+current column\footnote{We recall that the exterior ``first row'' (if it
+exists) has the number~$0$ and that the exterior ``first column'' (if it
+exists) has also the number~$0$.}. Of course, the user must not change the
+value of these counters which are used internally by \pkg{nicematrix}.
+
+In the |\CodeBefore| (cf. p. \pageref{code-before}) and in the |\CodeAfter|
+(cf. p. \pageref{code-after}), |iRow| represents the total number of rows
+(excepted the potential exterior rows) and |jCol| represents the total number
+of columns (excepted the potential exterior columns).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{pNiceMatrix}% don't forget the %
+ [first-row,
+ first-col,
+ code-for-first-row = \mathbf{~emphase#\alph{jCol}@} ,
+ code-for-first-col = \mathbf{~emphase#\arabic{iRow}@} ]
+& & & & \\
+& 1 & 2 & 3 & 4 \\
+& 5 & 6 & 7 & 8 \\
+& 9 & 10 & 11 & 12
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}[first-row,
+ first-col,
+ code-for-first-row = \mathbf{\alph{jCol}} ,
+ code-for-first-col = \mathbf{\arabic{iRow}} ]
+& & & & \\
+& 1 & 2 & 3 & 4 \\
+& 5 & 6 & 7 & 8 \\
+& 9 & 10 & 11 & 12
+\end{pNiceMatrix}$
+
+\medskip
+If LaTeX counters called |iRow| and |jCol| are defined in the document by
+packages other than \pkg{nicematrix} (or by the final user), they are shadowed
+in the environments of \pkg{nicematrix}.
+
+\bigskip
+\indexcommand{AutoNiceMatrix}
+\indexcommand{pAutoNiceMatrix}
+\indexcommand{bAutoNiceMatrix}
+\indexcommand{vAutoNiceMatrix}
+\indexcommand{VAutoNiceMatrix}
+\indexcommand{BAutoNiceMatrix}
+The package \pkg{nicematrix} also provides commands in order to compose
+automatically matrices from a general pattern. These commands are
+|\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
+|\VAutoNiceMatrix| and |\BAutoNiceMatrix|.
+
+These commands take in two mandatory arguments. The first is the format of the
+matrix, with the syntax $n$-$p$ where $n$ is the number of rows and $p$ the
+number of columns. The second argument is the pattern (it's a list of tokens
+which are inserted in each cell of the constructed matrix).
+
+\medskip
+\begin{Verbatim}
+$C = ~emphase#\pAutoNiceMatrix@{3-3}{C_{\arabic{iRow},\arabic{jCol}}}$
+\end{Verbatim}
+
+
+\[C = \pAutoNiceMatrix{3-3}{C_{\arabic{iRow},\arabic{jCol}}}\]
+
+
+\subsection{The key light-syntax}
+
+\label{light-syntax}
+\index{light-syntax}
+
+The option |light-syntax| (inpired by the package \pkg{spalign}) allows the
+user to compose the arrays with a lighter syntax, which gives a better
+legibility of the TeX source.
+
+When this option is used, one should use the semicolon for the end of a row
+and spaces or tabulations to separate the columns. However, as usual in the
+TeX world, the spaces after a control sequence are discarded and the elements
+between curly braces are considered as a whole.
+
+
+\medskip
+\begin{scope}
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+$\begin{bNiceMatrix}[~emphase#light-syntax@,first-row,first-col]
+{} a b ;
+a 2\cos a {\cos a + \cos b} ;
+b \cos a+\cos b { 2 \cos b }
+\end{bNiceMatrix}$
+\end{BVerbatim}
+\end{scope}
+$\begin{bNiceMatrix}[light-syntax,first-row,first-col]
+{} a b ;
+a 2\cos a {\cos a + \cos b} ;
+b \cos a+\cos b { 2 \cos b }
+\end{bNiceMatrix}$
+
+\medskip
+\index{end-of-row (to be used with light-syntax)}
+It's possible to change the character used to mark the end of rows with the
+option |end-of-row|. As said before, the initial value is a semicolon.
+
+\medskip
+When the option |light-syntax| is used, it is not possible to put verbatim
+material (for example with the command |\verb|) in the cells of the
+array.\footnote{The reason is that, when the option |light-syntax| is used,
+the whole content of the environment is loaded as a TeX argument to be
+analyzed. The environment doesn't behave in that case as a standard
+environment of LaTeX which only put TeX commands before and after the content.}
+
+
+\subsection{Color of the delimiters}
+
+\index{delimiters!---/color for an environment}
+\index{color!for the delimiters of the matrices}
+\index{Colour!of the delimiters of the matrices}
+
+
+For the environments with delimiters (|{pNiceArray}|, |{pNiceMatrix}|, etc.),
+it's possible to change the color of the delimiters with the key
+|delimiters/color|.
+
+\medskip
+\begin{BVerbatim}[boxwidth=12cm,baseline=c]
+$\begin{bNiceMatrix}[delimiters/color=red]
+1 & 2 \\
+3 & 4
+\end{bNiceMatrix}$
+\end{BVerbatim}
+$\begin{bNiceMatrix}[delimiters/color=red]
+1 & 2 \\
+3 & 4
+\end{bNiceMatrix}$
+
+\medskip
+This color also applies to the delimiters drawn by the command |\SubMatrix|
+(cf.~p.~\pageref{sub-matrix}) and for the delimiters directly specified in the
+preamble of the environments with preamble
+(cf.~p.~\pageref{delimiters-in-preamble}).
+
+\subsection{The environment \{NiceArrayWithDelims\}}
+
+\label{NiceArrayWithDelims}
+\index{NiceArrayWithDelims@\texttt{\{NiceArrayWithDelims\}}}
+
+In fact, the environment |{pNiceArray}| and its variants are based upon a
+more general environment, called |{NiceArrayWithDelims}|. The first two
+mandatory arguments of this environment are the left and right delimiters used
+in the construction of the matrix.
+
+It's possible to use |{NiceArrayWithDelims}| if we want to use atypical or
+asymetrical delimiters.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=11cm]
+$\begin{~emphase#NiceArrayWithDelims@}
+ {\downarrow}{\uparrow}{ccc}[margin]
+1 & 2 & 3 \\
+4 & 5 & 6 \\
+7 & 8 & 9
+\end{~emphase#NiceArrayWithDelims@}$
+\end{BVerbatim}
+$\begin{NiceArrayWithDelims}
+ {\downarrow}{\uparrow}{ccc}[margin]
+1 & 2 & 3 \\
+4 & 5 & 6 \\
+7 & 8 & 9
+\end{NiceArrayWithDelims}$
+
+\subsection{The command \textbackslash OnlyMainNiceMatrix}
+
+\indexcommand{OnlyMainNiceMatrix}
+
+The command |\OnlyMainNiceMatrix| executes its argument only when it is in the
+main part of the array, that is to say when it is not in one of the exterior
+rows. If it is used outside an environment of \pkg{nicematrix}, that command is
+no-op.
+
+For an example of utilisation, see \url{tex.stackexchange.com/questions/488566}
+
+\section{Use of Tikz with nicematrix}
+
+\label{name}\label{PGF-nodes}
+\index{tikza at TikZ (utilisation with \pkg{nicematrix})}
+\index{node@\textbf{Nodes of PGF/Tikz}|(}
+
+\subsection{The nodes corresponding to the contents of the cells}
+
+The package \pkg{nicematrix} creates a PGF/Tikz node\footnote{We recall that Tikz
+is a layer over PGF. The extension \pkg{nicematrix} loads PGF but does not
+load Tikz. We speak of PGF/Tikz nodes to emphase the fact that the PGF nodes
+created by \pkg{nicematrix} may be used with PGF but also with Tikz. The final
+user will probably prefer to use Tikz rather than PGF.} for each (non-empty) cell
+of the considered array. These nodes are used to draw the dotted lines between
+the cells of the matrix (inter alia).
+
+
+\smallskip
+\textbf{Caution} : By default, no node is created in a empty cell.
+
+\smallskip
+However, it's possible to impose the creation of a node with the command
+|\NotEmpty|. \footnote{One should note that, with that command, the cell is
+considered as non-empty, which has consequencies for the continuous dotted
+lines (cf. p.~\pageref{Cdots}) and the computation of the ``corners''
+(cf.~p.~\pageref{corners}).}
+
+\medskip
+The nodes of a document must have distinct names. That's why the names of the
+nodes created by \pkg{nicematrix} contains the number of the current
+environment. Indeed, the environments of \pkg{nicematrix} are numbered by a
+internal global counter.
+
+\smallskip
+In the environment with the number $n$, the node of the row $i$ and
+column~$j$ has for name |nm-|$n$|-|$i$|-|$j$.
+
+\smallskip
+The command |\NiceMatrixLastEnv| provides the number of the last environment
+of \pkg{nicematrix} (for LaTeX, it's a ``fully expandable'' command and not a
+counter).
+
+\smallskip
+\index{name!key for an environment}
+However, it's advisable to use instead the key |name|. This key gives a name
+to the current environment. When the environment has a name, the nodes are
+accessible with the name ``\textsl{name}-$i$-$j$'' where \textsl{name} is the
+name given to the array and $i$ and $j$ the numbers of row and column. It's
+possible to use these nodes with \textsc{pgf} but the final user will
+probably prefer to use Tikz (which is a convenient layer upon \textsc{pgf}).
+However, one should remind that \pkg{nicematrix} doesn't load Tikz by default.
+In the following examples, we assume that Tikz has been loaded.
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=11cm]
+$\begin{pNiceMatrix}[name=~emphase#mymatrix@]
+1 & 2 & 3 \\
+4 & 5 & 6 \\
+7 & 8 & 9
+\end{pNiceMatrix}$
+\tikz[remember picture,overlay]
+ \draw ~emphase#(mymatrix-2-2)@ circle (2mm) ;
+\end{BVerbatim}
+$\begin{pNiceMatrix}[name=mymatrix]
+1 & 2 & 3 \\
+4 & 5 & 6 \\
+7 & 8 & 9
+\end{pNiceMatrix}$
+\tikz[remember picture,overlay]
+ \draw (mymatrix-2-2) circle (2mm) ;
+
+\medskip
+Don't forget the options |remember picture| and |overlay|.
+
+\bigskip
+In the |\CodeAfter|, the things are easier : one must refer to the nodes with
+the form $i$-$j$ (we don't have to indicate the environment which is of
+course the current environment).
+
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=11cm]
+$\begin{pNiceMatrix}
+1 & 2 & 3 \\
+4 & 5 & 6 \\
+7 & 8 & 9
+\CodeAfter
+ \tikz \draw ~emphase#(2-2)@ circle (2mm) ;
+\end{pNiceMatrix}$
+\end{BVerbatim}
+$\begin{pNiceMatrix}
+1 & 2 & 3 \\
+4 & 5 & 6 \\
+7 & 8 & 9
+\CodeAfter
+ \tikz \draw (2-2) circle (2mm) ;
+\end{pNiceMatrix}$
+
+\medskip
+The nodes of the last column (excepted the potential ``last column'' specified
+by |last-col|\footnote{For the exterior columns, cf. part~\ref{exterior},
+p.~\pageref{exterior}.}) may also be indicated by $i$-|last|. Similarly, the
+nodes of the last row may be indicated by |last|-$j$.
+
+\bigskip
+In the following example, we have underlined all the nodes of the matrix.
+
+\[
+\NiceMatrixOptions
+ {
+ pgf-node-code =
+ {
+ \pgfsetfillcolor{red!15}%
+ \pgfusepathqfill
+ }
+ }
+\begin{pNiceMatrix}
+a & a + b & a + b + c \\
+a & a & a + b \\
+a & a & a
+\end{pNiceMatrix}\]
+
+
+\bigskip
+\colorbox{yellow!50}{\textbf{New 6.17}}\enskip Since those nodes are PGF
+nodes, one won't be surprised to learn that they are drawn by using a specific
+PGF style. That style is called |nicematrix/cell-node| and its definition in
+the source file |nicematrix.sty| is as follows:
+
+\begin{Verbatim}
+\pgfset
+ {
+ ~emphase#nicematrix / cell-node@ /.style =
+ {
+ inner sep = 0 pt ,
+ minimum width = 0 pt
+ }
+ }
+\end{Verbatim}
+
+The final user may modify that style by changing the values of the keys |text/rotate|,
+|inner xsep|, |inner ysep|, |inner sep|, |outer xsep|, |outer ysep|, |outer sep|,
+|minimum width|, |minimum height| and |minimum size|.
+
+\medskip
+For an example of utilisation, see part~\ref{triangular}, p.~\pageref{triangular}.
+
+
+\subsubsection{The key pgf-node-code}
+
+\index{pgf-node-code}
+
+\colorbox{yellow!50}{\textbf{New 6.17}}\enskip \textbf{For the experienced
+users}, \pkg{nicematrix} provides the key |pgf-node-code| which corresponds to
+some PGF node that will be executed at the creation, by PGF, of the nodes
+corresponding to the cells of the array. More pricisely, the value given to
+the key |pgf-node-code| will be passed in the fifth argument of the command
+|\pgfnode|. That value should contain at least an instruction such as
+|\pgfusepath|, |\pgfusepathqstroke|, |\pgfusepathqfill|, etc.
+
+\subsubsection{The columns V of varwidth}
+
+\label{node-V}
+\index{V (the columns V of \pkg{varwidth})}
+\index{varwidth@\pkg{varwidth} (package)}
+
+When the extension \pkg{varwidth} is loaded, the columns of the type |V|
+defined by \pkg{varwidth} are supported by \pkg{nicematrix}. It may be
+interessant to notice that, for a cell of a column of type |V|, the PGF/Tikz
+node created by \pkg{nicematrix} for the content of that cell has a width
+adjusted to the content of the cell. This is in contrast to the case of the
+columns of type |p|, |m| or |b| for which the nodes have always a width equal
+to the width of the column. In the following example, the command |\lipsum| is
+provided by the eponymous package.
+
+\begin{Verbatim}
+\begin{NiceTabular}{V{10cm}}
+\bfseries \large
+Titre \\
+\lipsum[1][1-4]
+\CodeAfter
+ \tikz \draw [rounded corners] (1-1) -| (last-|2) -- (last-|1) |- (1-1) ;
+\end{NiceTabular}
+\end{Verbatim}
+
+
+\begin{center}
+\begin{NiceTabular}{V{10cm}}
+\bfseries \large
+Titre \\
+\lipsum[1][1-4]
+\CodeAfter
+ \tikz \draw [rounded corners] (1-1) -| (last-|2) -- (last-|1) |- (1-1) ;
+\end{NiceTabular}
+\end{center}
+
+We have used the nodes corresponding to the position of the potential rules,
+which are described below (cf. p.~\pageref{nodes-i}).
+
+
+\subsection[The medium nodes and the large nodes]{The ``medium nodes'' and the ``large nodes''}
+
+\index{create-medium-nodes}
+\index{create-large-nodes}
+\index{create-extra-nodes}
+
+In fact, the package \pkg{nicematrix} can create ``extra nodes'': the ``medium
+nodes'' and the ``large nodes''. The first ones
+are created with the option |create-medium-nodes| and the second ones with the
+option |create-large-nodes|.\footnote{There is also an option
+|create-extra-nodes| which is an alias for the conjonction of
+|create-medium-nodes| and |create-large-nodes|.}
+
+\medskip
+These nodes are not used by \pkg{nicematrix} by default, and that's why they
+are not created by default.
+
+\medskip
+The names of the ``medium nodes'' are constructed by adding the suffix
+``|-medium|'' to the names of the ``normal nodes''. In the following example,
+we have underlined the ``medium nodes''. We consider that this example is
+self-explanatory.
+\[\begin{pNiceMatrix}[create-medium-nodes]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+ [every node/.style = {fill = red!15, inner sep = 0 pt},
+ name suffix = -medium]
+ \node [fit = (1-1)] {} ;
+ \node [fit = (1-2)] {} ;
+ \node [fit = (1-3)] {} ;
+ \node [fit = (2-1)] {} ;
+ \node [fit = (2-2)] {} ;
+ \node [fit = (2-3)] {} ;
+ \node [fit = (3-1)] {} ;
+ \node [fit = (3-2)] {} ;
+ \node [fit = (3-3)] {} ;
+\end{tikzpicture}
+\Body
+a & a + b & a + b + c \\
+a & a & a + b \\
+a & a & a
+\end{pNiceMatrix}\]
+
+
+\medskip
+\index{left-margin}
+\index{right-margin}
+The names of the ``large nodes'' are constructed by adding the suffix
+``|-large|'' to the names of the ``normal nodes''. In the following example,
+we have underlined the ``large nodes''. We consider that this example is
+self-explanatory.\footnote{There is no ``large nodes'' created in the exterior
+rows and columns (for these rows and columns, cf. p.~\pageref{exterior}).}
+\[\begin{pNiceMatrix}[create-large-nodes]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+ [every node/.style = { inner sep = 0 pt} ,
+ name suffix = -large]
+ \node [fit = (1-1),fill = red!15] {} ;
+ \node [fit = (1-3),fill = red!15] {} ;
+ \node [fit = (2-2),fill = red!15] {} ;
+ \node [fit = (3-1),fill = red!15] {} ;
+ \node [fit = (3-3),fill = red!15] {} ;
+ \node [fit = (1-2),fill = blue!15] {} ;
+ \node [fit = (2-1),fill = blue!15] {} ;
+ \node [fit = (2-3),fill = blue!15] {} ;
+ \node [fit = (3-2),fill = blue!15] {} ;
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c \\
+a & a & a + b \\
+a & a & a
+\end{pNiceMatrix}\]
+
+
+
+\medskip
+\index{extra-left-margin}
+\index{extra-right-margin}
+The ``large nodes'' of the first column and last column may appear too small
+for some usage. That's why it's possible to use the options |left-margin| and
+|right-margin| to add space on both sides of the array and also space in the
+``large nodes'' of the first column and last column. In the following example,
+we have used the options |left-margin| and |right-margin|.\footnote{The
+options |left-margin| and |right-margin| take dimensions as values but, if no
+value is given, the default value is used, which is |\arraycolsep| (by
+default: 5~pt). There is also an option |margin| to fix both |left-margin| and
+|right-margin| to the same value.}
+\[\begin{pNiceMatrix}[create-large-nodes,left-margin,right-margin]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+ [every node/.style = {inner sep = 0 pt},
+ name suffix = -large]
+ \node [fit = (1-1),fill = red!15] {} ;
+ \node [fit = (1-3),fill = red!15] {} ;
+ \node [fit = (2-2),fill = red!15] {} ;
+ \node [fit = (3-1),fill = red!15] {} ;
+ \node [fit = (3-3),fill = red!15] {} ;
+ \node [fit = (1-2),fill = blue!15] {} ;
+ \node [fit = (2-1),fill = blue!15] {} ;
+ \node [fit = (2-3),fill = blue!15] {} ;
+ \node [fit = (3-2),fill = blue!15] {} ;
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c \\
+a & a & a + b \\
+a & a & a
+\end{pNiceMatrix}\]
+
+
+\medskip
+It's also possible to add more space on both side of the array with the
+options |extra-left-margin| and |extra-right-margin|. These margins are not
+incorporated in the ``large nodes''. It's possible to fix both values with the
+option |extra-margin| and, in the following example, we use |extra-margin|
+with the value $3$~pt.
+\[\begin{pNiceMatrix}[create-large-nodes,left-margin,right-margin,extra-right-margin=3pt,extra-left-margin=3pt]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+ [every node/.style = {inner sep = 0 pt},
+ name suffix = -large]
+ \node [fit = (1-1),fill = red!15] {} ;
+ \node [fit = (1-3),fill = red!15] {} ;
+ \node [fit = (2-2),fill = red!15] {} ;
+ \node [fit = (3-1),fill = red!15] {} ;
+ \node [fit = (3-3),fill = red!15] {} ;
+ \node [fit = (1-2),fill = blue!15] {} ;
+ \node [fit = (2-1),fill = blue!15] {} ;
+ \node [fit = (2-3),fill = blue!15] {} ;
+ \node [fit = (3-2),fill = blue!15] {} ;
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c \\
+a & a & a + b \\
+a & a & a
+\end{pNiceMatrix}\]
+
+
+
+\bigskip
+\textbf{Be careful} : These nodes are reconstructed from the contents of the
+contents cells of the array. Usually, they do not correspond to the cells
+delimited by the rules (if we consider that these rules are drawn).
+
+\bigskip
+\begin{minipage}[c]{7.6cm}
+Here is an array composed with the following code:
+
+\medskip
+\begin{BVerbatim}
+\large
+\begin{NiceTabular}{wl{2cm}ll}[hvlines]
+fraise & amande & abricot \\
+prune & pêche & poire \\[1ex]
+noix & noisette & brugnon
+\end{NiceTabular}
+\end{BVerbatim}
+\end{minipage}
+\hspace{0.9cm}
+\begin{scope}
+\large
+\begin{NiceTabular}[c]{wl{2cm}ll}[hvlines]
+fraise & amande & abricot \\
+prune & pêche & poire \\[1ex]
+noix & noisette & brugnon
+\end{NiceTabular}
+\end{scope}
+
+\vspace{1cm}
+\begin{minipage}[c]{7cm}
+Here, we have colored all the cells of the array with |\chessboardcolors|.
+\end{minipage}
+\hspace{1.5cm}
+\begin{scope}
+\large
+\begin{NiceTabular}[c]{wl{2cm}ll}[hvlines,code-before = \chessboardcolors{red!15}{blue!15}]
+fraise & amande & abricot \\
+prune & pêche & poire \\[1ex]
+noix & noisette & brugnon
+\end{NiceTabular}
+\end{scope}
+
+
+\vspace{1cm}
+\begin{minipage}[c]{7cm}
+Here are the ``large nodes'' of this array (without use of |margin|
+nor |extra-margin|).
+\end{minipage}
+\hspace{1.5cm}
+\begin{scope}
+\large
+\begin{NiceTabular}[c]{w{l}{2cm}ll}[hvlines,create-large-nodes]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+ [every node/.style = {inner sep = 0 pt},
+ name suffix = -large]
+ \node [fit = (1-1),fill = red!15] {} ;
+ \node [fit = (1-3),fill = red!15] {} ;
+ \node [fit = (2-2),fill = red!15] {} ;
+ \node [fit = (3-1),fill = red!15] {} ;
+ \node [fit = (3-3),fill = red!15] {} ;
+ \node [fit = (1-2),fill = blue!15] {} ;
+ \node [fit = (2-1),fill = blue!15] {} ;
+ \node [fit = (2-3),fill = blue!15] {} ;
+ \node [fit = (3-2),fill = blue!15] {} ;
+ \end{tikzpicture}
+\Body
+fraise & amande & abricot \\
+prune & pêche & poire \\[1ex]
+noix & noisette & brugnon
+\end{NiceTabular}
+\end{scope}
+
+
+\vspace{1cm}
+The nodes we have described are not available by default in the |\CodeBefore|
+(described p.~\pageref{code-before}).\par\nobreak
+
+\index{create-cell-nodes (key of \texttt{\textbackslash CodeBefore})}
+It's possible to have these nodes available in the |\CodeBefore| by using the
+key |create-cell-nodes| of the keyword |\CodeBefore| (in that case, the nodes
+are created first before the construction of the array by using informations
+written on the |aux| file and created a second time during the contruction of
+the array itself).
+
+\bigskip
+Here is an example which uses these nodes in the |\CodeAfter|.
+
+\begin{center}
+\fvset{commandchars=\~\#\+}
+\begin{Verbatim}
+\begin{NiceArray}{c@{\;}c@{\;}c@{\;}c@{\;}c}[create-medium-nodes]
+ u_1 &-& u_0 &=& r \\
+ u_2 &-& u_1 &=& r \\
+ u_3 &-& u_2 &=& r \\
+ u_4 &-& u_3 &=& r \\
+ \phantom{u_5} & & \phantom{u_4} &\smash{\vdots} & \\
+ u_n &-& u_{n-1} &=& r \\[3pt]
+ \hline
+ u_n &-& u_0 &=& nr \\
+\CodeAfter
+ \tikz[very thick, red, opacity=0.4, name suffix = -medium]
+ \draw (1-1.north west) -- (2-3.south east)
+ (2-1.north west) -- (3-3.south east)
+ (3-1.north west) -- (4-3.south east)
+ (4-1.north west) -- (5-3.south east)
+ (5-1.north west) -- (6-3.south east) ;
+\end{NiceArray}
+\end{Verbatim}
+\end{center}
+
+\[\begin{NiceArray}{c@{\;}c@{\;}c@{\;}c@{\;}c}[create-medium-nodes]
+ u_1 &-& u_0 &=& r \\
+ u_2 &-& u_1 &=& r \\
+ u_3 &-& u_2 &=& r \\
+ u_4 &-& u_3 &=& r \\
+ \phantom{u_5} & & \phantom{u_4} &\smash{\vdots} & \\
+ u_n &-& u_{n-1} &=& r \\[3pt]
+ \hline
+ u_n &-& u_0 &=& nr \\
+ \CodeAfter
+ \tikz[very thick, red, opacity=0.4, name suffix = -medium]
+ \draw (1-1.north west) -- (2-3.south east)
+ (2-1.north west) --(3-3.south east)
+ (3-1.north west) -- (4-3.south east)
+ (4-1.north west) -- (5-3.south east)
+ (5-1.north west) -- (6-3.south east) ;
+\end{NiceArray}\]
+
+
+
+\subsection{The nodes which indicate the position of the rules}
+
+\label{nodes-i}
+The package \pkg{nicematrix} creates a PGF/Tikz node merely called $i$ (with
+the classical prefix) at the intersection of the horizontal rule of number~$i$
+and the vertical rule of number~$i$ (more specifically the potential position
+of those rules because maybe there are not actually drawn). The last node has
+also an alias called |last|. There is also a node called $i$|.5| midway
+between the node $i$ and the node $i+1$.
+
+These nodes are available in the |\CodeBefore| and the |\CodeAfter|.
+
+\begin{center}
+\begin{NiceTabular}{ccc}[hvlines,rules/width=1pt,rules/color=gray]
+ & tulipe & lys \\
+arum & & violette mauve \\
+muguet & dahlia
+\CodeAfter
+ \tiny
+ \begin{tikzpicture}
+ \foreach \i in {1,1.5,2,2.5,3,3.5,4}
+ {
+ \fill [red] (\i) circle (0.5mm) ;
+ \node [red,above right] at (\i) {\i} ;
+ }
+ \end{tikzpicture}
+\end{NiceTabular}
+\end{center}
+
+\bigskip
+If we use Tikz (we remind that \pkg{nicematrix} does not load Tikz by default,
+by only \textsc{pgf}, which is a sub-layer of Tikz), we can access, in the
+|\CodeAfter| but also in the |\CodeBefore|, to the intersection of the
+(potential) horizontal rule~$i$ and the (potential) vertical rule~$j$ with the
+syntax |(|$i$\verb+-|+$j$|)|.
+
+\medskip
+\begin{Verbatim}
+\begin{NiceMatrix}
+\CodeBefore
+ ~emphase#\tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ;@
+\Body
+1 \\
+1 & 1 \\
+1 & 2 & 1 \\
+1 & 3 & 3 & 1 \\
+1 & 4 & 6 & 4 & 1 \\
+1 & 5 & 10 & 10 & 5 & 1 \\
+1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\
+1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
+\end{NiceMatrix}
+\end{Verbatim}
+%
+\[\begin{NiceMatrix}
+\CodeBefore
+ \tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ;
+\Body
+1 \\
+1 & 1 \\
+1 & 2 & 1 \\
+1 & 3 & 3 & 1 \\
+1 & 4 & 6 & 4 & 1 \\
+1 & 5 & 10 & 10 & 5 & 1 \\
+1 & 6 & 15 & 20 & 15 & 6 & 1 \\
+1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\
+1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
+\end{NiceMatrix}\]
+
+
+\bigskip
+The nodes of the form $i$|.5| may be used, for example to cross a row of a
+matrix (if Tikz is loaded).
+
+\smallskip
+\begin{BVerbatim}[boxwidth=11cm,baseline=c]
+$\begin{pNiceArray}{ccc|c}
+2 & 1 & 3 & 0 \\
+3 & 3 & 1 & 0 \\
+3 & 3 & 1 & 0
+\CodeAfter
+ \tikz \draw [red] (~emphase#3.5 at -|1) -- (~emphase#3.5 at -|last) ;
+\end{pNiceArray}$
+\end{BVerbatim}
+$\begin{pNiceArray}{ccc|c}
+2 & 1 & 3 & 0 \\
+3 & 3 & 1 & 0 \\
+3 & 3 & 1 & 0
+\CodeAfter
+ \tikz \draw [red] (3.5-|1) -- (3.5-|last) ;
+\end{pNiceArray}$
+
+\subsection{The nodes corresponding to the command \textbackslash SubMatrix}
+
+\label{node-sub-matrix}
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})}
+\index{name!key of \texttt{\textbackslash SubMatrix}}
+
+
+The command |\SubMatrix| available in the |\CodeAfter| has been described
+p.~\pageref{sub-matrix}.
+
+\smallskip
+If a command |\SubMatrix| has been used with the key |name| with an expression
+such as |name=|\textsl{\ttfamily MyName} three PGF/Tikz nodes are created
+with the names \textsl{\ttfamily MyName}|-left|, \textsl{\ttfamily MyName} and
+\textsl{\ttfamily MyName}|-right|.
+
+\smallskip
+The nodes \textsl{\ttfamily MyName}|-left| and \textsl{\ttfamily
+MyName}|-right| correspond to the delimiters left and right and the node
+\textsl{\ttfamily MyName} correspond to the submatrix itself.
+
+\medskip
+In the following example, we have highlighted these nodes (the submatrix itself has
+been created with |\SubMatrix\{{2-2}{3-3}\}|).
+
+\[\begin{pNiceMatrix}
+121 & 23 & 345 & 345\\
+45 & 346 & 863 & 444\\
+3462 & 38458 & 34 & 294 \\
+34 & 7 & 78 & 309 \\
+\CodeAfter
+ \SubMatrix\{{2-2}{3-3}\}[name=A]
+ \begin{tikzpicture}
+ [every node/.style = {blend mode = multiply,
+ inner sep = 0 pt}]
+ \node [fit = (A),fill = red!15] {} ;
+ \node [fit = (A-left),fill = blue!15] {} ;
+ \node [fit = (A-right),fill = blue!15] {} ;
+ \end{tikzpicture}
+\end{pNiceMatrix}\]
+
+\index{node@\textbf{Nodes of PGF/Tikz}|)}
+
+\section{API for the developpers}
+
+The package \pkg{nicematrix} provides two variables which are internal but
+public\footnote{According to the LaTeX3 conventions,
+each variable with name beginning with |\g_nicematrix| ou |\l_nicematrix| is
+public and each variable with name beginning with |\g__nicematrix| or
+|\l__nicematrix| is private.}:
+\begin{itemize}
+\item |\g_nicematrix_code_before_tl| ;
+\item |\g_nicematrix_code_after_tl|.
+\end{itemize}
+
+
+\medskip
+These variables contain the code of what we have called the ``|code-before|''
+(usually specified at the beginning of the environment with the syntax using
+the keywords |\CodeBefore| and |\Body|) and the ``|code-after|'' (usually
+specified at the end of the environment after the keyword |\CodeAfter|). The
+developper can use them to add code from a cell of the array (the affectation
+must be global, allowing to exit the cell, which is a TeX group).
+
+\medskip
+One should remark that the use of |\g_nicematrix_code_before_tl| needs one
+compilation more (because the instructions are written on the |aux| file to be
+used during the next run).
+
+\bigskip
+\emph{Example} : We want to write a command |\crossbox| to draw a cross in the
+current cell. This command will take in an optional argument between square
+brackets for a list of pairs \textsl{key}-\textsl{value} which will be given to
+Tikz before the drawing.
+
+It's possible to program such command |\crossbox| as follows, explicitely
+using the public variable |\g_nicematrix_code_before_tl|.
+
+\index{crossbox@\texttt{\textbackslash crossbox} (defined in an example)|textit}
+
+\begin{scope}
+\fvset{commandchars=\§\¤\μ}
+\begin{Verbatim}
+\ExplSyntaxOn
+\cs_new_protected:Nn \__pantigny_crossbox:nnn
+ {
+ \tikz \draw [ #3 ]
+ ( #1 -| \int_eval:n { #2 + 1 } ) -- ( \int_eval:n { #1 + 1 } -| #2 )
+ ( #1 -| #2 ) -- ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ;
+ }
+
+\NewDocumentCommand \crossbox { ! O { } }
+ {
+ \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ
+ {
+ \__pantigny_crossbox:nnn
+ { \int_use:c { c at iRow } }
+ { \int_use:c { c at jCol } }
+ { \exp_not:n { #1 } }
+ }
+ }
+\ExplSyntaxOff
+\end{Verbatim}
+\end{scope}
+
+
+\ExplSyntaxOn
+\cs_new_protected:Nn \__pantigny_crossbox:nnn
+ {
+ \tikz \draw [ #3 ]
+ ( #1 -| \int_eval:n { #2 + 1 } ) -- ( \int_eval:n { #1 + 1 } -| #2 )
+ ( #1 -| #2 ) -- ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ;
+ }
+
+
+\NewDocumentCommand \crossbox { ! O { } }
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_before_tl
+ {
+ \__pantigny_crossbox:nnn
+ { \int_use:c { c at iRow } }
+ { \int_use:c { c at jCol } }
+ { \exp_not:n { #1 } }
+ }
+ }
+\ExplSyntaxOff
+
+\bigskip
+Here is an example of utilisation:
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=9cm]
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ \arraycolor{gray!10}
+\Body
+merlan & requin & cabillaud \\
+baleine & ~emphase#\crossbox[red]@ & morue \\
+mante & raie & poule
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ \arraycolor{gray!10}
+\Body
+merlan & requin & cabillaud \\
+baleine & \crossbox[red] & morue \\
+mante & raie & poule
+\end{NiceTabular}
+
+
+
+\section{Technical remarks}
+
+First remark: the package \pkg{underscore} must be loaded before
+\pkg{nicematrix}. If it is loaded after, an error will be raised.
+
+\subsection{Diagonal lines}
+
+\label{parallelization}
+\index{parallelize-diags}
+\index{Ddots@\texttt{\textbackslash Ddots}}
+\index{Iddots@\texttt{\textbackslash Iddots}}
+
+By default, all the diagonal lines\footnote{We speak of the lines created by
+|\Ddots| and not the lines created by a command |\line| in the |\CodeAfter|.} of a
+same array are ``parallelized''. That means that the first diagonal line is
+drawn and, then, the other lines are drawn parallel to the first one (by
+rotation around the left-most extremity of the line). That's why the position
+of the instructions |\Ddots| in the array can have a marked effect on the
+final result.
+
+\medskip
+In the following examples, the first |\Ddots| instruction is written in color:
+
+% \medskip
+\begin{scope}
+\begin{minipage}{9.5cm}
+Example with parallelization (default):
+\begin{Verbatim}
+$A = \begin{pNiceMatrix}
+1 & \Cdots & & 1 \\
+a+b & ~emphase#\Ddots@~ & & \Vdots \\
+\Vdots & \Ddots & & \\
+a+b & \Cdots & a+b & 1
+\end{pNiceMatrix}$
+\end{Verbatim}
+\end{minipage}
+$A = \begin{pNiceMatrix}
+1 & \Cdots & & 1 \\
+a+b & \Ddots & & \Vdots \\
+\Vdots & \Ddots & & \\
+a+b & \Cdots & a+b & 1
+\end{pNiceMatrix}$
+
+\bigskip
+\NiceMatrixOptions{parallelize-diags=true}%
+\begin{minipage}{9.5cm}
+\begin{Verbatim}
+$A = \begin{pNiceMatrix}
+1 & \Cdots & & 1 \\
+a+b & & & \Vdots \\
+\Vdots & ~emphase#\Ddots@~ & \Ddots & \\
+a+b & \Cdots & a+b & 1
+\end{pNiceMatrix}$
+\end{Verbatim}
+\end{minipage}
+$A = \begin{pNiceMatrix}
+1 & \Cdots & & 1 \\
+a+b & & & \Vdots \\
+\Vdots & \Ddots & \Ddots & \\
+a+b & \Cdots & a+b & 1
+\end{pNiceMatrix}$
+
+\bigskip
+It's possible to turn off the parallelization with the option
+|parallelize-diags| set to |false|: \par\nobreak
+
+\medskip
+\NiceMatrixOptions{parallelize-diags=false}%
+\begin{minipage}{9.5cm}
+The same example without parallelization:
+\end{minipage}
+$A = \begin{pNiceMatrix}
+1 & \Cdots & & 1 \\
+a+b & \Ddots & & \Vdots \\
+\Vdots & \Ddots & & \\
+a+b & \Cdots & a+b & 1
+\end{pNiceMatrix}$
+
+\end{scope}
+
+It's possible to specify the instruction |\Ddots| which will be drawn first
+(and which will be used to draw the other diagonal dotted lines when the
+parallelization is in force) with the key |draw-first|: |\Ddots[draw-first]|.
+
+\subsection[The empty cells]{The ``empty'' cells}
+
+\label{empty-cells}
+An instruction like |\Ldots|, |\Cdots|, etc. tries to determine the first
+non-empty cell on both sides. When the key |corners| is used
+(cf.~p.~\pageref{corners}), \pkg{nicematrix} computes corners consisting of
+empty cells. However, an ``empty cell'' is not necessarily a cell with no TeX
+content (that is to say a cell with no token between the two ampersands~|&|).
+The precise rules are as follow.
+
+\begin{itemize}
+\item An implicit cell is empty. For example, in the following matrix:
+
+\begin{Verbatim}
+\begin{pmatrix}
+a & b \\
+c \\
+\end{pmatrix}
+\end{Verbatim}
+
+the last cell (second row and second column) is empty.
+
+\medskip
+\item For the columns of type |p|, |m|, |b|, |V|\footnote{The columns of type
+|V| are provided by \pkg{varwidth}: cf.~p.~\pageref{varwidth}.} and
+|X|\footnote{See p.~\pageref{X-columns}}, the cell is empty if (and only if)
+its content in the TeX code is empty (there is only spaces between the
+ampersands |&|).
+
+\medskip
+\item For the columns of type |c|, |l|, |r| and |w{...}{...}|, the cell is
+empty if (and only if) its TeX output has a width equal to zero.
+
+\medskip
+\item \indexcommand{NotEmpty}
+A cell containing the command |\NotEmpty| is not empty (and a PGF/Tikz
+node is created in that cell).
+
+\medskip
+\item A cell with only a command |\Hspace| (or |\Hspace*|) is empty. This
+command |\Hspace| is a command defined by the package \pkg{nicematrix} with
+the same meaning as |\hspace| except that the cell where it is used is
+considered as empty. This command can be used to fix the width of some columns
+of the matrix without interfering with \pkg{nicematrix}.
+\end{itemize}
+
+
+\subsection{The option exterior-arraycolsep}
+
+\index{exterior-arraycolsep}
+
+The environment |{array}| inserts an horizontal space equal to |\arraycolsep|
+before and after each column. In particular, there is a space equal to
+|\arraycolsep| before and after the array. This feature of the environment
+|{array}| was probably not a good idea\footnote{In the documentation of
+\pkg{amsmath}, we can read: {\itshape The extra space of |\arraycolsep| that
+\pkg{array} adds on each side is a waste so we remove it [in |{matrix}|]
+(perhaps we should instead remove it from array in general, but that's a
+harder task).}}. The environment |{matrix}| of
+\pkg{amsmath} and its variants (|{pmatrix}|, |{vmatrix}|, etc.) of
+\pkg{amsmath} prefer to delete these spaces with explicit instructions
+|\hskip -\arraycolsep|\footnote{And not by inserting |@{}| on both sides of the
+preamble of the array. As a consequence, the length of the |\hline| is not
+modified and may appear too long, in particular when using square brackets.}.
+The package \pkg{nicematrix} does the same in all its environments,
+|{NiceArray}| included. However, if the user wants the environment
+|{NiceArray}| behaving by default like the environment |{array}| of
+\pkg{array} (for example, when adapting an existing document) it's possible to
+control this behaviour with the option |exterior-arraycolsep|, set by the
+command |\NiceMatrixOptions|. With this option, exterior spaces of length
+|\arraycolsep| will be inserted in the environments |{NiceArray}| (the other
+environments of \pkg{nicematrix} are not affected).
+
+
+
+
+\subsection{Incompatibilities}
+
+\index{Incompatibilities}
+
+The package \pkg{nicematrix} is not compatible with the class \cls{ieeeaccess}
+(because that class is not compatible with PGF/Tikz).\footnote{See
+ \url{https://tex.stackexchange.com/questions/528975/error-loading-tikz-in-ieeeaccess-class}}
+
+\bigskip
+In order to use \pkg{nicematrix} with the class \cls{aastex631}
+(of the \emph{American Astronomical Society}), you have to
+add the following lines in the preamble of your document :
+
+\begin{Verbatim}
+\BeforeBegin{NiceTabular}{\let\begin\BeginEnvironment\let\end\EndEnvironment}
+\BeforeBegin{NiceArray}{\let\begin\BeginEnvironment}
+\BeforeBegin{NiceMatrix}{\let\begin\BeginEnvironment}
+\end{Verbatim}
+
+\bigskip
+In order to use \pkg{nicematrix} with the class \cls{sn-jnl} (of
+\emph{Springer Nature}), \pkg{pgf} must
+be loaded before the |\documentclass| with |\RequirePackage|:
+
+\begin{Verbatim}
+\RequirePackage{pgf}
+\documentclass{sn-jnl}
+\end{Verbatim}
+
+\bigskip
+The package \pkg{nicematrix} is not fully compatible with the packages and classes
+of \LuaTeX-ja: the detection of the empty corners (cf. % p.~\pageref{corners})
+may be wrong in some circonstances.
+
+\bigskip
+The package \pkg{nicematrix} is not fully compatible with the package
+\pkg{arydshln} (because this package redefines many internals of \pkg{array}).
+By any means, in the context of \pkg{nicematrix}, it's recommended to draw
+dashed rules with the tools provided by \pkg{nicematrix}, by creating a
+customized line style with |custom-line|: cf.~p.~\pageref{custom-line}.
+
+\bigskip
+The columns |d| of \pkg{dcolumn} are not supported (but it's possible to use
+the colums |S| of \pkg{siunitx}).
+
+\section{Examples}
+
+\subsection[{Utilisation of the key 'tikz' of the command \textbackslash
+Block}]{Utilisation of the key ``tikz'' of the command \textbackslash Block}
+\label{tikz-key-examples}
+
+\index{tikzz at tikz!key of \texttt{\textbackslash Block}|textit}
+
+The key |tikz| of the command |\Block| is available only when Tikz is
+loaded.\footnote{By default, \pkg{nicematrix} only loads \textsc{pgf}, which is
+a sub-layer of Tikz.}
+
+For the following example, we also need the Tikz library |patterns|.
+
+\begin{Verbatim}
+\usetikzlibrary{patterns}
+\end{Verbatim}
+
+
+\begin{Verbatim}
+\ttfamily \small
+\begin{NiceTabular}{X[m]X[m]X[m]}[hvlines,cell-space-limits=3pt]
+ \Block[~emphase#tikz={pattern=grid,pattern color=lightgray}@]{}
+ {pattern = grid,\\ pattern color = lightgray}
+& \Block[~emphase#tikz={pattern = north west lines,pattern color=blue}@]{}
+ {pattern = north west lines,\\ pattern color = blue}
+& \Block[~emphase#tikz={outer color = red!50, inner color=white }@]{2-1}
+ {outer color = red!50,\\ inner color = white} \\
+ \Block[~emphase#tikz={pattern = sixpointed stars, pattern color = blue!15}@]{}
+ {pattern = sixpointed stars,\\ pattern color = blue!15}
+& \Block[~emphase#tikz={left color = blue!50}@]{}
+ {left color = blue!50} \\
+\end{NiceTabular}
+\end{Verbatim}
+
+\begin{center}
+\ttfamily \small
+\begin{NiceTabular}{X[m]X[m]X[m]}[hvlines,cell-space-limits=3pt]
+ \Block[tikz={pattern=grid,pattern color=lightgray}]{}
+ {pattern = grid,\\ pattern color = lightgray}
+& \Block[tikz={pattern = north west lines,pattern color=blue}]{}
+ {pattern = north west lines,\\ pattern color = blue}
+& \Block[tikz={outer color = red!50, inner color=white }]{2-1}
+ {outer color = red!50,\\ inner color = white} \\
+ \Block[tikz={pattern = sixpointed stars, pattern color = blue!15}]{}
+ {pattern = sixpointed stars,\\ pattern color = blue!15}
+& \Block[tikz={left color = blue!50}]{}
+ {left color = blue!50} \\
+\end{NiceTabular}
+\end{center}
+
+\bigskip
+In the following example, we use the key |tikz| to hatch a row of the tabular.
+Remark that you use the key |transparent| of the command |\Block| in order to
+have the rules drawn in the block.\footnote{By default, the rules are not
+drawn in the blocks created by the command |\Block|: cf.~section~\ref{rules}
+p.~\pageref{rules}}
+
+\index{transparent (key of \texttt{\textbackslash Block})|textit}
+\index{columncolor@\texttt{\textbackslash columncolor}!command of
+ \texttt{\textbackslash CodeBefore}|textit}
+
+
+\begin{Verbatim}
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ \columncolor[RGB]{169,208,142}{2}
+\Body
+one & two & three \\
+\Block[~emphase#transparent, tikz={pattern = north west lines, pattern color = gray}@]{1-*}{}
+four & five & six \\
+seven & eight & nine
+\end{Verbatim}
+
+\begin{center}
+\begin{NiceTabular}{ccc}[hvlines]
+\CodeBefore
+ \columncolor[RGB]{169,208,142}{2}
+\Body
+one & two & three \\
+\Block[transparent, tikz={pattern = north west lines, pattern color = gray}]{1-*}{}
+four & five & six \\
+seven & eight & nine
+\end{NiceTabular}
+\end{center}
+
+\subsection{Use with tcolorbox}
+
+\label{tcolorbox}
+\index{tcolorbox@\pkg{tcolorbox} (package)|textit}
+
+Here is an example of use of |{NiceTabular}| within a command |\tcbox| of
+\pkg{tcolorbox}. We have used the key |hvlines-except-borders| in order all
+the rules excepted on the borders (which are, of course, added by \pkg{tcolorbox})
+
+\medskip
+\begin{BVerbatim}
+\tcbset
+ {
+ colframe = blue!50!black ,
+ colback = white ,
+ colupper = red!50!black ,
+ fonttitle = \bfseries ,
+ nobeforeafter ,
+ center title
+ }
+
+\tcbox
+ [
+ left = 0mm ,
+ right = 0mm ,
+ top = 0mm ,
+ bottom = 0mm ,
+ boxsep = 0mm ,
+ toptitle = 0.5mm ,
+ bottomtitle = 0.5mm ,
+ title = My table
+ ]
+ {
+ \renewcommand{\arraystretch}{1.2}% <-- the % is mandatory here
+ \begin{NiceTabular}{rcl}[~emphase#hvlines-except-borders@,rules/color=blue!50!black]
+ \CodeBefore
+ \rowcolor{red!15}{1}
+ \Body
+ One & Two & Three \\
+ Men & Mice & Lions \\
+ Upper & Middle & Lower
+ \end{NiceTabular}
+ }
+\end{BVerbatim}
+
+
+\index{hvlines-except-borders|textit}
+\index{rules (key for an environment)|textit}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!command of \texttt{\textbackslash CodeBefore}|textit}
+
+\medskip
+\begin{center}
+\tcbset
+ {
+ colframe = blue!50!black ,
+ colback = white ,
+ colupper = red!50!black ,
+ fonttitle = \bfseries ,
+ nobeforeafter ,
+ center title
+ }
+
+\tcbox
+ [
+ left = 0mm ,
+ right = 0mm ,
+ top = 0mm ,
+ bottom = 0mm ,
+ boxsep = 0mm ,
+ toptitle = 0.5mm ,
+ bottomtitle = 0.5mm ,
+ title = My table
+ ]
+ {
+ \renewcommand{\arraystretch}{1.2}\begin{NiceTabular}{rcl}[hvlines-except-borders,rules/color=blue!50!black]
+ \CodeBefore
+ \rowcolor{red!15}{1}
+ \Body
+ One & Two & Three \\
+ Men & Mice & Lions \\
+ Upper & Middle & Lower
+ \end{NiceTabular}
+ }
+\end{center}
+
+
+
+\vspace{1cm}
+That example shows the use of \pkg{nicematrix} in conjunction with
+\pkg{tcolorbox}. If one wishes a tabular with an exterior frame with rounded
+corners, it's not necessary to use \pkg{tcolorbox}: it's possible to use the
+command |\Block| with the key |rounded-corners|.
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
+\begin{NiceTabular}{rcl}[hvlines-except-borders]
+\Block[draw,transparent,~emphase#rounded-corners@]{*-*}{}
+ One & Two & Three \\
+ Men & Mice & Lions \\
+ Upper & Middle & Lower
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{rcl}[hvlines-except-borders]
+\Block[draw,transparent,rounded-corners]{*-*}{}
+ One & Two & Three \\
+ Men & Mice & Lions \\
+ Upper & Middle & Lower
+\end{NiceTabular}
+
+\medskip
+We have used the key |transparent| to have the rules specified by
+|hvlines-except-borders| drawn in the blocks (by default, the rules are not
+drawn in the blocks).
+
+\subsection{Notes in the tabulars}
+
+\index{nota@\textbf{Notes in the tabulars}|textit}
+\index{tabularnote@\texttt{\textbackslash tabularnote}|textit}
+\index{notes (key to customize the notes of a\newline tabular)|textit}
+\index{style (subkey of ``notes'')|textit}
+\index{enumitem-keys (subkey of ``notes'')|textit}
+\index{enumitem@\pkg{enumitem} (package required to use\newline \texttt{\textbackslash tabularnote})|textit}
+
+
+\label{ex:notes}
+
+The tools provided by \pkg{nicematrix} for the composition of the tabular
+notes have been presented in the section \ref{s:notes} p.~\pageref{s:notes}.
+
+\medskip
+Let's consider that we wish to number the notes of a tabular with
+stars.\footnote{Of course, it's realistic only when there is very few notes in
+the tabular.}
+
+\medskip
+First, we write a command |\stars| similar the well-known commands
+|\arabic|, |\alph|, |\Alph|, etc. which produces a number of stars equal to
+its argument\footnote{In fact: the value of its argument.}.
+\begin{Verbatim}
+\ExplSyntaxOn
+\NewDocumentCommand ~emphase#\stars@ { m }
+ { \prg_replicate:nn { \value { ~#1 } } { $ \star $ } }
+\ExplSyntaxOff
+\end{Verbatim}
+%
+Of course, we change the style of the labels with the key |notes/style|.
+However, it would be interesting to change also some parameters in the type of
+list used to compose the notes at the end of the tabular.
+First, we required a composition flush right for the labels with the setting
+|align=right|.
+Moreover, we want the labels to be composed on a width equal to the width of
+the widest label. The widest label is, of course, the label with the greatest
+number of stars. We know that number: it is equal to |\value{tabularnote}|
+(because |tabularnote| is the LaTeX counter used by |\tabularnote| and,
+therefore, at the end of the tabular, its value is equal to the total number
+of tabular notes). We use the key |widest*| of \pkg{enumitem} in order to
+require a width equal to that value: |widest*=\value{tabularnote}|.
+\begin{Verbatim}
+\NiceMatrixOptions
+ {
+ notes =
+ {
+ ~emphase#style = \stars{~#1} , @
+ ~emphase#enumitem-keys = @
+ ~emphase# { @
+ ~emphase# widest* = \value{tabularnote} ,@
+ ~emphase# align = right @
+ ~emphase# } @
+ }
+ }
+\end{Verbatim}
+
+
+
+\begin{scope}
+\ExplSyntaxOn
+\NewDocumentCommand \stars { m }
+ { \prg_replicate:nn { \value { #1 } } { $ \star $ } }
+\NiceMatrixOptions
+ {
+ notes =
+ {
+ style = \stars{#1} ,
+ enumitem-keys =
+ {
+ widest* = \value{tabularnote} ,
+ align = right
+ }
+ }
+ }
+\ExplSyntaxOff
+\begin{Verbatim}
+\begin{NiceTabular}{~@{}llr~@{}}
+\toprule \RowStyle{\bfseries}
+Last name & First name & Birth day \\
+\midrule
+Achard\tabularnote{~emphase#Achard is an old family of the Poitou.@}
+& Jacques & 5 juin 1962 \\
+Lefebvre\tabularnote{~emphase#The name Lefebvre is an alteration of the name Lefebure.@}
+& Mathilde & 23 mai 1988 \\
+Vanesse & Stephany & 30 octobre 1994 \\
+Dupont & Chantal & 15 janvier 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{Verbatim}
+
+\begin{center}
+\begin{NiceTabular}{@{}llr@{}}
+\toprule \RowStyle{\bfseries}
+Last name & First name & Birth day \\
+\midrule
+Achard\tabularnote{Achard is an old family of the Poitou.}
+& Jacques & June 5, 2005 \\
+Lefebvre\tabularnote{The name Lefebvre is an alteration of the name Lefebure.}
+& Mathilde & January 23, 1975 \\
+Vanesse & Stephany & October 30, 1994 \\
+Dupont & Chantal & January 15, 1998 \\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+\end{scope}
+
+
+
+\subsection{Dotted lines}
+
+\index{dotted@\textbf{Dotted lines}|textit}
+
+An example with the resultant of two polynoms:\par\nobreak
+
+\bigskip
+\begin{BVerbatim}
+\setlength{\extrarowheight}{1mm}
+\[\begin{vNiceArray}{cccc:ccc}[columns-width=6mm]
+a_0 & && &b_0 & & \\
+a_1 &\Ddots&& &b_1 &\Ddots& \\
+\Vdots&\Ddots&& &\Vdots &\Ddots&b_0 \\
+a_p & &&a_0 & & &b_1 \\
+ &\Ddots&&a_1 &b_q & &\Vdots\\
+ & &&\Vdots & &\Ddots& \\
+ & &&a_p & & &b_q
+\end{vNiceArray}\]
+\end{BVerbatim}
+
+\bigskip
+\index{Ddots@\texttt{\textbackslash Ddots}|textit}
+
+\begin{scope}
+\setlength{\extrarowheight}{1mm}
+\[\begin{vNiceArray}{cccc:ccc}[columns-width=6mm]
+a_0 & && &b_0 & & \\
+a_1 &\Ddots&& &b_1 &\Ddots& \\
+\Vdots&\Ddots&& &\Vdots &\Ddots&b_0 \\
+a_p & &&a_0 & & &b_1 \\
+ &\Ddots&&a_1 &b_q & &\Vdots\\
+ & &&\Vdots & &\Ddots& \\
+ & &&a_p & & &b_q
+\end{vNiceArray}\]
+\end{scope}
+
+\vspace{2cm}
+An example for a linear system:\par\nobreak
+
+\index{last-col|textit}
+\index{code-for-last-col|textit}
+
+\begin{Verbatim}
+$\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
+1 & 1 & 1 &\Cdots & & 1 & 0 & \\
+0 & 1 & 0 &\Cdots & & 0 & & L_2 \gets L_2-L_1 \\
+0 & 0 & 1 &\Ddots & & \Vdots & & L_3 \gets L_3-L_1 \\
+ & & &\Ddots & & & \Vdots & \Vdots \\
+\Vdots & & &\Ddots & & 0 & \\
+0 & & &\Cdots & 0 & 1 & 0 & L_n \gets L_n-L_1
+\end{pNiceArray}$
+\end{Verbatim}
+
+
+\[\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
+1 & 1 & 1 &\Cdots & & 1 & 0 & \\
+0 & 1 & 0 &\Cdots & & 0 & & L_2 \gets L_2-L_1 \\
+0 & 0 & 1 &\Ddots & & \Vdots & & L_3 \gets L_3-L_1 \\
+ & & &\Ddots & & & \Vdots & \Vdots \\
+\Vdots & & &\Ddots & & 0 & \\
+0 & & &\Cdots & 0 & 1 & 0 & L_n \gets L_n-L_1
+\end{pNiceArray}\]
+
+
+
+\subsection{Dotted lines which are no longer dotted}
+
+The option |line-style| controls the style of the lines drawn by |\Ldots|,
+|\Cdots|, etc. Thus, it's possible with these commands to draw lines which are
+not longer dotted.
+
+\index{line-style (key for the dotted rules)|textit}
+
+\begin{Verbatim}[formatcom=\small\color{gray}]
+\NiceMatrixOptions{code-for-first-row = \scriptstyle,code-for-first-col = \scriptstyle }
+\setcounter{MaxMatrixCols}{12}
+\newcommand{\blue}{\color{blue}}
+\[\begin{pNiceMatrix}[last-row,last-col,nullify-dots,xdots/line-style={dashed,blue}]
+1& & & \Vdots & & & & \Vdots \\
+& \Ddots[line-style=standard] \\
+& & 1 \\
+\Cdots[color=blue,line-style=dashed]& & & \blue 0 &
+\Cdots & & & \blue 1 & & & \Cdots & \blue \leftarrow i \\
+& & & & 1 \\
+& & &\Vdots & & \Ddots[line-style=standard] & & \Vdots \\
+& & & & & & 1 \\
+\Cdots & & & \blue 1 & \Cdots & & \Cdots & \blue 0 & & & \Cdots & \blue \leftarrow j \\
+& & & & & & & & 1 \\
+& & & & & & & & & \Ddots[line-style=standard] \\
+& & & \Vdots & & & & \Vdots & & & 1 \\
+& & & \blue \overset{\uparrow}{i} & & & & \blue \overset{\uparrow}{j} \\
+\end{pNiceMatrix}\]
+\end{Verbatim}
+
+\index{code-for-first-row|textit}
+\index{code-for-last-col|textit}
+
+
+\begin{scope}
+\NiceMatrixOptions{code-for-first-row = \scriptstyle,code-for-first-col = \scriptstyle }
+\setcounter{MaxMatrixCols}{12}
+\newcommand{\blue}{\color{blue}}
+\[\begin{pNiceMatrix}[last-row,last-col,nullify-dots,xdots/line-style={dashed,blue}]
+1& & & \Vdots & & & & \Vdots \\
+& \Ddots[line-style=standard] \\
+& & 1 \\
+\Cdots[color=blue,line-style=dashed]& & & \blue 0 &
+\Cdots & & & \blue 1 & & & \Cdots & \blue \leftarrow i \\
+& & & & 1 \\
+& & &\Vdots & & \Ddots[line-style=standard] & & \Vdots \\
+& & & & & & 1 \\
+\Cdots & & & \blue 1 & \Cdots & & \Cdots & \blue 0 & & & \Cdots & \blue \leftarrow j \\
+& & & & & & & & 1 \\
+& & & & & & & & & \Ddots[line-style=standard] \\
+& & & \Vdots & & & & \Vdots & & & 1 \\
+& & & \blue \overset{\uparrow}{i} & & & & \blue \overset{\uparrow}{j} \\
+\end{pNiceMatrix}\]
+\end{scope}
+
+\interitem
+In fact, it's even possible to draw solid lines with the commands |\Cdots|,
+|\Vdots|, etc.\footnote{In this document, the Tikz library \pkg{arrows.meta}
+has been loaded, which impacts the shape of the arrow tips.}
+
+\begin{Verbatim}
+\NiceMatrixOptions
+ {nullify-dots,code-for-first-col = \color{blue},code-for-first-row=\color{blue}}
+$\begin{pNiceMatrix}[first-row,first-col]
+ & & \Ldots[line-style={solid,<->},shorten=0pt]^{n \text{ columns}} \\
+ & 1 & 1 & 1 & \Ldots & 1 \\
+ & 1 & 1 & 1 & & 1 \\
+\Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 & & 1 \\
+ & 1 & 1 & 1 & & 1 \\
+ & 1 & 1 & 1 & \Ldots & 1
+\end{pNiceMatrix}$
+\end{Verbatim}
+
+
+\begin{scope}
+\NiceMatrixOptions
+ {nullify-dots,code-for-first-col = \color{blue},code-for-first-row=\color{blue}}
+\[\begin{pNiceMatrix}[first-row,first-col]
+ & & \Ldots[line-style={solid,<->},shorten=0pt]^{n \text{ columns}} \\
+ & 1 & 1 & 1 & \Ldots & 1 \\
+ & 1 & 1 & 1 & & 1 \\
+\Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 & & 1 \\
+ & 1 & 1 & 1 & & 1 \\
+ & 1 & 1 & 1 & \Ldots & 1
+\end{pNiceMatrix}\]
+\end{scope}
+
+\subsection{Dashed rules}
+\label{dashed}
+\index{tikzz at tikz!key of ``borders'' de \texttt{\textbackslash Block}|textit}
+
+In the following example, we use the command |\Block| to draw dashed rules.
+For that example, Tikz should be loaded (by |\usepackage{tikz}|).
+
+
+\begin{Verbatim}
+\begin{pNiceMatrix}
+~emphase#\Block[borders={bottom,right,tikz=dashed}]{2-2}{}@
+1 & 2 & 0 & 0 & 0 & 0 \\
+4 & 5 & 0 & 0 & 0 & 0 \\
+0 & 0 & ~emphase#\Block[borders={bottom,top,right,left,tikz=dashed}]{2-2}{}@
+ 7 & 1 & 0 & 0 \\
+0 & 0 & -1 & 2 & 0 & 0 \\
+0 & 0 & 0 & 0 & ~emphase#\Block[borders={left,top,tikz=dashed}]{2-2}{}@
+ 3 & 4 \\
+0 & 0 & 0 & 0 & 1 & 4
+\end{pNiceMatrix}
+\end{Verbatim}
+
+
+\[\begin{pNiceMatrix}
+\Block[borders={bottom,right,tikz=dashed}]{2-2}{}
+1 & 2 & 0 & 0 & 0 & 0 \\
+4 & 5 & 0 & 0 & 0 & 0 \\
+0 & 0 & \Block[borders={bottom,top,right,left,tikz=dashed}]{2-2}{}
+ 7 & 1 & 0 & 0 \\
+0 & 0 & -1 & 2 & 0 & 0 \\
+0 & 0 & 0 & 0 & \Block[borders={left,top,tikz=dashed}]{2-2}{}
+ 3 & 4 \\
+0 & 0 & 0 & 0 & 1 & 4
+\end{pNiceMatrix}\]
+
+
+\subsection{Stacks of matrices}
+
+\index{NiceMatrixBlock@\texttt{\{NiceMatrixBlock\}}|textit}
+
+We often need to compose mathematical matrices on top on each other (for
+example for the resolution of linear systems).
+
+\medskip
+In order to have the columns aligned one above the other, it's possible to
+fix a width for all the columns. That's what is done in the following example
+with the environment |{NiceMatrixBlock}| and its option |auto-columns-width|.
+
+\begin{Verbatim}[formatcom=\small\color{gray}]
+~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
+\NiceMatrixOptions
+ {
+ light-syntax,
+ last-col, code-for-last-col = \color{blue} \scriptstyle,
+ }
+\setlength{\extrarowheight}{1mm}
+
+$\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+ 3 -18 12 1 4 ;
+-3 -46 29 -2 -15 ;
+ 9 10 -5 4 7
+\end{pNiceArray}$
+
+\smallskip
+$\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 ;
+0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ;
+0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ;
+0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ;
+\end{pNiceArray}$
+
+\smallskip
+$\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 ;
+0 64 -41 1 19 ;
+0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 }
+\end{pNiceArray}$
+
+\smallskip
+$\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+0 64 -41 1 19 ;
+\end{pNiceArray}$
+
+~emphase#\end{NiceMatrixBlock}@
+\end{Verbatim}
+
+\bigskip
+\index{auto-columns-width!(key of \texttt{\{NiceMatrixBlock\}})|textit}
+\begin{NiceMatrixBlock}[auto-columns-width]
+\NiceMatrixOptions
+ {
+ light-syntax,
+ last-col, code-for-last-col = \color{blue} \scriptstyle ,
+ }
+\setlength{\extrarowheight}{1mm}
+
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+ 3 -18 12 1 4 ;
+-3 -46 29 -2 -15 ;
+ 9 10 -5 4 7
+\end{pNiceArray}$
+
+\smallskip
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 ;
+0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ;
+0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ;
+0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ;
+\end{pNiceArray}$
+
+\smallskip
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 ;
+0 64 -41 1 19 ;
+0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 }
+\end{pNiceArray}$\par\nobreak
+
+\smallskip
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+0 64 -41 1 19 ;
+\end{pNiceArray}$
+\end{NiceMatrixBlock}
+
+\bigskip
+However, one can see that the last matrix is not perfectly aligned with
+others. That's why, in LaTeX, the parenthesis have not exactly the same width
+(smaller parenthesis are a bit slimer).
+
+\medskip
+\index{max-width (subkey of ``delimiters'')}
+\index{delimiters!---/max-width}
+In order the solve that problem, it's possible to require the delimiters to be
+composed with the maximal width, thanks to the boolean key
+|delimiters/max-width|.
+
+\begin{Verbatim}[formatcom=\small\color{gray}]
+~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
+\NiceMatrixOptions
+ {
+ ~emphase#delimiters/max-width@,
+ light-syntax,
+ last-col, code-for-last-col = \color{blue}\scriptstyle,
+ }
+\setlength{\extrarowheight}{1mm}
+
+$\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+ 3 -18 12 1 4 ;
+-3 -46 29 -2 -15 ;
+ 9 10 -5 4 7
+\end{pNiceArray}$
+
+...
+~emphase#\end{NiceMatrixBlock}@
+\end{Verbatim}
+
+\bigskip
+\begin{NiceMatrixBlock}[auto-columns-width]
+\NiceMatrixOptions
+ {
+ delimiters/max-width,
+ light-syntax,
+ last-col, code-for-last-col = \color{blue}\scriptstyle,
+ }
+\setlength{\extrarowheight}{1mm}
+
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+ 3 -18 12 1 4 ;
+-3 -46 29 -2 -15 ;
+ 9 10 -5 4 7
+\end{pNiceArray}$
+
+\smallskip
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 ;
+0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ;
+0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ;
+0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ;
+\end{pNiceArray}$
+
+\smallskip
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 ;
+0 64 -41 1 19 ;
+0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 }
+\end{pNiceArray}$\par\nobreak
+
+\smallskip
+\quad $\begin{pNiceArray}{rrrr|r}
+12 -8 7 5 3 {} ;
+0 64 -41 1 19 ;
+\end{pNiceArray}$
+
+\end{NiceMatrixBlock}
+
+
+\interitem
+If you wish an alignment of the different matrices without the same width
+for all the columns, you can construct a unique array and place the
+parenthesis with commands |\SubMatrix| in the |\CodeAfter|. Of course, that
+array can't be broken by a page break.
+
+\medskip
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})|textit}
+
+\begin{Verbatim}
+\setlength{\extrarowheight}{1mm}
+\[\begin{NiceMatrix}[ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ]
+12 & -8 & 7 & 5 & 3 \\
+ 3 & -18 & 12 & 1 & 4 \\
+-3 & -46 & 29 &-2 &-15 \\
+ 9 & 10 &-5 &4 & 7 \\[1mm]
+12 & -8 & 7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
+0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
+0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 &1 &19 \\
+0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 \\
+~emphase#\CodeAfter [sub-matrix/vlines=4]@
+~emphase# \SubMatrix({1-1}{4-5})@
+~emphase# \SubMatrix({5-1}{8-5})@
+~emphase# \SubMatrix({9-1}{11-5})@
+~emphase# \SubMatrix({12-1}{13-5})@
+\end{NiceMatrix}\]
+\end{Verbatim}
+
+\medskip
+\begin{scope}
+\setlength{\extrarowheight}{1mm}
+\[\begin{NiceMatrix}[ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ]
+12 & -8 & 7 & 5 & 3 \\
+ 3 & -18 & 12 & 1 & 4 \\
+-3 & -46 & 29 &-2 &-15 \\
+ 9 & 10 &-5 &4 & 7 \\[1mm]
+12 & -8 & 7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
+0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
+0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 &1 &19 \\
+0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 \\
+\CodeAfter [sub-matrix/vlines=4]
+ \SubMatrix({1-1}{4-5})
+ \SubMatrix({5-1}{8-5})
+ \SubMatrix({9-1}{11-5})
+ \SubMatrix({12-1}{13-5})
+\end{NiceMatrix}\]
+\end{scope}
+
+\bigskip
+In this tabular, the instructions |\SubMatrix| are executed after the
+composition of the tabular and, thus, the vertical rules are drawn without
+adding space between the columns.
+
+
+\bigskip
+In fact, it's possible, with the key |vlines-in-sub-matrix|, to choice a
+letter in the preamble of the array to specify vertical rules which will be
+drawn in the |\SubMatrix| only (by adding space between the columns).
+
+\index{vlines-in-sub-matrix}
+\medskip
+\begin{Verbatim}
+\setlength{\extrarowheight}{1mm}
+\[\begin{NiceArray}
+ [
+ ~emphase#vlines-in-sub-matrix=I@,
+ last-col,
+ code-for-last-col = \scriptstyle \color{blue}
+ ]
+ {rrrrIr}
+12 & -8 & 7 & 5 & 3 \\
+ 3 & -18 & 12 & 1 & 4 \\
+-3 & -46 & 29 &-2 &-15 \\
+ 9 & 10 &-5 &4 & 7 \\[1mm]
+12 & -8 & 7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
+0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
+0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 &1 &19 \\
+0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 \\
+\CodeAfter
+ \SubMatrix({1-1}{4-5})
+ \SubMatrix({5-1}{8-5})
+ \SubMatrix({9-1}{11-5})
+ \SubMatrix({12-1}{13-5})
+\end{NiceArray}\]
+\end{Verbatim}
+
+
+\medskip
+\begin{scope}
+\setlength{\extrarowheight}{1mm}
+\[\begin{NiceArray}
+ [
+ vlines-in-sub-matrix=I,
+ last-col,
+ code-for-last-col = \scriptstyle \color{blue}
+ ]
+ {rrrrIr}
+12 & -8 & 7 & 5 & 3 \\
+ 3 & -18 & 12 & 1 & 4 \\
+-3 & -46 & 29 &-2 &-15 \\
+ 9 & 10 &-5 &4 & 7 \\[1mm]
+12 & -8 & 7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
+0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
+0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 &1 &19 \\
+0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
+12 & -8 &7 &5 & 3 \\
+0 & 64 &-41 & 1 & 19 \\
+\CodeAfter
+ \SubMatrix({1-1}{4-5})
+ \SubMatrix({5-1}{8-5})
+ \SubMatrix({9-1}{11-5})
+ \SubMatrix({12-1}{13-5})
+\end{NiceArray}\]
+\end{scope}
+
+
+
+
+
+\subsection{How to highlight cells of a matrix}
+
+
+\label{highlight}
+\index{draw (key of \texttt{\textbackslash Block})|textit}
+
+\medskip
+In order to highlight a cell of a matrix, it's possible to ``draw'' that cell
+with the key |draw| of the command |\Block| (this is one of the uses of a
+mono-cell block\footnote{We recall that, if the first mandatory argument of
+the command |\Block| is left empty, that means that the block is a mono-cell block}).
+
+\label{example-CodeAfter}
+
+
+\begin{Verbatim}
+$\begin{pNiceArray}{>{\strut}cccc}[margin,rules/color=blue]
+~emphase#\Block[draw]{}{a_{11}}@ & a_{12} & a_{13} & a_{14} \\
+a_{21} & \Block[draw]{}{a_{22}} & a_{23} & a_{24} \\
+a_{31} & a_{32} & \Block[draw]{}{a_{33}} & a_{34} \\
+a_{41} & a_{42} & a_{43} & \Block[draw]{}{a_{44}} \\
+\end{pNiceArray}$
+\end{Verbatim}
+\[\begin{pNiceArray}{>{\strut}cccc}[margin,rules/color=blue]
+\Block[draw]{}{a_{11}} & a_{12} & a_{13} & a_{14} \\
+a_{21} & \Block[draw]{}{a_{22}} & a_{23} & a_{24} \\
+a_{31} & a_{32} & \Block[draw]{}{a_{33}} & a_{34} \\
+a_{41} & a_{42} & a_{43} & \Block[draw]{}{a_{44}} \\
+\end{pNiceArray}\]
+
+We should remark that the rules we have drawn are drawn \emph{after} the
+construction of the array and thus, they don't spread the cells of the array.
+We recall that, on the other side, the commands |\hline| and |\Hline|, the
+specifier ``\verb+|+'' and the options |hlines|, |vlines|, |hvlines| and
+|hvlines-except-borders| spread the cells.\footnote{For the command |\cline|,
+see the remark p.~\pageref{remark-cline}.}
+
+
+\vspace{1cm}
+It's possible to color a row with |\rowcolor| in the |code-before| (or with
+|\rowcolor| in the first cell of the row if the key |colortbl-like| is
+used−even when \pkg{colortbl} is not loaded).
+
+\index{colortbl-like|textit}
+\index{rowcolor@\texttt{\textbackslash rowcolor}!command in tabular|textit}
+
+
+\medskip
+\begin{Verbatim}
+\begin{pNiceArray}{>{\strut}cccc}[margin, extra-margin=2pt,colortbl-like]
+ ~emphase#\rowcolor{red!15}@A_{11} & A_{12} & A_{13} & A_{14} \\
+ A_{21} & ~emphase#\rowcolor{red!15}@A_{22} & A_{23} & A_{24} \\
+ A_{31} & A_{32} & ~emphase#\rowcolor{red!15}@A_{33} & A_{34} \\
+ A_{41} & A_{42} & A_{43} & ~emphase#\rowcolor{red!15}@A_{44}
+\end{pNiceArray}
+\end{Verbatim}
+
+
+
+\[\begin{pNiceArray}{>{\strut}cccc}[margin, extra-margin=2pt,colortbl-like]
+ \rowcolor{red!15}A_{11} & A_{12} & A_{13} & A_{14} \\
+ A_{21} & \rowcolor{red!15}A_{22} & A_{23} & A_{24} \\
+ A_{31} & A_{32} & \rowcolor{red!15}A_{33} & A_{34} \\
+ A_{41} & A_{42} & A_{43} & \rowcolor{red!15}A_{44}
+\end{pNiceArray}\]
+
+\bigskip
+However, it's not possible to do a fine tuning. That's why we describe now a
+method to highlight a row of the matrix.
+
+\medskip
+That example and the following ones require Tikz (by default, \pkg{nicematrix}
+only loads \textsc{pgf}, which is a sub-layer of Tikz) and the Tikz library
+|fit|. The following lines in the preamble of your document do the job:
+\begin{verbatim}
+\usepackage{tikz}
+\usetikzlibrary{fit}
+\end{verbatim}
+
+\medskip
+We create a rectangular Tikz node which encompasses the nodes of the second
+row by using the tools of the Tikz library \pkg{fit}. Those nodes are not
+available by default in the |\CodeBefore| (for efficiency). We have to require
+their creation with the key |create-cell-nodes| of the keyword |\CodeBefore|.
+
+\tikzset{highlight/.style={rectangle,
+ fill=red!15,
+ rounded corners = 0.5 mm,
+ inner sep=1pt,
+ fit = #1}}
+
+\medskip
+\index{highlight (TikZ style defined in\newline an example)|textit}
+\begin{Verbatim}
+\tikzset{highlight/.style={rectangle,
+ fill=red!15,
+ rounded corners = 0.5 mm,
+ inner sep=1pt,
+ fit=~#1}}
+
+$\begin{bNiceMatrix}
+~emphase#\CodeBefore [create-cell-nodes] @
+~emphase# \tikz \node [highlight = (2-1) (2-3)] {} ; @
+~emphase# \Body @
+0 & \Cdots & 0 \\
+1 & \Cdots & 1 \\
+0 & \Cdots & 0 \\
+\end{bNiceMatrix}$
+\end{Verbatim}
+\index{create-cell-nodes (key of \texttt{\textbackslash CodeBefore})|textit}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}|textit}
+
+\[\begin{bNiceMatrix}
+\CodeBefore [create-cell-nodes]
+ \tikz \node [highlight = (2-1) (2-3)] {} ;
+\Body
+0 & \Cdots & 0 \\
+1 & \Cdots & 1 \\
+0 & \Cdots & 0 \\
+\end{bNiceMatrix}\]
+
+
+\vspace{1cm}
+We consider now the following matrix. If we want to highlight each row of
+this matrix, we can use the previous technique three times.
+
+\begin{Verbatim}
+\[\begin{pNiceArray}{ccc}[last-col, margin = 2pt]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+~emphase# \node [highlight = (1-1) (1-3)] {} ;@
+~emphase# \node [highlight = (2-1) (2-3)] {} ;@
+~emphase# \node [highlight = (3-1) (3-3)] {} ;@
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c & L_1 \\
+a & a & a + b & L_2 \\
+a & a & a & L_3
+\end{pNiceArray}\]
+\end{Verbatim}
+
+
+\[\begin{pNiceArray}{ccc}[last-col, margin = 2pt]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture}
+ \node [highlight = (1-1) (1-3)] {} ;
+ \node [highlight = (2-1) (2-3)] {} ;
+ \node [highlight = (3-1) (3-3)] {} ;
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c & L_1 \\
+a & a & a + b & L_2 \\
+a & a & a & L_3
+\end{pNiceArray}\]
+
+\medskip
+The result may seem disappointing. We can improve it by using the ``medium
+nodes'' instead of the ``normal nodes''.
+
+\index{create-medium-nodes|textit}
+\index{create-cell-nodes (key of \texttt{\textbackslash CodeBefore})|textit}
+
+
+\begin{Verbatim}
+\[\begin{pNiceArray}{ccc}[last-col, margin = 2pt, create-medium-nodes]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture} ~emphase#[name suffix = -medium]@
+ \node [highlight = (1-1) (1-3)] {} ;
+ \node [highlight = (2-1) (2-3)] {} ;
+ \node [highlight = (3-1) (3-3)] {} ;
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c & L_1 \\
+a & a & a + b & L_2 \\
+a & a & a & L_3
+\end{pNiceArray}\]
+\end{Verbatim}
+
+
+\[\begin{pNiceArray}{ccc}[last-col, margin = 2pt, create-medium-nodes]
+\CodeBefore [create-cell-nodes]
+ \begin{tikzpicture} [name suffix = -medium]
+ \node [highlight = (1-1) (1-3)] {} ;
+ \node [highlight = (2-1) (2-3)] {} ;
+ \node [highlight = (3-1) (3-3)] {} ;
+ \end{tikzpicture}
+\Body
+a & a + b & a + b + c & L_1 \\
+a & a & a + b & L_2 \\
+a & a & a & L_3
+\end{pNiceArray}\]
+
+
+
+
+\subsection{Utilisation of \textbackslash SubMatrix in the \textbackslash CodeBefore}
+
+\label{submatrix-in-codebefore}
+
+\index{SubMatrix@\texttt{\textbackslash SubMatrix} (command of
+\texttt{\textbackslash CodeAfter}\newline and
+\texttt{\textbackslash CodeBefore})|textit}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}|textit}
+\index{CodeAfter@\texttt{\textbackslash CodeAfter}|textit}
+\index{create-cell-nodes (key of \texttt{\textbackslash CodeBefore})|textit}
+
+
+In the following example, we illustrate the mathematical product of two
+matrices.
+
+The whole figure is an environment |{NiceArray}| and the three pairs of
+parenthesis have been added with |\SubMatrix| in the |\CodeBefore|.
+
+\tikzset{highlight/.style={rectangle,
+ fill=red!15,
+ rounded corners = 0.5 mm,
+ inner sep=1pt,
+ fit=#1}}%
+\[\begin{NiceArray}{*{6}{c}@{\hspace{6mm}}*{5}{c}}[nullify-dots]
+\CodeBefore [create-cell-nodes]
+ \SubMatrix({2-7}{6-last})
+ \SubMatrix({7-2}{last-6})
+ \SubMatrix({7-7}{last-last})
+ \begin{tikzpicture}
+ \node [highlight = (9-2) (9-6)] { } ;
+ \node [highlight = (2-9) (6-9)] { } ;
+ \end{tikzpicture}
+\Body
+ & & & & & & & & \color{blue}\scriptstyle C_j \\
+ & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
+ & & & & & & \Vdots & & \Vdots & & \Vdots \\
+ & & & & & & & & b_{kj} \\
+ & & & & & & & & \Vdots \\
+ & & & & & & b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} \\[3mm]
+ & a_{11} & \Cdots & & & a_{1n} \\
+ & \Vdots & & & & \Vdots & & & \Vdots \\
+\color{blue}\scriptstyle L_i
+ & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} & \Cdots & & c_{ij} \\
+ & \Vdots & & & & \Vdots \\
+ & a_{n1} & \Cdots & & & a_{nn} \\
+\CodeAfter
+\tikz \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ;
+\end{NiceArray}\]
+
+
+\vspace{1cm}
+\begin{Verbatim}
+\tikzset{highlight/.style={rectangle,
+ fill=red!15,
+ rounded corners = 0.5 mm,
+ inner sep=1pt,
+ fit=~#1}}
+\end{Verbatim}
+
+\begin{Verbatim}[formatcom = \small\color{gray}]
+\[\begin{NiceArray}{*{6}{c}~LetterAt{\hspace{6mm}}*{5}{c}}[nullify-dots]
+\CodeBefore [create-cell-nodes]
+ \SubMatrix({2-7}{6-last})
+ \SubMatrix({7-2}{last-6})
+ \SubMatrix({7-7}{last-last})
+ \begin{tikzpicture}
+ \node [highlight = (9-2) (9-6)] { } ;
+ \node [highlight = (2-9) (6-9)] { } ;
+ \end{tikzpicture}
+\Body
+ & & & & & & & & \color{blue}\scriptstyle C_j \\
+ & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
+ & & & & & & \Vdots & & \Vdots & & \Vdots \\
+ & & & & & & & & b_{kj} \\
+ & & & & & & & & \Vdots \\
+ & & & & & & b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} \\[3mm]
+ & a_{11} & \Cdots & & & a_{1n} \\
+ & \Vdots & & & & \Vdots & & & \Vdots \\
+\color{blue}\scriptstyle L_i
+ & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} & \Cdots & & c_{ij} \\
+ & \Vdots & & & & \Vdots \\
+ & a_{n1} & \Cdots & & & a_{nn} \\
+\CodeAfter
+\tikz \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ;
+\end{NiceArray}\]
+\end{Verbatim}
+
+
+
+\subsection{A triangular tabular}
+
+\label{triangular}
+
+\index{pgf-node-code|textit}
+\index{Corners (the empty ---)|textit}
+\index{chessboardcolors@\texttt{\textbackslash chessboardcolors}!(commande
+ du \texttt{\textbackslash CodeBefore})|textit}
+\index{CodeBefore@\texttt{\textbackslash CodeBefore}...\texttt{\textbackslash Body}|textit}
+
+In the following example, we use the style PGF/TikZ |nicematrix/cell-node|
+to rotate the contents of the cells (and, then, we compensate that rotation by
+a rotation of the whole tabular with the command |\adjustbox| of the eponymous
+package, which must be loaded previously).
+
+
+\medskip
+\begin{Verbatim}
+\pgfset
+ {
+ ~emphase#nicematrix/cell-node@/.append style =
+ { text/rotate = 45, minimum size = 6 mm }
+ }
+
+\setlength{\tabcolsep}{0pt}
+
+~emphase#\adjustbox@{rotate = -45, set depth = 6mm + 1.414 \arrayrulewidth}
+ {\begin{NiceTabular} [ hvlines, corners=SE, baseline = line-9 ] { cccccccc }
+ \CodeBefore
+ \chessboardcolors{red!15}{blue!15}
+ \Body
+ 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
+ 1 & 2 & 3 & 4 & 5 & 6 & 7 \\
+ 1 & 3 & 6 & 10 & 15 & 21 \\
+ 1 & 4 & 10 & 20 & 35 \\
+ 1 & 5 & 15 & 35 \\
+ 1 & 6 & 21 \\
+ 1 & 7 \\
+ 1
+ \end{NiceTabular}}
+\end{Verbatim}
+
+
+\begin{center}
+\pgfset
+ {
+ nicematrix/cell-node/.append style =
+ { text/rotate = 45, minimum size = 6 mm }
+ }%
+\setlength{\tabcolsep}{0pt}%
+\adjustbox{rotate = -45, set depth = 6mm + 1.414 \arrayrulewidth}
+ {\begin{NiceTabular} [ hvlines, corners=SE, baseline = line-9 ] { cccccccc }
+ \CodeBefore
+ \chessboardcolors{red!15}{blue!15}
+ \Body
+ 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
+ 1 & 2 & 3 & 4 & 5 & 6 & 7 \\
+ 1 & 3 & 6 & 10 & 15 & 21 \\
+ 1 & 4 & 10 & 20 & 35 \\
+ 1 & 5 & 15 & 35 \\
+ 1 & 6 & 21 \\
+ 1 & 7 \\
+ 1
+ \end{NiceTabular}}
+\end{center}
+
+
+\newpage
+\vspace{1cm}
+\section{History}
+
+The successive versions of the file |nicematrix.sty| provided by TeXLive are available on the
+\textsc{svn} server of TeXLive:\par\nobreak
+
+\smallskip
+{
+\small
+\nolinkurl{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
+}
+
+\subsection*{Changes between version 6.18 and 6.19}
+
+The command |\tabularnote| now supports an optional argument (between square
+brackets) to change the symbol of the reference of the note.
+
+\subsection*{Changes between version 6.17 and 6.18}
+
+New key |opacity| in the commands to color cells, rows and columns.
+
+New key |rounded-corners| for a whole tabular.
+
+
+\subsection*{Changes between version 6.16 and 6.17}
+
+New PGF/Tikz style |nicematrix/cell-node|.
+
+New key |pgf-node-code|
+
+\subsection*{Changes between version 6.15 and 6.16}
+
+It's now possible to put any LaTeX extensible delimiter (|\lgroup|, |\langle|,
+etc.) in the preamble of an environment with preamble (such as |{NiceArray}|)
+by prefixing them by |\left| and |\right|.
+
+New key |code| for the command |\SubMatrix| in the |\CodeAfter|.
+
+\subsection*{Changes between version 6.14 and 6.15}
+
+New key |transparent| for the command |\Block| (with that key, the rules are
+drawn within the block).
+
+\subsection*{Changes between version 6.13 and 6.14}
+
+New keys for the command |\Block| for the vertical position of the content of
+that block.
+
+\subsection*{Changes between version 6.12 and 6.13}
+
+New environment |{TabularNote}| in |{NiceTabular}| with the same semantic as
+the key |tabularnote| (for legibility).
+
+The command |\Hline| nows accepts options (between square brackets).
+
+\subsection*{Changes between version 6.11 and 6.12}
+
+New keys |caption|, |short-caption| and |label| in the environment
+|{NiceTabular}|.
+
+In |{NiceTabular}|, a caption specified by the key |caption| is wrapped to the
+width of the tabular.
+
+Correction of a bug: it's now possible to use |\OverBrace| and |\UnderBrace|
+with \pkg{unicode-math} (with XeLaTeX or LuaLaTeX).
+
+\subsection*{Changes between version 6.10 and 6.11}
+
+New key |matrix/columns-type| to specify the type of columns of the matrices.
+
+New key |ccommand| in |custom-line| and new command |\cdottedline|.
+
+\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).
+
+\subsection*{Changes between version 6.8 and 6.9}
+
+New keys |xdots/radius| and |xdots/inter| for customisation of the continuous
+dotted lines.
+
+New command |\ShowCellNames| available in the |\CodeBefore| and in the |\CodeAfter|.
+
+\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).
+
+\subsection*{Changes between version 6.6 and 6.7}
+
+Key |color| for |\OverBrace| and |\UnderBrace| in the |\CodeAfter|
+
+Key |tikz| in the key |borders| of a command |\Block|
+
+\subsection*{Changes between version 6.5 and 6.6}
+
+Keys |tikz| and |width| in |custom-line|.
+
+\subsection*{Changes between versions 6.4 and 6.5}
+
+Key |custom-line| in |\NiceMatrixOptions|.
+
+Key |respect-arraystretch|.
+
+\subsection*{Changes between versions 6.3 and 6.4}
+
+New commands |\UnderBrace| and |\OverBrace| in the |\CodeAfter|.
+
+Correction of a bug of the key |baseline| (cf. question 623258 on TeX StackExchange).
+
+Correction of a bug with the columns |V| of \pkg{varwidth}.
+
+Correction of a bug: the use of |\hdottedline| and |:| in the preamble of the
+array (of another letter specified by |letter-for-dotted-lines|) was
+incompatible with the key |xdots/line-style|.
+
+\subsection*{Changes between versions 6.2 and 6.3}
+
+Keys |nb-rows|, |rowcolor| and |bold| for the command |\RowStyle|
+
+Key |name| for the command |\Block|.
+
+Support for the columns |V| of \pkg{varwidth}.
+
+\subsection*{Changes between versions 6.1 and 6.2}
+
+Better compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}.
+
+Key |vlines-in-sub-matrix|.
+
+\subsection*{Changes between versions 6.0 and 6.1}
+
+Better computation of the widths of the |X| columns.
+
+Key |\color| for the command |\RowStyle|.
+
+\subsection*{Changes between versions 5.19 and 6.0}
+
+Columns |X| and environment |{NiceTabularX}|.
+
+Command |\rowlistcolors| available in the |\CodeBefore|.
+
+In columns with fixed width, the blocks are composed as paragraphs (wrapping
+of the lines).
+
+The key |define-L-C-R| has been deleted.
+
+\subsection*{Changes between versions 5.18 and 5.19}
+
+New key |tikz| for the command |\Block|.
+
+\subsection*{Changes between versions 5.17 and 5.18}
+
+New command |\RowStyle|
+
+\subsection*{Changes between versions 5.16 and 5.17}
+
+The key |define-L-C-R| (only available at load-time) now raises a (non fatal)
+error.
+
+Keys |L|, |C| and |R| for the command |\Block|.
+
+Key |hvlines-except-borders|.
+
+It's now possible to use a key |l|, |r| or |c| with the command
+|\pAutoNiceMatrix| (and the similar ones).
+
+\subsection*{Changes between versions 5.15 and 5.16}
+
+It's now possible to use the cells corresponding to the contents of the nodes
+(of the form |i-j|) in the |\CodeBefore| when the key |create-cell-nodes| of
+that |\CodeBefore| is used. The medium and the large nodes are also available
+if the corresponding keys are used.
+
+\subsection*{Changes between versions 5.14 and 5.15}
+
+Key |hvlines| for the command |\Block|.
+
+The commands provided by \pkg{nicematrix} to color cells, rows and columns
+don't color the cells which are in the ``corners'' (when the key |corner| is
+used).
+
+It's now possible to specify delimiters for submatrices in the preamble of an
+environment.
+
+The version 5.15b is compatible with the version 3.0+ of \pkg{siunitx}
+(previous versions were not).
+
+\subsection*{Changes between versions 5.13 and 5.14}
+
+Nodes of the form |(1.5)|, |(2.5)|, |(3.5)|, etc.
+
+Keys |t| and |b| for the command |\Block|.
+
+Key |corners|.
+
+\subsection*{Changes between versions 5.12 and 5.13}
+
+New command |\arraycolor| in the |\CodeBefore| (with its key
+|except-corners|).
+
+New key |borders| for the command |\Block|.
+
+New command |\Hline| (for horizontal rules not drawn in the blocks).
+
+The keys |vlines| and |hlines| takes in as value a (comma-separated) list of
+numbers (for the rules to draw).
+
+\subsection*{Changes between versions 5.11 and 5.12}
+
+Keywords |\CodeBefore| and |\Body| (alternative syntax to the key
+|code-before|).
+
+New key |delimiters/max-width|.
+
+New keys |hlines|, |vlines| and |hvlines| for the command |\SubMatrix| in the
+|\CodeAfter|.
+
+New key |rounded-corners| for the command |\Block|.
+
+\subsection*{Changes between versions 5.10 and 5.11}
+
+It's now possible, in the |code-before| and in the |\CodeAfter|, to use the
+syntax \verb+|(i-|j)+ for the Tikz node at the intersection of the (potential)
+horizontal rule number~$i$ and the (potential) vertical rule number~$j$.
+
+\subsection*{Changes between versions 5.9 and 5.10}
+
+New command |\SubMatrix| available in the |\CodeAfter|.
+
+It's possible to provide options (between brackets) to the keyword |\CodeAfter|.
+
+\subsection*{Changes between versions 5.8 and 5.9}
+
+Correction of a bug: in the previous versions, it was not possible to use the
+key |line-style| for the continuous dotted lines when the Tikz library |babel|
+was loaded.
+
+New key |cell-space-limits|.
+
+\subsection*{Changes between versions 5.7 and 5.8}
+
+Keys |cols| and |restart| of the command |\rowcolors| in the |code-before|.
+
+Modification of the behaviour of |\\| in the columns of type |p|, |m| or |b|
+(for a behaviour similar to the environments of \pkg{array}).
+
+Better error messages for the command |\Block|.
+
+\subsection*{Changes between versions 5.6 and 5.7}
+
+New key |delimiters-color|
+
+Keys |fill|, |draw| and |line-width| for the command |\Block|.
+
+\subsection*{Changes between versions 5.5 and 5.6}
+
+Different behaviour for the mono-row blocks.
+
+New command |\NotEmpty|.
+
+\subsection*{Changes between versions 5.4 and 5.5}
+
+The user must never put |\omit| before |\CodeAfter|.
+
+Correction of a bug: the tabular notes |\tabularnotes| were not composed when
+present in a block (except a mono-column block).
+
+\subsection*{Changes between versions 5.3 and 5.4}
+
+Key |tabularnote|.
+
+Different behaviour for the mono-column blocks.
+
+\subsection*{Changes between versions 5.2 and 5.3}
+
+Keys |c|, |r| and |l| for the command |\Block|.
+
+It's possible to use the key |draw-first| with |\Ddots| and |\Iddots| to
+specify which dotted line will be drawn first (the other lines will be drawn
+parallel to that one if parallelization is activated).
+
+\subsection*{Changes between versions 5.1 and 5.2}
+
+The vertical rules specified by \verb+|+ or \verb+||+ in the preamble respect
+the blocks.
+
+Key |respect-blocks| for |\rowcolors| (with a \emph{s}) in the |code-before|.
+
+The variable |\g_nicematrix_code_before_tl| is now public.
+
+The key |baseline| may take in as value an expression of the form
+\textsl{line-i} to align the |\hline| in the row \textsl{i}.
+
+The key |hvlines-except-corners| may take in as value a list of corners (eg: NW,SE).
+
+\subsection*{Changes between versions 5.0 and 5.1}
+
+The vertical rules specified by \verb+|+ in the preamble are not broken by
+|\hline\hline| (and other).
+
+Environment |{NiceTabular*}|
+
+Command |\Vdotsfor| similar to |\Hdotsfor|
+
+The variable |\g_nicematrix_code_after_tl| is now public.
+
+\subsection*{Changes between versions 4.4 and 5.0}
+
+Use of the standard column types |l|, |c| and |r| instead of |L|, |C| and |R|.
+
+It's now possible to use the command |\diagbox| in a |\Block|.
+
+Command |\tabularnote|
+
+\subsection*{Changes between versions 4.3 and 4.4}
+
+New key |hvlines-except-corners| (now deprecated).
+
+\subsection*{Changes between versions 4.2 and 4.3}
+
+The horizontal centering of the content of a |\Block| is correct even when an
+instruction such as |!{\qquad}| is used in the preamble of the array.
+
+It's now possible to use the command |\Block| in the ``last row''.
+
+\subsection*{Changes between versions 4.1 and 4.2}
+
+It's now possible to write |\begin{pNiceMatrix}a&b\\c&d\end{pNiceMatrix}^2|
+with the expected result.
+
+\subsection*{Changes between versions 4.0 and 4.1}
+
+New keys |cell-space-top-limit| and |cell-space-bottom-limit|
+
+New command |\diagbox|
+
+The key |hvline| don't draw rules in the blocks (commands |\Block|) and in the
+virtual blocks corresponding to the dotted lines.
+
+\subsection*{Changes between versions 3.15 and 4.0}
+
+New environment |{NiceTabular}|
+
+Commands to color cells, rows and columns with a perfect result in the \textsc{pdf}.
+
+\subsection*{Changes between versions 3.14 and 3.15}
+
+It's possible to put labels on the dotted lines drawn by |\Ldots|, |\Cdots|,
+|\Vdots|, |\Ddots|, |\Iddots|, |\Hdotsfor| and the command |\line| in the
+|code-after| with the tokens |_| and |^|.
+
+The option |baseline| is now available in all the environments of
+\pkg{nicematrix}. Before, it was available only in |{NiceArray}|.
+
+New keyword |\CodeAfter| (in the environments of \pkg{nicematrix}).
+
+\subsection*{Changes between versions 3.13 and 3.14}
+
+Correction of a bug (question 60761504 on |stackoverflow|).
+
+Better error messages when the user uses |&| or |\\| when |light-syntax| is in
+force.
+
+\subsection*{Changes between versions 3.12 and 3.13}
+
+The behaviour of the command |\rotate| is improved when used in the ``last
+row''.
+
+The option |dotted-lines-margin| has been renamed in |xdots/shorten| and the
+options |xdots/color| and |xdots/line-style| have been added for a complete
+customisation of the dotted lines.
+
+In the environments without preamble (|{NiceMatrix}|, |{pNiceMatrix}|, etc.),
+it's possible to use the options |l| (=|L|) or |r| (=|R|) to specify the type
+of the columns.
+
+The code of \pkg{nicematrix} no longer uses Tikz but only \textsc{pgf}. By
+default, Tikz is \emph{not} loaded by \pkg{nicematrix}.
+
+\subsection*{Changes between versions 3.11 and 3.12}
+
+Command |\rotate| in the cells of the array.
+
+Options |vlines|, |hlines| and |hvlines|.
+
+Option |baseline| pour |{NiceArray}| (not for the other environments).
+
+The name of the Tikz nodes created by the command |\Block| has changed: when
+the command has been issued in the cell $i$|-|$j$, the name is
+$i$|-|$j$|-block| and, if the creation of the ``medium nodes'' is required, a
+node $i$|-|$j$|-block-medium| is created.
+
+If the user tries to use more columns than allowed by its environment, an error
+is raised by nicematrix (instead of a low-level error).
+
+The package must be loaded with the option |obsolete-environments| if we want
+to use the deprecated environments.
+
+\subsection*{Changes between versions 3.10 and 3.11}
+
+Correction of a bug linked to |first-row| and |last-row|.
+
+\subsection*{Changes between version 3.9 and 3.10}
+
+New option |light-syntax| (and |end-of-row|).
+
+New option |dotted-lines-margin| for fine tuning of the dotted lines.
+
+\subsection*{Changes between version 3.8 and 3.9}
+
+New commands |\NiceMatrixLastEnv| and |\OnlyMainNiceMatrix|.
+
+New options |create-medium-nodes| and |create-large-nodes|.
+
+\subsection*{Changes between version 3.7 and 3.8}
+
+New programmation for the command |\Block| when the block has only one row.
+With this programmation, the vertical rules drawn by the specifier
+``\verb+|+'' at the end of the block is actually drawn. In previous versions,
+they were not because the block of one row was constructed with
+|\multicolumn|.
+
+An error is raised when an obsolete environment is used.
+
+\subsection*{Changes between version 3.6 and 3.7}
+
+The four ``corners'' of the matrix are correctly protected against the four
+codes: |code-for-first-col|, |code-for-last-col|, |code-for-first-row| and
+|code-for-last-row|.
+
+New command |\pAutoNiceMatrix| and its variants (suggestion of Christophe
+Bal).
+
+\subsection*{Changes between version 3.5 and 3.6}
+
+LaTeX counters |iRow| and |jCol| available in the cells of the array.
+
+Addition of |\normalbaselines| before the construction of the array: in
+environments like |{align}| of \pkg{amsmath} the value of |\baselineskip| is
+changed and if the options |first-row| and |last-row| were used in an
+environment of \pkg{nicematrix}, the position of the delimiters was wrong.
+
+A warning is written in the |.log| file if an obsolete environment is used.
+
+There is no longer artificial errors |Duplicate~name| in the environments of
+\pkg{amsmath}.
+
+\subsection*{Changes between version 3.4 and 3.5}
+
+Correction on a bug on the two previous versions where the |code-after| was
+not executed.
+
+\subsection*{Changes between version 3.3 and 3.4}
+
+Following a discussion on TeX StackExchange\footnote{cf.
+|tex.stackexchange.com/questions/510841/nicematrix-and-tikz-external-optimize|},
+optimization of Tikz externalization is disabled in the environments of
+\pkg{nicematrix} when the class \cls{standalone} or the package
+\pkg{standalone} is used.
+
+\subsection*{Changes between version 3.2 and 3.3}
+
+The options |first-row|, |last-row|, |first-col| and |last-col| are now
+available in the environments |{NiceMatrix}|, |{pNiceMatrix}|,
+|{bNiceMatrix}|, etc.
+
+The option |columns-width=auto| doesn't need any more a second compilation.
+
+\subsection*{Changes between version 3.1 and 3.2 (and 3.2a)}
+
+Option |small|.
+
+\subsection*{Changes between version 3.0 and 3.1}
+
+Command |\Block| to draw block matrices.
+
+Error message when the user gives an incorrect value for |last-row|.
+
+The vertical rules in the matrices (drawn by ``\verb+|+'') are now compatible with
+the color fixed by \pkg{colortbl}.
+
+Correction of a bug: it was not possible to use the colon ``|:|'' in the
+preamble of an array when |pdflatex| was used with \pkg{french-babel} (because
+\pkg{french-babel} activates the colon in the beginning of the document).
+
+\subsection*{Changes between version 2.3 and 3.0}
+
+Modification of |\Hdotsfor|. Now |\Hdotsfor| erases the |\vlines| (of ``\verb+|+'')
+as |\hdotsfor| does.
+
+Composition of exterior rows and columns on the four sides of the matrix (and
+not only on two sides) with the options |first-row|, |last-row|, |first-col|
+and |last-col|.
+
+\subsection*{Changes between version 2.2.1 and 2.3}
+
+Compatibility with the column type |S| of \pkg{siunitx}.
+
+Option |hlines|.
+
+\subsection*{Changes between version 2.2 and 2.2.1}
+
+Improvment of the vertical dotted lines drawn by the specifier ``:'' in the
+preamble.
+
+Modification of the position of the dotted lines drawn by |\hdottedline|.
+
+\subsection*{Changes between version 2.1.5 and 2.2}
+
+Possibility to draw horizontal dotted lines to separate rows with the command
+|\hdottedline| (similar to the classical command |\hline| and the command
+|\hdashline| of \pkg{arydshln}).
+
+Possibility to draw vertical dotted lines to separate columns with the
+specifier ``|:|'' in the preamble (similar to the classical specifier
+``\verb+|+'' and the specifier ``|:|'' of \pkg{arydshln}).
+
+\subsection*{Changes between version 2.1.4 and 2.1.5}
+
+Compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}.
+
+Option |allow-duplicate-names|.
+
+\subsection*{Changes between version 2.1.3 and 2.1.4}
+
+Replacement of some options |O { }| in commands and environments defined with
+\pkg{xparse} by |! O { }| (because a recent version of \pkg{xparse} introduced
+the specifier |!| and modified the default behaviour of the last optional
+arguments).
+
+See |www.texdev.net/2018/04/21/xparse-optional-arguments-at-the-end|
+
+\subsection*{Changes between version 2.1.2 and 2.1.3}
+
+When searching the end of a dotted line from a command like |\Cdots| issued in
+the ``main matrix'' (not in the exterior column), the cells in the exterior
+column are considered as outside the matrix. That means that it's possible to
+do the following matrix with only a |\Cdots| command (and a single |\Vdots|).
+\[\begin{pNiceArray}{Wc{5mm}cWc{5mm}}[first-row,last-col]
+& C_j & \\
+\mbox{\Large $0$} & \Vdots & \mbox{\Large $0$} \\
+\strut & a & \Cdots & L_i \\
+\mbox{\Large $0$} & & \mbox{\Large $0$} \\
+\end{pNiceArray}\]
+
+\subsection*{Changes between version 2.1 and 2.1.1}
+
+Small corrections: for example, the option |code-for-first-row| is now
+available in the command |\NiceMatrixOptions|.
+
+Following a discussion on
+TeX StackExchange\footnote{cf.
+|tex.stackexchange.com/questions/450841/tikz-externalize-and-nicematrix-package|},
+Tikz externalization is now deactivated in the environments of the
+package \pkg{nicematrix}.\footnote{Before this version, there was an error
+when using \pkg{nicematrix} with Tikz externalization. In any case, it's not
+possible to externalize the Tikz elements constructed by \pkg{nicematrix}
+because they use the options |overlay| and |remember picture|.}
+
+\subsection*{Changes between version 2.0 and 2.1}
+
+New implementation of the environment |{pNiceArrayRC}|. With this new
+implementation, there is no restriction on the width of the columns.
+
+The package \pkg{nicematrix} no longer loads \pkg{mathtools} but only
+\pkg{amsmath}.
+
+Creation of ``medium nodes'' and ``large nodes''.
+
+\subsection*{Changes between version 1.4 and 2.0}
+
+The versions 1.0 to 1.4 of \pkg{nicematrix} were focused on the continuous
+dotted lines whereas the version 2.0 of \pkg{nicematrix} provides different
+features to improve the typesetting of mathematical matrices.
+
+\subsection*{Changes between version 1.3 and 1.4}
+
+The column types |w| and |W| can now be used in the environments
+|{NiceArray}|, |{pNiceArrayC}| and its variants with the same meaning as in
+the package \pkg{array}.
+
+New option |columns-width| to fix the same width for all the columns of the
+array.
+
+\subsection*{Changes between version 1.2 and 1.3}
+
+New environment |{pNiceArrayC}| and its variants.
+
+Correction of a bug in the definition of |{BNiceMatrix}|, |{vNiceMatrix}| and
+|{VNiceMatrix}| (in fact, it was a typo).
+
+Options are now available locally in |{pNiceMatrix}| and its variants.
+
+The names of the options are changed. The old names were names in ``camel
+style''.
+
+\subsection*{Changes between versions 1.1 and 1.2}
+
+New environment |{NiceArray}| with column types |L|, |C| and |R|.
+
+\subsection*{Changes between versions 1.0 and 1.1}
+
+The dotted lines are no longer drawn with Tikz nodes but with Tikz circles
+(for efficiency).
+
+Modification of the code which is now twice faster.
+
+
+
+\cleardoublepage
+
+\phantomsection
+\addcontentsline{toc}{section}{Index}
+
+\printindex
+
+
+\newpage
+\tableofcontents
+
+\end{document}
+
+% \endinput
+% Local Variables:
+% TeX-fold-mode: t
+% TeX-fold-preserve-comments: nil
+% fill-column: 80
+% End:
+
+
Property changes on: trunk/Master/texmf-dist/doc/latex/nicematrix/nicematrix.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx (rev 0)
+++ trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx 2023-05-16 20:22:30 UTC (rev 67135)
@@ -0,0 +1,16060 @@
+% \iffalse meta-comment
+%
+% This file should be compiled with $xelatex$.
+%
+% Copyright (C) 2018-2023 by F. Pantigny
+% ------------------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+% \iffalse
+\def\myfileversion{6.19}
+\def\myfiledate{2023/05/15}
+%
+%
+%<*batchfile>
+\begingroup
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/nicematrix}
+\preamble
+
+
+Copyright (C) 2018-2023 by F. Pantigny
+-----------------------------------
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in:
+
+http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+\endpreamble
+\askforoverwritefalse
+\endgroup
+%</batchfile>
+%
+%<*driver>
+\documentclass[dvipsnames]{l3doc}% dvipsnames is for xcolor (loaded by Tikz)
+\VerbatimFootnotes
+\usepackage{xltxtra}
+\usepackage[xetex]{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+
+\usepackage{tikz}
+\usetikzlibrary{fit}
+\usepackage{nicematrix}
+
+\NewDocumentEnvironment {scope} {} {} {}
+\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
+
+\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
+\usepackage{titlesec}
+\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
+\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
+\parindent 0pt
+\skip \footins = 2 \bigskipamount
+
+
+\begin{document}
+\DocInput{nicematrix-code.dtx}
+\end{document}
+%</driver>
+% \fi
+% \title{The code of the package \pkg{nicematrix}\thanks{This document corresponds to the version~\myfileversion\space of \pkg{nicematrix},
+% at the date of~\myfiledate.}}
+% \author{F. Pantigny \\ \texttt{fpantigny at wanadoo.fr}}
+%
+% \hypersetup
+% {
+% pdfinfo =
+% {
+% Title = The code of the package 'nicematrix' ,
+% Subject = A LaTeX package ,
+% Author = F. Pantigny
+% }
+% }
+%
+%
+% \maketitle
+%
+% \begin{abstract}
+% This document is the documented code of the LaTeX package \pkg{nicematrix}. It
+% is \emph{not} its user's guide. The guide of utilisation is the document
+% |nicematrix.pdf| (with a French traduction: |nicematrix-french.pdf|).
+% \end{abstract}
+%
+%
+% \bigskip
+% By default, the package \pkg{nicematrix} doesn't patch any existing code.
+%
+% \smallskip
+% However, when the option |renew-dots| is used, the commands |\cdots|,
+% |\ldots|, |\dots|, |\vdots|, |\ddots| and |\iddots| are redefined in the
+% environments provided by \pkg{nicematrix}. In the same way, if the option
+% |renew-matrix| is used, the environment |{matrix}| of \pkg{amsmath} is
+% redefined.
+%
+% \smallskip
+% On the other hand, the environment |{array}| is never redefined.
+%
+% \smallskip
+% Of course, the package \pkg{nicematrix} uses the features of the package
+% \pkg{array}. It tries to be independent of its implementation. Unfortunately,
+% it was not possible to be strictly independent. For example, the package
+% \pkg{nicematrix} relies upon the fact that the package |{array}| uses
+% |\ialign| to begin the |\halign|.
+%
+%
+% \bigskip
+% \section{Declaration of the package and packages loaded}
+%
+%
+% The prefix |nicematrix| has been registred for this package.
+%
+% See: |http://mirrors.ctan.org/macros/latex/contrib/l3kernel/l3prefixes.pdf|
+%
+%<@@=nicematrix>
+%
+% \bigskip
+% First, we load \pkg{pgfcore} and the module \pkg{shapes}. We do so because
+% it's not possible to use |\usepgfmodule| in |\ExplSyntaxOn|.
+% \begin{macrocode}
+\RequirePackage{pgfcore}
+\usepgfmodule{shapes}
+% \end{macrocode}
+%
+%
+% We give the traditional declaration of a package written with the L3
+% programming layer.
+% \begin{macrocode}
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+ {nicematrix}
+ {\myfiledate}
+ {\myfileversion}
+ {Enhanced arrays with the help of PGF/TikZ}
+% \end{macrocode}
+%
+%
+% \bigskip
+% The command for the treatment of the options of |\usepackage| is at the end of
+% this package for technical reasons.
+%
+% \bigskip
+% We load some packages.
+% \begin{macrocode}
+\RequirePackage { array }
+\RequirePackage { amsmath }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_error:n { \msg_error:nn { nicematrix } }
+\cs_new_protected:Npn \@@_warning:n { \msg_warning: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 } }
+\cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { 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}
+%
+% \bigskip
+% We also create a command which will genereate usually an error but only a
+% warning on Overleaf. The argument is given by currification.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_error_or_warning:n
+ { \bool_if:NTF \c_@@_messages_for_Overleaf_bool \@@_warning:n \@@_error:n }
+% \end{macrocode}
+%
+% We try to detect whether the compilation is done on Overleaf. We use
+% |\c_sys_jobname_str| because, with Overleaf, the value of |\c_sys_jobname_str|
+% is always ``|output|''.
+% \begin{macrocode}
+\bool_set:Nn \c_@@_messages_for_Overleaf_bool
+ {
+ \str_if_eq_p:Vn \c_sys_jobname_str { _region_ } % for Emacs
+ || \str_if_eq_p:Vn \c_sys_jobname_str { output } % for Overleaf
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_msg_redirect_name:nn
+ { \msg_redirect_name:nnn { nicematrix } }
+\cs_new_protected:Npn \@@_gredirect_none:n #1
+ {
+ \group_begin:
+ \globaldefs = 1
+ \@@_msg_redirect_name:nn { #1 } { none }
+ \group_end:
+ }
+\cs_new_protected:Npn \@@_err_gredirect_none:n #1
+ {
+ \@@_error:n { #1 }
+ \@@_gredirect_none:n { #1 }
+ }
+\cs_new_protected:Npn \@@_warning_gredirect_none:n #1
+ {
+ \@@_warning:n { #1 }
+ \@@_gredirect_none:n { #1 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{Security test}
+%
+% Within the package \pkg{nicematrix}, we will have to test whether a cell of a
+% |{NiceTabular}| is empty. For the cells of the columns of type |p|, |b|, |m|,
+% |X| and |V|, we will test whether the cell is syntactically empty (that is to
+% say that there is only spaces between the ampersands |&|). That test will be
+% done with the command |\@@_test_if_empty:| by testing if the two first tokens
+% in the cells are (during the TeX process) are |\ignorespaces| and |\unskip|.
+%
+% However, if, one day, there is a changement in the implementation of
+% \pkg{array}, maybe that this test will be broken (and \pkg{nicematrix} also).
+%
+% That's why, by security, we will take a test in a small |{tabular}| composed
+% in the box |\l_tmpa_box| used as sandbox.
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Internal~error }
+ {
+ Potential~problem~when~using~nicematrix.\\
+ The~package~nicematrix~have~detected~a~modification~of~the~
+ standard~environment~{array}~(of~the~package~array).~Maybe~you~will~encounter~
+ some~slight~problems~when~using~nicematrix.~If~you~don't~want~to~see~
+ this~message~again,~load~nicematrix~with:~\token_to_str:N
+ \usepackage[no-test-for-array]{nicematrix}.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\@@_msg_new:nn { mdwtab~loaded }
+ {
+ The~packages~'mdwtab'~and~'nicematrix'~are~incompatible.~
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_security_test:n #1
+ {
+ \peek_meaning:NTF \ignorespaces
+ { \@@_security_test_i:w }
+ { \@@_error:n { Internal~error } }
+ #1
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_security_test_i:w \ignorespaces #1
+ {
+ \peek_meaning:NF \unskip { \@@_error:n { Internal~error } }
+ #1
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Here, the box |\l_tmpa_box| will be used as sandbox to take our security test.
+% This code has been modified in version 6.18 (see question 682891 on TeX
+% StackExchange).
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument / after } { . }
+ {
+ \IfPackageLoadedTF { mdwtab }
+ { \@@_fatal:n { mdwtab~loaded } }
+ {
+ \bool_if:NF \c_@@_no_test_for_array_bool
+ {
+ \group_begin:
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \begin { tabular } { c > { \@@_security_test:n } c c }
+ text & & text
+ \end { tabular }
+ }
+ \group_end:
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{Technical definitions}
+%
+% \begin{macrocode}
+\tl_new:N \l_@@_argspec_tl
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \seq_set_split:Nnn { N V n }
+\cs_generate_variant:Nn \keys_define:nn { n x }
+\cs_generate_variant:Nn \str_lowercase:n { V }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { tikz }
+ {
+% \end{macrocode}
+% In some constructions, we will have to use a |{pgfpicture}| which \emph{must}
+% be replaced by a |{tikzpicture}| if Tikz is loaded. However, this switch
+% between |{pgfpicture}| and |{tikzpicture}| can't be done dynamically with a
+% conditional because, when the Tikz library |external| is loaded by the user,
+% the pair |\tikzpicture|-|\endtikpicture| (or
+% |\begin{tikzpicture}-\end{tikzpicture}|) must be statically ``visible'' (even
+% when externalization is not activated).
+%
+% That's why we create |\c_@@_pgfortikzpicture_tl| and
+% |\c_@@_endpgfortikzpicture_tl| which will be used to construct in a
+% |\AtBeginDocument| the correct version of some commands. The tokens
+% |\exp_not:N| are mandatory.
+% \begin{macrocode}
+ \tl_const:Nn \c_@@_pgfortikzpicture_tl { \exp_not:N \tikzpicture }
+ \tl_const:Nn \c_@@_endpgfortikzpicture_tl { \exp_not:N \endtikzpicture }
+ }
+ {
+ \tl_const:Nn \c_@@_pgfortikzpicture_tl { \exp_not:N \pgfpicture }
+ \tl_const:Nn \c_@@_endpgfortikzpicture_tl { \exp_not:N \endpgfpicture }
+ }
+ }
+% \end{macrocode}
+%
+% 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 March 2023, the current
+% version \cls{revtex4-2} is 4.2e (compatible with \pkg{booktabs}).
+%
+% \begin{macrocode}
+\@ifclassloaded { revtex4-1 }
+ { \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_const:Nn \c_@@_revtex_bool \c_true_bool }
+ { \bool_const:Nn \c_@@_revtex_bool \c_false_bool }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_if_single_token_p:n { V }
+% \end{macrocode}
+%
+% \bigskip
+% The following regex will be used to modify the preamble of the array when the
+% key |colortbl-like| is used.
+% \begin{macrocode}
+\regex_const:Nn \c_@@_columncolor_regex { \c { columncolor } }
+% \end{macrocode}
+%
+% \bigskip
+% If the final user uses \pkg{nicematrix}, PGF/Tikz will write instruction
+% |\pgfsyspdfmark| in the |aux| file. If he changes its mind and no longer loads
+% \pkg{nicematrix}, an error may occur at the next compilation because of
+% remanent instructions |\pgfsyspdfmark| in the |aux| file. With the following
+% code, we try to avoid that situation.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_provide_pgfsyspdfmark:
+ {
+ \iow_now:Nn \@mainaux
+ {
+ \ExplSyntaxOn
+ \cs_if_free:NT \pgfsyspdfmark
+ { \cs_set_eq:NN \pgfsyspdfmark \@gobblethree }
+ \ExplSyntaxOff
+ }
+ \cs_gset_eq:NN \@@_provide_pgfsyspdfmark: \prg_do_nothing:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We define a command |\iddots| similar to |\ddots| ($\ddots$) but with dots
+% going forward ($\iddots$). We use |\ProvideDocumentCommand| and so, if the
+% command |\iddots| has already been defined (for example by the package
+% \pkg{mathdots}), we don't define it again.
+%
+% \begin{macrocode}
+\ProvideDocumentCommand \iddots { }
+ {
+ \mathinner
+ {
+ \tex_mkern:D 1 mu
+ \box_move_up:nn { 1 pt } { \hbox:n { . } }
+ \tex_mkern:D 2 mu
+ \box_move_up:nn { 4 pt } { \hbox:n { . } }
+ \tex_mkern:D 2 mu
+ \box_move_up:nn { 7 pt }
+ { \vbox:n { \kern 7 pt \hbox:n { . } } }
+ \tex_mkern:D 1 mu
+ }
+ }
+% \end{macrocode}
+%
+% This definition is a variant of the standard definition of |\ddots|.
+%
+%
+% \bigskip
+% In the |aux| file, we will have the references of the PGF/Tikz nodes created
+% by \pkg{nicematrix}. However, when \pkg{booktabs} is used, some nodes (more
+% precisely, some |row| nodes) will be defined twice because their position will
+% be modified. In order to avoid an error message in this case, we will redefine
+% |\pgfutil at check@rerun| in the |aux| file.
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { booktabs }
+ { \iow_now:Nn \@mainaux \nicematrix at redefine@check at rerun }
+ { }
+ }
+\cs_set_protected:Npn \nicematrix at redefine@check at rerun
+ {
+ \cs_set_eq:NN \@@_old_pgfutil at check@rerun \pgfutil at check@rerun
+% \end{macrocode}
+% The new version of |\pgfutil at check@rerun| will not check the PGF nodes whose
+% names start with |nm-| (which is the prefix for the nodes created by
+% \pkg{nicematrix}).
+% \begin{macrocode}
+ \cs_set_protected:Npn \pgfutil at check@rerun ##1 ##2
+ {
+ \str_if_eq:eeF { nm- } { \tl_range:nnn { ##1 } 1 3 }
+ { \@@_old_pgfutil at check@rerun { ##1 } { ##2 } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We have to know whether \pkg{colortbl} is loaded in particular for the
+% redefinition of |\everycr|.
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { colortbl }
+ { }
+ {
+% \end{macrocode}
+% The command |\CT at arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. We will use it to store the instruction of color for
+% the rules even if \pkg{colortbl} is not loaded.
+% \begin{macrocode}
+ \cs_set_protected:Npn \CT at arc@ { }
+ \cs_set:Npn \arrayrulecolor #1 # { \CT at arc { #1 } }
+ \cs_set:Npn \CT at arc #1 #2
+ {
+ \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign
+ { \cs_gset:Npn \CT at arc@ { \color #1 { #2 } } }
+ }
+% \end{macrocode}
+% Idem for |\CT at drs@|.
+% \begin{macrocode}
+ \cs_set:Npn \doublerulesepcolor #1 # { \CT at drs { #1 } }
+ \cs_set:Npn \CT at drs #1 #2
+ {
+ \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign
+ { \cs_gset:Npn \CT at drsc@ { \color #1 { #2 } } }
+ }
+ \cs_set:Npn \hline
+ {
+ \noalign { \ifnum 0 = `} \fi
+ \cs_set_eq:NN \hskip \vskip
+ \cs_set_eq:NN \vrule \hrule
+ \cs_set_eq:NN \@width \@height
+ { \CT at arc@ \vline }
+ \futurelet \reserved at a
+ \@xhline
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We have to redefine |\cline| for several reasons. The command |\@@_cline| will
+% be linked to |\cline| in the beginning of |{NiceArrayWithDelims}|. The
+% following commands must \emph{not} be protected.
+% \begin{macrocode}
+\cs_set:Npn \@@_standard_cline #1 { \@@_standard_cline:w #1 \q_stop }
+\cs_set:Npn \@@_standard_cline:w #1-#2 \q_stop
+ {
+ \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & }
+ \int_compare:nNnT { #1 } > 1 { \multispan { \int_eval:n { #1 - 1 } } & }
+ \multispan { \int_eval:n { #2 - #1 + 1 } }
+ {
+ \CT at arc@
+ \leaders \hrule \@height \arrayrulewidth \hfill
+% \end{macrocode}
+% The following |\skip_horizontal:N \c_zero_dim| is to prevent a potential
+% |\unskip| to delete the |\leaders|\footnote{See question 99041 on TeX
+% StackExchange.}
+% \begin{macrocode}
+ \skip_horizontal:N \c_zero_dim
+ }
+% \end{macrocode}
+% Our |\everycr| has been modified. In particular, the creation of the |row|
+% node is in the |\everycr| (maybe we should put it with the incrementation of
+% |\c at iRow|). Since the following |\cr| correspond to a ``false row'', we have
+% to nullify |\everycr|.
+% \begin{macrocode}
+ \everycr { }
+ \cr
+ \noalign { \skip_vertical:N -\arrayrulewidth }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following version of |\cline| spreads the array of a quantity equal
+% to |\arrayrulewidth| as does |\hline|. It will be loaded excepted if the key
+% |standard-cline| has been used.
+% \begin{macrocode}
+\cs_set:Npn \@@_cline
+% \end{macrocode}
+% We have to act in a fully expandable way since there may be |\noalign| (in the
+% |\multispan|) to detect. That's why we use |\@@_cline_i:en|.
+% \begin{macrocode}
+ { \@@_cline_i:en \l_@@_first_col_int }
+% \end{macrocode}
+% The command |\cline_i:nn| has two arguments. The first is the number of the
+% current column (it \emph{must} be used in that column). The second is a
+% standard argument of |\cline| of the form \textsl{i}-\textsl{j} or the form
+% \textsl{i}.
+% \begin{macrocode}
+\cs_set:Npn \@@_cline_i:nn #1 #2 { \@@_cline_i:w #1|#2- \q_stop }
+\cs_set:Npn \@@_cline_i:w #1|#2-#3 \q_stop
+ {
+ \tl_if_empty:nTF { #3 }
+ { \@@_cline_iii:w #1|#2-#2 \q_stop }
+ { \@@_cline_ii:w #1|#2-#3 \q_stop }
+ }
+\cs_set:Npn \@@_cline_ii:w #1|#2-#3-\q_stop
+ { \@@_cline_iii:w #1|#2-#3 \q_stop }
+\cs_set:Npn \@@_cline_iii:w #1|#2-#3 \q_stop
+ {
+% \end{macrocode}
+% Now, |#1| is the number of the current column and we have to draw a line from
+% the column |#2| to the column |#3| (both included).
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } < { #2 }
+ { \multispan { \int_eval:n { #2 - #1 } } & }
+ \multispan { \int_eval:n { #3 - #2 + 1 } }
+ {
+ \CT at arc@
+ \leaders \hrule \@height \arrayrulewidth \hfill
+ \skip_horizontal:N \c_zero_dim
+ }
+% \end{macrocode}
+% You look whether there is another |\cline| to draw (the final user may put
+% several |\cline|).
+% \begin{macrocode}
+ \peek_meaning_remove_ignore_spaces:NTF \cline
+ { & \@@_cline_i:en { \int_eval:n { #3 + 1 } } }
+ { \everycr { } \cr }
+ }
+\cs_generate_variant:Nn \@@_cline_i:nn { e n }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command is a small shortcut.
+% \begin{macrocode}
+\cs_new:Npn \@@_math_toggle_token:
+ { \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_CT at arc@:n #1
+ {
+ \tl_if_blank:nF { #1 }
+ {
+ \tl_if_head_eq_meaning:nNTF { #1 } [
+ { \cs_set:Npn \CT at arc@ { \color #1 } }
+ { \cs_set:Npn \CT at arc@ { \color { #1 } } }
+ }
+ }
+\cs_generate_variant:Nn \@@_set_CT at arc@:n { V }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_CT at drsc@:n #1
+ {
+ \tl_if_head_eq_meaning:nNTF { #1 } [
+ { \cs_set:Npn \CT at drsc@ { \color #1 } }
+ { \cs_set:Npn \CT at drsc@ { \color { #1 } } }
+ }
+\cs_generate_variant:Nn \@@_set_CT at drsc@:n { V }
+% \end{macrocode}
+%
+% \bigskip
+% The following command must \emph{not} be protected since it will be used to
+% write instructions in the (internal) |\CodeBefore|.
+% \begin{macrocode}
+\cs_new:Npn \@@_exp_color_arg:Nn #1 #2
+ {
+ \tl_if_head_eq_meaning:nNTF { #2 } [
+ { #1 #2 }
+ { #1 { #2 } }
+ }
+\cs_generate_variant:Nn \@@_exp_color_arg:Nn { N V }
+% \end{macrocode}
+%
+% The following command must be protected because of its use of the command |\color|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_color:n #1
+ { \tl_if_blank:nF { #1 } { \@@_exp_color_arg:Nn \color { #1 } } }
+\cs_generate_variant:Nn \@@_color:n { V }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_set_eq:NN \@@_old_pgfpointanchor \pgfpointanchor
+% \end{macrocode}
+%
+% \bigskip
+% \textbf{The column S of siunitx}\par\nobreak
+%
+% The command |\@@_renew_NC at rewrite@S:| will be used in each environment of
+% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment.
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { siunitx }
+ {
+ \cs_new_protected:Npn \@@_renew_NC at rewrite@S:
+ {
+ \renewcommand*{\NC at rewrite@S}[1][]
+ {
+% \end{macrocode}
+% |\@temptokena| is a toks (not supported by the L3 programming layer).
+% \begin{macrocode}
+ \tl_if_empty:nTF { ##1 }
+ {
+ \@temptokena \exp_after:wN
+ { \tex_the:D \@temptokena \@@_S: }
+ }
+ {
+ \@temptokena \exp_after:wN
+ { \tex_the:D \@temptokena \@@_S: [ ##1 ] }
+ }
+ \NC at find
+ }
+ }
+ }
+ { \cs_set_eq:NN \@@_renew_NC at rewrite@S: \prg_do_nothing: }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rescan_for_spanish:N #1
+ {
+ \tl_set_rescan:Nno
+ #1
+ {
+ \char_set_catcode_other:N >
+ \char_set_catcode_other:N <
+ }
+ #1
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{Parameters}
+%
+% \bigskip
+% The following counter will count the environments |{NiceArray}|. The value of
+% this counter will be used to prefix the names of the Tikz nodes created in the
+% array.
+% \begin{macrocode}
+\int_new:N \g_@@_env_int
+% \end{macrocode}
+%
+% \bigskip
+% The following command is only a syntaxic shortcut. It must \emph{not} be
+% protected (it will be used in names of \textsc{pgf} nodes).
+% \begin{macrocode}
+\cs_new:Npn \@@_env: { nm - \int_use:N \g_@@_env_int }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\NiceMatrixLastEnv| is not used by the package \pkg{nicematrix}.
+% It's only a facility given to the final user. It gives the number of the last
+% environment (in fact the number of the current environment but it's meant to
+% be used after the environment in order to refer to that environment --- and
+% its nodes --- without having to give it a name). This command \emph{must} be
+% expandable since it will be used in \pkg{pgf} nodes.
+% \begin{macrocode}
+\NewExpandableDocumentCommand \NiceMatrixLastEnv { }
+ { \int_use:N \g_@@_env_int }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command is only a syntaxic shortcut. The |q| in |qpoint| means
+% \emph{quick}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_qpoint:n #1
+ { \pgfpointanchor { \@@_env: - #1 } { center } }
+% \end{macrocode}
+%
+% \bigskip
+% The following counter will count the environments |{NiceMatrixBlock}|.
+% \begin{macrocode}
+\int_new:N \g_@@_NiceMatrixBlock_int
+% \end{macrocode}
+%
+% \bigskip
+% It's possible to put tabular notes (with |\tabularnote|) in the caption if
+% that caption is composed \emph{above} the tabular. In such case, we will count
+% in |\g_@@_notes_caption_int| the number of uses of the command
+% |\tabularnote| \emph{without optional argument} in that caption.
+% \begin{macrocode}
+\int_new:N \g_@@_notes_caption_int
+% \end{macrocode}
+%
+% \bigskip
+% The dimension |\l_@@_columns_width_dim| will be used when the options specify
+% that all the columns must have the same width (but, if the key |columns-width|
+% is used with the special value |auto|, the boolean
+% |l_@@_auto_columns_width_bool| also will be raised).
+% \begin{macrocode}
+\dim_new:N \l_@@_columns_width_dim
+% \end{macrocode}
+%
+% \bigskip
+% The dimension |\l_@@_col_width_dim| will be available in each cell which
+% belongs to a column of fixed width: |w{...}{...}|, |W{...}{...}|, |p{}|,
+% |m{}|, |b{}| but also |X| (when the actual width of that column is known, that
+% is to say after the first compilation). It's the width of that column. It will
+% be used by some commands |\Block|. A non positive value means that the column
+% has no fixed width (it's a column of type |c|, |r|, |l|, etc.).
+% \begin{macrocode}
+\dim_new:N \l_@@_col_width_dim
+\dim_set:Nn \l_@@_col_width_dim { -1 cm }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following counters will be used to count the numbers of rows and columns
+% of the array.
+% \begin{macrocode}
+\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
+% |\RowStyle|.
+% \begin{macrocode}
+\int_new:N \l_@@_key_nb_rows_int
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following token list will contain the type of horizontal alignment of the
+% current cell as provided by the corresponding column. The possible values are
+% |r|, |l|, |c|. For example, a column |p[l]{3cm}| will provide the value |l|
+% for all the cells of the column.
+% \begin{macrocode}
+\str_new:N \l_@@_hpos_cell_str
+\str_set:Nn \l_@@_hpos_cell_str { c }
+% \end{macrocode}
+%
+% \bigskip
+% When there is a mono-column block (created by the command |\Block|), we want
+% to take into account the width of that block for the width of the column.
+% That's why we compute the width of that block in the |\g_@@_blocks_wd_dim|
+% and, after the construction of the box |\l_@@_cell_box|, we change the width
+% of that box to take into account the length |\g_@@_blocks_wd_dim|.
+% \begin{macrocode}
+\dim_new:N \g_@@_blocks_wd_dim
+% \end{macrocode}
+%
+% \bigskip
+% Idem for the mono-row blocks.
+% \begin{macrocode}
+\dim_new:N \g_@@_blocks_ht_dim
+\dim_new:N \g_@@_blocks_dp_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following dimension will be used by the command |\Block| for the blocks
+% with a key of vertical position equal to |T| or |B|.
+% \begin{macrocode}
+\dim_new:N \l_@@_block_ysep_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following dimension correspond to the key |width| (which may be fixed in
+% |\NiceMatrixOptions| but also in an environment |{NiceTabular}|).
+% \begin{macrocode}
+\dim_new:N \l_@@_width_dim
+% \end{macrocode}
+%
+% \bigskip
+% The sequence |\g_@@_names_seq| will be the list of all the names of
+% environments used (via the option |name|) in the document: two environments
+% must not have the same name. However, it's possible to use the option
+% |allow-duplicate-names|.
+% \begin{macrocode}
+\seq_new:N \g_@@_names_seq
+% \end{macrocode}
+%
+% \bigskip
+% We want to know whether we are in an environment of \pkg{nicematrix} because we
+% will raise an error if the user tries to use nested environments.
+% \begin{macrocode}
+\bool_new:N \l_@@_in_env_bool
+% \end{macrocode}
+%
+% \bigskip
+% 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
+% |\g_@@_NiceArray_bool| will be raised.
+% \begin{macrocode}
+\bool_new:N \g_@@_NiceArray_bool
+% \end{macrocode}
+% In fact, if there is delimiters in the preamble of |{NiceArray}| (eg:
+% |[cccc]|), this boolean will be set to false.
+%
+% \bigskip
+% If the user uses |{NiceTabular}|, |{NiceTabular*}| or |{NiceTabularX}|, we
+% will raise the following flag.
+% \begin{macrocode}
+\bool_new:N \l_@@_NiceTabular_bool
+% \end{macrocode}
+%
+% \bigskip
+% If the user uses |{NiceTabular*}|, the width of the tabular (in the first
+% argument of the environment |{NiceTabular*}|) will be stored in the following
+% dimension.
+% \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
+% flag.
+% \begin{macrocode}
+\bool_new:N \l_@@_Matrix_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following boolean will be raised when the command |\rotate| is used.
+% \begin{macrocode}
+\bool_new:N \g_@@_rotate_bool
+% \end{macrocode}
+%
+% \bigskip
+% In a cell, it will be possible to know whether we are in a cell of a column of
+% type |X| thanks to that flag.
+% \begin{macrocode}
+\bool_new:N \l_@@_X_column_bool
+% \end{macrocode}
+%
+% \begin{macrocode}
+\bool_new:N \g_@@_caption_finished_bool
+% \end{macrocode}
+%
+% \bigskip
+% We will write in |\g_@@_aux_tl| all the instructions that we have to write on
+% the |aux| file for the current environment. The contain of that token list
+% will be written on the |aux| file at the end of the environment (in an
+% instruction |\tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }|).
+% \begin{macrocode}
+\tl_new:N \g_@@_aux_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following parameter corresponds to the key |columns-type| of the
+% environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. and also the key
+% |matrix / columns-type| of |\NiceMatrixOptions|. However, it does \emph{not}
+% contain the value provided by the final user. Indeed, a transformation is done
+% in order to have a preamble (for the package \pkg{array}) which is
+% nicematrix-aware. That transformation is done with the command
+% |\@@_set_preamble:Nn|.
+% \begin{macrocode}
+\tl_new:N \l_@@_columns_type_tl
+\hook_gput_code:nnn { begindocument } { . }
+ { \@@_set_preamble:Nn \l_@@_columns_type_tl { c } }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_math_mode:
+ {
+ \if_mode_math: \else:
+ \@@_fatal:n { Outside~math~mode }
+ \fi:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The letter used for the vlines which will be drawn only in the sub-matrices.
+% |vlism| stands for \emph{vertical lines in sub-matrices}.
+% \begin{macrocode}
+\tl_new:N \l_@@_letter_vlism_tl
+% \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
+% analyse of the preamble of the array.
+% \begin{macrocode}
+\seq_new:N \g_@@_cols_vlism_seq
+% \end{macrocode}
+%
+% \bigskip
+% The following colors will be used to memorize the color of the potential ``first
+% col'' and the potential ``first row''.
+% \begin{macrocode}
+\colorlet { nicematrix-last-col } { . }
+\colorlet { nicematrix-last-row } { . }
+% \end{macrocode}
+% \bigskip
+% The following string is the name of the current environment or the current
+% command of \pkg{nicematrix} (despite its name which contains \textsl{env}).
+% \begin{macrocode}
+\str_new:N \g_@@_name_env_str
+% \end{macrocode}
+%
+% \bigskip
+% The following string will contain the word \emph{command} or
+% \emph{environment} whether we are in a command of \pkg{nicematrix} or in an
+% environment of \pkg{nicematrix}. The default value is \emph{environment}.
+% \begin{macrocode}
+\tl_new:N \g_@@_com_or_env_str
+\tl_gset:Nn \g_@@_com_or_env_str { environment }
+% \end{macrocode}
+%
+% \bigskip
+% The following command will be able to reconstruct the full name of the current
+% command or environment (despite its name which contains \textsl{env}). This
+% command must \emph{not} be protected since it will be used in error messages
+% and we have to use |\str_if_eq:VnTF| and not |\tl_if_eq:NnTF| because we need
+% to be fully expandable).
+% \begin{macrocode}
+\cs_new:Npn \@@_full_name_env:
+ {
+ \str_if_eq:VnTF \g_@@_com_or_env_str { command }
+ { command \space \c_backslash_str \g_@@_name_env_str }
+ { environment \space \{ \g_@@_name_env_str \} }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following token list corresponds to the option |code-after| (it's also
+% possible to set the value of that parameter with the keyword |\CodeAfter|).
+% That parameter is \emph{public}.
+% \begin{macrocode}
+\tl_new:N \g_nicematrix_code_after_tl
+\bool_new:N \l_@@_in_code_after_bool
+% \end{macrocode}
+%
+% \bigskip
+% For the key |code| of the command |\SubMatrix| (itself in the main
+% |\CodeAfter|), we will use the following token list.
+% \begin{macrocode}
+\tl_new:N \l_@@_code_tl
+% \end{macrocode}
+%
+% \bigskip
+% For the key |pgf-node-code|. That code will be used when the nodes of the
+% cells (that is to say the nodes of the form |i-j|) will be created.
+% \begin{macrocode}
+\tl_new:N \l_@@_pgf_node_code_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following token list has a function similar to
+% |\g_nicematrix_code_after_tl| but it is used internally by \pkg{nicematrix}.
+% In fact, we have to distinguish between |\g_nicematrix_code_after_tl| and
+% |\g_@@_pre_code_after_tl| because we must take care of the order in which
+% instructions stored in that parameters are executed.
+% \begin{macrocode}
+\tl_new:N \g_@@_pre_code_after_tl
+% \end{macrocode}
+%
+% \bigskip
+% The value of the key |code-before| will be added to the left of
+% |\g_@@_pre_code_before_tl|. Idem for the code between |\CodeBefore| and
+% |\Body|.
+% \begin{macrocode}
+\tl_new:N \g_nicematrix_code_before_tl
+\tl_new:N \g_@@_pre_code_before_tl
+% \end{macrocode}
+%
+% \bigskip
+% The counters |\l_@@_old_iRow_int| and |\l_@@_old_jCol_int| will be used to
+% save the values of the potential LaTeX counters |iRow| and |jCol|. These LaTeX
+% counters will be restored at the end of the environment.
+% \begin{macrocode}
+\int_new:N \l_@@_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| by the key |command| or |ccommand| (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}
+\tl_new:N \l_@@_rules_color_tl
+% \end{macrocode}
+%
+% \bigskip
+% The sum of the weights of all the |X|-columns in the preamble. The weight of a
+% |X|-column is given as an optional argument between square brackets. The
+% default value, of course, is $1$.
+% \begin{macrocode}
+\int_new:N \g_@@_total_X_weight_int
+% \end{macrocode}
+%
+% If there is at least one |X|-column in the preamble of the array, the
+% following flag will be raised via the |aux| file. The length
+% |l_@@_x_columns_dim| will be the width of |X|-columns of weight $1$ (the width
+% of a column of weigth $n$ will be that dimension multiplied by~$n$). That
+% value is computed after the construction of the array during the first
+% compilation in order to be used in the following run.
+% \begin{macrocode}
+\bool_new:N \l_@@_X_columns_aux_bool
+\dim_new:N \l_@@_X_columns_dim
+% \end{macrocode}
+%
+%
+% \bigskip
+% This boolean will be used only to detect in an expandable way whether we are
+% at the beginning of the (potential) column zero, in order to raise an error if
+% |\Hdotsfor| is used in that column.
+% \begin{macrocode}
+\bool_new:N \g_@@_after_col_zero_bool
+% \end{macrocode}
+%
+% \bigskip
+% A kind of false row will be inserted at the end of the array for the
+% construction of the |col| nodes (and also to fix the width of the columns when
+% |columns-width| is used). When this special row will be created, we will raise
+% the flag |\g_@@_row_of_col_done_bool| in order to avoid some actions set in
+% the redefinition of |\everycr| when the last |\cr| of the |\halign| will occur
+% (after that row of |col| nodes).
+% \begin{macrocode}
+\bool_new:N \g_@@_row_of_col_done_bool
+% \end{macrocode}
+%
+%
+% \bigskip
+% It's possible to use the command |\NotEmpty| to specify explicitely that a
+% cell must be considered as non empty by \pkg{nicematrix} (the Tikz nodes are
+% constructed only in the non empty cells).
+% \begin{macrocode}
+\bool_new:N \g_@@_not_empty_cell_bool
+% \end{macrocode}
+%
+% \bigskip
+% |\l_@@_code_before_tl| may contain two types of informations:
+% \begin{itemize}
+% \item A |code-before| written in the |aux| file by a previous run. When the
+% |aux| file is read, this |code-before| is stored in
+% |\g_@@_code_before_|\textsl{i}|_tl| (where \textsl{i} is the number of the
+% environment) and, at the beginning of the environment, it will be put in
+% |\l_@@_code_before_tl|.
+% \item The final user can explicitly add material in |\l_@@_code_before_tl| by
+% using the key |code-before| or the keyword |\CodeBefore| (with the keyword
+% |\Body|).
+% \end{itemize}
+% \begin{macrocode}
+\tl_new:N \l_@@_code_before_tl
+\bool_new:N \l_@@_code_before_bool
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following token list will contain the code inserted in each cell of the
+% current row (this token list will be cleared at the beginning of each row).
+% \begin{macrocode}
+\tl_new:N \g_@@_row_style_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following dimensions will be used when drawing the dotted lines.
+% \begin{macrocode}
+\dim_new:N \l_@@_x_initial_dim
+\dim_new:N \l_@@_y_initial_dim
+\dim_new:N \l_@@_x_final_dim
+\dim_new:N \l_@@_y_final_dim
+% \end{macrocode}
+%
+% \bigskip
+% The L3 programming layer provides scratch dimensions |\l_tmpa_dim| and
+% |\l_tmpb_dim|. We creates two more in the same spirit.
+% \begin{macrocode}
+\dim_zero_new:N \l_@@_tmpc_dim
+\dim_zero_new:N \l_@@_tmpd_dim
+% \end{macrocode}
+%
+% \bigskip
+% Some cells will be declared as ``empty'' (for example a cell with an
+% instruction |\Cdots|).
+% \begin{macrocode}
+\bool_new:N \g_@@_empty_cell_bool
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following dimensions will be used internally to compute the width of the
+% potential ``first column'' and ``last column''.
+% \begin{macrocode}
+\dim_new:N \g_@@_width_last_col_dim
+\dim_new:N \g_@@_width_first_col_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following sequence will contain the characteristics of the blocks of the
+% array, specified by the command |\Block|. Each block is represented by 6
+% components surrounded by curly braces:
+%
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|\textsl{options}|}{|\textsl{contents}|}|.
+%
+% The variable is global because it will be modified in the cells of the array.
+% \begin{macrocode}
+\seq_new:N \g_@@_blocks_seq
+% \end{macrocode}
+% We also manage a sequence of the \emph{positions} of the blocks. In that
+% sequence, each block is represented by only five components:
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|%
+% \textsl{name}|}|. A block with the key |hvlines| won't appear in that
+% sequence (otherwise, the lines in that block would not be drawn!).
+% \begin{macrocode}
+\seq_new:N \g_@@_pos_of_blocks_seq
+% \end{macrocode}
+% In fact, this sequence will also contain the positions of the cells with a
+% |\diagbox|. The sequence |\g_@@_pos_of_blocks_seq| will be used when we will
+% draw the rules (which respect the blocks).
+%
+% \bigskip
+% We will also manage a sequence for the positions of the dotted lines. These
+% dotted lines are created in the array by |\Cdots|, |\Vdots|, |\Ddots|, etc.
+% However, their positions, that is to say, their extremities, will be
+% determined only after the construction of the array. In this sequence, each
+% item contains five components:
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|%
+% \textsl{name}|}|.
+% \begin{macrocode}
+\seq_new:N \g_@@_pos_of_xdots_seq
+% \end{macrocode}
+% The sequence |\g_@@_pos_of_xdots_seq| will be used when we will draw the rules
+% required by the key |hvlines| (these rules won't be drawn within the virtual
+% blocks corresponding to the dotted lines).
+%
+% \medskip
+% The final user may decide to ``stroke'' a block (using, for example, the key
+% |draw=red!15| when using the command |\Block|). In that case, the rules
+% specified, for instance, by |hvlines| must not be drawn around the block.
+% That's why we keep the information of all that stroken blocks in the following
+% sequence.
+% \begin{macrocode}
+\seq_new:N \g_@@_pos_of_stroken_blocks_seq
+% \end{macrocode}
+%
+%
+% \medskip
+% 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
+% \end{macrocode}
+%
+% \medskip
+% The list of the names of the potential |\SubMatrix| in the |\CodeAfter| of an
+% environment. Unfortunately, that list has to be global (we have to use it
+% inside the group for the options of a given |\SubMatrix|).
+% \begin{macrocode}
+\seq_new:N \g_@@_submatrix_names_seq
+% \end{macrocode}
+%
+% \medskip
+% The following flag will be raised if the key |width| is used in an environment
+% |{NiceTabular}| (not in a command |\NiceMatrixOptions|). You use it to raise
+% an error when this key is used while no column |X| is used.
+% \begin{macrocode}
+\bool_new:N \l_@@_width_used_bool
+% \end{macrocode}
+%
+% \medskip
+% The sequence |\g_@@_multicolumn_cells_seq| will contain the list of the cells
+% of the array where a command |\multicolumn{|$n$|}{...}{...}| with $n>1$ is
+% issued. In |\g_@@_multicolumn_sizes_seq|, the ``sizes'' (that is to say the
+% values of $n$) correspondant will be stored. These lists will be used for the
+% creation of the ``medium nodes'' (if they are created).
+% \begin{macrocode}
+\seq_new:N \g_@@_multicolumn_cells_seq
+\seq_new:N \g_@@_multicolumn_sizes_seq
+% \end{macrocode}
+%
+% \medskip
+% The following counters will be used when searching the extremities of a dotted
+% line (we need these counters because of the potential ``open'' lines in the
+% |\SubMatrix|---the |\SubMatrix| in the |code-before|).
+% \begin{macrocode}
+\int_new:N \l_@@_row_min_int
+\int_new:N \l_@@_row_max_int
+\int_new:N \l_@@_col_min_int
+\int_new:N \l_@@_col_max_int
+% \end{macrocode}
+%
+% \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 |\CodeBefore|. Each sub-matrix is
+% represented by an ``object'' of the form |{|$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.
+% \begin{macrocode}
+\seq_new:N \g_@@_submatrix_seq
+% \end{macrocode}
+%
+% \medskip
+% We are able to determine the number of columns specified in the preamble (for
+% the environments with explicit preamble of course and without the potential
+% exterior columns).
+% \begin{macrocode}
+\int_new:N \g_@@_static_num_of_col_int
+% \end{macrocode}
+%
+% \medskip
+% The following parameters correspond to the keys |fill|, |draw|, |tikz|, |borders|,
+% and |rounded-corners| of the command |\Block|.
+% \begin{macrocode}
+\tl_new:N \l_@@_fill_tl
+\tl_new:N \l_@@_draw_tl
+\seq_new:N \l_@@_tikz_seq
+\clist_new:N \l_@@_borders_clist
+\dim_new:N \l_@@_rounded_corners_dim
+% \end{macrocode}
+% The last parameter has no direct link with the [empty] corners of the array
+% (which are computed and taken into account by \pkg{nicematrix} when the key
+% |corners| is used).
+%
+% \medskip
+% The following dimension corresponds to the key |rounded-corners| available in
+% an individual environment |{NiceTabular}|. When that key is used, a clipping
+% is applied in the |\CodeBefore| of the environment in order to have rounded
+% corners for the potential colored panels.
+% \begin{macrocode}
+\dim_new:N \l_@@_tab_rounded_corners_dim
+% \end{macrocode}
+%
+% \medskip
+% The following token list correspond to the key |color| of the command |\Block|
+% and also the key |color| of the command |\RowStyle|.
+% \begin{macrocode}
+\tl_new:N \l_@@_color_tl
+% \end{macrocode}
+%
+% \medskip
+% Here is the dimension for the width of the rule when a block (created by
+% |\Block|) is stroked.
+% \begin{macrocode}
+\dim_new:N \l_@@_line_width_dim
+% \end{macrocode}
+%
+% \medskip
+% The parameters of the horizontal position of the label of a block. If the user
+% uses the key |c| or |C|, the value is |c|. If the user uses the key |l| or
+% |L|, the value is |l|. If the user uses the key |r| or |R|, the value is |r|.
+% If the user has used a capital letter, the boolean
+% |\l_@@_hpos_of_block_cap_bool| will be raised (in the second pass of the
+% analyze of the keys of the command |\Block|).
+% \begin{macrocode}
+\str_new:N \l_@@_hpos_block_str
+\str_set:Nn \l_@@_hpos_block_str { c }
+\bool_new:N \l_@@_hpos_of_block_cap_bool
+% \end{macrocode}
+%
+% \medskip
+% For the vertical position, the possible values are |c|, |t| and |b|. Of
+% course, it would be interesting to program a key |T| and a key |B|.
+% \begin{macrocode}
+\str_new:N \l_@@_vpos_of_block_str
+\str_set:Nn \l_@@_vpos_of_block_str { c }
+% \end{macrocode}
+%
+%
+% \medskip
+% Used when the key |draw-first| is used for |\Ddots| or |\Iddots|.
+% \begin{macrocode}
+\bool_new:N \l_@@_draw_first_bool
+% \end{macrocode}
+%
+%
+% \medskip
+% The following flag corresponds to the keys |vlines| and |hlines| of the
+% command |\Block| (the key |hvlines| is the conjunction of both).
+% \begin{macrocode}
+\bool_new:N \l_@@_vlines_block_bool
+\bool_new:N \l_@@_hlines_block_bool
+% \end{macrocode}
+%
+%
+% \medskip
+% The blocks which use the key |-| will store their content in a box. These
+% boxes are numbered with the following counter.
+% \begin{macrocode}
+\int_new:N \g_@@_block_box_int
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\dim_new:N \l_@@_submatrix_extra_height_dim
+\dim_new:N \l_@@_submatrix_left_xshift_dim
+\dim_new:N \l_@@_submatrix_right_xshift_dim
+\clist_new:N \l_@@_hlines_clist
+\clist_new:N \l_@@_vlines_clist
+\clist_new:N \l_@@_submatrix_hlines_clist
+\clist_new:N \l_@@_submatrix_vlines_clist
+% \end{macrocode}
+%
+% \medskip
+% The following key is set when the keys |hvlines| and |hvlines-except-borders|
+% are used. It's used only to change slightly the clipping path set by the key
+% |rounded-corners| (for a |{tabular}|).
+% \begin{macrocode}
+\bool_new:N \l_@@_hvlines_bool
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following flag will be used by (for instance) |\@@_vline_ii:|.
+% When |\l_@@_dotted_bool| is |true|, a dotted line (with our system) will be drawn.
+% \begin{macrocode}
+\bool_new:N \l_@@_dotted_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following flag will be set to true during the composition of a caption
+% specified (by the key |caption|).
+% \begin{macrocode}
+\bool_new:N \l_@@_in_caption_bool
+% \end{macrocode}
+%
+%
+% \bigskip
+% \textbf{Variables for the exterior rows and columns}\par\nobreak
+%
+% \medskip
+% The keys for the exterior rows and columns are |first-row|, |first-col|,
+% |last-row| and |last-col|. However, internally, these keys are not coded in a
+% similar way.
+%
+% \bigskip
+% \begin{itemize}
+% \item \textbf{First row}\par\nobreak
+% The integer |\l_@@_first_row_int| is the number of the first row of the
+% array. The default value is $1$, but, if the option |first-row| is used,
+% the value will be~$0$.
+% \begin{macrocode}
+\int_new:N \l_@@_first_row_int
+\int_set:Nn \l_@@_first_row_int 1
+% \end{macrocode}
+%
+% \medskip
+% \item \textbf{First column}\par\nobreak
+% The integer |\l_@@_first_col_int| is the number of the first column of the
+% array. The default value is $1$, but, if the option |first-col| is used,
+% the value will be~$0$.
+% \begin{macrocode}
+\int_new:N \l_@@_first_col_int
+\int_set:Nn \l_@@_first_col_int 1
+% \end{macrocode}
+%
+% \medskip
+% \item \textbf{Last row}\par\nobreak
+% The counter |\l_@@_last_row_int| is the number of the potential ``last row'',
+% as specified by the key |last-row|. A value of $-2$ means that there is no
+% ``last row''. A value of $-1$ means that there is a ``last row'' but we don't
+% know the number of that row (the key |last-row| has been used without value
+% and the actual value has not still been read in the |aux| file).
+% \begin{macrocode}
+\int_new:N \l_@@_last_row_int
+\int_set:Nn \l_@@_last_row_int { -2 }
+% \end{macrocode}
+%
+% \smallskip
+% If, in an environment like |{pNiceArray}|, the option |last-row| is used
+% without value, we will globally raise the following flag. It will be used to
+% know if we have, after the construction of the array, to write in the |aux|
+% file the number of the ``last row''.\footnote{We can't use
+% |\l_@@_last_row_int| for this usage because, if \pkg{nicematrix} has read its
+% value from the |aux| file, the value of the counter won't be $-1$ any longer.}
+% \begin{macrocode}
+\bool_new:N \l_@@_last_row_without_value_bool
+% \end{macrocode}
+%
+% \smallskip
+% Idem for |\l_@@_last_col_without_value_bool|
+% \begin{macrocode}
+\bool_new:N \l_@@_last_col_without_value_bool
+% \end{macrocode}
+%
+% \medskip
+% \item \textbf{Last column}\par\nobreak
+%
+% For the potential ``last column'', we use an integer. A value of $-2$ means
+% that there is no last column. A value of $-1$ means that we are in an
+% environment without preamble (e.g. |{bNiceMatrix}|) and there is a last column
+% but we don't know its value because the user has used the option |last-col|
+% without value. A value of $0$ means that the option |last-col| has been used
+% in an environment with preamble (like |{pNiceArray}|): in this case, the key
+% was necessary without argument.
+% \begin{macrocode}
+\int_new:N \l_@@_last_col_int
+\int_set:Nn \l_@@_last_col_int { -2 }
+% \end{macrocode}
+%
+% However, we have also a boolean. Consider the following code:
+% \begin{center}
+% \begin{BVerbatim}
+% \begin{pNiceArray}{cc}[last-col]
+% 1 & 2 \\
+% 3 & 4
+% \end{pNiceArray}
+% \end{BVerbatim}
+% \end{center}
+% In such a code, the ``last column'' specified by the key |last-col| is not
+% used. We want to be able to detect such a situation and we create a boolean
+% for that job.
+% \begin{macrocode}
+\bool_new:N \g_@@_last_col_found_bool
+% \end{macrocode}
+% This boolean is set to |false| at the end of |\@@_pre_array_ii:|.
+% \end{itemize}
+%
+% \bigskip
+% \textbf{Some utilities}
+%
+% \medskip
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_cut_on_hyphen:w #1-#2\q_stop
+ {
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_set:Nn \l_tmpb_tl { #2 }
+ }
+% \end{macrocode}
+%
+%
+% The following takes as argument the name of a |clist| and which should be a
+% list of intervals of integers. It \emph{expands} that list, that is to say,
+% it replaces (by a sort of |mapcan| or |flat_map|) the interval by the explicit
+% list of the integers.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_expand_clist:N #1
+ {
+ \clist_if_in:NnF #1 { all }
+ {
+ \clist_clear:N \l_tmpa_clist
+ \clist_map_inline:Nn #1
+ {
+ \tl_if_in:nnTF { ##1 } { - }
+ { \@@_cut_on_hyphen:w ##1 \q_stop }
+ {
+ \tl_set:Nn \l_tmpa_tl { ##1 }
+ \tl_set:Nn \l_tmpb_tl { ##1 }
+ }
+ \int_step_inline:nnn { \l_tmpa_tl } { \l_tmpb_tl }
+ { \clist_put_right:Nn \l_tmpa_clist { ####1 } }
+ }
+ \tl_set_eq:NN #1 \l_tmpa_clist
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The command \textbackslash tabularnote}
+%
+% \bigskip
+% Of course, it's possible to use |\tabularnote| in the main tabular. But there
+% is also the possibility to use that command in the caption of the tabular. And
+% the caption may be specified by two means:
+%
+% \begin{itemize}
+% \item The caption may of course be provided by the command |\caption| in a
+% floating environment. Of course, a command |\tabularnote| in that |\caption|
+% makes sens only if the |\caption| is \emph{before} the |{tabular}|.
+% \item It's also possible to use |\tabularnote| in the value of the key
+% |caption| of the |{NiceTabular}| when the key |caption-above| is in force.
+% However, in that case, one must remind that the caption is composed
+% \emph{after} the composition of the box which contains the main tabular
+% (that's mandatory since that caption must be wrapped with a line width equal
+% to the width ot the tabular). However, we want the labels of the successive
+% tabular notes in the logical order. That's why:
+% \begin{itemize}
+% \item The number of tabular notes present in the caption will be written on
+% the |aux| file and available in |\g_@@_notes_caption_int|.\footnote{More
+% precisely, it's the number of tabular notes which do not use the optional
+% argument of |\tabularnote|.}
+% \item During the composition of the main tabular, the tabular notes will be
+% numbered from |\g_@@_notes_caption_int|+1 and the notes will be stored in
+% |\g_@@_notes_seq|. Each composant of |\g_@@_notes_seq| will be a kind of
+% couple of the form : \texttt{\{\textsl{label}\}\{\textsl{text of the
+% tabularnote}\}}. The first composante is the optional argument (between square
+% brackets) of the command |\tabularnote| (if the optional argument is not used,
+% the value will be the special marker |\c_novalue_tl|).
+% \item During the composition of the caption (value of |\l_@@_caption_tl|), the
+% tabular notes will be numbered from $1$ to |\g_@@_notes_caption_int| and the
+% notes themselves will be stored in |\g_@@_notes_in_caption_seq|. The structure
+% of the composantes of that sequence will be the same as for |\g_@@_notes_seq|.
+% \item After the composition of the main tabular and after the composition of
+% the caption, the sequences |\g_@@_notes_in_caption_seq| and |\g_@@_notes_seq|
+% will be merged (in that order) and the notes will be composed.
+% \end{itemize}
+% \end{itemize}
+%
+%
+% \bigskip
+% The LaTeX counter |tabularnote| will be used to count the tabular notes during
+% the construction of the array (this counter won't be used during the
+% composition of the notes at the end of the array). You use a LaTeX counter
+% because we will use |\refstepcounter| in order to have the tabular notes
+% referenceable.
+% \begin{macrocode}
+\newcounter { tabularnote }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\seq_new:N \g_@@_notes_seq
+\seq_new:N \g_@@_notes_in_caption_seq
+% \end{macrocode}
+%
+% \bigskip
+% Before the actual tabular notes, it's possible to put a text
+% specified by the key |tabularnote| of the environment. The token list
+% |\g_@@_tabularnote_tl| corresponds to the value of that key.
+% \begin{macrocode}
+\tl_new:N \g_@@_tabularnote_tl
+% \end{macrocode}
+%
+% \bigskip
+% We prepare the tools for the formatting of the references of the footnotes (in
+% the tabular itself). There may have several references of footnote at the same
+% point and we have to take into account that point.
+% \begin{macrocode}
+\seq_new:N \l_@@_notes_labels_seq
+\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|.
+% \begin{macrocode}
+\cs_new:Npn \@@_notes_style:n #1 { \textit { \alph { #1 } } }
+% \end{macrocode}
+%
+% \bigskip
+% The following fonction can be redefined by using the key
+% |notes/label-in-tabular|.
+% \begin{macrocode}
+\cs_new:Npn \@@_notes_label_in_tabular:n #1 { \textsuperscript { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% The following function can be redefined by using the key |notes/label-in-list|.
+% \begin{macrocode}
+\cs_new:Npn \@@_notes_label_in_list:n #1 { \textsuperscript { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% We define |\thetabularnote| because it will be used by LaTeX if the user want
+% to reference a tabular which has been marked by a |\label|. The TeX group is
+% for the case where the user has put an instruction such as |\color{red}| in
+% |\@@_notes_style:n|.
+% \begin{macrocode}
+\cs_set:Npn \thetabularnote { { \@@_notes_style:n { tabularnote } } }
+% \end{macrocode}
+%
+% \bigskip
+% The tabular notes will be available for the final user only when
+% \pkg{enumitem} is loaded. Indeed, the tabular notes will be composed at the end
+% of the array with a list customized by \pkg{enumitem} (a list |tabularnotes|
+% in the general case and a list |tabularnotes*| if the key |para| is in force).
+% However, we can test whether \pkg{enumitem} has been loaded only at the
+% beginning of the document (we want to allow the user to load \pkg{enumitem}
+% after \pkg{nicematrix}).
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { enumitem }
+ {
+% \end{macrocode}
+% The type of list |tabularnotes| will be used to format the tabular notes at
+% the end of the array in the general case and |tabularnotes*| will be used if
+% the key |para| is in force.
+% \begin{macrocode}
+ \newlist { tabularnotes } { enumerate } { 1 }
+ \setlist [ tabularnotes ]
+ {
+ topsep = 0pt ,
+ noitemsep ,
+ leftmargin = * ,
+ align = left ,
+ labelsep = 0pt ,
+ label =
+ \@@_notes_label_in_list:n { \@@_notes_style:n { tabularnotesi } } ,
+ }
+ \newlist { tabularnotes* } { enumerate* } { 1 }
+ \setlist [ tabularnotes* ]
+ {
+ afterlabel = \nobreak ,
+ itemjoin = \quad ,
+ label =
+ \@@_notes_label_in_list:n { \@@_notes_style:n { tabularnotes*i } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% One must remind that we have allowed a |\tabular| in the caption and
+% that caption may also be found in the list of tables (|\listoftables|). We
+% want the command |\tabularnote| be no-op during the composition of that list.
+% That's why we program |\tabularnote| to be no-op excepted in a floating
+% environment or in an environment of \pkg{nicematrix}.
+% \begin{macrocode}
+ \NewDocumentCommand \tabularnote { o m }
+ {
+ \bool_if:nT { \cs_if_exist_p:N \@captype || \l_@@_in_env_bool }
+ {
+ \bool_if:nTF { ! \l_@@_NiceTabular_bool && \l_@@_in_env_bool }
+ { \@@_error:n { tabularnote~forbidden } }
+ {
+ \bool_if:NTF \l_@@_in_caption_bool
+ { \@@_tabularnote_caption:nn { #1 } { #2 } }
+ { \@@_tabularnote:nn { #1 } { #2 } }
+ }
+ }
+ }
+ }
+ {
+ \NewDocumentCommand \tabularnote { o m }
+ {
+ \@@_error_or_warning:n { enumitem~not~loaded }
+ \@@_gredirect_none:n { enumitem~not~loaded }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% For the version in normal conditions, that is to say not in the |caption|.
+% |#1| is the optional argument of |\tabularnote| (maybe equal to the special
+% marker |\c_novalue_tl|) and |#2| is the mandatory argument of |\tabularnote|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tabularnote:nn #1 #2
+ {
+% \end{macrocode}
+% 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
+% |\g_@@_notes_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_zero:N \l_tmpa_int
+ \bool_if:NT \l_@@_notes_detect_duplicates_bool
+ {
+% \end{macrocode}
+% We recall that each component of |\g_@@_notes_seq| is a kind of couple of the form
+% \begin{center}
+% \texttt{\{\textsl{label}\}\{\textsl{text of the tabularnote}\}}.
+% \end{center}
+% If the user have used |\tabularnote| without the optional argument, the
+% \texttt{\textsl{label}} will be the special marker |\c_novalue_tl|.
+% \begin{macrocode}
+ \seq_map_indexed_inline:Nn \g_@@_notes_seq
+ {
+ \tl_if_eq:nnT { { #1 } { #2 } } { ##2 }
+ { \int_set:Nn \l_tmpa_int { ##1 } \seq_map_break: }
+ }
+ \int_compare:nNnF \l_tmpa_int = \c_zero_int
+ { \int_add:Nn \l_tmpa_int \g_@@_notes_caption_int }
+ }
+ \int_compare:nNnT \l_tmpa_int = \c_zero_int
+ {
+ \seq_gput_right:Nn \g_@@_notes_seq { { #1 } { #2 } }
+ \tl_if_novalue:nT { #1 } { \int_gincr:N \c at tabularnote }
+ }
+ \seq_put_right:Nx \l_@@_notes_labels_seq
+ {
+ \tl_if_novalue:nTF { #1 }
+ {
+ \@@_notes_format:n
+ {
+ \int_eval:n
+ {
+ \int_compare:nNnTF \l_tmpa_int = \c_zero_int
+ \c at tabularnote
+ \l_tmpa_int
+ }
+ }
+ }
+ { #1 }
+ }
+ \peek_meaning:NF \tabularnote
+ {
+% \end{macrocode}
+% If the following token is \emph{not} a |\tabularnote|, we have finished the
+% sequence of successive commands |\tabularnote| and we have to format the
+% labels of these tabular notes (in the array). We compose those labels in a box
+% |\l_tmpa_box| because we will do a special construction in order to have this
+% box in an overlapping position if we are at the end of a cell.
+% \begin{macrocode}
+ \hbox_set:Nn \l_tmpa_box
+ {
+% \end{macrocode}
+% We remind that it is the command |\@@_notes_label_in_tabular:n| that will
+% put the labels in a |\textsuperscript|.
+% \begin{macrocode}
+ \@@_notes_label_in_tabular:n
+ {
+ \seq_use:Nnnn
+ \l_@@_notes_labels_seq { , } { , } { , }
+ }
+ }
+% \end{macrocode}
+% We want the (last) tabular note referenceable (with the standard command |\label|).
+% \begin{macrocode}
+ \int_gsub:Nn \c at tabularnote { 1 }
+ \int_set_eq:NN \l_tmpa_int \c at tabularnote
+ \refstepcounter { tabularnote }
+ \int_compare:nNnT \l_tmpa_int = \c at tabularnote
+ { \int_gincr:N \c at tabularnote }
+ \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
+% |\unskip| (inserted by \pkg{array}?) will delete the skip we insert now
+% and the label of the footnote will be composed in an overlapping position (by
+% design).
+% \begin{macrocode}
+ \skip_horizontal:n { \box_wd:N \l_tmpa_box }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Now the version when the command is used in the key |caption|. The main
+% difficulty is that the argument of the command |\caption| is composed several
+% times. In order to know the number of commands |\tabularnote| in the caption,
+% we will consider that there should not be the same tabular note twice in the
+% caption (in the main tabular, it's possible). Once we have found a tabular
+% note which has yet been encountered, we consider that you are in a new
+% composition of the argument of |\caption|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tabularnote_caption:nn #1 #2
+ {
+ \bool_if:NTF \g_@@_caption_finished_bool
+ {
+ \int_compare:nNnT
+ \c at tabularnote = \g_@@_notes_caption_int
+ { \int_gzero:N \c at tabularnote }
+% \end{macrocode}
+% Now, we try to detect duplicate notes in the caption.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \seq_map_inline:Nn \g_@@_notes_in_caption_seq
+ { \@@_if_eq_two_three:nnn ##1 { #2 } }
+% \end{macrocode}
+% Be careful! We must put |\bool_if:NF| and not |\bool_if:NT|!
+% \begin{macrocode}
+ \bool_if:NF \l_tmpa_bool
+ { \@@_error:n { Identical~notes~in~caption } }
+ }
+ {
+% \end{macrocode}
+% In the following code, we are in the first composition of the caption or at
+% the first |\tabularnote| of the second composition. We have
+% to see whether the text of our tabular note is among the texts of the
+% tabularnotes stored in |\g_@@_notes_in_caption_seq|. For that, we will loop on
+% |\g_@@_notes_in_caption_seq| and we will raise |\l_tmpa_bool| if the text is found.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \seq_map_inline:Nn \g_@@_notes_in_caption_seq
+ { \@@_if_eq_two_three:nnn ##1 { #2 } }
+ \bool_if:NTF \l_tmpa_bool
+ {
+% \end{macrocode}
+% Now, we known that are in the second composition of the caption since we are
+% reading a tabular note which has yet been read. Now, the value of
+% |\g_@@_notes_caption_int| won't change anymore: it's the number of uses
+% \emph{without optional argument} of the command |\tabularnote| in the caption.
+% \begin{macrocode}
+ \bool_gset_true:N \g_@@_caption_finished_bool
+ \int_gset_eq:NN \g_@@_notes_caption_int \c at tabularnote
+ \int_gzero:N \c at tabularnote
+ }
+ { \seq_gput_right:Nn \g_@@_notes_in_caption_seq { { #1 } { #2 } } }
+ }
+% \end{macrocode}
+% Now, we will compose the label of the footnote (in the caption). Even if we
+% are not in the first composition, we have to compose that label!
+% \begin{macrocode}
+ \tl_if_novalue:nT { #1 } { \int_gincr:N \c at tabularnote }
+ \seq_put_right:Nx \l_@@_notes_labels_seq
+ {
+ \tl_if_novalue:nTF { #1 }
+ { \@@_notes_format:n { \int_use:N \c at tabularnote } }
+ { #1 }
+ }
+ \peek_meaning:NF \tabularnote
+ {
+ \@@_notes_label_in_tabular:n
+ { \seq_use:Nnnn \l_@@_notes_labels_seq { , } { , } { , } }
+ \seq_clear:N \l_@@_notes_labels_seq
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_if_eq_two_three:nnn #1 #2 #3
+ {
+ \tl_if_eq:nnT { #2 } { #3 }
+ {
+ \bool_set_true:N \l_tmpa_bool
+ \seq_map_break:
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_count_novalue_first:nn #1 #2
+ { \tl_if_novalue:nT { #1 } { \int_gincr:N \g_@@_notes_caption_int } }
+% \end{macrocode}
+%
+%
+% \section{Command for creation of rectangle nodes}
+%
+% The following command should be used in a |{pgfpicture}|. It creates a
+% rectangle (empty but with a name).
+%
+% |#1| is the name of the node which will be created;
+% |#2| and |#3| are the coordinates of one of the corner of the rectangle;
+% |#4| and |#5| are the coordinates of the opposite corner.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pgf_rect_node:nnnnn #1 #2 #3 #4 #5
+ {
+ \begin { pgfscope }
+ \pgfset
+ {
+ % outer~sep = \c_zero_dim ,
+ inner~sep = \c_zero_dim ,
+ minimum~size = \c_zero_dim
+ }
+ \pgftransformshift { \pgfpoint { 0.5 * ( #2 + #4 ) } { 0.5 * ( #3 + #5 ) } }
+ \pgfnode
+ { rectangle }
+ { center }
+ {
+ \vbox_to_ht:nn
+ { \dim_abs:n { #5 - #3 } }
+ {
+ \vfill
+ \hbox_to_wd:nn { \dim_abs:n { #4 - #2 } } { }
+ }
+ }
+ { #1 }
+ { }
+ \end { pgfscope }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_pgf_rect_node:nnn| is a variant of |\@@_pgf_rect_node:nnnnn|:
+% it takes two \textsc{pgf} points as arguments instead of the four dimensions
+% which are the coordinates.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pgf_rect_node:nnn #1 #2 #3
+ {
+ \begin { pgfscope }
+ \pgfset
+ {
+ % outer~sep = \c_zero_dim ,
+ inner~sep = \c_zero_dim ,
+ minimum~size = \c_zero_dim
+ }
+ \pgftransformshift { \pgfpointscale { 0.5 } { \pgfpointadd { #2 } { #3 } } }
+ \pgfpointdiff { #3 } { #2 }
+ \pgfgetlastxy \l_tmpa_dim \l_tmpb_dim
+ \pgfnode
+ { rectangle }
+ { center }
+ {
+ \vbox_to_ht:nn
+ { \dim_abs:n \l_tmpb_dim }
+ { \vfill \hbox_to_wd:nn { \dim_abs:n \l_tmpa_dim } { } }
+ }
+ { #1 }
+ { }
+ \end { pgfscope }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The options}
+%
+% The following parameter corresponds to the keys |caption|, |short-caption| and
+% |label| of the environment |{NiceTabular}|.
+% \begin{macrocode}
+\tl_new:N \l_@@_caption_tl
+\tl_new:N \l_@@_short_caption_tl
+\tl_new:N \l_@@_label_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following parameter corresponds to the key |caption-above| of
+% |\NiceMatrixOptions|. When this paremeter is |true|, the captions of the
+% environments |{NiceTabular}|, specified with the key |caption| are put above
+% the tabular (and below elsewhere).
+% \begin{macrocode}
+\bool_new:N \l_@@_caption_above_bool
+% \end{macrocode}
+%
+% \bigskip
+% By default, the commands |\cellcolor| and |\rowcolor| are available for the
+% user in the cells of the tabular (the user may use the commands provided by
+% |\colortbl|). However, if the key |colortbl-like| is used, these
+% commands are available.
+% \begin{macrocode}
+\bool_new:N \l_@@_colortbl_like_bool
+% \end{macrocode}
+%
+% \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
+% |\arrayrulewidth|. It's possible to disable this feature with the key
+% |\l_@@_standard_line_bool|.
+% \begin{macrocode}
+\bool_new:N \l_@@_standard_cline_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following dimensions correspond to the options |cell-space-top-limit| and co
+% (these parameters are inspired by the package \pkg{cellspace}).
+% \begin{macrocode}
+\dim_new:N \l_@@_cell_space_top_limit_dim
+\dim_new:N \l_@@_cell_space_bottom_limit_dim
+% \end{macrocode}
+%
+% \bigskip
+% The following dimension is the distance between two dots for the dotted lines
+% (when |line-style| is equal to |standard|, which is the initial value). The
+% initial value is 0.45~em but it will be changed if the option |small| is used.
+% \begin{macrocode}
+\dim_new:N \l_@@_xdots_inter_dim
+\hook_gput_code:nnn { begindocument } { . }
+ { \dim_set:Nn \l_@@_xdots_inter_dim { 0.45 em } }
+% \end{macrocode}
+% We use a hook only by security in case \cls{revtex4-1}
+% is used (even though it is obsolete).
+%
+% \bigskip
+% The following dimension is the minimal distance between a node (in fact an
+% anchor of that node) and a dotted line (we say ``minimal'' because, by
+% definition, a dotted line is not a continuous line and, therefore, this
+% distance may vary a little).
+% \begin{macrocode}
+\dim_new:N \l_@@_xdots_shorten_start_dim
+\dim_new:N \l_@@_xdots_shorten_end_dim
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \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).
+%
+% \bigskip
+% The following dimension is the radius of the dots for the dotted lines (when
+% |line-style| is equal to |standard|, which is the initial value). The initial
+% value is 0.53~pt but it will be changed if the option |small| is used.
+% \begin{macrocode}
+\dim_new:N \l_@@_xdots_radius_dim
+\hook_gput_code:nnn { begindocument } { . }
+ { \dim_set:Nn \l_@@_xdots_radius_dim { 0.53 pt } }
+% \end{macrocode}
+% We use a hook only by security in case \cls{revtex4-1} is used (even though it
+% is obsolete).
+%
+%
+% \bigskip
+% The token list |\l_@@_xdots_line_style_tl| corresponds to the option |tikz| of the
+% commands |\Cdots|, |\Ldots|, etc. and of the options |line-style| for the
+% environments and |\NiceMatrixOptions|. The constant |\c_@@_standard_tl| will
+% be used in some tests.
+% \begin{macrocode}
+\tl_new:N \l_@@_xdots_line_style_tl
+\tl_const:Nn \c_@@_standard_tl { standard }
+\tl_set_eq:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl
+% \end{macrocode}
+%
+% \bigskip
+% The boolean |\l_@@_light_syntax_bool| corresponds to the option |light-syntax|.
+% \begin{macrocode}
+\bool_new:N \l_@@_light_syntax_bool
+% \end{macrocode}
+%
+% \bigskip
+% The string |\l_@@_baseline_tl| may contain one of the three values |t|,
+% |c| or |b| as in the option of the environment |{array}|. However, it may also
+% contain an integer (which represents the number of the row to which align the
+% array).
+% \begin{macrocode}
+\tl_new:N \l_@@_baseline_tl
+\tl_set:Nn \l_@@_baseline_tl c
+% \end{macrocode}
+%
+% \bigskip
+% The flag |\l_@@_exterior_arraycolsep_bool| corresponds to the option
+% |exterior-arraycolsep|. If this option is set, a space equal to |\arraycolsep|
+% will be put on both sides of an environment |{NiceArray}| (as it is done in
+% |{array}| of \pkg{array}).
+% \begin{macrocode}
+\bool_new:N \l_@@_exterior_arraycolsep_bool
+% \end{macrocode}
+%
+% \bigskip
+% The flag |\l_@@_parallelize_diags_bool| controls whether the diagonals are
+% parallelized. The initial value is~|true|.
+% \begin{macrocode}
+\bool_new:N \l_@@_parallelize_diags_bool
+\bool_set_true:N \l_@@_parallelize_diags_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following parameter correspond to the key |corners|. The elements of that
+% |clist| must be in |NW|, |SW|, |NE| and |SE|.
+% \begin{macrocode}
+\clist_new:N \l_@@_corners_clist
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\dim_new:N \l_@@_notes_above_space_dim
+\hook_gput_code:nnn { begindocument } { . }
+ { \dim_set:Nn \l_@@_notes_above_space_dim { 1 mm } }
+% \end{macrocode}
+% We use a hook only by security in case \cls{revtex4-1} is used (even though it
+% is obsolete).
+%
+% \bigskip
+% The flag |\l_@@_nullify_dots_bool| corresponds to the option |nullify-dots|.
+% When the flag is down, the instructions like |\vdots| are inserted within a
+% |\hphantom| (and so the constructed matrix has exactly the same size as a
+% matrix constructed with the classical |{matrix}| and |\ldots|, |\vdots|,
+% etc.).
+% \begin{macrocode}
+\bool_new:N \l_@@_nullify_dots_bool
+% \end{macrocode}
+%
+% \medskip
+% The following flag corresponds to the key |respect-arraystretch| (that key has
+% an effect on the blocks).
+% \begin{macrocode}
+\bool_new:N \l_@@_respect_arraystretch_bool
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following flag will be used when the current options specify that all the
+% columns of the array must have the same width equal to the largest width of a
+% cell of the array (except the cells of the potential exterior columns).
+% \begin{macrocode}
+\bool_new:N \l_@@_auto_columns_width_bool
+% \end{macrocode}
+%
+% \bigskip
+% The following boolean corresponds to the key |create-cell-nodes| of the
+% keyword |\CodeBefore|.
+% \begin{macrocode}
+\bool_new:N \g_@@_recreate_cell_nodes_bool
+% \end{macrocode}
+%
+% \bigskip
+% The string |\l_@@_name_str| will contain the optional name of the
+% environment: this name can be used to access to the Tikz nodes created in the
+% array from outside the environment.
+% \begin{macrocode}
+\str_new:N \l_@@_name_str
+% \end{macrocode}
+%
+% \bigskip
+% The boolean |\l_@@_medium_nodes_bool| will be used to indicate whether the
+% ``medium nodes'' are created in the array. Idem for the ``large nodes''.
+% \begin{macrocode}
+\bool_new:N \l_@@_medium_nodes_bool
+\bool_new:N \l_@@_large_nodes_bool
+% \end{macrocode}
+%
+% \bigskip
+% The boolean |\l_@@_except_borders_bool| will be raised when the key
+% |hvlines-except-borders| will be used (but that key has also other effects).
+% \begin{macrocode}
+\bool_new:N \l_@@_except_borders_bool
+% \end{macrocode}
+%
+%
+% \bigskip
+% The dimension |\l_@@_left_margin_dim| correspond to the option |left-margin|.
+% Idem for the right margin. These parameters are involved in the creation of
+% the ``medium nodes'' but also in the placement of the delimiters and the
+% drawing of the horizontal dotted lines (|\hdottedline|).
+% \begin{macrocode}
+\dim_new:N \l_@@_left_margin_dim
+\dim_new:N \l_@@_right_margin_dim
+% \end{macrocode}
+%
+%
+% \bigskip
+% The dimensions |\l_@@_extra_left_margin_dim| and
+% |\l_@@_extra_right_margin_dim| correspond to the options |extra-left-margin|
+% and |extra-right-margin|.
+% \begin{macrocode}
+\dim_new:N \l_@@_extra_left_margin_dim
+\dim_new:N \l_@@_extra_right_margin_dim
+% \end{macrocode}
+%
+% \medskip
+% The token list |\l_@@_end_of_row_tl| corresponds to the option |end-of-row|.
+% It specifies the symbol used to mark the ends of rows when the light syntax is
+% used.
+% \begin{macrocode}
+\tl_new:N \l_@@_end_of_row_tl
+\tl_set:Nn \l_@@_end_of_row_tl { ; }
+% \end{macrocode}
+%
+% \medskip
+% The following parameter is for the color the dotted lines drawn by |\Cdots|,
+% |\Ldots|, |\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor| but \emph{not} the
+% dotted lines drawn by |\hdottedline| and ``|:|''.
+% \begin{macrocode}
+\tl_new:N \l_@@_xdots_color_tl
+% \end{macrocode}
+%
+% \bigskip
+% The following token list corresponds to the key |delimiters/color|.
+% \begin{macrocode}
+\tl_new:N \l_@@_delimiters_color_tl
+% \end{macrocode}
+%
+%
+% \bigskip
+% Sometimes, we want to have several arrays vertically juxtaposed in order to
+% have an alignment of the columns of these arrays. To acheive this goal, one
+% may wish to use the same width for all the columns (for example with the
+% option |columns-width| or the option |auto-columns-width| of the environment
+% |{NiceMatrixBlock}|). However, even if we use the same type of delimiters, the
+% width of the delimiters may be different from an array to another because the
+% width of the delimiter is fonction of its size. That's why we create an option
+% called |delimiters/max-width| which will give to the delimiters the width of
+% a delimiter (of the same type) of big size. The following boolean corresponds
+% to this option.
+% \begin{macrocode}
+\bool_new:N \l_@@_delimiters_max_width_bool
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / xdots }
+ {
+ line-style .code:n =
+ {
+ \bool_lazy_or:nnTF
+ { \cs_if_exist_p:N \tikzpicture }
+ { \str_if_eq_p:nn { #1 } { standard } }
+ { \tl_set:Nn \l_@@_xdots_line_style_tl { #1 } }
+ { \@@_error:n { bad~option~for~line-style } }
+ } ,
+ line-style .value_required:n = true ,
+ color .tl_set:N = \l_@@_xdots_color_tl ,
+ color .value_required:n = true ,
+ shorten .code:n =
+ \hook_gput_code:nnn { begindocument } { . }
+ {
+ \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 } } ,
+ radius .value_required:n = true ,
+ inter .code:n =
+ \hook_gput_code:nnn { begindocument } { . }
+ { \dim_set:Nn \l_@@_xdots_inter_dim { #1 } } ,
+ radius .value_required:n = true ,
+% \end{macrocode}
+% The options |down| and |up| are not documented for the final user because he
+% should use the syntax with |^| and |_|.
+% \begin{macrocode}
+ down .tl_set:N = \l_@@_xdots_down_tl ,
+ up .tl_set:N = \l_@@_xdots_up_tl ,
+% \end{macrocode}
+% The key |draw-first|, which is meant to be used only with |\Ddots| and
+% |\Iddots|, which be catched when |\Ddots| or |\Iddots| is used (during the
+% construction of the array and not when we draw the dotted lines).
+% \begin{macrocode}
+ draw-first .code:n = \prg_do_nothing: ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~xdots }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / rules }
+ {
+ color .tl_set:N = \l_@@_rules_color_tl ,
+ color .value_required:n = true ,
+ width .dim_set:N = \arrayrulewidth ,
+ width .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~rules }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% First, we define a set of keys ``|NiceMatrix / Global|'' which will be used
+% (with the mechanism of |.inherit:n|) by other sets of keys.
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Global }
+ {
+ custom-line .code:n = \@@_custom_line:n { #1 } ,
+ rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } ,
+ rules .value_required:n = true ,
+ standard-cline .bool_set:N = \l_@@_standard_cline_bool ,
+ standard-cline .default:n = true ,
+ cell-space-top-limit .dim_set:N = \l_@@_cell_space_top_limit_dim ,
+ cell-space-top-limit .value_required:n = true ,
+ cell-space-bottom-limit .dim_set:N = \l_@@_cell_space_bottom_limit_dim ,
+ cell-space-bottom-limit .value_required:n = true ,
+ cell-space-limits .meta:n =
+ {
+ cell-space-top-limit = #1 ,
+ cell-space-bottom-limit = #1 ,
+ } ,
+ cell-space-limits .value_required:n = true ,
+ xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } ,
+ light-syntax .bool_set:N = \l_@@_light_syntax_bool ,
+ light-syntax .default:n = true ,
+ end-of-row .tl_set:N = \l_@@_end_of_row_tl ,
+ end-of-row .value_required:n = true ,
+ first-col .code:n = \int_zero:N \l_@@_first_col_int ,
+ first-row .code:n = \int_zero:N \l_@@_first_row_int ,
+ last-row .int_set:N = \l_@@_last_row_int ,
+ last-row .default:n = -1 ,
+ code-for-first-col .tl_set:N = \l_@@_code_for_first_col_tl ,
+ code-for-first-col .value_required:n = true ,
+ code-for-last-col .tl_set:N = \l_@@_code_for_last_col_tl ,
+ code-for-last-col .value_required:n = true ,
+ code-for-first-row .tl_set:N = \l_@@_code_for_first_row_tl ,
+ code-for-first-row .value_required:n = true ,
+ code-for-last-row .tl_set:N = \l_@@_code_for_last_row_tl ,
+ code-for-last-row .value_required:n = true ,
+ hlines .clist_set:N = \l_@@_hlines_clist ,
+ vlines .clist_set:N = \l_@@_vlines_clist ,
+ hlines .default:n = all ,
+ vlines .default:n = all ,
+ vlines-in-sub-matrix .code:n =
+ {
+ \tl_if_single_token:nTF { #1 }
+ { \tl_set:Nn \l_@@_letter_vlism_tl { #1 } }
+ { \@@_error:n { One~letter~allowed } }
+ } ,
+ vlines-in-sub-matrix .value_required:n = true ,
+ hvlines .code:n =
+ {
+ \bool_set_true:N \l_@@_hvlines_bool
+ \clist_set:Nn \l_@@_vlines_clist { all }
+ \clist_set:Nn \l_@@_hlines_clist { all }
+ } ,
+ hvlines-except-borders .code:n =
+ {
+ \clist_set:Nn \l_@@_vlines_clist { all }
+ \clist_set:Nn \l_@@_hlines_clist { all }
+ \bool_set_true:N \l_@@_hvlines_bool
+ \bool_set_true:N \l_@@_except_borders_bool
+ } ,
+ parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool ,
+% \end{macrocode}
+%
+% \bigskip
+% With the option |renew-dots|, the command |\cdots|, |\ldots|, |\vdots|,
+% |\ddots|, etc. are redefined and behave like the commands |\Cdots|, |\Ldots|,
+% |\Vdots|, |\Ddots|, etc.
+% \begin{macrocode}
+ renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
+ renew-dots .value_forbidden:n = true ,
+ nullify-dots .bool_set:N = \l_@@_nullify_dots_bool ,
+ create-medium-nodes .bool_set:N = \l_@@_medium_nodes_bool ,
+ create-large-nodes .bool_set:N = \l_@@_large_nodes_bool ,
+ create-extra-nodes .meta:n =
+ { create-medium-nodes , create-large-nodes } ,
+ left-margin .dim_set:N = \l_@@_left_margin_dim ,
+ left-margin .default:n = \arraycolsep ,
+ right-margin .dim_set:N = \l_@@_right_margin_dim ,
+ right-margin .default:n = \arraycolsep ,
+ margin .meta:n = { left-margin = #1 , right-margin = #1 } ,
+ margin .default:n = \arraycolsep ,
+ extra-left-margin .dim_set:N = \l_@@_extra_left_margin_dim ,
+ extra-right-margin .dim_set:N = \l_@@_extra_right_margin_dim ,
+ extra-margin .meta:n =
+ { extra-left-margin = #1 , extra-right-margin = #1 } ,
+ extra-margin .value_required:n = true ,
+ respect-arraystretch .bool_set:N = \l_@@_respect_arraystretch_bool ,
+ respect-arraystretch .default:n = true ,
+ pgf-node-code .tl_set:N = \l_@@_pgf_node_code_tl ,
+ pgf-node-code .value_required:n = true
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We define a set of keys used by the environments of \pkg{nicematrix} (but not
+% by the command |\NiceMatrixOptions|).
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Env }
+ {
+ corners .clist_set:N = \l_@@_corners_clist ,
+ corners .default:n = { NW , SW , NE , SE } ,
+ code-before .code:n =
+ {
+ \tl_if_empty:nF { #1 }
+ {
+ \tl_gput_left:Nn \g_@@_pre_code_before_tl { #1 }
+ \bool_set_true:N \l_@@_code_before_bool
+ }
+ } ,
+ code-before .value_required:n = true ,
+% \end{macrocode}
+% \bigskip
+% The options |c|, |t| and |b| of the environment |{NiceArray}| have the same
+% meaning as the option of the classical environment |{array}|.
+% \begin{macrocode}
+ c .code:n = \tl_set:Nn \l_@@_baseline_tl c ,
+ t .code:n = \tl_set:Nn \l_@@_baseline_tl t ,
+ b .code:n = \tl_set:Nn \l_@@_baseline_tl b ,
+ baseline .tl_set:N = \l_@@_baseline_tl ,
+ baseline .value_required:n = true ,
+ columns-width .code:n =
+ \tl_if_eq:nnTF { #1 } { auto }
+ { \bool_set_true:N \l_@@_auto_columns_width_bool }
+ { \dim_set:Nn \l_@@_columns_width_dim { #1 } } ,
+ columns-width .value_required:n = true ,
+ name .code:n =
+% \end{macrocode}
+% We test whether we are in the measuring phase of an environment of
+% \pkg{amsmath} (always loaded by \pkg{nicematrix}) because we want to avoid a
+% fallacious message of duplicate name in this case.
+% \begin{macrocode}
+ \legacy_if:nF { measuring@ }
+ {
+ \str_set:Nn \l_tmpa_str { #1 }
+ \seq_if_in:NVTF \g_@@_names_seq \l_tmpa_str
+ { \@@_error:nn { Duplicate~name } { #1 } }
+ { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str }
+ \str_set_eq:NN \l_@@_name_str \l_tmpa_str
+ } ,
+ name .value_required:n = true ,
+ code-after .tl_gset:N = \g_nicematrix_code_after_tl ,
+ code-after .value_required:n = true ,
+ colortbl-like .code:n =
+ \bool_set_true:N \l_@@_colortbl_like_bool
+ \bool_set_true:N \l_@@_code_before_bool ,
+ colortbl-like .value_forbidden:n = true
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / notes }
+ {
+ para .bool_set:N = \l_@@_notes_para_bool ,
+ para .default:n = true ,
+ code-before .tl_set:N = \l_@@_notes_code_before_tl ,
+ code-before .value_required:n = true ,
+ code-after .tl_set:N = \l_@@_notes_code_after_tl ,
+ code-after .value_required:n = true ,
+ bottomrule .bool_set:N = \l_@@_notes_bottomrule_bool ,
+ bottomrule .default:n = true ,
+ style .code:n = \cs_set:Nn \@@_notes_style:n { #1 } ,
+ style .value_required:n = true ,
+ label-in-tabular .code:n =
+ \cs_set:Nn \@@_notes_label_in_tabular:n { #1 } ,
+ label-in-tabular .value_required:n = true ,
+ label-in-list .code:n =
+ \cs_set:Nn \@@_notes_label_in_list:n { #1 } ,
+ label-in-list .value_required:n = true ,
+ enumitem-keys .code:n =
+ {
+ \hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { enumitem }
+ { \setlist* [ tabularnotes ] { #1 } }
+ { }
+ }
+ } ,
+ enumitem-keys .value_required:n = true ,
+ enumitem-keys-para .code:n =
+ {
+ \hook_gput_code:nnn { begindocument } { . }
+ {
+ \IfPackageLoadedTF { enumitem }
+ { \setlist* [ tabularnotes* ] { #1 } }
+ { }
+ }
+ } ,
+ 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}
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / delimiters }
+ {
+ max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
+ max-width .default:n = true ,
+ color .tl_set:N = \l_@@_delimiters_color_tl ,
+ color .value_required:n = true ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We begin the construction of the major sets of keys (used by the different
+% user commands and environments).
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix }
+ {
+ NiceMatrixOptions .inherit:n =
+ { NiceMatrix / Global } ,
+ NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules ,
+ NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes ,
+ NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ SubMatrix / rules .inherit:n = NiceMatrix / rules ,
+ CodeAfter / xdots .inherit:n = NiceMatrix / xdots ,
+ CodeBefore / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ NiceMatrix .inherit:n =
+ {
+ NiceMatrix / Global ,
+ NiceMatrix / Env ,
+ } ,
+ NiceMatrix / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceMatrix / rules .inherit:n = NiceMatrix / rules ,
+ NiceTabular .inherit:n =
+ {
+ NiceMatrix / Global ,
+ NiceMatrix / Env
+ } ,
+ NiceTabular / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceTabular / rules .inherit:n = NiceMatrix / rules ,
+ NiceTabular / notes .inherit:n = NiceMatrix / notes ,
+ NiceArray .inherit:n =
+ {
+ NiceMatrix / Global ,
+ NiceMatrix / Env ,
+ } ,
+ NiceArray / xdots .inherit:n = NiceMatrix / xdots ,
+ NiceArray / rules .inherit:n = NiceMatrix / rules ,
+ pNiceArray .inherit:n =
+ {
+ NiceMatrix / Global ,
+ NiceMatrix / Env ,
+ } ,
+ pNiceArray / xdots .inherit:n = NiceMatrix / xdots ,
+ pNiceArray / rules .inherit:n = NiceMatrix / rules ,
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We finalise the definition of the set of keys
+% ``|NiceMatrix / NiceMatrixOptions|'' with the options specific to
+% |\NiceMatrixOptions|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceMatrixOptions }
+ {
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
+ delimiters / max-width .default:n = true ,
+ delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
+ delimiters .value_required:n = true ,
+ width .code:n = \dim_set:Nn \l_@@_width_dim { #1 } ,
+ width .value_required:n = true ,
+ last-col .code:n =
+ \tl_if_empty:nF { #1 }
+ { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } }
+ \int_zero:N \l_@@_last_col_int ,
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
+% \end{macrocode}
+%
+% With the option |renew-matrix|, the environment |{matrix}| of \pkg{amsmath}
+% and its variants are redefined to behave like the environment |{NiceMatrix}|
+% and its variants.
+% \begin{macrocode}
+ renew-matrix .code:n = \@@_renew_matrix: ,
+ renew-matrix .value_forbidden:n = true ,
+% \end{macrocode}
+%
+% \bigskip
+% The option |exterior-arraycolsep| will have effect only in |{NiceArray}| for
+% those who want to have for |{NiceArray}| the same behaviour as |{array}|.
+% \begin{macrocode}
+ exterior-arraycolsep .bool_set:N = \l_@@_exterior_arraycolsep_bool ,
+% \end{macrocode}
+%
+% \bigskip
+% If the option |columns-width| is used, all the columns will have the same
+% width.
+%
+% In |\NiceMatrixOptions|, the special value |auto| is not available.
+% \begin{macrocode}
+ columns-width .code:n =
+ \tl_if_eq:nnTF { #1 } { auto }
+ { \@@_error:n { Option~auto~for~columns-width } }
+ { \dim_set:Nn \l_@@_columns_width_dim { #1 } } ,
+% \end{macrocode}
+%
+% \bigskip
+% Usually, an error is raised when the user tries to give the same name to two
+% distincts environments of \pkg{nicematrix} (these names are global and not
+% local to the current TeX scope). However, the option |allow-duplicate-names|
+% disables this feature.
+% \begin{macrocode}
+ allow-duplicate-names .code:n =
+ \@@_msg_redirect_name:nn { Duplicate~name } { none } ,
+ allow-duplicate-names .value_forbidden:n = true ,
+ notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
+ notes .value_required:n = true ,
+ sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
+ sub-matrix .value_required:n = true ,
+ matrix / columns-type .code:n =
+ \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 },
+ matrix / columns-type .value_required:n = true ,
+ caption-above .bool_set:N = \l_@@_caption_above_bool ,
+ caption-above .default:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrixOptions }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% |\NiceMatrixOptions| is the command of the \pkg{nicematrix} package to fix
+% options at the document level. The scope of these specifications is the
+% current TeX group.
+% \begin{macrocode}
+\NewDocumentCommand \NiceMatrixOptions { m }
+ { \keys_set:nn { NiceMatrix / NiceMatrixOptions } { #1 } }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We finalise the definition of the set of keys ``|NiceMatrix / NiceMatrix|''.
+% That set of keys will be used by |{NiceMatrix}|, |{pNiceMatrix}|,
+% |{bNiceMatrix}|, etc.
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceMatrix }
+ {
+ last-col .code:n = \tl_if_empty:nTF {#1}
+ {
+ \bool_set_true:N \l_@@_last_col_without_value_bool
+ \int_set:Nn \l_@@_last_col_int { -1 }
+ }
+ { \int_set:Nn \l_@@_last_col_int { #1 } } ,
+ columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } ,
+ columns-type .value_required:n = true ,
+ l .meta:n = { columns-type = l } ,
+ r .meta:n = { columns-type = r } ,
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
+ delimiters / max-width .default:n = true ,
+ delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
+ delimiters .value_required:n = true ,
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrix }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% We finalise the definition of the set of keys ``|NiceMatrix / NiceArray|''
+% with the options specific to |{NiceArray}|.
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceArray }
+ {
+% \end{macrocode}
+%
+% In the environments |{NiceArray}| and its variants, the option |last-col| must
+% be used without value because the number of columns of the array is read
+% from the preamble of the array.
+% \begin{macrocode}
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
+ last-col .code:n = \tl_if_empty:nF { #1 }
+ { \@@_error:n { last-col~non~empty~for~NiceArray } }
+ \int_zero:N \l_@@_last_col_int ,
+ r .code:n = \@@_error:n { r~or~l~with~preamble } ,
+ l .code:n = \@@_error:n { r~or~l~with~preamble } ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~NiceArray }
+ }
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / pNiceArray }
+ {
+ first-col .code:n = \int_zero:N \l_@@_first_col_int ,
+ last-col .code:n = \tl_if_empty:nF {#1}
+ { \@@_error:n { last-col~non~empty~for~NiceArray } }
+ \int_zero:N \l_@@_last_col_int ,
+ first-row .code:n = \int_zero:N \l_@@_first_row_int ,
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
+ delimiters / max-width .default:n = true ,
+ delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
+ delimiters .value_required:n = true ,
+ small .bool_set:N = \l_@@_small_bool ,
+ small .value_forbidden:n = true ,
+ r .code:n = \@@_error:n { r~or~l~with~preamble } ,
+ l .code:n = \@@_error:n { r~or~l~with~preamble } ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrix }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We finalise the definition of the set of keys ``|NiceMatrix / NiceTabular|''
+% with the options specific to |{NiceTabular}|.
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceTabular }
+ {
+% \end{macrocode}
+% The dimension |width| will be used if at least a column of type |X| is used.
+% If there is no column of type |X|, an error will be raised.
+% \begin{macrocode}
+ width .code:n = \dim_set:Nn \l_@@_width_dim { #1 }
+ \bool_set_true:N \l_@@_width_used_bool ,
+ width .value_required:n = true ,
+ rounded-corners .dim_set:N = \l_@@_tab_rounded_corners_dim ,
+ rounded-corners .default:n = 4 pt ,
+ notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
+ tabularnote .tl_gset:N = \g_@@_tabularnote_tl ,
+ tabularnote .value_required:n = true ,
+ caption .tl_set:N = \l_@@_caption_tl ,
+ caption .value_required:n = true ,
+ short-caption .tl_set:N = \l_@@_short_caption_tl ,
+ short-caption .value_required:n = true ,
+ label .tl_set:N = \l_@@_label_tl ,
+ label .value_required:n = true ,
+ last-col .code:n = \tl_if_empty:nF {#1}
+ { \@@_error:n { last-col~non~empty~for~NiceArray } }
+ \int_zero:N \l_@@_last_col_int ,
+ r .code:n = \@@_error:n { r~or~l~with~preamble } ,
+ l .code:n = \@@_error:n { r~or~l~with~preamble } ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~NiceTabular }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{Important code used by \{NiceArrayWithDelims\} }
+%
+% The pseudo-environment |\@@_cell_begin:w|--|\@@_cell_end:| will be used to format the
+% cells of the array. In the code, the affectations are global because this
+% pseudo-environment will be used in the cells of a |\halign| (via an
+% environment |{array}|).
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cell_begin:w
+ {
+% \end{macrocode}
+% |\g_@@_cell_after_hook_tl| will be set during the composition of the box
+% |\l_@@_cell_box| and will be used \emph{after} the composition in order to
+% modify that box.
+% \begin{macrocode}
+ \tl_gclear:N \g_@@_cell_after_hook_tl
+% \end{macrocode}
+% At the beginning of the cell, we link |\CodeAfter| to a command which do
+% begin with |\\| (whereas the standard version of |\CodeAfter| does
+% not).
+% \begin{macrocode}
+ \cs_set_eq:NN \CodeAfter \@@_CodeAfter_i:
+% \end{macrocode}
+% We increment |\c at jCol|, which is the counter of the columns.
+% \begin{macrocode}
+ \int_gincr:N \c at jCol
+% \end{macrocode}
+% Now, we increment the counter of the rows. We don't do this incrementation in
+% the |\everycr| because some packages, like \pkg{arydshln}, create special rows
+% in the |\halign| that we don't want to take into account.
+% \begin{macrocode}
+ \int_compare:nNnT \c at jCol = 1
+ { \int_compare:nNnT \l_@@_first_col_int = 1 \@@_begin_of_row: }
+% \end{macrocode}
+% The content of the cell is composed in the box |\l_@@_cell_box|. The
+% |\hbox_set_end:| corresponding to this |\hbox_set:Nw| will be in the
+% |\@@_cell_end:| (and the potential |\c_math_toggle_token| also).
+% \begin{macrocode}
+ \hbox_set:Nw \l_@@_cell_box
+ \bool_if:NF \l_@@_NiceTabular_bool
+ {
+ \c_math_toggle_token
+ \bool_if:NT \l_@@_small_bool \scriptstyle
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \g_@@_row_style_tl
+% \end{macrocode}
+%
+% We will call \emph{corners} of the matrix the cases which are at the
+% intersection of the exterior rows and exterior columns (of course, the four
+% corners doesn't always exist simultaneously).
+%
+% The codes |\l_@@_code_for_first_row_tl| and \emph{al} don't apply in the
+% corners of the matrix.
+% \begin{macrocode}
+ \int_compare:nNnTF \c at iRow = 0
+ {
+ \int_compare:nNnT \c at jCol > 0
+ {
+ \l_@@_code_for_first_row_tl
+ \xglobal \colorlet { nicematrix-first-row } { . }
+ }
+ }
+ {
+ \int_compare:nNnT \c at iRow = \l_@@_last_row_int
+ {
+ \l_@@_code_for_last_row_tl
+ \xglobal \colorlet { nicematrix-last-row } { . }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \interitem
+% The following macro |\@@_begin_of_row| is usually used in the cell
+% number~$1$ of the row. However, when the key |first-col| is used,
+% |\@@_begin_of_row| is executed in the cell number~$0$ of the row.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_begin_of_row:
+ {
+ \int_gincr:N \c at iRow
+ \dim_gset_eq:NN \g_@@_dp_ante_last_row_dim \g_@@_dp_last_row_dim
+ \dim_gset:Nn \g_@@_dp_last_row_dim { \box_dp:N \@arstrutbox }
+ \dim_gset:Nn \g_@@_ht_last_row_dim { \box_ht:N \@arstrutbox }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate
+ { \@@_env: - row - \int_use:N \c at iRow - base }
+ { \pgfpoint \c_zero_dim { 0.5 \arrayrulewidth } }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - row - \int_use:N \c at iRow - base }
+ { \@@_env: - row - \int_use:N \c at iRow - base }
+ }
+ \endpgfpicture
+ }
+% \end{macrocode}
+% Remark: If the key |recreate-cell-nodes| of the |\CodeBefore| is used, then we
+% will add some lines to that command.
+%
+%
+% \interitem
+% The following code is used in each cell of the array. It actualises quantities
+% that, at the end of the array, will give informations about the vertical
+% dimension of the two first rows and the two last rows. If the user uses the
+% |last-row|, some lines of code will be dynamically added to this command.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_update_for_first_and_last_row:
+ {
+ \int_compare:nNnTF \c at iRow = 0
+ {
+ \dim_gset:Nn \g_@@_dp_row_zero_dim
+ { \dim_max:nn \g_@@_dp_row_zero_dim { \box_dp:N \l_@@_cell_box } }
+ \dim_gset:Nn \g_@@_ht_row_zero_dim
+ { \dim_max:nn \g_@@_ht_row_zero_dim { \box_ht:N \l_@@_cell_box } }
+ }
+ {
+ \int_compare:nNnT \c at iRow = 1
+ {
+ \dim_gset:Nn \g_@@_ht_row_one_dim
+ { \dim_max:nn \g_@@_ht_row_one_dim { \box_ht:N \l_@@_cell_box } }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rotate_cell_box:
+ {
+ \box_rotate:Nn \l_@@_cell_box { 90 }
+ \int_compare:nNnT \c at iRow = \l_@@_last_row_int
+ {
+ \vbox_set_top:Nn \l_@@_cell_box
+ {
+ \vbox_to_zero:n { }
+ \skip_vertical:n { - \box_ht:N \@arstrutbox + 0.8 ex }
+ \box_use:N \l_@@_cell_box
+ }
+ }
+ \bool_gset_false:N \g_@@_rotate_bool
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_adjust_size_box:
+ {
+ \dim_compare:nNnT \g_@@_blocks_wd_dim > \c_zero_dim
+ {
+ \box_set_wd:Nn \l_@@_cell_box
+ { \dim_max:nn { \box_wd:N \l_@@_cell_box } \g_@@_blocks_wd_dim }
+ \dim_gzero:N \g_@@_blocks_wd_dim
+ }
+ \dim_compare:nNnT \g_@@_blocks_dp_dim > \c_zero_dim
+ {
+ \box_set_dp:Nn \l_@@_cell_box
+ { \dim_max:nn { \box_dp:N \l_@@_cell_box } \g_@@_blocks_dp_dim }
+ \dim_gzero:N \g_@@_blocks_dp_dim
+ }
+ \dim_compare:nNnT \g_@@_blocks_ht_dim > \c_zero_dim
+ {
+ \box_set_ht:Nn \l_@@_cell_box
+ { \dim_max:nn { \box_ht:N \l_@@_cell_box } \g_@@_blocks_ht_dim }
+ \dim_gzero:N \g_@@_blocks_ht_dim
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cell_end:
+ {
+ \@@_math_toggle_token:
+ \hbox_set_end:
+ \@@_cell_end_i:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cell_end_i:
+ {
+% \end{macrocode}
+% The token list |\g_@@_cell_after_hook_tl| is (potentially) set during the
+% composition of the box |\l_@@_cell_box| and is used now \emph{after} the
+% composition in order to modify that box.
+% \begin{macrocode}
+ \g_@@_cell_after_hook_tl
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \box_set_ht:Nn \l_@@_cell_box
+ { \box_ht:N \l_@@_cell_box + \l_@@_cell_space_top_limit_dim }
+ \box_set_dp:Nn \l_@@_cell_box
+ { \box_dp:N \l_@@_cell_box + \l_@@_cell_space_bottom_limit_dim }
+% \end{macrocode}
+%
+% We want to compute in |\g_@@_max_cell_width_dim| the width of the widest cell
+% of the array (except the cells of the ``first column'' and the ``last
+% column'').
+% \begin{macrocode}
+ \dim_gset:Nn \g_@@_max_cell_width_dim
+ { \dim_max:nn \g_@@_max_cell_width_dim { \box_wd:N \l_@@_cell_box } }
+% \end{macrocode}
+%
+% The following computations are for the ``first row'' and the ``last row''.
+% \begin{macrocode}
+ \@@_update_for_first_and_last_row:
+% \end{macrocode}
+%
+% \medskip
+% If the cell is empty, or may be considered as if, we must not create the
+% \textsc{pgf} node, for two reasons:
+% \begin{itemize}
+% \item it's a waste of time since such a node would be rather pointless;
+% \item we test the existence of these nodes in order to determine whether a
+% cell is empty when we search the extremities of a dotted line.
+% \end{itemize}
+% However, it's very difficult to determine whether a cell is empty. Up to now
+% we use the following technic:
+% \begin{itemize}
+% \item for the columns of type |p|, |m|, |b|, |V| (of \pkg{varwidth}) or |X|,
+% we test whether the cell is syntactically empty with |\@@_test_if_empty:| and
+% |\@@_test_if_empty_for_S:|
+% \item if the width of the box |\l_@@_cell_box| (created with the content of
+% the cell) is equal to zero, we consider the cell as empty (however,
+% this is not perfect since the user may have used a |\rlap|, |\llap|, |\clap|
+% or a |\mathclap| of \pkg{mathtools}).
+% \item the cells with a command |\Ldots| or |\Cdots|, |\Vdots|, etc.,
+% should also be considered as empty; if |nullify-dots| is in force, there would
+% be nothing to do (in this case the previous commands only write an instruction
+% in a kind of |\CodeAfter|); however, if |nullify-dots| is not in force, a
+% phantom of |\ldots|, |\cdots|, |\vdots| is inserted and its width is not equal
+% to zero; that's why these commands raise a boolean |\g_@@_empty_cell_bool| and
+% we begin by testing this boolean.
+% \end{itemize}
+% \begin{macrocode}
+ \bool_if:NTF \g_@@_empty_cell_bool
+ { \box_use_drop:N \l_@@_cell_box }
+ {
+ \bool_lazy_or:nnTF
+ \g_@@_not_empty_cell_bool
+ { \dim_compare_p:nNn { \box_wd:N \l_@@_cell_box } > \c_zero_dim }
+ \@@_node_for_cell:
+ { \box_use_drop:N \l_@@_cell_box }
+ }
+ \int_gset:Nn \g_@@_col_total_int { \int_max:nn \g_@@_col_total_int \c at jCol }
+ \bool_gset_false:N \g_@@_empty_cell_bool
+ \bool_gset_false:N \g_@@_not_empty_cell_bool
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following variant of |\@@_cell_end:| is only for the columns of type
+% |w{s}{...}| or |W{s}{...}| (which use the horizontal alignement key |s| of
+% |\makebox|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cell_end_for_w_s:
+ {
+ \@@_math_toggle_token:
+ \hbox_set_end:
+ \bool_if:NF \g_@@_rotate_bool
+ {
+ \hbox_set:Nn \l_@@_cell_box
+ {
+ \makebox [ \l_@@_col_width_dim ] [ s ]
+ { \hbox_unpack_drop:N \l_@@_cell_box }
+ }
+ }
+ \@@_cell_end_i:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command creates the \textsc{pgf} name of the node with, of
+% course, |\l_@@_cell_box| as the content.
+% \begin{macrocode}
+\pgfset
+ {
+ nicematrix / cell-node /.style =
+ {
+ inner~sep = \c_zero_dim ,
+ minimum~width = \c_zero_dim
+ }
+ }
+\cs_new_protected:Npn \@@_node_for_cell:
+ {
+ \pgfpicture
+ \pgfsetbaseline \c_zero_dim
+ \pgfrememberpicturepositiononpagetrue
+ \pgfset { nicematrix / cell-node }
+ \pgfnode
+ { rectangle }
+ { base }
+ {
+% \end{macrocode}
+% The following instruction |\set at color| has been added on 2022/10/06. It's
+% necessary only with XeLaTeX and not with the other engines (we don't know why).
+% \begin{macrocode}
+ \set at color
+ \box_use_drop:N \l_@@_cell_box
+ }
+ { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol }
+ { \l_@@_pgf_node_code_tl }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - \int_use:N \c at iRow - \int_use:N \c at jCol }
+ { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol }
+ }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \medskip
+% As its name says, the following command is a patch for the command
+% |\@@_node_for_cell:|. This patch will be appended on the left of
+% |\@@_node_for_the_cell:| when the construction of the cell nodes (of the form
+% |(i-j)|) in the |\CodeBefore| is required.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_node_for_cell:n #1
+ {
+ \cs_new_protected:Npn \@@_patch_node_for_cell:
+ {
+ \hbox_set:Nn \l_@@_cell_box
+ {
+ \box_move_up:nn { \box_ht:N \l_@@_cell_box}
+ \hbox_overlap_left:n
+ {
+ \pgfsys at markposition
+ { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol - NW }
+% \end{macrocode}
+% I don't know why the following adjustement is needed when the compilation is
+% done with XeLaTeX or with the classical way |latex|, |divps|, |ps2pdf| (or
+% Adobe Distiller). However, it seems to work.
+% \begin{macrocode}
+ #1
+ }
+ \box_use:N \l_@@_cell_box
+ \box_move_down:nn { \box_dp:N \l_@@_cell_box }
+ \hbox_overlap_left:n
+ {
+ \pgfsys at markposition
+ { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol - SE }
+ #1
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We have no explanation for the different behaviour between the TeX engines...
+% \begin{macrocode}
+\bool_lazy_or:nnTF \sys_if_engine_xetex_p: \sys_if_output_dvi_p:
+ {
+ \@@_patch_node_for_cell:n
+ { \skip_horizontal:n { 0.5 \box_wd:N \l_@@_cell_box } }
+ }
+ { \@@_patch_node_for_cell:n { } }
+% \end{macrocode}
+%
+%
+% \interitem
+% The second argument of the following command |\@@_instruction_of_type:nnn|
+% defined below is the type of the instruction (|Cdots|, |Vdots|, |Ddots|,
+% etc.). The third argument is the list of options. This command writes in the
+% corresponding |\g_@@_|\textsl{type}|_lines_tl| the instruction which will
+% actually draw the line after the construction of the matrix.
+%
+% \medskip
+% For example, for the following matrix,
+%
+% \smallskip
+% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
+% \begin{pNiceMatrix}
+% 1 & 2 & 3 & 4 \\
+% 5 & \Cdots & & 6 \\
+% 7 & \Cdots[color=red]
+% \end{pNiceMatrix}
+% \end{BVerbatim}
+% $\begin{pNiceMatrix}
+% 1 & 2 & 3 & 4 \\
+% 5 & \Cdots & & 6 \\
+% 7 & \Cdots[color=red]
+% \end{pNiceMatrix}$
+%
+% \smallskip
+% the content of |\g_@@_Cdots_lines_tl| will be:
+%
+% \smallskip
+% \begin{scope}
+% \color{gray}
+% |\@@_draw_Cdots:nnn {2}{2}{}|
+%
+% |\@@_draw_Cdots:nnn {3}{2}{color=red}|
+% \end{scope}
+%
+%
+% \bigskip
+% The first argument is a boolean which indicates whether you must put the
+% instruction on the left or on the right on the list of instructions.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_instruction_of_type:nnn #1 #2 #3
+ {
+ \bool_if:nTF { #1 } \tl_gput_left:cx \tl_gput_right:cx
+ { g_@@_ #2 _ lines _ tl }
+ {
+ \use:c { @@ _ draw _ #2 : nnn }
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { \exp_not:n { #3 } }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_array:n
+ {
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ { \dim_set_eq:NN \col at sep \tabcolsep }
+ { \dim_set_eq:NN \col at sep \arraycolsep }
+ \dim_compare:nNnTF \l_@@_tabular_width_dim = \c_zero_dim
+ { \cs_set_nopar:Npn \@halignto { } }
+ { \cs_set_nopar:Npx \@halignto { to \dim_use:N \l_@@_tabular_width_dim } }
+% \end{macrocode}
+% It \pkg{colortbl} is loaded, |\@tabarray| has been redefined to incorporate
+% |\CT at start|.
+% \begin{macrocode}
+ \@tabarray
+% \end{macrocode}
+% |\l_@@_baseline_tl| may have the value |t|, |c| or |b|. However, if the value
+% is |b|, we compose the |\array| (of \pkg{array}) with the option |t| and the
+% right translation will be done further. Remark that |\str_if_eq:VnTF| is
+% fully expandable and you need something fully expandable here.
+% \begin{macrocode}
+ [ \str_if_eq:VnTF \l_@@_baseline_tl c c t ]
+ }
+\cs_generate_variant:Nn \@@_array:n { V }
+% \end{macrocode}
+%
+% \medskip
+% We keep in memory the standard version of |\ialign| because we will redefine
+% |\ialign| in the environment |{NiceArrayWithDelims}| but restore the standard
+% version for use in the cells of the array.
+% \begin{macrocode}
+\cs_set_eq:NN \@@_old_ialign: \ialign
+% \end{macrocode}
+%
+%
+% The following command creates a |row| node (and not a row of nodes!).
+% \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
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \vtop
+ {
+ \skip_vertical:N 0.5\arrayrulewidth
+ \pgfsys at markposition
+ { \@@_env: - row - \int_eval:n { \c at iRow + 1 } }
+ \skip_vertical:N -0.5\arrayrulewidth
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - row - \int_eval:n { \c at iRow + 1 } }
+ { \pgfpoint \c_zero_dim { - 0.5 \arrayrulewidth } }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - row - \int_eval:n { \c at iRow + 1 } }
+ { \@@_env: - row - \int_eval:n { \c at iRow + 1 } }
+ }
+ \endpgfpicture
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following must \emph{not} be protected because it begins with |\noalign|.
+% \begin{macrocode}
+\cs_new:Npn \@@_everycr: { \noalign { \@@_everycr_i: } }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_everycr_i:
+ {
+ \int_gzero:N \c at jCol
+ \bool_gset_false:N \g_@@_after_col_zero_bool
+ \bool_if:NF \g_@@_row_of_col_done_bool
+ {
+ \@@_create_row_node:
+% \end{macrocode}
+% We don't draw now the rules of the key |hlines| (or |hvlines|) but we reserve the
+% vertical space for theses rules (the rules will be drawn by \textsc{pgf}).
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_hlines_clist
+ {
+ \tl_if_eq:NnF \l_@@_hlines_clist { all }
+ {
+ \exp_args:NNx
+ \clist_if_in:NnT
+ \l_@@_hlines_clist
+ { \int_eval:n { \c at iRow + 1 } }
+ }
+ {
+% \end{macrocode}
+% The counter |\c at iRow| has the value $-1$ only if there is a ``first
+% row'' and that we are before that ``first row'', i.e. just before the
+% beginning of the array.
+% \begin{macrocode}
+ \int_compare:nNnT \c at iRow > { -1 }
+ {
+ \int_compare:nNnF \c at iRow = \l_@@_last_row_int
+% \end{macrocode}
+% The command |\CT at arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if
+% \pkg{colortbl} is not loaded. We use a TeX group in order to limit the scope
+% of |\CT at arc@|.
+% \begin{macrocode}
+ { \hrule height \arrayrulewidth width \c_zero_dim }
+ }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_newcolumntype| is the command |\newcolumntype| of
+% \pkg{array} without the warnings for redefinitions of columns types (we will
+% use it to redefine the columns types |w| and |W|).
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_newcolumntype #1
+ {
+ \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
+ \peek_meaning:NTF [
+ { \newcol@ #1 }
+ { \newcol@ #1 [ 0 ] }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% When the key |renew-dots| is used, the following code will be executed.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_renew_dots:
+ {
+ \cs_set_eq:NN \ldots \@@_Ldots
+ \cs_set_eq:NN \cdots \@@_Cdots
+ \cs_set_eq:NN \vdots \@@_Vdots
+ \cs_set_eq:NN \ddots \@@_Ddots
+ \cs_set_eq:NN \iddots \@@_Iddots
+ \cs_set_eq:NN \dots \@@_Ldots
+ \cs_set_eq:NN \hdotsfor \@@_Hdotsfor:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% When the key |colortbl-like| is used, the following code will be executed.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_colortbl_like:
+ {
+ \cs_set_eq:NN \cellcolor \@@_cellcolor_tabular
+ \cs_set_eq:NN \rowcolor \@@_rowcolor_tabular
+ \cs_set_eq:NN \columncolor \@@_columncolor_preamble
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following code |\@@_pre_array_ii:| is used in |{NiceArrayWithDelims}|. It
+% exists as a standalone macro only for legibility.
+% \label{prearray}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pre_array_ii:
+ {
+% \end{macrocode}
+% The number of letters |X| in the preamble of the array.
+% \begin{macrocode}
+ \int_gzero:N \g_@@_total_X_weight_int
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_expand_clist:N \l_@@_hlines_clist
+ \@@_expand_clist:N \l_@@_vlines_clist
+% \end{macrocode}
+%
+% If \pkg{booktabs} is loaded, we have to patch the macro |\@BTnormal| which is
+% a macro of \pkg{booktabs}. The macro |\@BTnormal| draws an horizontal rule but
+% it occurs after a vertical skip done by a low level TeX command. When this
+% macro |\@BTnormal| occurs, the |row| node has yet been inserted by
+% \pkg{nicematrix} \emph{before} the vertical skip (and thus, at a wrong place).
+% That why we decide to create a new |row| node (for the same row). We patch the
+% macro |\@BTnormal| to create this |row| node. This new |row| node will
+% overwrite the previous definition of that |row| node and we have managed to
+% avoid the error messages of that redefinition
+% \footnote{cf. |\nicematrix at redefine@check at rerun|}.
+% \begin{macrocode}
+ \IfPackageLoadedTF { booktabs }
+ { \tl_put_left:Nn \@BTnormal \@@_create_row_node_i: }
+ { }
+ \box_clear_new:N \l_@@_cell_box
+ \normalbaselines
+% \end{macrocode}
+% If the option |small| is used, we have to do some tuning. In particular, we
+% change the value of |\arraystretch| (this parameter is used in the
+% construction of |\@arstrutbox| in the beginning of |{array}|).
+% \begin{macrocode}
+ \bool_if:NT \l_@@_small_bool
+ {
+% \end{macrocode}
+% \begin{macrocode}
+ \cs_set_nopar:Npn \arraystretch { 0.47 }
+ \dim_set:Nn \arraycolsep { 1.45 pt }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \bool_if:NT \g_@@_recreate_cell_nodes_bool
+ {
+ \tl_put_right:Nn \@@_begin_of_row:
+ {
+ \pgfsys at markposition
+ { \@@_env: - row - \int_use:N \c at iRow - base }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The environment |{array}| uses internally the command |\ialign|. We change the
+% definition of |\ialign| for several reasons. In particular, |\ialign| sets
+% |\everycr| to |{ }| and we \emph{need} to have to change the value of
+% |\everycr|.
+% \begin{macrocode}
+ \cs_set_nopar:Npn \ialign
+ {
+ \IfPackageLoadedTF { colortbl }
+ {
+ \CT at everycr
+ {
+ \noalign { \cs_gset_eq:NN \CT at row@color \prg_do_nothing: }
+ \@@_everycr:
+ }
+ }
+ { \everycr { \@@_everycr: } }
+ \tabskip = \c_zero_skip
+% \end{macrocode}
+%
+% The box |\@arstrutbox| is a box constructed in the beginning of the
+% environment |{array}|. The construction of that box takes into account the
+% current value of |\arraystretch|\footnote{The option |small| of
+% \pkg{nicematrix} changes (among others) the value of |\arraystretch|. This is
+% done, of course, before the call of |{array}|.} and |\extrarowheight| (of
+% \pkg{array}). That box is inserted (via |\@arstrut|) in the beginning of each
+% row of the array. That's why we use the dimensions of that box to initialize
+% the variables which will be the dimensions of the potential first and last row
+% of the environment. This initialization must be done after the creation of
+% |\@arstrutbox| and that's why we do it in the |\ialign|.
+% \begin{macrocode}
+ \dim_gzero_new:N \g_@@_dp_row_zero_dim
+ \dim_gset:Nn \g_@@_dp_row_zero_dim { \box_dp:N \@arstrutbox }
+ \dim_gzero_new:N \g_@@_ht_row_zero_dim
+ \dim_gset:Nn \g_@@_ht_row_zero_dim { \box_ht:N \@arstrutbox }
+ \dim_gzero_new:N \g_@@_ht_row_one_dim
+ \dim_gset:Nn \g_@@_ht_row_one_dim { \box_ht:N \@arstrutbox }
+ \dim_gzero_new:N \g_@@_dp_ante_last_row_dim
+ \dim_gzero_new:N \g_@@_ht_last_row_dim
+ \dim_gset:Nn \g_@@_ht_last_row_dim { \box_ht:N \@arstrutbox }
+ \dim_gzero_new:N \g_@@_dp_last_row_dim
+ \dim_gset:Nn \g_@@_dp_last_row_dim { \box_dp:N \@arstrutbox }
+% \end{macrocode}
+% After its first use, the definition of |\ialign| will revert
+% automatically to its default definition. With this programmation, we will
+% have, in the cells of the array, a clean version of |\ialign|.
+% \begin{macrocode}
+ \cs_set_eq:NN \ialign \@@_old_ialign:
+ \halign
+ }
+% \end{macrocode}
+%
+% We keep in memory the old versions or |\ldots|, |\cdots|, etc. only because we
+% use them inside |\phantom| commands in order that the new commands |\Ldots|,
+% |\Cdots|, etc. give the same spacing (except when the option |nullify-dots| is
+% used).
+% \begin{macrocode}
+ \cs_set_eq:NN \@@_old_ldots \ldots
+ \cs_set_eq:NN \@@_old_cdots \cdots
+ \cs_set_eq:NN \@@_old_vdots \vdots
+ \cs_set_eq:NN \@@_old_ddots \ddots
+ \cs_set_eq:NN \@@_old_iddots \iddots
+ \bool_if:NTF \l_@@_standard_cline_bool
+ { \cs_set_eq:NN \cline \@@_standard_cline }
+ { \cs_set_eq:NN \cline \@@_cline }
+ \cs_set_eq:NN \Ldots \@@_Ldots
+ \cs_set_eq:NN \Cdots \@@_Cdots
+ \cs_set_eq:NN \Vdots \@@_Vdots
+ \cs_set_eq:NN \Ddots \@@_Ddots
+ \cs_set_eq:NN \Iddots \@@_Iddots
+ \cs_set_eq:NN \Hline \@@_Hline:
+ \cs_set_eq:NN \Hspace \@@_Hspace:
+ \cs_set_eq:NN \Hdotsfor \@@_Hdotsfor:
+ \cs_set_eq:NN \Vdotsfor \@@_Vdotsfor:
+ \cs_set_eq:NN \Block \@@_Block:
+ \cs_set_eq:NN \rotate \@@_rotate:
+ \cs_set_eq:NN \OnlyMainNiceMatrix \@@_OnlyMainNiceMatrix:n
+ \cs_set_eq:NN \dotfill \@@_dotfill:
+ \cs_set_eq:NN \CodeAfter \@@_CodeAfter:
+ \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}
+% We redefine |\multicolumn| and, since we want |\multicolumn| to be available
+% in the potential environments |{tabular}| nested in the environments of
+% \pkg{nicematrix}, we patch |{tabular}| to go back to the original definition.
+% \begin{macrocode}
+ \cs_set_eq:NN \multicolumn \@@_multicolumn:nnn
+ \hook_gput_code:nnn { env / tabular / begin } { . }
+ { \cs_set_eq:NN \multicolumn \@@_old_multicolumn }
+% \end{macrocode}
+% If there is one or several commands |\tabularnote| in the caption specified
+% by the key |caption| and if that caption has to be composed above the tabular,
+% we have now that information because it has been written in the |aux| file at
+% a previous run. We use that information to start couting the tabular notes in
+% the main array at the right value (that remember that the caption will be
+% composed \emph{after} the array!).
+% \begin{macrocode}
+ \tl_if_exist:NT \l_@@_note_in_caption_tl
+ {
+ \tl_if_empty:NF \l_@@_note_in_caption_tl
+ {
+ \int_gset_eq:NN \g_@@_notes_caption_int
+ { \l_@@_note_in_caption_tl }
+ \int_gset:Nn \c at tabularnote { \l_@@_note_in_caption_tl }
+ }
+ }
+% \end{macrocode}
+%
+%
+% The sequence |\g_@@_multicolumn_cells_seq| will contain the list of the cells
+% of the array where a command |\multicolumn{|$n$|}{...}{...}| with $n>1$ is
+% issued. In |\g_@@_multicolumn_sizes_seq|, the ``sizes'' (that is to say the
+% values of $n$) correspondant will be stored. These lists will be used for the
+% creation of the ``medium nodes'' (if they are created).
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_multicolumn_cells_seq
+ \seq_gclear:N \g_@@_multicolumn_sizes_seq
+% \end{macrocode}
+%
+% The counter |\c at iRow| will be used to count the rows of the array (its
+% incrementation will be in the first cell of the row).
+% \begin{macrocode}
+ \int_gset:Nn \c at iRow { \l_@@_first_row_int - 1 }
+% \end{macrocode}
+%
+% At the end of the environment |{array}|, |\c at iRow| will be the total
+% number de rows.
+%
+% |\g_@@_row_total_int| will be the number or rows excepted the last row (if
+% |\l_@@_last_row_bool| has been raised with the option |last-row|).
+% \begin{macrocode}
+ \int_gzero_new:N \g_@@_row_total_int
+% \end{macrocode}
+%
+% The counter |\c at jCol| will be used to count the columns of the array.
+% Since we want to know the total number of columns of the matrix, we also
+% create a counter |\g_@@_col_total_int|. These counters are updated in the
+% command |\@@_cell_begin:w| executed at the beginning of each cell.
+% \begin{macrocode}
+ \int_gzero_new:N \g_@@_col_total_int
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \cs_set_eq:NN \@ifnextchar \new at ifnextchar
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_renew_NC at rewrite@S:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \bool_gset_false:N \g_@@_last_col_found_bool
+% \end{macrocode}
+%
+% \medskip
+% During the construction of the array, the instructions |\Cdots|, |\Ldots|,
+% etc. will be written in token lists |\g_@@_Cdots_lines_tl|, etc. which will be
+% executed after the construction of the array.
+% \begin{macrocode}
+ \tl_gclear_new:N \g_@@_Cdots_lines_tl
+ \tl_gclear_new:N \g_@@_Ldots_lines_tl
+ \tl_gclear_new:N \g_@@_Vdots_lines_tl
+ \tl_gclear_new:N \g_@@_Ddots_lines_tl
+ \tl_gclear_new:N \g_@@_Iddots_lines_tl
+ \tl_gclear_new:N \g_@@_HVdotsfor_lines_tl
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \tl_gclear:N \g_nicematrix_code_before_tl
+ \tl_gclear:N \g_@@_pre_code_before_tl
+ }
+% \end{macrocode}
+% This is the end of |\@@_pre_array_ii:|.
+%
+%
+% \bigskip
+% The command |\@@_pre_array:| will be executed after analyse of the keys of the
+% environment.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pre_array:
+ {
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \cs_if_exist:NT \theiRow { \int_set_eq:NN \l_@@_old_iRow_int \c at iRow }
+ \int_gzero_new:N \c at iRow
+ \cs_if_exist:NT \thejCol { \int_set_eq:NN \l_@@_old_jCol_int \c at jCol }
+ \int_gzero_new:N \c at jCol
+% \end{macrocode}
+%
+% \bigskip
+% We recall that |\l_@@_last_row_int| and |\l_@@_last_column_int| are \emph{not}
+% the numbers of the last row and last column of the array. There are only the
+% values of the keys |last-row| and |last-column| (maybe the user has provided
+% erroneous values). The meaning of that counters does not change during the
+% environment of \pkg{nicematrix}. There is only a slight adjustment: if the
+% user have used one of those keys without value, we provide now the right value
+% as read on the |aux| file (of course, it's possible only after the first compilation).
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_row_int = { -1 }
+ {
+ \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 \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 \g_@@_size_seq 6 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% If there is an exterior row, we patch a command used in |\@@_cell_begin:w| in order to
+% keep track of some dimensions needed to the construction of that ``last row''.
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_row_int > { -2 }
+ {
+ \tl_put_right:Nn \@@_update_for_first_and_last_row:
+ {
+ \dim_gset:Nn \g_@@_ht_last_row_dim
+ { \dim_max:nn \g_@@_ht_last_row_dim { \box_ht:N \l_@@_cell_box } }
+ \dim_gset:Nn \g_@@_dp_last_row_dim
+ { \dim_max:nn \g_@@_dp_last_row_dim { \box_dp:N \l_@@_cell_box } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_cols_vlism_seq
+ \seq_gclear:N \g_@@_submatrix_seq
+% \end{macrocode}
+%
+% \bigskip
+% Now the |\CodeBefore|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_code_before_bool \@@_exec_code_before:
+% \end{macrocode}
+%
+% \bigskip
+% The value of |\g_@@_pos_of_blocks_seq| has been written on the |aux| file and
+% loaded before the (potential) execution of the |\CodeBefore|. Now, we clear
+% that variable because it will be reconstructed during the creation of the
+% array.
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_pos_of_blocks_seq
+% \end{macrocode}
+% Idem for other sequences written on the |aux| file.
+% \begin{macrocode}
+ \seq_gclear_new:N \g_@@_multicolumn_cells_seq
+ \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 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 { -2 }
+% \end{macrocode}
+% The value $-2$ is important.
+%
+%
+% \interitem
+% The code in |\@@_pre_array_ii:| is used only here.
+% \begin{macrocode}
+ \@@_pre_array_ii:
+% \end{macrocode}
+%
+% \medskip
+% The array will be composed in a box (named |\l_@@_the_array_box|) because we
+% have to do manipulations concerning the potential exterior rows.
+% \begin{macrocode}
+ \box_clear_new:N \l_@@_the_array_box
+% \end{macrocode}
+%
+%
+% \medskip
+% We compute the width of both delimiters. We remind that, when the
+% environment |{NiceArray}| is used, it's possible to specify the delimiters in
+% the preamble (eg |[ccc]|).
+% \begin{macrocode}
+ \dim_zero_new:N \l_@@_left_delim_dim
+ \dim_zero_new:N \l_@@_right_delim_dim
+ \bool_if:NTF \g_@@_NiceArray_bool
+ {
+ \dim_gset:Nn \l_@@_left_delim_dim { 2 \arraycolsep }
+ \dim_gset:Nn \l_@@_right_delim_dim { 2 \arraycolsep }
+ }
+ {
+% \end{macrocode}
+% The command |\bBigg@| is a command of \pkg{amsmath}.
+% \begin{macrocode}
+ \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g_@@_left_delim_tl $ }
+ \dim_set:Nn \l_@@_left_delim_dim { \box_wd:N \l_tmpa_box }
+ \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g_@@_right_delim_tl $ }
+ \dim_set:Nn \l_@@_right_delim_dim { \box_wd:N \l_tmpa_box }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Here is the beginning of the box which will contain the array. The
+% |\hbox_set_end:| corresponding to this |\hbox_set:Nw| will be in the second
+% part of the environment (and the closing |\c_math_toggle_token| also).
+% \begin{macrocode}
+ \hbox_set:Nw \l_@@_the_array_box
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \skip_horizontal:N \l_@@_left_margin_dim
+ \skip_horizontal:N \l_@@_extra_left_margin_dim
+ \c_math_toggle_token
+ \bool_if:NTF \l_@@_light_syntax_bool
+ { \use:c { @@-light-syntax } }
+ { \use:c { @@-normal-syntax } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% 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_nopar:Npn \@@_CodeBefore_Body:w #1 \Body
+ {
+ \tl_gput_left:Nn \g_@@_pre_code_before_tl { #1 }
+ \bool_set_true:N \l_@@_code_before_bool
+% \end{macrocode}
+% We go on with |\@@_pre_array:| which will (among other) execute the
+% |\CodeBefore| (specified in the key |code-before| or after the keyword
+% |\CodeBefore|). By definition, the |\CodeBefore| must be executed before the
+% body of the array...
+% \begin{macrocode}
+ \@@_pre_array:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The \textbackslash CodeBefore}
+%
+% The following command will be executed if the |\CodeBefore| has to be actually executed.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pre_code_before:
+ {
+% \end{macrocode}
+% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that,
+% in the |\CodeBefore| (and in the |\CodeAfter|) they represent the numbers of
+% rows and columns of the array (without the potential last row and last
+% column). The value of |\g_@@_row_total_int| is the number of the last row
+% (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 \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}
+%
+%
+% Now, we will create all the |col| nodes and |row| nodes with the informations
+% written in the |aux| file. You use the technique described in the page~1229 of
+% |pgfmanual.pdf|, version~3.1.4b.
+% \begin{macrocode}
+ \pgfsys at markposition { \@@_env: - position }
+ \pgfsys at getposition { \@@_env: - position } \@@_picture_position:
+ \pgfpicture
+ \pgf at relevantforpicturesizefalse
+% \end{macrocode}
+% First, the recreation of the |row| nodes.
+% \begin{macrocode}
+ \int_step_inline:nnn \l_@@_first_row_int { \g_@@_row_total_int + 1 }
+ {
+ \pgfsys at getposition { \@@_env: - row - ##1 } \@@_node_position:
+ \pgfcoordinate { \@@_env: - row - ##1 }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+ }
+% \end{macrocode}
+% Now, the recreation of the |col| nodes.
+% \begin{macrocode}
+ \int_step_inline:nnn \l_@@_first_col_int { \g_@@_col_total_int + 1 }
+ {
+ \pgfsys at getposition { \@@_env: - col - ##1 } \@@_node_position:
+ \pgfcoordinate { \@@_env: - col - ##1 }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+ }
+% \end{macrocode}
+% Now, you recreate the diagonal nodes by using the |row| nodes and the |col|
+% nodes.
+% \begin{macrocode}
+ \@@_create_diag_nodes:
+% \end{macrocode}
+%
+% \medskip
+% Now, the creation of the cell nodes |(i-j)|, and, maybe also the ``medium
+% nodes'' and the ``large nodes''.
+% \begin{macrocode}
+ \bool_if:NT \g_@@_recreate_cell_nodes_bool \@@_recreate_cell_nodes:
+ \endpgfpicture
+% \end{macrocode}
+%
+% \medskip
+% Now, the recreation of the nodes of the blocks \emph{which have a name}.
+% \begin{macrocode}
+ \@@_create_blocks_nodes:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \IfPackageLoadedTF { tikz }
+ {
+ \tikzset
+ {
+ every~picture / .style =
+ { overlay , name~prefix = \@@_env: - }
+ }
+ }
+ { }
+ \cs_set_eq:NN \cellcolor \@@_cellcolor
+ \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor
+ \cs_set_eq:NN \roundedrectanglecolor \@@_roundedrectanglecolor
+ \cs_set_eq:NN \rowcolor \@@_rowcolor
+ \cs_set_eq:NN \rowcolors \@@_rowcolors
+ \cs_set_eq:NN \rowlistcolors \@@_rowlistcolors
+ \cs_set_eq:NN \arraycolor \@@_arraycolor
+ \cs_set_eq:NN \columncolor \@@_columncolor
+ \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors
+ \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before
+ \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_exec_code_before:
+ {
+ \seq_gclear_new:N \g_@@_colors_seq
+ \bool_gset_false:N \g_@@_recreate_cell_nodes_bool
+ \group_begin:
+% \end{macrocode}
+%
+% We compose the |\CodeBefore| in math mode in order to nullify the spaces put
+% by the user between instructions in the |\CodeBefore|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
+% \end{macrocode}
+%
+% \bigskip
+% The following code is a security for the case the user has used \pkg{babel}
+% with the option \pkg{spanish}: in that case, the characters |<| (de code
+% \textsc{ascci} 60) and |>| are activated and Tikz is not able to solve the
+% problem (even with the Tikz library \pkg{babel}).
+% \begin{macrocode}
+ \int_compare:nNnT { \char_value_catcode:n { 60 } } = { 13 }
+ {
+ \@@_rescan_for_spanish:N \g_@@_pre_code_before_tl
+ \@@_rescan_for_spanish:N \l_@@_code_before_tl
+ }
+% \end{macrocode}
+%
+% Here is the |\CodeBefore|. The construction is a bit complicated because
+% |\g_@@_pre_code_before_tl| may begin with keys between square brackets. Moreover,
+% after the analyze of those keys, we sometimes have to decide to do \emph{not}
+% execute the rest of |\g_@@_pre_code_before_tl| (when it is asked for the creation
+% of cell nodes in the |\CodeBefore|). That's why we use a |\q_stop|: it
+% will be used to discard the rest of |\g_@@_pre_code_before_tl|.
+% \begin{macrocode}
+ \exp_last_unbraced:NV \@@_CodeBefore_keys:
+ \g_@@_pre_code_before_tl
+% \end{macrocode}
+% Now, all the cells which are specified to be colored by instructions in the
+% |\CodeBefore| will actually be colored. It's a two-stages mechanism because we
+% want to draw all the cells with the same color at the same time to absolutely
+% avoid thin white lines in some \textsc{pdf} viewers.
+% \begin{macrocode}
+ \@@_actually_color:
+ \l_@@_code_before_tl
+ \q_stop
+ \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
+ \group_end:
+ \bool_if:NT \g_@@_recreate_cell_nodes_bool
+ { \tl_put_left:Nn \@@_node_for_cell: \@@_patch_node_for_cell: }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / CodeBefore }
+ {
+ create-cell-nodes .bool_gset:N = \g_@@_recreate_cell_nodes_bool ,
+ create-cell-nodes .default:n = true ,
+ sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
+ sub-matrix .value_required:n = true ,
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~CodeBefore }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\NewDocumentCommand \@@_CodeBefore_keys: { O { } }
+ {
+ \keys_set:nn { NiceMatrix / CodeBefore } { #1 }
+ \@@_CodeBefore:w
+ }
+% \end{macrocode}
+%
+% We have extracted the options of the keyword |\CodeBefore| in order to see
+% whether the key |create-cell-nodes| has been used. Now, you can execute the
+% rest of the |\CodeAfter|, excepted, of course, if we are in the first
+% compilation.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_CodeBefore:w #1 \q_stop
+ {
+ \bool_if:NT \g_@@_aux_found_bool
+ {
+ \@@_pre_code_before:
+ #1
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+%
+%
+% \bigskip
+% By default, if the user uses the |\CodeBefore|, only the |col| nodes, |row|
+% nodes and |diag| nodes are available in that |\CodeBefore|. With the key
+% |create-cell-nodes|, the cell nodes, that is to say the nodes of the form
+% |(i-j)| (but not the extra nodes) are also available because those nodes also
+% are recreated and that recreation is done by the following command.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_recreate_cell_nodes:
+ {
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \pgfsys at getposition { \@@_env: - ##1 - base } \@@_node_position:
+ \pgfcoordinate { \@@_env: - row - ##1 - base }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+ \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sys @ pdf @ mark @ pos @ \@@_env: - ##1 - ####1 - NW }
+ {
+ \pgfsys at getposition
+ { \@@_env: - ##1 - ####1 - NW }
+ \@@_node_position:
+ \pgfsys at getposition
+ { \@@_env: - ##1 - ####1 - SE }
+ \@@_node_position_i:
+ \@@_pgf_rect_node:nnn
+ { \@@_env: - ##1 - ####1 }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position: }
+ { \pgfpointdiff \@@_picture_position: \@@_node_position_i: }
+ }
+ }
+ }
+ \int_step_inline:nn \c at iRow
+ {
+ \pgfnodealias
+ { \@@_env: - ##1 - last }
+ { \@@_env: - ##1 - \int_use:N \c at jCol }
+ }
+ \int_step_inline:nn \c at jCol
+ {
+ \pgfnodealias
+ { \@@_env: - last - ##1 }
+ { \@@_env: - \int_use:N \c at iRow - ##1 }
+ }
+ \@@_create_extra_nodes:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_blocks_nodes:
+ {
+ \pgfpicture
+ \pgf at relevantforpicturesizefalse
+ \pgfrememberpicturepositiononpagetrue
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_create_one_block_node:nnnnn ##1 }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% The following command is called |\@@_create_one_block_node:nnnnn| but, in
+% fact, it creates a node only if the last argument (|#5|) which is the name of
+% the block, is not empty.\footnote{Moreover, there is also in the list
+% |\g_@@_pos_of_blocks_seq| the positions of the dotted lines (created by
+% |\Cdots|, etc.) and, for these entries, there is, of course, no name (the
+% fifth component is empty).}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_one_block_node:nnnnn #1 #2 #3 #4 #5
+ {
+ \tl_if_empty:nF { #5 }
+ {
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at x
+ \@@_qpoint:n { #1 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf at y
+ \@@_qpoint:n { col - \int_eval:n { #4 + 1 } }
+ \dim_set_eq:NN \l_@@_tmpc_dim \pgf at x
+ \@@_qpoint:n { \int_eval:n { #3 + 1 } }
+ \dim_set_eq:NN \l_@@_tmpd_dim \pgf at y
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - #5 }
+ { \dim_use:N \l_tmpa_dim }
+ { \dim_use:N \l_tmpb_dim }
+ { \dim_use:N \l_@@_tmpc_dim }
+ { \dim_use:N \l_@@_tmpd_dim }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_for_revtex:
+ {
+ \cs_set_eq:NN \@addamp \@addamp at LaTeX
+ \cs_set_eq:NN \insert at column \insert at column@array
+ \cs_set_eq:NN \@classx \@classx at array
+ \cs_set_eq:NN \@xarraycr \@xarraycr at array
+ \cs_set_eq:NN \@arraycr \@arraycr at array
+ \cs_set_eq:NN \@xargarraycr \@xargarraycr at array
+ \cs_set_eq:NN \array \array at array
+ \cs_set_eq:NN \@array \@array at array
+ \cs_set_eq:NN \@tabular \@tabular at array
+ \cs_set_eq:NN \@mkpream \@mkpream at array
+ \cs_set_eq:NN \endarray \endarray at array
+ \cs_set:Npn \@tabarray { \@ifnextchar [ { \@array } { \@array [ c ] } }
+ \cs_set:Npn \endtabular { \endarray $\egroup} % $
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The environment \{NiceArrayWithDelims\}}
+%
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceArrayWithDelims }
+ { m m O { } m ! O { } t \CodeBefore }
+ {
+ \bool_if:NT \c_@@_revtex_bool \@@_patch_for_revtex:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_provide_pgfsyspdfmark:
+ \bool_if:NT \c_@@_footnote_bool \savenotes
+% \end{macrocode}
+%
+% The aim of the following |\bgroup| (the corresponding |\egroup| is, of course,
+% at the end of the environment) is to be able to put an exposant to a matrix in
+% a mathematical formula.
+% \begin{macrocode}
+ \bgroup
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \tl_gset:Nn \g_@@_left_delim_tl { #1 }
+ \tl_gset:Nn \g_@@_right_delim_tl { #2 }
+ \tl_gset:Nn \g_@@_preamble_tl { #4 }
+% \end{macrocode}
+%
+%
+% \bigskip
+%
+% \begin{macrocode}
+ \int_gzero:N \g_@@_block_box_int
+ \dim_zero:N \g_@@_width_last_col_dim
+ \dim_zero:N \g_@@_width_first_col_dim
+ \bool_gset_false:N \g_@@_row_of_col_done_bool
+ \str_if_empty:NT \g_@@_name_env_str
+ { \str_gset:Nn \g_@@_name_env_str { NiceArrayWithDelims } }
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ \mode_leave_vertical:
+ \@@_test_if_math_mode:
+ \bool_if:NT \l_@@_in_env_bool { \@@_fatal:n { Yet~in~env } }
+ \bool_set_true:N \l_@@_in_env_bool
+% \end{macrocode}
+% The command |\CT at arc@| contains the instruction of color for the rules of the
+% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by |\CT at arc@| but
+% we use it also for compatibility with \pkg{colortbl}. But we want also to be
+% able to use color for the rules of the array when \pkg{colortbl} is \emph{not}
+% loaded. That's why we do the following instruction which is in the patch of
+% the beginning of arrays done by \pkg{colortbl}. Of course, we restore the
+% value of |\CT at arc@| at the end of our environment.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_old_CT at arc@ \CT at arc@
+% \end{macrocode}
+%
+% We deactivate Tikz externalization because we will use \textsc{pgf} pictures
+% with the options |overlay| and |remember picture| (or equivalent forms). We
+% deactivate with |\tikzexternaldisable| and not with
+% |\tikzset{external/export=false}| which is \emph{not} equivalent.
+% \begin{macrocode}
+ \cs_if_exist:NT \tikz at library@external at loaded
+ {
+ \tikzexternaldisable
+ \cs_if_exist:NT \ifstandalone
+ { \tikzset { external / optimize = false } }
+ }
+% \end{macrocode}
+%
+% We increment the counter |\g_@@_env_int| which counts the environments
+% of the package.
+% \begin{macrocode}
+ \int_gincr:N \g_@@_env_int
+ \bool_if:NF \l_@@_block_auto_columns_width_bool
+ { \dim_gzero_new:N \g_@@_max_cell_width_dim }
+% \end{macrocode}
+%
+%
+% The sequence |\g_@@_blocks_seq| will contain the carateristics of the blocks
+% (specified by |\Block|) of the array. The sequence |\g_@@_pos_of_blocks_seq|
+% will contain only the position of the blocks (except the blocks with the key
+% |hvlines|).
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_blocks_seq
+ \seq_gclear:N \g_@@_pos_of_blocks_seq
+% \end{macrocode}
+% In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the
+% positions of the cells with a |\diagbox|.
+%
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_pos_of_stroken_blocks_seq
+ \seq_gclear:N \g_@@_pos_of_xdots_seq
+ \tl_gclear_new:N \g_@@_code_before_tl
+ \tl_gclear:N \g_@@_row_style_tl
+% \end{macrocode}
+%
+% \bigskip
+% We load all the informations written in the |aux| file during previous
+% compilations corresponding to the current environment.
+% \begin{macrocode}
+ \bool_gset_false:N \g_@@_aux_found_bool
+ \tl_if_exist:cT { c_@@ _ \int_use:N \g_@@_env_int _ tl }
+ {
+ \bool_gset_true:N \g_@@_aux_found_bool
+ \use:c { c_@@ _ \int_use:N \g_@@_env_int _ tl }
+ }
+% \end{macrocode}
+% Now, we prepare the token list for the instructions that we will have to write
+% on the |aux| file at the end of the environment.
+% \begin{macrocode}
+ \tl_gclear:N \g_@@_aux_tl
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_if_empty:NF \g_@@_code_before_tl
+ {
+ \bool_set_true:N \l_@@_code_before_bool
+ \tl_put_right:NV \l_@@_code_before_tl \g_@@_code_before_tl
+ }
+ \tl_if_empty:NF \g_@@_pre_code_before_tl
+ { \bool_set_true:N \l_@@_code_before_bool }
+% \end{macrocode}
+%
+% The set of keys is not exactly the same for |{NiceArray}| and for the variants
+% of |{NiceArray}| (|{pNiceArray}|, |{bNiceArray}|, etc.) because, for
+% |{NiceArray}|, we have the options |t|, |c|, |b| and |baseline|.
+% \begin{macrocode}
+ \bool_if:NTF \g_@@_NiceArray_bool
+ { \keys_set:nn { NiceMatrix / NiceArray } }
+ { \keys_set:nn { NiceMatrix / pNiceArray } }
+ { #3 , #5 }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \@@_set_CT at arc@:V \l_@@_rules_color_tl
+% \end{macrocode}
+%
+% \bigskip
+% The argument |#6| is the last argument of |{NiceArrayWithDelims}|. With that
+% argument of type ``|t \CodeBefore|'', we test whether there is the keyword
+% |\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 |\@@_CodeBefore_Body:w|. After that job, the command |\@@_CodeBefore_Body:w|
+% will go on with |\@@_pre_array:|.
+% \begin{macrocode}
+ \IfBooleanTF { #6 } \@@_CodeBefore_Body:w \@@_pre_array:
+ }
+% \end{macrocode}
+%
+% Now, the second part of the environment |{NiceArrayWithDelims}|.
+% \begin{macrocode}
+ {
+ \bool_if:NTF \l_@@_light_syntax_bool
+ { \use:c { end @@-light-syntax } }
+ { \use:c { end @@-normal-syntax } }
+ \c_math_toggle_token
+ \skip_horizontal:N \l_@@_right_margin_dim
+ \skip_horizontal:N \l_@@_extra_right_margin_dim
+ \hbox_set_end:
+% \end{macrocode}
+% End of the construction of the array (in the box |\l_@@_the_array_box|).
+%
+% \bigskip
+% If the user has used the key |width| without any column |X|, we raise an error.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_width_used_bool
+ {
+ \int_compare:nNnT \g_@@_total_X_weight_int = 0
+ { \@@_error_or_warning:n { width~without~X~columns } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Now, if there is at least one |X|-column in the environment, we compute the
+% width that those columns will have (in the next compilation). In fact,
+% |l_@@_X_columns_dim| will be the width of a column of weight $1$. For a
+% |X|-column of weight~$n$, the width will be |\l_@@_X_columns_dim| multiplied
+% by~$n$.
+% \begin{macrocode}
+ \int_compare:nNnT \g_@@_total_X_weight_int > 0
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \bool_set_true:N \l_@@_X_columns_aux_bool
+ \dim_set:Nn \l_@@_X_columns_dim
+ {
+ \dim_compare:nNnTF
+ {
+ \dim_abs:n
+ { \l_@@_width_dim - \box_wd:N \l_@@_the_array_box }
+ }
+ <
+ { 0.001 pt }
+ { \dim_use:N \l_@@_X_columns_dim }
+ {
+ \dim_eval:n
+ {
+ ( \l_@@_width_dim - \box_wd:N \l_@@_the_array_box )
+ / \int_use:N \g_@@_total_X_weight_int
+ + \l_@@_X_columns_dim
+ }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% It the user has used the key |last-row| with a value, we control that the
+% given value is correct (since we have just constructed the array, we know the
+% actual number of rows of the array).
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_row_int > { -2 }
+ {
+ \bool_if:NF \l_@@_last_row_without_value_bool
+ {
+ \int_compare:nNnF \l_@@_last_row_int = \c at iRow
+ {
+ \@@_error:n { Wrong~last~row }
+ \int_gset_eq:NN \l_@@_last_row_int \c at iRow
+ }
+ }
+ }
+% \end{macrocode}
+%
+% Now, the definition of |\c at jCol| and |\g_@@_col_total_int| change: |\c at jCol|
+% will be the number of columns without the ``last column'';
+% |\g_@@_col_total_int| will be the number of columns with this ``last
+% column''.\footnote{We remind that the potential ``first column'' (exterior)
+% has the number~$0$.}
+% \begin{macrocode}
+ \int_gset_eq:NN \c at jCol \g_@@_col_total_int
+ \bool_if:nTF \g_@@_last_col_found_bool
+ { \int_gdecr:N \c at jCol }
+ {
+ \int_compare:nNnT \l_@@_last_col_int > { -1 }
+ { \@@_error:n { last~col~not~used } }
+ }
+% \end{macrocode}
+%
+% We fix also the value of |\c at iRow| and |\g_@@_row_total_int| with the
+% same principle.
+% \begin{macrocode}
+ \int_gset_eq:NN \g_@@_row_total_int \c at iRow
+ \int_compare:nNnT \l_@@_last_row_int > { -1 } { \int_gdecr:N \c at iRow }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \textbf{Now, we begin the real construction in the output flow of TeX}. First, we take
+% into account a potential ``first column'' (we remind that this ``first
+% column'' has been constructed in an overlapping position and that we have
+% computed its width in |\g_@@_width_first_col_dim|: see
+% p.~\pageref{overlap-left}).
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_first_col_int = 0
+ {
+ \skip_horizontal:N \col at sep
+ \skip_horizontal:N \g_@@_width_first_col_dim
+ }
+% \end{macrocode}
+%
+% The construction of the real box is different when |\g_@@_NiceArray_bool| is
+% true (|{NiceArray}| or |{NiceTabular}|) and in the other environments because,
+% in |{NiceArray}| or |{NiceTabular}|, we have no delimiter to put (but we have
+% tabular notes to put). We begin with this case.
+%
+% \begin{macrocode}
+ \bool_if:NTF \g_@@_NiceArray_bool
+ {
+ \str_case:VnF \l_@@_baseline_tl
+ {
+ b \@@_use_arraybox_with_notes_b:
+ c \@@_use_arraybox_with_notes_c:
+ }
+ \@@_use_arraybox_with_notes:
+ }
+% \end{macrocode}
+%
+% Now, in the case of an environment |{pNiceArray}|, |{bNiceArray}|, etc. We
+% compute |\l_tmpa_dim| which is the total height of the ``first row'' above the
+% array (when the key |first-row| is used).
+% \begin{macrocode}
+ {
+ \int_compare:nNnTF \l_@@_first_row_int = 0
+ {
+ \dim_set_eq:NN \l_tmpa_dim \g_@@_dp_row_zero_dim
+ \dim_add:Nn \l_tmpa_dim \g_@@_ht_row_zero_dim
+ }
+ { \dim_zero:N \l_tmpa_dim }
+% \end{macrocode}
+%
+% We compute |\l_tmpb_dim| which is the total height of the ``last row''
+% below the array (when the key |last-row| is used). A value of $-2$ for
+% |\l_@@_last_row_int| means that there is no ``last row''.\footnote{A value of
+% $-1$ for |\l_@@_last_row_int| means that there is a ``last row'' but the
+% the user have not set the value with the option |last row| (and we are in the
+% first compilation).}
+% \begin{macrocode}
+ \int_compare:nNnTF \l_@@_last_row_int > { -2 }
+ {
+ \dim_set_eq:NN \l_tmpb_dim \g_@@_ht_last_row_dim
+ \dim_add:Nn \l_tmpb_dim \g_@@_dp_last_row_dim
+ }
+ { \dim_zero:N \l_tmpb_dim }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \c_math_toggle_token
+ \@@_color:V \l_@@_delimiters_color_tl
+ \exp_after:wN \left \g_@@_left_delim_tl
+ \vcenter
+ {
+% \end{macrocode}
+% We take into account the ``first row'' (we have previously computed its total
+% height in |\l_tmpa_dim|). The |\hbox:n| (or |\hbox|) is necessary here.
+% \begin{macrocode}
+ \skip_vertical:n { -\l_tmpa_dim - \arrayrulewidth }
+ \hbox
+ {
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ { \skip_horizontal:N -\tabcolsep }
+ { \skip_horizontal:N -\arraycolsep }
+ \@@_use_arraybox_with_notes_c:
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ { \skip_horizontal:N -\tabcolsep }
+ { \skip_horizontal:N -\arraycolsep }
+ }
+% \end{macrocode}
+% We take into account the ``last row'' (we have previously computed its total
+% height in |\l_tmpb_dim|).
+% \begin{macrocode}
+ \skip_vertical:n { -\l_tmpb_dim + \arrayrulewidth }
+ }
+% \end{macrocode}
+% Curiously, we have to put again the following specification of color.
+% Otherwise, with XeLaTeX (and not with the other engines), the closing
+% delimiter is not colored.
+% \begin{macrocode}
+ \@@_color:V \l_@@_delimiters_color_tl
+ \exp_after:wN \right \g_@@_right_delim_tl
+ \c_math_toggle_token
+ }
+% \end{macrocode}
+% Now, the box |\l_tmpa_box| is created with the correct delimiters.
+%
+% \smallskip
+% We will put the box in the TeX flow. However, we have a small work to do
+% when the option |delimiters/max-width| is used.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_delimiters_max_width_bool
+ {
+ \@@_put_box_in_flow_bis:nn
+ \g_@@_left_delim_tl \g_@@_right_delim_tl
+ }
+ \@@_put_box_in_flow:
+ }
+% \end{macrocode}
+%
+% We take into account a potential ``last column'' (this ``last column'' has
+% been constructed in an overlapping position and we have computed its width in
+% |\g_@@_width_last_col_dim|: see p.~\pageref{overlap-right}).
+% \begin{macrocode}
+ \bool_if:NT \g_@@_last_col_found_bool
+ {
+ \skip_horizontal:N \g_@@_width_last_col_dim
+ \skip_horizontal:N \col at sep
+ }
+ \bool_if:NF \l_@@_Matrix_bool
+ {
+ \int_compare:nNnT \c at jCol < \g_@@_static_num_of_col_int
+ { \@@_warning_gredirect_none:n { columns~not~used } }
+ }
+ \@@_after_array:
+% \end{macrocode}
+% The aim of the following |\egroup| (the corresponding |\bgroup| is, of course,
+% at the beginning of the environment) is to be able to put an exposant to a matrix in
+% a mathematical formula.
+% \begin{macrocode}
+ \egroup
+% \end{macrocode}
+%
+% \bigskip
+% We write on the |aux| file all the informations corresponding to the
+% current environment.
+% \begin{macrocode}
+ \iow_now:Nn \@mainaux { \ExplSyntaxOn }
+ \iow_now:Nn \@mainaux { \char_set_catcode_space:n { 32 } }
+ \iow_now:Nx \@mainaux
+ {
+ \tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }
+ { \exp_not:V \g_@@_aux_tl }
+ }
+ \iow_now:Nn \@mainaux { \ExplSyntaxOff }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \bool_if:NT \c_@@_footnote_bool \endsavenotes
+ }
+% \end{macrocode}
+% This is the end of the environment |{NiceArrayWithDelims}|.
+%
+% \vspace{1cm}
+% \section{We construct the preamble of the array}
+%
+% \bigskip
+% The transformation of the preamble is an operation in several
+% steps.\footnote{Be careful: the transformation of the preamble may also have
+% by-side effects, for example, the boolean |\g_@@_NiceArray_bool| will be set
+% to |false| if we detect in the preamble a delimiter at the beginning or at the
+% end.}
+%
+% \bigskip
+% The preamble given by the final user is in |\g_@@_preamble_tl| and the modified
+% version will be stored in |\g_@@_preamble_tl| also.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_transform_preamble:
+ {
+% \end{macrocode}
+% First, we will do an ``expansion'' of the preamble with the tools of the
+% package \pkg{array} itself. This ``expansion'' will expand all the constructions
+% with |*| and all column types (defined by the user or by various packages
+% using |\newcolumntype|).
+%
+% Since we use the tools of \pkg{array} to do this expansion, we will have a
+% programmation which is not in the style of the L3 programming layer.
+%
+%
+% \bigskip
+% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead
+% of |\newcolumtype| because we don't want warnings for column types already
+% defined. These redefinitions are in fact \emph{protections} of the letters |w|
+% and |W|. We don't want these columns type expanded because we will do the
+% patch ourselves after. We want to be able to use the standard column types |w|
+% and |W| in potential |{tabular}| of \pkg{array} in some cells of our array.
+% That's why we do those redefinitions in a TeX group.
+% \begin{macrocode}
+ \group_begin:
+% \end{macrocode}
+%
+% If we are in an environment without explicit preamble, we have nothing to do
+% (excepted the treatment on both sides of the preamble which will be done at
+% the end).
+% \begin{macrocode}
+ \bool_if:NF \l_@@_Matrix_bool
+ {
+ \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } }
+ \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } }
+% \end{macrocode}
+%
+% \bigskip
+% If the package \pkg{varwidth} has defined the column type |V|, we protect from
+% expansion by redefining it to |\@@_V:| (which will be catched by our system).
+% \begin{macrocode}
+ \cs_if_exist:NT \NC at find@V { \@@_newcolumntype V { \@@_V: } }
+% \end{macrocode}
+%
+% First, we have to store our preamble in the token register |\@temptokena|
+% (those ``token registers'' are \emph{not} supported by the L3 programming layer).
+% \begin{macrocode}
+ \exp_args:NV \@temptokena \g_@@_preamble_tl
+% \end{macrocode}
+% Initialisation of a flag used by \pkg{array} to detect the end of the expansion.
+% \begin{macrocode}
+ \@tempswatrue
+% \end{macrocode}
+% The following line actually does the expansion (it's has been copied from
+% |array.sty|). The expanded version is still in |\@temptokena|.
+% \begin{macrocode}
+ \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Now, we have to ``patch'' that preamble by transforming some columns.
+% We will insert in the TeX flow the preamble in its actual form (that is to say
+% after the ``expansion'') following by a marker |\q_stop| and we will consume
+% these tokens constructing the (new form of the) preamble in
+% |\g_@@_preamble_tl|. This is done recursively with the command
+% |\@@_patch_preamble:n|. In the same time, we will count the columns with the
+% counter |\c at jCol|.
+% \begin{macrocode}
+ \int_gzero:N \c at jCol
+ \tl_gclear:N \g_@@_preamble_tl
+% \end{macrocode}
+% |\g_tmpb_bool| will be raised if you have a \verb+|+ at the end of the preamble.
+% \begin{macrocode}
+ \bool_gset_false:N \g_tmpb_bool
+ \tl_if_eq:NnTF \l_@@_vlines_clist { all }
+ {
+ \tl_gset:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N \arrayrulewidth } }
+ }
+ {
+ \clist_if_in:NnT \l_@@_vlines_clist 1
+ {
+ \tl_gset:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N \arrayrulewidth } }
+ }
+ }
+% \end{macrocode}
+% The sequence |\g_@@_cols_vlsim_seq| will contain the numbers of the columns
+% where you will to have to draw vertical lines in the potential sub-matrices
+% (hence the name |vlism|).
+% \begin{macrocode}
+ \seq_clear:N \g_@@_cols_vlism_seq
+% \end{macrocode}
+%
+% \bigskip
+% The following sequence will store the arguments of the successive |>| in the
+% preamble.
+% \begin{macrocode}
+ \tl_gclear_new:N \g_@@_pre_cell_tl
+% \end{macrocode}
+%
+% The counter |\l_tmpa_int| will count the number of consecutive occurrences
+% of the symbol \verb+|+.
+% \begin{macrocode}
+ \int_zero:N \l_tmpa_int
+% \end{macrocode}
+% Now, we actually patch the preamble (and it is constructed in
+% |\g_@@_preamble_tl|).
+% \begin{macrocode}
+ \exp_after:wN \@@_patch_preamble:n \the \@temptokena \q_stop
+ \int_gset_eq:NN \g_@@_static_num_of_col_int \c at jCol
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we replace |\columncolor| by |\@@_columncolor_preamble|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_colortbl_like_bool
+ {
+ \regex_replace_all:NnN
+ \c_@@_columncolor_regex
+ { \c { @@_columncolor_preamble } }
+ \g_@@_preamble_tl
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we can close the TeX group which was opened for the redefinition of
+% the columns of type |w| and~|W|.
+% \begin{macrocode}
+ \group_end:
+% \end{macrocode}
+%
+% \medskip
+% If there was delimiters at the beginning or at the end of the preamble, the
+% environment |{NiceArray}| is transformed into an environment |{xNiceMatrix}|.
+% \begin{macrocode}
+ \bool_lazy_or:nnT
+ { ! \str_if_eq_p:Vn \g_@@_left_delim_tl { . } }
+ { ! \str_if_eq_p:Vn \g_@@_right_delim_tl { . } }
+ { \bool_gset_false:N \g_@@_NiceArray_bool }
+% \end{macrocode}
+%
+% \medskip
+% We want to remind whether there is a specifier \verb+|+ at the end of the preamble.
+% \begin{macrocode}
+ \bool_if:NT \g_tmpb_bool { \bool_set_true:N \l_@@_bar_at_end_of_pream_bool }
+% \end{macrocode}
+%
+% \bigskip
+% We complete the preamble with the potential ``exterior columns'' (on both sides).
+% \begin{macrocode}
+ \int_compare:nNnTF \l_@@_first_col_int = 0
+ { \tl_gput_left:NV \g_@@_preamble_tl \c_@@_preamble_first_col_tl }
+ {
+ \bool_lazy_all:nT
+ {
+ \g_@@_NiceArray_bool
+ { \bool_not_p:n \l_@@_NiceTabular_bool }
+ { \tl_if_empty_p:N \l_@@_vlines_clist }
+ { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+ }
+ { \tl_gput_left:Nn \g_@@_preamble_tl { @ { } } }
+ }
+ \int_compare:nNnTF \l_@@_last_col_int > { -1 }
+ { \tl_gput_right:NV \g_@@_preamble_tl \c_@@_preamble_last_col_tl }
+ {
+ \bool_lazy_all:nT
+ {
+ \g_@@_NiceArray_bool
+ { \bool_not_p:n \l_@@_NiceTabular_bool }
+ { \tl_if_empty_p:N \l_@@_vlines_clist }
+ { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+ }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { @ { } } }
+ }
+% \end{macrocode}
+% We add a last column to raise a good error message when the user puts more
+% columns than allowed by its preamble. However, for technical reasons, it's not
+% possible to do that in |{NiceTabular*}| (we control that with the value of
+% |\l_@@_tabular_width_dim|).
+% \begin{macrocode}
+ \dim_compare:nNnT \l_@@_tabular_width_dim = \c_zero_dim
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { > { \@@_error_too_much_cols: } l }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_patch_preamble:n| is the main function for the transformation
+% of the preamble. It is recursive.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble:n #1
+ {
+ \str_case:nnF { #1 }
+ {
+ c { \@@_patch_preamble_i:n #1 }
+ l { \@@_patch_preamble_i:n #1 }
+ r { \@@_patch_preamble_i:n #1 }
+ > { \@@_patch_preamble_xiv:n }
+ ! { \@@_patch_preamble_ii:nn #1 }
+ @ { \@@_patch_preamble_ii:nn #1 }
+ | { \@@_patch_preamble_iii:n #1 }
+ p { \@@_patch_preamble_iv:n #1 }
+ b { \@@_patch_preamble_iv:n #1 }
+ m { \@@_patch_preamble_iv:n #1 }
+ \@@_V: { \@@_patch_preamble_v:n }
+ V { \@@_patch_preamble_v:n }
+ \@@_w: { \@@_patch_preamble_vi:nnnn { } #1 }
+ \@@_W: { \@@_patch_preamble_vi:nnnn { \@@_special_W: } #1 }
+ \@@_S: { \@@_patch_preamble_vii:n }
+ ( { \@@_patch_preamble_viii:nn #1 }
+ [ { \@@_patch_preamble_viii:nn #1 }
+ \{ { \@@_patch_preamble_viii:nn #1 }
+ \left { \@@_patch_preamble_viii:nn }
+ ) { \@@_patch_preamble_ix:nn #1 }
+ ] { \@@_patch_preamble_ix:nn #1 }
+ \} { \@@_patch_preamble_ix:nn #1 }
+ \right { \@@_patch_preamble_ix:nn }
+ X { \@@_patch_preamble_x:n }
+% \end{macrocode}
+% When \pkg{tabularx} is loaded, a local redefinition of the specifier |X| is
+% done to replace |X| by |\@@_X|. Thus, our column type |X| will be used in the
+% |{NiceTabularX}|.
+% \begin{macrocode}
+ \@@_X { \@@_patch_preamble_x:n }
+ \q_stop { }
+ }
+ {
+ \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
+% customized rule is defined by using the key |custom-line| in
+% |\NiceMatrixOptions|. That key takes in as value a list of \textsl{key=value}
+% pairs. Among the keys avalaible in that list, there is the key |letter|. All
+% the letters defined by this way by the final user for such customized rules
+% are added in the set of keys |{NiceMatrix/ColumnTypes}|. That set of keys is
+% used to store the characteristics of those types of rules for convenience: the
+% keys of that set of keys won't never be used as keys by the final user (he
+% will use, instead, letters in the preamble of its array).
+% \begin{macrocode}
+ {
+ \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 }
+ {
+ \keys_set:nn { NiceMatrix / ColumnTypes } { #1 }
+ \@@_patch_preamble:n
+ }
+ {
+ \tl_if_eq:nnT { #1 } { S }
+ { \@@_fatal:n { unknown~column~type~S } }
+ { \@@_fatal:nn { unknown~column~type } { #1 } }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Now, we will list all the auxiliary functions for the different types of
+% entries in the preamble of the array.
+%
+% \medskip
+% For |c|, |l| and |r|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_i:n #1
+ {
+ \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl
+ \tl_gclear:N \g_@@_pre_cell_tl
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > { \@@_cell_begin:w \str_set:Nn \l_@@_hpos_cell_str { #1 } }
+ #1
+ < \@@_cell_end:
+ }
+% \end{macrocode}
+%
+% We increment the counter of columns and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c at jCol
+ \@@_patch_preamble_xi:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |>|, |!| and |@|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_ii:nn #1 #2
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } }
+ \@@_patch_preamble:n
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% For \verb+|+
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iii:n #1
+ {
+% \end{macrocode}
+% |\l_tmpa_int| is the number of successive occurrences of \verb+|+
+% \begin{macrocode}
+ \int_incr:N \l_tmpa_int
+ \@@_patch_preamble_iii_i:n
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iii_i:n #1
+ {
+ \str_if_eq:nnTF { #1 } |
+ { \@@_patch_preamble_iii:n | }
+ {
+ \dim_set:Nn \l_tmpa_dim
+ {
+ \arrayrulewidth * \l_tmpa_int
+ + \doublerulesep * ( \l_tmpa_int - 1)
+ }
+ \tl_gput_right:Nx \g_@@_preamble_tl
+ {
+% \end{macrocode}
+% Here, the command |\dim_eval:n| is mandatory.
+% \begin{macrocode}
+ \exp_not:N ! { \skip_horizontal:n { \dim_eval:n { \l_tmpa_dim } } }
+ }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_vline:n
+ {
+ position = \int_eval:n { \c at jCol + 1 } ,
+ multiplicity = \int_use:N \l_tmpa_int ,
+ total-width = \dim_use:N \l_tmpa_dim % added 2022-08-06
+ }
+% \end{macrocode}
+% We don't have provided value for |start| nor for |end|, which means that the
+% rule will cover (potentially) all the rows of the array.
+%
+% \begin{macrocode}
+ }
+ \int_zero:N \l_tmpa_int
+ \str_if_eq:nnT { #1 } { \q_stop } { \bool_gset_true:N \g_tmpb_bool }
+ \@@_patch_preamble:n #1
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_xiv:n #1
+ {
+ \tl_gput_right:Nn \g_@@_pre_cell_tl { > { #1 } }
+ \@@_patch_preamble:n
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\bool_new:N \l_@@_bar_at_end_of_pream_bool
+% \end{macrocode}
+%
+% \bigskip
+% The specifier |p| (and also the specifiers |m|, |b|, |V| and |X|) have an
+% optional argument between square brackets for a list of
+% \emph{key}-\emph{value} pairs. Here are the corresponding keys.
+% \begin{macrocode}
+\keys_define:nn { WithArrows / p-column }
+ {
+ r .code:n = \str_set:Nn \l_@@_hpos_col_str { r } ,
+ r .value_forbidden:n = true ,
+ c .code:n = \str_set:Nn \l_@@_hpos_col_str { c } ,
+ c .value_forbidden:n = true ,
+ l .code:n = \str_set:Nn \l_@@_hpos_col_str { l } ,
+ l .value_forbidden:n = true ,
+ R .code:n =
+ \IfPackageLoadedTF { ragged2e }
+ { \str_set:Nn \l_@@_hpos_col_str { R } }
+ {
+ \@@_error_or_warning:n { ragged2e~not~loaded }
+ \str_set:Nn \l_@@_hpos_col_str { r }
+ } ,
+ R .value_forbidden:n = true ,
+ L .code:n =
+ \IfPackageLoadedTF { ragged2e }
+ { \str_set:Nn \l_@@_hpos_col_str { L } }
+ {
+ \@@_error_or_warning:n { ragged2e~not~loaded }
+ \str_set:Nn \l_@@_hpos_col_str { l }
+ } ,
+ L .value_forbidden:n = true ,
+ C .code:n =
+ \IfPackageLoadedTF { ragged2e }
+ { \str_set:Nn \l_@@_hpos_col_str { C } }
+ {
+ \@@_error_or_warning:n { ragged2e~not~loaded }
+ \str_set:Nn \l_@@_hpos_col_str { c }
+ } ,
+ C .value_forbidden:n = true ,
+ S .code:n = \str_set:Nn \l_@@_hpos_col_str { si } ,
+ S .value_forbidden:n = true ,
+ p .code:n = \str_set:Nn \l_@@_vpos_col_str { p } ,
+ p .value_forbidden:n = true ,
+ t .meta:n = p ,
+ m .code:n = \str_set:Nn \l_@@_vpos_col_str { m } ,
+ m .value_forbidden:n = true ,
+ b .code:n = \str_set:Nn \l_@@_vpos_col_str { b } ,
+ b .value_forbidden:n = true ,
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% For |p|, |b| and |m|. The argument |#1| is that value : |p|, |b| or |m|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv:n #1
+ {
+ \str_set:Nn \l_@@_vpos_col_str { #1 }
+% \end{macrocode}
+% Now, you look for a potential character |[| after the letter of the specifier
+% (for the options).
+% \begin{macrocode}
+ \@@_patch_preamble_iv_i:n
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv_i:n #1
+ {
+ \str_if_eq:nnTF { #1 } { [ }
+ { \@@_patch_preamble_iv_ii:w [ }
+ { \@@_patch_preamble_iv_ii:w [ ] { #1 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv_ii:w [ #1 ]
+ { \@@_patch_preamble_iv_iii:nn { #1 } }
+% \end{macrocode}
+%
+% \medskip
+% |#1| is the optional argument of the specifier (a list of
+% \emph{key}-\emph{value} pairs).
+%
+% |#2| is the mandatory argument of the specifier: the width of the column.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv_iii:nn #1 #2
+ {
+% \end{macrocode}
+% The possible values of |\l_@@_hpos_col_str| are |j| (for \emph{justified} which is
+% the initial value), |l|, |c|, |r|, |L|, |C| and |R| (when the user has used
+% the corresponding key in the optional argument of the specifier).
+% \begin{macrocode}
+ \str_set:Nn \l_@@_hpos_col_str { j }
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S }
+ \@@_keys_p_column:V \l_tmpa_tl
+ \@@_patch_preamble_iv_iv:nn { #2 } { minipage }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_keys_p_column:n #1
+ { \keys_set_known:nnN { WithArrows / p-column } { #1 } \l_tmpa_tl }
+\cs_generate_variant:Nn \@@_keys_p_column:n { V }
+% \end{macrocode}
+%
+% \medskip
+% The first argument is the width of the column. The second is the type of
+% environment: |minipage| or |varwidth|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv_iv:nn #1 #2
+ {
+ \use:x
+ {
+ \@@_patch_preamble_iv_v:nnnnnnnn
+ { \str_if_eq:VnTF \l_@@_vpos_col_str { p } { t } { b } }
+ { \dim_eval:n { #1 } }
+ {
+% \end{macrocode}
+% The parameter |\l_@@_hpos_col_str| (as |\l_@@_vpos_col_str|) exists only
+% during the construction of the preamble. During the composition of the array
+% itself, you will have, in each cell, the parameter |\l_@@_hpos_cell_str| which
+% will provide the horizontal alignment of the column to which belongs the cell.
+% \begin{macrocode}
+ \str_if_eq:VnTF \l_@@_hpos_col_str j
+ { \str_set:Nn \exp_not:N \l_@@_hpos_cell_str { c } }
+ {
+ \str_set:Nn \exp_not:N \l_@@_hpos_cell_str
+ { \str_lowercase:V \l_@@_hpos_col_str }
+ }
+ \str_case:Vn \l_@@_hpos_col_str
+ {
+ c { \exp_not:N \centering }
+ l { \exp_not:N \raggedright }
+ r { \exp_not:N \raggedleft }
+ C { \exp_not:N \Centering }
+ L { \exp_not:N \RaggedRight }
+ R { \exp_not:N \RaggedLeft }
+ }
+ }
+ { \str_if_eq:VnT \l_@@_vpos_col_str { m } \@@_center_cell_box: }
+ { \str_if_eq:VnT \l_@@_hpos_col_str { si } \siunitx_cell_begin:w }
+ { \str_if_eq:VnT \l_@@_hpos_col_str { si } \siunitx_cell_end: }
+ { #2 }
+ {
+ \str_case:VnF \l_@@_hpos_col_str
+ {
+ { j } { c }
+ { si } { c }
+ }
+% \end{macrocode}
+% We use |\str_lowercase:n| to convert |R| to |r|, etc.
+% \begin{macrocode}
+ { \str_lowercase:V \l_@@_hpos_col_str }
+ }
+ }
+% \end{macrocode}
+%
+% We increment the counter of columns, and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c at jCol
+ \@@_patch_preamble_xi:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% |#1| is the optional argument of |{minipage}| (or |{varwidth}|): |t| of |b|.
+% Indeed, for the columns of type |m|, we use the value |b| here because there
+% is a special post-action in order to center vertically the box (see |#4|).
+%
+% |#2| is the width of the |{minipage}| (or |{varwidth}|), that is to say also
+% the width of the column.
+%
+% |#3| is the coding for the horizontal position of the content of the cell
+% (|\centering|, |\raggedright|, |\raggedleft| or nothing). It's also possible
+% to put in that |#3| some code to fix the value of |\l_@@_hpos_cell_str| which
+% will be available in each cell of the column.
+%
+% |#4| is an extra-code which contains |\@@_center_cell_box:| (when the column
+% is a |m| column) or nothing (in the other cases).
+%
+% |#5| is a code put just before the |c| (or |r| or |l|: see |#8|).
+%
+% |#6| is a code put just after the |c| (or |r| or |l|: see |#8|).
+%
+% |#7| is the type of environment: |minipage| or |varwidth|.
+%
+% |#8| is the letter |c| or |r| or |l| which is the basic specificier of column
+% which is used \emph{in fine}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_iv_v:nnnnnnnn #1 #2 #3 #4 #5 #6 #7 #8
+ {
+ \str_if_eq:VnTF \l_@@_hpos_col_str { si }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_test_if_empty_for_S: } } }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_test_if_empty: } } }
+ \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl
+ \tl_gclear:N \g_@@_pre_cell_tl
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+% \end{macrocode}
+% The parameter |\l_@@_col_width_dim|, which is the width of the current column,
+% will be available in each cell of the column. It will be used by the
+% mono-column blocks.
+% \begin{macrocode}
+ \dim_set:Nn \l_@@_col_width_dim { #2 }
+ \@@_cell_begin:w
+ \begin { #7 } [ #1 ] { #2 }
+% \end{macrocode}
+% The following lines have been taken from |array.sty|.
+% \begin{macrocode}
+ \everypar
+ {
+ \vrule height \box_ht:N \@arstrutbox width \c_zero_dim
+ \everypar { }
+ }
+% \end{macrocode}
+% Now, the potential code for the horizontal position of the content of the cell
+% (|\centering|, |\raggedright|, |\RaggedRight|, etc.).
+% \begin{macrocode}
+ #3
+% \end{macrocode}
+% The following code is to allow something like |\centering| in |\RowStyle|.
+% \begin{macrocode}
+ \g_@@_row_style_tl
+ \arraybackslash
+ #5
+ }
+ #8
+ < {
+ #6
+% \end{macrocode}
+% The following line has been taken from |array.sty|.
+% \begin{macrocode}
+ \@finalstrut \@arstrutbox
+ % \bool_if:NT \g_@@_rotate_bool { \raggedright \hsize = 3 cm }
+ \end { #7 }
+% \end{macrocode}
+% If the letter in the preamble is |m|, |#4| will be equal to
+% |\@@_center_cell_box:| (see just below).
+% \begin{macrocode}
+ #4
+ \@@_cell_end:
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_empty: \ignorespaces #1
+ {
+ \peek_meaning:NT \unskip
+ {
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl
+ {
+ \box_set_wd:Nn \l_@@_cell_box \c_zero_dim
+% \end{macrocode}
+% We put the following code in order to have a column with the correct width
+% even when all the cells of the column are empty.
+% \begin{macrocode}
+ \skip_horizontal:N \l_@@_col_width_dim
+ }
+ }
+ #1
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_empty_for_S: #1
+ {
+ \peek_meaning:NT \__siunitx_table_skip:n
+ {
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl
+ { \box_set_wd:Nn \l_@@_cell_box \c_zero_dim }
+ }
+ #1
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command will be used in |m|-columns in order to center
+% vertically the box. In fact, despite its name, the command does not always
+% center the cell. Indeed, if there is only one row in the cell, it should not
+% be centered vertically. It's not possible to know the number of rows of the
+% cell. However, we consider (as in \pkg{array}) that if the height of the cell
+% is no more that the height of |\@arstrutbox|, there is only one row.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_center_cell_box:
+ {
+% \end{macrocode}
+% By putting instructions in |\g_@@_cell_after_hook_tl|, we require a
+% post-action of the box |\l_@@_cell_box|.
+% \begin{macrocode}
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl
+ {
+ \int_compare:nNnT
+ { \box_ht:N \l_@@_cell_box }
+ >
+% \end{macrocode}
+% Previously, we had |\@arstrutbox| and not |\strutbox| in the following line
+% but the code in \pkg{array} has changed in v 2.5g and we follow the change
+% (see \emph{array: Correctly identify single-line m-cells} in LaTeX~News~36).
+% \begin{macrocode}
+ { \box_ht:N \strutbox }
+ {
+ \hbox_set:Nn \l_@@_cell_box
+ {
+ \box_move_down:nn
+ {
+ ( \box_ht:N \l_@@_cell_box - \box_ht:N \@arstrutbox
+ + \baselineskip ) / 2
+ }
+ { \box_use:N \l_@@_cell_box }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |V| (similar to the |V| of \pkg{varwidth}).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_v:n #1
+ {
+ \str_if_eq:nnTF { #1 } { [ }
+ { \@@_patch_preamble_v_i:w [ }
+ { \@@_patch_preamble_v_i:w [ ] { #1 } }
+ }
+\cs_new_protected:Npn \@@_patch_preamble_v_i:w [ #1 ]
+ { \@@_patch_preamble_v_ii:nn { #1 } }
+\cs_new_protected:Npn \@@_patch_preamble_v_ii:nn #1 #2
+ {
+ \str_set:Nn \l_@@_vpos_col_str { p }
+ \str_set:Nn \l_@@_hpos_col_str { j }
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S }
+ \@@_keys_p_column:V \l_tmpa_tl
+ \IfPackageLoadedTF { varwidth }
+ { \@@_patch_preamble_iv_iv:nn { #2 } { varwidth } }
+ {
+ \@@_error_or_warning:n { varwidth~not~loaded }
+ \@@_patch_preamble_iv_iv:nn { #2 } { minipage }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |w| and |W|
+%
+% |#1| is a special argument: empty for |w| and equal to |\@@_special_W:| for |W|;
+%
+% |#2| is the type of column (|w| or |W|);
+%
+% |#3| is the type of horizontal alignment (|c|, |l|, |r| or |s|);
+%
+% |#4| is the width of the column.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vi:nnnn #1 #2 #3 #4
+ {
+ \str_if_eq:nnTF { #3 } { s }
+ { \@@_patch_preamble_vi_i:nnnn { #1 } { #4 } }
+ { \@@_patch_preamble_vi_ii:nnnn { #1 } { #2 } { #3 } { #4 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% First, the case of an horizontal alignment equal to |s| (for \emph{stretch}).
+%
+% |#1| is a special argument: empty for |w| and equal to |\@@_special_W:| for
+% |W|;
+%
+% |#2| is the width of the column.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vi_i:nnnn #1 #2
+ {
+ \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl
+ \tl_gclear:N \g_@@_pre_cell_tl
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \dim_set:Nn \l_@@_col_width_dim { #2 }
+ \@@_cell_begin:w
+ \str_set:Nn \l_@@_hpos_cell_str { c }
+ }
+ c
+ < {
+ \@@_cell_end_for_w_s:
+ #1
+ \@@_adjust_size_box:
+ \box_use_drop:N \l_@@_cell_box
+ }
+ }
+ \int_gincr:N \c at jCol
+ \@@_patch_preamble_xi:n
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Then, the most important version, for the horizontal alignments types of |c|,
+% |l| and |r| (and not |s|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vi_ii:nnnn #1 #2 #3 #4
+ {
+ \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl
+ \tl_gclear:N \g_@@_pre_cell_tl
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+% \end{macrocode}
+% The parameter |\l_@@_col_width_dim|, which is the width of the current column,
+% will be available in each cell of the column. It will be used by the
+% mono-column blocks.
+% \begin{macrocode}
+ \dim_set:Nn \l_@@_col_width_dim { #4 }
+ \hbox_set:Nw \l_@@_cell_box
+ \@@_cell_begin:w
+ \str_set:Nn \l_@@_hpos_cell_str { #3 }
+ }
+ c
+ < {
+ \@@_cell_end:
+ \hbox_set_end:
+ % The following line is probably pointless
+ % \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ #1
+ \@@_adjust_size_box:
+ \makebox [ #4 ] [ #3 ] { \box_use_drop:N \l_@@_cell_box }
+ }
+ }
+% \end{macrocode}
+% We increment the counter of columns and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c at jCol
+ \@@_patch_preamble_xi:n
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_special_W:
+ {
+ \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } > \l_@@_col_width_dim
+ { \@@_warning:n { W~warning } }
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |\@@_S:|. If the user has used |S[...]|, |S| has been replaced by |\@@_S:|
+% during the first expansion of the preamble (done with the tools of standard
+% LaTeX and \pkg{array}).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vii:n #1
+ {
+ \str_if_eq:nnTF { #1 } { [ }
+ { \@@_patch_preamble_vii_i:w [ }
+ { \@@_patch_preamble_vii_i:w [ ] { #1 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vii_i:w [ #1 ]
+ { \@@_patch_preamble_vii_ii:n { #1 } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_vii_ii:n #1
+ {
+ \IfPackageAtLeastTF { siunitx } { 2022/01/01 }
+ {
+ \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl
+ \tl_gclear:N \g_@@_pre_cell_tl
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \@@_cell_begin:w
+ \keys_set:nn { siunitx } { #1 }
+ \siunitx_cell_begin:w
+ }
+ c
+ < { \siunitx_cell_end: \@@_cell_end: }
+ }
+% \end{macrocode}
+% We increment the counter of columns and then we test for the presence of a |<|.
+% \begin{macrocode}
+ \int_gincr:N \c at jCol
+ \@@_patch_preamble_xi:n
+ }
+ { \@@_fatal:n { Version~of~siunitx~too~old } }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% For |(|, |[| and |\{|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_viii:nn #1 #2
+ {
+ \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } }
+% \end{macrocode}
+% If we are before the column 1 and not in |{NiceArray}|, we reserve space for
+% the left delimiter.
+% \begin{macrocode}
+ \int_compare:nNnTF \c at jCol = \c_zero_int
+ {
+ \str_if_eq:VnTF \g_@@_left_delim_tl { . }
+ {
+% \end{macrocode}
+% In that case, in fact, the first letter of the preamble must be considered as
+% the left delimiter of the array.
+% \begin{macrocode}
+ \tl_gset:Nn \g_@@_left_delim_tl { #1 }
+ \tl_gset:Nn \g_@@_right_delim_tl { . }
+ \@@_patch_preamble:n #2
+ }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } }
+ \@@_patch_preamble_viii_i:nn { #1 } { #2 }
+ }
+ }
+ { \@@_patch_preamble_viii_i:nn { #1 } { #2 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_viii_i:nn #1 #2
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_eval:n { \c at jCol + 1 } } \c_true_bool }
+ \tl_if_in:nnTF { ( [ \{ ) ] \} \left \right } { #2 }
+ {
+ \@@_error:nn { delimiter~after~opening } { #2 }
+ \@@_patch_preamble:n
+ }
+ { \@@_patch_preamble:n #2 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% For the closing delimiters. We have two arguments for the following command because
+% we directly read the following letter in the preamble (we have to see whether
+% we have a opening delimiter following and we also have to see whether we are
+% at the end of the preamble because, in that case, our letter must be
+% considered as the right delimiter of the environment if the environment is
+% |{NiceArray}|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_ix:nn #1 #2
+ {
+ \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } }
+ \tl_if_in:nnTF { ) ] \} } { #2 }
+ { \@@_patch_preamble_ix_i:nnn #1 #2 }
+ {
+ \tl_if_eq:nnTF { \q_stop } { #2 }
+ {
+ \str_if_eq:VnTF \g_@@_right_delim_tl { . }
+ { \tl_gset:Nn \g_@@_right_delim_tl { #1 } }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+ \@@_patch_preamble:n #2
+ }
+ }
+ {
+ \tl_if_in:nnT { ( [ \{ \left } { #2 }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+ \@@_patch_preamble:n #2
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_ix_i:nnn #1 #2 #3
+ {
+ \tl_if_eq:nnTF { \q_stop } { #3 }
+ {
+ \str_if_eq:VnTF \g_@@_right_delim_tl { . }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+ \tl_gset:Nn \g_@@_right_delim_tl { #2 }
+ }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+ \@@_error:nn { double~closing~delimiter } { #2 }
+ }
+ }
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ { \@@_delimiter:nnn #1 { \int_use:N \c at jCol } \c_false_bool }
+ \@@_error:nn { double~closing~delimiter } { #2 }
+ \@@_patch_preamble:n #3
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% For the case of a letter |X|. This specifier may take in an optional argument
+% (between square brackets). That's why we test whether there is a |[| after the
+% letter |X|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_x:n #1
+ {
+ \str_if_eq:nnTF { #1 } { [ }
+ { \@@_patch_preamble_x_i:w [ }
+ { \@@_patch_preamble_x_i:w [ ] #1 }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_x_i:w [ #1 ]
+ { \@@_patch_preamble_x_ii:n { #1 } }
+% \end{macrocode}
+% |#1| is the optional argument of the |X| specifier (a list of
+% \emph{key}-\emph{value} pairs).
+%
+% \medskip
+% The following set of keys is for the specifier |X| in the preamble of the
+% array. Such specifier may have as keys all the keys of
+% |{ WithArrows / p-column }| but also a key as 1, 2, 3, etc. The following set
+% of keys will be used to retrieve that value (in the counter |\l_@@_weight_int|).
+% \begin{macrocode}
+\keys_define:nn { WithArrows / X-column }
+ { unknown .code:n = \int_set:Nn \l_@@_weight_int { \l_keys_key_str } }
+% \end{macrocode}
+%
+%
+% \medskip
+% In the following command, |#1| is the list of the options of the specifier |X|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_x_ii:n #1
+ {
+% \end{macrocode}
+% The possible values of |\l_@@_hpos_col_str| are |j| (for \emph{justified} which is
+% the initial value), |l|, |c| and |r| (when the user has used the corresponding
+% key in the optional argument of the specifier |X|).
+% \begin{macrocode}
+ \str_set:Nn \l_@@_hpos_col_str { j }
+% \end{macrocode}
+% The possible values of |\l_@@_vpos_col_str| are |p| (the initial value), |m| and |b|
+% (when the user has used the corresponding key in the optional argument of the
+% specifier |X|).
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_vpos_col_str { p }
+% \end{macrocode}
+%
+% The integer |\l_@@_weight_int| will be the weight of the |X| column (the
+% initial value is $1$). The user may specify a different value (such as $2$,
+% $3$, etc.) by putting that value in the optional argument of the specifier.
+% The weights of the |X| columns are used in the computation of the actual width
+% of those columns as in \pkg{tabu} (now obsolete) or \pkg{tabularray}.
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_weight_int
+ \int_set:Nn \l_@@_weight_int { 1 }
+ \tl_set:Nn \l_tmpa_tl { #1 }
+ \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S }
+ \@@_keys_p_column:V \l_tmpa_tl
+ \keys_set:nV { WithArrows / X-column } \l_tmpa_tl
+ \int_compare:nNnT \l_@@_weight_int < 0
+ {
+ \@@_error_or_warning:n { negative~weight }
+ \int_set:Nn \l_@@_weight_int { - \l_@@_weight_int }
+ }
+ \int_gadd:Nn \g_@@_total_X_weight_int \l_@@_weight_int
+% \end{macrocode}
+%
+% We test whether we know the width of the |X|-columns by reading the |aux| file
+% (after the first compilation, the width of the |X|-columns is computed and
+% written in the |aux| file).
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_X_columns_aux_bool
+ {
+ \exp_args:Nnx
+ \@@_patch_preamble_iv_iv:nn
+ { \l_@@_weight_int \l_@@_X_columns_dim }
+ { minipage }
+ }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \@@_cell_begin:w
+ \bool_set_true:N \l_@@_X_column_bool
+% \end{macrocode}
+% You encounter a problem on 2023-03-04: for an environment with |X| columns,
+% during the first compilations (which are not the definitive one), sometimes,
+% some cells are declared empty even if they should not. That's a problem
+% because user's instructions may use these nodes. That's why we have added the
+% following |\NotEmpty|.
+% \begin{macrocode}
+ \NotEmpty
+% \end{macrocode}
+% The following code will nullify the box of the cell.
+% \begin{macrocode}
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl
+ { \hbox_set:Nn \l_@@_cell_box { } }
+% \end{macrocode}
+% We put a |{minipage}| to give to the user the ability to put a command such as
+% |\centering| in the |\RowStyle|.
+% \begin{macrocode}
+ \begin { minipage } { 5 cm } \arraybackslash
+ }
+ c
+ < {
+ \end { minipage }
+ \@@_cell_end:
+ }
+ }
+ \int_gincr:N \c at jCol
+ \@@_patch_preamble_xi:n
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% After a specifier of column, we have to test whether there is one or several
+% |<{..}| because, after those potential |<{...}|, we have to insert
+% |!{\skip_horizontal:N ...}| when the key |vlines| is used. In fact, we have
+% also to test whether there is, after the |<{...}|, a |@{...}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_xi:n #1
+ {
+ \str_if_eq:nnTF { #1 } { < }
+ \@@_patch_preamble_xiii:n
+ {
+ \str_if_eq:nnTF { #1 } { @ }
+ \@@_patch_preamble_xv:n
+ {
+ \tl_if_eq:NnTF \l_@@_vlines_clist { all }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N \arrayrulewidth } }
+ }
+ {
+ \exp_args:NNx
+ \clist_if_in:NnT \l_@@_vlines_clist { \int_eval:n { \c at jCol + 1 } }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { ! { \skip_horizontal:N \arrayrulewidth } }
+ }
+ }
+ \@@_patch_preamble:n { #1 }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_xiii:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } }
+ \@@_patch_preamble_xi:n
+ }
+% \end{macrocode}
+%
+% We have to catch a |@{...}| after a specifier of column because, if we have to
+% draw a vertical rule, we have to add in that |@{...}| a |\hskip| corresponding
+% to the width of the vertical rule.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_preamble_xv:n #1
+ {
+ \tl_if_eq:NnTF \l_@@_vlines_clist { all }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { @ { #1 \skip_horizontal:N \arrayrulewidth } }
+ }
+ {
+ \exp_args:NNx
+ \clist_if_in:NnTF \l_@@_vlines_clist { \int_eval:n { \c at jCol + 1 } }
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ { @ { #1 \skip_horizontal:N \arrayrulewidth } }
+ }
+ { \tl_gput_right:Nn \g_@@_preamble_tl { @ { #1 } } }
+ }
+ \@@_patch_preamble:n
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_preamble:Nn #1 #2
+ {
+ \group_begin:
+ \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } }
+ \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } }
+ \@temptokena { #2 }
+ \@tempswatrue
+ \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
+ \tl_gclear:N \g_@@_preamble_tl
+ \exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop
+ \group_end:
+ \tl_set_eq:NN #1 \g_@@_preamble_tl
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The redefinition of \textbackslash multicolumn}
+%
+% \medskip
+% The following command must \emph{not} be protected since it begins with
+% |\multispan| (a TeX primitive).
+% \begin{macrocode}
+\cs_new:Npn \@@_multicolumn:nnn #1 #2 #3
+ {
+% \end{macrocode}
+% The following lines are from the definition of |\multicolumn| in \pkg{array}
+% (and \emph{not} in standard LaTeX). The first line aims to raise an error if
+% the user has put more that one column specifier in the preamble of
+% |\multicolumn|.
+% \begin{macrocode}
+ \multispan { #1 }
+ \begingroup
+ \cs_set:Npn \@addamp { \if at firstamp \@firstampfalse \else \@preamerr 5 \fi }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } }
+ \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } }
+% \end{macrocode}
+%
+% \medskip
+% You do the expansion of the (small) preamble with the tools of \pkg{array}.
+% \begin{macrocode}
+ \@temptokena = { #2 }
+ \@tempswatrue
+ \@whilesw \if at tempswa \fi { \@tempswafalse \the \NC at list }
+% \end{macrocode}
+%
+% \medskip
+% Now, we patch the (small) preamble as we have done with the main preamble of
+% the array.
+% \begin{macrocode}
+ \tl_gclear:N \g_@@_preamble_tl
+ \exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop
+% \end{macrocode}
+%
+% \medskip
+% The following lines are an adaptation of the definition of |\multicolumn| in
+% \pkg{array}.
+% \begin{macrocode}
+ \exp_args:NV \@mkpream \g_@@_preamble_tl
+ \@addtopreamble \@empty
+ \endgroup
+% \end{macrocode}
+%
+% \medskip
+% Now, you do a treatment specific to \pkg{nicematrix} which has no equivalent
+% in the original definition of |\multicolumn|.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } > 1
+ {
+ \seq_gput_left:Nx \g_@@_multicolumn_cells_seq
+ { \int_use:N \c at iRow - \int_eval:n { \c at jCol + 1 } }
+ \seq_gput_left:Nn \g_@@_multicolumn_sizes_seq { #1 }
+ \seq_gput_right:Nx \g_@@_pos_of_blocks_seq
+ {
+ {
+ \int_compare:nNnTF \c at jCol = 0
+ { \int_eval:n { \c at iRow + 1 } }
+ { \int_use:N \c at iRow }
+ }
+ { \int_eval:n { \c at jCol + 1 } }
+ {
+ \int_compare:nNnTF \c at jCol = 0
+ { \int_eval:n { \c at iRow + 1 } }
+ { \int_use:N \c at iRow }
+ }
+ { \int_eval:n { \c at jCol + #1 } }
+ { } % for the name of the block
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following lines were in the original definition of |\multicolumn|.
+% \begin{macrocode}
+ \cs_set:Npn \@sharp { #3 }
+ \@arstrut
+ \@preamble
+ \null
+% \end{macrocode}
+%
+% \medskip
+% We add some lines.
+% \begin{macrocode}
+ \int_gadd:Nn \c at jCol { #1 - 1 }
+ \int_compare:nNnT \c at jCol > \g_@@_col_total_int
+ { \int_gset_eq:NN \g_@@_col_total_int \c at jCol }
+ \ignorespaces
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following commands will patch the (small) preamble of the |\multicolumn|.
+% All those commands have a |m| in their name to recall that they deal with the
+% redefinition of |\multicolumn|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble:n #1
+ {
+ \str_case:nnF { #1 }
+ {
+ c { \@@_patch_m_preamble_i:n #1 }
+ l { \@@_patch_m_preamble_i:n #1 }
+ r { \@@_patch_m_preamble_i:n #1 }
+ > { \@@_patch_m_preamble_ii:nn #1 }
+ ! { \@@_patch_m_preamble_ii:nn #1 }
+ @ { \@@_patch_m_preamble_ii:nn #1 }
+ | { \@@_patch_m_preamble_iii:n #1 }
+ p { \@@_patch_m_preamble_iv:nnn t #1 }
+ m { \@@_patch_m_preamble_iv:nnn c #1 }
+ b { \@@_patch_m_preamble_iv:nnn b #1 }
+ \@@_w: { \@@_patch_m_preamble_v:nnnn { } #1 }
+ \@@_W: { \@@_patch_m_preamble_v:nnnn { \@@_special_W: } #1 }
+ \q_stop { }
+ }
+ {
+ \tl_if_eq:nnT { #1 } { S }
+ { \@@_fatal:n { unknown~column~type~S } }
+ { \@@_fatal:nn { unknown~column~type } { #1 } }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |c|, |l| and |r|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_i:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > { \@@_cell_begin:w \str_set:Nn \l_@@_hpos_cell_str { #1 } }
+ #1
+ < \@@_cell_end:
+ }
+% \end{macrocode}
+%
+% We test for the presence of a |<|.
+% \begin{macrocode}
+ \@@_patch_m_preamble_x:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |>|, |!| and |@|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_ii:nn #1 #2
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } }
+ \@@_patch_m_preamble:n
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% For \verb+|+
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_iii:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { #1 }
+ \@@_patch_m_preamble:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |p|, |m| and |b|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_iv:nnn #1 #2 #3
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \@@_cell_begin:w
+ \begin { minipage } [ #1 ] { \dim_eval:n { #3 } }
+ \mode_leave_vertical:
+ \arraybackslash
+ \vrule height \box_ht:N \@arstrutbox depth 0 pt width 0 pt
+ }
+ c
+ < {
+ \vrule height 0 pt depth \box_dp:N \@arstrutbox width 0 pt
+ \end { minipage }
+ \@@_cell_end:
+ }
+ }
+% \end{macrocode}
+% We test for the presence of a |<|.
+% \begin{macrocode}
+ \@@_patch_m_preamble_x:n
+ }
+% \end{macrocode}
+%
+% \medskip
+% For |w| and |W|
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_v:nnnn #1 #2 #3 #4
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl
+ {
+ > {
+ \dim_set:Nn \l_@@_col_width_dim { #4 }
+ \hbox_set:Nw \l_@@_cell_box
+ \@@_cell_begin:w
+ \str_set:Nn \l_@@_hpos_cell_str { #3 }
+ }
+ c
+ < {
+ \@@_cell_end:
+ \hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ #1
+ \@@_adjust_size_box:
+ \makebox [ #4 ] [ #3 ] { \box_use_drop:N \l_@@_cell_box }
+ }
+ }
+% \end{macrocode}
+% We test for the presence of a |<|.
+% \begin{macrocode}
+ \@@_patch_m_preamble_x:n
+ }
+% \end{macrocode}
+%
+%
+% After a specifier of column, we have to test whether there is one or several
+% |<{..}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_x:n #1
+ {
+ \str_if_eq:nnTF { #1 } { < }
+ \@@_patch_m_preamble_ix:n
+ { \@@_patch_m_preamble:n { #1 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_patch_m_preamble_ix:n #1
+ {
+ \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } }
+ \@@_patch_m_preamble_x:n
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The command |\@@_put_box_in_flow:| puts the box |\l_tmpa_box| (which contains
+% the array) in the flow. It is used for the environments with delimiters.
+% First, we have to modify the height and the depth to take back into account
+% the potential exterior rows (the total height of the first row has been
+% computed in |\l_tmpa_dim| and the total height of the potential last row in
+% |\l_tmpb_dim|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_put_box_in_flow:
+ {
+ \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + \l_tmpa_dim }
+ \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + \l_tmpb_dim }
+ \tl_if_eq:NnTF \l_@@_baseline_tl { c }
+ { \box_use_drop:N \l_tmpa_box }
+ \@@_put_box_in_flow_i:
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_put_box_in_flow_i:| is used when the value of
+% |\l_@@_baseline_tl| is different of |c| (which is the initial value and the
+% most used).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_put_box_in_flow_i:
+ {
+ \pgfpicture
+ \@@_qpoint:n { row - 1 }
+ \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+ \@@_qpoint:n { row - \int_eval:n { \c at iRow + 1 } }
+ \dim_gadd:Nn \g_tmpa_dim \pgf at y
+ \dim_gset:Nn \g_tmpa_dim { 0.5 \g_tmpa_dim }
+% \end{macrocode}
+% Now, |\g_tmpa_dim| contains the $y$-value of the center of the array (the
+% delimiters are centered in relation with this value).
+% \begin{macrocode}
+ \str_if_in:NnTF \l_@@_baseline_tl { line- }
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \str_range:Nnn
+ \l_@@_baseline_tl
+ 6
+ { \tl_count:V \l_@@_baseline_tl }
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int }
+ }
+ {
+ \str_case:VnF \l_@@_baseline_tl
+ {
+ { t } { \int_set:Nn \l_tmpa_int 1 }
+ { b } { \int_set_eq:NN \l_tmpa_int \c at iRow }
+ }
+ { \int_set:Nn \l_tmpa_int \l_@@_baseline_tl }
+ \bool_lazy_or:nnT
+ { \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int }
+ { \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int }
+ {
+ \@@_error:n { bad~value~for~baseline }
+ \int_set:Nn \l_tmpa_int 1
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
+% \end{macrocode}
+% We take into account the position of the mathematical axis.
+% \begin{macrocode}
+ \dim_gsub:Nn \g_tmpa_dim { \fontdimen22 \textfont2 }
+ }
+ \dim_gsub:Nn \g_tmpa_dim \pgf at y
+% \end{macrocode}
+% Now, |\g_tmpa_dim| contains the value of the $y$ translation we have to to.
+% \begin{macrocode}
+ \endpgfpicture
+ \box_move_up:nn \g_tmpa_dim { \box_use_drop:N \l_tmpa_box }
+ \box_use_drop:N \l_tmpa_box
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command is \emph{always} used by |{NiceArrayWithDelims}| (even
+% if, in fact, there is no tabular notes: in fact, it's not possible to know
+% whether there is tabular notes or not before the composition of the blocks).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes_c:
+ {
+% \end{macrocode}
+% With an environment |{Matrix}|, you want to remove the exterior |\arraycolsep|
+% but we don't know the number of columns (since there is no preamble) and
+% that's why we can't put |@{}| at the end of the preamble. That's why we remove
+% a |\arraycolsep| now.
+% \begin{macrocode}
+ \bool_lazy_and:nnT \l_@@_Matrix_bool \g_@@_NiceArray_bool
+ {
+ \box_set_wd:Nn \l_@@_the_array_box
+ { \box_wd:N \l_@@_the_array_box - \arraycolsep }
+ }
+% \end{macrocode}
+% We need a |{minipage}| because we will insert a LaTeX list for the tabular
+% notes (that means that a |\vtop{\hsize=...}| is not enough).
+% \begin{macrocode}
+ \begin { minipage } [ t ] { \box_wd:N \l_@@_the_array_box }
+ \bool_if:NT \l_@@_caption_above_bool
+ {
+ \tl_if_empty:NF \l_@@_caption_tl
+ {
+% \end{macrocode}
+% \begin{macrocode}
+ \bool_set_false:N \g_@@_caption_finished_bool
+ \int_gzero:N \c at tabularnote
+ \@@_insert_caption:
+% \end{macrocode}
+% If there is one or several commands |\tabularnote| in the caption, we will
+% write in the |aux| file the number of such tabular notes... but only the
+% tabular notes for which the command |\tabularnote| has been used without its
+% optional argument (between square brackets).
+% \begin{macrocode}
+ \int_compare:nNnT \g_@@_notes_caption_int > 0
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \tl_set:Nn \exp_not:N \l_@@_note_in_caption_tl
+ { \int_use:N \g_@@_notes_caption_int }
+ }
+ \int_gzero:N \g_@@_notes_caption_int
+ }
+ }
+ }
+% \end{macrocode}
+% The |\hbox| avoids that the |pgfpicture| inside |\@@_draw_blocks| adds a extra
+% vertical space before the notes.
+% \begin{macrocode}
+ \hbox
+ {
+ \box_use_drop:N \l_@@_the_array_box
+% \end{macrocode}
+% We have to draw the blocks right now because there may be tabular notes in
+% some blocks (which are not mono-column: the blocks which are mono-column
+% have been composed in boxes yet)... and we have to create (potentially) the
+% extra nodes before creating the blocks since there are |medium| nodes to create
+% for the blocks.
+% \begin{macrocode}
+ \@@_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_any:nT
+ {
+ { ! \seq_if_empty_p:N \g_@@_notes_seq }
+ { ! \seq_if_empty_p:N \g_@@_notes_in_caption_seq }
+ { ! \tl_if_empty_p:V \g_@@_tabularnote_tl }
+ }
+ \@@_insert_tabularnotes:
+ \cs_set_eq:NN \tabularnote \@@_tabularnote_error:n
+ \bool_if:NF \l_@@_caption_above_bool \@@_insert_caption:
+ \end { minipage }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_insert_caption:
+ {
+ \tl_if_empty:NF \l_@@_caption_tl
+ {
+ \cs_if_exist:NTF \@captype
+ { \@@_insert_caption_i: }
+ { \@@_error:n { caption~outside~float } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_insert_caption_i:
+ {
+ \group_begin:
+% \end{macrocode}
+% The flag |\l_@@_in_caption_bool| affects only the behaviour of the command
+% |\tabularnote| when used in the caption.
+% \begin{macrocode}
+ \bool_set_true:N \l_@@_in_caption_bool
+% \end{macrocode}
+% The package \pkg{floatrow} does a redefinition of |\@makecaption| which will
+% extract the caption from the tabular. However, the old version of
+% |\@makecaption| has been stored by \pkg{floatrow} in |\FR at makecaption|. That's
+% why we restore the old version.
+% \begin{macrocode}
+ \IfPackageLoadedTF { floatrow }
+ { \cs_set_eq:NN \@makecaption \FR at makecaption }
+ { }
+ \tl_if_empty:NTF \l_@@_short_caption_tl
+ { \caption }
+ { \caption [ \l_@@_short_caption_tl ] }
+ { \l_@@_caption_tl }
+ \tl_if_empty:NF \l_@@_label_tl { \label { \l_@@_label_tl } }
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_tabularnote_error:n #1
+ {
+ \@@_error_or_warning:n { tabularnote~below~the~tabular }
+ \@@_gredirect_none:n { tabularnote~below~the~tabular }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_insert_tabularnotes:
+ {
+ \seq_gconcat:NNN \g_@@_notes_seq \g_@@_notes_in_caption_seq \g_@@_notes_seq
+ \int_set:Nn \c at tabularnote { \seq_count:N \g_@@_notes_seq }
+ \skip_vertical:N 0.65ex
+% \end{macrocode}
+% The TeX group is for potential specifications in the
+% |\l_@@_notes_code_before_tl|.
+% \begin{macrocode}
+ \group_begin:
+ \l_@@_notes_code_before_tl
+ \tl_if_empty:NF \g_@@_tabularnote_tl
+ {
+ \g_@@_tabularnote_tl \par
+ \tl_gclear:N \g_@@_tabularnote_tl
+ }
+% \end{macrocode}
+% We compose the tabular notes with a list of \pkg{enumitem}. The |\strut| and
+% the |\unskip| are designed to give the ability to put a |\bottomrule| at the
+% end of the notes with a good vertical space.
+% \begin{macrocode}
+ \int_compare:nNnT \c at tabularnote > 0
+ {
+ \bool_if:NTF \l_@@_notes_para_bool
+ {
+ \begin { tabularnotes* }
+ \seq_map_inline:Nn \g_@@_notes_seq
+ { \@@_one_tabularnote:nn ##1 }
+ \strut
+ \end { tabularnotes* }
+% \end{macrocode}
+% The following |\par| is mandatory for the event that the user has put
+% |\footnotesize| (for example) in the |notes/code-before|.
+% \begin{macrocode}
+ \par
+ }
+ {
+ \tabularnotes
+ \seq_map_inline:Nn \g_@@_notes_seq
+ { \@@_one_tabularnote:nn ##1 }
+ \strut
+ \endtabularnotes
+ }
+ }
+ \unskip
+ \group_end:
+ \bool_if:NT \l_@@_notes_bottomrule_bool
+ {
+ \IfPackageLoadedTF { booktabs }
+ {
+% \end{macrocode}
+% The two dimensions |\aboverulesep| et |\heavyrulewidth| are parameters defined
+% by \pkg{booktabs}.
+% \begin{macrocode}
+ \skip_vertical:N \aboverulesep
+% \end{macrocode}
+% |\CT at arc@| is the specification of color defined by \pkg{colortbl} but you use it
+% even if \pkg{colortbl} is not loaded.
+% \begin{macrocode}
+ { \CT at arc@ \hrule height \heavyrulewidth }
+ }
+ { \@@_error_or_warning:n { bottomrule~without~booktabs } }
+ }
+ \l_@@_notes_code_after_tl
+ \seq_gclear:N \g_@@_notes_seq
+ \seq_gclear:N \g_@@_notes_in_caption_seq
+ \int_gzero:N \c at tabularnote
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following command will format (after the main tabular) one tabularnote
+% (with the command |\item|) . |#1| is the label (when the command
+% |\tabularnote| has been used with an optional argument between square
+% brackets) and |#2| is the text of the note. The second argument is provided by
+% currification.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_one_tabularnote:nn #1
+ {
+ \tl_if_novalue:nTF { #1 }
+ { \item }
+ { \item [ \@@_notes_label_in_list:n { #1 } ] }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The case of |baseline| equal to |b|. Remember that, when the key |b| is used,
+% the |{array}| (of \pkg{array}) is constructed with the option |t| (and not
+% |b|). Now, we do the translation to take into account the option |b|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes_b:
+ {
+ \pgfpicture
+ \@@_qpoint:n { row - 1 }
+ \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+ \@@_qpoint:n { row - \int_use:N \c at iRow - base }
+ \dim_gsub:Nn \g_tmpa_dim \pgf at y
+ \endpgfpicture
+ \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+ \int_compare:nNnT \l_@@_first_row_int = 0
+ {
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim
+ }
+ \box_move_up:nn \g_tmpa_dim { \hbox { \@@_use_arraybox_with_notes_c: } }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, the general case.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_use_arraybox_with_notes:
+ {
+% \end{macrocode}
+% We convert a value of |t| to a value of |1|.
+% \begin{macrocode}
+ \tl_if_eq:NnT \l_@@_baseline_tl { t }
+ { \tl_set:Nn \l_@@_baseline_tl { 1 } }
+% \end{macrocode}
+% Now, we convert the value of |\l_@@_baseline_tl| (which should represent an
+% integer) to an integer stored in |\l_tmpa_int|.
+% \begin{macrocode}
+ \pgfpicture
+ \@@_qpoint:n { row - 1 }
+ \dim_gset_eq:NN \g_tmpa_dim \pgf at y
+ \str_if_in:NnTF \l_@@_baseline_tl { line- }
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \str_range:Nnn
+ \l_@@_baseline_tl
+ 6
+ { \tl_count:V \l_@@_baseline_tl }
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int }
+ }
+ {
+ \int_set:Nn \l_tmpa_int \l_@@_baseline_tl
+ \bool_lazy_or:nnT
+ { \int_compare_p:nNn \l_tmpa_int < \l_@@_first_row_int }
+ { \int_compare_p:nNn \l_tmpa_int > \g_@@_row_total_int }
+ {
+ \@@_error:n { bad~value~for~baseline }
+ \int_set:Nn \l_tmpa_int 1
+ }
+ \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base }
+ }
+ \dim_gsub:Nn \g_tmpa_dim \pgf at y
+ \endpgfpicture
+ \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth
+ \int_compare:nNnT \l_@@_first_row_int = 0
+ {
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_ht_row_zero_dim
+ \dim_gadd:Nn \g_tmpa_dim \g_@@_dp_row_zero_dim
+ }
+ \box_move_up:nn \g_tmpa_dim { \hbox { \@@_use_arraybox_with_notes_c: } }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The command |\@@_put_box_in_flow_bis:| is used when the option
+% |delimiters/max-width| is used because, in this case, we have to adjust the
+% widths of the delimiters. The arguments |#1| and |#2| are the delimiters
+% specified by the user.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_put_box_in_flow_bis:nn #1 #2
+ {
+% \end{macrocode}
+% We will compute the real width of both delimiters used.
+% \begin{macrocode}
+ \dim_zero_new:N \l_@@_real_left_delim_dim
+ \dim_zero_new:N \l_@@_real_right_delim_dim
+ \hbox_set:Nn \l_tmpb_box
+ {
+ \c_math_toggle_token
+ \left #1
+ \vcenter
+ {
+ \vbox_to_ht:nn
+ { \box_ht_plus_dp:N \l_tmpa_box }
+ { }
+ }
+ \right .
+ \c_math_toggle_token
+ }
+ \dim_set:Nn \l_@@_real_left_delim_dim
+ { \box_wd:N \l_tmpb_box - \nulldelimiterspace }
+ \hbox_set:Nn \l_tmpb_box
+ {
+ \c_math_toggle_token
+ \left .
+ \vbox_to_ht:nn
+ { \box_ht_plus_dp:N \l_tmpa_box }
+ { }
+ \right #2
+ \c_math_toggle_token
+ }
+ \dim_set:Nn \l_@@_real_right_delim_dim
+ { \box_wd:N \l_tmpb_box - \nulldelimiterspace }
+% \end{macrocode}
+%
+% Now, we can put the box in the TeX flow with the horizontal adjustments on
+% both sides.
+% \begin{macrocode}
+ \skip_horizontal:N \l_@@_left_delim_dim
+ \skip_horizontal:N -\l_@@_real_left_delim_dim
+ \@@_put_box_in_flow:
+ \skip_horizontal:N \l_@@_right_delim_dim
+ \skip_horizontal:N -\l_@@_real_right_delim_dim
+ }
+% \end{macrocode}
+%
+% \interitem
+% The construction of the array in the environment |{NiceArrayWithDelims}| is,
+% in fact, done by the environment |{@@-light-syntax}| or by the environment
+% |{@@-normal-syntax}| (whether the option |light-syntax| is in force or not).
+% When the key |light-syntax| is not used, the construction is a standard
+% environment (and, thus, it's possible to use verbatim in the array).
+% \begin{macrocode}
+\NewDocumentEnvironment { @@-normal-syntax } { }
+% \end{macrocode}
+% First, we test whether the environment is empty. If it is empty, we raise a
+% fatal error (it's only a security). In order to detect whether it is empty, we
+% test whether the next token is |\end| and, if it's the case, we test if this
+% is the end of the environment (if it is not, an standard error will be raised
+% by LaTeX for incorrect nested environments).
+% \begin{macrocode}
+ {
+ \peek_remove_spaces:n
+ {
+ \peek_meaning:NTF \end
+ \@@_analyze_end:Nn
+ {
+ \@@_transform_preamble:
+% \end{macrocode}
+% Here is the call to |\array| (we have a dedicated macro |\@@_array:n| because
+% of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}).
+% \begin{macrocode}
+ \@@_array:V \g_@@_preamble_tl
+ }
+ }
+ }
+ {
+ \@@_create_col_nodes:
+ \endarray
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% When the key |light-syntax| is in force, we use an environment which takes its
+% whole body as an argument (with the specifier |b|).
+% % \label{code-light-syntax}
+% \begin{macrocode}
+\NewDocumentEnvironment { @@-light-syntax } { b }
+ {
+% \end{macrocode}
+% First, we test whether the environment is empty. It's only a security. Of
+% course, this test is more easy than the similar test for the ``normal syntax''
+% because we have the whole body of the environment in |#1|.
+% \begin{macrocode}
+ \tl_if_empty:nT { #1 } { \@@_fatal:n { empty~environment } }
+ \tl_map_inline:nn { #1 }
+ {
+ \str_if_eq:nnT { ##1 } { & }
+ { \@@_fatal:n { ampersand~in~light-syntax } }
+ \str_if_eq:nnT { ##1 } { \\ }
+ { \@@_fatal:n { double-backslash~in~light-syntax } }
+ }
+% \end{macrocode}
+% Now, you extract the |\CodeAfter| of the body of the environment. Maybe, there
+% is no command |\CodeAfter| in the body. That's why you put a marker
+% |\CodeAfter| after |#1|. If there is yet a |\CodeAfter| in |#1|, this second
+% (or third...) |\CodeAfter| will be catched in the value of
+% |\g_nicematrix_code_after_tl|. That doesn't matter because |\CodeAfter| will
+% be set to \textsl{no-op} before the execution of
+% |\g_nicematrix_code_after_tl|.
+% \begin{macrocode}
+ \@@_light_syntax_i:w #1 \CodeAfter \q_stop
+% \end{macrocode}
+% The command |\array| is hidden somewhere in |\@@_light_syntax_i:w|.
+% \begin{macrocode}
+ }
+% \end{macrocode}
+% Now, the second part of the environment. We must leave these lines in the
+% second part (and not put them in the first part even though we caught the
+% whole body of the environment with an argument of type |b|) in order to have
+% the columns |S| of \pkg{siunitx} working fine.
+% \begin{macrocode}
+ {
+ \@@_create_col_nodes:
+ \endarray
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_light_syntax_i:w #1\CodeAfter #2\q_stop
+ {
+ \tl_gput_right:Nn \g_nicematrix_code_after_tl { #2 }
+% \end{macrocode}
+% The body of the array, which is stored in the argument |#1|, is now
+% splitted into items (and \emph{not} tokens).
+% \begin{macrocode}
+ \seq_clear_new:N \l_@@_rows_seq
+% \end{macrocode}
+% We rescan the character of end of line in order to have the correct catcode.
+% \begin{macrocode}
+ \tl_set_rescan:Nno \l_@@_end_of_row_tl { } \l_@@_end_of_row_tl
+ \seq_set_split:NVn \l_@@_rows_seq \l_@@_end_of_row_tl { #1 }
+% \end{macrocode}
+% We delete the last row if it is empty.
+% \begin{macrocode}
+ \seq_pop_right:NN \l_@@_rows_seq \l_tmpa_tl
+ \tl_if_empty:NF \l_tmpa_tl
+ { \seq_put_right:NV \l_@@_rows_seq \l_tmpa_tl }
+% \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 compute that
+% value. We do it, and so, if the token list |\l_@@_code_for_last_row_tl| is not
+% empty, we will use directly where it should be.
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_row_int = { -1 }
+ { \int_set:Nn \l_@@_last_row_int { \seq_count:N \l_@@_rows_seq } }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The new value of the body (that is to say after replacement of the separators
+% of rows and columns by |\\| and |&|) of the environment will be stored in
+% |\l_@@_new_body_tl| (that part of the implementation has been changed in the
+% version 6.11 of \pkg{nicematrix} in order to allow the use of commands such as
+% |\hline| or |\hdottedline| with the key |light-syntax|).
+% \begin{macrocode}
+ \tl_clear_new:N \l_@@_new_body_tl
+ \int_zero_new:N \l_@@_nb_cols_int
+% \end{macrocode}
+% First, we treat the first row.
+% \begin{macrocode}
+ \seq_pop_left:NN \l_@@_rows_seq \l_tmpa_tl
+ \@@_line_with_light_syntax:V \l_tmpa_tl
+% \end{macrocode}
+% Now, the other rows (with the same treatment, excepted that we have to insert
+% |\\| between the rows).
+% \begin{macrocode}
+ \seq_map_inline:Nn \l_@@_rows_seq
+ {
+ \tl_put_right:Nn \l_@@_new_body_tl { \\ }
+ \@@_line_with_light_syntax:n { ##1 }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_col_int = { -1 }
+ {
+ \int_set:Nn \l_@@_last_col_int
+ { \l_@@_nb_cols_int - 1 + \l_@@_first_col_int }
+ }
+% \end{macrocode}
+%
+% Now, we can construct the preamble: if the user has used the key |last-col|,
+% we have the correct number of columns even though the user has used |last-col|
+% without value.
+% \begin{macrocode}
+ \@@_transform_preamble:
+% \end{macrocode}
+%
+% The call to |\array| is in the following command (we have a dedicated macro
+% |\@@_array:n| because of compatibility with the classes \cls{revtex4-1} and
+% \cls{revtex4-2}).
+% \begin{macrocode}
+ \@@_array:V \g_@@_preamble_tl \l_@@_new_body_tl
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_line_with_light_syntax:n #1
+ {
+ \seq_clear_new:N \l_@@_cells_seq
+ \seq_set_split:Nnn \l_@@_cells_seq { ~ } { #1 }
+ \int_set:Nn \l_@@_nb_cols_int
+ {
+ \int_max:nn
+ \l_@@_nb_cols_int
+ { \seq_count:N \l_@@_cells_seq }
+ }
+ \seq_pop_left:NN \l_@@_cells_seq \l_tmpa_tl
+ \tl_put_right:NV \l_@@_new_body_tl \l_tmpa_tl
+ \seq_map_inline:Nn \l_@@_cells_seq
+ { \tl_put_right:Nn \l_@@_new_body_tl { & ##1 } }
+ }
+\cs_generate_variant:Nn \@@_line_with_light_syntax: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
+% security). When this command is used, |#1| is, in fact, always |\end|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_analyze_end:Nn #1 #2
+ {
+ \str_if_eq:VnT \g_@@_name_env_str { #2 }
+ { \@@_fatal:n { empty~environment } }
+% \end{macrocode}
+% We reput in the stream the |\end{...}| we have extracted and the user will
+% have an error for incorrect nested environments.
+% \begin{macrocode}
+ \end { #2 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_create_col_nodes:| will construct a special last row.
+% That last row is a false row used to create the |col| nodes and to fix the
+% width of the columns (when the array is constructed with an option which
+% specifies the width of the columns).
+% \begin{macrocode}
+\cs_new:Npn \@@_create_col_nodes:
+ {
+ \crcr
+ \int_compare:nNnT \l_@@_first_col_int = 0
+ {
+ \omit
+ \hbox_overlap_left:n
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ { \pgfsys at markposition { \@@_env: - col - 0 } }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 0 } \pgfpointorigin
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 0 } { \@@_env: - col - 0 } }
+ \endpgfpicture
+ \skip_horizontal:N 2\col at sep
+ \skip_horizontal:N \g_@@_width_first_col_dim
+ }
+ &
+ }
+ \omit
+% \end{macrocode}
+% The following instruction must be put after the instruction |\omit|.
+% \begin{macrocode}
+ \bool_gset_true:N \g_@@_row_of_col_done_bool
+% \end{macrocode}
+% First, we put a |col| node on the left of the first column (of course, we
+% have to do that \emph{after} the |\omit|).
+% \begin{macrocode}
+ \int_compare:nNnTF \l_@@_first_col_int = 0
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+ \pgfsys at markposition { \@@_env: - col - 1 }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 1 }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 1 } { \@@_env: - col - 1 } }
+ \endpgfpicture
+ }
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N 0.5\arrayrulewidth
+ \pgfsys at markposition { \@@_env: - col - 1 }
+ \skip_horizontal:N -0.5\arrayrulewidth
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 1 }
+ { \pgfpoint { 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 1 } { \@@_env: - col - 1 } }
+ \endpgfpicture
+ }
+% \end{macrocode}
+% We compute in |\g_tmpa_skip| the common width of the columns (it's a skip and
+% not a dimension). We use a global variable because we are in a cell of an
+% |\halign| and because we have to use this variable in other cells (of the same
+% row). The affectation of |\g_tmpa_skip|, like all the affectations, must be
+% done after the |\omit| of the cell.
+%
+% \smallskip
+% We give a default value for |\g_tmpa_skip| (|0 pt plus 1 fill|) but it will
+% just after be erased by a fixed value in the concerned cases.
+% \begin{macrocode}
+ \skip_gset:Nn \g_tmpa_skip { 0 pt~plus 1 fill }
+ \bool_if:NF \l_@@_auto_columns_width_bool
+ { \dim_compare:nNnT \l_@@_columns_width_dim > \c_zero_dim }
+ {
+ \bool_lazy_and:nnTF
+ \l_@@_auto_columns_width_bool
+ { \bool_not_p:n \l_@@_block_auto_columns_width_bool }
+ { \skip_gset_eq:NN \g_tmpa_skip \g_@@_max_cell_width_dim }
+ { \skip_gset_eq:NN \g_tmpa_skip \l_@@_columns_width_dim }
+ \skip_gadd:Nn \g_tmpa_skip { 2 \col at sep }
+ }
+ \skip_horizontal:N \g_tmpa_skip
+ \hbox
+ {
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+ \pgfsys at markposition { \@@_env: - col - 2 }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - 2 }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - col - 2 } { \@@_env: - col - 2 } }
+ \endpgfpicture
+ }
+% \end{macrocode}
+% We begin a loop over the columns. The integer |\g_tmpa_int| will be the
+% number of the current column. This integer is used for the Tikz nodes.
+% \begin{macrocode}
+ \int_gset:Nn \g_tmpa_int 1
+ \bool_if:NTF \g_@@_last_col_found_bool
+ { \prg_replicate:nn { \int_max:nn { \g_@@_col_total_int - 3 } 0 } }
+ { \prg_replicate:nn { \int_max:nn { \g_@@_col_total_int - 2 } 0 } }
+ {
+ &
+ \omit
+ \int_gincr:N \g_tmpa_int
+% \end{macrocode}
+% The incrementation of the counter |\g_tmpa_int| must be done after the |\omit|
+% of the cell.
+% \begin{macrocode}
+ \skip_horizontal:N \g_tmpa_skip
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+ \pgfsys at markposition
+ { \@@_env: - col - \int_eval:n { \g_tmpa_int + 1 } }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ }
+ }
+% \end{macrocode}
+% We create the |col| node on the right of the current column.
+% \begin{macrocode}
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - \int_eval:n { \g_tmpa_int + 1 } }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - col - \int_eval:n { \g_tmpa_int + 1 } }
+ { \@@_env: - col - \int_eval:n { \g_tmpa_int + 1 } }
+ }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ &
+ \omit
+% \end{macrocode}
+% The two following lines have been added on 2021-12-15 to solve a bug
+% mentionned by Joao Luis Soares by mail.
+% \begin{macrocode}
+ \int_compare:nNnT \g_@@_col_total_int = 1
+ { \skip_gset:Nn \g_tmpa_skip { 0 pt~plus 1 fill } }
+ \skip_horizontal:N \g_tmpa_skip
+ \int_gincr:N \g_tmpa_int
+ \bool_lazy_all:nT
+ {
+ \g_@@_NiceArray_bool
+ { \bool_not_p:n \l_@@_NiceTabular_bool }
+ { \clist_if_empty_p:N \l_@@_vlines_clist }
+ { \bool_not_p:n \l_@@_exterior_arraycolsep_bool }
+ { ! \l_@@_bar_at_end_of_pream_bool }
+ }
+ { \skip_horizontal:N -\col at sep }
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \hbox
+ {
+ \skip_horizontal:N -0.5\arrayrulewidth
+% \end{macrocode}
+% With an environment |{Matrix}|, you want to remove the exterior |\arraycolsep|
+% but we don't know the number of columns (since there is no preamble) and
+% that's why we can't put |@{}| at the end of the preamble. That's why we remove
+% a |\arraycolsep| now.
+% \begin{macrocode}
+ \bool_lazy_and:nnT \l_@@_Matrix_bool \g_@@_NiceArray_bool
+ { \skip_horizontal:N -\arraycolsep }
+ \pgfsys at markposition
+ { \@@_env: - col - \int_eval:n {
+ \g_tmpa_int + 1 } }
+ \skip_horizontal:N 0.5\arrayrulewidth
+ \bool_lazy_and:nnT \l_@@_Matrix_bool \g_@@_NiceArray_bool
+ { \skip_horizontal:N \arraycolsep }
+ }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate { \@@_env: - col - \int_eval:n { \g_tmpa_int + 1 } }
+ {
+ \bool_lazy_and:nnTF \l_@@_Matrix_bool \g_@@_NiceArray_bool
+ {
+ \pgfpoint
+ { - 0.5 \arrayrulewidth - \arraycolsep }
+ \c_zero_dim
+ }
+ { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim }
+ }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - col - \int_eval:n { \g_tmpa_int + 1 } }
+ { \@@_env: - col - \int_eval:n { \g_tmpa_int + 1 } }
+ }
+ \endpgfpicture
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \bool_if:NT \g_@@_last_col_found_bool
+ {
+ \hbox_overlap_right:n
+ {
+ \skip_horizontal:N \g_@@_width_last_col_dim
+ \bool_if:NT \l_@@_code_before_bool
+ {
+ \pgfsys at markposition
+ { \@@_env: - col - \int_eval:n { \g_@@_col_total_int + 1 } }
+ }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate
+ { \@@_env: - col - \int_eval:n { \g_@@_col_total_int + 1 } }
+ \pgfpointorigin
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ {
+ \l_@@_name_str - col
+ - \int_eval:n { \g_@@_col_total_int + 1 }
+ }
+ { \@@_env: - col - \int_eval:n { \g_@@_col_total_int + 1 } }
+ }
+ \endpgfpicture
+ }
+ }
+ \cr
+ }
+% \end{macrocode}
+%
+%
+% \interitem
+% Here is the preamble for the ``first column'' (if the user uses the key
+% |first-col|)
+% \begin{macrocode}
+\tl_const:Nn \c_@@_preamble_first_col_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
+% not).
+% \begin{macrocode}
+ \cs_set_eq:NN \CodeAfter \@@_CodeAfter_i:
+ \bool_gset_true:N \g_@@_after_col_zero_bool
+ \@@_begin_of_row:
+% \end{macrocode}
+% The contents of the cell is constructed in the box |\l_@@_cell_box| because we
+% have to compute some dimensions of this box.
+% \begin{macrocode}
+ \hbox_set:Nw \l_@@_cell_box
+ \@@_math_toggle_token:
+ \bool_if:NT \l_@@_small_bool \scriptstyle
+% \end{macrocode}
+% We insert |\l_@@_code_for_first_col_tl|... but we don't insert it in the
+% potential ``first row'' and in the potential ``last row''.
+% \begin{macrocode}
+ \bool_lazy_and:nnT
+ { \int_compare_p:nNn \c at iRow > 0 }
+ {
+ \bool_lazy_or_p:nn
+ { \int_compare_p:nNn \l_@@_last_row_int < 0 }
+ { \int_compare_p:nNn \c at iRow < \l_@@_last_row_int }
+ }
+ {
+ \l_@@_code_for_first_col_tl
+ \xglobal \colorlet { nicematrix-first-col } { . }
+ }
+ }
+% \end{macrocode}
+% Be careful: despite this letter |l| the cells of the ``first column'' are
+% composed in a |R| manner since they are composed in a |\hbox_overlap_left:n|.
+% \begin{macrocode}
+ l
+ <
+ {
+ \@@_math_toggle_token:
+ \hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
+ \@@_update_for_first_and_last_row:
+% \end{macrocode}
+% We actualise the width of the ``first column'' because we will use this width
+% after the construction of the array.
+% \begin{macrocode}
+ \dim_gset:Nn \g_@@_width_first_col_dim
+ { \dim_max:nn \g_@@_width_first_col_dim { \box_wd:N \l_@@_cell_box } }
+% \end{macrocode}
+% The content of the cell is inserted in an overlapping position.
+% \label{overlap-left}
+% \begin{macrocode}
+ \hbox_overlap_left:n
+ {
+ \dim_compare:nNnTF { \box_wd:N \l_@@_cell_box } > \c_zero_dim
+ \@@_node_for_cell:
+ { \box_use_drop:N \l_@@_cell_box }
+ \skip_horizontal:N \l_@@_left_delim_dim
+ \skip_horizontal:N \l_@@_left_margin_dim
+ \skip_horizontal:N \l_@@_extra_left_margin_dim
+ }
+ \bool_gset_false:N \g_@@_empty_cell_bool
+ \skip_horizontal:N -2\col at sep
+ }
+ }
+% \end{macrocode}
+%
+%
+% Here is the preamble for the ``last column'' (if the user uses the key
+% |last-col|).
+% \begin{macrocode}
+\tl_const:Nn \c_@@_preamble_last_col_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
+% not).
+% \begin{macrocode}
+ \cs_set_eq:NN \CodeAfter \@@_CodeAfter_i:
+% \end{macrocode}
+% With the flag |\g_@@_last_col_found_bool|, we will know that the ``last
+% column'' is really used.
+% \begin{macrocode}
+ \bool_gset_true:N \g_@@_last_col_found_bool
+ \int_gincr:N \c at jCol
+ \int_gset_eq:NN \g_@@_col_total_int \c at jCol
+% \end{macrocode}
+% The contents of the cell is constructed in the box |\l_tmpa_box| because we
+% have to compute some dimensions of this box.
+% \begin{macrocode}
+ \hbox_set:Nw \l_@@_cell_box
+ \@@_math_toggle_token:
+ \bool_if:NT \l_@@_small_bool \scriptstyle
+% \end{macrocode}
+% We insert |\l_@@_code_for_last_col_tl|... but we don't insert it in the
+% potential ``first row'' and in the potential ``last row''.
+% \begin{macrocode}
+ \int_compare:nNnT \c at iRow > 0
+ {
+ \bool_lazy_or:nnT
+ { \int_compare_p:nNn \l_@@_last_row_int < 0 }
+ { \int_compare_p:nNn \c at iRow < \l_@@_last_row_int }
+ {
+ \l_@@_code_for_last_col_tl
+ \xglobal \colorlet { nicematrix-last-col } { . }
+ }
+ }
+ }
+ l
+ <
+ {
+ \@@_math_toggle_token:
+ \hbox_set_end:
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+ \@@_adjust_size_box:
+ \@@_update_for_first_and_last_row:
+% \end{macrocode}
+% We actualise the width of the ``last column'' because we will use this width
+% after the construction of the array.
+% \begin{macrocode}
+ \dim_gset:Nn \g_@@_width_last_col_dim
+ { \dim_max:nn \g_@@_width_last_col_dim { \box_wd:N \l_@@_cell_box } }
+ \skip_horizontal:N -2\col at sep
+% \end{macrocode}
+% The content of the cell is inserted in an overlapping position.
+% \label{overlap-right}
+% \begin{macrocode}
+ \hbox_overlap_right:n
+ {
+ \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } > \c_zero_dim
+ {
+ \skip_horizontal:N \l_@@_right_delim_dim
+ \skip_horizontal:N \l_@@_right_margin_dim
+ \skip_horizontal:N \l_@@_extra_right_margin_dim
+ \@@_node_for_cell:
+ }
+ }
+ \bool_gset_false:N \g_@@_empty_cell_bool
+ }
+ }
+% \end{macrocode}
+%
+%
+% \interitem
+% The environment |{NiceArray}| is constructed upon the environment
+% |{NiceArrayWithDelims}| but, in fact, there is a flag |\g_@@_NiceArray_bool|.
+% In |{NiceArrayWithDelims}|, some special code will be executed if this flag is
+% raised.
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceArray } { }
+ {
+ \bool_gset_true:N \g_@@_NiceArray_bool
+ \str_if_empty:NT \g_@@_name_env_str
+ { \str_gset:Nn \g_@@_name_env_str { NiceArray } }
+% \end{macrocode}
+% We put . and . for the delimiters but, in fact, that doesn't matter because
+% these arguments won't be used in |{NiceArrayWithDelims}| (because the flag
+% |\g_@@_NiceArray_bool| is raised).
+% \begin{macrocode}
+ \NiceArrayWithDelims . .
+ }
+ { \endNiceArrayWithDelims }
+% \end{macrocode}
+%
+%
+% \interitem
+% We create the variants of the environment |{NiceArrayWithDelims}|.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_def_env:nnn #1 #2 #3
+ {
+ \NewDocumentEnvironment { #1 NiceArray } { }
+ {
+ \bool_gset_false:N \g_@@_NiceArray_bool
+ \str_if_empty:NT \g_@@_name_env_str
+ { \str_gset:Nn \g_@@_name_env_str { #1 NiceArray } }
+ \@@_test_if_math_mode:
+ \NiceArrayWithDelims #2 #3
+ }
+ { \endNiceArrayWithDelims }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_def_env:nnn p ( )
+\@@_def_env:nnn b [ ]
+\@@_def_env:nnn B \{ \}
+\@@_def_env:nnn v | |
+\@@_def_env:nnn V \| \|
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The environment \{NiceMatrix\} and its variants}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_begin_of_NiceMatrix:nn #1 #2
+ {
+ \bool_set_true:N \l_@@_Matrix_bool
+ \use:c { #1 NiceArray }
+ {
+ *
+ {
+ \int_case:nnF \l_@@_last_col_int
+ {
+ { -2 } { \c at MaxMatrixCols }
+ { -1 } { \int_eval:n { \c at MaxMatrixCols + 1 } }
+% \end{macrocode}
+% The value $0$ can't occur here since we are in a matrix (which is an
+% environment without preamble).
+% \begin{macrocode}
+ }
+ { \int_eval:n { \l_@@_last_col_int - 1 } }
+ }
+ { #2 }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_begin_of_NiceMatrix:nn { n V }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\clist_map_inline:nn { p , b , B , v , V }
+ {
+ \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } }
+ {
+ \bool_gset_false:N \g_@@_NiceArray_bool
+ \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix }
+ \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 }
+ \@@_begin_of_NiceMatrix:nV { #1 } \l_@@_columns_type_tl
+ }
+ { \use:c { end #1 NiceArray } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We define also an environment |{NiceMatrix}|
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceMatrix } { ! O { } }
+ {
+ \bool_gset_false:N \g_@@_NiceArray_bool
+ \str_gset:Nn \g_@@_name_env_str { NiceMatrix }
+ \keys_set:nn { NiceMatrix / NiceMatrix } { #1 }
+ \@@_begin_of_NiceMatrix:nV { } \l_@@_columns_type_tl
+ }
+ { \endNiceArray }
+% \end{macrocode}
+%
+% \bigskip
+% The following command will be linked to |\NotEmpty| in the environments of
+% \pkg{nicematrix}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_NotEmpty:
+ { \bool_gset_true:N \g_@@_not_empty_cell_bool }
+% \end{macrocode}
+%
+% \bigskip
+% \section{\{NiceTabular\}, \{NiceTabularX\} and \{NiceTabular*\}}
+%
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceTabular } { O { } m ! O { } }
+ {
+% \end{macrocode}
+% If the dimension |\l_@@_width_dim| is equal to $0$~pt, that means that it has
+% not be set by a previous use of |\NiceMatrixOptions|.
+% \begin{macrocode}
+ \dim_compare:nNnT \l_@@_width_dim = \c_zero_dim
+ { \dim_set_eq:NN \l_@@_width_dim \linewidth }
+ \str_gset:Nn \g_@@_name_env_str { NiceTabular }
+ \keys_set:nn { NiceMatrix / NiceTabular } { #1 , #3 }
+ \int_compare:nNnT \l_@@_tab_rounded_corners_dim > \c_zero_dim
+ {
+ \bool_if:NT \l_@@_hvlines_bool
+ {
+ \bool_set_true:N \l_@@_except_borders_bool
+ % we should try to be more efficient in the number of lines of code here
+ \tl_if_empty:NTF \l_@@_rules_color_tl
+ {
+ \tl_gput_right:Nn \g_@@_pre_code_after_tl
+ {
+ \@@_stroke_block:nnn
+ { rounded-corners = \dim_use:N \l_@@_tab_rounded_corners_dim }
+ { 1-1 }
+ { \int_use:N \c at iRow - \int_use:N \c at jCol }
+ }
+ }
+ {
+ \tl_gput_right:Nn \g_@@_pre_code_after_tl
+ {
+ \@@_stroke_block:nnn
+ {
+ rounded-corners = \dim_use:N \l_@@_tab_rounded_corners_dim ,
+ draw = \l_@@_rules_color_tl
+ }
+ { 1-1 }
+ { \int_use:N \c at iRow - \int_use:N \c at jCol }
+ }
+ }
+ }
+ }
+ \tl_if_empty:NF \l_@@_short_caption_tl
+ {
+ \tl_if_empty:NT \l_@@_caption_tl
+ {
+ \@@_error_or_warning:n { short-caption~without~caption }
+ \tl_set_eq:NN \l_@@_caption_tl \l_@@_short_caption_tl
+ }
+ }
+ \tl_if_empty:NF \l_@@_label_tl
+ {
+ \tl_if_empty:NT \l_@@_caption_tl
+ { \@@_error_or_warning:n { label~without~caption } }
+ }
+ \NewDocumentEnvironment { TabularNote } { b }
+ {
+ \bool_if:NTF \l_@@_in_code_after_bool
+ { \@@_error_or_warning:n { TabularNote~in~CodeAfter } }
+ {
+ \tl_if_empty:NF \g_@@_tabularnote_tl
+ { \tl_gput_right:Nn \g_@@_tabularnote_tl { \par } }
+ \tl_gput_right:Nn \g_@@_tabularnote_tl { ##1 }
+ }
+ }
+ { }
+ \bool_set_true:N \l_@@_NiceTabular_bool
+ \NiceArray { #2 }
+ }
+ { \endNiceArray }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_newcolumntype #1
+ {
+ \cs_if_free:cT { NC @ find @ #1 }
+ { \NC at list \expandafter { \the \NC at list \NC at do #1 } }
+ \cs_set:cpn {NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
+ \peek_meaning:NTF [
+ { \newcol@ #1 }
+ { \newcol@ #1 [ 0 ] }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceTabularX } { m O { } m ! O { } }
+ {
+% \end{macrocode}
+% The following code prevents the expansion of the `X` columns with the
+% definition of that columns in \pkg{tabularx} (this would result in an error in
+% |{NiceTabularX}|).
+% \begin{macrocode}
+ \IfPackageLoadedTF { tabularx }
+ { \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 }
+ \keys_set:nn { NiceMatrix / NiceTabular } { #2 , #4 }
+ \bool_set_true:N \l_@@_NiceTabular_bool
+ \NiceArray { #3 }
+ }
+ { \endNiceArray }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceTabular* } { m O { } m ! O { } }
+ {
+ \str_gset:Nn \g_@@_name_env_str { NiceTabular* }
+ \dim_set:Nn \l_@@_tabular_width_dim { #1 }
+ \keys_set:nn { NiceMatrix / NiceTabular } { #2 , #4 }
+ \bool_set_true:N \l_@@_NiceTabular_bool
+ \NiceArray { #3 }
+ }
+ { \endNiceArray }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{After the construction of the array}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_after_array:
+ {
+ \group_begin:
+% \end{macrocode}
+% When the option |last-col| is used in the environments with explicit preambles
+% (like |{NiceArray}|, |{pNiceArray}|, etc.) a special type of column is used at
+% the end of the preamble in order to compose the cells in an overlapping
+% position (with |\hbox_overlap_right:n|) but (if |last-col| has been used), we
+% don't have the number of that last column. However, we have to know that
+% number for the color of the potential |\Vdots| drawn in that last column.
+% That's why we fix the correct value of |\l_@@_last_col_int| in that case.
+% \begin{macrocode}
+ \bool_if:NT \g_@@_last_col_found_bool
+ { \int_set_eq:NN \l_@@_last_col_int \g_@@_col_total_int }
+% \end{macrocode}
+%
+% If we are in an environment without preamble (like |{NiceMatrix}| or
+% |{pNiceMatrix}|) and if the option |last-col| has been used without value
+% we also fix the real value of |\l_@@_last_col_int|.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_last_col_without_value_bool
+ { \int_set_eq:NN \l_@@_last_col_int \g_@@_col_total_int }
+% \end{macrocode}
+%
+% \medskip
+% It's also time to give to |\l_@@_last_row_int| its real value.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_last_row_without_value_bool
+ { \int_set_eq:NN \l_@@_last_row_int \g_@@_row_total_int }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \seq_gset_from_clist:Nn \exp_not:N \g_@@_size_seq
+ {
+ \int_use:N \l_@@_first_row_int ,
+ \int_use:N \c at iRow ,
+ \int_use:N \g_@@_row_total_int ,
+ \int_use:N \l_@@_first_col_int ,
+ \int_use:N \c at jCol ,
+ \int_use:N \g_@@_col_total_int
+ }
+ }
+% \end{macrocode}
+% We write also the potential content of |\g_@@_pos_of_blocks_seq|. It will be
+% used to recreate the blocks with a name in the |\CodeBefore| and also if the
+% command |\rowcolors| is used with the key |respect-blocks|).
+% \begin{macrocode}
+ \seq_if_empty:NF \g_@@_pos_of_blocks_seq
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \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
+ {
+ \seq_gset_from_clist:Nn \exp_not:N \g_@@_multicolumn_cells_seq
+ { \seq_use:Nnnn \g_@@_multicolumn_cells_seq , , , }
+ \seq_gset_from_clist:Nn \exp_not:N \g_@@_multicolumn_sizes_seq
+ { \seq_use:Nnnn \g_@@_multicolumn_sizes_seq , , , }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, you create the diagonal nodes by using the |row| nodes and the |col|
+% nodes.
+% \begin{macrocode}
+ \@@_create_diag_nodes:
+% \end{macrocode}
+%
+% \medskip
+% We create the aliases using |last| for the nodes of the cells in the last row
+% and the last column.
+% \begin{macrocode}
+ \pgfpicture
+ \int_step_inline:nn \c at iRow
+ {
+ \pgfnodealias
+ { \@@_env: - ##1 - last }
+ { \@@_env: - ##1 - \int_use:N \c at jCol }
+ }
+ \int_step_inline:nn \c at jCol
+ {
+ \pgfnodealias
+ { \@@_env: - last - ##1 }
+ { \@@_env: - \int_use:N \c at iRow - ##1 }
+ }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \int_step_inline:nn \c at iRow
+ {
+ \pgfnodealias
+ { \l_@@_name_str - ##1 - last }
+ { \@@_env: - ##1 - \int_use:N \c at jCol }
+ }
+ \int_step_inline:nn \c at jCol
+ {
+ \pgfnodealias
+ { \l_@@_name_str - last - ##1 }
+ { \@@_env: - \int_use:N \c at iRow - ##1 }
+ }
+ }
+ \endpgfpicture
+% \end{macrocode}
+%
+% By default, the diagonal lines will be parallelized\footnote{It's possible to
+% use the option |parallelize-diags| to disable this parallelization.}. There
+% are two types of diagonals lines: the $|\Ddots|$ diagonals and the |\Iddots|
+% diagonals. We have to count both types in order to know whether a diagonal is
+% the first of its type in the current |{NiceArray}| environment.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_parallelize_diags_bool
+ {
+ \int_gzero_new:N \g_@@_ddots_int
+ \int_gzero_new:N \g_@@_iddots_int
+% \end{macrocode}
+%
+% The dimensions |\g_@@_delta_x_one_dim| and |\g_@@_delta_y_one_dim| will
+% contain the $\Delta_x$ and $\Delta_y$ of the first |\Ddots| diagonal. We have
+% to store these values in order to draw the others |\Ddots| diagonals parallel
+% to the first one. Similarly |\g_@@_delta_x_two_dim| and
+% |\g_@@_delta_y_two_dim| are the $\Delta_x$ and $\Delta_y$ of the first
+% |\Iddots| diagonal.
+% \begin{macrocode}
+ \dim_gzero_new:N \g_@@_delta_x_one_dim
+ \dim_gzero_new:N \g_@@_delta_y_one_dim
+ \dim_gzero_new:N \g_@@_delta_x_two_dim
+ \dim_gzero_new:N \g_@@_delta_y_two_dim
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_initial_i_int
+ \int_zero_new:N \l_@@_initial_j_int
+ \int_zero_new:N \l_@@_final_i_int
+ \int_zero_new:N \l_@@_final_j_int
+ \bool_set_false:N \l_@@_initial_open_bool
+ \bool_set_false:N \l_@@_final_open_bool
+% \end{macrocode}
+%
+% If the option |small| is used, the values |\l_@@_xdots_radius_dim| and
+% |\l_@@_xdots_inter_dim| (used to draw the dotted lines created by
+% |\hdottedline| and |\vdottedline| and also for all the other dotted lines when
+% |line-style| is equal to |standard|, which is the initial value) are changed.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_small_bool
+ {
+ \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 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_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}
+%
+% \bigskip
+% Now, we actually draw the dotted lines (specified by |\Cdots|, |\Vdots|,
+% etc.).
+% \begin{macrocode}
+ \@@_draw_dotted_lines:
+% \end{macrocode}
+%
+% \bigskip
+% The following computes the ``corners'' (made up of empty cells) but if there
+% is no corner to compute, it won't do anything. The corners are computed
+% in |\l_@@_corners_cells_seq| which will contain all the cells which are empty
+% (and not in a block) considered in the corners of the array.
+% \begin{macrocode}
+ \@@_compute_corners:
+% \end{macrocode}
+%
+% \bigskip
+% The sequence |\g_@@_pos_of_blocks_seq| must be ``adjusted'' (for the case
+% where the user have written something like |\Block{1-*}|).
+% \begin{macrocode}
+ \@@_adjust_pos_of_blocks_seq:
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_hlines_clist \@@_draw_hlines:
+ \tl_if_empty:NF \l_@@_vlines_clist \@@_draw_vlines:
+% \end{macrocode}
+%
+% \bigskip
+% Now, the pre-code-after and then, the |\CodeAfter|.
+% \begin{macrocode}
+ \IfPackageLoadedTF { tikz }
+ {
+ \tikzset
+ {
+ every~picture / .style =
+ {
+ overlay ,
+ remember~picture ,
+ name~prefix = \@@_env: -
+ }
+ }
+ }
+ { }
+ \cs_set_eq:NN \ialign \@@_old_ialign:
+ \cs_set_eq:NN \SubMatrix \@@_SubMatrix
+ \cs_set_eq:NN \UnderBrace \@@_UnderBrace
+ \cs_set_eq:NN \OverBrace \@@_OverBrace
+ \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames
+ \cs_set_eq:NN \line \@@_line
+ \g_@@_pre_code_after_tl
+ \tl_gclear:N \g_@@_pre_code_after_tl
+% \end{macrocode}
+% When |light-syntax| is used, we insert systematically a |\CodeAfter| in the
+% flow. Thus, it's possible to have two instructions |\CodeAfter| and the second
+% may be in |\g_nicematrix_code_after_tl|. That's why we set
+% |\Code-after| to be \textsl{no-op} now.
+% \begin{macrocode}
+ \cs_set_eq:NN \CodeAfter \prg_do_nothing:
+% \end{macrocode}
+%
+% We clear the list of the names of the potential |\SubMatrix| that will appear
+% in the |\CodeAfter| (unfortunately, that list has to be global).
+% \begin{macrocode}
+ \seq_gclear:N \g_@@_submatrix_names_seq
+% \end{macrocode}
+%
+% \medskip
+% The following code is a security for the case the user has used \pkg{babel}
+% with the option \pkg{spanish}: in that case, the characters |>| and |<| are
+% activated and Tikz is not able to solve the problem (even with the Tikz
+% library \pkg{babel}).
+% \begin{macrocode}
+ \int_compare:nNnT { \char_value_catcode:n { 60 } } = { 13 }
+ { \@@_rescan_for_spanish:N \g_nicematrix_code_after_tl }
+% \end{macrocode}
+% \medskip
+% And here's the |\CodeAfter|. Since the |\CodeAfter| may begin with an
+% ``argument'' between square brackets of the options, we extract and treat that
+% potential ``argument'' with the command |\@@_CodeAfter_keys:|.
+% \begin{macrocode}
+ \bool_set_true:N \l_@@_in_code_after_bool
+ \exp_last_unbraced:NV \@@_CodeAfter_keys: \g_nicematrix_code_after_tl
+ \scan_stop:
+ \tl_gclear:N \g_nicematrix_code_after_tl
+ \group_end:
+% \end{macrocode}
+%
+%
+% \medskip
+% |\g_@@_pre_code_before_tl| is for instructions in the cells of the array such as
+% |\rowcolor| and |\cellcolor| (when the key |colortbl-like| is in
+% force). These instructions will be written on the |aux| file to be added to
+% the |code-before| in the next run.
+% \begin{macrocode}
+ \tl_if_empty:NF \g_@@_pre_code_before_tl
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \tl_gset:Nn \exp_not:N \g_@@_pre_code_before_tl
+ { \exp_not:V \g_@@_pre_code_before_tl }
+ }
+ \tl_gclear:N \g_@@_pre_code_before_tl
+ }
+ \tl_if_empty:NF \g_nicematrix_code_before_tl
+ {
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \tl_gset:Nn \exp_not:N \g_@@_code_before_tl
+ { \exp_not:V \g_nicematrix_code_before_tl }
+ }
+ \tl_gclear:N \g_nicematrix_code_before_tl
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \str_gclear:N \g_@@_name_env_str
+ \@@_restore_iRow_jCol:
+% \end{macrocode}
+% The command |\CT at arc@| contains the instruction of color for the rules of the
+% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by
+% |\CT at arc@| but we use it also for compatibility with \pkg{colortbl}. But we
+% want also to be able to use color for the rules of the array when
+% \pkg{colortbl} is \emph{not} loaded. That's why we do the following
+% instruction which is in the patch of the end of arrays done by \pkg{colortbl}.
+% \begin{macrocode}
+ \cs_gset_eq:NN \CT at arc@ \@@_old_CT at arc@
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command will extract the potential options (between square
+% brackets) at the beginning of the |\CodeAfter| (that is to say, when
+% |\CodeAfter| is used, the options of that ``command'' |\CodeAfter|). Idem for
+% the |\CodeBefore.|
+% \begin{macrocode}
+\NewDocumentCommand \@@_CodeAfter_keys: { O { } }
+ { \keys_set:nn { NiceMatrix / CodeAfter } { #1 } }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% We remind that the first mandatory argument of the command |\Block| is the
+% size of the block with the special format $i$|-|$j$. However, the user is
+% allowed to omit $i$ or $j$ (or both). This will be interpreted as: the last
+% row (resp. column) of the block will be the last row (resp. column) of the
+% block (without the potential exterior row---resp. column---of the array). By
+% convention, this is stored in |\g_@@_pos_of_blocks_seq| (and
+% |\g_@@_blocks_seq|) as a number of rows (resp. columns) for the block equal to
+% 100. It's possible, after the construction of the array, to replace these
+% values by the correct ones (since we know the number of rows and columns of
+% the array).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_adjust_pos_of_blocks_seq:
+ {
+ \seq_gset_map_x:NNn \g_@@_pos_of_blocks_seq \g_@@_pos_of_blocks_seq
+ { \@@_adjust_pos_of_blocks_seq_i:nnnnn ##1 }
+ }
+% \end{macrocode}
+%
+% The following command must \emph{not} be protected.
+% \begin{macrocode}
+\cs_new:Npn \@@_adjust_pos_of_blocks_seq_i:nnnnn #1 #2 #3 #4 #5
+ {
+ { #1 }
+ { #2 }
+ {
+ \int_compare:nNnTF { #3 } > { 99 }
+ { \int_use:N \c at iRow }
+ { #3 }
+ }
+ {
+ \int_compare:nNnTF { #4 } > { 99 }
+ { \int_use:N \c at jCol }
+ { #4 }
+ }
+ { #5 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We recall that, when externalization is used, |\tikzpicture| and
+% |\endtikzpicture| (or |\pgfpicture| and |\endpgfpicture|) must be directly
+% ``visible''. That's why we have to define the adequate version of
+% |\@@_draw_dotted_lines:| whether Tikz is loaded or not (in that case, only
+% \textsc{pgf} is loaded).
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \cs_new_protected:Npx \@@_draw_dotted_lines:
+ {
+ \c_@@_pgfortikzpicture_tl
+ \@@_draw_dotted_lines_i:
+ \c_@@_endpgfortikzpicture_tl
+ }
+ }
+% \end{macrocode}
+%
+% The following command \emph{must} be protected because it will appear in the
+% construction of the command |\@@_draw_dotted_lines:|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_dotted_lines_i:
+ {
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \g_@@_HVdotsfor_lines_tl
+ \g_@@_Vdots_lines_tl
+ \g_@@_Ddots_lines_tl
+ \g_@@_Iddots_lines_tl
+ \g_@@_Cdots_lines_tl
+ \g_@@_Ldots_lines_tl
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_restore_iRow_jCol:
+ {
+ \cs_if_exist:NT \theiRow { \int_gset_eq:NN \c at iRow \l_@@_old_iRow_int }
+ \cs_if_exist:NT \thejCol { \int_gset_eq:NN \c at jCol \l_@@_old_jCol_int }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We define a new \textsc{pgf} shape for the diag nodes because we want to
+% provide a anchor called |.5| for those nodes.
+% \begin{macrocode}
+\pgfdeclareshape { @@_diag_node }
+ {
+ \savedanchor { \five }
+ {
+ \dim_gset_eq:NN \pgf at x \l_tmpa_dim
+ \dim_gset_eq:NN \pgf at y \l_tmpb_dim
+ }
+ \anchor { 5 } { \five }
+ \anchor { center } { \pgfpointorigin }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The following command creates the diagonal nodes (in fact, if the matrix is
+% not a square matrix, not all the nodes are on the diagonal).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_diag_nodes:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \int_step_inline:nn { \int_max:nn \c at iRow \c at jCol }
+ {
+ \@@_qpoint:n { col - \int_min:nn { ##1 } { \c at jCol + 1 } }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at x
+ \@@_qpoint:n { row - \int_min:nn { ##1 } { \c at iRow + 1 } }
+ \dim_set_eq:NN \l_tmpb_dim \pgf at y
+ \@@_qpoint:n { col - \int_min:nn { ##1 + 1 } { \c at jCol + 1 } }
+ \dim_set_eq:NN \l_@@_tmpc_dim \pgf at x
+ \@@_qpoint:n { row - \int_min:nn { ##1 + 1 } { \c at iRow + 1 } }
+ \dim_set_eq:NN \l_@@_tmpd_dim \pgf at y
+ \pgftransformshift { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+% \end{macrocode}
+% Now, |\l_tmpa_dim| and |\l_tmpb_dim| become the width and the height of the
+% node (of shape |@à_diag_node|) that we will construct.
+% \begin{macrocode}
+ \dim_set:Nn \l_tmpa_dim { ( \l_@@_tmpc_dim - \l_tmpa_dim ) / 2 }
+ \dim_set:Nn \l_tmpb_dim { ( \l_@@_tmpd_dim - \l_tmpb_dim ) / 2 }
+ \pgfnode { @@_diag_node } { center } { } { \@@_env: - ##1 } { }
+ \str_if_empty:NF \l_@@_name_str
+ { \pgfnodealias { \l_@@_name_str - ##1 } { \@@_env: - ##1 } }
+ }
+% \end{macrocode}
+% Now, the last node. Of course, that is only a |coordinate| because there is
+% not |.5| anchor for that node.
+% \begin{macrocode}
+ \int_set:Nn \l_tmpa_int { \int_max:nn \c at iRow \c at jCol + 1 }
+ \@@_qpoint:n { row - \int_min:nn { \l_tmpa_int } { \c at iRow + 1 } }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at y
+ \@@_qpoint:n { col - \int_min:nn { \l_tmpa_int } { \c at jCol + 1 } }
+ \pgfcoordinate
+ { \@@_env: - \int_use:N \l_tmpa_int } { \pgfpoint \pgf at x \l_tmpa_dim }
+ \pgfnodealias
+ { \@@_env: - last }
+ { \@@_env: - \int_eval:n { \int_max:nn \c at iRow \c at jCol + 1 } }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - \int_use:N \l_tmpa_int }
+ { \@@_env: - \int_use:N \l_tmpa_int }
+ \pgfnodealias
+ { \l_@@_name_str - last }
+ { \@@_env: - last }
+ }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{We draw the dotted lines}
+%
+% A dotted line will be said \emph{open} in one of its extremities when it stops
+% on the edge of the matrix and \emph{closed} otherwise. In the following
+% matrix, the dotted line is closed on its left extremity and open on its right.
+% \[ \begin{pNiceMatrix}
+% a+b+c & a+b & a\\
+% a & \Cdots \\
+% a & a+b & a+b+c
+% \end{pNiceMatrix}\]
+%
+%
+% \bigskip
+% The command |\@@_find_extremities_of_line:nnnn| takes four arguments:
+%
+% \begin{itemize}
+% \item the first argument is the row of the cell where the command was issued;
+% \item the second argument is the column of the cell where the command was
+% issued;
+% \item the third argument is the $x$-value of the orientation vector of the
+% line;
+% \item the fourth argument is the $y$-value of the orientation vector of the
+% line.
+% \end{itemize}
+%
+% This command computes:
+%
+% \begin{itemize}
+% \item |\l_@@_initial_i_int| and |\l_@@_initial_j_int| which are the
+% coordinates of one extremity of the line;
+% \item |\l_@@_final_i_int| and |\l_@@_final_j_int| which are the coordinates of
+% the other extremity of the line;
+% \item |\l_@@_initial_open_bool| and |\l_@@_final_open_bool| to indicate
+% whether the extremities are open or not.
+% \end{itemize}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_find_extremities_of_line:nnnn #1 #2 #3 #4
+ {
+% \end{macrocode}
+% First, we declare the current cell as ``dotted'' because we forbide
+% intersections of dotted lines.
+% \begin{macrocode}
+ \cs_set:cpn { @@ _ dotted _ #1 - #2 } { }
+% \end{macrocode}
+% Initialization of variables.
+% \begin{macrocode}
+ \int_set:Nn \l_@@_initial_i_int { #1 }
+ \int_set:Nn \l_@@_initial_j_int { #2 }
+ \int_set:Nn \l_@@_final_i_int { #1 }
+ \int_set:Nn \l_@@_final_j_int { #2 }
+% \end{macrocode}
+% We will do two loops: one when determinating the initial cell and the other
+% when determinating the final cell. The boolean |\l_@@_stop_loop_bool| will be
+% used to control these loops. In the first loop, we search the ``final''
+% extremity of the line.
+% \begin{macrocode}
+ \bool_set_false:N \l_@@_stop_loop_bool
+ \bool_do_until:Nn \l_@@_stop_loop_bool
+ {
+ \int_add:Nn \l_@@_final_i_int { #3 }
+ \int_add:Nn \l_@@_final_j_int { #4 }
+% \end{macrocode}
+% We test if we are still in the matrix.
+% \begin{macrocode}
+ \bool_set_false:N \l_@@_final_open_bool
+ \int_compare:nNnTF \l_@@_final_i_int > \l_@@_row_max_int
+ {
+ \int_compare:nNnTF { #3 } = 1
+ { \bool_set_true:N \l_@@_final_open_bool }
+ {
+ \int_compare:nNnT \l_@@_final_j_int > \l_@@_col_max_int
+ { \bool_set_true:N \l_@@_final_open_bool }
+ }
+ }
+ {
+ \int_compare:nNnTF \l_@@_final_j_int < \l_@@_col_min_int
+ {
+ \int_compare:nNnT { #4 } = { -1 }
+ { \bool_set_true:N \l_@@_final_open_bool }
+ }
+ {
+ \int_compare:nNnT \l_@@_final_j_int > \l_@@_col_max_int
+ {
+ \int_compare:nNnT { #4 } = 1
+ { \bool_set_true:N \l_@@_final_open_bool }
+ }
+ }
+ }
+ \bool_if:NTF \l_@@_final_open_bool
+% \end{macrocode}
+% If we are outside the matrix, we have found the extremity of the dotted line
+% and it's an \emph{open} extremity.
+% \begin{macrocode}
+ {
+% \end{macrocode}
+% We do a step backwards.
+% \begin{macrocode}
+ \int_sub:Nn \l_@@_final_i_int { #3 }
+ \int_sub:Nn \l_@@_final_j_int { #4 }
+ \bool_set_true:N \l_@@_stop_loop_bool
+ }
+% \end{macrocode}
+% If we are in the matrix, we test whether the cell is empty. If it's not the
+% case, we stop the loop because we have found the correct values for
+% |\l_@@_final_i_int| and |\l_@@_final_j_int|.
+% \begin{macrocode}
+ {
+ \cs_if_exist:cTF
+ {
+ @@ _ dotted _
+ \int_use:N \l_@@_final_i_int -
+ \int_use:N \l_@@_final_j_int
+ }
+ {
+ \int_sub:Nn \l_@@_final_i_int { #3 }
+ \int_sub:Nn \l_@@_final_j_int { #4 }
+ \bool_set_true:N \l_@@_final_open_bool
+ \bool_set_true:N \l_@@_stop_loop_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_use:N \l_@@_final_i_int
+ - \int_use:N \l_@@_final_j_int
+ }
+ { \bool_set_true:N \l_@@_stop_loop_bool }
+% \end{macrocode}
+% If the case is empty, we declare that the cell as non-empty. Indeed, we will
+% draw a dotted line and the cell will be on that dotted line. All the cells of
+% a dotted line have to be marked as ``dotted'' because we don't want
+% intersections between dotted lines. We recall that the research of the
+% extremities of the lines are all done in the same TeX group (the group of the
+% environment), even though, when the extremities are found, each line is
+% drawn in a TeX group that we will open for the options of the line.
+% \begin{macrocode}
+ {
+ \cs_set:cpn
+ {
+ @@ _ dotted _
+ \int_use:N \l_@@_final_i_int -
+ \int_use:N \l_@@_final_j_int
+ }
+ { }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \interitem
+% For |\l_@@_initial_i_int| and |\l_@@_initial_j_int| the programmation is
+% similar to the previous one.
+% \begin{macrocode}
+ \bool_set_false:N \l_@@_stop_loop_bool
+ \bool_do_until:Nn \l_@@_stop_loop_bool
+ {
+ \int_sub:Nn \l_@@_initial_i_int { #3 }
+ \int_sub:Nn \l_@@_initial_j_int { #4 }
+ \bool_set_false:N \l_@@_initial_open_bool
+ \int_compare:nNnTF \l_@@_initial_i_int < \l_@@_row_min_int
+ {
+ \int_compare:nNnTF { #3 } = 1
+ { \bool_set_true:N \l_@@_initial_open_bool }
+ {
+ \int_compare:nNnT \l_@@_initial_j_int = { \l_@@_col_min_int -1 }
+ { \bool_set_true:N \l_@@_initial_open_bool }
+ }
+ }
+ {
+ \int_compare:nNnTF \l_@@_initial_j_int < \l_@@_col_min_int
+ {
+ \int_compare:nNnT { #4 } = 1
+ { \bool_set_true:N \l_@@_initial_open_bool }
+ }
+ {
+ \int_compare:nNnT \l_@@_initial_j_int > \l_@@_col_max_int
+ {
+ \int_compare:nNnT { #4 } = { -1 }
+ { \bool_set_true:N \l_@@_initial_open_bool }
+ }
+ }
+ }
+ \bool_if:NTF \l_@@_initial_open_bool
+ {
+ \int_add:Nn \l_@@_initial_i_int { #3 }
+ \int_add:Nn \l_@@_initial_j_int { #4 }
+ \bool_set_true:N \l_@@_stop_loop_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ @@ _ dotted _
+ \int_use:N \l_@@_initial_i_int -
+ \int_use:N \l_@@_initial_j_int
+ }
+ {
+ \int_add:Nn \l_@@_initial_i_int { #3 }
+ \int_add:Nn \l_@@_initial_j_int { #4 }
+ \bool_set_true:N \l_@@_initial_open_bool
+ \bool_set_true:N \l_@@_stop_loop_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_use:N \l_@@_initial_i_int
+ - \int_use:N \l_@@_initial_j_int
+ }
+ { \bool_set_true:N \l_@@_stop_loop_bool }
+ {
+ \cs_set:cpn
+ {
+ @@ _ dotted _
+ \int_use:N \l_@@_initial_i_int -
+ \int_use:N \l_@@_initial_j_int
+ }
+ { }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% We remind the rectangle described by all the dotted lines in order to respect
+% the corresponding virtual ``block'' when drawing the horizontal and vertical
+% rules.
+% \begin{macrocode}
+ \seq_gput_right:Nx \g_@@_pos_of_xdots_seq
+ {
+ { \int_use:N \l_@@_initial_i_int }
+% \end{macrocode}
+% Be careful: with |\Iddots|, |\l_@@_final_j_int| is inferior to
+% |\l_@@_initial_j_int|. That's why we use |\int_min:nn| and |\int_max:nn|.
+% \begin{macrocode}
+ { \int_min:nn \l_@@_initial_j_int \l_@@_final_j_int }
+ { \int_use:N \l_@@_final_i_int }
+ { \int_max:nn \l_@@_initial_j_int \l_@@_final_j_int }
+ { } % for the name of the block
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following commmand (\emph{when it will be written}) will set the four
+% counters |\l_@@_row_min_int|, |\l_@@_row_max_int|, |\l_@@_col_min_int| and
+% |\l_@@_col_max_int| to the intersections of the sub-matrices which contains
+% the cell of row |#1| and column |#2|. As of now, it's only the whole array
+% (excepted exterior rows and columns).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_adjust_to_submatrix:nn #1 #2
+ {
+ \int_set:Nn \l_@@_row_min_int 1
+ \int_set:Nn \l_@@_col_min_int 1
+ \int_set_eq:NN \l_@@_row_max_int \c at iRow
+ \int_set_eq:NN \l_@@_col_max_int \c at jCol
+% \end{macrocode}
+% We do a loop over all the submatrices specified in the |code-before|. We have
+% stored the position of all those submatrices in |\g_@@_submatrix_seq|.
+% \begin{macrocode}
+ \seq_map_inline:Nn \g_@@_submatrix_seq
+ { \@@_adjust_to_submatrix:nnnnnn { #1 } { #2 } ##1 }
+ }
+% \end{macrocode}
+%
+% \medskip
+% |#1| and |#2| are the numbers of row and columns of the cell where the command
+% of dotted line (ex.: |\Vdots|) has been issued. |#3|, |#4|, |#5| and |#6| are
+% the specification (in $i$ and $j$) of the submatrix we are analyzing.
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_adjust_to_submatrix:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+ \bool_if:nT
+ {
+ \int_compare_p:n { #3 <= #1 }
+ && \int_compare_p:n { #1 <= #5 }
+ && \int_compare_p:n { #4 <= #2 }
+ && \int_compare_p:n { #2 <= #6 }
+ }
+ {
+ \int_set:Nn \l_@@_row_min_int { \int_max:nn \l_@@_row_min_int { #3 } }
+ \int_set:Nn \l_@@_col_min_int { \int_max:nn \l_@@_col_min_int { #4 } }
+ \int_set:Nn \l_@@_row_max_int { \int_min:nn \l_@@_row_max_int { #5 } }
+ \int_set:Nn \l_@@_col_max_int { \int_min:nn \l_@@_col_max_int { #6 } }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_set_initial_coords:
+ {
+ \dim_set_eq:NN \l_@@_x_initial_dim \pgf at x
+ \dim_set_eq:NN \l_@@_y_initial_dim \pgf at y
+ }
+\cs_new_protected:Npn \@@_set_final_coords:
+ {
+ \dim_set_eq:NN \l_@@_x_final_dim \pgf at x
+ \dim_set_eq:NN \l_@@_y_final_dim \pgf at y
+ }
+\cs_new_protected:Npn \@@_set_initial_coords_from_anchor:n #1
+ {
+ \pgfpointanchor
+ {
+ \@@_env:
+ - \int_use:N \l_@@_initial_i_int
+ - \int_use:N \l_@@_initial_j_int
+ }
+ { #1 }
+ \@@_set_initial_coords:
+ }
+\cs_new_protected:Npn \@@_set_final_coords_from_anchor:n #1
+ {
+ \pgfpointanchor
+ {
+ \@@_env:
+ - \int_use:N \l_@@_final_i_int
+ - \int_use:N \l_@@_final_j_int
+ }
+ { #1 }
+ \@@_set_final_coords:
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_x_initial_dim:
+ {
+ \dim_set_eq:NN \l_@@_x_initial_dim \c_max_dim
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \int_use:N \l_@@_initial_j_int }
+ {
+ \pgfpointanchor
+ { \@@_env: - ##1 - \int_use:N \l_@@_initial_j_int }
+ { west }
+ \dim_set:Nn \l_@@_x_initial_dim
+ { \dim_min:nn \l_@@_x_initial_dim \pgf at x }
+ }
+ }
+% \end{macrocode}
+% If, in fact, all the cells of the columns are empty (no PGF/Tikz nodes in
+% those cells).
+% \begin{macrocode}
+ \dim_compare:nNnT \l_@@_x_initial_dim = \c_max_dim
+ {
+ \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
+ \dim_set_eq:NN \l_@@_x_initial_dim \pgf at x
+ \dim_add:Nn \l_@@_x_initial_dim \col at sep
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_x_final_dim:
+ {
+ \dim_set:Nn \l_@@_x_final_dim { - \c_max_dim }
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \int_use:N \l_@@_final_j_int }
+ {
+ \pgfpointanchor
+ { \@@_env: - ##1 - \int_use:N \l_@@_final_j_int }
+ { east }
+ \dim_set:Nn \l_@@_x_final_dim
+ { \dim_max:nn \l_@@_x_final_dim \pgf at x }
+ }
+ }
+% \end{macrocode}
+% If, in fact, all the cells of the columns are empty (no PGF/Tikz nodes in
+% those cells).
+% \begin{macrocode}
+ \dim_compare:nNnT \l_@@_x_final_dim = { - \c_max_dim }
+ {
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_final_j_int + 1 } }
+ \dim_set_eq:NN \l_@@_x_final_dim \pgf at x
+ \dim_sub:Nn \l_@@_x_final_dim \col at sep
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+% \interitem
+% The first and the second arguments are the coordinates of the cell where the
+% command has been issued. The third argument is the list of the options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_Ldots:nnn #1 #2 #3
+ {
+ \@@_adjust_to_submatrix:nn { #1 } { #2 }
+ \cs_if_free:cT { @@ _ dotted _ #1 - #2 }
+ {
+ \@@_find_extremities_of_line:nnnn { #1 } { #2 } 0 1
+% \end{macrocode}
+% The previous command may have changed the current environment by marking some
+% cells as ``dotted'', but, fortunately, it is outside the group for the options
+% of the line.
+% \begin{macrocode}
+ \group_begin:
+ \int_compare:nNnTF { #1 } = 0
+ { \color { nicematrix-first-row } }
+ {
+% \end{macrocode}
+% We remind that, when there is a ``last row'' |\l_@@_last_row_int| will always
+% be (after the construction of the array) the number of that ``last row'' even
+% if the option |last-row| has been used without value.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } = \l_@@_last_row_int
+ { \color { nicematrix-last-row } }
+ }
+ \keys_set:nn { NiceMatrix / xdots } { #3 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Ldots:
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The command |\@@_actually_draw_Ldots:| has the following implicit arguments:
+% \begin{itemize}
+% \item |\l_@@_initial_i_int|
+% \item |\l_@@_initial_j_int|
+% \item |\l_@@_initial_open_bool|
+% \item |\l_@@_final_i_int|
+% \item |\l_@@_final_j_int|
+% \item |\l_@@_final_open_bool|.
+% \end{itemize}
+%
+% The following function is also used by |\Hdotsfor|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_draw_Ldots:
+ {
+ \bool_if:NTF \l_@@_initial_open_bool
+ {
+ \@@_open_x_initial_dim:
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int - base }
+ \dim_set_eq:NN \l_@@_y_initial_dim \pgf at y
+ }
+ { \@@_set_initial_coords_from_anchor:n { base~east } }
+ \bool_if:NTF \l_@@_final_open_bool
+ {
+ \@@_open_x_final_dim:
+ \@@_qpoint:n { row - \int_use:N \l_@@_final_i_int - base }
+ \dim_set_eq:NN \l_@@_y_final_dim \pgf at y
+ }
+ { \@@_set_final_coords_from_anchor:n { base~west } }
+% \end{macrocode}
+% We raise the line of a quantity equal to the radius of the dots because we
+% want the dots really ``on'' the line of texte. Of course, maybe we should not
+% do that when the option |line-style| is used (?).
+% \begin{macrocode}
+ \dim_add:Nn \l_@@_y_initial_dim \l_@@_xdots_radius_dim
+ \dim_add:Nn \l_@@_y_final_dim \l_@@_xdots_radius_dim
+ \@@_draw_line:
+ }
+% \end{macrocode}
+%
+% \interitem
+% The first and the second arguments are the coordinates of the cell where the
+% command has been issued. The third argument is the list of the options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_Cdots:nnn #1 #2 #3
+ {
+ \@@_adjust_to_submatrix:nn { #1 } { #2 }
+ \cs_if_free:cT { @@ _ dotted _ #1 - #2 }
+ {
+ \@@_find_extremities_of_line:nnnn { #1 } { #2 } 0 1
+% \end{macrocode}
+% The previous command may have changed the current environment by marking some
+% cells as ``dotted'', but, fortunately, it is outside the group for the options
+% of the line.
+% \begin{macrocode}
+ \group_begin:
+ \int_compare:nNnTF { #1 } = 0
+ { \color { nicematrix-first-row } }
+ {
+% \end{macrocode}
+% We remind that, when there is a ``last row'' |\l_@@_last_row_int| will always
+% be (after the construction of the array) the number of that ``last row'' even
+% if the option |last-row| has been used without value.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } = \l_@@_last_row_int
+ { \color { nicematrix-last-row } }
+ }
+ \keys_set:nn { NiceMatrix / xdots } { #3 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Cdots:
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The command |\@@_actually_draw_Cdots:| has the following implicit arguments:
+% \begin{itemize}
+% \item |\l_@@_initial_i_int|
+% \item |\l_@@_initial_j_int|
+% \item |\l_@@_initial_open_bool|
+% \item |\l_@@_final_i_int|
+% \item |\l_@@_final_j_int|
+% \item |\l_@@_final_open_bool|.
+% \end{itemize}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_draw_Cdots:
+ {
+ \bool_if:NTF \l_@@_initial_open_bool
+ { \@@_open_x_initial_dim: }
+ { \@@_set_initial_coords_from_anchor:n { mid~east } }
+ \bool_if:NTF \l_@@_final_open_bool
+ { \@@_open_x_final_dim: }
+ { \@@_set_final_coords_from_anchor:n { mid~west } }
+ \bool_lazy_and:nnTF
+ \l_@@_initial_open_bool
+ \l_@@_final_open_bool
+ {
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at y
+ \@@_qpoint:n { row - \int_eval:n { \l_@@_initial_i_int + 1 } }
+ \dim_set:Nn \l_@@_y_initial_dim { ( \l_tmpa_dim + \pgf at y ) / 2 }
+ \dim_set_eq:NN \l_@@_y_final_dim \l_@@_y_initial_dim
+ }
+ {
+ \bool_if:NT \l_@@_initial_open_bool
+ { \dim_set_eq:NN \l_@@_y_initial_dim \l_@@_y_final_dim }
+ \bool_if:NT \l_@@_final_open_bool
+ { \dim_set_eq:NN \l_@@_y_final_dim \l_@@_y_initial_dim }
+ }
+ \@@_draw_line:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_y_initial_dim:
+ {
+ \@@_qpoint:n { row - \int_use:N \l_@@_initial_i_int - base }
+ \dim_set:Nn \l_@@_y_initial_dim
+ {
+ \fp_to_dim:n
+ {
+ \pgf at y
+ + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch
+ }
+ } % modified 6.13c
+ \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \int_use:N \l_@@_initial_i_int - ##1 }
+ {
+ \pgfpointanchor
+ { \@@_env: - \int_use:N \l_@@_initial_i_int - ##1 }
+ { north }
+ \dim_set:Nn \l_@@_y_initial_dim
+ { \dim_max:nn \l_@@_y_initial_dim \pgf at y }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_open_y_final_dim:
+ {
+ \@@_qpoint:n { row - \int_use:N \l_@@_final_i_int - base }
+ \dim_set:Nn \l_@@_y_final_dim
+ { \fp_to_dim:n { \pgf at y - ( \box_dp:N \strutbox ) * \arraystretch } }
+ % modified 6.13c
+ \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \int_use:N \l_@@_final_i_int - ##1 }
+ {
+ \pgfpointanchor
+ { \@@_env: - \int_use:N \l_@@_final_i_int - ##1 }
+ { south }
+ \dim_set:Nn \l_@@_y_final_dim
+ { \dim_min:nn \l_@@_y_final_dim \pgf at y }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% The first and the second arguments are the coordinates of the cell where the
+% command has been issued. The third argument is the list of the options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_Vdots:nnn #1 #2 #3
+ {
+ \@@_adjust_to_submatrix:nn { #1 } { #2 }
+ \cs_if_free:cT { @@ _ dotted _ #1 - #2 }
+ {
+ \@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 0
+% \end{macrocode}
+% The previous command may have changed the current environment by marking some
+% cells as ``dotted'', but, fortunately, it is outside the group for the options
+% of the line.
+% \begin{macrocode}
+ \group_begin:
+ \int_compare:nNnTF { #2 } = 0
+ { \color { nicematrix-first-col } }
+ {
+ \int_compare:nNnT { #2 } = \l_@@_last_col_int
+ { \color { nicematrix-last-col } }
+ }
+ \keys_set:nn { NiceMatrix / xdots } { #3 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl
+ { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Vdots:
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_actually_draw_Vdots:| has the following implicit arguments:
+% \begin{itemize}
+% \item |\l_@@_initial_i_int|
+% \item |\l_@@_initial_j_int|
+% \item |\l_@@_initial_open_bool|
+% \item |\l_@@_final_i_int|
+% \item |\l_@@_final_j_int|
+% \item |\l_@@_final_open_bool|.
+% \end{itemize}
+%
+% The following function is also used by |\Vdotsfor|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_draw_Vdots:
+ {
+% \end{macrocode}
+% The boolean |\l_tmpa_bool| indicates whether the column is of type |l| or may
+% be considered as if.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+% \end{macrocode}
+% First the case when the line is closed on both ends.
+% \begin{macrocode}
+ \bool_lazy_or:nnF \l_@@_initial_open_bool \l_@@_final_open_bool
+ {
+ \@@_set_initial_coords_from_anchor:n { south~west }
+ \@@_set_final_coords_from_anchor:n { north~west }
+ \bool_set:Nn \l_tmpa_bool
+ { \dim_compare_p:nNn \l_@@_x_initial_dim = \l_@@_x_final_dim }
+ }
+% \end{macrocode}
+% Now, we try to determine whether the column is of type |c| or may be
+% considered as if.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_initial_open_bool
+ \@@_open_y_initial_dim:
+ { \@@_set_initial_coords_from_anchor:n { south } }
+ \bool_if:NTF \l_@@_final_open_bool
+ \@@_open_y_final_dim:
+ { \@@_set_final_coords_from_anchor:n { north } }
+ \bool_if:NTF \l_@@_initial_open_bool
+ {
+ \bool_if:NTF \l_@@_final_open_bool
+ {
+ \@@_qpoint:n { col - \int_use:N \l_@@_initial_j_int }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at x
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_initial_j_int + 1 } }
+ \dim_set:Nn \l_@@_x_initial_dim { ( \pgf at x + \l_tmpa_dim ) / 2 }
+ \dim_set_eq:NN \l_@@_x_final_dim \l_@@_x_initial_dim
+% \end{macrocode}
+% We may think that the final user won't use a ``last column'' which contains
+% only a command |\Vdots|. However, if the |\Vdots| is in fact used to draw, not
+% a dotted line, but an arrow (to indicate the number of rows of the matrix), it
+% may be really encountered.
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_last_col_int > { -2 }
+ {
+ \int_compare:nNnT \l_@@_initial_j_int = \g_@@_col_total_int
+ {
+ \dim_set_eq:NN \l_tmpa_dim \l_@@_right_margin_dim
+ \dim_add:Nn \l_tmpa_dim \l_@@_extra_right_margin_dim
+ \dim_add:Nn \l_@@_x_initial_dim \l_tmpa_dim
+ \dim_add:Nn \l_@@_x_final_dim \l_tmpa_dim
+ }
+ }
+ }
+ { \dim_set_eq:NN \l_@@_x_initial_dim \l_@@_x_final_dim }
+ }
+ {
+ \bool_if:NTF \l_@@_final_open_bool
+ { \dim_set_eq:NN \l_@@_x_final_dim \l_@@_x_initial_dim }
+ {
+% \end{macrocode}
+% Now the case where both extremities are closed. The first conditional tests
+% whether the column is of type |c| or may be considered as if.
+% \begin{macrocode}
+ \dim_compare:nNnF \l_@@_x_initial_dim = \l_@@_x_final_dim
+ {
+ \dim_set:Nn \l_@@_x_initial_dim
+ {
+ \bool_if:NTF \l_tmpa_bool \dim_min:nn \dim_max:nn
+ \l_@@_x_initial_dim \l_@@_x_final_dim
+ }
+ \dim_set_eq:NN \l_@@_x_final_dim \l_@@_x_initial_dim
+ }
+ }
+ }
+ \@@_draw_line:
+ }
+% \end{macrocode}
+%
+% \interitem
+% For the diagonal lines, the situation is a bit more complicated because, by
+% default, we parallelize the diagonals lines. The first diagonal line is drawn
+% and then, all the other diagonal lines are drawn parallel to the first one.
+%
+% The first and the second arguments are the coordinates of the cell where the
+% command has been issued. The third argument is the list of the options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_Ddots:nnn #1 #2 #3
+ {
+ \@@_adjust_to_submatrix:nn { #1 } { #2 }
+ \cs_if_free:cT { @@ _ dotted _ #1 - #2 }
+ {
+ \@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 1
+% \end{macrocode}
+% The previous command may have changed the current environment by marking some
+% cells as ``dotted'', but, fortunately, it is outside the group for the options
+% of the line.
+% \begin{macrocode}
+ \group_begin:
+ \keys_set:nn { NiceMatrix / xdots } { #3 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Ddots:
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_actually_draw_Ddots:| has the following implicit arguments:
+% \begin{itemize}
+% \item |\l_@@_initial_i_int|
+% \item |\l_@@_initial_j_int|
+% \item |\l_@@_initial_open_bool|
+% \item |\l_@@_final_i_int|
+% \item |\l_@@_final_j_int|
+% \item |\l_@@_final_open_bool|.
+% \end{itemize}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_draw_Ddots:
+ {
+ \bool_if:NTF \l_@@_initial_open_bool
+ {
+ \@@_open_y_initial_dim:
+ \@@_open_x_initial_dim:
+ }
+ { \@@_set_initial_coords_from_anchor:n { south~east } }
+ \bool_if:NTF \l_@@_final_open_bool
+ {
+ \@@_open_x_final_dim:
+ \dim_set_eq:NN \l_@@_x_final_dim \pgf at x
+ }
+ { \@@_set_final_coords_from_anchor:n { north~west } }
+% \end{macrocode}
+% We have retrieved the coordinates in the usual way (they are stored in
+% |\l_@@_x_initial_dim|, etc.). If the parallelization of the diagonals is set,
+% we will have (maybe) to adjust the fourth coordinate.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_parallelize_diags_bool
+ {
+ \int_gincr:N \g_@@_ddots_int
+% \end{macrocode}
+% We test if the diagonal line is the first one (the counter |\g_@@_ddots_int|
+% is created for this usage).
+% \begin{macrocode}
+ \int_compare:nNnTF \g_@@_ddots_int = 1
+% \end{macrocode}
+% If the diagonal line is the first one, we have no adjustment of the line to do
+% but we store the $\Delta_x$ and the $\Delta_y$ of the line because these
+% values will be used to draw the others diagonal lines parallels to the first
+% one.
+% \begin{macrocode}
+ {
+ \dim_gset:Nn \g_@@_delta_x_one_dim
+ { \l_@@_x_final_dim - \l_@@_x_initial_dim }
+ \dim_gset:Nn \g_@@_delta_y_one_dim
+ { \l_@@_y_final_dim - \l_@@_y_initial_dim }
+ }
+% \end{macrocode}
+% If the diagonal line is not the first one, we have to adjust the second
+% extremity of the line by modifying the coordinate |\l_@@_x_initial_dim|.
+% \begin{macrocode}
+ {
+ \dim_set:Nn \l_@@_y_final_dim
+ {
+ \l_@@_y_initial_dim +
+ ( \l_@@_x_final_dim - \l_@@_x_initial_dim ) *
+ \dim_ratio:nn \g_@@_delta_y_one_dim \g_@@_delta_x_one_dim
+ }
+ }
+ }
+ \@@_draw_line:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We draw the |\Iddots| diagonals in the same way.
+%
+% The first and the second arguments are the coordinates of the cell where the
+% command has been issued. The third argument is the list of the options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_Iddots:nnn #1 #2 #3
+ {
+ \@@_adjust_to_submatrix:nn { #1 } { #2 }
+ \cs_if_free:cT { @@ _ dotted _ #1 - #2 }
+ {
+ \@@_find_extremities_of_line:nnnn { #1 } { #2 } 1 { -1 }
+% \end{macrocode}
+% The previous command may have changed the current environment by marking some
+% cells as ``dotted'', but, fortunately, it is outside the group for the options
+% of the line.
+% \begin{macrocode}
+ \group_begin:
+ \keys_set:nn { NiceMatrix / xdots } { #3 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Iddots:
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_actually_draw_Iddots:| has the following implicit arguments:
+% \begin{itemize}
+% \item |\l_@@_initial_i_int|
+% \item |\l_@@_initial_j_int|
+% \item |\l_@@_initial_open_bool|
+% \item |\l_@@_final_i_int|
+% \item |\l_@@_final_j_int|
+% \item |\l_@@_final_open_bool|.
+% \end{itemize}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_draw_Iddots:
+ {
+ \bool_if:NTF \l_@@_initial_open_bool
+ {
+ \@@_open_y_initial_dim:
+ \@@_open_x_initial_dim:
+ }
+ { \@@_set_initial_coords_from_anchor:n { south~west } }
+ \bool_if:NTF \l_@@_final_open_bool
+ {
+ \@@_open_y_final_dim:
+ \@@_open_x_final_dim:
+ }
+ { \@@_set_final_coords_from_anchor:n { north~east } }
+ \bool_if:NT \l_@@_parallelize_diags_bool
+ {
+ \int_gincr:N \g_@@_iddots_int
+ \int_compare:nNnTF \g_@@_iddots_int = 1
+ {
+ \dim_gset:Nn \g_@@_delta_x_two_dim
+ { \l_@@_x_final_dim - \l_@@_x_initial_dim }
+ \dim_gset:Nn \g_@@_delta_y_two_dim
+ { \l_@@_y_final_dim - \l_@@_y_initial_dim }
+ }
+ {
+ \dim_set:Nn \l_@@_y_final_dim
+ {
+ \l_@@_y_initial_dim +
+ ( \l_@@_x_final_dim - \l_@@_x_initial_dim ) *
+ \dim_ratio:nn \g_@@_delta_y_two_dim \g_@@_delta_x_two_dim
+ }
+ }
+ }
+ \@@_draw_line:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The actual instructions for drawing the dotted lines with Tikz}
+%
+% The command |\@@_draw_line:| should be used in a |{pgfpicture}|. It has six
+% implicit arguments:
+%
+% \begin{itemize}
+% \item |\l_@@_x_initial_dim|
+% \item |\l_@@_y_initial_dim|
+% \item |\l_@@_x_final_dim|
+% \item |\l_@@_y_final_dim|
+% \item |\l_@@_initial_open_bool|
+% \item |\l_@@_final_open_bool|
+% \end{itemize}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_line:
+ {
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \bool_lazy_or:nnTF
+ { \tl_if_eq_p:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl }
+ \l_@@_dotted_bool
+ \@@_draw_standard_dotted_line:
+ \@@_draw_unstandard_dotted_line:
+ }
+% \end{macrocode}
+%
+% \medskip
+% We have to do a special construction with |\exp_args:NV| to be able to put in
+% the list of options in the correct place in the Tikz instruction.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_unstandard_dotted_line:
+ {
+ \begin { scope }
+ \@@_draw_unstandard_dotted_line:o
+ { \l_@@_xdots_line_style_tl , \l_@@_xdots_color_tl }
+ }
+% \end{macrocode}
+% We have used the fact that, in \textsc{pgf}, un color name can be put directly
+% in a list of options (that's why we have put diredtly |\l_@@_xdots_color_tl|).
+%
+% \smallskip
+% The argument of |\@@_draw_unstandard_dotted_line:n| is, in fact, the list of options.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_unstandard_dotted_line:n #1
+ {
+ \@@_draw_unstandard_dotted_line:nVV
+ { #1 }
+ \l_@@_xdots_up_tl
+ \l_@@_xdots_down_tl
+ }
+\cs_generate_variant:Nn \@@_draw_unstandard_dotted_line:n { o }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_unstandard_dotted_line:nnn #1 #2 #3
+ {
+ \draw
+ [
+ #1 ,
+ shorten~> = \l_@@_xdots_shorten_end_dim ,
+ shorten~< = \l_@@_xdots_shorten_start_dim ,
+ ]
+ ( \l_@@_x_initial_dim , \l_@@_y_initial_dim )
+% \end{macrocode}
+% Be careful: We can't put |\c_math_toggle_token| instead of |$| in the
+% following lines because we are in the contents of Tikz nodes (and they will be
+% \emph{rescanned} if the Tikz library \pkg{babel} is loaded).
+% \begin{macrocode}
+ -- node [ sloped , above ] { $ \scriptstyle #2 $ }
+ node [ sloped , below ] { $ \scriptstyle #3 $ }
+ ( \l_@@_x_final_dim , \l_@@_y_final_dim ) ;
+ \end { scope }
+ }
+\cs_generate_variant:Nn \@@_draw_unstandard_dotted_line:nnn { n V V }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_draw_standard_dotted_line:| draws the line with our system of dots
+% (which gives a dotted line with real round dots).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_standard_dotted_line:
+ {
+ \bool_lazy_and:nnF
+ { \tl_if_empty_p:N \l_@@_xdots_up_tl }
+ { \tl_if_empty_p:N \l_@@_xdots_down_tl }
+ {
+ \pgfscope
+ \pgftransformshift
+ {
+ \pgfpointlineattime { 0.5 }
+ { \pgfpoint \l_@@_x_initial_dim \l_@@_y_initial_dim }
+ { \pgfpoint \l_@@_x_final_dim \l_@@_y_final_dim }
+ }
+ \pgftransformrotate
+ {
+ \fp_eval:n
+ {
+ atand
+ (
+ \l_@@_y_final_dim - \l_@@_y_initial_dim ,
+ \l_@@_x_final_dim - \l_@@_x_initial_dim
+ )
+ }
+ }
+ \pgfnode
+ { rectangle }
+ { south }
+ {
+ \c_math_toggle_token
+ \scriptstyle \l_@@_xdots_up_tl
+ \c_math_toggle_token
+ }
+ { }
+ { \pgfusepath { } }
+ \pgfnode
+ { rectangle }
+ { north }
+ {
+ \c_math_toggle_token
+ \scriptstyle \l_@@_xdots_down_tl
+ \c_math_toggle_token
+ }
+ { }
+ { \pgfusepath { } }
+ \endpgfscope
+ }
+ \group_begin:
+% \end{macrocode}
+% The dimension |\l_@@_l_dim| is the length $\ell$ of the line to draw. We use
+% the floating point reals of the L3 programming layer to compute this length.
+% \begin{macrocode}
+ \dim_zero_new:N \l_@@_l_dim
+ \dim_set:Nn \l_@@_l_dim
+ {
+ \fp_to_dim:n
+ {
+ sqrt
+ (
+ ( \l_@@_x_final_dim - \l_@@_x_initial_dim ) ^ 2
+ +
+ ( \l_@@_y_final_dim - \l_@@_y_initial_dim ) ^ 2
+ )
+ }
+ }
+% \end{macrocode}
+% It seems that, during the first compilations, the value of |\l_@@_l_dim| may
+% be erroneous (equal to zero or very large). We must detect these cases
+% because they would cause errors during the drawing of the dotted line. Maybe
+% we should also write something in the |aux| file to say that one more
+% compilation should be done.
+% \begin{macrocode}
+ \bool_lazy_or:nnF
+ { \dim_compare_p:nNn { \dim_abs:n \l_@@_l_dim } > \c_@@_max_l_dim }
+ { \dim_compare_p:nNn \l_@@_l_dim = \c_zero_dim }
+ \@@_draw_standard_dotted_line_i:
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\dim_const:Nn \c_@@_max_l_dim { 50 cm }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_standard_dotted_line_i:
+ {
+% \end{macrocode}
+% The number of dots will be |\l_tmpa_int + 1|.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_initial_open_bool
+ {
+ \bool_if:NTF \l_@@_final_open_bool
+ {
+ \int_set:Nn \l_tmpa_int
+ { \dim_ratio:nn \l_@@_l_dim \l_@@_xdots_inter_dim }
+ }
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \dim_ratio:nn
+ { \l_@@_l_dim - \l_@@_xdots_shorten_start_dim }
+ \l_@@_xdots_inter_dim
+ }
+ }
+ }
+ {
+ \bool_if:NTF \l_@@_final_open_bool
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \dim_ratio:nn
+ { \l_@@_l_dim - \l_@@_xdots_shorten_end_dim }
+ \l_@@_xdots_inter_dim
+ }
+ }
+ {
+ \int_set:Nn \l_tmpa_int
+ {
+ \dim_ratio:nn
+ {
+ \l_@@_l_dim
+ - \l_@@_xdots_shorten_start_dim - \l_@@_xdots_shorten_end_dim
+ }
+ \l_@@_xdots_inter_dim
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The dimensions |\l_tmpa_dim| and |\l_tmpb_dim| are the coordinates of the
+% vector between two dots in the dotted line.
+% \begin{macrocode}
+ \dim_set:Nn \l_tmpa_dim
+ {
+ ( \l_@@_x_final_dim - \l_@@_x_initial_dim ) *
+ \dim_ratio:nn \l_@@_xdots_inter_dim \l_@@_l_dim
+ }
+ \dim_set:Nn \l_tmpb_dim
+ {
+ ( \l_@@_y_final_dim - \l_@@_y_initial_dim ) *
+ \dim_ratio:nn \l_@@_xdots_inter_dim \l_@@_l_dim
+ }
+% \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.
+%
+% \begin{macrocode}
+ \dim_gadd:Nn \l_@@_x_initial_dim
+ {
+ ( \l_@@_x_final_dim - \l_@@_x_initial_dim ) *
+ \dim_ratio:nn
+ {
+ \l_@@_l_dim - \l_@@_xdots_inter_dim * \l_tmpa_int
+ + \l_@@_xdots_shorten_start_dim - \l_@@_xdots_shorten_end_dim
+ }
+ { 2 \l_@@_l_dim }
+ }
+ \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_@@_xdots_shorten_start_dim - \l_@@_xdots_shorten_end_dim
+ }
+ { 2 \l_@@_l_dim }
+ }
+ \pgf at relevantforpicturesizefalse
+ \int_step_inline:nnn 0 \l_tmpa_int
+ {
+ \pgfpathcircle
+ { \pgfpoint \l_@@_x_initial_dim \l_@@_y_initial_dim }
+ { \l_@@_xdots_radius_dim }
+ \dim_add:Nn \l_@@_x_initial_dim \l_tmpa_dim
+ \dim_add:Nn \l_@@_y_initial_dim \l_tmpb_dim
+ }
+ \pgfusepathqfill
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{User commands available in the new environments}
+%
+%
+% The commands |\@@_Ldots|, |\@@_Cdots|, |\@@_Vdots|, |\@@_Ddots| and
+% |\@@_Iddots| will be linked to |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots| and
+% |\Iddots| in the environments |{NiceArray}| (the other environments of
+% \pkg{nicematrix} rely upon |{NiceArray}|).
+%
+%
+% \medskip
+% The syntax of these commands uses the character |_| as embellishment and
+% thats' why we have to insert a character |_| in the \emph{arg spec} of these
+% commands. However, we don't know the future catcode of |_| in the main
+% document (maybe the user will use \pkg{underscore}, and, in that case, the
+% catcode is $13$ because \pkg{underscore} activates |_|). That's why these
+% commands will be defined in a |\hook_gput_code:nnn { begindocument } { . }|
+% and the \emph{arg spec} will be rescanned.
+%
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \tl_set:Nn \l_@@_argspec_tl { O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_Ldots \l_@@_argspec_tl
+ {
+ \int_compare:nNnTF \c at jCol = 0
+ { \@@_error:nn { in~first~col } \Ldots }
+ {
+ \int_compare:nNnTF \c at jCol = \l_@@_last_col_int
+ { \@@_error:nn { in~last~col } \Ldots }
+ {
+ \@@_instruction_of_type:nnn \c_false_bool { Ldots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_ldots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \exp_args:NNV \NewDocumentCommand \@@_Cdots \l_@@_argspec_tl
+ {
+ \int_compare:nNnTF \c at jCol = 0
+ { \@@_error:nn { in~first~col } \Cdots }
+ {
+ \int_compare:nNnTF \c at jCol = \l_@@_last_col_int
+ { \@@_error:nn { in~last~col } \Cdots }
+ {
+ \@@_instruction_of_type:nnn \c_false_bool { Cdots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_cdots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \exp_args:NNV \NewDocumentCommand \@@_Vdots \l_@@_argspec_tl
+ {
+ \int_compare:nNnTF \c at iRow = 0
+ { \@@_error:nn { in~first~row } \Vdots }
+ {
+ \int_compare:nNnTF \c at iRow = \l_@@_last_row_int
+ { \@@_error:nn { in~last~row } \Vdots }
+ {
+ \@@_instruction_of_type:nnn \c_false_bool { Vdots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_vdots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+ \exp_args:NNV \NewDocumentCommand \@@_Ddots \l_@@_argspec_tl
+ {
+ \int_case:nnF \c at iRow
+ {
+ 0 { \@@_error:nn { in~first~row } \Ddots }
+ \l_@@_last_row_int { \@@_error:nn { in~last~row } \Ddots }
+ }
+ {
+ \int_case:nnF \c at jCol
+ {
+ 0 { \@@_error:nn { in~first~col } \Ddots }
+ \l_@@_last_col_int { \@@_error:nn { in~last~col } \Ddots }
+ }
+ {
+ \keys_set_known:nn { NiceMatrix / Ddots } { #1 }
+ \@@_instruction_of_type:nnn \l_@@_draw_first_bool { Ddots }
+ { #1 , down = #2 , up = #3 }
+ }
+
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_ddots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \exp_args:NNV \NewDocumentCommand \@@_Iddots \l_@@_argspec_tl
+ {
+ \int_case:nnF \c at iRow
+ {
+ 0 { \@@_error:nn { in~first~row } \Iddots }
+ \l_@@_last_row_int { \@@_error:nn { in~last~row } \Iddots }
+ }
+ {
+ \int_case:nnF \c at jCol
+ {
+ 0 { \@@_error:nn { in~first~col } \Iddots }
+ \l_@@_last_col_int { \@@_error:nn { in~last~col } \Iddots }
+ }
+ {
+ \keys_set_known:nn { NiceMatrix / Ddots } { #1 }
+ \@@_instruction_of_type:nnn \l_@@_draw_first_bool { Iddots }
+ { #1 , down = #2 , up = #3 }
+ }
+ }
+ \bool_if:NF \l_@@_nullify_dots_bool
+ { \phantom { \ensuremath { \@@_old_iddots } } }
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ }
+ }
+% \end{macrocode}
+% End of the |\AddToHook|.
+%
+%
+% \bigskip
+% Despite its name, the following set of keys will be used for |\Ddots| but also
+% for |\Iddots|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Ddots }
+ {
+ draw-first .bool_set:N = \l_@@_draw_first_bool ,
+ draw-first .default:n = true ,
+ draw-first .value_forbidden:n = true
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_Hspace:| will be linked to |\hspace| in |{NiceArray}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Hspace:
+ {
+ \bool_gset_true:N \g_@@_empty_cell_bool
+ \hspace
+ }
+% \end{macrocode}
+%
+% \bigskip
+% In the environments of |nicematrix|, the command |\multicolumn| is redefined.
+% We will patch the environment |{tabular}| to go back to the previous value of
+% |\multicolumn|.
+% \begin{macrocode}
+\cs_set_eq:NN \@@_old_multicolumn \multicolumn
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The command |\@@_Hdotsfor| will be linked to |\Hdotsfor| in
+% |{NiceArrayWithDelims}|. Tikz nodes are created also in the implicit cells of
+% the |\Hdotsfor| (maybe we should modify that point).
+%
+% \medskip
+% This command must \emph{not} be protected since it begins with |\multicolumn|.
+% \begin{macrocode}
+\cs_new:Npn \@@_Hdotsfor:
+ {
+ \bool_lazy_and:nnTF
+ { \int_compare_p:nNn \c at jCol = 0 }
+ { \int_compare_p:nNn \l_@@_first_col_int = 0 }
+ {
+ \bool_if:NTF \g_@@_after_col_zero_bool
+ {
+ \multicolumn { 1 } { c } { }
+ \@@_Hdotsfor_i
+ }
+ { \@@_fatal:n { Hdotsfor~in~col~0 } }
+ }
+ {
+ \multicolumn { 1 } { c } { }
+ \@@_Hdotsfor_i
+ }
+ }
+% \end{macrocode}
+%
+%
+% The command |\@@_Hdotsfor_i| is defined with |\NewDocumentCommand| because it
+% has an optional argument. Note that such a command defined by
+% |\NewDocumentCommand| is protected and that's why we have put the
+% |\multicolumn| before (in the definition of |\@@_Hdotsfor:|).
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+% \end{macrocode}
+% We don't put |!| before the last optionnal argument for homogeneity with
+% |\Cdots|, etc. which have only one optional argument.
+% \begin{macrocode}
+ \exp_args:NNV \NewDocumentCommand \@@_Hdotsfor_i \l_@@_argspec_tl
+ {
+ \tl_gput_right:Nx \g_@@_HVdotsfor_lines_tl
+ {
+ \@@_Hdotsfor:nnnn
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { #2 }
+ {
+ #1 , #3 ,
+ down = \exp_not:n { #4 } ,
+ up = \exp_not:n { #5 }
+ }
+ }
+ \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { c } { } }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Hdotsfor:nnnn #1 #2 #3 #4
+ {
+ \bool_set_false:N \l_@@_initial_open_bool
+ \bool_set_false:N \l_@@_final_open_bool
+% \end{macrocode}
+% For the row, it's easy.
+% \begin{macrocode}
+ \int_set:Nn \l_@@_initial_i_int { #1 }
+ \int_set_eq:NN \l_@@_final_i_int \l_@@_initial_i_int
+% \end{macrocode}
+% For the column, it's a bit more complicated.
+% \begin{macrocode}
+ \int_compare:nNnTF { #2 } = 1
+ {
+ \int_set:Nn \l_@@_initial_j_int 1
+ \bool_set_true:N \l_@@_initial_open_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_use:N \l_@@_initial_i_int
+ - \int_eval:n { #2 - 1 }
+ }
+ { \int_set:Nn \l_@@_initial_j_int { #2 - 1 } }
+ {
+ \int_set:Nn \l_@@_initial_j_int { #2 }
+ \bool_set_true:N \l_@@_initial_open_bool
+ }
+ }
+ \int_compare:nNnTF { #2 + #3 -1 } = \c at jCol
+ {
+ \int_set:Nn \l_@@_final_j_int { #2 + #3 - 1 }
+ \bool_set_true:N \l_@@_final_open_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_use:N \l_@@_final_i_int
+ - \int_eval:n { #2 + #3 }
+ }
+ { \int_set:Nn \l_@@_final_j_int { #2 + #3 } }
+ {
+ \int_set:Nn \l_@@_final_j_int { #2 + #3 - 1 }
+ \bool_set_true:N \l_@@_final_open_bool
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \group_begin:
+ \int_compare:nNnTF { #1 } = 0
+ { \color { nicematrix-first-row } }
+ {
+ \int_compare:nNnT { #1 } = \g_@@_row_total_int
+ { \color { nicematrix-last-row } }
+ }
+ \keys_set:nn { NiceMatrix / xdots } { #4 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Ldots:
+ \group_end:
+% \end{macrocode}
+%
+% \medskip
+% We declare all the cells concerned by the |\Hdotsfor| as ``dotted'' (for the
+% dotted lines created by |\Cdots|, |\Ldots|, etc., this job is done by
+% |\@@_find_extremities_of_line:nnnn|). This declaration is done by defining a
+% special control sequence (to nil).
+% \begin{macrocode}
+ \int_step_inline:nnn { #2 } { #2 + #3 - 1 }
+ { \cs_set:cpn { @@ _ dotted _ #1 - ##1 } { } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \tl_set:Nn \l_@@_argspec_tl { O { } m O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_Vdotsfor: \l_@@_argspec_tl
+ {
+ \tl_gput_right:Nx \g_@@_HVdotsfor_lines_tl
+ {
+ \@@_Vdotsfor:nnnn
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { #2 }
+ {
+ #1 , #3 ,
+ down = \exp_not:n { #4 } , up = \exp_not:n { #5 }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% Enf of |\AddToHook|.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Vdotsfor:nnnn #1 #2 #3 #4
+ {
+ \bool_set_false:N \l_@@_initial_open_bool
+ \bool_set_false:N \l_@@_final_open_bool
+% \end{macrocode}
+% For the column, it's easy.
+% \begin{macrocode}
+ \int_set:Nn \l_@@_initial_j_int { #2 }
+ \int_set_eq:NN \l_@@_final_j_int \l_@@_initial_j_int
+% \end{macrocode}
+% For the row, it's a bit more complicated.
+% \begin{macrocode}
+ \int_compare:nNnTF #1 = 1
+ {
+ \int_set:Nn \l_@@_initial_i_int 1
+ \bool_set_true:N \l_@@_initial_open_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_eval:n { #1 - 1 }
+ - \int_use:N \l_@@_initial_j_int
+ }
+ { \int_set:Nn \l_@@_initial_i_int { #1 - 1 } }
+ {
+ \int_set:Nn \l_@@_initial_i_int { #1 }
+ \bool_set_true:N \l_@@_initial_open_bool
+ }
+ }
+ \int_compare:nNnTF { #1 + #3 -1 } = \c at iRow
+ {
+ \int_set:Nn \l_@@_final_i_int { #1 + #3 - 1 }
+ \bool_set_true:N \l_@@_final_open_bool
+ }
+ {
+ \cs_if_exist:cTF
+ {
+ pgf @ sh @ ns @ \@@_env:
+ - \int_eval:n { #1 + #3 }
+ - \int_use:N \l_@@_final_j_int
+ }
+ { \int_set:Nn \l_@@_final_i_int { #1 + #3 } }
+ {
+ \int_set:Nn \l_@@_final_i_int { #1 + #3 - 1 }
+ \bool_set_true:N \l_@@_final_open_bool
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \group_begin:
+ \int_compare:nNnTF { #2 } = 0
+ { \color { nicematrix-first-col } }
+ {
+ \int_compare:nNnT { #2 } = \g_@@_col_total_int
+ { \color { nicematrix-last-col } }
+ }
+ \keys_set:nn { NiceMatrix / xdots } { #4 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \@@_actually_draw_Vdots:
+ \group_end:
+% \end{macrocode}
+%
+% \medskip
+% We declare all the cells concerned by the |\Vdotsfor| as ``dotted'' (for the
+% dotted lines created by |\Cdots|, |\Ldots|, etc., this job is done by
+% |\@@_find_extremities_of_line:nnnn|). This declaration is done by defining a
+% special control sequence (to nil).
+% \begin{macrocode}
+ \int_step_inline:nnn { #1 } { #1 + #3 - 1 }
+ { \cs_set:cpn { @@ _ dotted _ ##1 - #2 } { } }
+ }
+% \end{macrocode}
+%
+%
+% \vspace{1cm}
+% The command |\@@_rotate:| will be linked to |\rotate| in
+% |{NiceArrayWithDelims}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rotate: { \bool_gset_true:N \g_@@_rotate_bool }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The command \textbackslash line accessible in code-after}
+%
+% In the |\CodeAfter|, the command |\@@_line:nn| will be linked to |\line|. This
+% command takes two arguments which are the specifications of two cells in the
+% array (in the format $i$-$j$) and draws a dotted line between these cells.
+%
+% \medskip
+% 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}
+%
+%
+% \medskip
+% With the following construction, the command |\@@_double_int_eval:n| is
+% applied to both arguments before the application of |\@@_line_i:nn| (the
+% construction uses the fact the |\@@_line_i:nn| is protected and that
+% |\@@_double_int_eval:n| is fully expandable).
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \tl_set:Nn \l_@@_argspec_tl { O { } m m ! O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_line \l_@@_argspec_tl
+ {
+ \group_begin:
+ \keys_set:nn { NiceMatrix / xdots } { #1 , #4 , down = #5 , up = #6 }
+ \tl_if_empty:VF \l_@@_xdots_color_tl { \color { \l_@@_xdots_color_tl } }
+ \use:e
+ {
+ \@@_line_i:nn
+ { \@@_double_int_eval:n #2 - \q_stop }
+ { \@@_double_int_eval:n #3 - \q_stop }
+ }
+ \group_end:
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_line_i:nn #1 #2
+ {
+ \bool_set_false:N \l_@@_initial_open_bool
+ \bool_set_false:N \l_@@_final_open_bool
+ \bool_if:nTF
+ {
+ \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #1 }
+ ||
+ \cs_if_free_p:c { pgf @ sh @ ns @ \@@_env: - #2 }
+ }
+ {
+ \@@_error:nnn { unknown~cell~for~line~in~CodeAfter } { #1 } { #2 }
+ }
+ { \@@_draw_line_ii:nn { #1 } { #2 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \cs_new_protected:Npx \@@_draw_line_ii:nn #1 #2
+ {
+% \end{macrocode}
+% We recall that, when externalization is used, |\tikzpicture| and
+% |\endtikzpicture| (or |\pgfpicture| and |\endpgfpicture|) must be directly
+% ``visible'' and that why we do this static construction of the command
+% |\@@_draw_line_ii:|.
+% \begin{macrocode}
+ \c_@@_pgfortikzpicture_tl
+ \@@_draw_line_iii:nn { #1 } { #2 }
+ \c_@@_endpgfortikzpicture_tl
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command \emph{must} be protected (it's used in the
+% construction of |\@@_draw_line_ii:nn|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_line_iii:nn #1 #2
+ {
+ \pgfrememberpicturepositiononpagetrue
+ \pgfpointshapeborder { \@@_env: - #1 } { \@@_qpoint:n { #2 } }
+ \dim_set_eq:NN \l_@@_x_initial_dim \pgf at x
+ \dim_set_eq:NN \l_@@_y_initial_dim \pgf at y
+ \pgfpointshapeborder { \@@_env: - #2 } { \@@_qpoint:n { #1 } }
+ \dim_set_eq:NN \l_@@_x_final_dim \pgf at x
+ \dim_set_eq:NN \l_@@_y_final_dim \pgf at y
+ \@@_draw_line:
+ }
+% \end{macrocode}
+%
+%
+% The commands |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, and |\Iddots| don't use
+% this command because they have to do other settings (for example, the diagonal
+% lines must be parallelized).
+%
+%
+%
+% \bigskip
+% \section{The command \textbackslash RowStyle}
+%
+% \medskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / RowStyle }
+ {
+ cell-space-top-limit .dim_set:N = \l_tmpa_dim ,
+ cell-space-top-limit .initial:n = \c_zero_dim ,
+ cell-space-top-limit .value_required:n = true ,
+ cell-space-bottom-limit .dim_set:N = \l_tmpb_dim ,
+ cell-space-bottom-limit .initial:n = \c_zero_dim ,
+ cell-space-bottom-limit .value_required:n = true ,
+ cell-space-limits .meta:n =
+ {
+ cell-space-top-limit = #1 ,
+ cell-space-bottom-limit = #1 ,
+ } ,
+ color .tl_set:N = \l_@@_color_tl ,
+ color .value_required:n = true ,
+ bold .bool_set:N = \l_tmpa_bool ,
+ bold .default:n = true ,
+ bold .initial:n = false ,
+ nb-rows .code:n =
+ \str_if_eq:nnTF { #1 } { * }
+ { \int_set:Nn \l_@@_key_nb_rows_int { 500 } }
+ { \int_set:Nn \l_@@_key_nb_rows_int { #1 } } ,
+ nb-rows .value_required:n = true ,
+ rowcolor .tl_set:N = \l_tmpa_tl ,
+ rowcolor .value_required:n = true ,
+ rowcolor .initial:n = ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~RowStyle }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_RowStyle:n { O { } m }
+ {
+ \group_begin:
+ \tl_clear:N \l_tmpa_tl % value of \rowcolor
+ \tl_clear:N \l_@@_color_tl
+ \int_set:Nn \l_@@_key_nb_rows_int 1
+ \keys_set:nn { NiceMatrix / RowStyle } { #1 }
+% \end{macrocode}
+% If the key |rowcolor| has been used.
+% \begin{macrocode}
+ \tl_if_empty:NF \l_tmpa_tl
+ {
+% \end{macrocode}
+% First, the end of the current row (we remind that |\RowStyle| applies to the
+% \emph{end} of the current row).
+% \begin{macrocode}
+ \tl_gput_right:Nx \g_@@_pre_code_before_tl
+ {
+% \end{macrocode}
+% The command |\@@_exp_color_arg:NV| is \emph{fully expandable}.
+% \begin{macrocode}
+ \@@_exp_color_arg:NV \@@_rectanglecolor \l_tmpa_tl
+ { \int_use:N \c at iRow - \int_use:N \c at jCol }
+ { \int_use:N \c at iRow - * }
+ }
+% \end{macrocode}
+% Then, the other rows (if there is several rows).
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_key_nb_rows_int > 1
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_before_tl
+ {
+ \@@_exp_color_arg:NV \@@_rowcolor \l_tmpa_tl
+ {
+ \int_eval:n { \c at iRow + 1 }
+ - \int_eval:n { \c at iRow + \l_@@_key_nb_rows_int - 1 }
+ }
+ }
+ }
+ }
+ \tl_gput_right:Nn \g_@@_row_style_tl { \ifnum \c at iRow < }
+ \tl_gput_right:Nx \g_@@_row_style_tl
+ { \int_eval:n { \c at iRow + \l_@@_key_nb_rows_int } }
+ \tl_gput_right:Nn \g_@@_row_style_tl { #2 }
+% \end{macrocode}
+% |\l_tmpa_dim| is the value of the key |cell-space-top-limit| of |\RowStyle|.
+% \begin{macrocode}
+ \dim_compare:nNnT \l_tmpa_dim > \c_zero_dim
+ {
+ \tl_gput_right:Nx \g_@@_row_style_tl
+ {
+ \tl_gput_right:Nn \exp_not:N \g_@@_cell_after_hook_tl
+ {
+ \dim_set:Nn \l_@@_cell_space_top_limit_dim
+ { \dim_use:N \l_tmpa_dim }
+ }
+ }
+ }
+% \end{macrocode}
+% |\l_tmpb_dim| is the value of the key |cell-space-bottom-limit| of |\RowStyle|.
+% \begin{macrocode}
+ \dim_compare:nNnT \l_tmpb_dim > \c_zero_dim
+ {
+ \tl_gput_right:Nx \g_@@_row_style_tl
+ {
+ \tl_gput_right:Nn \exp_not:N \g_@@_cell_after_hook_tl
+ {
+ \dim_set:Nn \l_@@_cell_space_bottom_limit_dim
+ { \dim_use:N \l_tmpb_dim }
+ }
+ }
+ }
+% \end{macrocode}
+% |\l_@@_color_tl| is the value of the key |color| of |\RowStyle|.
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_color_tl
+ {
+ \tl_gput_right:Nx \g_@@_row_style_tl
+ {
+ \mode_leave_vertical:
+ \@@_color:n { \l_@@_color_tl }
+ }
+ }
+% \end{macrocode}
+% |\l_tmpa_bool| is the value of the key |bold|.
+% \begin{macrocode}
+ \bool_if:NT \l_tmpa_bool
+ {
+ \tl_gput_right:Nn \g_@@_row_style_tl
+ {
+ \if_mode_math:
+ \c_math_toggle_token
+ \bfseries \boldmath
+ \c_math_toggle_token
+ \else:
+ \bfseries \boldmath
+ \fi:
+ }
+ }
+ \tl_gput_right:Nn \g_@@_row_style_tl { \fi }
+ \group_end:
+ \g_@@_row_style_tl
+ \ignorespaces
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{Colors of cells, rows and columns}
+%
+% We want to avoid the thin white lines that are shown in some \textsc{pdf}
+% viewers (eg: with the engine MuPDF used by SumatraPDF). That's why we try to
+% draw rectangles of the same color in the same instruction |\pgfusepath { fill }|
+% (and they will be in the same instruction |fill|---coded |f|---in the
+% resulting \textsc{pdf}).
+%
+% The commands |\@@_rowcolor|, |\@@_columncolor|, |\@@_rectanglecolor| and
+% |\@@_rowlistcolors| don't directly draw the corresponding rectangles. Instead,
+% they store their instructions color by color:
+% \begin{itemize}
+% \item A sequence |\g_@@_colors_seq| will be built containing all the colors
+% used by at least one of these instructions. Each \emph{color} may be prefixed
+% by its color model (eg: |[gray]{0.5}|).
+% \item For the color whose index in |\g_@@_colors_seq| is equal to~$i$, a list of
+% instructions which use that color will be constructed in the token list
+% |\g_@@_color_|$i$|_tl|. In that token list, the instructions will be written
+% using |\@@_cartesian_color:nn| and |\@@_rectanglecolor:nn|.
+% \end{itemize}
+%
+%
+% \bigskip
+% |#1| is the color and |#2| is an instruction using that color. Despite its
+% name, the command |\@@_add_to_colors_seq:nn| doesn't only add a color to
+% |\g_@@_colors_seq|: it also updates the corresponding token list
+% |\g_@@_color_|$i$|_tl|. We add in a global way because the final user may use
+% the instructions such as |\cellcolor| in a loop of \pkg{pgffor} in the
+% |\CodeBefore| (and we recall that a loop of \pkg{pgffor} is encapsulated in a
+% group).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_add_to_colors_seq:nn #1 #2
+ {
+% \end{macrocode}
+% Firt, we look for the number of the color and, if it's found, we store it in
+% |\l_tmpa_int|. If the color is not present in |\l_@@_colors_seq|,
+% |\l_tmpa_int| will remain equal to $0$.
+% \begin{macrocode}
+ \int_zero:N \l_tmpa_int
+% \end{macrocode}
+% We don't take into account the colors like |myserie!!+| because those colors
+% are special color from a |\definecolorseries| of \pkg{xcolor}.
+% \begin{macrocode}
+ \str_if_in:nnF { #1 } { !! }
+ {
+ \seq_map_indexed_inline:Nn \g_@@_colors_seq
+ { \tl_if_eq:nnT { #1 } { ##2 } { \int_set:Nn \l_tmpa_int { ##1 } } }
+ }
+ \int_compare:nNnTF \l_tmpa_int = \c_zero_int
+% \end{macrocode}
+% First, the case where the color is a \emph{new} color (not in the sequence).
+% \begin{macrocode}
+ {
+ \seq_gput_right:Nn \g_@@_colors_seq { #1 }
+ \tl_gset:cx { g_@@_color _ \seq_count:N \g_@@_colors_seq _ tl } { #2 }
+ }
+% \end{macrocode}
+% Now, the case where the color is \emph{not} a new color (the color is in the
+% sequence at the position |\l_tmpa_int|).
+% \begin{macrocode}
+ { \tl_gput_right:cx { g_@@_color _ \int_use:N \l_tmpa_int _tl } { #2 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_add_to_colors_seq:nn { x n }
+\cs_generate_variant:Nn \@@_add_to_colors_seq:nn { x x }
+% \end{macrocode}
+%
+% \bigskip
+% The macro |\@@_actually_color:| will actually fill all the rectangles, color by
+% color (using the sequence |\l_@@_colors_seq| and all the token lists of the
+% form |\l_@@_color_|$i$|_tl|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_color:
+ {
+ \pgfpicture
+ \pgf at relevantforpicturesizefalse
+% \end{macrocode}
+% If the final user has used the key |rounded-corners| for the environment
+% |{NiceTabular}|, we will clip to a rectangle with rounded corners before
+% filling the rectangles.
+% \begin{macrocode}
+ \dim_compare:nNnT \l_@@_tab_rounded_corners_dim > \c_zero_dim
+ {
+ \pgfsetcornersarced
+ {
+ \pgfpoint
+ { \l_@@_tab_rounded_corners_dim }
+ { \l_@@_tab_rounded_corners_dim }
+ }
+% \end{macrococde}
+% Because we want \pkg{nicematrix} compatible with arrays constructed by
+% \pkg{array}, the nodes for the rows and columns (that is to say the nodes
+% |row-|\textsl{i} and |col-|\textsl{j}) have not always the expected position,
+% that is to say, there is sometimes a slight shifting of something such as
+% |\arrayrulewidth|. Now, for the clipping, we have to change slightly the
+% position of that clipping whether a rounded rectangle around the array is
+% required. That's the point which is tested in the following line.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_hvlines_bool
+ {
+ \pgfpathrectanglecorners
+ {
+ \pgfpointadd
+ { \@@_qpoint:n { row-1 } }
+ { \pgfpoint { 0.5 \arrayrulewidth } { \c_zero_dim } }
+ }
+ {
+ \pgfpointadd
+ {
+ \@@_qpoint:n
+ { \int_eval:n { \int_max:nn \c at iRow \c at jCol + 1 } }
+ }
+ { \pgfpoint \c_zero_dim { 0.5 \arrayrulewidth } }
+ }
+ }
+ {
+ \pgfpathrectanglecorners
+ { \@@_qpoint:n { row-1 } }
+ {
+ \pgfpointadd
+ {
+ \@@_qpoint:n
+ { \int_eval:n { \int_max:nn \c at iRow \c at jCol + 1 } }
+ }
+ { \pgfpoint \c_zero_dim \arrayrulewidth }
+ }
+ }
+ \pgfusepath { clip }
+ }
+ \seq_map_indexed_inline:Nn \g_@@_colors_seq
+ {
+ \begin { pgfscope }
+ \@@_color_opacity ##2
+ \use:c { g_@@_color _ ##1 _tl }
+ \tl_gclear:c { g_@@_color _ ##1 _tl }
+ \pgfusepath { fill }
+ \end { pgfscope }
+ }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command will extract the potential key |opacity| in its optional
+% argument (between square brackets) and (of course) then apply the command |\color|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_color_opacity
+ {
+ \peek_meaning:NTF [
+ { \@@_color_opacity:w }
+ { \@@_color_opacity:w [ ] }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_color_opacity:w| takes in as argument only the optional
+% argument. One may consider that the second argument (the actual definition of
+% the color) is provided by currification.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_color_opacity:w [ #1 ]
+ {
+ \tl_clear:N \l_tmpa_tl
+ \keys_set_known:nnN { nicematrix / color-opacity } { #1 } \l_tmpb_tl
+% \end{macrocode}
+% |\l_tmpa_tl| (if not empty) is now the opacity and |\l_tmpb_tl| (if not empty) is now the colorimetric space.
+% \begin{macrocode}
+ \tl_if_empty:NF \l_tmpa_tl { \exp_args:NV \pgfsetfillopacity \l_tmpa_tl }
+ \tl_if_empty:NTF \l_tmpb_tl
+ { \@declaredcolor }
+ { \use:x { \exp_not:N \@undeclaredcolor [ \l_tmpb_tl ] } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following set of keys is used by the command |\@@_color_opacity:wn|.
+% \begin{macrocode}
+\keys_define:nn { nicematrix / color-opacity }
+ {
+ opacity .tl_set:N = \l_tmpa_tl ,
+ opacity .value_required:n = true
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cartesian_color:nn #1 #2
+ {
+ \tl_set:Nn \l_@@_rows_tl { #1 }
+ \tl_set:Nn \l_@@_cols_tl { #2 }
+ \@@_cartesian_path:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Here is an example : |\@@_rowcolor {red!15} {1,3,5-7,10-}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowcolor { O { } m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_cartesian_color:nn { #3 } { - } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Here an example : |\@@_columncolor:nn {red!15} {1,3,5-7,10-}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_columncolor { O { } m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_cartesian_color:nn { - } { #3 } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Here is an example : |\@@_rectanglecolor{red!15}{2-3}{5-6}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_rectanglecolor { O { } m m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_rectanglecolor:nnn { #3 } { #4 } { 0 pt } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The last argument is the radius of the corners of the rectangle.
+% \begin{macrocode}
+\NewDocumentCommand \@@_roundedrectanglecolor { O { } m m m m }
+ {
+ \tl_if_blank:nF { #2 }
+ {
+ \@@_add_to_colors_seq:xn
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } }
+ { \@@_rectanglecolor:nnn { #3 } { #4 } { #5 } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The last argument is the radius of the corners of the rectangle.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rectanglecolor:nnn #1 #2 #3
+ {
+ \@@_cut_on_hyphen:w #1 \q_stop
+ \tl_clear_new:N \l_@@_tmpc_tl
+ \tl_clear_new:N \l_@@_tmpd_tl
+ \tl_set_eq:NN \l_@@_tmpc_tl \l_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmpd_tl \l_tmpb_tl
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \tl_set:Nx \l_@@_rows_tl { \l_@@_tmpc_tl - \l_tmpa_tl }
+ \tl_set:Nx \l_@@_cols_tl { \l_@@_tmpd_tl - \l_tmpb_tl }
+% \end{macrocode}
+% The command |\@@_cartesian_path:n| takes in two implicit arguments:
+% |\l_@@_cols_tl| and |\l_@@_rows_tl|.
+% \begin{macrocode}
+ \@@_cartesian_path:n { #3 }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Here is an example : |\@@_cellcolor[rgb]{0.5,0.5,0}{2-3,3-4,4-5,5-6}|
+% \begin{macrocode}
+\NewDocumentCommand \@@_cellcolor { O { } m m }
+ {
+ \clist_map_inline:nn { #3 }
+ { \@@_rectanglecolor [ #1 ] { #2 } { ##1 } { ##1 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_chessboardcolors { O { } m m }
+ {
+ \int_step_inline:nn { \int_use:N \c at iRow }
+ {
+ \int_step_inline:nn { \int_use:N \c at jCol }
+ {
+ \int_if_even:nTF { ####1 + ##1 }
+ { \@@_cellcolor [ #1 ] { #2 } }
+ { \@@_cellcolor [ #1 ] { #3 } }
+ { ##1 - ####1 }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_arraycolor| (linked to |\arraycolor| at the beginning of
+% the |\CodeBefore|) will color the whole tabular (excepted the potential
+% exterior rows and columns) and the cells in the ``corners''.
+% \begin{macrocode}
+\NewDocumentCommand \@@_arraycolor { O { } m }
+ {
+ \@@_rectanglecolor [ #1 ] { #2 }
+ { 1 - 1 }
+ { \int_use:N \c at iRow - \int_use:N \c at jCol }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / rowcolors }
+ {
+ respect-blocks .bool_set:N = \l_@@_respect_blocks_bool ,
+ respect-blocks .default:n = true ,
+ cols .tl_set:N = \l_@@_cols_tl ,
+ restart .bool_set:N = \l_@@_rowcolors_restart_bool ,
+ restart .default:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~rowcolors }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\rowcolors| (accessible in the |code-before|) is inspired by the
+% command |\rowcolors| of the package \pkg{xcolor} (with the option |table|).
+% However, the command |\rowcolors| of \pkg{nicematrix} has \emph{not} the
+% optional argument of the command |\rowcolors| of \pkg{xcolor}. Here is an
+% example: |\rowcolors{1}{blue!10}{}[respect-blocks]|.
+%
+% |#1| (optional) is the color space ;
+% |#2| is a list of intervals of rows ;
+% |#3| is the list of colors ;
+% |#4| is for the optional list of pairs \textsl{key=value}.
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowlistcolors { O { } m m O { } }
+ {
+% \end{macrocode}
+% The group is for the options. |\l_@@_colors_seq| will be the list of colors.
+% \begin{macrocode}
+ \group_begin:
+ \seq_clear_new:N \l_@@_colors_seq
+ \seq_set_split:Nnn \l_@@_colors_seq { , } { #3 }
+ \tl_clear_new:N \l_@@_cols_tl
+ \tl_set:Nn \l_@@_cols_tl { - }
+ \keys_set:nn { NiceMatrix / rowcolors } { #4 }
+% \end{macrocode}
+% The counter |\l_@@_color_int| will be the rank of the current color in the list of
+% colors (modulo the length of the list).
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_color_int
+ \int_set:Nn \l_@@_color_int 1
+ \bool_if:NT \l_@@_respect_blocks_bool
+ {
+% \end{macrocode}
+% We don't want to take into account a block which is completely in the ``first
+% column'' of (number $0$) or in the ``last column'' and that's why we filter
+% the sequence of the blocks (in a the sequence |\l_tmpa_seq|).
+% \begin{macrocode}
+ \seq_set_eq:NN \l_tmpb_seq \g_@@_pos_of_blocks_seq
+ \seq_set_filter:NNn \l_tmpa_seq \l_tmpb_seq
+ { \@@_not_in_exterior_p:nnnnn ##1 }
+ }
+ \pgfpicture
+ \pgf at relevantforpicturesizefalse
+% \end{macrocode}
+% |#2| is the list of intervals of rows.
+% \begin{macrocode}
+ \clist_map_inline:nn { #2 }
+ {
+ \tl_set:Nn \l_tmpa_tl { ##1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ##1 \q_stop }
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at iRow } }
+% \end{macrocode}
+% Now, |l_tmpa_tl| and |l_tmpb_tl| are the first row and the last row of the
+% interval of rows that we have to treat. The counter |\l_tmpa_int| will be the
+% index of the loop over the rows.
+% \begin{macrocode}
+ \int_set:Nn \l_tmpa_int \l_tmpa_tl
+ \bool_if:NTF \l_@@_rowcolors_restart_bool
+ { \int_set:Nn \l_@@_color_int 1 }
+ { \int_set:Nn \l_@@_color_int \l_tmpa_tl }
+ \int_zero_new:N \l_@@_tmpc_int
+ \int_set:Nn \l_@@_tmpc_int \l_tmpb_tl
+ \int_do_until:nNnn \l_tmpa_int > \l_@@_tmpc_int
+ {
+% \end{macrocode}
+% We will compute in |\l_tmpb_int| the last row of the ``block''.
+% \begin{macrocode}
+ \int_set_eq:NN \l_tmpb_int \l_tmpa_int
+% \end{macrocode}
+% If the key |respect-blocks| is in force, we have to adjust that value (of
+% course).
+% \begin{macrocode}
+ \bool_if:NT \l_@@_respect_blocks_bool
+ {
+ \seq_set_filter:NNn \l_tmpb_seq \l_tmpa_seq
+ { \@@_intersect_our_row_p:nnnnn ####1 }
+ \seq_map_inline:Nn \l_tmpb_seq { \@@_rowcolors_i:nnnnn ####1 }
+% \end{macrocode}
+% Now, the last row of the block is computed in |\l_tmpb_int|.
+% \begin{macrocode}
+ }
+ \tl_set:Nx \l_@@_rows_tl
+ { \int_use:N \l_tmpa_int - \int_use:N \l_tmpb_int }
+% \end{macrocode}
+% |\l_@@_tmpc_tl| will be the color that we will use.
+% \begin{macrocode}
+ \tl_clear_new:N \l_@@_color_tl
+ \tl_set:Nx \l_@@_color_tl
+ {
+ \@@_color_index:n
+ {
+ \int_mod:nn
+ { \l_@@_color_int - 1 }
+ { \seq_count:N \l_@@_colors_seq }
+ + 1
+ }
+ }
+ \tl_if_empty:NF \l_@@_color_tl
+ {
+ \@@_add_to_colors_seq:xx
+ { \tl_if_blank:nF { #1 } { [ #1 ] } { \l_@@_color_tl } }
+ { \@@_cartesian_color:nn { \l_@@_rows_tl } { \l_@@_cols_tl } }
+ }
+ \int_incr:N \l_@@_color_int
+ \int_set:Nn \l_tmpa_int { \l_tmpb_int + 1 }
+ }
+ }
+ \endpgfpicture
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_color_index:n| peeks in |\l_@@_colors_seq| the color at the
+% index |#1|. However, if that color is the symbol |=|, the previous one is
+% poken. This macro is recursive.
+% \begin{macrocode}
+\cs_new:Npn \@@_color_index:n #1
+ {
+ \str_if_eq:eeTF { \seq_item:Nn \l_@@_colors_seq { #1 } } { = }
+ { \@@_color_index:n { #1 - 1 } }
+ { \seq_item:Nn \l_@@_colors_seq { #1 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\rowcolors| (available in the |\CodeBefore|) is a specialisation
+% of the most general command |\rowlistcolors|.
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowcolors { O { } m m m O { } }
+ { \@@_rowlistcolors [ #1 ] { #2 } { { #3 } , { #4 } } [ #5 ] }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rowcolors_i:nnnnn #1 #2 #3 #4 #5
+ {
+ \int_compare:nNnT { #3 } > \l_tmpb_int
+ { \int_set:Nn \l_tmpb_int { #3 } }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\prg_new_conditional:Nnn \@@_not_in_exterior:nnnnn p
+ {
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn { #4 } = \c_zero_int }
+ { \int_compare_p:nNn { #2 } = { \int_eval:n { \c at jCol + 1 } } }
+ \prg_return_false:
+ \prg_return_true:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command return |true| when the block intersects the row
+% |\l_tmpa_int|.
+% \begin{macrocode}
+\prg_new_conditional:Nnn \@@_intersect_our_row:nnnnn p
+ {
+ \bool_if:nTF
+ {
+ \int_compare_p:n { #1 <= \l_tmpa_int }
+ &&
+ \int_compare_p:n { \l_tmpa_int <= #3 }
+ }
+ \prg_return_true:
+ \prg_return_false:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command uses two implicit arguments: |\l_@@_rows_tl| and
+% |\l_@@_cols_tl| which are specifications for a set of rows and a set of
+% columns. It creates a path but does \emph{not} fill it. It must be filled by
+% another command after. The argument is the radius of the corners. We define
+% below a command |\@@_cartesian_path:| which corresponds to a value $0$~pt for
+% the radius of the corners.
+%
+% This command is in particular used in |\@@_rectanglecolor:nnn| (used in
+% |\@@_rectanglecolor|, itself used in |\@@_cellcolor|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cartesian_path:n #1
+ {
+ \bool_lazy_and:nnT
+ { ! \seq_if_empty_p:N \l_@@_corners_cells_seq }
+ { \dim_compare_p:nNn { #1 } = \c_zero_dim }
+ {
+ \@@_expand_clist:NN \l_@@_cols_tl \c at jCol
+ \@@_expand_clist:NN \l_@@_rows_tl \c at iRow
+ }
+% \end{macrocode}
+% We begin the loop over the columns.
+% \begin{macrocode}
+ \clist_map_inline:Nn \l_@@_cols_tl
+ {
+ \tl_set:Nn \l_tmpa_tl { ##1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ##1 \q_stop }
+ { \@@_cut_on_hyphen:w ##1 - ##1 \q_stop }
+ \bool_lazy_or:nnT
+ { \tl_if_blank_p:V \l_tmpa_tl }
+ { \str_if_eq_p:Vn \l_tmpa_tl { * } }
+ { \tl_set:Nn \l_tmpa_tl { 1 } }
+ \bool_lazy_or:nnT
+ { \tl_if_blank_p:V \l_tmpb_tl }
+ { \str_if_eq_p:Vn \l_tmpb_tl { * } }
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at jCol } }
+ \int_compare:nNnT \l_tmpb_tl > \c at jCol
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at jCol } }
+% \end{macrocode}
+% |\l_@@_tmpc_tl| will contain the number of column.
+% \begin{macrocode}
+ \tl_set_eq:NN \l_@@_tmpc_tl \l_tmpa_tl
+% \end{macrocode}
+% If we decide to provide the commands |\cellcolor|, |\rectanglecolor|,
+% |\rowcolor|, |\columncolor|, |\rowcolors| and |\chessboardcolors| in the
+% |code-before| of a |\SubMatrix|, we will have to modify the following line, by
+% adding a kind of offset. We will have also some other lines to modify.
+% \begin{macrocode}
+ \@@_qpoint:n { col - \l_tmpa_tl }
+ \int_compare:nNnTF \l_@@_first_col_int = \l_tmpa_tl
+ { \dim_set:Nn \l_@@_tmpc_dim { \pgf at x - 0.5 \arrayrulewidth } }
+ { \dim_set:Nn \l_@@_tmpc_dim { \pgf at x + 0.5 \arrayrulewidth } }
+ \@@_qpoint:n { col - \int_eval:n { \l_tmpb_tl + 1 } }
+ \dim_set:Nn \l_tmpa_dim { \pgf at x + 0.5 \arrayrulewidth }
+% \end{macrocode}
+% We begin the loop over the rows.
+% \begin{macrocode}
+ \clist_map_inline:Nn \l_@@_rows_tl
+ {
+ \tl_set:Nn \l_tmpa_tl { ####1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ####1 \q_stop }
+ { \@@_cut_on_hyphen:w ####1 - ####1 \q_stop }
+ \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } }
+ \tl_if_empty:NT \l_tmpb_tl
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at iRow } }
+ \int_compare:nNnT \l_tmpb_tl > \c at iRow
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at iRow } }
+% \end{macrocode}
+% Now, the numbers of both rows are in |\l_tmpa_tl| and |\l_tmpb_tl|.
+% \begin{macrocode}
+ \seq_if_in:NxF \l_@@_corners_cells_seq
+ { \l_tmpa_tl - \l_@@_tmpc_tl }
+ {
+ \@@_qpoint:n { row - \int_eval:n { \l_tmpb_tl + 1 } }
+ \dim_set:Nn \l_tmpb_dim { \pgf at y + 0.5 \arrayrulewidth }
+ \@@_qpoint:n { row - \l_tmpa_tl }
+ \dim_set:Nn \l_@@_tmpd_dim { \pgf at y + 0.5 \arrayrulewidth }
+ \pgfsetcornersarced { \pgfpoint { #1 } { #1 } }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_@@_tmpc_dim \l_@@_tmpd_dim }
+ { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command corresponds to a radius of the corners equal to $0$~pt.
+% This command is used by the commands |\@@_rowcolors|, |\@@_columncolor| and
+% |\@@_rowcolor:n| (used in |\@@_rowcolor|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_cartesian_path: { \@@_cartesian_path:n { 0 pt } }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command will be used only with |\l_@@_cols_tl| and |\c at jCol| (first
+% case) or with |\l_@@_rows_tl| and |\c at iRow| (second case). For instance, with
+% |\l_@@_cols_tl| equal to |2,4-6,8-*| and |\c at jCol| equal to |10|, the clist
+% |\l_@@_cols_tl| will be replaced by |2,4,5,6,8,9,10|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_expand_clist:NN #1 #2
+ {
+ \clist_set_eq:NN \l_tmpa_clist #1
+ \clist_clear:N #1
+ \clist_map_inline:Nn \l_tmpa_clist
+ {
+ \tl_set:Nn \l_tmpa_tl { ##1 }
+ \tl_if_in:NnTF \l_tmpa_tl { - }
+ { \@@_cut_on_hyphen:w ##1 \q_stop }
+ { \@@_cut_on_hyphen:w ##1 - ##1 \q_stop }
+ \bool_lazy_or:nnT
+ { \tl_if_blank_p:V \l_tmpa_tl }
+ { \str_if_eq_p:Vn \l_tmpa_tl { * } }
+ { \tl_set:Nn \l_tmpa_tl { 1 } }
+ \bool_lazy_or:nnT
+ { \tl_if_blank_p:V \l_tmpb_tl }
+ { \str_if_eq_p:Vn \l_tmpb_tl { * } }
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N #2 } }
+ \int_compare:nNnT \l_tmpb_tl > #2
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N #2 } }
+ \int_step_inline:nnn \l_tmpa_tl \l_tmpb_tl
+ { \clist_put_right:Nn #1 { ####1 } }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% When the user uses the key |colortbl-like|, the following command will
+% be linked to |\cellcolor| in the tabular.
+% \begin{macrocode}
+\NewDocumentCommand \@@_cellcolor_tabular { O { } m }
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_before_tl
+ {
+% \end{macrocode}
+% We must not expand the color (|#2|) because the color may contain the token
+% |!| which may be activated by some packages (ex.: \pkg{babel} with the option
+% |french| on latex and pdflatex).
+% \begin{macrocode}
+ \@@_cellcolor [ #1 ] { \exp_not:n { #2 } }
+ { \int_use:N \c at iRow - \int_use:N \c at jCol }
+ }
+ \ignorespaces
+ }
+% \end{macrocode}
+%
+% \bigskip
+% When the user uses the key |colortbl-like|, the following command will
+% be linked to |\rowcolor| in the tabular.
+% \begin{macrocode}
+\NewDocumentCommand \@@_rowcolor_tabular { O { } m }
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_before_tl
+ {
+ \@@_rectanglecolor [ #1 ] { \exp_not:n { #2 } }
+ { \int_use:N \c at iRow - \int_use:N \c at jCol }
+ { \int_use:N \c at iRow - \exp_not:n { \int_use:N \c at jCol } }
+ }
+ \ignorespaces
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_columncolor_preamble { O { } m }
+ {
+% \end{macrocode}
+% With the following line, we test whether the cell is the first one we
+% encounter in its column (don't forget that some rows may be incomplete).
+% \begin{macrocode}
+ \int_compare:nNnT \c at jCol > \g_@@_col_total_int
+ {
+% \end{macrocode}
+% You use |gput_left| because we want the specification of colors for the
+% columns drawn before the specifications of color for the rows (and the cells).
+% Be careful: maybe this is not effective since we have an analyze of the
+% instructions in the |\CodeBefore| in order to fill color by color (to avoid
+% the thin white lines).
+% \begin{macrocode}
+ \tl_gput_left:Nx \g_@@_pre_code_before_tl
+ {
+ \exp_not:N \columncolor [ #1 ]
+ { \exp_not:n { #2 } } { \int_use:N \c at jCol }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% \section{The vertical and horizontal rules}
+%
+%
+% \bigskip
+% \subsubsection*{OnlyMainNiceMatrix}
+%
+% We give to the user the possibility to define new types of columns (with
+% |\newcolumntype| of \pkg{array}) for special vertical rules (\emph{e.g.} rules
+% thicker than the standard ones) which will not extend in the potential
+% exterior rows of the array.
+%
+% We provide the command |\OnlyMainNiceMatrix| in that goal. However, that
+% command must be no-op outside the environments of \pkg{nicematrix} (and so the
+% user will be allowed to use the same new type of column in the environments
+% of \pkg{nicematrix} and in the standard environments of \pkg{array}).
+%
+% That's why we provide first a global definition of |\OnlyMainNiceMatrix|.
+% \begin{macrocode}
+\cs_set_eq:NN \OnlyMainNiceMatrix \use:n
+% \end{macrocode}
+%
+% \medskip
+% Another definition of |\OnlyMainNiceMatrix| will be linked to the command in
+% the environments of \pkg{nicematrix}. Here is that definition, called
+% |\@@_OnlyMainNiceMatrix:n|.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_OnlyMainNiceMatrix:n #1
+ {
+ \int_compare:nNnTF \l_@@_first_col_int = 0
+ { \@@_OnlyMainNiceMatrix_i:n { #1 } }
+ {
+ \int_compare:nNnTF \c at jCol = 0
+ {
+ \int_compare:nNnF \c at iRow = { -1 }
+ { \int_compare:nNnF \c at iRow = { \l_@@_last_row_int - 1 } { #1 } }
+ }
+ { \@@_OnlyMainNiceMatrix_i:n { #1 } }
+ }
+ }
+% \end{macrocode}
+% This definition may seem complicated but we must remind that the number of row
+% |\c at iRow| is incremented in the first cell of the row, \emph{after} a
+% potential vertical rule on the left side of the first cell.
+%
+% \smallskip
+% The command |\@@_OnlyMainNiceMatrix_i:n| is only a short-cut which is used
+% twice in the above command. This command must \emph{not} be protected.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_OnlyMainNiceMatrix_i:n #1
+ {
+ \int_compare:nNnF \c at iRow = 0
+ { \int_compare:nNnF \c at iRow = \l_@@_last_row_int { #1 } }
+ }
+% \end{macrocode}
+% Remember that |\c at iRow| is not always inferior to |\l_@@_last_row_int| because
+% |\l_@@_last_row_int| may be equal to $-2$ or $-1$ (we can't write
+% |\int_compare:nNnT \c at iRow < \l_@@_last_row_int|).
+%
+%
+% \bigskip
+% \subsubsection*{General system for drawing rules}
+%
+% When a command, environment or ``subsystem'' of \pkg{nicematrix} wants to draw
+% a rule, it will write in the internal |\CodeAfter| a command |\@@_vline:n| or
+% |\@@_hline:n|. Both commands take in as argument a list of \textsl{key=value}
+% pairs. That list will first be analyzed with the following set of keys.
+% However, unknown keys will be analyzed further with another set of keys.
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Rules }
+ {
+ position .int_set:N = \l_@@_position_int ,
+ position .value_required:n = true ,
+ start .int_set:N = \l_@@_start_int ,
+ start .initial:n = 1 ,
+ end .code:n =
+ \bool_lazy_or:nnTF
+ { \tl_if_empty_p:n { #1 } }
+ { \str_if_eq_p:nn { #1 } { last } }
+ { \int_set_eq:NN \l_@@_end_int \c at jCol }
+ { \int_set:Nn \l_@@_end_int { #1 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% It's possible that the rule won't be drawn continuously from |start| ot |end|
+% because of the blocks (created with the command |\Block|), the virtual blocks
+% (created by |\Cdots|, etc.), etc. That's why an analyse is done and the rule
+% is cut in small rules which will actually be drawn. The small continuous rules
+% will be drawn by |\@@_vline_ii:| and |\@@_hline_ii:|. Those commands use the
+% following set of keys.
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / RulesBis }
+ {
+ multiplicity .int_set:N = \l_@@_multiplicity_int ,
+ multiplicity .initial:n = 1 ,
+ dotted .bool_set:N = \l_@@_dotted_bool ,
+ dotted .initial:n = false ,
+ dotted .default:n = true ,
+ color .code:n = \@@_set_CT at arc@:n { #1 } ,
+ color .value_required:n = true ,
+ sep-color .code:n = \@@_set_CT at drsc@:n { #1 } ,
+ sep-color .value_required:n = true ,
+% \end{macrocode}
+% If the user uses the key |tikz|, the rule (or more precisely: the different
+% sub-rules since a rule may be broken by blocks or others) will be drawn with
+% Tikz.
+% \begin{macrocode}
+ tikz .tl_set:N = \l_@@_tikz_rule_tl ,
+ tikz .value_required:n = true ,
+ tikz .initial:n = ,
+ total-width .dim_set:N = \l_@@_rule_width_dim ,
+ total-width .value_required:n = true ,
+ width .meta:n = { total-width = #1 } ,
+ unknown .code:n = \@@_error:n { Unknow~key~for~RulesBis }
+ }
+% \end{macrocode}
+%
+%
+% \subsubsection*{The vertical rules}
+%
+% The following command will be executed in the internal |\CodeAfter|. The
+% argument |#1| is a list of \textsl{key=value} pairs.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline:n #1
+ {
+% \end{macrocode}
+% The group is for the options.
+% \begin{macrocode}
+ \group_begin:
+ \int_zero_new:N \l_@@_end_int
+ \int_set_eq:NN \l_@@_end_int \c at iRow
+ \keys_set_known:nnN { NiceMatrix / Rules } { #1 } \l_@@_other_keys_tl
+% \end{macrocode}
+% The following test is for the case where the user does not use all the columns
+% specified in the preamble of the environment (for instance, a preamble of
+% \verb+|c|c|c|+ but only two columns used).
+% \begin{macrocode}
+ \int_compare:nNnT \l_@@_position_int < { \c at jCol + 2 }
+ \@@_vline_i:
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline_i:
+ {
+ \int_zero_new:N \l_@@_local_start_int
+ \int_zero_new:N \l_@@_local_end_int
+% \end{macrocode}
+% |\l_tmpa_tl| is the number of row and |\l_tmpb_tl| the number of column. When
+% we have found a row corresponding to a rule to draw, we note its number in
+% |\l_@@_tmpc_tl|.
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpb_tl { \int_eval:n \l_@@_position_int }
+ \int_step_variable:nnNn \l_@@_start_int \l_@@_end_int
+ \l_tmpa_tl
+ {
+% \end{macrocode}
+% The boolean |\g_tmpa_bool| indicates whether the small vertical rule will be
+% drawn. If we find that it is in a block (a real block, created by |\Block| or
+% a virtual block corresponding to a dotted line, created by |\Cdots|, |\Vdots|,
+% etc.), we will set |\g_tmpa_bool| to |false| and the small vertical rule won't
+% be drawn.
+% \begin{macrocode}
+ \bool_gset_true:N \g_tmpa_bool
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_test_vline_in_block:nnnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_xdots_seq
+ { \@@_test_vline_in_block:nnnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_stroken_blocks_seq
+ { \@@_test_vline_in_stroken_block:nnnn ##1 }
+ \clist_if_empty:NF \l_@@_corners_clist \@@_test_in_corner_v:
+ \bool_if:NTF \g_tmpa_bool
+ {
+ \int_compare:nNnT \l_@@_local_start_int = 0
+% \end{macrocode}
+% We keep in memory that we have a rule to draw. |\l_@@_local_start_int| will be
+% the starting row of the rule that we will have to draw.
+% \begin{macrocode}
+ { \int_set:Nn \l_@@_local_start_int \l_tmpa_tl }
+ }
+ {
+ \int_compare:nNnT \l_@@_local_start_int > 0
+ {
+ \int_set:Nn \l_@@_local_end_int { \l_tmpa_tl - 1 }
+ \@@_vline_ii:
+ \int_zero:N \l_@@_local_start_int
+ }
+ }
+ }
+ \int_compare:nNnT \l_@@_local_start_int > 0
+ {
+ \int_set_eq:NN \l_@@_local_end_int \l_@@_end_int
+ \@@_vline_ii:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_in_corner_v:
+ {
+ \int_compare:nNnTF \l_tmpb_tl = { \int_eval:n { \c at jCol + 1 } }
+ {
+ \seq_if_in:NxT
+ \l_@@_corners_cells_seq
+ { \l_tmpa_tl - \int_eval:n { \l_tmpb_tl - 1 } }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ {
+ \seq_if_in:NxT
+ \l_@@_corners_cells_seq
+ { \l_tmpa_tl - \l_tmpb_tl }
+ {
+ \int_compare:nNnTF \l_tmpb_tl = 1
+ { \bool_set_false:N \g_tmpa_bool }
+ {
+ \seq_if_in:NxT
+ \l_@@_corners_cells_seq
+ { \l_tmpa_tl - \int_eval:n { \l_tmpb_tl - 1 } }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline_ii:
+ {
+ \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl
+ \bool_if:NTF \l_@@_dotted_bool
+ \@@_vline_iv:
+ {
+ \tl_if_empty:NTF \l_@@_tikz_rule_tl
+ \@@_vline_iii:
+ \@@_vline_v:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% 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:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_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: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
+ {
+ { \int_compare_p:nNn \l_@@_multiplicity_int > 1 }
+ { \cs_if_exist_p:N \CT at drsc@ }
+ { ! \tl_if_blank_p:V \CT at drsc@ }
+ }
+ {
+ \group_begin:
+ \CT at drsc@
+ \dim_add:Nn \l_tmpa_dim { 0.5 \arrayrulewidth }
+ \dim_sub:Nn \l_@@_tmpc_dim { 0.5 \arrayrulewidth }
+ \dim_set:Nn \l_@@_tmpd_dim
+ {
+ \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth )
+ * ( \l_@@_multiplicity_int - 1 )
+ }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ { \pgfpoint \l_@@_tmpd_dim \l_@@_tmpc_dim }
+ \pgfusepath { fill }
+ \group_end:
+ }
+ \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_@@_tmpc_dim }
+ \prg_replicate:nn { \l_@@_multiplicity_int - 1 }
+ {
+ \dim_sub:Nn \l_tmpb_dim \arrayrulewidth
+ \dim_sub:Nn \l_tmpb_dim \doublerulesep
+ \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_@@_tmpc_dim }
+ }
+ \CT at arc@
+ \pgfsetlinewidth { 1.1 \arrayrulewidth }
+ \pgfsetrectcap
+ \pgfusepathqstroke
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following code is for the case of a dotted rule (with our system of
+% rounded dots).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline_iv:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_qpoint:n { col - \int_use:N \l_@@_position_int }
+ \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 } }
+ \dim_set_eq:NN \l_@@_y_final_dim \pgf at y
+ \CT at arc@
+ \@@_draw_line:
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following code is for the case when the user uses the key |tikz| (in the
+% definition of a customized rule by using the key |custom-line|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vline_v:
+ {
+ \begin {tikzpicture }
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_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:Nn \l_tmpb_dim { \pgf at x - 0.5 \l_@@_rule_width_dim }
+ \@@_qpoint:n { row - \int_eval:n { \l_@@_local_end_int + 1 } }
+ \dim_set_eq:NN \l_@@_tmpc_dim \pgf at y
+ \exp_args:NV \tikzset \l_@@_tikz_rule_tl
+ \use:x { \exp_not:N \draw [ \l_@@_tikz_rule_tl ] }
+ ( \l_tmpb_dim , \l_tmpa_dim ) --
+ ( \l_tmpb_dim , \l_@@_tmpc_dim ) ;
+ \end { tikzpicture }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The command |\@@_draw_vlines:| draws all the vertical rules excepted in the
+% blocks, in the virtual blocks (determined by a command such as |\Cdots|) and in
+% the corners (if the key |corners| is used).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_vlines:
+ {
+ \int_step_inline:nnn
+ {
+ \bool_if:nTF { \g_@@_NiceArray_bool && ! \l_@@_except_borders_bool }
+ 1 2
+ }
+ {
+ \bool_if:nTF { \g_@@_NiceArray_bool && ! \l_@@_except_borders_bool }
+ { \int_eval:n { \c at jCol + 1 } }
+ \c at jCol
+ }
+ {
+ \tl_if_eq:NnF \l_@@_vlines_clist { all }
+ { \clist_if_in:NnT \l_@@_vlines_clist { ##1 } }
+ { \@@_vline:n { position = ##1 , total-width = \arrayrulewidth } }
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+% \subsubsection*{The horizontal rules}
+%
+% \bigskip
+% The following command will be executed in the internal |\CodeAfter|. The
+% argument |#1| is a list of \textsl{key=value} pairs of the form
+% |{NiceMatrix/Rules}|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline:n #1
+ {
+% \end{macrocode}
+% The group is for the options.
+% \begin{macrocode}
+ \group_begin:
+ \int_zero_new:N \l_@@_end_int
+ \int_set_eq:NN \l_@@_end_int \c at jCol
+ \keys_set_known:nnN { NiceMatrix / Rules } { #1 } \l_@@_other_keys_tl
+ \@@_hline_i:
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_i:
+ {
+ \int_zero_new:N \l_@@_local_start_int
+ \int_zero_new:N \l_@@_local_end_int
+% \end{macrocode}
+% |\l_tmpa_tl| is the number of row and |\l_tmpb_tl| the number of column. When
+% we have found a column corresponding to a rule to draw, we note its number in
+% |\l_@@_tmpc_tl|.
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpa_tl { \int_use:N \l_@@_position_int }
+ \int_step_variable:nnNn \l_@@_start_int \l_@@_end_int
+ \l_tmpb_tl
+ {
+% \end{macrocode}
+% The boolean |\g_tmpa_bool| indicates whether the small horizontal rule will be
+% drawn. If we find that it is in a block (a real block, created by |\Block| or
+% a virtual block corresponding to a dotted line, created by |\Cdots|, |\Vdots|,
+% etc.), we will set |\g_tmpa_bool| to |false| and the small horizontal rule won't
+% be drawn.
+% \begin{macrocode}
+ \bool_gset_true:N \g_tmpa_bool
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_test_hline_in_block:nnnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_xdots_seq
+ { \@@_test_hline_in_block:nnnnn ##1 }
+ \seq_map_inline:Nn \g_@@_pos_of_stroken_blocks_seq
+ { \@@_test_hline_in_stroken_block:nnnn ##1 }
+ \clist_if_empty:NF \l_@@_corners_clist \@@_test_in_corner_h:
+ \bool_if:NTF \g_tmpa_bool
+ {
+ \int_compare:nNnT \l_@@_local_start_int = 0
+% \end{macrocode}
+% We keep in memory that we have a rule to draw. |\l_@@_local_start_int| will be
+% the starting row of the rule that we will have to draw.
+% \begin{macrocode}
+ { \int_set:Nn \l_@@_local_start_int \l_tmpb_tl }
+ }
+ {
+ \int_compare:nNnT \l_@@_local_start_int > 0
+ {
+ \int_set:Nn \l_@@_local_end_int { \l_tmpb_tl - 1 }
+ \@@_hline_ii:
+ \int_zero:N \l_@@_local_start_int
+ }
+ }
+ }
+ \int_compare:nNnT \l_@@_local_start_int > 0
+ {
+ \int_set_eq:NN \l_@@_local_end_int \l_@@_end_int
+ \@@_hline_ii:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_in_corner_h:
+ {
+ \int_compare:nNnTF \l_tmpa_tl = { \int_eval:n { \c at iRow + 1 } }
+ {
+ \seq_if_in:NxT
+ \l_@@_corners_cells_seq
+ { \int_eval:n { \l_tmpa_tl - 1 } - \l_tmpb_tl }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ {
+ \seq_if_in:NxT
+ \l_@@_corners_cells_seq
+ { \l_tmpa_tl - \l_tmpb_tl }
+ {
+ \int_compare:nNnTF \l_tmpa_tl = 1
+ { \bool_set_false:N \g_tmpa_bool }
+ {
+ \seq_if_in:NxT
+ \l_@@_corners_cells_seq
+ { \int_eval:n { \l_tmpa_tl - 1 } - \l_tmpb_tl }
+ { \bool_set_false:N \g_tmpa_bool }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_ii:
+ {
+ % \bool_set_false:N \l_@@_dotted_bool
+ \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl
+ \bool_if:NTF \l_@@_dotted_bool
+ \@@_hline_iv:
+ {
+ \tl_if_empty:NTF \l_@@_tikz_rule_tl
+ \@@_hline_iii:
+ \@@_hline_v:
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% First the case of a standard rule (without the keys |dotted| and |tikz|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_iii:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_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: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
+ {
+ { \int_compare_p:nNn \l_@@_multiplicity_int > 1 }
+ { \cs_if_exist_p:N \CT at drsc@ }
+ { ! \tl_if_blank_p:V \CT at drsc@ }
+ }
+ {
+ \group_begin:
+ \CT at drsc@
+ \dim_set:Nn \l_@@_tmpd_dim
+ {
+ \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth )
+ * ( \l_@@_multiplicity_int - 1 )
+ }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ { \pgfpoint \l_@@_tmpc_dim \l_@@_tmpd_dim }
+ \pgfusepathqfill
+ \group_end:
+ }
+ \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ \pgfpathlineto { \pgfpoint \l_@@_tmpc_dim \l_tmpb_dim }
+ \prg_replicate:nn { \l_@@_multiplicity_int - 1 }
+ {
+ \dim_sub:Nn \l_tmpb_dim \arrayrulewidth
+ \dim_sub:Nn \l_tmpb_dim \doublerulesep
+ \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim }
+ \pgfpathlineto { \pgfpoint \l_@@_tmpc_dim \l_tmpb_dim }
+ }
+ \CT at arc@
+ \pgfsetlinewidth { 1.1 \arrayrulewidth }
+ \pgfsetrectcap
+ \pgfusepathqstroke
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following code is for the case of a dotted rule (with our system of
+% rounded dots).
+% The aim is that, by standard the dotted line fits between square brackets
+% (|\hline| doesn't).
+%
+% \smallskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{bNiceMatrix}
+% 1 & 2 & 3 & 4 \\
+% \hline
+% 1 & 2 & 3 & 4 \\
+% \hdottedline
+% 1 & 2 & 3 & 4
+% \end{bNiceMatrix}
+% \end{BVerbatim}
+% $\begin{bNiceMatrix}
+% 1 & 2 & 3 & 4 \\
+% \hline
+% 1 & 2 & 3 & 4 \\
+% \hdottedline
+% 1 & 2 & 3 & 4
+% \end{bNiceMatrix}$
+%
+% \smallskip
+% But, if the user uses |margin|, the dotted line extends to have the same width
+% as a |\hline|.
+%
+% \smallskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{bNiceMatrix}[margin]
+% 1 & 2 & 3 & 4 \\
+% \hline
+% 1 & 2 & 3 & 4 \\
+% \hdottedline
+% 1 & 2 & 3 & 4
+% \end{bNiceMatrix}
+% \end{BVerbatim}
+% $\begin{bNiceMatrix}[margin]
+% 1 & 2 & 3 & 4 \\
+% \hline
+% 1 & 2 & 3 & 4 \\
+% \hdottedline
+% 1 & 2 & 3 & 4
+% \end{bNiceMatrix}$
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_iv:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_qpoint:n { row - \int_use:N \l_@@_position_int }
+ \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
+ {
+ \dim_sub:Nn \l_@@_x_initial_dim \l_@@_left_margin_dim
+ \bool_if:NT \g_@@_NiceArray_bool
+ { \dim_sub:Nn \l_@@_x_initial_dim \arraycolsep }
+% \end{macrocode}
+% For reasons purely aesthetic, we do an adjustment in the case of a rounded
+% bracket. The correction by |0.5 \l_@@_xdots_inter_dim| is \emph{ad hoc} for a
+% better result.
+% \begin{macrocode}
+ \tl_if_eq:NnF \g_@@_left_delim_tl (
+ { \dim_add:Nn \l_@@_x_initial_dim { 0.5 \l_@@_xdots_inter_dim } }
+ }
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_local_end_int + 1 } }
+ \dim_set_eq:NN \l_@@_x_final_dim \pgf at x
+ \int_compare:nNnT \l_@@_local_end_int = \c at jCol
+ {
+ \dim_add:Nn \l_@@_x_final_dim \l_@@_right_margin_dim
+ \bool_if:NT \g_@@_NiceArray_bool
+ { \dim_add:Nn \l_@@_x_final_dim \arraycolsep }
+ \tl_if_eq:NnF \g_@@_right_delim_tl )
+ { \dim_gsub:Nn \l_@@_x_final_dim { 0.5 \l_@@_xdots_inter_dim } }
+ }
+ \CT at arc@
+ \@@_draw_line:
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following code is for the case when the user uses the key |tikz| (in the
+% definition of a customized rule by using the key |custom-line|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hline_v:
+ {
+ \begin { tikzpicture }
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_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:Nn \l_tmpb_dim { \pgf at y - 0.5 \l_@@_rule_width_dim }
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_local_end_int + 1 } }
+ \dim_set_eq:NN \l_@@_tmpc_dim \pgf at x
+ \exp_args:NV \tikzset \l_@@_tikz_rule_tl
+ \use:x { \exp_not:N \draw [ \l_@@_tikz_rule_tl ] }
+ ( \l_tmpa_dim , \l_tmpb_dim ) --
+ ( \l_@@_tmpc_dim , \l_tmpb_dim ) ;
+ \end { tikzpicture }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The command |\@@_draw_hlines:| draws all the horizontal rules excepted in the
+% blocks (even the virtual blocks determined by commands such as |\Cdots| and in
+% the corners (if the key |corners| is used)).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_hlines:
+ {
+ \int_step_inline:nnn
+ {
+ \bool_if:nTF { \g_@@_NiceArray_bool && ! \l_@@_except_borders_bool }
+ 1 2
+ }
+ {
+ \bool_if:nTF { \g_@@_NiceArray_bool && ! \l_@@_except_borders_bool }
+ { \int_eval:n { \c at iRow + 1 } }
+ \c at iRow
+ }
+ {
+ \tl_if_eq:NnF \l_@@_hlines_clist { all }
+ { \clist_if_in:NnT \l_@@_hlines_clist { ##1 } }
+ { \@@_hline:n { position = ##1 , total-width = \arrayrulewidth } }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The command |\@@_Hline:| will be linked to |\Hline| in the environments of
+% \pkg{nicematrix}.
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline: { \noalign \bgroup \@@_Hline_i:n { 1 } }
+% \end{macrocode}
+%
+% \medskip
+% The argument of the command |\@@_Hline_i:n| is the number of successive
+% |\Hline| found.
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_i:n #1
+ {
+ \peek_remove_spaces:n
+ {
+ \peek_meaning:NTF \Hline
+ { \@@_Hline_ii:nn { #1 + 1 } }
+ { \@@_Hline_iii:n { #1 } }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_ii:nn #1 #2 { \@@_Hline_i:n { #1 } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_iii:n #1
+ {
+ \peek_meaning:NTF [
+ { \@@_Hline_iv:nw { #1 } }
+ { \@@_Hline_iv:nw { #1 } [ ] }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set:Npn \@@_Hline_iv:nw #1 [ #2 ]
+ {
+ \@@_compute_rule_width:n { multiplicity = #1 , #2 }
+ \skip_vertical:n { \l_@@_rule_width_dim }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_hline:n
+ {
+ multiplicity = #1 ,
+ position = \int_eval:n { \c at iRow + 1 } ,
+ total-width = \dim_use:N \l_@@_rule_width_dim ,
+ #2
+ }
+ }
+ \egroup
+ }
+% \end{macrocode}
+%
+% \subsubsection*{Customized rules defined by the final user}
+%
+% The final user can define a customized rule by using the key |custom-line| in
+% |\NiceMatrixOptions|. That key takes in as value a list of \textsl{key=value}
+% pairs.
+%
+%
+%
+% \medskip
+% Among the keys avalaible in that list, there is the key |letter| to specify a
+% letter that the final user will use in the preamble of the array. All the
+% letters defined by this way by the final user for such customized rules are
+% added in the set of keys |{NiceMatrix / ColumnTypes}|. That set of keys is
+% used to store the characteristics of those types of rules for convenience: the
+% keys of that set of keys won't never be used as keys by the final user (he
+% will use, instead, letters in the preamble of its array).
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / ColumnTypes } { }
+% \end{macrocode}
+%
+%
+% \medskip
+% The following command will create the customized rule (it is executed when the
+% final user uses the key |custom-line|, for example in |\NiceMatrixOptions|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_custom_line:n #1
+ {
+ \str_clear_new:N \l_@@_command_str
+ \str_clear_new:N \l_@@_ccommand_str
+ \str_clear_new:N \l_@@_letter_str
+ \keys_set_known:nnN { NiceMatrix / custom-line } { #1 } \l_@@_other_keys_tl
+% \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_all:nTF
+ {
+ { \str_if_empty_p:N \l_@@_letter_str }
+ { \str_if_empty_p:N \l_@@_command_str }
+ { \str_if_empty_p:N \l_@@_ccommand_str }
+ }
+ { \@@_error:n { No~letter~and~no~command } }
+ { \exp_args:NV \@@_custom_line_i:n \l_@@_other_keys_tl }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / custom-line }
+ {
+ letter .str_set:N = \l_@@_letter_str ,
+ letter .value_required:n = true ,
+ command .str_set:N = \l_@@_command_str ,
+ command .value_required:n = true ,
+ ccommand .str_set:N = \l_@@_ccommand_str ,
+ ccommand .value_required:n = true ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\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
+ {
+ \IfPackageLoadedTF { tikz }
+ { }
+ { \@@_error:n { tikz~in~custom-line~without~tikz }}
+ \bool_if:NT \l_@@_color_bool
+ { \@@_error:n { color~in~custom-line~with~tikz } }
+ }
+ \bool_if:nT
+ {
+ \int_compare_p:nNn \l_@@_multiplicity_int > 1
+ && \l_@@_dotted_rule_bool
+ }
+ { \@@_error:n { key~multiplicity~with~dotted } }
+ \str_if_empty:NF \l_@@_letter_str
+ {
+ \int_compare:nTF { \str_count:N \l_@@_letter_str != 1 }
+ { \@@_error:n { Several~letters } }
+ {
+ \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 =
+ { \@@_v_custom_line:n { \exp_not:n { #1 } } }
+ }
+ }
+ }
+ }
+ \str_if_empty:NF \l_@@_command_str { \@@_h_custom_line:n { #1 } }
+ \str_if_empty:NF \l_@@_ccommand_str { \@@_c_custom_line:n { #1 } }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\str_const:Nn \c_@@_forbidden_letters_str { lcrpmbVX|()[]!@<> }
+% \end{macrocode}
+%
+% \medskip
+% 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 some keys which are no-op.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / custom-line-bis }
+ {
+ multiplicity .int_set:N = \l_@@_multiplicity_int ,
+ multiplicity .initial:n = 1 ,
+ multiplicity .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}
+%
+% The following keys will indicate whether the keys |dotted|, |tikz| and |color|
+% are used in the use of a |custom-line|.
+% \begin{macrocode}
+\bool_new:N \l_@@_dotted_rule_bool
+\bool_new:N \l_@@_tikz_rule_bool
+\bool_new:N \l_@@_color_bool
+% \end{macrocode}
+%
+% \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}
+\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 an horizontal rule (hence the `|h|` in the name) with the
+% full width of the array. |#1| is the whole set of keys to pass to the command
+% |\@@_hline:n| (which is in the internal |\CodeAfter|).
+% \begin{macrocode}
+\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.
+% Moreover, the command must \emph{not} be protected since it begins with |\noalign|.
+% \begin{macrocode}
+ \cs_set:cpn { nicematrix - \l_@@_command_str }
+ {
+ \noalign
+ {
+ \@@_compute_rule_width:n { #1 }
+ \skip_vertical:n { \l_@@_rule_width_dim }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_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 \@@_h_custom_line:nn { n V }
+% \end{macrocode}
+%
+% \bigskip
+% \bigskip
+% The following command will create the command that the final user will use in
+% its array to draw an horizontal rule on only some of the columns of the array
+% (hence the letter |c| as in |\cline|). |#1| is the whole set of keys to pass
+% to the command |\@@_hline:n| (which is in the internal |\CodeAfter|).
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_c_custom_line:n #1
+ {
+% \end{macrocode}
+% Here, we need an expandable command since it begins with an |\noalign|.
+% \begin{macrocode}
+ \exp_args:Nc \NewExpandableDocumentCommand
+ { nicematrix - \l_@@_ccommand_str }
+ { O { } m }
+ {
+ \noalign
+ {
+ \@@_compute_rule_width:n { #1 , ##1 }
+ \skip_vertical:n { \l_@@_rule_width_dim }
+ \clist_map_inline:nn
+ { ##2 }
+ { \@@_c_custom_line_i:nn { #1 , ##1 } { ####1 } }
+ }
+ }
+ \seq_put_left:NV \l_@@_custom_line_commands_seq \l_@@_ccommand_str
+ }
+% \end{macrocode}
+% The first argument is the list of key-value pairs characteristic of the line.
+% The second argument is the specification of columns for the |\cline| with the
+% syntax $a$-$b$.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_c_custom_line_i:nn #1 #2
+ {
+ \str_if_in:nnTF { #2 } { - }
+ { \@@_cut_on_hyphen:w #2 \q_stop }
+ { \@@_cut_on_hyphen:w #2 - #2 \q_stop }
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_hline:n
+ {
+ #1 ,
+ start = \l_tmpa_tl ,
+ end = \l_tmpb_tl ,
+ position = \int_eval:n { \c at iRow + 1 } ,
+ total-width = \dim_use:N \l_@@_rule_width_dim
+ }
+ }
+ }
+\cs_generate_variant:Nn \@@_c_custom_line:nn { n V }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_compute_rule_width:n #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_@@_pre_code_after_tl
+ {
+ \@@_vline:n
+ {
+ #1 ,
+ position = \int_eval:n { \c at jCol + 1 } ,
+ total-width = \dim_use:N \l_@@_rule_width_dim
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_custom_line:n
+ { letter = : , command = hdottedline , ccommand = cdottedline, dotted }
+% \end{macrocode}
+%
+% \subsubsection*{The key hvlines}
+%
+% The following command tests whether the current position in the array (given by
+% |\l_tmpa_tl| for the row and |\l_tmpb_tl| for the column) would provide an
+% horizontal rule towards the right in the block delimited by the four arguments
+% |#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 #5
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% The same for vertical rules.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_vline_in_block:nnnnn #1 #2 #3 #4 #5
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_hline_in_stroken_block:nnnn #1 #2 #3 #4
+ {
+ \bool_lazy_all:nT
+ {
+ {
+ ( \int_compare_p:nNn \l_tmpa_tl = { #1 } )
+ || ( \int_compare_p:nNn \l_tmpa_tl = { #3 + 1 } )
+ }
+ { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } }
+ { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_vline_in_stroken_block:nnnn #1 #2 #3 #4
+ {
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } }
+ { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } }
+ {
+ ( \int_compare_p:nNn \l_tmpb_tl = { #2 } )
+ || ( \int_compare_p:nNn \l_tmpb_tl = { #4 + 1 } )
+ }
+ }
+ { \bool_gset_false:N \g_tmpa_bool }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The key corners}
+%
+% When the key |corners| is raised, the rules are not drawn in the
+% corners. Of course, we have to compute the corners before we begin to draw the
+% rules.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_compute_corners:
+ {
+% \end{macrocode}
+% The sequence |\l_@@_corners_cells_seq| will be the sequence of all the
+% empty cells (and not in a block) considered in the corners of the array.
+% \begin{macrocode}
+ \seq_clear_new:N \l_@@_corners_cells_seq
+ \clist_map_inline:Nn \l_@@_corners_clist
+ {
+ \str_case:nnF { ##1 }
+ {
+ { NW }
+ { \@@_compute_a_corner:nnnnnn 1 1 1 1 \c at iRow \c at jCol }
+ { NE }
+ { \@@_compute_a_corner:nnnnnn 1 \c at jCol 1 { -1 } \c at iRow 1 }
+ { SW }
+ { \@@_compute_a_corner:nnnnnn \c at iRow 1 { -1 } 1 1 \c at jCol }
+ { SE }
+ { \@@_compute_a_corner:nnnnnn \c at iRow \c at jCol { -1 } { -1 } 1 1 }
+ }
+ { \@@_error:nn { bad~corner } { ##1 } }
+ }
+% \end{macrocode}
+% Even if the user has used the key |corners| the list of cells in the corners
+% may be empty.
+% \begin{macrocode}
+ \seq_if_empty:NF \l_@@_corners_cells_seq
+ {
+% \end{macrocode}
+% You write on the |aux| file the list of the cells which are in the (empty)
+% corners because you need that information in the |\CodeBefore| since the
+% commands which color the |rows|, |columns| and |cells| must not color the
+% cells in the corners.
+% \begin{macrocode}
+ \tl_gput_right:Nx \g_@@_aux_tl
+ {
+ \seq_set_from_clist:Nn \exp_not:N \l_@@_corners_cells_seq
+ { \seq_use:Nnnn \l_@@_corners_cells_seq , , , }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% ``Computing a corner'' is determining all the empty cells (which are not in a
+% block) that belong to that corner. These cells will be added to the sequence
+% |\l_@@_corners_cells_seq|.
+%
+% \medskip
+% The six arguments of |\@@_compute_a_corner:nnnnnn| are as follow:
+% \begin{itemize}
+% \item |#1| and |#2| are the number of row and column of the cell which is
+% actually in the corner;
+% \item |#3| and |#4| are the steps in rows and the step in columns when moving
+% from the corner;
+% \item |#5| is the number of the final row when scanning the rows from the
+% corner;
+% \item |#6| is the number of the final column when scanning the columns from
+% the corner.
+% \end{itemize}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_compute_a_corner:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+% \end{macrocode}
+% For the explanations and the name of the variables, we consider that we are
+% computing the left-upper corner.
+%
+% First, we try to determine which is the last empty cell (and not in a block:
+% we won't add that precision any longer) in the column of number~$1$. The flag
+% |\l_tmpa_bool| will be raised when a non-empty cell is found.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \int_zero_new:N \l_@@_last_empty_row_int
+ \int_set:Nn \l_@@_last_empty_row_int { #1 }
+ \int_step_inline:nnnn { #1 } { #3 } { #5 }
+ {
+ \@@_test_if_cell_in_a_block:nn { ##1 } { \int_eval:n { #2 } }
+ \bool_lazy_or:nnTF
+ {
+ \cs_if_exist_p:c
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \int_eval:n { #2 } }
+ }
+ \l_tmpb_bool
+ { \bool_set_true:N \l_tmpa_bool }
+ {
+ \bool_if:NF \l_tmpa_bool
+ { \int_set:Nn \l_@@_last_empty_row_int { ##1 } }
+ }
+ }
+% \end{macrocode}
+% Now, you determine the last empty cell in the row of number~$1$.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \int_zero_new:N \l_@@_last_empty_column_int
+ \int_set:Nn \l_@@_last_empty_column_int { #2 }
+ \int_step_inline:nnnn { #2 } { #4 } { #6 }
+ {
+ \@@_test_if_cell_in_a_block:nn { \int_eval:n { #1 } } { ##1 }
+ \bool_lazy_or:nnTF
+ \l_tmpb_bool
+ {
+ \cs_if_exist_p:c
+ { pgf @ sh @ ns @ \@@_env: - \int_eval:n { #1 } - ##1 }
+ }
+ { \bool_set_true:N \l_tmpa_bool }
+ {
+ \bool_if:NF \l_tmpa_bool
+ { \int_set:Nn \l_@@_last_empty_column_int { ##1 } }
+ }
+ }
+% \end{macrocode}
+% Now, we loop over the rows.
+% \begin{macrocode}
+ \int_step_inline:nnnn { #1 } { #3 } \l_@@_last_empty_row_int
+ {
+% \end{macrocode}
+% We treat the row number |##1| with another loop.
+% \begin{macrocode}
+ \bool_set_false:N \l_tmpa_bool
+ \int_step_inline:nnnn { #2 } { #4 } \l_@@_last_empty_column_int
+ {
+ \@@_test_if_cell_in_a_block:nn { ##1 } { ####1 }
+ \bool_lazy_or:nnTF
+ \l_tmpb_bool
+ {
+ \cs_if_exist_p:c
+ { pgf @ sh @ ns @ \@@_env: - ##1 - ####1 }
+ }
+ { \bool_set_true:N \l_tmpa_bool }
+ {
+ \bool_if:NF \l_tmpa_bool
+ {
+ \int_set:Nn \l_@@_last_empty_column_int { ####1 }
+ \seq_put_right:Nn
+ \l_@@_corners_cells_seq
+ { ##1 - ####1 }
+ }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following macro tests whether a cell is in (at least) one of
+% the blocks of the array (or in a cell with a |\diagbox|).
+%
+% The flag |\l_tmpb_bool| will be raised if the cell |#1|-|#2| is in a block (or
+% in a cell with a |\diagbox|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_cell_in_a_block:nn #1 #2
+ {
+ \int_set:Nn \l_tmpa_int { #1 }
+ \int_set:Nn \l_tmpb_int { #2 }
+ \bool_set_false:N \l_tmpb_bool
+ \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
+ { \@@_test_if_cell_in_block:nnnnnnn \l_tmpa_int \l_tmpb_int ##1 }
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_cell_in_block:nnnnnnn #1 #2 #3 #4 #5 #6 #7
+ {
+ \int_compare:nNnT { #3 } < { \int_eval:n { #1 + 1 } }
+ {
+ \int_compare:nNnT { #1 } < { \int_eval:n { #5 + 1 } }
+ {
+ \int_compare:nNnT { #4 } < { \int_eval:n { #2 + 1 } }
+ {
+ \int_compare:nNnT { #2 } < { \int_eval:n { #6 + 1 } }
+ { \bool_set_true:N \l_tmpb_bool }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The environment \{NiceMatrixBlock\}}
+%
+% The following flag will be raised when all the columns of the environments of
+% the block must have the same width in ``auto'' mode.
+% \begin{macrocode}
+\bool_new:N \l_@@_block_auto_columns_width_bool
+% \end{macrocode}
+%
+% \bigskip
+% Up to now, there is only one option available for the environment
+% |{NiceMatrixBlock}|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / NiceMatrixBlock }
+ {
+ auto-columns-width .code:n =
+ {
+ \bool_set_true:N \l_@@_block_auto_columns_width_bool
+ \dim_gzero_new:N \g_@@_max_cell_width_dim
+ \bool_set_true:N \l_@@_auto_columns_width_bool
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentEnvironment { NiceMatrixBlock } { ! O { } }
+ {
+ \int_gincr:N \g_@@_NiceMatrixBlock_int
+ \dim_zero:N \l_@@_columns_width_dim
+ \keys_set:nn { NiceMatrix / NiceMatrixBlock } { #1 }
+ \bool_if:NT \l_@@_block_auto_columns_width_bool
+ {
+ \cs_if_exist:cT { @@_max_cell_width_ \int_use:N \g_@@_NiceMatrixBlock_int }
+ {
+ \exp_args:NNc \dim_set:Nn \l_@@_columns_width_dim
+ { @@_max_cell_width _ \int_use:N \g_@@_NiceMatrixBlock_int }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% At the end of the environment |{NiceMatrixBlock}|, we write in the main |aux|
+% file instructions for the column width of all the environments of the block
+% (that's why we have stored the number of the first environment of the block in
+% the counter |\l_@@_first_env_block_int|).
+% \begin{macrocode}
+ {
+ \bool_if:NT \l_@@_block_auto_columns_width_bool
+ {
+ \iow_shipout:Nn \@mainaux \ExplSyntaxOn
+ \iow_shipout:Nx \@mainaux
+ {
+ \cs_gset:cpn
+ { @@ _ max _ cell _ width _ \int_use:N \g_@@_NiceMatrixBlock_int }
+% \end{macrocode}
+% For technical reasons, we have to include the width of a potential rule on the
+% right side of the cells.
+% \begin{macrocode}
+ { \dim_eval:n { \g_@@_max_cell_width_dim + \arrayrulewidth } }
+ }
+ \iow_shipout:Nn \@mainaux \ExplSyntaxOff
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+% \section{The extra nodes}
+%
+% First, two variants of the functions |\dim_min:nn| and |\dim_max:nn|.
+% \begin{macrocode}
+\cs_generate_variant:Nn \dim_min:nn { v n }
+\cs_generate_variant:Nn \dim_max:nn { v n }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following command is called in |\@@_use_arraybox_with_notes_c:| just
+% before the construction of the blocks (if the creation of medium nodes is
+% required, medium nodes are also created for the blocks and that construction
+% uses the standard medium nodes).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_extra_nodes:
+ {
+ \bool_if:nTF \l_@@_medium_nodes_bool
+ {
+ \bool_if:NTF \l_@@_large_nodes_bool
+ \@@_create_medium_and_large_nodes:
+ \@@_create_medium_nodes:
+ }
+ { \bool_if:NT \l_@@_large_nodes_bool \@@_create_large_nodes: }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% We have three macros of creation of nodes: |\@@_create_medium_nodes:|,
+% |\@@_create_large_nodes:| and |\@@_create_medium_and_large_nodes:|.
+%
+%
+% \bigskip
+% We have to compute the mathematical coordinates of the ``medium nodes''. These
+% mathematical coordinates are also used to compute the mathematical coordinates
+% of the ``large nodes''. That's why we write a command
+% |\@@_computations_for_medium_nodes:| to do these computations.
+%
+% \bigskip
+% The command |\@@_computations_for_medium_nodes:| must be used in a
+% |{pgfpicture}|.
+%
+% \medskip
+% For each row $i$, we compute two dimensions
+% \texttt{l_@@_row_\textsl{i}_min_dim} and \texttt{l_@@_row_\textsl{i}_max_dim}.
+% The dimension \texttt{l_@@_row_\textsl{i}_min_dim} is the minimal
+% $y$-value of all the cells of the row~$i$. The dimension
+% \texttt{l_@@_row_\textsl{i}_max_dim} is the maximal $y$-value of all the cells
+% of the row~$i$.
+%
+% Similarly, for each column $j$, we compute two dimensions
+% \texttt{l_@@_column_\textsl{j}_min_dim} and
+% \texttt{l_@@_column_\textsl{j}_max_dim}. The dimension
+% \texttt{l_@@_column_\textsl{j}_min_dim} is the minimal $x$-value of all the
+% cells of the column~$j$. The dimension \texttt{l_@@_column_\textsl{j}_max_dim}
+% is the maximal $x$-value of all the cells of the column~$j$.
+%
+% Since these dimensions will be computed as maximum or minimum, we initialize
+% them to |\c_max_dim| or |-\c_max_dim|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_computations_for_medium_nodes:
+ {
+ \int_step_variable:nnNn \l_@@_first_row_int \g_@@_row_total_int \@@_i:
+ {
+ \dim_zero_new:c { l_@@_row_\@@_i: _min_dim }
+ \dim_set_eq:cN { l_@@_row_\@@_i: _min_dim } \c_max_dim
+ \dim_zero_new:c { l_@@_row_\@@_i: _max_dim }
+ \dim_set:cn { l_@@_row_\@@_i: _max_dim } { - \c_max_dim }
+ }
+ \int_step_variable:nnNn \l_@@_first_col_int \g_@@_col_total_int \@@_j:
+ {
+ \dim_zero_new:c { l_@@_column_\@@_j: _min_dim }
+ \dim_set_eq:cN { l_@@_column_\@@_j: _min_dim } \c_max_dim
+ \dim_zero_new:c { l_@@_column_\@@_j: _max_dim }
+ \dim_set:cn { l_@@_column_\@@_j: _max_dim } { - \c_max_dim }
+ }
+% \end{macrocode}
+% We begin the two nested loops over the rows and the columns of the array.
+% \begin{macrocode}
+ \int_step_variable:nnNn \l_@@_first_row_int \g_@@_row_total_int \@@_i:
+ {
+ \int_step_variable:nnNn
+ \l_@@_first_col_int \g_@@_col_total_int \@@_j:
+% \end{macrocode}
+% If the cell ($i$-$j$) is empty or an implicit cell (that is to say a cell
+% after implicit ampersands |&|) we don't update the dimensions we want to
+% compute.
+% \begin{macrocode}
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \@@_i: - \@@_j: }
+% \end{macrocode}
+% We retrieve the coordinates of the anchor |south west| of the (normal) node of
+% the cell ($i$-$j$). They will be stored in |\pgf at x| and |\pgf at y|.
+% \begin{macrocode}
+ {
+ \pgfpointanchor { \@@_env: - \@@_i: - \@@_j: } { south~west }
+ \dim_set:cn { l_@@_row_\@@_i: _min_dim}
+ { \dim_min:vn { l_@@_row _ \@@_i: _min_dim } \pgf at y }
+ \seq_if_in:NxF \g_@@_multicolumn_cells_seq { \@@_i: - \@@_j: }
+ {
+ \dim_set:cn { l_@@_column _ \@@_j: _min_dim}
+ { \dim_min:vn { l_@@_column _ \@@_j: _min_dim } \pgf at x }
+ }
+% \end{macrocode}
+% We retrieve the coordinates of the anchor |north east| of the (normal) node of
+% the cell ($i$-$j$). They will be stored in |\pgf at x| and |\pgf at y|.
+% \begin{macrocode}
+ \pgfpointanchor { \@@_env: - \@@_i: - \@@_j: } { north~east }
+ \dim_set:cn { l_@@_row _ \@@_i: _ max_dim }
+ { \dim_max:vn { l_@@_row _ \@@_i: _ max_dim } \pgf at y }
+ \seq_if_in:NxF \g_@@_multicolumn_cells_seq { \@@_i: - \@@_j: }
+ {
+ \dim_set:cn { l_@@_column _ \@@_j: _ max_dim }
+ { \dim_max:vn { l_@@_column _ \@@_j: _max_dim } \pgf at x }
+ }
+ }
+ }
+ }
+% \end{macrocode}
+% Now, we have to deal with empty rows or empty columns since we don't have
+% created nodes in such rows and columns.
+% \begin{macrocode}
+ \int_step_variable:nnNn \l_@@_first_row_int \g_@@_row_total_int \@@_i:
+ {
+ \dim_compare:nNnT
+ { \dim_use:c { l_@@_row _ \@@_i: _ min _ dim } } = \c_max_dim
+ {
+ \@@_qpoint:n { row - \@@_i: - base }
+ \dim_set:cn { l_@@_row _ \@@_i: _ max _ dim } \pgf at y
+ \dim_set:cn { l_@@_row _ \@@_i: _ min _ dim } \pgf at y
+ }
+ }
+ \int_step_variable:nnNn \l_@@_first_col_int \g_@@_col_total_int \@@_j:
+ {
+ \dim_compare:nNnT
+ { \dim_use:c { l_@@_column _ \@@_j: _ min _ dim } } = \c_max_dim
+ {
+ \@@_qpoint:n { col - \@@_j: }
+ \dim_set:cn { l_@@_column _ \@@_j: _ max _ dim } \pgf at y
+ \dim_set:cn { l_@@_column _ \@@_j: _ min _ dim } \pgf at y
+ }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% Here is the command |\@@_create_medium_nodes:|. When this command is used, the
+% ``medium nodes'' are created.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_medium_nodes:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_computations_for_medium_nodes:
+% \end{macrocode}
+% Now, we can create the ``medium nodes''. We use a command |\@@_create_nodes:|
+% because this command will also be used for the creation of the ``large nodes''.
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_suffix_tl { -medium }
+ \@@_create_nodes:
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The command |\@@_create_large_nodes:| must be used when we want to create only
+% the ``large nodes'' and not the medium ones\footnote{If we want to create
+% both, we have to use |\@@_create_medium_and_large_nodes:|}. However, the
+% computation of the mathematical coordinates of the ``large nodes'' needs the
+% computation of the mathematical coordinates of the ``medium nodes''. Hence, we
+% use first |\@@_computations_for_medium_nodes:| and then the command
+% |\@@_computations_for_large_nodes:|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_large_nodes:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_computations_for_medium_nodes:
+ \@@_computations_for_large_nodes:
+ \tl_set:Nn \l_@@_suffix_tl { - large }
+ \@@_create_nodes:
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_medium_and_large_nodes:
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_computations_for_medium_nodes:
+% \end{macrocode}
+% Now, we can create the ``medium nodes''. We use a command |\@@_create_nodes:|
+% because this command will also be used for the creation of the ``large nodes''.
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_suffix_tl { - medium }
+ \@@_create_nodes:
+ \@@_computations_for_large_nodes:
+ \tl_set:Nn \l_@@_suffix_tl { - large }
+ \@@_create_nodes:
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% For ``large nodes'', the exterior rows and columns don't interfer. That's why
+% the loop over the columns will start at 1 and stop at $|\c at jCol|$ (and not
+% |\g_@@_col_total_int|). Idem for the rows.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_computations_for_large_nodes:
+ {
+ \int_set:Nn \l_@@_first_row_int 1
+ \int_set:Nn \l_@@_first_col_int 1
+% \end{macrocode}
+% We have to change the values of all the dimensions
+% \texttt{l_@@_row_\textsl{i}_min_dim}, \texttt{l_@@_row_\textsl{i}_max_dim},
+% \texttt{l_@@_column_\textsl{j}_min_dim} and
+% \texttt{l_@@_column_\textsl{j}_max_dim}.
+% \begin{macrocode}
+ \int_step_variable:nNn { \c at iRow - 1 } \@@_i:
+ {
+ \dim_set:cn { l_@@_row _ \@@_i: _ min _ dim }
+ {
+ (
+ \dim_use:c { l_@@_row _ \@@_i: _ min _ dim } +
+ \dim_use:c { l_@@_row _ \int_eval:n { \@@_i: + 1 } _ max _ dim }
+ )
+ / 2
+ }
+ \dim_set_eq:cc { l_@@_row _ \int_eval:n { \@@_i: + 1 } _ max _ dim }
+ { l_@@_row_\@@_i: _min_dim }
+ }
+ \int_step_variable:nNn { \c at jCol - 1 } \@@_j:
+ {
+ \dim_set:cn { l_@@_column _ \@@_j: _ max _ dim }
+ {
+ (
+ \dim_use:c { l_@@_column _ \@@_j: _ max _ dim } +
+ \dim_use:c
+ { l_@@_column _ \int_eval:n { \@@_j: + 1 } _ min _ dim }
+ )
+ / 2
+ }
+ \dim_set_eq:cc { l_@@_column _ \int_eval:n { \@@_j: + 1 } _ min _ dim }
+ { l_@@_column _ \@@_j: _ max _ dim }
+ }
+% \end{macrocode}
+% Here, we have to use |\dim_sub:cn| because of the number 1 in the name.
+% \begin{macrocode}
+ \dim_sub:cn
+ { l_@@_column _ 1 _ min _ dim }
+ \l_@@_left_margin_dim
+ \dim_add:cn
+ { l_@@_column _ \int_use:N \c at jCol _ max _ dim }
+ \l_@@_right_margin_dim
+ }
+% \end{macrocode}
+%
+%
+%
+% \bigskip
+% The command |\@@_create_nodes:| is used twice: for the construction
+% of the ``medium nodes'' and for the construction of the ``large nodes''. The
+% nodes are constructed with the value of all the dimensions
+% \texttt{l_@@_row_\textsl{i}_min_dim}, \texttt{l_@@_row_\textsl{i}_max_dim},
+% \texttt{l_@@_column_\textsl{j}_min_dim} and
+% \texttt{l_@@_column_\textsl{j}_max_dim}. Between the construction of the
+% ``medium nodes'' and the ``large nodes'', the values of these dimensions are
+% changed.
+%
+% The function also uses |\l_@@_suffix_tl| (|-medium| or |-large|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_create_nodes:
+ {
+ \int_step_variable:nnNn \l_@@_first_row_int \g_@@_row_total_int \@@_i:
+ {
+ \int_step_variable:nnNn \l_@@_first_col_int \g_@@_col_total_int \@@_j:
+ {
+% \end{macrocode}
+% We draw the rectangular node for the cell (|\@@_i|-|\@@_j|).
+% \begin{macrocode}
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - \@@_i: - \@@_j: \l_@@_suffix_tl }
+ { \dim_use:c { l_@@_column_ \@@_j: _min_dim } }
+ { \dim_use:c { l_@@_row_ \@@_i: _min_dim } }
+ { \dim_use:c { l_@@_column_ \@@_j: _max_dim } }
+ { \dim_use:c { l_@@_row_ \@@_i: _max_dim } }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - \@@_i: - \@@_j: \l_@@_suffix_tl }
+ { \@@_env: - \@@_i: - \@@_j: \l_@@_suffix_tl }
+ }
+ }
+ }
+% \end{macrocode}
+% Now, we create the nodes for the cells of the |\multicolumn|. We recall that
+% we have stored in |\g_@@_multicolumn_cells_seq| the list of the cells where a
+% |\multicolumn{|$n$|}{...}{...}| with $n$>1 was issued and in
+% |\g_@@_multicolumn_sizes_seq| the correspondant values of $n$.
+% \begin{macrocode}
+ \cs_if_exist_use:NF
+ \seq_map_pairwise_function:NNN
+ \seq_mapthread_function:NNN
+ \g_@@_multicolumn_cells_seq
+ \g_@@_multicolumn_sizes_seq
+ \@@_node_for_multicolumn:nn
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_extract_coords_values: #1 - #2 \q_stop
+ {
+ \cs_set_nopar:Npn \@@_i: { #1 }
+ \cs_set_nopar:Npn \@@_j: { #2 }
+ }
+% \end{macrocode}
+%
+% The command |\@@_node_for_multicolumn:nn| takes two arguments. The first is
+% the position of the cell where the command |\multicolumn{|$n$|}{...}{...}| was
+% issued in the format $i$|-|$j$ and the second is the value of~$n$ (the length
+% of the ``multi-cell'').
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_node_for_multicolumn:nn #1 #2
+ {
+ \@@_extract_coords_values: #1 \q_stop
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - \@@_i: - \@@_j: \l_@@_suffix_tl }
+ { \dim_use:c { l_@@_column _ \@@_j: _ min _ dim } }
+ { \dim_use:c { l_@@_row _ \@@_i: _ min _ dim } }
+ { \dim_use:c { l_@@_column _ \int_eval:n { \@@_j: +#2-1 } _ max _ dim } }
+ { \dim_use:c { l_@@_row _ \@@_i: _ max _ dim } }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - \@@_i: - \@@_j: \l_@@_suffix_tl }
+ { \int_use:N \g_@@_env_int - \@@_i: - \@@_j: \l_@@_suffix_tl}
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The blocks}
+%
+% The code deals with the command |\Block|. This command has no direct link with
+% the environment |{NiceMatrixBlock}|.
+%
+% \bigskip
+% The options of the command |\Block| will be analyzed first in the cell of the
+% array (and once again when the block will be put in the array).
+% Here is the set of keys for the first pass.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Block / FirstPass }
+ {
+ l .code:n = \str_set:Nn \l_@@_hpos_block_str l ,
+ l .value_forbidden:n = true ,
+ r .code:n = \str_set:Nn \l_@@_hpos_block_str r ,
+ r .value_forbidden:n = true ,
+ c .code:n = \str_set:Nn \l_@@_hpos_block_str c ,
+ c .value_forbidden:n = true ,
+ L .code:n = \str_set:Nn \l_@@_hpos_block_str l ,
+ L .value_forbidden:n = true ,
+ R .code:n = \str_set:Nn \l_@@_hpos_block_str r ,
+ R .value_forbidden:n = true ,
+ C .code:n = \str_set:Nn \l_@@_hpos_block_str c ,
+ C .value_forbidden:n = true ,
+ t .code:n = \str_set:Nn \l_@@_vpos_of_block_str t ,
+ t .value_forbidden:n = true ,
+ b .code:n = \str_set:Nn \l_@@_vpos_of_block_str b ,
+ b .value_forbidden:n = true ,
+ color .tl_set:N = \l_@@_color_tl ,
+ color .value_required:n = true ,
+ respect-arraystretch .bool_set:N = \l_@@_respect_arraystretch_bool ,
+ respect-arraystretch .default:n = true ,
+ }
+% \end{macrocode}
+%
+%
+% The following command |\@@_Block:| will be linked to |\Block| in the
+% environments of \pkg{nicematrix}. We define it with
+% |\NewExpandableDocumentCommand| because it has an optional argument between
+% |<| and |>|. It's mandatory to use an expandable command.
+%
+% \begin{macrocode}
+\NewExpandableDocumentCommand \@@_Block: { O { } m D < > { } +m }
+ {
+% \end{macrocode}
+% If the first mandatory argument of the command (which is the size of the block
+% with the syntax $i$|-|$j$) has not be provided by the user, you use |1-1|
+% (that is to say a block of only one cell).
+% \begin{macrocode}
+ \peek_remove_spaces:n
+ {
+ \tl_if_blank:nTF { #2 }
+ { \@@_Block_i 1-1 \q_stop }
+ {
+ \int_compare:nNnTF { \char_value_catcode:n { 45 } } = { 13 }
+ \@@_Block_i_czech \@@_Block_i
+ #2 \q_stop
+ }
+ { #1 } { #3 } { #4 }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% With the following construction, we extract the values of $i$ and $j$ in the
+% first mandatory argument of the command.
+% \begin{macrocode}
+\cs_new:Npn \@@_Block_i #1-#2 \q_stop { \@@_Block_ii:nnnnn { #1 } { #2 } }
+% \end{macrocode}
+%
+% With \pkg{babel} with the key |czech|, the character |-| (hyphen) is active.
+% That's why we need a special version. Remark that we could not use a
+% preprocessor in the command |\@@_Block:| to do the job because the command
+% |\@@_Block:| is defined with the command |\NewExpandableDocumentCommand|.
+% \begin{macrocode}
+{
+ \char_set_catcode_active:N -
+ \cs_new:Npn \@@_Block_i_czech #1-#2 \q_stop { \@@_Block_ii:nnnnn { #1 } { #2 } }
+}
+% \end{macrocode}
+%
+% \medskip
+% Now, the arguments have been extracted: |#1| is $i$ (the number of rows of the
+% block), |#2| is $j$ (the number of columns of the block), |#3| is the list of
+% \textsl{key=values} pairs, |#4| are the tokens to put before the math mode and
+% the beginning of the small array of the block and |#5| is the label of the
+% block.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_ii:nnnnn #1 #2 #3 #4 #5
+ {
+% \end{macrocode}
+%
+% \medskip
+% We recall that |#1| and |#2| have been extracted from the first mandatory
+% argument of |\Block| (which is of the syntax $i$|-|$j$). However, the user is
+% allowed to omit $i$ or $j$ (or both). We detect that situation by replacing a
+% missing value by 100 (it's a convention: when the block will actually be drawn
+% these values will be detected and interpreted as \emph{maximal possible
+% value} according to the actual size of the array).
+% \begin{macrocode}
+ \bool_lazy_or:nnTF
+ { \tl_if_blank_p:n { #1 } }
+ { \str_if_eq_p:nn { #1 } { * } }
+ { \int_set:Nn \l_tmpa_int { 100 } }
+ { \int_set:Nn \l_tmpa_int { #1 } }
+ \bool_lazy_or:nnTF
+ { \tl_if_blank_p:n { #2 } }
+ { \str_if_eq_p:nn { #2 } { * } }
+ { \int_set:Nn \l_tmpb_int { 100 } }
+ { \int_set:Nn \l_tmpb_int { #2 } }
+% \end{macrocode}
+%
+% \medskip
+% If the block is mono-column.
+% \begin{macrocode}
+ \int_compare:nNnTF \l_tmpb_int = 1
+ {
+ \str_if_empty:NTF \l_@@_hpos_cell_str
+ { \str_set:Nn \l_@@_hpos_block_str c }
+ { \str_set_eq:NN \l_@@_hpos_block_str \l_@@_hpos_cell_str }
+ }
+ { \str_set:Nn \l_@@_hpos_block_str c }
+% \end{macrocode}
+% The value of |\l_@@_hpos_block_str| may be modified by the keys of the
+% command |\Block| that we will analyze now.
+%
+% \medskip
+% \begin{macrocode}
+ \keys_set_known:nn { NiceMatrix / Block / FirstPass } { #3 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpa_tl
+ {
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { \int_eval:n { \c at iRow + \l_tmpa_int - 1 } }
+ { \int_eval:n { \c at jCol + \l_tmpb_int - 1 } }
+ }
+% \end{macrocode}
+% Now, |\l_tmpa_tl| contains an ``object'' corresponding to the position of the
+% block with four components, each of them surrounded by curly brackets:
+%
+% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}|.
+%
+%
+% \medskip
+% If the block is mono-column or mono-row, we have a special treatment. That's
+% why we have two macros: |\@@_Block_iv:nnnnn| and |\@@_Block_v:nnnnn| (the five
+% arguments of those macros are provided by curryfication).
+% \begin{macrocode}
+ \bool_if:nTF
+ {
+ (
+ \int_compare_p:nNn { \l_tmpa_int } = 1
+ ||
+ \int_compare_p:nNn { \l_tmpb_int } = 1
+ )
+ && ! \tl_if_empty_p:n { #5 }
+% \end{macrocode}
+% For the blocks mono-column, we will compose right now in a box in order to
+% compute its width and take that width into account for the width of the
+% column. However, if the column is a |X| column, we should not do that since
+% the width is determined by another way. This should be the same for the |p|,
+% |m| and |b| columns and we should modify that point. However, for the |X|
+% column, it's imperative. Otherwise, the process for the determination of the
+% widths of the columns will be wrong.
+% \begin{macrocode}
+ && ! \l_@@_X_column_bool
+ }
+ { \exp_args:Nxx \@@_Block_iv:nnnnn }
+ { \exp_args:Nxx \@@_Block_v:nnnnn }
+ { \l_tmpa_int } { \l_tmpb_int } { #3 } { #4 } { #5 }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The following macro is for the case of a |\Block| which is mono-row or
+% mono-column (or both). In that case, the content of the block is composed
+% right now in a box (because we have to take into account the dimensions of
+% that box for the width of the current column or the height and the depth of the
+% current row). However, that box will be put in the array \emph{after the
+% construction of the array} (by using \textsc{pgf}).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_iv:nnnnn #1 #2 #3 #4 #5
+ {
+ \int_gincr:N \g_@@_block_box_int
+ \cs_set_protected_nopar:Npn \diagbox ##1 ##2
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_actually_diagbox:nnnnnn
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { \int_eval:n { \c at iRow + #1 - 1 } }
+ { \int_eval:n { \c at jCol + #2 - 1 } }
+ { \exp_not:n { ##1 } } { \exp_not:n { ##2 } }
+ }
+ }
+ \box_gclear_new:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ \hbox_gset:cn
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ {
+% \end{macrocode}
+% For a mono-column block, if the user has specified a color for the column in
+% the preamble of the array, we want to fix that color in the box we construct.
+% We do that with |\set at color| and not |\color_ensure_current:| (in order to use
+% |\color_ensure_current:| safely, you should load \pkg{l3backend} before the
+% |\documentclass| with |\RequirePackage{expl3}|).
+% \begin{macrocode}
+ \tl_if_empty:NTF \l_@@_color_tl
+ { \int_compare:nNnT { #2 } = 1 \set at color }
+ { \@@_color:V \l_@@_color_tl }
+% \end{macrocode}
+% If the block is mono-row, we use |\g_@@_row_style_tl| even if it has yet been
+% used in the beginning of the cell where the command |\Block| has been issued
+% because we want to be able to take into account a potential instruction of
+% color of the font in |\g_@@_row_style_tl|.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } = 1
+ {
+ \int_compare:nNnTF \c at iRow = 0
+ \l_@@_code_for_first_row_tl
+ {
+ \int_compare:nNnT \c at iRow = \l_@@_last_row_int
+ \l_@@_code_for_last_row_tl
+ }
+ \g_@@_row_style_tl
+ }
+ \group_begin:
+ \bool_if:NF \l_@@_respect_arraystretch_bool
+ { \cs_set:Npn \arraystretch { 1 } }
+ \dim_zero:N \extrarowheight
+ #4
+% \end{macrocode}
+% If the box is rotated (the key |\rotate| may be in the previous |#4|), the
+% tabular used for the content of the cell will be constructed with a format
+% |c|. In the other cases, the tabular will be constructed with a format equal
+% to the key of position of the box. In other words: the alignment internal to
+% the tabular is the same as the external alignment of the tabular (that is to
+% say the position of the block in its zone of merged cells).
+% \begin{macrocode}
+ \bool_if:NT \g_@@_rotate_bool { \str_set:Nn \l_@@_hpos_block_str c }
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ {
+ \bool_lazy_all:nTF
+ {
+ { \int_compare_p:nNn { #2 } = 1 }
+ { \dim_compare_p:n { \l_@@_col_width_dim >= \c_zero_dim } }
+ { ! \g_@@_rotate_bool }
+ }
+% \end{macrocode}
+% When the block is mono-column in a column with a fixed width (eg |p{3cm}|).
+% \begin{macrocode}
+ {
+ \use:x
+ {
+ \exp_not:N \begin { minipage }%
+ [ \str_lowercase:V { \l_@@_vpos_of_block_str } ]
+ { \l_@@_col_width_dim }
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c \centering
+ r \raggedleft
+ l \raggedright
+ }
+ }
+ #5
+ \end { minipage }
+ }
+ {
+ \use:x
+ {
+ \exp_not:N \begin { tabular }%
+ [ \str_lowercase:V { \l_@@_vpos_of_block_str } ]
+ { @ { } \l_@@_hpos_block_str @ { } }
+ }
+ #5
+ \end { tabular }
+ }
+ }
+ {
+ \c_math_toggle_token
+ \use:x
+ {
+ \exp_not:N \begin { array }%
+ [ \str_lowercase:V { \l_@@_vpos_of_block_str } ]
+ { @ { } \l_@@_hpos_block_str @ { } }
+ }
+ #5
+ \end { array }
+ \c_math_toggle_token
+ }
+ \group_end:
+ }
+ \bool_if:NT \g_@@_rotate_bool
+ {
+ \box_grotate:cn
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ { 90 }
+ \bool_gset_false:N \g_@@_rotate_bool
+ }
+% \end{macrocode}
+% If we are in a mono-column block, we take into account the width of that block
+% for the width of the column.
+% \begin{macrocode}
+ \int_compare:nNnT { #2 } = 1
+ {
+ \dim_gset:Nn \g_@@_blocks_wd_dim
+ {
+ \dim_max:nn
+ \g_@@_blocks_wd_dim
+ {
+ \box_wd:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ }
+% \end{macrocode}
+% If we are in a mono-row block, we take into account the height and the
+% depth of that block for the height and the depth of the row.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } = 1
+ {
+ \dim_gset:Nn \g_@@_blocks_ht_dim
+ {
+ \dim_max:nn
+ \g_@@_blocks_ht_dim
+ {
+ \box_ht:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ \dim_gset:Nn \g_@@_blocks_dp_dim
+ {
+ \dim_max:nn
+ \g_@@_blocks_dp_dim
+ {
+ \box_dp:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ }
+ \seq_gput_right:Nx \g_@@_blocks_seq
+ {
+ \l_tmpa_tl
+% \end{macrocode}
+% In the list of options |#3|, maybe there is a key for the horizontal alignment
+% (|l|, |r| or |c|). In that case, that key has been read and stored in
+% |\l_@@_hpos_block_str|. However, maybe there were no key of the horizontal
+% alignment and that's why we put a key corresponding to the value of
+% |\l_@@_hpos_block_str|, which is fixed by the type of current column.
+% \begin{macrocode}
+ { \exp_not:n { #3 } , \l_@@_hpos_block_str }
+ {
+ \box_use_drop:c
+ { g_@@_ block _ box _ \int_use:N \g_@@_block_box_int _ box }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following macro is for the standard case, where the block is not mono-row
+% and not mono-column. In that case, the content of the block is \emph{not}
+% composed right now in a box. The composition in a box will be done further,
+% just after the construction of the array.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_v:nnnnn #1 #2 #3 #4 #5
+ {
+ \seq_gput_right:Nx \g_@@_blocks_seq
+ {
+ \l_tmpa_tl
+ { \exp_not:n { #3 } }
+ {
+ \bool_if:NTF \l_@@_NiceTabular_bool
+ {
+ \group_begin:
+ \bool_if:NF \l_@@_respect_arraystretch_bool
+ { \cs_set:Npn \exp_not:N \arraystretch { 1 } }
+ \exp_not:n
+ {
+ \dim_zero:N \extrarowheight
+ #4
+% \end{macrocode}
+% If the box is rotated (the key |\rotate| may be in the previous |#4|), the
+% tabular used for the content of the cell will be constructed with a format
+% |c|. In the other cases, the tabular will be constructed with a format equal
+% to the key of position of the box. In other words: the alignment internal to
+% the tabular is the same as the external alignment of the tabular (that is to
+% say the position of the block in its zone of merged cells).
+% \begin{macrocode}
+ \bool_if:NT \g_@@_rotate_bool
+ { \str_set:Nn \l_@@_hpos_block_str c }
+ \use:x
+ {
+ \exp_not:N \begin { tabular } [ \l_@@_vpos_of_block_str ]
+ { @ { } \l_@@_hpos_block_str @ { } }
+ }
+ #5
+ \end { tabular }
+ }
+ \group_end:
+ }
+ {
+ \group_begin:
+ \bool_if:NF \l_@@_respect_arraystretch_bool
+ { \cs_set:Npn \exp_not:N \arraystretch { 1 } }
+ \exp_not:n
+ {
+ \dim_zero:N \extrarowheight
+ #4
+ \bool_if:NT \g_@@_rotate_bool
+ { \str_set:Nn \l_@@_hpos_block_str c }
+ \c_math_toggle_token
+ \use:x
+ {
+ \exp_not:N \begin { array } [ \l_@@_vpos_of_block_str ]
+ { @ { } \l_@@_hpos_block_str @ { } }
+ }
+ #5
+ \end { array }
+ \c_math_toggle_token
+ }
+ \group_end:
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% We recall that the options of the command |\Block| are analyzed twice: first
+% in the cell of the array and once again when the block will be put in the
+% array \emph{after the construction of the array} (by using \textsc{pgf}).
+%
+% \medskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Block / SecondPass }
+ {
+ tikz .code:n =
+ \IfPackageLoadedTF { tikz }
+ { \seq_put_right:Nn \l_@@_tikz_seq { { #1 } } }
+ { \@@_error:n { tikz~key~without~tikz } } ,
+ tikz .value_required:n = true ,
+ fill .code:n =
+ \tl_set_rescan:Nnn
+ \l_@@_fill_tl
+ { \char_set_catcode_other:N ! }
+ { #1 } ,
+ fill .value_required:n = true ,
+ draw .code:n =
+ \tl_set_rescan:Nnn
+ \l_@@_draw_tl
+ { \char_set_catcode_other:N ! }
+ { #1 } ,
+ draw .default:n = default ,
+ rounded-corners .dim_set:N = \l_@@_rounded_corners_dim ,
+ rounded-corners .default:n = 4 pt ,
+ color .code:n =
+ \@@_color:n { #1 }
+ \tl_set_rescan:Nnn
+ \l_@@_draw_tl
+ { \char_set_catcode_other:N ! }
+ { #1 } ,
+ color .value_required:n = true ,
+ borders .clist_set:N = \l_@@_borders_clist ,
+ borders .value_required:n = true ,
+ hvlines .meta:n = { vlines , hlines } ,
+ vlines .bool_set:N = \l_@@_vlines_block_bool,
+ vlines .default:n = true ,
+ hlines .bool_set:N = \l_@@_hlines_block_bool,
+ hlines .default:n = true ,
+ line-width .dim_set:N = \l_@@_line_width_dim ,
+ line-width .value_required:n = true ,
+ l .code:n = \str_set:Nn \l_@@_hpos_block_str l ,
+ l .value_forbidden:n = true ,
+ r .code:n = \str_set:Nn \l_@@_hpos_block_str r ,
+ r .value_forbidden:n = true ,
+ c .code:n = \str_set:Nn \l_@@_hpos_block_str c ,
+ c .value_forbidden:n = true ,
+ L .code:n = \str_set:Nn \l_@@_hpos_block_str l
+ \bool_set_true:N \l_@@_hpos_of_block_cap_bool ,
+ L .value_forbidden:n = true ,
+ R .code:n = \str_set:Nn \l_@@_hpos_block_str r
+ \bool_set_true:N \l_@@_hpos_of_block_cap_bool ,
+ R .value_forbidden:n = true ,
+ C .code:n = \str_set:Nn \l_@@_hpos_block_str c
+ \bool_set_true:N \l_@@_hpos_of_block_cap_bool ,
+ C .value_forbidden:n = true ,
+ t .code:n = \str_set:Nn \l_@@_vpos_of_block_str t ,
+ t .value_forbidden:n = true ,
+ T .code:n = \str_set:Nn \l_@@_vpos_of_block_str T ,
+ T .value_forbidden:n = true ,
+ b .code:n = \str_set:Nn \l_@@_vpos_of_block_str b ,
+ b .value_forbidden:n = true ,
+ B .code:n = \str_set:Nn \l_@@_vpos_of_block_str B ,
+ B .value_forbidden:n = true ,
+ v-center .code:n = \str_set:Nn \l_@@_vpos_of_block_str { c } ,
+ v-center .value_forbidden:n = true ,
+ name .tl_set:N = \l_@@_block_name_str ,
+ name .value_required:n = true ,
+ name .initial:n = ,
+ respect-arraystretch .bool_set:N = \l_@@_respect_arraystretch_bool ,
+ respect-arraystretch .default:n = true ,
+ transparent .bool_set:N = \l_@@_transparent_bool ,
+ transparent .default:n = true ,
+ transparent .initial:n = false ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~Block }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The command |\@@_draw_blocks:| will draw all the blocks. This command is used
+% after the construction of the array. We have to revert to a clean version of
+% |\ialign| because there may be tabulars in the |\Block| instructions that will
+% be composed now.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_blocks:
+ {
+ \cs_set_eq:NN \ialign \@@_old_ialign:
+ \seq_map_inline:Nn \g_@@_blocks_seq { \@@_Block_iv:nnnnnn ##1 }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_iv:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+% \end{macrocode}
+% The integer |\l_@@_last_row_int| will be the last row of the block and
+% |\l_@@_last_col_int| its last column.
+% \begin{macrocode}
+ \int_zero_new:N \l_@@_last_row_int
+ \int_zero_new:N \l_@@_last_col_int
+% \end{macrocode}
+%
+% We remind that the first mandatory argument of the command |\Block| is the
+% size of the block with the special format $i$|-|$j$. However, the user is
+% allowed to omit $i$ or $j$ (or both). This will be interpreted as: the last
+% row (resp. column) of the block will be the last row (resp. column) of the
+% block (without the potential exterior row---resp. column---of the array). By
+% convention, this is stored in |\g_@@_blocks_seq| as a number of rows (resp.
+% columns) for the block equal to 100. That's what we detect now.
+% \begin{macrocode}
+ \int_compare:nNnTF { #3 } > { 99 }
+ { \int_set_eq:NN \l_@@_last_row_int \c at iRow }
+ { \int_set:Nn \l_@@_last_row_int { #3 } }
+ \int_compare:nNnTF { #4 } > { 99 }
+ { \int_set_eq:NN \l_@@_last_col_int \c at jCol }
+ { \int_set:Nn \l_@@_last_col_int { #4 } }
+ \int_compare:nNnTF \l_@@_last_col_int > \g_@@_col_total_int
+ {
+ \int_compare:nTF
+ { \l_@@_last_col_int <= \g_@@_static_num_of_col_int }
+ {
+ \msg_error:nnnn { nicematrix } { Block~too~large~2 } { #1 } { #2 }
+ \@@_msg_redirect_name:nn { Block~too~large~2 } { none }
+ \@@_msg_redirect_name:nn { columns~not~used } { none }
+ }
+ { \msg_error:nnnn { nicematrix } { Block~too~large~1 } { #1 } { #2 } }
+ }
+ {
+ \int_compare:nNnTF \l_@@_last_row_int > \g_@@_row_total_int
+ { \msg_error:nnnn { nicematrix } { Block~too~large~1 } { #1 } { #2 } }
+ { \@@_Block_v:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { #6 } }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% |#1| is the first row of the block;
+% |#2| is the first column of the block;
+% |#3| is the last row of the block;
+% |#4| is the last column of the block;
+% |#5| is a list of \textsl{key=value} options;
+% |#6| is the label
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_Block_v:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+% \end{macrocode}
+% The group is for the keys.
+% \begin{macrocode}
+ \group_begin:
+ \int_compare:nNnT { #1 } = { #3 }
+ { \str_set:Nn \l_@@_vpos_of_block_str { t } }
+ \keys_set:nn { NiceMatrix / Block / SecondPass } { #5 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \bool_if:NT \l_@@_vlines_block_bool
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_after_tl
+ {
+ \@@_vlines_block:nnn
+ { \exp_not:n { #5 } }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ }
+ }
+ \bool_if:NT \l_@@_hlines_block_bool
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_after_tl
+ {
+ \@@_hlines_block:nnn
+ { \exp_not:n { #5 } }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ }
+ }
+ \bool_if:nF
+ {
+ \l_@@_transparent_bool
+ || ( \l_@@_vlines_block_bool && \l_@@_hlines_block_bool )
+ }
+ {
+% \end{macrocode}
+% The sequence of the positions of the blocks (excepted the blocks with the key
+% |hvlines|) will be used when drawing the rules (in fact, there is also the
+% |\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 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+ \bool_lazy_and:nnT
+ { ! (\tl_if_empty_p:N \l_@@_draw_tl) }
+ { \l_@@_hlines_block_bool || \l_@@_vlines_block_bool }
+ { \@@_error:n { hlines~with~color } }
+% \end{macrocode}
+% \bigskip
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_draw_tl
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_after_tl
+ {
+ \@@_stroke_block:nnn
+ { \exp_not:n { #5 } }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ }
+ \seq_gput_right:Nn \g_@@_pos_of_stroken_blocks_seq
+ { { #1 } { #2 } { #3 } { #4 } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \clist_if_empty:NF \l_@@_borders_clist
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_after_tl
+ {
+ \@@_stroke_borders_block:nnn
+ { \exp_not:n { #5 } }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_if_empty:NF \l_@@_fill_tl
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_before_tl
+ {
+ \exp_not:N \roundedrectanglecolor
+ \exp_args:NV \tl_if_head_eq_meaning:nNTF \l_@@_fill_tl [
+ { \l_@@_fill_tl }
+ { { \l_@@_fill_tl } }
+ { #1 - #2 }
+ { \int_use:N \l_@@_last_row_int - \int_use:N \l_@@_last_col_int }
+ { \dim_use:N \l_@@_rounded_corners_dim }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \seq_if_empty:NF \l_@@_tikz_seq
+ {
+ \tl_gput_right:Nx \g_nicematrix_code_before_tl
+ {
+ \@@_block_tikz:nnnnn
+ { #1 }
+ { #2 }
+ { \int_use:N \l_@@_last_row_int }
+ { \int_use:N \l_@@_last_col_int }
+ { \seq_use:Nn \l_@@_tikz_seq { , } }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \cs_set_protected_nopar:Npn \diagbox ##1 ##2
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_actually_diagbox:nnnnnn
+ { #1 }
+ { #2 }
+ { \int_use:N \l_@@_last_row_int }
+ { \int_use:N \l_@@_last_col_int }
+ { \exp_not:n { ##1 } } { \exp_not:n { ##2 } }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+ \hbox_set:Nn \l_@@_cell_box { \set at color #6 }
+ \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
+% \end{macrocode}
+%
+% \bigskip
+% Let's consider the following |{NiceTabular}|. Because of the instruction
+% |!{\hspace{1cm}}| in the preamble which increases the space between the
+% columns (by adding, in fact, that space to the previous column, that is to say
+% the second column of the tabular), we will create \emph{two} nodes relative to
+% the block: the node |1-1-block| and the node |1-1-block-short|.
+%
+% \begin{Verbatim}
+% \begin{NiceTabular}{cc!{\hspace{1cm}}c}
+% \Block{2-2}{our block} & & one \\
+% & & two \\
+% three & four & five \\
+% six & seven & eight \\
+% \end{NiceTabular}
+% \end{Verbatim}
+%
+% \tikzset{highlight/.style={rectangle,
+% fill=red!15,
+% blend mode = multiply,
+% rounded corners = 0pt,
+% inner sep=0pt,
+% fit = #1}}
+%
+% \begin{tabular}{c!{\hspace{1cm}}c}
+% We highlight the node |1-1-block|
+% & We highlight the node |1-1-block-short| \\[2mm]
+% \begin{NiceTabular}{cc!{\hspace{1cm}}c}
+% \Block{2-2}{our block} & & one \\
+% & & two \\
+% three & four & five \\
+% six & seven & eight \\
+% \CodeAfter
+% \tikz \node [highlight = (1-1-block)] { } ;
+% \end{NiceTabular}
+% &
+% \begin{NiceTabular}{cc!{\hspace{1cm}}c}
+% \Block{2-2}{our block} & & one \\
+% & & two \\
+% three & four & five \\
+% six & seven & eight \\
+% \CodeAfter
+% \tikz \node [highlight = (1-1-block-short)] { } ;
+% \end{NiceTabular}
+% \end{tabular}
+%
+%
+% \bigskip
+% The construction of the node corresponding to the merged cells.
+% \begin{macrocode}
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \@@_qpoint:n { row - #1 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at y
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf at x
+ \@@_qpoint:n { row - \int_eval:n { \l_@@_last_row_int + 1 } }
+ \dim_set_eq:NN \l_@@_tmpc_dim \pgf at y
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_last_col_int + 1 } }
+ \dim_set_eq:NN \l_@@_tmpd_dim \pgf at x
+% \end{macrocode}
+%
+% We construct the node for the block with the name |(#1-#2-block)|.
+%
+% The function |\@@_pgf_rect_node:nnnnn| takes in as arguments the name of the node
+% and the four coordinates of two opposite corner points of the rectangle.
+% \begin{macrocode}
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - #1 - #2 - block }
+ \l_tmpb_dim \l_tmpa_dim \l_@@_tmpd_dim \l_@@_tmpc_dim
+ \str_if_empty:NF \l_@@_block_name_str
+ {
+ \pgfnodealias
+ { \@@_env: - \l_@@_block_name_str }
+ { \@@_env: - #1 - #2 - block }
+ \str_if_empty:NF \l_@@_name_str
+ {
+ \pgfnodealias
+ { \l_@@_name_str - \l_@@_block_name_str }
+ { \@@_env: - #1 - #2 - block }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we create the ``short node'' which, in general, will be used to put the
+% label (that is to say the content of the node). However, if one the keys |L|, |C| or
+% |R| is used (that information is provided by the boolean
+% |\l_@@_hpos_of_block_cap_bool|), we don't need to create that node since the
+% normal node is used to put the label.
+%
+% \begin{macrocode}
+ \bool_if:NF \l_@@_hpos_of_block_cap_bool
+ {
+ \dim_set_eq:NN \l_tmpb_dim \c_max_dim
+% \end{macrocode}
+% The short node is constructed by taking into account the \emph{contents} of
+% the columns involved in at least one cell of the block. That's why we have to
+% do a loop over the rows of the array.
+% \begin{macrocode}
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+% \end{macrocode}
+% We recall that, when a cell is empty, no (normal) node is created in that
+% cell. That's why we test the existence of the node before using it.
+% \begin{macrocode}
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - #2 }
+ {
+ \seq_if_in:NnF \g_@@_multicolumn_cells_seq { ##1 - #2 }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - #2 } { west }
+ \dim_set:Nn \l_tmpb_dim { \dim_min:nn \l_tmpb_dim \pgf at x }
+ }
+ }
+ }
+% \end{macrocode}
+% If all the cells of the column were empty, |\l_tmpb_dim| has still the same
+% value |\c_max_dim|. In that case, you use for |\l_tmpb_dim| the value of the
+% position of the vertical rule.
+% \begin{macrocode}
+ \dim_compare:nNnT \l_tmpb_dim = \c_max_dim
+ {
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf at x
+ }
+ \dim_set:Nn \l_@@_tmpd_dim { - \c_max_dim }
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \int_use:N \l_@@_last_col_int }
+ {
+ \seq_if_in:NnF \g_@@_multicolumn_cells_seq { ##1 - #2 }
+ {
+ \pgfpointanchor
+ { \@@_env: - ##1 - \int_use:N \l_@@_last_col_int }
+ { east }
+ \dim_set:Nn \l_@@_tmpd_dim { \dim_max:nn \l_@@_tmpd_dim \pgf at x }
+ }
+ }
+ }
+ \dim_compare:nNnT \l_@@_tmpd_dim = { - \c_max_dim }
+ {
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_last_col_int + 1 } }
+ \dim_set_eq:NN \l_@@_tmpd_dim \pgf at x
+ }
+ \@@_pgf_rect_node:nnnnn
+ { \@@_env: - #1 - #2 - block - short }
+ \l_tmpb_dim \l_tmpa_dim \l_@@_tmpd_dim \l_@@_tmpc_dim
+ }
+% \end{macrocode}
+%
+% \medskip
+% If the creation of the ``medium nodes'' is required, we create a ``medium
+% node'' for the block. The function |\@@_pgf_rect_node:nnn| takes in as
+% arguments the name of the node and two \textsc{pgf} points.
+% \begin{macrocode}
+ \bool_if:NT \l_@@_medium_nodes_bool
+ {
+ \@@_pgf_rect_node:nnn
+ { \@@_env: - #1 - #2 - block - medium }
+ { \pgfpointanchor { \@@_env: - #1 - #2 - medium } { north~west } }
+ {
+ \pgfpointanchor
+ { \@@_env:
+ - \int_use:N \l_@@_last_row_int
+ - \int_use:N \l_@@_last_col_int - medium
+ }
+ { south~east }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% Now, we will put the label of the block.
+% \begin{macrocode}
+ \bool_lazy_any:nTF
+ {
+ { \str_if_eq_p:Vn \l_@@_vpos_of_block_str { c } }
+ { \str_if_eq_p:Vn \l_@@_vpos_of_block_str { T } }
+ { \str_if_eq_p:Vn \l_@@_vpos_of_block_str { B } }
+ }
+% \end{macrocode}
+% \medskip
+% \begin{macrocode}
+ {
+% \end{macrocode}
+% If we are in the first column, we must put the block as if it was with the key~|r|.
+% \begin{macrocode}
+ \int_compare:nNnT { #2 } = 0
+ { \str_set:Nn \l_@@_hpos_block_str r }
+ \bool_if:nT \g_@@_last_col_found_bool
+ {
+ \int_compare:nNnT { #2 } = \g_@@_col_total_int
+ { \str_set:Nn \l_@@_hpos_block_str l }
+ }
+% \end{macrocode}
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \str_case:Vn \l_@@_vpos_of_block_str
+ {
+ c {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { center }
+ l { west }
+ r { east }
+ }
+
+ }
+ T {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { north }
+ l { north~west }
+ r { north~east }
+ }
+
+ }
+ B {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { south}
+ l { south~west }
+ r { south~east }
+ }
+
+ }
+ }
+ }
+% \end{macrocode}
+% \begin{macrocode}
+ \pgftransformshift
+ {
+ \pgfpointanchor
+ {
+ \@@_env: - #1 - #2 - block
+ \bool_if:NF \l_@@_hpos_of_block_cap_bool { - short }
+ }
+ { \l_tmpa_tl }
+ }
+ \pgfset
+ {
+ inner~xsep = \c_zero_dim ,
+ inner~ysep = \l_@@_block_ysep_dim
+ }
+ \pgfnode
+ { rectangle }
+ { \l_tmpa_tl }
+ { \box_use_drop:N \l_@@_cell_box } { } { }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ {
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \pgfextracty \l_tmpa_dim
+ {
+ \@@_qpoint:n
+ {
+ row - \str_if_eq:VnTF \l_@@_vpos_of_block_str { b } { #3 } { #1 }
+ - base
+ }
+ }
+ \dim_sub:Nn \l_tmpa_dim { 0.5 \arrayrulewidth } % added 2023-02-21
+% \end{macrocode}
+% We retrieve (in |\pgf at x|) the $x$-value of the center of the block.
+% \begin{macrocode}
+ \pgfpointanchor
+ {
+ \@@_env: - #1 - #2 - block
+ \bool_if:NF \l_@@_hpos_of_block_cap_bool { - short }
+ }
+ {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { center }
+ l { west }
+ r { east }
+ }
+ }
+% \end{macrocode}
+% We put the label of the block which has been composed in |\l_@@_cell_box|.
+% \begin{macrocode}
+ \pgftransformshift { \pgfpoint \pgf at x \l_tmpa_dim }
+ \pgfset { inner~sep = \c_zero_dim }
+ \pgfnode
+ { rectangle }
+ {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { base }
+ l { base~west }
+ r { base~east }
+ }
+ }
+ { \box_use_drop:N \l_@@_cell_box } { } { }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \endpgfpicture
+ \group_end:
+ }
+% \end{macrocode}
+%
+%
+% % \bigskip
+% The first argument of |\@@_stroke_block:nnn| is a list of options for the
+% rectangle that you will stroke. The second argument is the upper-left cell of
+% the block (with, as usual, the syntax $i$|-|$j$) and the third is the last
+% cell of the block (with the same syntax).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_stroke_block:nnn #1 #2 #3
+ {
+ \group_begin:
+ \tl_clear:N \l_@@_draw_tl
+ \dim_set_eq:NN \l_@@_line_width_dim \arrayrulewidth
+ \keys_set_known:nn { NiceMatrix / BlockStroke } { #1 }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \tl_if_empty:NF \l_@@_draw_tl
+ {
+% \end{macrocode}
+% If the user has used the key |color| of the command |\Block| without value,
+% the color fixed by |\arrayrulecolor| is used.
+% \begin{macrocode}
+ \str_if_eq:VnTF \l_@@_draw_tl { default }
+ { \CT at arc@ }
+ { \@@_color:V \l_@@_draw_tl }
+ }
+ \pgfsetcornersarced
+ {
+ \pgfpoint
+ { \dim_use:N \l_@@_rounded_corners_dim }
+ { \dim_use:N \l_@@_rounded_corners_dim }
+ }
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \bool_lazy_and:nnT
+ { \int_compare_p:n { \l_tmpa_tl <= \c at iRow } }
+ { \int_compare_p:n { \l_tmpb_tl <= \c at jCol } }
+ {
+ \@@_qpoint:n { row - \l_tmpa_tl }
+ \dim_set:Nn \l_tmpb_dim { \pgf at y }
+ \@@_qpoint:n { col - \l_tmpb_tl }
+ \dim_set:Nn \l_@@_tmpc_dim { \pgf at x }
+ \@@_cut_on_hyphen:w #3 \q_stop
+ \int_compare:nNnT \l_tmpa_tl > \c at iRow
+ { \tl_set:Nx \l_tmpa_tl { \int_use:N \c at iRow } }
+ \int_compare:nNnT \l_tmpb_tl > \c at jCol
+ { \tl_set:Nx \l_tmpb_tl { \int_use:N \c at jCol } }
+ \@@_qpoint:n { row - \int_eval:n { \l_tmpa_tl + 1 } }
+ \dim_set:Nn \l_tmpa_dim { \pgf at y }
+ \@@_qpoint:n { col - \int_eval:n { \l_tmpb_tl + 1 } }
+ \dim_set:Nn \l_@@_tmpd_dim { \pgf at x }
+ \pgfpathrectanglecorners
+ { \pgfpoint \l_@@_tmpc_dim \l_tmpb_dim }
+ { \pgfpoint \l_@@_tmpd_dim \l_tmpa_dim }
+ \pgfsetlinewidth { 1.1 \l_@@_line_width_dim }
+ \dim_compare:nNnTF \l_@@_rounded_corners_dim = \c_zero_dim
+ { \pgfusepathqstroke }
+ { \pgfusepath { stroke } }
+ }
+ \endpgfpicture
+ \group_end:
+ }
+% \end{macrocode}
+%
+% Here is the set of keys for the command |\@@_stroke_block:nnn|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / BlockStroke }
+ {
+ color .tl_set:N = \l_@@_draw_tl ,
+ draw .tl_set:N = \l_@@_draw_tl ,
+ draw .default:n = default ,
+ line-width .dim_set:N = \l_@@_line_width_dim ,
+ rounded-corners .dim_set:N = \l_@@_rounded_corners_dim ,
+ rounded-corners .default:n = 4 pt
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% The first argument of |\@@_vlines_block:nnn| is a list of options for the
+% rules that we will draw. The second argument is the upper-left cell of the
+% block (with, as usual, the syntax $i$|-|$j$) and the third is the last cell of
+% the block (with the same syntax).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_vlines_block:nnn #1 #2 #3
+ {
+ \dim_set_eq:NN \l_@@_line_width_dim \arrayrulewidth
+ \keys_set_known:nn { NiceMatrix / BlockBorders } { #1 }
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \tl_set_eq:NN \l_@@_tmpc_tl \l_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmpd_tl \l_tmpb_tl
+ \@@_cut_on_hyphen:w #3 \q_stop
+ \tl_set:Nx \l_tmpa_tl { \int_eval:n { \l_tmpa_tl + 1 } }
+ \tl_set:Nx \l_tmpb_tl { \int_eval:n { \l_tmpb_tl + 1 } }
+ \int_step_inline:nnn \l_@@_tmpd_tl \l_tmpb_tl
+ {
+ \use:x
+ {
+ \@@_vline:n
+ {
+ position = ##1 ,
+ start = \l_@@_tmpc_tl ,
+ end = \int_eval:n { \l_tmpa_tl - 1 } ,
+ total-width = \dim_use:N \l_@@_line_width_dim % added 2022-08-06
+ }
+ }
+ }
+ }
+\cs_new_protected:Npn \@@_hlines_block:nnn #1 #2 #3
+ {
+ \dim_set_eq:NN \l_@@_line_width_dim \arrayrulewidth
+ \keys_set_known:nn { NiceMatrix / BlockBorders } { #1 }
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \tl_set_eq:NN \l_@@_tmpc_tl \l_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmpd_tl \l_tmpb_tl
+ \@@_cut_on_hyphen:w #3 \q_stop
+ \tl_set:Nx \l_tmpa_tl { \int_eval:n { \l_tmpa_tl + 1 } }
+ \tl_set:Nx \l_tmpb_tl { \int_eval:n { \l_tmpb_tl + 1 } }
+ \int_step_inline:nnn \l_@@_tmpc_tl \l_tmpa_tl
+ {
+ \use:x
+ {
+ \@@_hline:n
+ {
+ position = ##1 ,
+ start = \l_@@_tmpd_tl ,
+ end = \int_eval:n { \l_tmpb_tl - 1 } ,
+ total-width = \dim_use:N \l_@@_line_width_dim % added 2022-08-06
+ }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The first argument of |\@@_stroke_borders_block:nnn| is a list of options for
+% the borders that you will stroke. The second argument is the upper-left cell
+% of the block (with, as usual, the syntax $i$|-|$j$) and the third is the last
+% cell of the block (with the same syntax).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_stroke_borders_block:nnn #1 #2 #3
+ {
+ \dim_set_eq:NN \l_@@_line_width_dim \arrayrulewidth
+ \keys_set_known:nn { NiceMatrix / BlockBorders } { #1 }
+ \dim_compare:nNnTF \l_@@_rounded_corners_dim > \c_zero_dim
+ { \@@_error:n { borders~forbidden } }
+ {
+ \tl_clear_new:N \l_@@_borders_tikz_tl
+ \keys_set:nV
+ { NiceMatrix / OnlyForTikzInBorders }
+ \l_@@_borders_clist
+ \@@_cut_on_hyphen:w #2 \q_stop
+ \tl_set_eq:NN \l_@@_tmpc_tl \l_tmpa_tl
+ \tl_set_eq:NN \l_@@_tmpd_tl \l_tmpb_tl
+ \@@_cut_on_hyphen:w #3 \q_stop
+ \tl_set:Nx \l_tmpa_tl { \int_eval:n { \l_tmpa_tl + 1 } }
+ \tl_set:Nx \l_tmpb_tl { \int_eval:n { \l_tmpb_tl + 1 } }
+ \@@_stroke_borders_block_i:
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \cs_new_protected:Npx \@@_stroke_borders_block_i:
+ {
+ \c_@@_pgfortikzpicture_tl
+ \@@_stroke_borders_block_ii:
+ \c_@@_endpgfortikzpicture_tl
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_stroke_borders_block_ii:
+ {
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \CT at arc@
+ \pgfsetlinewidth { 1.1 \l_@@_line_width_dim }
+ \clist_if_in:NnT \l_@@_borders_clist { right }
+ { \@@_stroke_vertical:n \l_tmpb_tl }
+ \clist_if_in:NnT \l_@@_borders_clist { left }
+ { \@@_stroke_vertical:n \l_@@_tmpd_tl }
+ \clist_if_in:NnT \l_@@_borders_clist { bottom }
+ { \@@_stroke_horizontal:n \l_tmpa_tl }
+ \clist_if_in:NnT \l_@@_borders_clist { top }
+ { \@@_stroke_horizontal:n \l_@@_tmpc_tl }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / OnlyForTikzInBorders }
+ {
+ tikz .code:n =
+ \cs_if_exist:NTF \tikzpicture
+ { \tl_set:Nn \l_@@_borders_tikz_tl { #1 } }
+ { \@@_error:n { tikz~in~borders~without~tikz } } ,
+ tikz .value_required:n = true ,
+ top .code:n = ,
+ bottom .code:n = ,
+ left .code:n = ,
+ right .code:n = ,
+ unknown .code:n = \@@_error:n { bad~border }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The following command is used to stroke the left border and the right border.
+% The argument |#1| is the number of column (in the sense of the |col| node).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_stroke_vertical:n #1
+ {
+ \@@_qpoint:n \l_@@_tmpc_tl
+ \dim_set:Nn \l_tmpb_dim { \pgf at y + 0.5 \l_@@_line_width_dim }
+ \@@_qpoint:n \l_tmpa_tl
+ \dim_set:Nn \l_@@_tmpc_dim { \pgf at y + 0.5 \l_@@_line_width_dim }
+ \@@_qpoint:n { #1 }
+ \tl_if_empty:NTF \l_@@_borders_tikz_tl
+ {
+ \pgfpathmoveto { \pgfpoint \pgf at x \l_tmpb_dim }
+ \pgfpathlineto { \pgfpoint \pgf at x \l_@@_tmpc_dim }
+ \pgfusepathqstroke
+ }
+ {
+ \use:x { \exp_not:N \draw [ \l_@@_borders_tikz_tl ] }
+ ( \pgf at x , \l_tmpb_dim ) -- ( \pgf at x , \l_@@_tmpc_dim ) ;
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following command is used to stroke the top border and the bottom border.
+% The argument |#1| is the number of row (in the sense of the |row| node).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_stroke_horizontal:n #1
+ {
+ \@@_qpoint:n \l_@@_tmpd_tl
+ \clist_if_in:NnTF \l_@@_borders_clist { left }
+ { \dim_set:Nn \l_tmpa_dim { \pgf at x - 0.5 \l_@@_line_width_dim } }
+ { \dim_set:Nn \l_tmpa_dim { \pgf at x + 0.5 \l_@@_line_width_dim } }
+ \@@_qpoint:n \l_tmpb_tl
+ \dim_set:Nn \l_tmpb_dim { \pgf at x + 0.5 \l_@@_line_width_dim }
+ \@@_qpoint:n { #1 }
+ \tl_if_empty:NTF \l_@@_borders_tikz_tl
+ {
+ \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
+ \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
+ \pgfusepathqstroke
+ }
+ {
+ \use:x { \exp_not:N \draw [ \l_@@_borders_tikz_tl ] }
+ ( \l_tmpa_dim , \pgf at y ) -- ( \l_tmpb_dim , \pgf at y ) ;
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% Here is the set of keys for the command |\@@_stroke_borders_block:nnn|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / BlockBorders }
+ {
+ borders .clist_set:N = \l_@@_borders_clist ,
+ rounded-corners .dim_set:N = \l_@@_rounded_corners_dim ,
+ rounded-corners .default:n = 4 pt ,
+ line-width .dim_set:N = \l_@@_line_width_dim ,
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following command will be used if the key |tikz| has been used for the
+% command |\Block|. The arguments |#1| and |#2| are the coordinates of the first
+% cell and |#3| and |#4| the coordinates of the last cell of the block. |#5| is
+% a comma-separated list of the Tikz keys used with the path.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_block_tikz:nnnnn #1 #2 #3 #4 #5
+ {
+ \begin { tikzpicture }
+ \clist_map_inline:nn { #5 }
+ {
+ \path [ ##1 ]
+ ( #1 -| #2 )
+ rectangle
+ ( \int_eval:n { #3 + 1 } -| \int_eval:n { #4 + 1 } ) ;
+ }
+ \end { tikzpicture }
+ }
+% \end{macrocode}
+%
+%
+% \section{How to draw the dotted lines transparently}
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_renew_matrix:
+ {
+ \RenewDocumentEnvironment { pmatrix } { }
+ { \pNiceMatrix }
+ { \endpNiceMatrix }
+ \RenewDocumentEnvironment { vmatrix } { }
+ { \vNiceMatrix }
+ { \endvNiceMatrix }
+ \RenewDocumentEnvironment { Vmatrix } { }
+ { \VNiceMatrix }
+ { \endVNiceMatrix }
+ \RenewDocumentEnvironment { bmatrix } { }
+ { \bNiceMatrix }
+ { \endbNiceMatrix }
+ \RenewDocumentEnvironment { Bmatrix } { }
+ { \BNiceMatrix }
+ { \endBNiceMatrix }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{Automatic arrays}
+%
+%
+%
+% We will extract the potential keys |columns-type|, |l|, |c|, |r| and pass
+% the other keys to the environment |{NiceArrayWithDelims}|.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Auto }
+ {
+ columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } ,
+ columns-type .value_required:n = true ,
+ l .meta:n = { columns-type = l } ,
+ r .meta:n = { columns-type = r } ,
+ c .meta:n = { columns-type = c } ,
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
+ delimiters / max-width .default:n = true ,
+ delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
+ delimiters .value_required:n = true ,
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewDocumentCommand \AutoNiceMatrixWithDelims
+ { m m O { } > { \SplitArgument { 1 } { - } } m O { } m ! O { } }
+ { \@@_auto_nice_matrix:nnnnnn { #1 } { #2 } #4 { #6 } { #3 , #5 , #7 } }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_auto_nice_matrix:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+% \end{macrocode}
+% The group is for the protection of the keys.
+% \begin{macrocode}
+ \group_begin:
+ \bool_set_true:N \l_@@_Matrix_bool
+ \keys_set_known:nnN { NiceMatrix / Auto } { #6 } \l_tmpa_tl
+% \end{macrocode}
+% We nullify the command |\@@_transform_preamble:| because we will provide a
+% preamble which is yet transformed (by using |\l_@@_columns_type_tl| which is
+% yet nicematrix-ready).
+%
+% \begin{macrocode}
+ \cs_set_eq:NN \@@_transform_preamble: \prg_do_nothing:
+ \use:x
+ {
+ \exp_not:N \begin { NiceArrayWithDelims } { #1 } { #2 }
+ { * { #4 } { \exp_not:V \l_@@_columns_type_tl } }
+ [ \exp_not:V \l_tmpa_tl ]
+ }
+ \int_compare:nNnT \l_@@_first_row_int = 0
+ {
+ \int_compare:nNnT \l_@@_first_col_int = 0 { & }
+ \prg_replicate:nn { #4 - 1 } { & }
+ \int_compare:nNnT \l_@@_last_col_int > { -1 } { & } \\
+ }
+ \prg_replicate:nn { #3 }
+ {
+ \int_compare:nNnT \l_@@_first_col_int = 0 { & }
+% \end{macrocode}
+% We put |{ }| before |#6| to avoid a hasty expansion of a potential
+% |\arabic{iRow}| at the beginning of the row which would result in an incorrect
+% value of that |iRow| (since |iRow| is incremented in the first cell of the row
+% of the |\halign|).
+% \begin{macrocode}
+ \prg_replicate:nn { #4 - 1 } { { } #5 & } #5
+ \int_compare:nNnT \l_@@_last_col_int > { -1 } { & } \\
+ }
+ \int_compare:nNnT \l_@@_last_row_int > { -2 }
+ {
+ \int_compare:nNnT \l_@@_first_col_int = 0 { & }
+ \prg_replicate:nn { #4 - 1 } { & }
+ \int_compare:nNnT \l_@@_last_col_int > { -1 } { & } \\
+ }
+ \end { NiceArrayWithDelims }
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_protected:Npn \@@_define_com:nnn #1 #2 #3
+ {
+ \cs_set_protected:cpn { #1 AutoNiceMatrix }
+ {
+ \bool_gset_false:N \g_@@_NiceArray_bool
+ \str_gset:Nx \g_@@_name_env_str { #1 AutoNiceMatrix }
+ \AutoNiceMatrixWithDelims { #2 } { #3 }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_define_com:nnn p ( )
+\@@_define_com:nnn b [ ]
+\@@_define_com:nnn v | |
+\@@_define_com:nnn V \| \|
+\@@_define_com:nnn B \{ \}
+% \end{macrocode}
+%
+% \bigskip
+% We define also a command |\AutoNiceMatrix| similar to the environment |{NiceMatrix}|.
+% \begin{macrocode}
+\NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } }
+ {
+ \group_begin:
+ \bool_gset_true:N \g_@@_NiceArray_bool
+ \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ]
+ \group_end:
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{The redefinition of the command \textbackslash dotfill }
+%
+% \begin{macrocode}
+\cs_set_eq:NN \@@_old_dotfill \dotfill
+\cs_new_protected:Npn \@@_dotfill:
+ {
+% \end{macrocode}
+% First, we insert |\@@_dotfill| (which is the saved version of |\dotfill|) in
+% case of use of |\dotfill| ``internally'' in the cell (e.g. |\hbox to 1cm {\dotfill}|).
+% \begin{macrocode}
+ \@@_old_dotfill
+ \tl_gput_right:Nn \g_@@_cell_after_hook_tl \@@_dotfill_i:
+ }
+% \end{macrocode}
+% Now, if the box if not empty (unfornately, we can't actually test whether the
+% box is empty and that's why we only consider it's width), we insert
+% |\@@_dotfill| (which is the saved version of |\dotfill|) in the cell of the
+% array, and it will extend, since it is no longer in |\l_@@_cell_box|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_dotfill_i:
+ { \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } = \c_zero_dim \@@_old_dotfill }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The command \textbackslash diagbox}
+%
+% The command |\diagbox| will be linked to |\diagbox:nn| in the environments of
+% \pkg{nicematrix}. However, there are also redefinitions of |\diagbox| in other
+% circonstancies.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_diagbox:nn #1 #2
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \@@_actually_diagbox:nnnnnn
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { \exp_not:n { #1 } }
+ { \exp_not:n { #2 } }
+ }
+% \end{macrocode}
+% We put the cell with |\diagbox| in the sequence |\g_@@_pos_of_blocks_seq|
+% because a cell with |\diagbox| must be considered as non empty by the key
+% |corners|.
+% \begin{macrocode}
+ \seq_gput_right:Nx \g_@@_pos_of_blocks_seq
+ {
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+ { \int_use:N \c at iRow }
+ { \int_use:N \c at jCol }
+% \end{macrocode}
+% The last argument is for the name of the block.
+% \begin{macrocode}
+ { }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\diagbox| is also redefined locally when we draw a block.
+%
+% \medskip
+% The first four arguments of |\@@_actually_diagbox:nnnnnn| correspond to the
+% rectangle (=block) to slash (we recall that it's possible to use |\diagbox| in
+% a |\Block|). The other two are the elements to draw below and above the
+% diagonal line.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_actually_diagbox:nnnnnn #1 #2 #3 #4 #5 #6
+ {
+ \pgfpicture
+ \pgf at relevantforpicturesizefalse
+ \pgfrememberpicturepositiononpagetrue
+ \@@_qpoint:n { row - #1 }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at y
+ \@@_qpoint:n { col - #2 }
+ \dim_set_eq:NN \l_tmpb_dim \pgf at x
+ \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim }
+ \@@_qpoint:n { row - \int_eval:n { #3 + 1 } }
+ \dim_set_eq:NN \l_@@_tmpc_dim \pgf at y
+ \@@_qpoint:n { col - \int_eval:n { #4 + 1 } }
+ \dim_set_eq:NN \l_@@_tmpd_dim \pgf at x
+ \pgfpathlineto { \pgfpoint \l_@@_tmpd_dim \l_@@_tmpc_dim }
+ {
+% \end{macrocode}
+% The command |\CT at arc@| is a command of \pkg{colortbl} which sets the color of
+% the rules in the array. The package \pkg{nicematrix} uses it even if \pkg{colortbl} is not
+% loaded.
+% \begin{macrocode}
+ \CT at arc@
+ \pgfsetroundcap
+ \pgfusepathqstroke
+ }
+ \pgfset { inner~sep = 1 pt }
+ \pgfscope
+ \pgftransformshift { \pgfpoint \l_tmpb_dim \l_@@_tmpc_dim }
+ \pgfnode { rectangle } { south~west }
+ {
+ \begin { minipage } { 20 cm }
+ \@@_math_toggle_token: #5 \@@_math_toggle_token:
+ \end { minipage }
+ }
+ { }
+ { }
+ \endpgfscope
+ \pgftransformshift { \pgfpoint \l_@@_tmpd_dim \l_tmpa_dim }
+ \pgfnode { rectangle } { north~east }
+ {
+ \begin { minipage } { 20 cm }
+ \raggedleft
+ \@@_math_toggle_token: #6 \@@_math_toggle_token:
+ \end { minipage }
+ }
+ { }
+ { }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+%
+%
+%
+% \bigskip
+% \section{The keyword \textbackslash CodeAfter}
+%
+%
+% The |\CodeAfter| (inserted with the key |code-after| or after the keyword
+% |\CodeAfter|) may always begin with a list of pairs \textsl{key=value} between
+% square brackets. Here is the corresponding set of keys.
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix }
+ {
+ CodeAfter / rules .inherit:n = NiceMatrix / rules ,
+ CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix
+ }
+\keys_define:nn { NiceMatrix / CodeAfter }
+ {
+ sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
+ sub-matrix .value_required:n = true ,
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } ,
+ rules .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter }
+ }
+% \end{macrocode}
+%
+% \medskip
+% In fact, in this subsection, we define the user command |\CodeAfter| for the
+% case of the ``normal syntax''. For the case of ``light-syntax'', see the
+% definition of the environment |{@@-light-syntax}| on
+% p.~\pageref{code-light-syntax}.
+%
+%
+% \medskip
+% In the environments of \pkg{nicematrix}, |\CodeAfter| will be linked to
+% |\@@_CodeAfter:|. That macro must \emph{not} be protected since it begins with
+% |\omit|.
+% \begin{macrocode}
+\cs_new:Npn \@@_CodeAfter: { \omit \@@_CodeAfter_ii:n }
+% \end{macrocode}
+%
+% \medskip
+% However, in each cell of the environment, the command |\CodeAfter| will be
+% linked to the following command |\@@_CodeAfter_ii:n| which begins
+% with |\\|.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_CodeAfter_i: { \\ \omit \@@_CodeAfter_ii:n }
+% \end{macrocode}
+%
+% \smallskip
+% We have to catch everything until the end of the current environment (of
+% \pkg{nicematrix}). First, we go until the next command |\end|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_CodeAfter_ii:n #1 \end
+ {
+ \tl_gput_right:Nn \g_nicematrix_code_after_tl { #1 }
+ \@@_CodeAfter_iv:n
+ }
+% \end{macrocode}
+%
+% We catch the argument of the command |\end| (in |#1|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_CodeAfter_iv:n #1
+ {
+% \end{macrocode}
+% If this is really the end of the current environment (of \pkg{nicematrix}), we
+% put back the command |\end| and its argument in the TeX flow.
+% \begin{macrocode}
+ \str_if_eq:eeTF \@currenvir { #1 }
+ { \end { #1 } }
+% \end{macrocode}
+% If this is not the |\end| we are looking for, we put those tokens in
+% |\g_nicematrix_code_after_tl| and we go on searching for the next command
+% |\end| with a recursive call to the command |\@@_CodeAfter:n|.
+% \begin{macrocode}
+ {
+ \tl_gput_right:Nn \g_nicematrix_code_after_tl { \end { #1 } }
+ \@@_CodeAfter_ii:n
+ }
+ }
+% \end{macrocode}
+%
+%
+%
+% \section{The delimiters in the preamble}
+%
+% The command |\@@_delimiter:nnn| will be used to draw delimiters inside the
+% matrix when delimiters are specified in the preamble of the array. It does
+% \emph{not} concern the exterior delimiters added by |{NiceArrayWithDelims}|
+% (and |{pNiceArray}|, |{pNiceMatrix}|, etc.).
+%
+% A delimiter in the preamble of the array will write an instruction
+% |\@@_delimiter:nnn| in the |\g_@@_pre_code_after_tl| (and also
+% potentially add instructions in the preamble provided to |\array| in order to
+% add space between columns).
+%
+% \smallskip
+% The first argument is the type of delimiter (|(|, |[|, |\{|, |)|, |]| or
+% |\}|). The second argument is the number of colummn. The third argument is a
+% boolean equal to |\c_true_bool| (resp. |\c_false_true|) when the delimiter
+% must be put on the left (resp. right) side.
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_delimiter:nnn #1 #2 #3
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+% \end{macrocode}
+%
+% \medskip
+% |\l_@@_y_initial_dim| and |\l_@@_y_final_dim| will be the $y$-values of the
+% extremities of the delimiter we will have to construct.
+% \begin{macrocode}
+ \@@_qpoint:n { row - 1 }
+ \dim_set_eq:NN \l_@@_y_initial_dim \pgf at y
+ \@@_qpoint:n { row - \int_eval:n { \c at iRow + 1 } }
+ \dim_set_eq:NN \l_@@_y_final_dim \pgf at y
+% \end{macrocode}
+%
+% \medskip
+% We will compute in |\l_tmpa_dim| the $x$-value where we will have to put our
+% delimiter (on the left side or on the right side).
+% \begin{macrocode}
+ \bool_if:nTF { #3 }
+ { \dim_set_eq:NN \l_tmpa_dim \c_max_dim }
+ { \dim_set:Nn \l_tmpa_dim { - \c_max_dim } }
+ \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - #2 }
+ {
+ \pgfpointanchor
+ { \@@_env: - ##1 - #2 }
+ { \bool_if:nTF { #3 } { west } { east } }
+ \dim_set:Nn \l_tmpa_dim
+ { \bool_if:nTF { #3 } \dim_min:nn \dim_max:nn \l_tmpa_dim \pgf at x }
+ }
+ }
+% \end{macrocode}
+%
+%
+% Now we can put the delimiter with a node of \textsc{pgf}.
+% \begin{macrocode}
+ \pgfset { inner~sep = \c_zero_dim }
+ \dim_zero:N \nulldelimiterspace
+ \pgftransformshift
+ {
+ \pgfpoint
+ { \l_tmpa_dim }
+ { ( \l_@@_y_initial_dim + \l_@@_y_final_dim + \arrayrulewidth ) / 2 }
+ }
+ \pgfnode
+ { rectangle }
+ { \bool_if:nTF { #3 } { east } { west } }
+ {
+% \end{macrocode}
+% Here is the content of the \textsc{pgf} node, that is to say the delimiter,
+% constructed with its right size.
+% \begin{macrocode}
+ \nullfont
+ \c_math_toggle_token
+ \@@_color:V \l_@@_delimiters_color_tl
+ \bool_if:nTF { #3 } { \left #1 } { \left . }
+ \vcenter
+ {
+ \nullfont
+ \hrule \@height
+ \dim_eval:n { \l_@@_y_initial_dim - \l_@@_y_final_dim }
+ \@depth \c_zero_dim
+ \@width \c_zero_dim
+ }
+ \bool_if:nTF { #3 } { \right . } { \right #1 }
+ \c_math_toggle_token
+ }
+ { }
+ { }
+ \endpgfpicture
+ }
+% \end{macrocode}
+%
+% \section{The command \textbackslash SubMatrix}
+%
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / sub-matrix }
+ {
+ extra-height .dim_set:N = \l_@@_submatrix_extra_height_dim ,
+ extra-height .value_required:n = true ,
+ left-xshift .dim_set:N = \l_@@_submatrix_left_xshift_dim ,
+ left-xshift .value_required:n = true ,
+ right-xshift .dim_set:N = \l_@@_submatrix_right_xshift_dim ,
+ right-xshift .value_required:n = true ,
+ xshift .meta:n = { left-xshift = #1, right-xshift = #1 } ,
+ xshift .value_required:n = true ,
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ slim .bool_set:N = \l_@@_submatrix_slim_bool ,
+ slim .default:n = true ,
+ hlines .clist_set:N = \l_@@_submatrix_hlines_clist ,
+ hlines .default:n = all ,
+ vlines .clist_set:N = \l_@@_submatrix_vlines_clist ,
+ vlines .default:n = all ,
+ hvlines .meta:n = { hlines, vlines } ,
+ hvlines .value_forbidden:n = true ,
+ }
+\keys_define:nn { NiceMatrix }
+ {
+ SubMatrix .inherit:n = NiceMatrix / sub-matrix ,
+ CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ NiceMatrix / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ NiceArray / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ pNiceArray / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following keys set is for the command |\SubMatrix| itself (not the tuning
+% of |\SubMatrix| that can be done elsewhere).
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / SubMatrix }
+ {
+ delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
+ delimiters / color .value_required:n = true ,
+ hlines .clist_set:N = \l_@@_submatrix_hlines_clist ,
+ hlines .default:n = all ,
+ vlines .clist_set:N = \l_@@_submatrix_vlines_clist ,
+ vlines .default:n = all ,
+ hvlines .meta:n = { hlines, vlines } ,
+ hvlines .value_forbidden:n = true ,
+ name .code:n =
+ \tl_if_empty:nTF { #1 }
+ { \@@_error:n { Invalid~name } }
+ {
+ \regex_match:nnTF { \A[A-Za-z][A-Za-z0-9]*\Z } { #1 }
+ {
+ \seq_if_in:NnTF \g_@@_submatrix_names_seq { #1 }
+ { \@@_error:nn { Duplicate~name~for~SubMatrix } { #1 } }
+ {
+ \str_set:Nn \l_@@_submatrix_name_str { #1 }
+ \seq_gput_right:Nn \g_@@_submatrix_names_seq { #1 }
+ }
+ }
+ { \@@_error:n { Invalid~name } }
+ } ,
+ name .value_required:n = true ,
+ rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } ,
+ rules .value_required:n = true ,
+ code .tl_set:N = \l_@@_code_tl ,
+ code .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~SubMatrix }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_SubMatrix_in_code_before { m m m m ! O { } }
+ {
+ \peek_remove_spaces:n
+ {
+ \tl_gput_right:Nx \g_@@_pre_code_after_tl
+ {
+ \SubMatrix { #1 } { #2 } { #3 } { #4 }
+ [
+ delimiters / color = \l_@@_delimiters_color_tl ,
+ hlines = \l_@@_submatrix_hlines_clist ,
+ vlines = \l_@@_submatrix_vlines_clist ,
+ extra-height = \dim_use:N \l_@@_submatrix_extra_height_dim ,
+ left-xshift = \dim_use:N \l_@@_submatrix_left_xshift_dim ,
+ right-xshift = \dim_use:N \l_@@_submatrix_right_xshift_dim ,
+ slim = \bool_to_str:N \l_@@_submatrix_slim_bool ,
+ #5
+ ]
+ }
+ \@@_SubMatrix_in_code_before_i { #2 } { #3 }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewDocumentCommand \@@_SubMatrix_in_code_before_i
+ { > { \SplitArgument { 1 } { - } } m > { \SplitArgument { 1 } { - } } m }
+ { \@@_SubMatrix_in_code_before_i:nnnn #1 #2 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_SubMatrix_in_code_before_i:nnnn #1 #2 #3 #4
+ {
+ \seq_gput_right:Nx \g_@@_submatrix_seq
+ {
+% \end{macrocode}
+% We use |\str_if_eq:nnTF| because it is fully expandable.
+% \begin{macrocode}
+ { \str_if_eq:nnTF { #1 } { last } { \int_use:N \c at iRow } { #1 } }
+ { \str_if_eq:nnTF { #2 } { last } { \int_use:N \c at jCol } { #2 } }
+ { \str_if_eq:nnTF { #3 } { last } { \int_use:N \c at iRow } { #3 } }
+ { \str_if_eq:nnTF { #4 } { last } { \int_use:N \c at jCol } { #4 } }
+ }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% In the pre-code-after and in the |\CodeAfter| the following command
+% |\@@_SubMatrix| will be linked to |\SubMatrix|.
+% \begin{itemize}
+% \item |#1| is the left delimiter;
+% \item |#2| is the upper-left cell of the matrix with the format $i$-$j$;
+% \item |#3| is the lower-right cell of the matrix with the format $i$-$j$;
+% \item |#4| is the right delimiter;
+% \item |#5| is the list of options of the command;
+% \item |#6| is the potential subscript;
+% \item |#7| is the potential superscript.
+% \end{itemize}
+% For explanations about the construction with rescanning of the preamble, see
+% the documentation for the user command |\Cdots|.
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \tl_set:Nn \l_@@_argspec_tl { m m m m O { } E { _ ^ } { { } { } } }
+ \tl_set_rescan:Nno \l_@@_argspec_tl { } \l_@@_argspec_tl
+ \exp_args:NNV \NewDocumentCommand \@@_SubMatrix \l_@@_argspec_tl
+ {
+ \peek_remove_spaces:n
+ {
+ \@@_sub_matrix:nnnnnnn
+ { #1 } { #2 } { #3 } { #4 } { #5 } { #6 } { #7 }
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The following macro will compute |\l_@@_first_i_tl|, |\l_@@_first_j_tl|,
+% |\l_@@_last_i_tl| and |\l_@@_last_j_tl| from the arguments of the command as
+% provided by the user (for example |2-3| and |5-last|).
+% \begin{macrocode}
+\NewDocumentCommand \@@_compute_i_j:nn
+ { > { \SplitArgument { 1 } { - } } m > { \SplitArgument { 1 } { - } } m }
+ { \@@_compute_i_j:nnnn #1 #2 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_compute_i_j:nnnn #1 #2 #3 #4
+ {
+ \tl_set:Nn \l_@@_first_i_tl { #1 }
+ \tl_set:Nn \l_@@_first_j_tl { #2 }
+ \tl_set:Nn \l_@@_last_i_tl { #3 }
+ \tl_set:Nn \l_@@_last_j_tl { #4 }
+ \tl_if_eq:NnT \l_@@_first_i_tl { last }
+ { \tl_set:NV \l_@@_first_i_tl \c at iRow }
+ \tl_if_eq:NnT \l_@@_first_j_tl { last }
+ { \tl_set:NV \l_@@_first_j_tl \c at jCol }
+ \tl_if_eq:NnT \l_@@_last_i_tl { last }
+ { \tl_set:NV \l_@@_last_i_tl \c at iRow }
+ \tl_if_eq:NnT \l_@@_last_j_tl { last }
+ { \tl_set:NV \l_@@_last_j_tl \c at jCol }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_sub_matrix:nnnnnnn #1 #2 #3 #4 #5 #6 #7
+ {
+ \group_begin:
+% \end{macrocode}
+% The four following token lists correspond to the position of the |\SubMatrix|.
+% \begin{macrocode}
+ \@@_compute_i_j:nn { #2 } { #3 }
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn \l_@@_last_i_tl > \g_@@_row_total_int }
+ { \int_compare_p:nNn \l_@@_last_j_tl > \g_@@_col_total_int }
+ { \@@_error:nn { Construct~too~large } { \SubMatrix } }
+ {
+ \str_clear_new:N \l_@@_submatrix_name_str
+ \keys_set:nn { NiceMatrix / SubMatrix } { #5 }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \pgfset { inner~sep = \c_zero_dim }
+ \dim_set_eq:NN \l_@@_x_initial_dim \c_max_dim
+ \dim_set:Nn \l_@@_x_final_dim { - \c_max_dim }
+% \end{macrocode}
+% The last value of |\int_step_inline:nnn| is provided by currifycation.
+% \begin{macrocode}
+ \bool_if:NTF \l_@@_submatrix_slim_bool
+ { \int_step_inline:nnn \l_@@_first_i_tl \l_@@_last_i_tl }
+ { \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int }
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \l_@@_first_j_tl }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - \l_@@_first_j_tl } { west }
+ \dim_set:Nn \l_@@_x_initial_dim
+ { \dim_min:nn \l_@@_x_initial_dim \pgf at x }
+ }
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \l_@@_last_j_tl }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - \l_@@_last_j_tl } { east }
+ \dim_set:Nn \l_@@_x_final_dim
+ { \dim_max:nn \l_@@_x_final_dim \pgf at x }
+ }
+ }
+ \dim_compare:nNnTF \l_@@_x_initial_dim = \c_max_dim
+ { \@@_error:nn { Impossible~delimiter } { left } }
+ {
+ \dim_compare:nNnTF \l_@@_x_final_dim = { - \c_max_dim }
+ { \@@_error:nn { Impossible~delimiter } { right } }
+ { \@@_sub_matrix_i:nnnn { #1 } { #4 } { #6 } { #7 } }
+ }
+ \endpgfpicture
+ }
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% |#1| is the left delimiter, |#2| is the right one, |#3| is the subscript and
+% |#4| is the superscript.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_sub_matrix_i:nnnn #1 #2 #3 #4
+ {
+ \@@_qpoint:n { row - \l_@@_first_i_tl - base }
+ \dim_set:Nn \l_@@_y_initial_dim
+ {
+ \fp_to_dim:n
+ {
+ \pgf at y
+ + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch
+ }
+ } % modified 6.13c
+ \@@_qpoint:n { row - \l_@@_last_i_tl - base }
+ \dim_set:Nn \l_@@_y_final_dim
+ { \fp_to_dim:n { \pgf at y - ( \box_dp:N \strutbox ) * \arraystretch } }
+ % modified 6.13c
+ \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \l_@@_first_i_tl - ##1 }
+ {
+ \pgfpointanchor { \@@_env: - \l_@@_first_i_tl - ##1 } { north }
+ \dim_set:Nn \l_@@_y_initial_dim
+ { \dim_max:nn \l_@@_y_initial_dim \pgf at y }
+ }
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - \l_@@_last_i_tl - ##1 }
+ {
+ \pgfpointanchor { \@@_env: - \l_@@_last_i_tl - ##1 } { south }
+ \dim_set:Nn \l_@@_y_final_dim
+ { \dim_min:nn \l_@@_y_final_dim \pgf at y }
+ }
+ }
+ \dim_set:Nn \l_tmpa_dim
+ {
+ \l_@@_y_initial_dim - \l_@@_y_final_dim +
+ \l_@@_submatrix_extra_height_dim - \arrayrulewidth
+ }
+ \dim_zero:N \nulldelimiterspace
+% \end{macrocode}
+%
+% \bigskip
+% We will draw the rules in the |\SubMatrix|.
+% \begin{macrocode}
+ \group_begin:
+ \pgfsetlinewidth { 1.1 \arrayrulewidth }
+ \@@_set_CT at arc@:V \l_@@_rules_color_tl
+ \CT at arc@
+% \end{macrocode}
+% Now, we draw the potential vertical rules specified in the preamble of the
+% environments with the letter fixed with the key |vlines-in-sub-matrix|. The
+% list of the columns where there is such rule to draw is in |\g_@@_cols_vlism_seq|.
+% \begin{macrocode}
+ \seq_map_inline:Nn \g_@@_cols_vlism_seq
+ {
+ \int_compare:nNnT \l_@@_first_j_tl < { ##1 }
+ {
+ \int_compare:nNnT
+ { ##1 } < { \int_eval:n { \l_@@_last_j_tl + 1 } }
+ {
+% \end{macrocode}
+% First, we extract the value of the abscissa of the rule we have to draw.
+% \begin{macrocode}
+ \@@_qpoint:n { col - ##1 }
+ \pgfpathmoveto { \pgfpoint \pgf at x \l_@@_y_initial_dim }
+ \pgfpathlineto { \pgfpoint \pgf at x \l_@@_y_final_dim }
+ \pgfusepathqstroke
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we draw the vertical rules specified in the key |vlines| of |\SubMatrix|.
+% The last argument of |\int_step_inline:nn| or |\clist_map_inline:Nn| is given
+% by curryfication.
+% \begin{macrocode}
+ \tl_if_eq:NnTF \l_@@_submatrix_vlines_clist { all }
+ { \int_step_inline:nn { \l_@@_last_j_tl - \l_@@_first_j_tl } }
+ { \clist_map_inline:Nn \l_@@_submatrix_vlines_clist }
+ {
+ \bool_lazy_and:nnTF
+ { \int_compare_p:nNn { ##1 } > 0 }
+ {
+ \int_compare_p:nNn
+ { ##1 } < { \l_@@_last_j_tl - \l_@@_first_j_tl + 1 } }
+ {
+ \@@_qpoint:n { col - \int_eval:n { ##1 + \l_@@_first_j_tl } }
+ \pgfpathmoveto { \pgfpoint \pgf at x \l_@@_y_initial_dim }
+ \pgfpathlineto { \pgfpoint \pgf at x \l_@@_y_final_dim }
+ \pgfusepathqstroke
+ }
+ { \@@_error:nnn { Wrong~line~in~SubMatrix } { vertical } { ##1 } }
+ }
+% \end{macrocode}
+%
+% \medskip
+% Now, we draw the horizontal rules specified in the key |hlines| of
+% |\SubMatrix|.
+% The last argument of |\int_step_inline:nn| or |\clist_map_inline:Nn| is given
+% by curryfication.
+% \begin{macrocode}
+ \tl_if_eq:NnTF \l_@@_submatrix_hlines_clist { all }
+ { \int_step_inline:nn { \l_@@_last_i_tl - \l_@@_first_i_tl } }
+ { \clist_map_inline:Nn \l_@@_submatrix_hlines_clist }
+ {
+ \bool_lazy_and:nnTF
+ { \int_compare_p:nNn { ##1 } > 0 }
+ {
+ \int_compare_p:nNn
+ { ##1 } < { \l_@@_last_i_tl - \l_@@_first_i_tl + 1 } }
+ {
+ \@@_qpoint:n { row - \int_eval:n { ##1 + \l_@@_first_i_tl } }
+% \end{macrocode}
+% We use a group to protect |\l_tmpa_dim| and |\l_tmpb_dim|.
+% \begin{macrocode}
+ \group_begin:
+% \end{macrocode}
+% We compute in |\l_tmpa_dim| the $x$-value of the left end of the rule.
+% \begin{macrocode}
+ \dim_set:Nn \l_tmpa_dim
+ { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
+ \str_case:nn { #1 }
+ {
+ ( { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
+ [ { \dim_sub:Nn \l_tmpa_dim { 0.2 mm } }
+ \{ { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } }
+ }
+ \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf at y }
+% \end{macrocode}
+% We compute in |\l_tmpb_dim| the $x$-value of the right end of the rule.
+% \begin{macrocode}
+ \dim_set:Nn \l_tmpb_dim
+ { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim }
+ \str_case:nn { #2 }
+ {
+ ) { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
+ ] { \dim_add:Nn \l_tmpb_dim { 0.2 mm } }
+ \} { \dim_add:Nn \l_tmpb_dim { 0.9 mm } }
+ }
+ \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf at y }
+ \pgfusepathqstroke
+ \group_end:
+ }
+ { \@@_error:nnn { Wrong~line~in~SubMatrix } { horizontal } { ##1 } }
+ }
+% \end{macrocode}
+%
+% \medskip
+% If the key |name| has been used for the command |\SubMatrix|, we create a PGF
+% node with that name for the submatrix (this node does not encompass the
+% delimiters that we will put after).
+% \begin{macrocode}
+ \str_if_empty:NF \l_@@_submatrix_name_str
+ {
+ \@@_pgf_rect_node:nnnnn \l_@@_submatrix_name_str
+ \l_@@_x_initial_dim \l_@@_y_initial_dim
+ \l_@@_x_final_dim \l_@@_y_final_dim
+ }
+ \group_end:
+% \end{macrocode}
+% The group was for |\CT at arc@| (the color of the rules).
+%
+% \medskip
+% Now, we deal with the left delimiter. Of course, the environment
+% |{pgfscope}| is for the |\pgftransformshift|.
+% \begin{macrocode}
+ \begin { pgfscope }
+ \pgftransformshift
+ {
+ \pgfpoint
+ { \l_@@_x_initial_dim - \l_@@_submatrix_left_xshift_dim }
+ { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
+ }
+ \str_if_empty:NTF \l_@@_submatrix_name_str
+ { \@@_node_left:nn #1 { } }
+ { \@@_node_left:nn #1 { \@@_env: - \l_@@_submatrix_name_str - left } }
+ \end { pgfscope }
+% \end{macrocode}
+%
+% \medskip
+% Now, we deal with the right delimiter.
+% \begin{macrocode}
+ \pgftransformshift
+ {
+ \pgfpoint
+ { \l_@@_x_final_dim + \l_@@_submatrix_right_xshift_dim }
+ { ( \l_@@_y_initial_dim + \l_@@_y_final_dim ) / 2 }
+ }
+ \str_if_empty:NTF \l_@@_submatrix_name_str
+ { \@@_node_right:nnnn #2 { } { #3 } { #4 } }
+ {
+ \@@_node_right:nnnn #2
+ { \@@_env: - \l_@@_submatrix_name_str - right } { #3 } { #4 }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \cs_set_eq:NN \pgfpointanchor \@@_pgfpointanchor:n
+ \flag_clear_new:n { nicematrix }
+ \l_@@_code_tl
+ }
+% \end{macrocode}
+%
+% \bigskip
+% In the key |code| of the command |\SubMatrix| there may be Tikz instructions.
+% We want that, in these instructions, the $i$ and $j$ in specifications of
+% nodes of the forms $i$|-|$j$, |row-|$i$, |col-|$j$ and $i$\verb+-|+$j$ refer
+% to the number of row and columm \emph{relative} of the current |\SubMatrix|.
+% That's why we will patch (locally in the |\SubMatrix|) the command
+% |\pgfpointanchor|.
+% \begin{macrocode}
+\cs_set_eq:NN \@@_old_pgfpointanchor \pgfpointanchor
+% \end{macrocode}
+%
+% \bigskip
+% The following command will be linked to |\pgfpointanchor| just before the
+% execution of the option |code| of the command |\SubMatrix|. In this command,
+% we catch the argument |#1| of |\pgfpointanchor| and we apply to it the command
+% |\@@_pgfpointanchor_i:nn| before passing it to the original |\pgfpointanchor|.
+% We have to act in an expandable way because the command |\pgfpointanchor| is
+% used in names of Tikz nodes which are computed in an expandable way.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_pgfpointanchor:n #1
+ {
+ \use:e
+ { \exp_not:N \@@_old_pgfpointanchor { \@@_pgfpointanchor_i:nn #1 } }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% In fact, the argument of |\pgfpointanchor| is always of the form
+% |\a_command { name_of_node }| where ``|name_of_node|'' is the name of the Tikz
+% node without the potential prefix and suffix. That's why we catch two
+% arguments and work only on the second by trying (first) to extract an hyphen |-|.
+% \begin{macrocode}
+\cs_new:Npn \@@_pgfpointanchor_i:nn #1 #2
+ { #1 { \@@_pgfpointanchor_ii:w #2 - \q_stop } }
+% \end{macrocode}
+%
+% \bigskip
+% Since |\seq_if_in:NnTF| and |\clist_if_in:NnTF| are not expandable, we will
+% use the following token list and |\str_case:nVTF| to test whether we have an
+% integer or not.
+% \begin{macrocode}
+\tl_const:Nn \c_@@_integers_alist_tl
+ {
+ { 1 } { } { 2 } { } { 3 } { } { 4 } { } { 5 } { }
+ { 6 } { } { 7 } { } { 8 } { } { 9 } { } { 10 } { }
+ { 11 } { } { 12 } { } { 13 } { } { 14 } { } { 15 } { }
+ { 16 } { } { 17 } { } { 18 } { } { 19 } { } { 20 } { }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\cs_new:Npn \@@_pgfpointanchor_ii:w #1-#2\q_stop
+ {
+% \end{macrocode}
+% If there is no hyphen, that means that the node is of the form of a single
+% number (ex.: |5| or |11|). In that case, we are in an analysis which result
+% from a specification of node of the form $i$\verb+-|+$j$. In that case, the
+% $i$ of the number of row arrives first (and alone) in a |\pgfpointanchor| and,
+% the, the $j$ arrives (alone) in the following |\pgfpointanchor|. In order to
+% know whether we have a number of row or a number of column, we keep track of
+% the number of such treatments by the expandable flag called |nicematrix|.
+% \begin{macrocode}
+ \tl_if_empty:nTF { #2 }
+ {
+ \str_case:nVTF { #1 } \c_@@_integers_alist_tl
+ {
+ \flag_raise:n { nicematrix }
+ \int_if_even:nTF { \flag_height:n { nicematrix } }
+ { \int_eval:n { #1 + \l_@@_first_i_tl - 1 } }
+ { \int_eval:n { #1 + \l_@@_first_j_tl - 1 } }
+ }
+ { #1 }
+ }
+% \end{macrocode}
+% If there is an hyphen, we have to see whether we have a node of the form
+% $i$|-|$j$, |row-|$i$ or |col-|$j$.
+% \begin{macrocode}
+ { \@@_pgfpointanchor_iii:w { #1 } #2 }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% There was an hyphen in the name of the node and that's why we have to retrieve
+% the extra hyphen we have put (cf. |\@@_pgfpointanchor_i:nn|).
+% \begin{macrocode}
+\cs_new:Npn \@@_pgfpointanchor_iii:w #1 #2 -
+ {
+ \str_case:nnF { #1 }
+ {
+ { row } { row - \int_eval:n { #2 + \l_@@_first_i_tl - 1 } }
+ { col } { col - \int_eval:n { #2 + \l_@@_first_j_tl - 1 } }
+ }
+% \end{macrocode}
+% Now the case of a node of the form $i$|-|$j$.
+% \begin{macrocode}
+ {
+ \int_eval:n { #1 + \l_@@_first_i_tl - 1 }
+ - \int_eval:n { #2 + \l_@@_first_j_tl - 1 }
+ }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_node_left:nn| puts the left delimiter with the correct size.
+% The argument |#1| is the delimiter to put. The argument |#2| is the name we
+% will give to this PGF node (if the key |name| has been used in |\SubMatrix|).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_node_left:nn #1 #2
+ {
+ \pgfnode
+ { rectangle }
+ { east }
+ {
+ \nullfont
+ \c_math_toggle_token
+ \@@_color:V \l_@@_delimiters_color_tl
+ \left #1
+ \vcenter
+ {
+ \nullfont
+ \hrule \@height \l_tmpa_dim
+ \@depth \c_zero_dim
+ \@width \c_zero_dim
+ }
+ \right .
+ \c_math_toggle_token
+ }
+ { #2 }
+ { }
+ }
+% \end{macrocode}
+%
+% \medskip
+% The command |\@@_node_right:nn| puts the right delimiter with the correct size.
+% The argument |#1| is the delimiter to put. The argument |#2| is the name we
+% will give to this PGF node (if the key |name| has been used in |\SubMatrix|).
+% The argument |#3| is the subscript and |#4| is the superscript.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_node_right:nnnn #1 #2 #3 #4
+ {
+ \pgfnode
+ { rectangle }
+ { west }
+ {
+ \nullfont
+ \c_math_toggle_token
+ \@@_color:V \l_@@_delimiters_color_tl
+ \left .
+ \vcenter
+ {
+ \nullfont
+ \hrule \@height \l_tmpa_dim
+ \@depth \c_zero_dim
+ \@width \c_zero_dim
+ }
+ \right #1
+ \tl_if_empty:nF { #3 } { _ { \smash { #3 } } }
+ ^ { \smash { #4 } }
+ \c_math_toggle_token
+ }
+ { #2 }
+ { }
+ }
+% \end{macrocode}
+%
+%
+% \bigskip
+% \section{Les commandes \textbackslash UnderBrace et \textbackslash
+% OverBrace}
+%
+% The following commands will be linked to |\UnderBrace| and |\OverBrace| in the
+% |\CodeAfter|.
+%
+% \begin{macrocode}
+\NewDocumentCommand \@@_UnderBrace { O { } m m m O { } }
+ {
+ \peek_remove_spaces:n
+ { \@@_brace:nnnnn { #2 } { #3 } { #4 } { #1 , #5 } { under } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewDocumentCommand \@@_OverBrace { O { } m m m O { } }
+ {
+ \peek_remove_spaces:n
+ { \@@_brace:nnnnn { #2 } { #3 } { #4 } { #1 , #5 } { over } }
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Brace }
+ {
+ left-shorten .bool_set:N = \l_@@_brace_left_shorten_bool ,
+ left-shorten .default:n = true ,
+ right-shorten .bool_set:N = \l_@@_brace_right_shorten_bool ,
+ shorten .meta:n = { left-shorten , right-shorten } ,
+ right-shorten .default:n = true ,
+ yshift .dim_set:N = \l_@@_brace_yshift_dim ,
+ yshift .value_required:n = true ,
+ yshift .initial:n = \c_zero_dim ,
+ color .tl_set:N = \l_tmpa_tl ,
+ color .value_required:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~Brace }
+ }
+% \end{macrocode}
+%
+% \medskip
+% |#1| is the first cell of the rectangle (with the syntax $i$\verb+-|+$j$;
+% |#2| is the last cell of the rectangle;
+% |#3| is the label of the text;
+% |#4| is the optional argument (a list of \textsl{key}-\textsl{value} pairs);
+% |#5| is equal to |under| or |over|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_brace:nnnnn #1 #2 #3 #4 #5
+ {
+ \group_begin:
+% \end{macrocode}
+% The four following token lists correspond to the position of the sub-matrix to
+% which a brace will be attached.
+% \begin{macrocode}
+ \@@_compute_i_j:nn { #1 } { #2 }
+ \bool_lazy_or:nnTF
+ { \int_compare_p:nNn \l_@@_last_i_tl > \g_@@_row_total_int }
+ { \int_compare_p:nNn \l_@@_last_j_tl > \g_@@_col_total_int }
+ {
+ \str_if_eq:nnTF { #5 } { under }
+ { \@@_error:nn { Construct~too~large } { \UnderBrace } }
+ { \@@_error:nn { Construct~too~large } { \OverBrace } }
+ }
+ {
+ \tl_clear:N \l_tmpa_tl
+ \keys_set:nn { NiceMatrix / Brace } { #4 }
+ \tl_if_empty:NF \l_tmpa_tl { \color { \l_tmpa_tl } }
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \bool_if:NT \l_@@_brace_left_shorten_bool
+ {
+ \dim_set_eq:NN \l_@@_x_initial_dim \c_max_dim
+ \int_step_inline:nnn \l_@@_first_i_tl \l_@@_last_i_tl
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \l_@@_first_j_tl }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - \l_@@_first_j_tl } { west }
+ \dim_set:Nn \l_@@_x_initial_dim
+ { \dim_min:nn \l_@@_x_initial_dim \pgf at x }
+ }
+ }
+ }
+ \bool_lazy_or:nnT
+ { \bool_not_p:n \l_@@_brace_left_shorten_bool }
+ { \dim_compare_p:nNn \l_@@_x_initial_dim = \c_max_dim }
+ {
+ \@@_qpoint:n { col - \l_@@_first_j_tl }
+ \dim_set_eq:NN \l_@@_x_initial_dim \pgf at x
+ }
+ \bool_if:NT \l_@@_brace_right_shorten_bool
+ {
+ \dim_set:Nn \l_@@_x_final_dim { - \c_max_dim }
+ \int_step_inline:nnn \l_@@_first_i_tl \l_@@_last_i_tl
+ {
+ \cs_if_exist:cT
+ { pgf @ sh @ ns @ \@@_env: - ##1 - \l_@@_last_j_tl }
+ {
+ \pgfpointanchor { \@@_env: - ##1 - \l_@@_last_j_tl } { east }
+ \dim_set:Nn \l_@@_x_final_dim
+ { \dim_max:nn \l_@@_x_final_dim \pgf at x }
+ }
+ }
+ }
+ \bool_lazy_or:nnT
+ { \bool_not_p:n \l_@@_brace_right_shorten_bool }
+ { \dim_compare_p:nNn \l_@@_x_final_dim = { - \c_max_dim } }
+ {
+ \@@_qpoint:n { col - \int_eval:n { \l_@@_last_j_tl + 1 } }
+ \dim_set_eq:NN \l_@@_x_final_dim \pgf at x
+ }
+ \pgfset { inner~sep = \c_zero_dim }
+ \str_if_eq:nnTF { #5 } { under }
+ { \@@_underbrace_i:n { #3 } }
+ { \@@_overbrace_i:n { #3 } }
+ \endpgfpicture
+ }
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \medskip
+% The argument is the text to put above the brace.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_overbrace_i:n #1
+ {
+ \@@_qpoint:n { row - \l_@@_first_i_tl }
+ \pgftransformshift
+ {
+ \pgfpoint
+ { ( \l_@@_x_initial_dim + \l_@@_x_final_dim) / 2 }
+ { \pgf at y + \l_@@_brace_yshift_dim - 3 pt}
+ }
+ \pgfnode
+ { rectangle }
+ { south }
+ {
+ \vbox_top:n
+ {
+ \group_begin:
+ \everycr { }
+ \halign
+ {
+ \hfil ## \hfil \crcr
+ \@@_math_toggle_token: #1 \@@_math_toggle_token: \cr
+ \noalign { \skip_vertical:n { 3 pt } \nointerlineskip }
+ \c_math_toggle_token
+ \overbrace
+ {
+ \hbox_to_wd:nn
+ { \l_@@_x_final_dim - \l_@@_x_initial_dim }
+ { }
+ }
+ \c_math_toggle_token
+ \cr
+ }
+ \group_end:
+ }
+ }
+ { }
+ { }
+ }
+% \end{macrocode}
+%
+%
+% \medskip
+% The argument is the text to put under the brace.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_underbrace_i:n #1
+ {
+ \@@_qpoint:n { row - \int_eval:n { \l_@@_last_i_tl + 1 } }
+ \pgftransformshift
+ {
+ \pgfpoint
+ { ( \l_@@_x_initial_dim + \l_@@_x_final_dim) / 2 }
+ { \pgf at y - \l_@@_brace_yshift_dim + 3 pt }
+ }
+ \pgfnode
+ { rectangle }
+ { north }
+ {
+ \group_begin:
+ \everycr { }
+ \vbox:n
+ {
+ \halign
+ {
+ \hfil ## \hfil \crcr
+ \c_math_toggle_token
+ \underbrace
+ {
+ \hbox_to_wd:nn
+ { \l_@@_x_final_dim - \l_@@_x_initial_dim }
+ { }
+ }
+ \c_math_toggle_token
+ \cr
+ \noalign { \skip_vertical:n { 3 pt } \nointerlineskip }
+ \@@_math_toggle_token: #1 \@@_math_toggle_token: \cr
+ }
+ }
+ \group_end:
+ }
+ { }
+ { }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{The command \textbackslash ShowCellNames}
+%
+% \begin{macrocode}
+\NewDocumentCommand \@@_ShowCellNames_CodeBefore { }
+ {
+ \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 { 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 }
+ \bool_if:NTF \l_@@_in_code_after_bool
+ \end { pgfpicture }
+ \int_step_inline:nn \c at jCol
+ {
+ \hbox_set:Nn \l_tmpa_box
+ { \normalfont \Large \color { red ! 50 } ##1 - ####1 }
+ \begin { pgfpicture }
+ \@@_qpoint:n { col - ####1 }
+ \dim_gset_eq:NN \g_@@_tmpc_dim \pgf at x
+ \@@_qpoint:n { col - \int_eval:n { ####1 + 1 } }
+ \dim_gset:Nn \g_@@_tmpd_dim { \pgf at x - \g_@@_tmpc_dim }
+ \dim_gset_eq:NN \g_@@_tmpe_dim \pgf at x
+ \endpgfpicture
+ \end { pgfpicture }
+ \fp_set:Nn \l_tmpa_fp
+ {
+ \fp_min:nn
+ {
+ \fp_min:nn
+ { \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 * ( \g_@@_tmpc_dim + \g_@@_tmpe_dim ) }
+ { \dim_use:N \g_tmpa_dim }
+ }
+ \pgfnode
+ { rectangle }
+ { center }
+ { \box_use:N \l_tmpa_box }
+ { }
+ { }
+ \endpgfpicture
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\NewDocumentCommand \@@_ShowCellNames { }
+ {
+ \bool_if:NT \l_@@_in_code_after_bool
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ \pgfpathrectanglecorners
+ { \@@_qpoint:n { 1 } }
+ {
+ \@@_qpoint:n
+ { \int_eval:n { \int_max:nn \c at iRow \c at jCol + 1 } }
+ }
+ \pgfsetfillopacity { 0.75 }
+ \pgfsetfillcolor { white }
+ \pgfusepathqfill
+ \endpgfpicture
+ }
+ \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
+ {
+ \bool_if:NTF \l_@@_in_code_after_bool
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ }
+ { \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 }
+ \bool_if:NTF \l_@@_in_code_after_bool
+ { \endpgfpicture }
+ { \end { pgfpicture } }
+ \int_step_inline:nn \c at jCol
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \normalfont \Large \sffamily \bfseries
+ \bool_if:NTF \l_@@_in_code_after_bool
+ { \color { red } }
+ { \color { red ! 50 } }
+ ##1 - ####1
+ }
+ \bool_if:NTF \l_@@_in_code_after_bool
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgf at relevantforpicturesizefalse
+ }
+ { \begin { pgfpicture } }
+ \@@_qpoint:n { col - ####1 }
+ \dim_gset_eq:NN \g_@@_tmpc_dim \pgf at x
+ \@@_qpoint:n { col - \int_eval:n { ####1 + 1 } }
+ \dim_gset:Nn \g_@@_tmpd_dim { \pgf at x - \g_@@_tmpc_dim }
+ \dim_gset_eq:NN \g_@@_tmpe_dim \pgf at x
+ \bool_if:NTF \l_@@_in_code_after_bool
+ { \endpgfpicture }
+ { \end { pgfpicture } }
+ \fp_set:Nn \l_tmpa_fp
+ {
+ \fp_min:nn
+ {
+ \fp_min:nn
+ { \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 * ( \g_@@_tmpc_dim + \g_@@_tmpe_dim ) }
+ { \dim_use:N \g_tmpa_dim }
+ }
+ \pgfnode
+ { rectangle }
+ { center }
+ { \box_use:N \l_tmpa_box }
+ { }
+ { }
+ \endpgfpicture
+ }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{We process the options at package loading}
+%
+%
+% We process the options when the package is loaded (with |\usepackage|) but we
+% recommend to use |\NiceMatrixOptions| instead.
+%
+% We must process these options after the definition of the environment
+% |{NiceMatrix}| because the option |renew-matrix| executes the code
+% |\cs_set_eq:NN \env at matrix \NiceMatrix|.
+%
+% Of course, the command |\NiceMatrix| must be defined before such an
+% instruction is executed.
+%
+%
+% \medskip
+% The boolean |\g_@@_footnotehyper_bool| will indicate if the option
+% |footnotehyper| is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnotehyper_bool
+% \end{macrocode}
+%
+% \medskip
+% The boolean |\c_@@_footnote_bool| will indicate if the option |footnote| is
+% used, but quicky, it will also be set to |true| if the option |footnotehyper|
+% is used.
+% \begin{macrocode}
+\bool_new:N \c_@@_footnote_bool
+% \end{macrocode}
+%
+% \begin{macrocode}
+\msg_new:nnnn { nicematrix } { Unknown~key~for~package }
+ {
+ The~key~'\l_keys_key_str'~is~unknown. \\
+ That~key~will~be~ignored. \\
+ For~a~list~of~the~available~keys,~type~H~<return>.
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ footnote,~
+ footnotehyper,~
+ messages-for-Overleaf,~
+ no-test-for-array,~
+ renew-dots,~and
+ renew-matrix.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\keys_define:nn { NiceMatrix / Package }
+ {
+ renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
+ renew-dots .value_forbidden:n = true ,
+ renew-matrix .code:n = \@@_renew_matrix: ,
+ renew-matrix .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 ,
+ no-test-for-array .bool_set:N = \c_@@_no_test_for_array_bool ,
+ no-test-for-array .default:n = true ,
+ unknown .code:n = \@@_error:n { Unknown~key~for~package }
+ }
+\ProcessKeysOptions { NiceMatrix / Package }
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\@@_msg_new:nn { footnote~with~footnotehyper~package }
+ {
+ You~can't~use~the~option~'footnote'~because~the~package~
+ footnotehyper~has~already~been~loaded.~
+ 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.\\
+ The~package~footnote~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { footnotehyper~with~footnote~package }
+ {
+ You~can't~use~the~option~'footnotehyper'~because~the~package~
+ footnote~has~already~been~loaded.~
+ 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.\\
+ The~package~footnotehyper~won't~be~loaded.
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnote_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \IfClassLoadeTF { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \IfPackageLoadedTF { footnotehyper }
+ { \@@_error:n { footnote~with~footnotehyper~package } }
+ { \usepackage { footnote } }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\bool_if:NT \c_@@_footnotehyper_bool
+ {
+% \end{macrocode}
+% The class \cls{beamer} has its own system to extract footnotes and that's why
+% we have nothing to do if \cls{beamer} is used.
+% \begin{macrocode}
+ \IfClassLoadedTF { beamer }
+ { \bool_set_false:N \c_@@_footnote_bool }
+ {
+ \IfPackageLoadedTF { footnote }
+ { \@@_error:n { footnotehyper~with~footnote~package } }
+ { \usepackage { footnotehyper } }
+ }
+ \bool_set_true:N \c_@@_footnote_bool
+ }
+% \end{macrocode}
+% The flag |\c_@@_footnote_bool| is raised and so, we will only have to test
+% |\c_@@_footnote_bool| in order to know if we have to insert an environment
+% |{savenotes}|.
+%
+% \bigskip
+% \section{About the package underscore}
+%
+% If the user loads the package \pkg{underscore}, it must be loaded
+% \emph{before} the package \pkg{nicematrix}. If it is loaded after, we raise an
+% error.
+%
+% \begin{macrocode}
+\bool_new:N \l_@@_underscore_loaded_bool
+\IfPackageLoadedTF { underscore }
+ { \bool_set_true:N \l_@@_underscore_loaded_bool }
+ { }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\hook_gput_code:nnn { begindocument } { . }
+ {
+ \bool_if:NF \l_@@_underscore_loaded_bool
+ {
+ \IfPackageLoadedTF { underscore }
+ { \@@_error:n { underscore~after~nicematrix } }
+ { }
+ }
+ }
+% \end{macrocode}
+%
+% \bigskip
+% \section{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
+ {
+ NiceMatrix ,
+ pNiceMatrix , bNiceMatrix , vNiceMatrix, BNiceMatrix, VNiceMatrix
+ }
+\seq_gset_map_x:NNn \g_@@_types_of_matrix_seq \g_@@_types_of_matrix_seq
+ { \tl_to_str:n { #1 } }
+% \end{macrocode}
+%
+% \bigskip
+% If the user uses too much columns, the command |\@@_error_too_much_cols:| is
+% 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:
+ {
+ \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 } }
+ {
+ \int_compare:nNnTF \l_@@_last_col_int = { -1 }
+ { \@@_fatal:n { too~much~cols~for~matrix } }
+ {
+ \bool_if:NF \l_@@_last_col_without_value_bool
+ { \@@_fatal:n { too~much~cols~for~matrix~with~last~col } }
+ }
+ }
+ }
+ {
+ \IfPackageLoadedTF { tabularx }
+ {
+ \str_if_eq:VnTF \g_@@_name_env_str { NiceTabularX }
+ {
+ \int_compare:nNnTF \c at iRow = \c_zero_int
+ { \@@_fatal:n { X~columns~with~tabularx } }
+ {
+ \@@_fatal:nn { too~much~cols~for~array }
+ {
+ However,~this~message~may~be~erroneous:~
+ maybe~you~have~used~X~columns~while~'tabularx'~is~loaded,~
+ ~which~is~forbidden~(however,~it's~still~possible~to~use~
+ X~columns~in~{NiceTabularX}).
+ }
+ }
+ }
+ { \@@_fatal:nn { too~much~cols~for~array } { } }
+ }
+ { \@@_fatal:nn { too~much~cols~for~array } { } }
+ }
+ }
+% \end{macrocode}
+%
+%
+% The following command must \emph{not} be protected since it's used in an error message.
+% \begin{macrocode}
+\cs_new:Npn \@@_message_hdotsfor:
+ {
+ \tl_if_empty:VF \g_@@_HVdotsfor_lines_tl
+ { ~Maybe~your~use~of~\token_to_str:N \Hdotsfor\ is~incorrect.}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { negative~weight }
+ {
+ Negative~weight.\\
+ The~weight~of~the~'X'~columns~must~be~positive~and~you~have~used~
+ the~value~'\int_use:N \l_@@_weight_int'.\\
+ 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}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { too~much~cols~for~matrix~with~last~col }
+ {
+ Too~much~columns.\\
+ In~the~row~\int_eval:n { \c at iRow },~
+ 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}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { too~much~cols~for~matrix }
+ {
+ Too~much~columns.\\
+ In~the~row~\int_eval:n { \c at iRow },~
+ 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~(excepted~the~potential~exterior~
+ columns)~is~fixed~by~the~LaTeX~counter~'MaxMatrixCols'.~
+ Its~current~value~is~\int_use:N \c at MaxMatrixCols\ (use~
+ \token_to_str:N \setcounter\ to~change~that~value).~
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\@@_msg_new:nn { too~much~cols~for~array }
+ {
+ Too~much~columns.\\
+ In~the~row~\int_eval:n { \c at iRow },~
+ ~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).~#1
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+% \medskip
+% \begin{macrocode}
+\@@_msg_new:nn { X~columns~with~tabularx }
+ {
+ There~is~a~problem.\\
+ You~have~probably~used~X~columns~in~your~environment~{\g_@@_name_env_str}.~
+ That's~not~allowed~because~'tabularx'~is~loaded~(however,~you~can~use~X~columns~
+ in~an~environment~{NiceTabularX}).\\
+ This~error~is~fatal.
+ }
+% \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.\\
+ The~columns~you~did~not~used~won't~be~created.\\
+ We~won't~have~similar~error~till~the~end~of~the~document.
+ }
+% \end{macrocode}
+%
+%
+% \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.\\
+ That~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.\\
+ That~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.\\
+ That~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { in~last~row }
+ {
+ You~can't~use~the~command~#1 in~the~last~row~(exterior)~of~the~array.\\
+ That~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { caption~outside~float }
+ {
+ Key~caption~forbidden.\\
+ You~can't~use~the~key~'caption'~because~you~are~not~in~a~floating~
+ environment.~This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { short-caption~without~caption }
+ {
+ You~should~not~use~the~key~'short-caption'~without~'caption'.~
+ However,~your~'short-caption'~will~be~used~as~'caption'.
+ }
+% \end{macrocode}
+%
+% \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.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { delimiter~after~opening }
+ {
+ Double~delimiter.\\
+ You~can't~put~a~second~delimiter~"#1"~just~after~a~first~opening~
+ delimiter.~That~delimiter~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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'.~That~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Identical~notes~in~caption }
+ {
+ Identical~tabular~notes.\\
+ You~can't~put~several~notes~with~the~same~content~in~
+ \token_to_str:N \caption\ (but~you~can~in~the~main~tabular).\\
+ If~you~go~on,~the~output~will~probably~be~erroneous.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { tabularnote~below~the~tabular }
+ {
+ \token_to_str:N \tabularnote\ forbidden\\
+ You~can't~use~\token_to_str:N \tabularnote\ in~the~caption~
+ of~your~tabular~because~the~caption~will~be~composed~below~
+ the~tabular.~If~you~want~the~caption~above~the~tabular~use~the~
+ key~'caption-above'~in~\token_to_str:N \NiceMatrixOptions.\\
+ Your~\token_to_str:N \tabularnote\ will~be~discarded~and~
+ no~similar~error~will~raised~in~this~document.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Unknown~key~for~rules }
+ {
+ Unknown~key.\\
+ There~is~only~two~keys~available~here:~width~and~color.\\
+ You~key~'\l_keys_key_str'~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~custom-line }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown~in~a~'custom-line'.~
+ It~you~go~on,~you~will~probably~have~other~errors. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ ccommand,~
+ color,~
+ command,~
+ dotted,~
+ letter,~
+ multiplicity,~
+ sep-color,~
+ tikz,~and~total-width.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~xdots }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown~for~a~command~for~drawing~dotted~rules.\\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ 'color',~
+ 'inter',~
+ 'line-style',~
+ 'radius',~
+ 'shorten',~
+ 'shorten-end'~and~'shorten-start'.
+ }
+% \end{macrocode}
+%
+%
+% \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')\\
+ That~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { label~without~caption }
+ {
+ You~can't~use~the~key~'label'~in~your~'{NiceTabular}'~because~
+ you~have~not~used~the~key~'caption'.~The~key~'label'~will~be~ignored.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { W~warning }
+ {
+ Line~\msg_line_number:.~The~cell~is~too~wide~for~your~column~'W'~
+ (row~\int_use:N \c at iRow).
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_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.\\
+ That~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { underscore~after~nicematrix }
+ {
+ Problem~with~'underscore'.\\
+ The~package~'underscore'~should~be~loaded~before~'nicematrix'.~
+ You~can~go~on~but~you~won't~be~able~to~write~something~such~as:\\
+ '\token_to_str:N \Cdots\token_to_str:N _{n~\token_to_str:N \text{~times}}'.
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_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.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { double-backslash~in~light-syntax }
+ {
+ 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 { hlines~with~color }
+ {
+ Incompatible~keys.\\
+ You~can't~use~the~keys~'hlines',~'vlines'~or~'hvlines'~for~a~
+ '\token_to_str:N \Block'~when~the~key~'color'~or~'draw'~is~used.\\
+ Maybe~it~will~possible~in~future~version.\\
+ Your~key~will~be~discarded.
+ }
+% \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'~or~of~
+ the~form~'line-i'.\\
+ A~value~of~1~will~be~used.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { ragged2e~not~loaded }
+ {
+ You~have~to~load~'ragged2e'~in~order~to~use~the~key~'\l_keys_key_str'~in~
+ your~column~'\l_@@_vpos_col_str'~(or~'X').~The~key~'\str_lowercase:V
+ \l_keys_key_str'~will~be~used~instead.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Invalid~name }
+ {
+ Invalid~name.\\
+ You~can't~give~the~name~'\l_keys_value_tl'~to~a~\token_to_str:N
+ \SubMatrix\ of~your~\@@_full_name_env:.\\
+ A~name~must~be~accepted~by~the~regular~expression~[A-Za-z][A-Za-z0-9]*.\\
+ This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.~It~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_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'. } \\
+ This~\token_to_str:N \SubMatrix\ will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { width~without~X~columns }
+ {
+ You~have~used~the~key~'width'~but~you~have~put~no~'X'~column.~
+ 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 }
+ {
+ Empty~environment.\\
+ Your~\@@_full_name_env:\ is~empty.~This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+%
+% \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~keys~'command'~or~
+ ~'ccommand'~(to~draw~horizontal~rules).\\
+ However,~you~can~go~on.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Forbidden~letter }
+ {
+ Forbidden~letter.\\
+ You~can't~use~the~letter~'\l_@@_letter_str'~for~a~customized~line.\\
+ It~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Several~letters }
+ {
+ Wrong~name.\\
+ You~must~use~only~one~letter~as~value~for~the~key~'letter'~(and~you~
+ have~used~'\l_@@_letter_str').\\
+ It~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { unknown~cell~for~line~in~CodeAfter }
+ {
+ 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.\\
+ This~command~\token_to_str:N \line\ will~be~ignored.
+ }
+% \end{macrocode}
+%
+%
+% \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:.\\
+ 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:~
+ \seq_use:Nnnn \g_@@_submatrix_names_seq { ~and~ } { ,~ } { ~and~ }.
+ }
+% \end{macrocode}
+%
+% \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:.\\
+ This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { bad~corner }
+ {
+ 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}
+%
+% \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~
+ also~use~the~key~'tikz'
+ \IfPackageLoadedTF { tikz }
+ { }
+ {~if~you~load~the~LaTeX~package~'tikz'}).\\
+ This~specification~of~border~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.~
+ This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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~
+ (the~value~'\l_keys_value_tl'~will~be~ignored).
+ }
+% \end{macrocode}
+%
+%
+% \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~
+ (the~value~'\l_keys_value_tl'~will~be~ignored).
+ }
+% \end{macrocode}
+%
+%
+% \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. \\
+ }
+% \end{macrocode}
+%
+% \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~
+ 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:.\\
+ This~block~and~maybe~others~will~be~ignored.
+ }
+% \end{macrocode}
+%
+%
+% \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.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { unknown~column~type~S }
+ {
+ Bad~column~type.\\
+ The~column~type~'S'~in~your~\@@_full_name_env:\ is~unknown. \\
+ If~you~want~to~use~the~column~type~'S'~of~siunitx,~you~should~
+ load~that~package. \\
+ 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\
+ ~here.~This~command~is~available~only~in~
+ \{NiceTabular\},~\{NiceTabular*\}~and~\{NiceTabularX\}~or~in~
+ the~argument~of~a~command~\token_to_str:N \caption\ included~
+ in~an~environment~{table}. \\
+ This~command~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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.\\
+ This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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'.\\
+ This~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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'.\\
+ All~the~commands~\token_to_str:N\tabularnote\ will~be~
+ ignored~in~the~document.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_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~
+ use~that~custom~line.
+ }
+% \end{macrocode}
+%
+% \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.~
+ That~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \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').~
+ The~key~'color'~will~be~discarded.
+ }
+% \end{macrocode}
+%
+% \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~
+ last~row.~You~can~avoid~this~problem~by~using~'last-row'~
+ without~value~(more~compilations~might~be~necessary).
+ }
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\@@_msg_new:nn { Yet~in~env }
+ {
+ 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.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { One~letter~allowed }
+ {
+ Bad~name.\\
+ The~value~of~key~'\l_keys_key_str'~must~be~of~length~1.\\
+ It~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { TabularNote~in~CodeAfter }
+ {
+ Environment~{TabularNote}~forbidden.\\
+ You~must~use~{TabularNote}~at~the~end~of~your~{NiceTabular}~
+ but~*before*~the~\token_to_str:N \CodeAfter.\\
+ This~environment~{TabularNote}~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nn { varwidth~not~loaded }
+ {
+ varwidth~not~loaded.\\
+ You~can't~use~the~column~type~'V'~because~'varwidth'~is~not~
+ loaded.\\
+ Your~column~will~behave~like~'p'.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknow~key~for~RulesBis }
+ {
+ Unkown~key.\\
+ Your~key~'\l_keys_key_str'~is~unknown~for~a~rule.\\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ color,~
+ dotted,~
+ multiplicity,~
+ sep-color,~
+ tikz,~and~total-width.
+ }
+
+% \end{macrocode}
+%
+% \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.\\ It~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~b,~B,~borders,~c,~draw,~fill,~
+ hlines,~hvlines,~l,~line-width,~name,~rounded-corners,~r,~respect-arraystretch,~
+ t,~T,~tikz,~transparent~and~vlines.
+ }
+% \end{macrocode}
+%
+% \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.38~and~your~log~file~says:~"siunitx,~
+ \use:c { ver @ siunitx.sty }". \\
+ This~error~is~fatal.
+ }
+% \end{macrocode}
+%
+%
+% \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.\\
+ It~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~color,~left-shorten,~
+ right-shorten,~shorten~(which~fixes~both~left-shorten~and~
+ right-shorten)~and~yshift.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~CodeAfter }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ It~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ delimiters/color,~
+ rules~(with~the~subkeys~'color'~and~'width'),~
+ sub-matrix~(several~subkeys)~
+ and~xdots~(several~subkeys).~
+ The~latter~is~for~the~command~\token_to_str:N \line.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~CodeBefore }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ It~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ create-cell-nodes,~
+ delimiters/color~and~
+ sub-matrix~(several~subkeys).
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~SubMatrix }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ 'delimiters/color',~
+ 'extra-height',~
+ 'hlines',~
+ 'hvlines',~
+ 'left-xshift',~
+ 'name',~
+ 'right-xshift',~
+ 'rules'~(with~the~subkeys~'color'~and~'width'),~
+ 'slim',~
+ 'vlines'~and~'xshift'~(which~sets~both~'left-xshift'~
+ and~'right-xshift').\\
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~notes }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown.\\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ bottomrule,~
+ code-after,~
+ code-before,~
+ detect-duplicates,~
+ enumitem-keys,~
+ enumitem-keys-para,~
+ para,~
+ label-in-list,~
+ label-in-tabular~and~
+ style.
+ }
+% \end{macrocode}
+%
+% \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. \\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ 'bold',~
+ 'cell-space-top-limit',~
+ 'cell-space-bottom-limit',~
+ 'cell-space-limits',~
+ 'color',~
+ 'nb-rows'~and~
+ 'rowcolor'.
+ }
+% \end{macrocode}
+%
+% \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. \\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ allow-duplicate-names,~
+ caption-above,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
+ code-for-first-col,~
+ code-for-first-row,~
+ code-for-last-col,~
+ code-for-last-row,~
+ corners,~
+ custom-key,~
+ create-extra-nodes,~
+ create-medium-nodes,~
+ create-large-nodes,~
+ delimiters~(several~subkeys),~
+ end-of-row,~
+ first-col,~
+ first-row,~
+ hlines,~
+ hvlines,~
+ hvlines-except-borders,~
+ last-col,~
+ last-row,~
+ left-margin,~
+ light-syntax,~
+ matrix/columns-type,~
+ notes~(several~subkeys),~
+ nullify-dots,~
+ pgf-node-code,~
+ renew-dots,~
+ renew-matrix,~
+ respect-arraystretch,~
+ right-margin,~
+ rules~(with~the~subkeys~'color'~and~'width'),~
+ small,~
+ sub-matrix~(several~subkeys),~
+ vlines,~
+ xdots~(several~subkeys).
+ }
+% \end{macrocode}
+%
+% For `|{NiceArray}|`, the set of keys is the same as for |{NiceMatrix}|
+% excepted that there is no |l| and |r|.
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~NiceArray }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
+ \{NiceArray\}. \\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ b,~
+ baseline,~
+ c,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
+ code-after,~
+ code-for-first-col,~
+ code-for-first-row,~
+ code-for-last-col,~
+ code-for-last-row,~
+ colortbl-like,~
+ columns-width,~
+ corners,~
+ create-extra-nodes,~
+ create-medium-nodes,~
+ create-large-nodes,~
+ extra-left-margin,~
+ extra-right-margin,~
+ first-col,~
+ first-row,~
+ hlines,~
+ hvlines,~
+ hvlines-except-borders,~
+ last-col,~
+ last-row,~
+ left-margin,~
+ light-syntax,~
+ name,~
+ nullify-dots,~
+ pgf-node-code,~
+ renew-dots,~
+ respect-arraystretch,~
+ right-margin,~
+ rules~(with~the~subkeys~'color'~and~'width'),~
+ small,~
+ t,~
+ vlines,~
+ xdots/color,~
+ xdots/shorten-start,~
+ xdots/shorten-end,~
+ xdots/shorten~and~
+ xdots/line-style.
+ }
+% \end{macrocode}
+%
+% \medskip
+% This error message is used for the set of keys |NiceMatrix/NiceMatrix| and
+% |NiceMatrix/pNiceArray| (but not by |NiceMatrix/NiceArray| because, for this
+% set of keys, there is no |l| and |r|).
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~NiceMatrix }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown~for~the~
+ \@@_full_name_env:. \\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ b,~
+ baseline,~
+ c,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
+ code-after,~
+ code-for-first-col,~
+ code-for-first-row,~
+ code-for-last-col,~
+ code-for-last-row,~
+ colortbl-like,~
+ columns-type,~
+ columns-width,~
+ corners,~
+ create-extra-nodes,~
+ create-medium-nodes,~
+ create-large-nodes,~
+ extra-left-margin,~
+ extra-right-margin,~
+ first-col,~
+ first-row,~
+ hlines,~
+ hvlines,~
+ hvlines-except-borders,~
+ l,~
+ last-col,~
+ last-row,~
+ left-margin,~
+ light-syntax,~
+ name,~
+ nullify-dots,~
+ pgf-node-code,~
+ r,~
+ renew-dots,~
+ respect-arraystretch,~
+ right-margin,~
+ rules~(with~the~subkeys~'color'~and~'width'),~
+ small,~
+ t,~
+ vlines,~
+ xdots/color,~
+ xdots/shorten-start,~
+ xdots/shorten-end,~
+ xdots/shorten~and~
+ xdots/line-style.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@@_msg_new:nnn { Unknown~key~for~NiceTabular }
+ {
+ Unknown~key.\\
+ The~key~'\l_keys_key_str'~is~unknown~for~the~environment~
+ \{NiceTabular\}. \\
+ That~key~will~be~ignored. \\
+ \c_@@_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ b,~
+ baseline,~
+ c,~
+ caption,~
+ cell-space-bottom-limit,~
+ cell-space-limits,~
+ cell-space-top-limit,~
+ code-after,~
+ code-for-first-col,~
+ code-for-first-row,~
+ code-for-last-col,~
+ code-for-last-row,~
+ colortbl-like,~
+ columns-width,~
+ corners,~
+ custom-line,~
+ create-extra-nodes,~
+ create-medium-nodes,~
+ create-large-nodes,~
+ extra-left-margin,~
+ extra-right-margin,~
+ first-col,~
+ first-row,~
+ hlines,~
+ hvlines,~
+ hvlines-except-borders,~
+ label,~
+ last-col,~
+ last-row,~
+ left-margin,~
+ light-syntax,~
+ name,~
+ notes~(several~subkeys),~
+ nullify-dots,~
+ pgf-node-code,~
+ renew-dots,~
+ respect-arraystretch,~
+ right-margin,~
+ rounded-corners,~
+ rules~(with~the~subkeys~'color'~and~'width'),~
+ short-caption,~
+ t,~
+ tabularnote,~
+ vlines,~
+ xdots/color,~
+ xdots/shorten-start,~
+ xdots/shorten-end,~
+ xdots/shorten~and~
+ xdots/line-style.
+ }
+% \end{macrocode}
+%
+%
+% \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~
+ 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'.\\
+ \c_@@_available_keys_str
+ }
+ {
+ The~names~already~defined~in~this~document~are:~
+ \seq_use:Nnnn \g_@@_names_seq { ~and~ } { ,~ } { ~and~ }.
+ }
+% \end{macrocode}
+%
+% \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.~
+ That~key~will~be~ignored.
+ }
+% \end{macrocode}
+%
+% \newpage
+% \tableofcontents
+%
+% \endinput
+% Local Variables:
+% TeX-fold-mode: t
+% TeX-fold-preserve-comments: nil
+% fill-column: 80
+% End:
+
+
Property changes on: trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx 2023-05-16 20:22:00 UTC (rev 67134)
+++ trunk/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx 2023-05-16 20:22:30 UTC (rev 67135)
@@ -1,23021 +0,0 @@
-% \iffalse meta-comment
-%
-% This file should be compiled with $xelatex$.
-%
-% Copyright (C) 2018-2023 by F. Pantigny
-% ------------------------------------------
-%
-% This file may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either version 1.3
-% of this license or (at your option) any later version.
-% The latest version of this license is in:
-%
-% http://www.latex-project.org/lppl.txt
-%
-% and version 1.3 or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
-%
-% \fi
-% \iffalse
-\def\myfileversion{6.18}
-\def\myfiledate{2023/04/19}
-%
-%
-%<*batchfile>
-\begingroup
-\input l3docstrip.tex
-\keepsilent
-\usedir{tex/latex/nicematrix}
-\preamble
-
-
-Copyright (C) 2018-2023 by F. Pantigny
------------------------------------
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either version 1.3
-of this license or (at your option) any later version.
-The latest version of this license is in:
-
-http://www.latex-project.org/lppl.txt
-
-and version 1.3 or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
-
-\endpreamble
-\askforoverwritefalse
-\endgroup
-%</batchfile>
-%
-%<*driver>
-\documentclass[dvipsnames]{l3doc}% dvipsnames is for xcolor (loaded by Tikz)
-\VerbatimFootnotes
-\usepackage{xltxtra}
-\usepackage[xetex]{geometry}
-\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
-
-\usepackage{tikz}
-\usetikzlibrary{fit,patterns,arrows.meta,decorations.pathmorphing}
-\usepackage{nicematrix}
-\usepackage{siunitx}
-\usepackage{caption}
-\usepackage{varwidth}
-\usepackage{tcolorbox}
-\usepackage{adjustbox}
-\usepackage[auto-lang=false]{lipsum}
-
-\NewDocumentEnvironment {scope} {} {} {}
-\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
-\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
-\fvset{commandchars=\~\#\@,formatcom=\color{gray}}
-\usepackage{titlesec}
-\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
-\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}
-\usepackage{footnotehyper}
-\def\LetterAt{@}
-\parindent 0pt
-\skip \footins = 2 \bigskipamount
-
-\EnableCrossrefs
-\makeatletter
-\ExplSyntaxOn
-\DoNotIndex{\begin,\end}
-\DoNotIndex{\c at iRow,\c at jCol,\theiRow,\thejCol}
-\DoNotIndex{\pgfpicture,\endpgfpicture,\tikzpicture,\endtikzpicture}
-\DoNotIndex{\pgfpoint,\pgfnode,\pgfnodealias,\pgfcoordinate}
-\DoNotIndex{\pgf at x,\pgf at y}
-\DoNotIndex{\int_add:Nn,\int_case:nnTF,\int_compare:nNnTF,\int_compare:nTF,
- \int_compare_p:nNn,\int_decr:N,\int_eval:n,\int_add:Nn,\int_gdecr:N,\int_gincr:N
- \int_gset:Nn,\int_gset_eq:NN,\int_gzero:N,\int_gzero_new:N,\int_if_odd:nTF,
- \int_max:nn,\int_new:N,\int_set:Nn,\int_set_eq:NN,\int_step_inline:nnn,
- \int_step_variable:nNn,\int_step_variable:nnNn,\int_sub:Nn,\int_use:N,\int_zero:N,
- \int_zero_new:N,\g_tmpa_int,\l_tmpa_int,\l_tmpb_int}
-\DoNotIndex{\dim_abs:n,\dim_add:Nn,\dim_compare:nNnTF,\dim_compare_p:nNn,
-\dim_const:Nn,\dim_eval:n,\dim_gadd:Nn,\dim_gset:Nn,\dim_gset_eq:NN,
-\dim_gset:Nn,\dim_gset_eq:NN,\dim_gsub:Nn,\dim_gzero_new:N,\dim_max:nn,
-\dim_min:nn,\dim_new:N,\dim_ration:nn,\dim_set:Nn,\dim_set_eq:NN,\dim_sub:Nn,
-\dim_use:N,\dim_zero:N,\dim_zero_new:N,\g_tmpa_dim,\l_tmpa_dim,\l_tmpb_dim,
-\c_zero_dim}
-\DoNotIndex{\cs_new_protected:Npn,\cs_new:Npn,\cs_set_eq:NN,
-\cs_set_protected:Npn}
-\DoNotIndex{\bool_if:NTF,\bool_new:N,\bool_set_false:N,\bool_set_true:N,\l_tmpa_bool}
-\DoNotIndex{\group_begin:,\group_end:,\c_math_toggle_token}
-\DoNotIndex{\tl_set:Nn,\l_tmpa_tl,\l_tmpb_tl}
-\DoNotIndex{\tl_gput_left:Nn,\tl_gput_right:Nn}
-\ExplSyntaxOff
-\makeatother
-
-
-
-
-\begin{document}
-\DocInput{nicematrix.dtx}
-\end{document}
-%</driver>
-% \fi
-% \title{The package \pkg{nicematrix}\thanks{This document corresponds to the version~\myfileversion\space of \pkg{nicematrix},
-% at the date of~\myfiledate.}} \author{F. Pantigny \\ \texttt{fpantigny at wanadoo.fr}}
-%
-% \hypersetup
-% {
-% pdfinfo =
-% {
-% Title = The package 'nicematrix' ,
-% Subject = A LaTeX package ,
-% Author = F. Pantigny
-% }
-% }
-%
-%
-% \maketitle
-%
-% \begin{abstract}
-% The LaTeX package \pkg{nicematrix} provides new environments similar to the
-% classical environments |{tabular}|, |{array}| and |{matrix}| of \pkg{array}
-% and \pkg{amsmath} but with extended features.
-% \end{abstract}
-%
-%
-%
-%
-% \vspace{1cm}
-% \hspace{1cm}
-% $\begin{bNiceArray}{cccc}[first-row,first-col,
-% code-for-first-col=\color{blue}\scriptstyle,
-% code-for-first-row=\color{blue}\scriptstyle,
-% columns-width = auto]
-% & C_1 & C_2 & \Cdots & C_n \\
-% L_1 & a_{11} & a_{12} & \Cdots & a_{1n} \\
-% L_2 & a_{21} & a_{22} & \Cdots & a_{2n} \\
-% \Vdots & \Vdots & \Vdots & \Ddots & \Vdots\\
-% L_n & a_{n1} & a_{n2} & \Cdots & a_{nn}
-% \end{bNiceArray}$\hspace{2cm}
-% \begin{NiceTabular}{lSSSS}[code-before = \rowcolor{red!15}{1-2} \rowcolors{3}{blue!15}{}]
-% \toprule
-% \Block{2-1}{Product} & \multicolumn{3}{c}{dimensions (cm)} & \Block{2-1}{\rotate Price} \\
-% \cmidrule(rl){2-4}
-% & L & l & h \\
-% \midrule
-% small & 3 & 5.5 & 1 & 30 \\
-% standard & 5.5 & 8 & 1.5 & 50.5 \\
-% premium & 8.5 & 10.5 & 2 & 80 \\
-% extra & 8.5 & 10 & 1.5 & 85.5 \\
-% special & 12 & 12 & 0.5 & 70 \\
-% \bottomrule
-% \end{NiceTabular}
-%
-% \vspace{1cm}
-% The package \pkg{nicematrix} is entirely contained in the file
-% |nicematrix.sty|. This file may be put in the current directory or in a
-% |texmf| tree. However, the best is to install \pkg{nicematrix} with a TeX
-% distribution such as MiKTeX, TeX Live or MacTeX.
-%
-% \medskip
-% \emph{Remark}: If you use LaTeX via Internet with, for example, Overleaf, you
-% can upload the file |nicematrix.sty| in the repertory of your
-% project in order to take full advantage of the latest version de
-% \pkg{nicematrix}.\footnote{The latest version of the file
-% |nicematrix.sty| may be downloaded from the \textsc{svn} server of
-% TeXLive:\newline
-% \small
-% \url{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}}
-%
-% \medskip
-% This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by
-% the classical workflow |latex|-|dvips|-|ps2pdf| (or Adobe Distiller).
-% \textsl{However, the file nicematrix.dtx of the present documentation should
-% be compiled with XeLaTeX.}
-%
-% \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}
-% loaded). The final user only has to load the package with
-% |\usepackage{nicematrix}|.
-%
-%
-% \medskip
-% The idea of \pkg{nicematrix} is to create \textsc{pgf} nodes under the cells
-% and the positions of the rules of the tabular created by \pkg{array} and to
-% use these nodes to develop new features. As usual with \textsc{pgf}, the
-% coordinates of these nodes are written in the |aux| to be used on the next
-% compilation and that's why \pkg{nicematrix} may need \textbf{several
-% compilations}.\footnote{If you use Overleaf, Overleaf will do automatically
-% the right number of compilations.}
-%
-% \medskip
-% Most features of \pkg{nicematrix} may be used without explicit use of
-% \textsc{pgf} or Tikz (which, in fact, is not loaded by default).
-%
-% \medskip
-% A command |\NiceMatrixOptions| is provided to fix the options (the
-% scope of the options fixed by this command is the current TeX group: they are
-% semi-global).
-%
-%
-%
-% \newpage
-%
-% \section{The environments of this package}
-%
-% The package \pkg{nicematrix} defines the following new environments.
-%
-% \medskip
-% \begin{ttfamily}
-% \setlength{\tabcolsep}{3mm}
-% \begin{tabular}{llll}
-% \{NiceTabular\} & \{NiceArray\} & \{NiceMatrix\} \\
-% \{NiceTabular*\} & \{pNiceArray\} & \{pNiceMatrix\} \\
-% \{NiceTabularX\} & \{bNiceArray\} & \{bNiceMatrix\} \\
-% & \{BNiceArray\} & \{BNiceMatrix\} \\
-% & \{vNiceArray\} & \{vNiceMatrix\} \\
-% & \{VNiceArray\} & \{VNiceMatrix\}
-% \end{tabular}
-% \end{ttfamily}
-%
-% %
-% \medskip
-% The environments |{NiceArray}|, |{NiceTabular}| and |{NiceTabular*}| are
-% similar to the environments |{array}|, |{tabular}| and |{tabular*}| of the
-% package \pkg{array} (which is loaded by \pkg{nicematrix}).
-%
-% \medskip
-% The environments |{pNiceArray}|, |{bNiceArray}|, etc. have no equivalent in
-% \pkg{array}.
-%
-% \medskip
-% The environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. are similar to the
-% corresponding environments of \pkg{amsmath} (which is loaded by
-% \pkg{nicematrix}): |{matrix}|, |{pmatrix}|, etc.
-%
-% \medskip
-% The environment |{NiceTabularX}| is similar to the environment |{tabularx}|
-% from the eponymous package.\footnote{In fact, it's possible to use directly the
-% |X| columns in the environment |{NiceTabular}| (and the required
-% width for the tabular is fixed by the key |width|): cf. p.~\pageref{X-columns}}.
-%
-% \medskip
-% \textbf{It's recommended to use primarily the classical environments and to use the
-% environments of \pkg{nicematrix} only when some feature provided by these
-% environments is used (this will save memory).}
-%
-% \medskip
-% All the environments of the package \pkg{nicematrix} accept, between square
-% brackets, an optional list of \textsl{key=value} pairs. \textbf{There must be
-% no space before the opening bracket (|[|) of this list of options.}
-%
-%
-% \section{The vertical space between the rows}
-%
-% \label{cell-space}
-%
-% It's well known that some rows of the arrays created by default with LaTeX
-% are, by default, too close to each other. Here is a classical example.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $\begin{pmatrix}
-% \frac{1}{2} & -\frac{1}{2} \\
-% \frac{1}{3} & \frac{1}{4} \\
-% \end{pmatrix}$
-% \end{BVerbatim}
-% $\begin{pmatrix}
-% \frac{1}{2} & -\frac{1}{2} \\
-% \frac{1}{3} & \frac{1}{4} \\
-% \end{pmatrix}$
-%
-% \bigskip
-% Inspired by the package \pkg{cellspace} which deals with that problem, the
-% package \pkg{nicematrix} provides two keys |cell-space-top-limit| and
-% |cell-space-bottom-limit| similar to the parameters |\cellspacetoplimit| and
-% |\cellspacebottomlimit| of \pkg{cellspace}.
-%
-% There is also a key |cell-space-limits| to set both parameters at once.
-%
-% The initial value of these parameters is $0$~pt in order to have for the
-% environments of \pkg{nicematrix} the same behaviour as those of \pkg{array}
-% and \pkg{amsmath}. However, a value of $1$~pt would probably be a good choice
-% and we suggest to set them with |\NiceMatrixOptions|.\footnote{One should
-% remark that these parameters apply also to the columns of type |S| of
-% \pkg{siunitx} whereas the package \pkg{cellspace} is not able to act on such
-% columns of type~|S|.}
-%
-% \medskip
-% \begin{Verbatim}
-% \NiceMatrixOptions{~emphase#cell-space-limits = 1pt@}
-% \end{Verbatim}
-%
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $\begin{pNiceMatrix}
-% \frac12 & -\frac12 \\
-% \frac13 & \frac14 \\
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{cell-space-limits = 1pt}
-% $\begin{pNiceMatrix}
-% \frac12 & -\frac12 \\
-% \frac13 & \frac14 \\
-% \end{pNiceMatrix}$
-% \end{scope}
-%
-%
-%
-%
-%
-% \bigskip
-% \section{The vertical position of the arrays}
-%
-% The package \pkg{nicematrix} provides a option |baseline| for the vertical
-% position of the arrays. This option takes in as value an integer which is the
-% number of the row on which the array will be aligned.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $A = \begin{pNiceMatrix}[~emphase#baseline=2@]
-% \frac{1}{\sqrt{1+p^2}} & p & 1-p \\
-% 1 & 1 & 1 \\
-% 1 & p & 1+p
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $A = \begin{pNiceMatrix}[baseline=2]
-% \frac{1}{\sqrt{1+p^2}} & p & 1-p \\
-% 1 & 1 & 1 \\
-% 1 & p & 1+p
-% \end{pNiceMatrix}$
-%
-%
-% \medskip
-% It's also possible to use the option |baseline| with one of the special values
-% |t|, |c| or |b|. These letters may also be used absolutely like the option of
-% the environments |{tabular}| and |{array}| of \pkg{array}. The initial value
-% of |baseline| is~|c|.
-%
-%
-% \medskip
-% In the following example, we use the option |t| (equivalent to |baseline=t|)
-% immediately after an |\item| of list. One should remark that the presence of a
-% |\hline| at the beginning of the array doesn't prevent the alignment of the
-% baseline with the baseline of the first row (with |{tabular}| or |{array}| of
-% \pkg{array}, one must use |\firsthline|).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{enumerate}
-% \item an item
-% \smallskip
-% \item \renewcommand{\arraystretch}{1.2}
-% $\begin{NiceArray}~emphase#[t]@{lcccccc}
-% \hline
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% u_n & 1 & 2 & 4 & 8 & 16 & 32
-% \hline
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{BVerbatim}
-% \begin{minipage}{5cm}
-% \begin{enumerate}
-% \item an item
-% \smallskip
-% \item \renewcommand{\arraystretch}{1.2}
-% $\begin{NiceArray}[t]{lcccccc}
-% \hline
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
-% \hline
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{minipage}
-%
-% \medskip
-% However, it's also possible to use the tools of
-% \pkg{booktabs}\footnote{The extension \pkg{booktabs} is \emph{not} loaded
-% by \pkg{nicematrix}.}: |\toprule|,
-% |\bottomrule|, |\midrule|, etc.\par\nobreak
-%
-% \smallskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{enumerate}
-% \item an item
-% \smallskip
-% \item
-% $\begin{NiceArray}[t]{lcccccc}
-% ~emphase#\toprule@
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% ~emphase#\midrule@
-% u_n & 1 & 2 & 4 & 8 & 16 & 32
-% ~emphase#\bottomrule@
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{BVerbatim}
-% \begin{minipage}{5cm}
-% \begin{enumerate}
-% \item an item
-% \smallskip
-% \item
-% $\begin{NiceArray}[t]{lcccccc}
-% \toprule
-% n & 0 & 1 & 2 & 3 & 4 & 5 \\
-% \midrule
-% u_n & 1 & 2 & 4 & 8 & 16 & 32 \\
-% \bottomrule
-% \end{NiceArray}$
-% \end{enumerate}
-% \end{minipage}
-%
-% \bigskip
-% It's also possible to use the key |baseline| to align a matrix on an
-% horizontal rule (drawn by |\hline|). In this aim, one should give the value
-% |line-|\textsl{i} where \textsl{i} is the number of the row \emph{following} the
-% horizontal rule.
-%
-% \smallskip
-% \begin{Verbatim}
-% \NiceMatrixOptions{cell-space-limits=1pt}
-% \end{Verbatim}
-%
-% \smallskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $A=\begin{pNiceArray}{cc|cc}~emphase#[baseline=line-3]@
-% \dfrac{1}{A} & \dfrac{1}{B} & 0 & 0 \\
-% \dfrac{1}{C} & \dfrac{1}{D} & 0 & 0 \\
-% \hline
-% 0 & 0 & A & B \\
-% 0 & 0 & D & D \\
-% \end{pNiceArray}$
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{cell-space-limits=1pt}
-% \raisebox{-5mm}{$A=\begin{pNiceArray}{cc|cc}[baseline=line-3]
-% \dfrac{1}{A} & \dfrac{1}{B} & 0 & 0 \\
-% \dfrac{1}{C} & \dfrac{1}{D} & 0 & 0 \\
-% \hline
-% 0 & 0 & A & B \\
-% 0 & 0 & D & D \\
-% \end{pNiceArray}$}
-% \end{scope}
-%
-%
-% \section{The blocks}
-% \label{Block}
-%
-% \subsection{General case}
-%
-% In the environments of \pkg{nicematrix}, it's possible to use the command
-% |\Block| in order to place an element in the center of a rectangle of merged
-% cells of the array.\footnote{The spaces after a command |\Block| are deleted.}
-%
-% The command |\Block| must be used in the upper leftmost cell of the array with
-% two arguments.
-%
-% \begin{itemize}
-% \item The first argument is the size of the block with the syntax
-% $i$|-|$j$ where $i$ is the number of rows of the block and $j$ its number
-% of columns.
-%
-% If this argument is empty, its default
-% value is |1-1|. If the number of rows is not specified, or equal to |*|, the
-% block extends until the last row (idem for the columns).
-%
-% \item The second argument is the content of the block. It's possible to use
-% |\\| in that content to have a content on several lines. In |{NiceTabular}|,
-% |{NiceTabular*}| and |{NiceTabularX}|, the content of the block is composed in
-% text mode whereas, in the other environments, it is composed in math mode.
-% \end{itemize}
-%
-%
-% \interitem
-% Here is an example of utilisation of the command |\Block| in mathematical matrices.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% ~emphase#\Block{3-3}{A}@ & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \end{BVerbatim}
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block{3-3}{A} & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-%
-% \bigskip
-% One may wish to raise the size of the ``$A$'' placed in the block of the
-% previous example. Since this element is composed in math mode, it's not
-% possible to use directly a command like |\large|, |\Large| and |\LARGE|.
-% That's why the command |\Block| provides an option between angle brackets to
-% specify some TeX code which will be inserted before the beginning of the
-% math mode.\footnote{This argument between angular brackets may also be used to
-% insert a command of font such as |\bfseries| when the command |\\| is used in
-% the content of the block.}
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block{3-3}~emphase#<\Large>@{A} & & & 0 \\
-% 0 & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \end{BVerbatim}
-% \begin{scope}
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block{3-3}<\Large>{A} & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \end{scope}
-%
-% \NewDocumentCommand{\Definition}{m}
-% {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}
-%
-%
-% \interitem
-% In fact, the command |\Block| accepts as first optional argument (between
-% square brackets) a list of couples \textsl{key=value}. The available keys are as
-% follows:
-% \begin{itemize}
-% \item the key \Definition{fill} takes in as value a color and fills the block
-% with that color;
-% \item the key \Definition{draw} takes in as value a color and strokes the
-% frame of the block with that color (the default value of that key is the
-% current color of the rules of the array);
-% \item the key \Definition{color} takes in as value a color and apply that
-% color the content of the block but draws also the frame of the block with that
-% color;
-% \item the keys \Definition{hlines}, \Definition{vlines} and
-% \Definition{hvlines} draw all the corresponding rules in the
-% block;\footnote{However, the rules are not drawn in the sub-blocks of the
-% block, as always with \pkg{nicematrix}: the rules are not drawn in the blocks
-% (cf. section~\ref{rules} p.~\pageref{rules}).}
-% \item the key \Definition{line-width} is the width of the rules (is relevant
-% only when one of the keys |draw|, |hvlines|, |vlines| and |hlines| is used);
-% \item the key \Definition{rounded-corners} requires rounded corners (for the
-% frame drawn by |draw| and the shape drawn by |fill|) with a radius equal to
-% the value of that key (the default value is 4~pt\footnote{This value is the
-% initial value of the \emph{rounded corners} of Tikz.});
-% \item when the key \Definition{tikz} is used, the Tikz path corresponding of
-% the rectangle which delimits the block is executed with Tikz\footnote{Tikz
-% should be loaded (by default, \pkg{nicematrix} only loads \textsc{pgf}) and,
-% if it's not, an error will be raised.} by using as options the value of that
-% key |tikz| (which must be a list of keys allowed for a Tikz path). For
-% examples, cf. p.~\pageref{tikz-key-examples};
-% \item the key \Definition{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 the key \Definition{respect-arraystretch} prevents the setting of
-% |\arraystretch| to $1$ at the beginning of the block (which is the behaviour
-% by default) ;
-% \item the key \Definition{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|; it's possible, in
-% fact, in the list which is the value of the key |borders|, to add an entry of
-% the form |tikz={|\textsl{list}|}| where \textsl{list} is a list of couples
-% \textsl{key=value} of Tikz specifying the graphical characteristics of the
-% lines that will be drawn (for an example, see p.~\pageref{dashed}).
-% \item \colorbox{yellow!50}{\textbf{New 6.15}}\par\nobreak
-% By default, the rules are not drawn in the blocks (see the section about the
-% rules: section~\ref{rules} p.~\pageref{rules}). However, if the key
-% \Definition{transparent} is used, the rules are drawn. For an example, see
-% section~\ref{tikz-key-examples} on page~\pageref{tikz-key-examples}.
-% \end{itemize}
-%
-% There is also keys for the horizontal and vertical positions of the content of
-% the block: cf.~\ref{horizontal-block} p.~\pageref{horizontal-block}.
-%
-% \interitem
-% {\bfseries One must remark that, by default, the commands |\Blocks| don't create space}.
-% There is exception only for the blocks mono-row and the blocks mono-column as
-% explained just below.
-%
-% \medskip
-% In the following example, we have had to enlarge by hand the columns 2 and 3
-% (with the construction |w{c}{...}| of \pkg{array}).
-%
-% \bigskip
-% \begin{BVerbatim}
-% \begin{NiceTabular}{cw{c}{2cm}w{c}{3cm}c}
-% rose & tulip & daisy & dahlia \\
-% violet
-% & ~emphase#\Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}@
-% ~emphase#{\LARGE Some beautiful flowers}@
-% & & marigold \\
-% iris & & & lis \\
-% arum & periwinkle & forget-me-not & hyacinth
-% \end{NiceTabular}
-% \end{BVerbatim}
-%
-% \medskip
-% \begin{center}
-% \begin{NiceTabular}{cw{c}{2cm}w{c}{3cm}c}
-% rose & tulip & daisy & dahlia \\
-% violet & \Block[draw=red,fill=[RGB]{204,204,255},rounded-corners]{2-2}
-% {\LARGE Some beautiful flowers} & & marigold \\
-% iris & & & lis \\
-% arum & periwinkle & forget-me-not & hyacinth
-% \end{NiceTabular}
-% \end{center}
-%
-% \subsection{The mono-column blocks}
-%
-% The mono-column blocks have a special behaviour.
-%
-% \begin{itemize}
-% \item The natural width of the contents of these blocks is taken into account
-% for the width of the current column.
-%
-% In the columns with a fixed width (columns |w{...}{...}|, |W{...}{...}|,
-% |p{...}|, |b{...}|, |m{...}|, |V| and |X|), the content of the block is
-% formatted as a paragraph of that width.
-%
-% \item The specification of the horizontal position provided by the type of
-% column (|c|, |r| or |l|) is taken into account for the blocks (but the
-% |\Block| may have its own specification of alignment:
-% cf.~\ref{horizontal-block} p.~\pageref{horizontal-block}).
-%
-% \item The specifications of font specified for the column by a construction
-% |>{...}| in the preamble of the array are taken into account for the
-% mono-column blocks of that column (this behaviour is probably expected).
-% \end{itemize}
-%
-%
-% \bigskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=12cm]
-% \begin{NiceTabular}{~LetterAt{}>{\bfseries}lr~LetterAt{}} \hline
-% \Block{2-1}{John} & 12 \\
-% & 13 \\ \hline
-% Steph & 8 \\ \hline
-% \Block{3-1}{Sarah} & 18 \\
-% & 17 \\
-% & 15 \\ \hline
-% Ashley & 20 \\ \hline
-% Henry & 14 \\ \hline
-% \Block{2-1}{Madison} & 15 \\
-% & 19 \\ \hline
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{@{}>{\bfseries}lr@{}}[baseline=c] \hline
-% \Block{2-1}{John} & 12 \\
-% & 13 \\ \hline
-% Steph & 8 \\ \hline
-% \Block{3-1}{Sarah} & 18 \\
-% & 17 \\
-% & 15 \\ \hline
-% Ashley & 20 \\ \hline
-% Henry & 14 \\ \hline
-% \Block{2-1}{Madison} & 15 \\
-% & 19 \\ \hline
-% \end{NiceTabular}
-% \end{scope}
-%
-%
-% \subsection{The mono-row blocks}
-%
-% For the mono-row blocks, the natural height and depth are taken into account
-% for the height and depth of the current row (as does a standard |\multicolumn|
-% of LaTeX).
-%
-% \subsection{The mono-cell blocks}
-%
-% A mono-cell block inherits all the properties of the mono-row blocks and
-% mono-column blocks.
-%
-% \medskip
-% At first sight, one may think that there is no point using a mono-cell block.
-% However, there are some good reasons to use such a block.
-% \begin{itemize}
-% \item It's possible to use the command |\\| in a (mono-cell) block.
-%
-% \item It's possible to use the option of horizontal alignment of the block in
-% derogation of the type of column given in the preamble of the array.
-%
-% \item It's possible do draw a frame around the cell with the key |draw| of the
-% command |\Block| and to fill the background with rounded corners with the keys
-% |fill| and |rounded-corners|.\footnote{If one simply wishes to color the
-% background of a unique cell, there is no point using the command |\Block|:
-% it's possible to use the command |\cellcolor| (when the key |colortbl-like| is
-% used).}
-%
-% \item It's possible to draw one or several borders of the cell with the key |borders|.
-% \end{itemize}
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{cc}
-% \toprule
-% Writer & ~emphase#\Block[l]{}{year\\ of birth}@ \\
-% \midrule
-% Hugo & 1802 \\
-% Balzac & 1799 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{cc}
-% \toprule
-% Writer & \Block[l]{}{year\\ of birth} \\
-% \midrule
-% Hugo & 1802 \\
-% Balzac & 1799 \\
-% \bottomrule
-% \end{NiceTabular}
-%
-% \medskip
-% We recall that if the first mandatory argument of |\Block| is left blank, the
-% block is mono-cell.\footnote{One may consider that the default value of the
-% first mandatory argument of |\Block| is |1-1|.}
-%
-%
-%
-%
-% \subsection{Horizontal position of the content of the block}
-%
-% \label{horizontal-block}
-%
-% The command |\Block| accepts the keys |l|, |c| and |r| for the horizontal
-% position of its content.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \end{BVerbatim}
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block[r]{3-3}<\LARGE>{A} & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-%
-%
-% \medskip
-% By default, the horizontal position of the content of a block is computed
-% by using the positions of the \emph{contents} of the columns implied in that
-% block. That's why, in the following example, the header ``First group'' is
-% correctly centered despite the instruction |!{\qquad}| in the preamble which
-% has been used to increase the space between the columns (this
-% is not the behaviour of |\multicolumn|).
-%
-% \medskip
-% \begin{center}
-% \fvset{commandchars=\~\#\+}
-% \begin{BVerbatim}
-% \begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc@{}}
-% \toprule
-% Rank & ~emphase#\Block{1-3}{First group}+ & & & \Block{1-3}{Second group} \\
-% & 1A & 1B & 1C & 2A & 2B & 2C \\
-% \midrule
-% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
-% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
-% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
-% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
-% \bottomrule
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \end{center}
-%
-% \bigskip
-% \begin{center}
-% \begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
-% \toprule
-% Rank & \Block{1-3}{First group} & & & \Block{1-3}{Second group} \\
-% & 1A & 1B & 1C & 2A & 2B & 2C \\
-% \midrule
-% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
-% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
-% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
-% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
-% \bottomrule
-% \end{NiceTabular}
-% \end{center}
-%
-% \medskip
-% In order to have an horizontal positionning of the content of the block
-% computed with the limits of the columns of the LaTeX array (and not with the
-% contents of those columns), one may use the key |L|, |R| and |C| of the
-% command |\Block|.
-%
-% \medskip
-% Here is the same example with the key |C| for the first block.
-%
-% \medskip
-% \begin{center}
-% \fvset{commandchars=\~\#\+}
-% \begin{BVerbatim}
-% \begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc@{}}
-% \toprule
-% Rank & ~emphase#\Block[C]{1-3}{First group}+ & & & \Block{1-3}{Second group} \\
-% & 1A & 1B & 1C & 2A & 2B & 2C \\
-% \midrule
-% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
-% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
-% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
-% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
-% \bottomrule
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \end{center}
-%
-% \bigskip
-% \begin{center}
-% \begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
-% \toprule
-% Rank & \Block[C]{1-3}{First group} & & & \Block{1-3}{Second group} \\
-% & 1A & 1B & 1C & 2A & 2B & 2C \\
-% \midrule
-% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
-% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
-% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
-% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
-% \bottomrule
-% \end{NiceTabular}
-% \end{center}
-%
-%
-% \subsection{Vertical position of the content of the block}
-%
-%
-% For the vertical position, the command |\Blocks| accepts the keys
-% |v-center|\footnote{That key could not have been named |c| since the key |c|
-% is used for the horizontal alignement.},
-% |t|, |b|, |T| and |B|.
-%
-% \begin{itemize}
-% \item With the key |v-center|, the content of the block is vertically
-% centered.
-% \item With the key |t|, the baseline of the content of the block is aligned
-% With the basline of the first row concerned by the block).
-% \item with the key |b|, the baseline of the last row of the content of the
-% block (we recall that the content of a block may contains several lines
-% separated by |\\|) is aligned with the baseline of the last of the rows of the
-% array involved in the block.
-% \item With the key |T|, the content of the block is set upwards.
-%
-% \colorbox{yellow!50}{\textbf{Modification 6.18}}\enskip No vertical margin is
-% added. However, the contents of the block is (always) composed by
-% \pkg{nicematrix} in a |{minipage}|, a |{tabular}| or an |{array}| and, hence,
-% there will still remain a margin (in most cases).
-%
-% \item With the key |B|, the content of the block is set downwards.
-% \end{itemize}
-%
-% When no key is given, the key |v-center| applies (excepted in the mono-row blocks).
-%
-%
-%
-% \medskip
-% \begin{scope}
-% \NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
-%
-% \begin{BVerbatim}
-% \NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
-% \end{BVerbatim}
-%
-% \bigskip
-%
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,~emphase#t@,l]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,t,l]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-%
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,~emphase#b@,r]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,b,r]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,~emphase#T@,l]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,T,l]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-%
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,~emphase#B@,r]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}
-% \Block[fill=red!10,B,r]{4-2}{two\\lines}
-% & & \Huge Un\\
-% & & deux \\
-% & & trois \\
-% & & \Huge quatre \\
-% text & text \\
-% \end{NiceTabular}
-%
-%
-% \end{scope}
-%
-%
-%
-%
-% \section{The rules}
-%
-% \label{rules}
-%
-% The usual techniques for the rules may be used in the environments of
-% \pkg{nicematrix} (excepted |\vline|). However, there is some small differences
-% with the classical environments.
-%
-% \bigskip
-% \subsection{Some differences with the classical environments}
-%
-% \subsubsection{The vertical rules}
-%
-% In the environments of \pkg{nicematrix}, the vertical rules specified by
-% \verb+|+ in the preambles of the environments are never broken, even by an
-% incomplete row or by a double horizontal rule specified by |\hline\hline|
-% (there is no need to use the package~\pkg{hhline}).
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{|c|c|} \hline
-% First & Second \\ ~emphase#\hline\hline@
-% Peter \\ \hline
-% Mary & George\\ \hline
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{|c|c|}[c] \hline
-% First & Second \\ \hline\hline
-% Peter \\ \hline
-% Mary & George \\ \hline
-% \end{NiceTabular}
-%
-%
-% \bigskip
-% However, the vertical rules are not drawn in the blocks (created by |\Block|:
-% cf.~p.~\pageref{Block}) nor in the corners (created by the key |corner|:
-% cf.~p.~\pageref{corners}) nor in the potential exterior rows (created by the
-% keys |first-row| and |last-row|: cf.~p.~\pageref{exterior}).
-%
-% \bigskip
-% If you use \pkg{booktabs} (which provides |\toprule|, |\midrule|,
-% |\bottomrule|, etc.) and if you really want to add vertical rules (which is
-% not in the spirit of \pkg{booktabs}), you should notice that the vertical rules
-% drawn by \pkg{nicematrix} are compatible with \pkg{booktabs}.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
-% $\begin{NiceArray}{~emphase#|cccc|@} \toprule
-% a & b & c & d \\ \midrule
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\ \bottomrule
-% \end{NiceArray}$
-% \end{BVerbatim}
-% $\begin{NiceArray}{|cccc|}
-% \toprule
-% a & b & c & d \\
-% \midrule
-% 1 & 2 & 3 & 4 \\
-% 1 & 2 & 3 & 4 \\
-% \bottomrule
-% \end{NiceArray}$
-%
-% \bigskip
-% However, it's still possible to define a specifier (named, for instance, |I|)
-% to draw vertical rules with the standard behaviour of \pkg{array}.
-%
-% \begin{Verbatim}
-% \newcolumntype{I}{!{\vrule}}
-% \end{Verbatim}
-%
-%
-% \bigskip
-% \subsubsection{The command \textbackslash cline}
-%
-%\label{remark-cline}
-%
-% The horizontal and vertical rules drawn by |\hline| and the specifier
-% ``\verb+|+'' make the array larger or wider by a quantity equal to the width
-% of the rule (with \pkg{array} and also with \pkg{nicematrix}).
-%
-% \smallskip
-% For historical reasons, this is not the case with the command |\cline|, as
-% shown by the following example.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \setlength{\arrayrulewidth}{2pt}
-% \begin{tabular}{cccc} \hline
-% A&B&C&D \\ ~emphase#\cline{2-2}@
-% A&B&C&D \\ \hline
-% \end{tabular}
-% \end{BVerbatim}
-% \begin{scope}
-% \setlength{\arrayrulewidth}{2pt}
-% \begin{tabular}[c]{cccc}
-% \hline
-% A&B&C&D \\
-% \cline{2-2}
-% A&B&C&D \\
-% \hline
-% \end{tabular}
-% \end{scope}
-%
-% \medskip
-% In the environments of \pkg{nicematrix}, this situation is corrected (it's
-% still possible to go to the standard behaviour of |\cline| with the key |standard-cline|).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \setlength{\arrayrulewidth}{2pt}
-% \begin{NiceTabular}{cccc} \hline
-% A&B&C&D \\ ~emphase#\cline{2}@
-% A&B&C&D \\ \hline
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{scope}
-% \setlength{\arrayrulewidth}{2pt}
-% \begin{NiceTabular}[c]{cccc}
-% \hline
-% A&B&C&D \\
-% \cline{2}
-% A&B&C&D \\
-% \hline
-% \end{NiceTabular}
-% \end{scope}
-%
-% \medskip
-% In the environments of \pkg{nicematrix}, an instruction |\cline{|\textsl{\texttt{i}}|}|
-% is equivalent to |\cline{|\textsl{\texttt{i}}|-|\textsl{\texttt{i}}|}|.
-%
-%
-% \subsection{The thickness and the color of the rules}
-%
-% The environments of \pkg{nicematrix} provide a key |rules/width| to set the
-% width (in fact the thickness) of the rules in the current environment. In
-% fact, this key merely sets the value of the length |\arrayrulewidth|.
-%
-% \smallskip
-% It's well known that \pkg{colortbl} provides the command |\arrayrulecolor| in
-% order to specify the color of the rules.
-%
-% \smallskip
-% With \pkg{nicematrix}, it's possible to specify the color of the rules even
-% when \pkg{colortbl} is not loaded. For sake of compatibility, the command is
-% also named |\arrayrulecolor|. The environments of \pkg{nicematrix} also
-% provide a key |rules/color| to fix the color of the rules in the current
-% environment. This key sets the value locally (whereas |\arrayrulecolor| acts
-% globally!).
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \begin{NiceTabular}{|ccc|}[~emphase#rules/color=[gray]{0.9},rules/width=1pt@]
-% \hline
-% rose & tulipe & lys \\
-% arum & iris & violette \\
-% muguet & dahlia & souci \\
-% \hline
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{|ccc|}[rules/color=[gray]{0.9},rules/width=1pt]
-% \hline
-% rose & tulipe & lys \\
-% arum & iris & violette \\
-% muguet & dahlia & souci \\
-% \hline
-% \end{NiceTabular}
-% \end{scope}
-%
-%
-%
-% \subsection{The tools of nicematrix for the rules}
-%
-% Here are the tools provided by \pkg{nicematrix} for the rules.
-% \begin{itemize}
-% \item the keys |hlines|, |vlines|, |hvlines| and |hvlines-except-borders|;
-% \item the specifier ``\verb+|+'' in the preamble (for the environments with
-% preamble);
-% \item the command |\Hline|.
-% \end{itemize}
-%
-% \medskip
-% \textbf{All these tools don't draw the rules in the blocks nor in the
-% empty corners (when the key |corners| is used), nor in the exterior rows and
-% columns.}
-% \begin{itemize}
-% \item These blocks are:
-% \begin{itemize}
-% \item the blocks created by the command |\Block|\footnote{And also the command |\multicolumn| but
-% it's recommended to use instead |\Block| in the environments of
-% \pkg{nicematrix}.} presented
-% p.~\pageref{Block};
-% \item the blocks implicitely delimited by the continuous dotted lines created
-% by |\Cdots|, |\Vdots|, etc. (cf.~p.~\pageref{Cdots}).
-% \end{itemize}
-% \item The corners are created by the key |corners| explained below (see
-% p.~\pageref{corners}).
-% \item For the exterior rows and columns, see~p.~\pageref{exterior}.
-% \end{itemize}
-%
-% In particular, this remark explains the difference between the standard
-% command |\hline| and the command |\Hline| provided by \pkg{nicematrix}.
-%
-% The key |\Hline| takes in an optional argument (between square brackets) which
-% is a list of \textsl{key=value} pairs. For the description of those keys, see
-% |custom-line| on p.~\pageref{custom-line}.
-%
-% \subsubsection{The keys hlines and vlines}
-%
-% The keys |hlines| and |vlines| (which draw, of course, horizontal and vertical
-% rules) take in as value a list of numbers which are the numbers of the rules
-% to draw.\footnote{It's possible to put in that list some intervals of integers
-% with the syntax $i$|-|$j$.}
-%
-% In fact, for the environments with delimiters (such as |{pNiceMatrix}| or
-% |{bNiceArray}|), the key |vlines| don't draw the exterior rules (this is
-% certainly the expected behaviour).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{pNiceMatrix}[~emphase#vlines@,rules/width=0.2pt]
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[vlines,rules/width=0.2pt]
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 1 & 2 & 3 & 4 & 5 & 6
-% \end{pNiceMatrix}$
-%
-%
-%
-% \subsubsection{The keys hvlines and hvlines-except-borders}
-% \label{hvlines}
-%
-% The key |hvlines| (no value) is the conjonction of the keys |hlines| and |vlines|.
-%
-% \smallskip
-% \begin{Verbatim}
-% \setlength{\arrayrulewidth}{1pt}
-% \begin{NiceTabular}{cccc}[~emphase#hvlines@,rules/color=blue]
-% rose & tulipe & marguerite & dahlia \\
-% violette & \Block[draw=red]{2-2}{\LARGE fleurs} & & souci \\
-% pervenche & & & lys \\
-% arum & iris & jacinthe & muguet
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-% \begin{center}
-% \setlength{\arrayrulewidth}{1pt}
-% \begin{NiceTabular}{cccc}[hvlines,rules/color=blue]
-% rose & tulipe & marguerite & dahlia \\
-% violette & \Block[draw=red]{2-2}{\LARGE fleurs} & & souci \\
-% pervenche & & & lys \\
-% arum & iris & jacinthe & muguet
-% \end{NiceTabular}
-% \end{center}
-%
-% \bigskip
-% It's worth noting that, when the key |rounded-corners| is used for the
-% environment |{NiceTabular}|, the key |hvlines| draws rounded corners for the
-% exterior frame of the tabular: cf. part~\ref{tabular-rounded-corners},
-% p.~\pageref{tabular-rounded-corners}.
-%
-% \bigskip
-% The key |hvlines-except-borders| is similar to the key |hvlines| but does not
-% draw the rules on the horizontal and vertical borders of the array. For an
-% example of use of that key, see the part ``Use with tcolorbox'',
-% p.~\pageref{tcolorbox}.
-%
-% \subsubsection{The (empty) corners}
-%
-% \label{corners}
-%
-% The four |corners| of an array will be designed by |NW|, |SW|, |NE| and |SE|
-% (\emph{north west}, \emph{south west}, \emph{north east} and \emph{south east}).
-%
-% For each of these corners, we will call \emph{empty corner} (or simply
-% \emph{corner}) the reunion of all the empty rectangles starting from the cell
-% actually in the corner of the array.\footnote{For sake of completeness, we
-% should also say that a cell contained in a block (even an empty cell) is not
-% taken into account for the determination of the corners. That behaviour is
-% natural. The precise definition of a ``non-empty cell'' is given below (cf.
-% p.~\pageref{empty-cells}).}
-%
-% However, it's possible, for a cell without content, to require \pkg{nicematrix}
-% to consider that cell as not empty with the key |\NotEmpty|.
-%
-%\bigskip
-% \begin{minipage}{9cm}
-% In the example on the right (where B is in the center of a block of size
-% $2\times2$), we have colored in blue the four (empty) corners of the array.
-% \end{minipage}\hspace{2cm}%
-% \begin{NiceTabular}{*{6}{c}}[cell-space-top-limit=3pt]
-% \CodeBefore
-% \rectanglecolor{blue!10}{1-1}{4-2}
-% \rectanglecolor{blue!10}{1-1}{1-4}
-% \rectanglecolor{blue!10}{1-6}{3-6}
-% \rectanglecolor{blue!10}{7-1}{9-1}
-% \rectanglecolor{blue!10}{7-5}{9-6}
-% \Body
-% & & & & A \\
-% & & A & A & A \\
-% & & & A \\
-% & & A & A & A & A \\
-% A & A & A & A & A & A \\
-% A & A & A & A & A & A \\
-% & A & A & A \\
-% & \Block{2-2}{B} & & A \\
-% & & & A \\
-% \end{NiceTabular}
-%
-% \bigskip
-% When the key |corners|\footnote{The key \texttt{corners} that we describe now
-% has no direct link with the key \texttt{rounded-corners} described in the part
-% \ref{tabular-rounded-corners}, p.~\pageref{tabular-rounded-corners}} is used,
-% \pkg{nicematrix} computes the (empty) corners and these corners will be taken
-% into account by the tools for drawing the rules (the rules won't be drawn in
-% the corners).
-%
-% \bigskip
-% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
-% \NiceMatrixOptions{cell-space-top-limit=3pt}
-% \begin{NiceTabular}{*{6}{c}}[~emphase#corners@,hvlines]
-% & & & & A \\
-% & & A & A & A \\
-% & & & A \\
-% & & A & A & A & A \\
-% A & A & A & A & A & A \\
-% A & A & A & A & A & A \\
-% & A & A & A \\
-% & \Block{2-2}{B} & & A \\
-% & & & A \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{*{6}{c}}[corners,hvlines,cell-space-top-limit=3pt]
-% & & & & A \\
-% & & A & A & A \\
-% & & & A \\
-% & & A & A & A & A \\
-% A & A & A & A & A & A \\
-% A & A & A & A & A & A \\
-% & A & A & A \\
-% & \Block{2-2}{B} & & A \\
-% & & & A \\
-% \end{NiceTabular}
-%
-%
-% \bigskip
-% It's also possible to provide to the key |corners| a (comma-separated) list of
-% corners (designed by |NW|, |SW|, |NE| and |SE|).
-%
-% \medskip
-% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
-% \NiceMatrixOptions{cell-space-top-limit=3pt}
-% \begin{NiceTabular}{*{6}{c}}[~emphase#corners=NE@,hvlines]
-% 1\\
-% 1&1\\
-% 1&2&1\\
-% 1&3&3&1\\
-% 1&4&6&4&1\\
-% & & & & &1
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{*{6}{c}}[c,corners=NE,hvlines,cell-space-top-limit=3pt]
-% 1\\
-% 1&1\\
-% 1&2&1\\
-% 1&3&3&1\\
-% 1&4&6&4&1\\
-% & & & & &1
-% \end{NiceTabular}
-%
-%
-% \medskip
-% $\triangleright$ The corners are also taken into account by the tools provided
-% by \pkg{nicematrix} to color cells, rows and columns. These tools don't color
-% the cells which are in the corners (cf.~p.~\pageref{color-in-code-before}).
-%
-% \subsection{The command \textbackslash diagbox}
-%
-% The command |\diagbox| (inspired by the package \pkg{diagbox}), allows, when
-% it is used in a cell, to slash that cell diagonally downwards.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{NiceArray}{*{5}{c}}[hvlines]
-% ~emphase#\diagbox{x}{y}@ & e & a & b & c \\
-% e & e & a & b & c \\
-% a & a & e & c & b \\
-% b & b & c & e & a \\
-% c & c & b & a & e
-% \end{NiceArray}$
-% \end{BVerbatim}
-% $\begin{NiceArray}{*{5}{c}}[hvlines]
-% \diagbox{x}{y} & e & a & b & c \\
-% e & e & a & b & c \\
-% a & a & e & c & b \\
-% b & b & c & e & a \\
-% c & c & b & a & e
-% \end{NiceArray}$
-%
-% \medskip
-% It's possible to use the command |\diagbox| in a |\Block|.
-%
-%
-%
-%
-% \subsection{Commands for customized rules}
-% \label{custom-line}
-%
-% 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 three 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 backslash) of a command that
-% will be created by \pkg{nicematrix} and that will be available for the final
-% user in order to draw horizontal rules (similarly to |\hline|);
-%
-% \item the key |ccommand| is the name (without the backslash) of a command
-% that will be created by \pkg{nicematrix} and that will be available for the
-% final user to order to draw partial horizontal rules (similarly to |\cline|,
-% hence the name |ccommand|): the argument of that command is a list of
-% intervals of columns specified by the syntax~$i$ or $i$-$j$.\footnote{It's
-% recommended to use such commands only once in a row because each use will
-% create space between the rows corresponding to the total width of the rule.}
-%
-% \item the key |letter| takes in as argument a letter\footnote{The following
-% 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}
-%
-% \bigskip
-% We will now speak of the keys which describe the rule itself. Those keys may
-% also be used in the (optional) argument of an individual command |\Hline|.
-%
-% There is three possibilities.
-%
-% \begin{itemize}
-% \item \emph{First possibility}\par\nobreak
-%
-% It's possible to specify composite rules, with a color and a color for the
-% inter-rule space (as possible with \pkg{colortbl} for instance).
-%
-% \begin{itemize}
-% \item the key |multiplicity| is the number of consecutive rules that will be
-% drawn: for instance, a value of $2$ will create double rules such those
-% created by |\hline\hline| or \verb+||+ in the preamble of an environment;
-%
-% \item the key |color| sets the color of the rules ;
-%
-% \item the key |sep-color| sets the color between two successive rules (should be
-% used only in conjonction with |multiplicity|).
-% \end{itemize}
-%
-% \medskip
-% That system may be used, in particular, for the definition of commands and
-% letters to draw rules with a specific color (and those rules will respect the
-% blocks and corners as do all the rules of \pkg{nicematrix}).
-%
-% \medskip
-% \begin{Verbatim}
-% \begin{NiceTabular}{lcIcIc}~emphase#[custom-line = {letter=I, color=blue}]@
-% \hline
-% & \Block{1-3}{dimensions} \\
-% & L & l & h \\
-% \hline
-% Product A & 3 & 1 & 2 \\
-% Product B & 1 & 3 & 4 \\
-% Product C & 5 & 4 & 1 \\
-% \hline
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-%
-% \bigskip
-% \item \emph{Second possibility}\par\nobreak
-%
-% It's possible to use the key |tikz| (if Tikz is loaded). In that case, the
-% rule is drawn directly with Tikz by using as parameters the value of the key
-% |tikz| which must be a list of \textsl{key=value} pairs which may be applied
-% to a Tikz path.
-%
-% 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 |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}
-% \begin{NiceTabular}{lcIcIc}[custom-line = {letter=I, color=blue}]
-% \hline
-% & \Block{1-3}{dimensions} \\
-% & L & l & H \\
-% \hline
-% Product A & 3 & 1 & 2 \\
-% Product B & 1 & 3 & 4 \\
-% Product C & 5 & 4 & 1 \\
-% \hline
-% \end{NiceTabular}
-% \end{center}
-%
-% \bigskip
-% Here is an example with the key |dotted| of Tikz.
-%
-% \begin{BVerbatim}[boxwidth=9cm,baseline=c]
-% \NiceMatrixOptions
-% {
-% custom-line =
-% {
-% letter = I ,
-% ~emphase#tikz = dotted@ ,
-% ~emphase#total-width = \pgflinewidth@
-% }
-% }
-%
-% \begin{NiceTabular}{cIcIc}
-% one & two & three \\
-% four & five & six \\
-% seven & eight & nine
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions
-% {
-% custom-line =
-% {
-% letter = I ,
-% tikz = dotted ,
-% total-width = \pgflinewidth
-% }
-% }
-% \begin{NiceTabular}{cIcIc}
-% one & two & three \\
-% four & five & six \\
-% seven & eight & nine
-% \end{NiceTabular}
-% \end{scope}
-%
-% \bigskip
-% \item \emph{Third possibility} : the key |dotted|
-% \label{dotted}
-%
-% 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 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}).
-%
-% In fact, \pkg{nicematrix} defines by default the commands |\hdottedline| and
-% |\cdottedline |and the letter ``|:|'' for those dotted
-% rules.\footnote{However, it's possible to overwrite those definitions with a
-% |custom-line| (in order, for example, to switch to dashed lines).}
-%
-%\smallskip
-%\begin{BVerbatim}
-%
-% \NiceMatrixOptions % ~textsl#present in nicematrix.sty@
-% {
-% custom-line =
-% {
-% letter = : ,
-% command = hdottedline ,
-% ccommand = cdottedline ,
-% ~emphase#dotted@
-% }
-% }
-% \end{BVerbatim}
-%
-% Thus, it's possible to use the commands |\hdottedline| and |\cdottedline |to
-% draw horizontal dotted rules.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% ~emphase#\hdottedline@
-% 6 & 7 & 8 & 9 & 10 \\
-% ~emphase#\cdottedline{1,4-5}@
-% 11 & 12 & 13 & 14 & 15
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% \hdottedline
-% 6 & 7 & 8 & 9 & 10 \\
-% \cdottedline{1,4-5}
-% 11 & 12 & 13 & 14 & 15
-% \end{pNiceMatrix}$
-%
-%
-% \bigskip
-% In the environments with an explicit preamble (like |{NiceTabular}|,
-% |{NiceArray}|, etc.), it's possible to draw a vertical dotted line with the
-% specifier ``|:|''.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9.5cm]
-% \left(\begin{NiceArray}{cccc~emphase#:@c}
-% 1 & 2 & 3 & 4 & 5 \\
-% 6 & 7 & 8 & 9 & 10 \\
-% 11 & 12 & 13 & 14 & 15
-% \end{NiceArray}\right)
-% \end{BVerbatim}
-% $\left(\begin{NiceArray}{cccc:c}
-% 1 & 2 & 3 & 4 & 5 \\
-% 6 & 7 & 8 & 9 & 10 \\
-% 11 & 12 & 13 & 14 & 15
-% \end{NiceArray}\right)$
-%
-% \end{itemize}
-%
-%
-%
-%\section{The color of the rows and columns}
-%
-% \subsection{Use of colortbl}
-%
-% We recall that the package \pkg{colortbl} can be loaded directly with
-% |\usepackage{colortbl}| or by loading \pkg{xcolor} with the key |table|:
-% |\usepackage[table]{xcolor}|.
-%
-% \medskip
-% Since the package \pkg{nicematrix} is based on \pkg{array}, it's possible to
-% use \pkg{colortbl} with \pkg{nicematrix}.
-%
-% \medskip
-% However, there is two drawbacks:
-% \begin{itemize}
-% \item The package \pkg{colortbl} patches \pkg{array}, leading to some
-% incompatibilities (for instance with the command |\hdotsfor|).
-%
-% \item The package \pkg{colortbl} constructs the array row by row, alterning
-% colored rectangles, rules and contents of the cells. The resulting
-% \textsc{pdf} is difficult to interpret by some \textsc{pdf} viewers and may
-% lead to artefacts on the screen.
-% \begin{itemize}
-% \item Some rules seem to disappear. This is because many PDF viewers give
-% priority to graphical element drawn posteriorly (which is in the spirit of the
-% ``painting model'' of PostScript and PDF). Concerning this problem, MuPDF
-% (which is used, for instance, by SumatraPDF) gives better results than Adobe
-% Reader).
-% \item A thin white line may appear between two cells of the same color. This
-% phenomenon occurs when each cell is colored with its own instruction |fill|
-% (the PostScript operator |fill| noted |f| in PDF). This is the case with
-% \pkg{colortbl}: each cell is colored on its own, even when |\columncolor| or
-% |\rowcolor| is used.
-%
-% As for this phenomenon, Adobe Reader gives better results than MuPDF.
-% \end{itemize}
-%
-% The package \pkg{nicematrix} provides tools to avoid those problems.
-% \end{itemize}
-%
-% \subsection{The tools of nicematrix in the \textbackslash CodeBefore}
-%
-% \label{color-in-code-before}
-%
-% The package \pkg{nicematrix} provides some tools (independent of
-% \pkg{colortbl}) to draw the colored panels first, and, then, the content of
-% the cells and the rules. This strategy is more conform to the ``painting
-% model'' of the formats PostScript and \textsc{pdf} and is more suitable for
-% the \textsc{pdf} viewers. However, it requires several
-% compilations.\footnote{If you use Overleaf, Overleaf will do automatically the
-% right number of compilations.}
-%
-% \medskip
-% The extension \pkg{nicematrix} provides a key |code-before| for some code that
-% will be executed before the drawing of the tabular.
-%
-% \medskip
-% An alternative syntax is provided: it's possible to put the content of that
-% |code-before| between the keywords |\CodeBefore| and |\Body| at the beginning
-% of the environment.
-%
-% \begin{Verbatim}
-% \begin{pNiceArray}{~textsl#preamble@}
-% ~emphase#\CodeBefore [~textsl#options@]@
-% ~textsl#instructions of the code-before@
-% ~emphase#\Body@
-% ~textsl#contents of the environment@
-% \end{pNiceArray}
-% \end{Verbatim}
-%
-% \smallskip
-% The optional argument between square brackets is a list of \textsl{key=value}
-% pairs which will be presented progressively in this
-% documentation.\footnote{The available keys are |create-cell-nodes|,
-% |sub-matrix| (and its subkeys) and \texttt{delimiters-color}.}
-%
-% \medskip
-% New commands are available in that |\CodeBefore|: |\cellcolor|,
-% |\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors|,
-% |\rowlistcolors|, |\chessboardcolors| and |\arraycolor|.\footnote{Remark that,
-% in the |\CodeBefore|, PGF/Tikz nodes of the form ``\verb+(i-|j)+'' are
-% also available to indicate the position to the potential rules:
-% cf.~p.~\pageref{nodes-i}.}
-% \label{code-before}
-%
-% \medskip
-% These commands don't color the cells which are in the ``corners'' if the key
-% |corners| is used. That key has been described p.~\pageref{corners}.
-%
-% \medskip
-% These commands respect the rounded corners if the key |rounded-corners|
-% (described in the part \ref{tabular-rounded-corners} at the
-% page~\pageref{tabular-rounded-corners}) has been used.
-%
-% \medskip
-% All these commands accept an optional argument, between square brackets and
-% in first position. That optional argument may contain two elements (separated
-% by a comma)
-% \begin{itemize}
-% \item the colorimetric space (|RGB|, |rgb|, |HTML|, etc) as specified by the
-% the extension \pkg{xcolor};
-% \item \colorbox{yellow!50}{\textbf{New 6.18}}\par\nobreak
-% a specification of opacity f the form \texttt{opacity = \textsl{value}}.
-% \end{itemize}
-%
-% \bigskip
-%
-% We describe now in detail those commands.
-%
-% \medskip
-% \begin{itemize}
-% \item The command \Definition{\textbackslash cellcolor} takes its name from
-% the command |\cellcolor| of \pkg{colortbl}.
-%
-% This command takes in as mandatory arguments a color and a list of cells, each
-% of which with the format $i$-$j$ where $i$ is the number of the row and $j$ the
-% number of the colummn of the cell. In fact, despite its name, this command may
-% be used to color a whole row (with the syntax $i$-) or a whole column (with the
-% syntax -$j$).
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% ~emphase#\cellcolor[HTML]{FFFF88}{3-1,2-2,-3}@
-% \Body
-% a & b & c \\
-% e & f & g \\
-% h & i & j \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% \cellcolor[HTML]{FFFF88}{3-1,2-2,-3}
-% \Body
-% a & b & c \\
-% e & f & g \\
-% h & i & j \\
-% \end{NiceTabular}
-% \end{scope}
-%
-% \bigskip
-% \item The command \Definition{\textbackslash rectanglecolor} takes three
-% mandatory arguments. The first is the color. The second is the upper-left cell
-% of the rectangle and the third is the lower-right cell of the rectangle.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% ~emphase#\rectanglecolor{blue!15}{2-2}{3-3}@
-% \Body
-% a & b & c \\
-% e & f & g \\
-% h & i & j \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% \rectanglecolor{blue!15}{2-2}{3-3}
-% \Body
-% a & b & c \\
-% e & f & g \\
-% h & i & j \\
-% \end{NiceTabular}
-% \end{scope}
-%
-% \bigskip
-% \item The command \Definition{\textbackslash arraycolor} takes in as mandatory
-% argument a color and color the whole tabular with that color (excepted the
-% potential exterior rows and columns: cf.~p.~\pageref{exterior}). It's only a
-% particular case of |\rectanglecolor|.
-%
-%
-% \bigskip
-% \item The command \Definition{\textbackslash chessboardcolors} takes in as
-% mandatory arguments two colors and it colors the cells of the tabular in
-% quincunx with these colors.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% $\begin{pNiceMatrix}[r,margin]
-% \CodeBefore
-% ~emphase#\chessboardcolors{red!15}{blue!15}@
-% \Body
-% 1 & -1 & 1 \\
-% -1 & 1 & -1 \\
-% 1 & -1 & 1
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[r,baseline=1, margin]
-% \CodeBefore
-% \chessboardcolors{red!15}{blue!15}
-% \Body
-% 1 & -1 & 1 \\
-% -1 & 1 & -1 \\
-% 1 & -1 & 1
-% \end{pNiceMatrix}$
-% \end{scope}
-%
-% \medskip
-% We have used the key |r| which aligns all the columns rightwards (cf.
-% p.~\pageref{columns-width}).
-%
-%
-% \bigskip
-% \item The command \Definition{\textbackslash rowcolor} takes its name from the
-% command |\rowcolor| of \pkg{colortbl}. Its first mandatory argument is the
-% color and the second is a comma-separated list of rows or interval of rows
-% with the form $a$-$b$ (an interval of the form $a$- represent all the rows
-% from the row $a$ until the end).
-%
-% \medskip
-% \begin{scope}
-% \hfuzz = 10cm
-% \begin{BVerbatim}[boxwidth=9cm,baseline=c]
-% $\begin{NiceArray}{lll}[hvlines]
-% \CodeBefore
-% ~emphase#\rowcolor{red!15}{1,3-5,8-}@
-% \Body
-% a_1 & b_1 & c_1 \\
-% a_2 & b_2 & c_2 \\
-% a_3 & b_3 & c_3 \\
-% a_4 & b_4 & c_4 \\
-% a_5 & b_5 & c_5 \\
-% a_6 & b_6 & c_6 \\
-% a_7 & b_7 & c_7 \\
-% a_8 & b_8 & c_8 \\
-% a_9 & b_9 & c_9 \\
-% a_{10} & b_{10} & c_{10} \\
-% \end{NiceArray}$
-% \end{BVerbatim}
-% $\begin{NiceArray}{lll}[baseline=4,hvlines]
-% \CodeBefore
-% \rowcolor{red!15}{1,3-5,8-}
-% \Body
-% a_1 & b_1 & c_1 \\
-% a_2 & b_2 & c_2 \\
-% a_3 & b_3 & c_3 \\
-% a_4 & b_4 & c_4 \\
-% a_5 & b_5 & c_5 \\
-% a_6 & b_6 & c_6 \\
-% a_7 & b_7 & c_7 \\
-% a_8 & b_8 & c_8 \\
-% a_9 & b_9 & c_9 \\
-% a_{10} & b_{10} & c_{10} \\
-% \end{NiceArray}$
-% \end{scope}
-%
-%
-% \bigskip
-% \item The command \Definition{\textbackslash columncolor} takes its name from
-% the command |\columncolor| of \pkg{colortbl}. Its syntax is similar to the
-% syntax of |\rowcolor|.
-%
-% \bigskip
-% \item The command \Definition{\textbackslash rowcolors} (with a \emph{s})
-% takes its name from the command |\rowcolors| of \pkg{colortbl}. The \emph{s}
-% emphasizes the fact that there is \emph{two} colors. This command colors
-% alternately the rows of the tabular with the two colors (provided in second
-% and third argument), beginning with the row whose number is given in first
-% (mandatory) argument.
-%
-% In fact, the first (mandatory) argument is, more generally, a comma separated
-% list of intervals describing the rows involved in the action of |\rowcolors|
-% (an interval of the form $i$|-| describes in fact the interval of all the rows
-% of the tabular, beginning with the row~$i$).
-%
-%
-% \bigskip
-% The last argument of |\rowcolors| is an optional list of pairs
-% \textsl{key=value} (the optional argument in the first position corresponds to
-% the colorimetric space). The available keys are |cols|, |restart| and
-% |respect-blocks|.
-% \begin{itemize}
-% \item The key |cols| describes a set of columns. The command |\rowcolors| will
-% color only the cells of these columns. The value is a comma-separated list of
-% intervals of the form $i$-$j$ (where $i$ or $j$ may be replaced by |*|).
-% \item With the key |restart|, each interval of rows (specified by the first
-% mandatory argument) begins with the same color.\footnote{Otherwise, the color
-% of a given row relies only upon the parity of its absolute number.}
-% \item With the key |respect-blocks| the ``rows'' alternately colored may extend over
-% several rows if they have to incorporate blocks (created with the command
-% |\Block|: cf.~p.~\pageref{Block}).
-% \end{itemize}
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{clr}[hvlines]
-% \CodeBefore
-% ~emphase#\rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]@
-% \Body
-% \Block{1-*}{Results} \\
-% John & 12 \\
-% Stephen & 8 \\
-% Sarah & 18 \\
-% Ashley & 20 \\
-% Henry & 14 \\
-% Madison & 15
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{clr}[hvlines,baseline=2]
-% \CodeBefore
-% \rowcolors[gray]{2}{0.8}{}[cols=2-3,restart]
-% \Body
-% \Block{1-*}{Results} \\
-% \Block{2-1}{A}& John & 12 \\
-% & Stephen & 8 \\
-% \Block{4-1}{B}& Sarah & 18 \\
-% & Ashley & 20 \\
-% & Henry & 14 \\
-% & Madison & 15
-% \end{NiceTabular}
-% \end{scope}
-%
-% \vspace{1cm}
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{NiceTabular}{lr}[hvlines]
-% \CodeBefore
-% ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@
-% \Body
-% \Block{2-1}{John} & 12 \\
-% & 13 \\
-% Steph & 8 \\
-% \Block{3-1}{Sarah} & 18 \\
-% & 17 \\
-% & 15 \\
-% Ashley & 20 \\
-% Henry & 14 \\
-% \Block{2-1}{Madison} & 15 \\
-% & 19
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{lr}[hvlines,baseline=c]
-% \CodeBefore
-% \rowcolors{1}{blue!10}{}[respect-blocks]
-% \Body
-% \Block{2-1}{John} & 12 \\
-% & 13 \\
-% Steph & 8 \\
-% \Block{3-1}{Sarah} & 18 \\
-% & 17 \\
-% & 15 \\
-% Ashley & 20 \\
-% Henry & 14 \\
-% \Block{2-1}{Madison} & 15 \\
-% & 19
-% \end{NiceTabular}
-% \end{scope}
-%
-%
-%
-%
-% \bigskip
-% \item The extension \pkg{nicematrix} provides also a command
-% \Definition{\textbackslash rowlistcolors}. This command generalises the
-% command |\rowcolors|: instead of two successive arguments for the colors, this
-% command takes in an argument which is a (comma-separated) list of colors. In
-% that list, the symbol |=| represent a color identical to the previous one.
-%
-% \smallskip
-% \begin{BVerbatim}[boxwidth=10cm,baseline=c]
-% \begin{NiceTabular}{c}
-% \CodeBefore
-% ~emphase#\rowlistcolors{1}{red!15,blue!15,green!15}@
-% \Body
-% Peter \\
-% James \\
-% Abigail \\
-% Elisabeth \\
-% Claudius \\
-% Jane \\
-% Alexandra \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{c}
-% \CodeBefore
-% \rowlistcolors{1}{red!15,blue!15,green!15}
-% \Body
-% Peter \\
-% James \\
-% Abigail \\
-% Elisabeth \\
-% Claudius \\
-% Jane \\
-% Alexandra \\
-% \end{NiceTabular}
-%
-% \bigskip
-% It's also possible to use in the command |\rowlistcolors| a color series
-% defined by the command |\definecolorseries| of \pkg{xcolor} (and initialized
-% with the command |\resetcolorseries|\footnote{For the initialization, in the
-% following example, you have used the counter |iRow| which, when used in the
-% |\CodeBefore| (and in the |\CodeAfter|) corresponds to the number of rows of
-% the array: cf.~p~\pageref{iRow}. That leads to an adjustement of the gradation
-% of the colors to the size of the tabular.}).
-%
-% \smallskip
-% \begin{BVerbatim}[boxwidth=12.5cm,baseline=c]
-% \begin{NiceTabular}{c}
-% \CodeBefore
-% ~emphase#\definecolorseries{BlueWhite}{rgb}{last}{blue}{white}@
-% ~emphase#\resetcolorseries{\value{iRow}}{BlueWhite}@
-% ~emphase#\rowlistcolors{1}{BlueWhite!!+}@
-% \Body
-% Peter \\
-% James \\
-% Abigail \\
-% Elisabeth \\
-% Claudius \\
-% Jane \\
-% Alexandra \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{c}
-% \CodeBefore
-% \definecolorseries{BlueWhite}{rgb}{last}{blue}{white}
-% \resetcolorseries[\value{iRow}]{BlueWhite}
-% \rowlistcolors{1}{BlueWhite!!+}
-% \Body
-% Peter \\
-% James \\
-% Abigail \\
-% Elisabeth \\
-% Claudius \\
-% Jane \\
-% Alexandra \\
-% \end{NiceTabular}
-% \end{itemize}
-%
-% \vspace{1cm}
-% We recall that all the color commands we have described don't color the cells
-% which are in the ``corners''. In the following example, we use the key
-% |corners| to require the determination of the corner \emph{north east} (NE).
-%
-%\medskip
-% \begin{scope}
-% \hfuzz=11cm
-% \begin{BVerbatim}[boxwidth=9cm,baseline=c]
-% \begin{NiceTabular}{cccccc}[~emphase#corners=NE@,margin,hvlines,first-row,first-col]
-% \CodeBefore
-% ~emphase#\rowlistcolors{1}{blue!15, }@
-% \Body
-% & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
-% 0 & 1 \\
-% 1 & 1 & 1 \\
-% 2 & 1 & 2 & 1 \\
-% 3 & 1 & 3 & 3 & 1 \\
-% 4 & 1 & 4 & 6 & 4 & 1 \\
-% 5 & 1 & 5 & 10 & 10 & 5 & 1 \\
-% 6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccccccc}[corners=NE,margin,hvlines,first-row,first-col]
-% \CodeBefore
-% \rowlistcolors{1}{blue!15, }
-% \Body
-% & 0 & 1 & 2 & 3 & 4 & 5 & 6 \\
-% 0 & 1 \\
-% 1 & 1 & 1 \\
-% 2 & 1 & 2 & 1 \\
-% 3 & 1 & 3 & 3 & 1 \\
-% 4 & 1 & 4 & 6 & 4 & 1 \\
-% 5 & 1 & 5 & 10 & 10 & 5 & 1 \\
-% 6 & 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
-% \end{NiceTabular}
-% \end{scope}
-%
-%
-% \bigskip
-% One should remark that all the previous commands are compatible with the
-% commands of \pkg{booktabs} (|\toprule|, |\midrule|, |\bottomrule|, etc).
-% However, \pkg{booktabs} is \emph{not} loaded by \pkg{nicematrix}.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=10cm
-% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
-% \begin{NiceTabular}[c]{lSSSS}
-% \CodeBefore
-% \rowcolor{red!15}{1-2}
-% \rowcolors{3}{blue!15}{}
-% \Body
-% ~emphase#\toprule@
-% \Block{2-1}{Product} &
-% \Block{1-3}{dimensions (cm)} & & &
-% \Block{2-1}{\rotate Price} \\
-% ~emphase#\cmidrule(rl){2-4}@
-% & L & l & h \\
-% ~emphase#\midrule@
-% small & 3 & 5.5 & 1 & 30 \\
-% standard & 5.5 & 8 & 1.5 & 50.5 \\
-% premium & 8.5 & 10.5 & 2 & 80 \\
-% extra & 8.5 & 10 & 1.5 & 85.5 \\
-% special & 12 & 12 & 0.5 & 70 \\
-% ~emphase#\bottomrule@
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}[c]{lSSSS}
-% \CodeBefore
-% \rowcolor{red!15}{1-2}
-% \rowcolors{3}{blue!15}{}
-% \Body
-% \toprule
-% \Block{2-1}{Product} &
-% \Block{1-3}{dimensions (cm)} & & &
-% \Block{2-1}{\rotate Price} \\
-% \cmidrule(rl){2-4}
-% & L & l & h \\
-% \midrule
-% small & 3 & 5.5 & 1 & 30 \\
-% standard & 5.5 & 8 & 1.5 & 50.5 \\
-% premium & 8.5 & 10.5 & 2 & 80 \\
-% extra & 8.5 & 10 & 1.5 & 85.5 \\
-% special & 12 & 12 & 0.5 & 70 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{scope}
-%
-% \medskip
-% We have used the type of column |S| of \pkg{siunitx}.
-%
-%
-% \subsection{Color tools with the syntax of colortbl}
-%
-% It's possible to access the preceding tools with a syntax close to the syntax
-% of \pkg{colortbl}. For that, one must use the key |colortbl-like| in the
-% current environment.\footnote{Up to now, this key is \emph{not} available in |\NiceMatrixOptions|.}
-%
-% There are three commands available (they are inspired by \pkg{colortbl} but
-% are \emph{independent} of \pkg{colortbl}):
-% \begin{itemize}
-% \item |\cellcolor| which colorizes a cell;\footnote{However, this command
-% |\cellcolor| will delete the following spaces, which does not the command
-% |\cellcolor| of \pkg{colortbl}.}
-% \item |\rowcolor| which must be used in a cell and which colorizes the end of
-% the row;
-% \item |\columncolor| which must be used in the preamble of the environment
-% with the same syntax as the corresponding command of
-% \pkg{colortbl} (however, unlike the command |\columncolor| of \pkg{colortbl},
-% this command |\columncolor| can appear within another command, itself used in the
-% preamble of the array).
-% \end{itemize}
-%
-% \smallskip
-% \begin{Verbatim}
-% \NewDocumentCommand { \Blue } { } { ~emphase#\columncolor{blue!15}@ }
-% \begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc}
-% \toprule
-% ~emphase#\rowcolor{red!15}@
-% Last name & First name & Birth day \\
-% \midrule
-% Achard & Jacques & 5 juin 1962 \\
-% Lefebvre & Mathilde & 23 mai 1988 \\
-% Vanesse & Stephany & 30 octobre 1994 \\
-% Dupont & Chantal & 15 janvier 1998 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-%
-% \begin{center}
-% \NewDocumentCommand { \Blue } { } { \columncolor{blue!15} }
-% \begin{NiceTabular}[colortbl-like]{>{\Blue}c>{\Blue}cc}
-% \toprule
-% \rowcolor{red!15}
-% Last name & First name & Birth day \\
-% \midrule
-% Achard & Jacques & 5 juin 1962 \\
-% Lefebvre & Mathilde & 23 mai 1988 \\
-% Vanesse & Stephany & 30 octobre 1994 \\
-% Dupont & Chantal & 15 janvier 1998 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{center}
-%
-% \section{The command \textbackslash RowStyle}
-%
-% \label{RowStyle}
-%
-% The command |\RowStyle| takes in as argument some formatting intructions that
-% will be applied to each cell on the rest of the current row.
-%
-% \medskip
-% That command also takes in as optional argument (between square brackets)
-% a list of \textsl{key=value} pairs.
-% \begin{itemize}
-% \item The key |nb-rows| sets
-% the number of rows to which the specifications of the current command will
-% apply (with the special value |*|, it will apply to all the following rows).
-% \item The keys |cell-space-top-limit|, |cell-space-bottom-limit| and
-% |cell-space-limits| are available with the same meaning that the corresponding
-% global keys (cf. p.~\pageref{cell-space}).
-% \item The key |rowcolor| sets
-% the color of the background and the key |color| sets the
-% color of the text.\footnote{The key |color| uses the command
-% |\color| but inserts also an instruction |\leavevmode| before. This
-% instruction prevents a extra vertical space in the cells which belong to
-% columns of type |p|, |b|, |m|, |X| and |V| (which start in
-% vertical mode).}
-% \item The key |bold| enforces
-% bold characters for the cells of the row, both in math and text mode.
-% \end{itemize}
-%
-% \medskip
-% \begin{BVerbatim}[boxwidth=12cm,baseline=c]
-% \begin{NiceTabular}{cccc}
-% \hline
-% ~emphase#\RowStyle[cell-space-limits=3pt]{\rotate}@
-% first & second & third & fourth \\
-% ~emphase#\RowStyle[nb-rows=2,rowcolor=blue!50,color=white]{\sffamily}@
-% 1 & 2 & 3 & 4 \\
-% I & II & III & IV
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{cccc}
-% \hline
-% \RowStyle[cell-space-limits=3pt]{\rotate}
-% first & second & third & fourth \\
-% \RowStyle[nb-rows=2,rowcolor=blue!50,color=white]{\sffamily}
-% 1 & 2 & 3 & 4 \\
-% I & II & III & IV \\
-% \end{NiceTabular}
-%
-% \medskip
-% The command |\rotate| is described p.~\pageref{rotate}.
-%
-% \section{The width of the columns}
-% \label{width}
-%
-% \subsection{Basic tools}
-%
-% In the environments with an explicit preamble (like |{NiceTabular}|,
-% |{NiceArray}|, etc.), it's possible to fix the width of a given column with
-% the standard letters |w|, |W|, |p|, |b| and |m| of the package \pkg{array}.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{NiceTabular}{~emphase#W{c}{2cm}@cc}[hvlines]
-% Paris & New York & Madrid \\
-% Berlin & London & Roma \\
-% Rio & Tokyo & Oslo
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{W{c}{2cm}cc}[hvlines]
-% Paris & New York & Madrid \\
-% Berlin & London & Roma \\
-% Rio & Tokyo & Oslo
-% \end{NiceTabular}
-%
-%
-% \bigskip
-% In the environments of \pkg{nicematrix}, it's also possible to fix the \emph{minimal}
-% width of all the columns (excepted the potential exterior columns: cf. p.~\pageref{exterior}) directly
-% with the key |columns-width|.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{pNiceMatrix}[~emphase#columns-width = 1cm@]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[columns-width = 1cm]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-%
-% \medskip
-% Note that the space inserted between two columns (equal to 2 |\tabcolsep| in
-% |{NiceTabular}| and to 2 |\arraycolsep| in the other environments)
-% is not suppressed (of course, it's possible to suppress this space by setting
-% |\tabcolsep| or |\arraycolsep| equal to $0$~pt before the environment).
-%
-% \bigskip
-% It's possible to give the special value |auto| to the option |columns-width|:
-% all the columns of the array will have a width equal to the widest cell of the
-% array.\footnote{The result is achieved with only one compilation (but PGF/Tikz
-% will have written informations in the |aux| file and a message requiring a
-% second compilation will appear).}\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{pNiceMatrix}[~emphase#columns-width = auto@]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[columns-width = auto]
-% 1 & 12 & -123 \\
-% 12 & 0 & 0 \\
-% 4 & 1 & 2
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% Without surprise, it's possible to fix the minimal width of the columns of all
-% the arrays of a current scope with the command
-% |\NiceMatrixOptions|.\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
-% ~emphase#\NiceMatrixOptions{columns-width=10mm}@
-% $\begin{pNiceMatrix}
-% a & b \\ c & d
-% \end{pNiceMatrix}
-% =
-% \begin{pNiceMatrix}
-% 1 & 1245 \\ 345 & 2
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{columns-width=10mm}
-% $\begin{pNiceMatrix}
-% a & b \\
-% c & d
-% \end{pNiceMatrix}
-% =
-% \begin{pNiceMatrix}
-% 1 & 1245 \\
-% 345 & 2
-% \end{pNiceMatrix}$
-% \end{scope}
-%
-%
-% \bigskip
-% But it's also possible to fix a zone where all the matrices will have their
-% columns of the same width, equal to the widest cell of all the matrices. This
-% construction uses the environment |{NiceMatrixBlock}| with the option
-% |auto-columns-width|\footnote{At this time, this is the only usage of the
-% environment |{NiceMatrixBlock}| but it may have other usages in the future.}.
-% The environment |{NiceMatrixBlock}| has no direct link with the command
-% |\Block| presented previously in this document (cf.~p.~\pageref{Block}).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=8.5cm]
-% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
-% $\begin{array}{c}
-% \begin{bNiceMatrix}
-% 9 & 17 \\ -2 & 5
-% \end{bNiceMatrix} \\ \\
-% \begin{bNiceMatrix}
-% 1 & 1245345 \\ 345 & 2
-% \end{bNiceMatrix}
-% \end{array}$
-% ~emphase#\end{NiceMatrixBlock}@
-% \end{BVerbatim}
-% \begin{NiceMatrixBlock}[auto-columns-width]
-% $\begin{array}{c}
-% \begin{bNiceMatrix}
-% 9 & 17 \\ -2 & 5
-% \end{bNiceMatrix} \\ \\
-% \begin{bNiceMatrix}
-% 1 & 1245345 \\ 345 & 2
-% \end{bNiceMatrix}
-% \end{array}$
-% \end{NiceMatrixBlock}
-%
-% \subsection{The columns X}
-%
-% \label{X-columns}
-%
-% The environment |{NiceTabular}| provides |X| columns similar to those provided
-% by the environment |{tabularx}| of the eponymous package.
-%
-% The required width of the tabular may be specified with the key |width| (in
-% |{NiceTabular}| or in |\NiceMatrixOptions|). The initial value of this
-% parameter is |\linewidth| (and not |\textwidth|).
-%
-% For sake of similarity with the environment |{tabularx}|, \pkg{nicematrix}
-% also provides an environment |{NiceTabularX}| with a syntax similar to the
-% syntax of |{tabularx}|, that is to say with a first mandatory argument
-% which is the width of the tabular.\footnote{If \pkg{tabularx} is loaded, one
-% must use |{NiceTabularX}| (and not |{NiceTabular}|) in order to use the
-% columns |X| (this point comes from a conflict in the definitions of the
-% specifier |X|).}
-%
-% As with the packages \pkg{tabu}\footnote{The extension \pkg{tabu} is now
-% considered as deprecated.} and \pkg{tabularray}, the specifier |X| takes
-% in an optional argument (between square brackets) which is a list of keys.
-% \begin{itemize}
-% \item It's possible to give a weight for the column by providing a positive
-% integer directly as argument of the specifier |X|. For example, a column
-% |X[2]| will have a width double of the width of a column~|X| (which has a
-% weight equal to $1$).\footnote{The negative values of the weight, as provided
-% by \pkg{tabu} (which is now obsolete), are \emph{not} supported by \pkg{nicematrix}.
-% If such a value is used, an error will be raised.}
-% \item It's possible to specify an horizontal alignment with one of the
-% letters |l|, |c| and |r| (which insert respectively |\raggedright|,
-% |\centering| and |\raggedleft| followed by |\arraybackslash|).
-% \item It's possible to specify a vertical alignment with one of the keys
-% |t| (alias |p|), |m| and |b| (which construct respectively columns of type
-% |p|, |m| and |b|). The default value is |t|.
-% \end{itemize}
-%
-% \begin{Verbatim}
-% \begin{NiceTabular}~emphase#[width=9cm]{X[2,l]X[l]}@[hvlines]
-% a rather long text which fits on several lines
-% & a rather long text which fits on several lines \\
-% a shorter text & a shorter text
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-% \begin{center}
-% \begin{NiceTabular}[width=9cm]{X[2,l]X[l]}[hvlines]
-% a rather long text which fits on several lines
-% & a rather long text which fits on several lines \\
-% a shorter text & a shorter text
-% \end{NiceTabular}
-% \end{center}
-%
-%
-% \subsection{The columns V of varwidth}
-%
-% \label{varwidth}
-%
-% Let's recall first the behaviour of the environment |{varwidth}| of the
-% eponymous package \pkg{varwidth}. That environment is similar to the classical
-% environment |{minipage}| but the width provided in the argument is only the
-% \emph{maximal} width of the created box. In the general case, the width of the
-% box constructed by an environment |{varwidth}| is the natural width of its
-% contents.
-%
-% \medskip
-% That point is illustrated on the following examples.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=6cm]
-% \fbox{%
-% \begin{~emphase#varwidth@}{8cm}
-% \begin{itemize}
-% \item first item
-% \item second item
-% \end{itemize}
-% \end{~emphase#varwidth@}}
-% \end{BVerbatim}
-% \fbox{\begin{varwidth}{8cm}
-% \begin{itemize}
-% \item first item
-% \item second item
-% \end{itemize}
-% \end{varwidth}}
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=6cm]
-% \fbox{%
-% \begin{~emphase#minipage@}{8cm}
-% \begin{itemize}
-% \item first item
-% \item second item
-% \end{itemize}
-% \end{~emphase#minipage@}}
-% \end{BVerbatim}
-% \fbox{\begin{minipage}{8cm}
-% \begin{itemize}
-% \item first item
-% \item second item
-% \end{itemize}
-% \end{minipage}}
-%
-%
-% \bigskip
-% The package \pkg{varwidth} provides also the column type |V|. A column of type
-% |V{|$\langle$\textsl{dim}$\rangle$|}| encapsulates all its cells in a
-% |{varwidth}| with the argument $\langle$\textsl{dim}$\rangle$ (and does also some tuning).
-%
-% \smallskip
-% When the package \pkg{varwidth} is loaded, the columns |V| of \pkg{varwidth}
-% are supported by \pkg{nicematrix}.
-%
-% \medskip
-% \begin{Verbatim}
-% \begin{NiceTabular}[corners=NW,hvlines]{~emphase#V{3cm}V{3cm}V{3cm}@}
-% & some text & some very very very long text \\
-% some very very very long text \\
-% some very very very long text
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-% \medskip
-% \begin{center}
-% \begin{NiceTabular}[corners=NW,hvlines]{V{3cm}V{3cm}V{3cm}}
-% & some text & some very very very long text \\
-% some very very very long text \\
-% some very very very long text
-% \end{NiceTabular}
-% \end{center}
-%
-% \bigskip
-% Concerning \pkg{nicematrix}, one of the
-% interests of this type of columns is that, for a cell of a column of type~|V|,
-% the PGF/Tikz node created by \pkg{nicematrix} for the content of that cell has
-% a width adjusted to the content of the cell : cf. p.~\pageref{node-V}.
-%
-%
-% \bigskip
-% The columns |V| of \pkg{nicematrix} supports the keys |t|, |p|, |m|, |b|, |l|,
-% |c| and |r| also supported by the columns |X|: see their description in the
-% section~\ref{X-columns}, p.~\pageref{X-columns}.
-%
-% \bigskip
-% One should remark that the extension \pkg{varwidth} (at least in its version
-% 0.92) has some problems: for instance, with LuaLaTeX, it does not work when
-% the content begins with |\color|.
-%
-% \bigskip
-% \section{The exterior rows and columns}
-%
-% The options |first-row|, |last-row|, |first-col| and |last-col| allow the
-% composition of exterior rows and columns in the environments of
-% \pkg{nicematrix}. It's particularly interesting for the (methematical)
-% matrices.
-% \label{exterior}
-%
-% A potential ``first row'' (exterior) has the number $0$ (and not $1$). Idem
-% for the potential ``first column''.
-%
-% \begin{Verbatim}
-% $\begin{pNiceMatrix}[~emphase#first-row,last-row,first-col,last-col@,nullify-dots]
-% & C_1 & \Cdots & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \Cdots & & C_4 &
-% \end{pNiceMatrix}$
-% \end{Verbatim}
-%
-% \[\begin{pNiceMatrix}[first-row,last-row,first-col,last-col,nullify-dots]
-% & C_1 & \Cdots & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \Cdots & & C_4 &
-% \end{pNiceMatrix}\]
-%
-% \medskip
-% The dotted lines have been drawn with the tools presented p.~\pageref{Cdots}.
-%
-% \bigskip
-% We have several remarks to do.
-% \begin{itemize}[beginpenalty=10000]
-% \item For the environments with an explicit preamble (i.e. |{NiceTabular}|,
-% |{NiceArray}| and its variants), no letter must be given in that preamble for
-% the potential first column and the potential last column: they will
-% automatically (and necessarily) be of type |r| for the first column and |l|
-% for the last one.\footnote{The users wishing exterior columns with another
-% type of alignment should consider the command |\SubMatrix| available in the
-% |\CodeAfter| (cf.~p.~\pageref{sub-matrix}).}
-% \item One may wonder how \pkg{nicematrix} determines the number of rows and
-% columns which are needed for the composition of the ``last row'' and ``last
-% column''.
-% \begin{itemize}
-% \item For the environments with explicit preamble, like |{NiceTabular}| and
-% |{pNiceArray}|, the number of columns can obviously be computed from the
-% preamble.
-%
-% \item When the option |light-syntax| (cf. p. \pageref{light-syntax}) is used,
-% \pkg{nicematrix} has, in any case, to load the whole body of the environment
-% (and that's why it's not possible to put verbatim material in the array with
-% the option |light-syntax|). The analysis of this whole body gives the number
-% of rows and the number of columns.
-%
-% \item In the other cases, \pkg{nicematrix} compute the number of rows and
-% columns during the first compilation and write the result in the |aux| file
-% for the next run.
-%
-% \textsl{However, it's possible to provide the number of the last row and the
-% number of the last column as values of the options |last-row| and |last-col|,
-% tending to an acceleration of the whole compilation of the document.} That's
-% what we will do throughout the rest of the document.
-% \end{itemize}
-% \end{itemize}
-%
-% \bigskip
-% It's possible to control the appearance of these rows and columns with options
-% |code-for-first-row|, |code-for-last-row|, |code-for-first-col| and
-% |code-for-last-col|. These options specify tokens that will be inserted before
-% each cell of the corresponding row or column.
-%
-%
-% \begin{Verbatim}
-% \NiceMatrixOptions{~emphase#code-for-first-row@ = \color{red},
-% ~emphase#code-for-first-col@ = \color{blue},
-% ~emphase#code-for-last-row@ = \color{green},
-% ~emphase#code-for-last-col@ = \color{magenta}}
-% $\begin{pNiceArray}{cc|cc}[first-row,last-row=5,first-col,last-col,nullify-dots]
-% & C_1 & \Cdots & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% \hline
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \Cdots & & C_4 &
-% \end{pNiceArray}$
-% \end{Verbatim}
-%
-% \begin{scope}
-% \NiceMatrixOptions{code-for-first-row = \color{red},
-% code-for-first-col = \color{blue},
-% code-for-last-row = \color{green},
-% code-for-last-col = \color{magenta}}
-% \begin{displaymath}
-% \begin{pNiceArray}{cc|cc}[first-row,last-row=5,first-col,last-col,nullify-dots]
-% & C_1 & \multicolumn1c{\Cdots} & & C_4 & \\
-% L_1 & a_{11} & a_{12} & a_{13} & a_{14} & L_1 \\
-% \Vdots & a_{21} & a_{22} & a_{23} & a_{24} & \Vdots \\
-% \hline
-% & a_{31} & a_{32} & a_{33} & a_{34} & \\
-% L_4 & a_{41} & a_{42} & a_{43} & a_{44} & L_4 \\
-% & C_1 & \multicolumn1c{\Cdots} & & C_4 &
-% \end{pNiceArray}
-% \end{displaymath}
-% \end{scope}
-%
-%
-% \emph{Remarks}
-% \begin{itemize}[beginpenalty=10000]
-% \item As shown in the previous example, the horizontal and vertical rules
-% don't extend in the exterior rows and columns. This remark also applies to the
-% customized rules created by the key |custom-line|
-% (cf.~p.~\pageref{custom-line}).
-%
-% \item A specification of color present in |code-for-first-row| also applies to
-% a dotted line drawn in that exterior ``first row'' (excepted if a value has
-% been given to |xdots/color|). Idem for the other exterior rows and columns.
-%
-% \item Logically, the potential option |columns-width| (described
-% p.~\pageref{width}) doesn't apply to the ``first column'' and ``last column''.
-%
-% \item For technical reasons, it's not possible to use the option of the
-% command |\\| after the ``first row'' or before the ``last row''. The placement
-% of the delimiters would be wrong. If you are looking for a workaround,
-% consider the command |\SubMatrix| in the |\CodeAfter| described
-% p.~\pageref{sub-matrix}.
-% \end{itemize}
-%
-%
-%
-%
-%
-% \section{The continuous dotted lines}
-%
-% \label{Cdots}
-% Inside the environments of the package \pkg{nicematrix}, new commands are
-% defined: |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, and |\Iddots|. These commands
-% are intended to be used in place of |\dots|, |\cdots|, |\vdots|, |\ddots| and
-% |\iddots|.\footnote{The command |\iddots|, defined in \pkg{nicematrix}, is a
-% variant of |\ddots| with dots going forward. If |mathdots| is loaded, the
-% version of |mathdots| is used. It corresponds to the command |\adots| of
-% \pkg{unicode-math}.}
-% \newcounter{fniddots}
-% \setcounter{fniddots}{\thefootnote}
-%
-% \smallskip
-% Each of them must be used alone in the cell of the array and it draws a dotted
-% line between the first non-empty cells\footnote{The precise definition of a
-% ``non-empty cell'' is given below (cf. p.~\pageref{empty-cells}).} on both
-% sides of the current cell. Of course, for |\Ldots| and |\Cdots|, it's an
-% horizontal line; for |\Vdots|, it's a vertical line and for |\Ddots| and
-% |\Iddots| diagonal ones. It's possible to change the color of these lines
-% with the option |color|.\footnote{It's also possible to change the color of
-% all these dotted lines with the option |xdots/color| (\textsl{xdots} to
-% remind that it works for |\Cdots|, |\Ldots|, |\Vdots|, etc.): cf. p.
-% \pageref{customisation}.}\par\nobreak
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{bNiceMatrix}
-% a_1 & \Cdots & & & a_1 \\
-% \Vdots & a_2 & \Cdots & & a_2 \\
-% & \Vdots & \Ddots[color=red] \\
-% \\
-% a_1 & a_2 & & & a_n
-% \end{bNiceMatrix}
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}
-% a_1 & \Cdots & & & a_1 \\
-% \Vdots & a_2 & \Cdots & & a_2 \\
-% & \Vdots & \Ddots[color=red] \\
-% \\
-% a_1 & a_2 & & & a_n
-% \end{bNiceMatrix}$
-%
-% \interitem
-% In order to represent the null matrix, one can use the following
-% codage:\par\nobreak
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{bNiceMatrix}
-% 0 & \Cdots & 0 \\
-% \Vdots & & \Vdots \\
-% 0 & \Cdots & 0
-% \end{bNiceMatrix}
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}
-% 0 & \Cdots & 0 \\
-% \Vdots & & \Vdots \\
-% 0 & \Cdots & 0
-% \end{bNiceMatrix}$
-%
-% \bigskip
-% However, one may want a larger matrix. Usually, in such a case, the users of
-% LaTeX add a new row and a new column. It's possible to use the same method
-% with \pkg{nicematrix}:\par\nobreak
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{bNiceMatrix}
-% 0 & \Cdots & \Cdots & 0 \\
-% \Vdots & & & \Vdots \\
-% \Vdots & & & \Vdots \\
-% 0 & \Cdots & \Cdots & 0
-% \end{bNiceMatrix}
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}
-% 0 & \Cdots & \Cdots & 0 \\
-% \Vdots & & & \Vdots \\
-% \Vdots & & & \Vdots \\
-% 0 & \Cdots & \Cdots & 0
-% \end{bNiceMatrix}$
-%
-% \bigskip
-% In the first column of this example, there are two instructions |\Vdots| but,
-% of course, only one dotted line is drawn.
-%
-% \bigskip
-% In fact, in this example, it would be possible to draw the same matrix more
-% easily with the following code:\par\nobreak
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{bNiceMatrix}
-% 0 & \Cdots & & 0 \\
-% \Vdots & & & \\
-% & & & \Vdots \\
-% 0 & & \Cdots & 0
-% \end{bNiceMatrix}
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}
-% 0 & \Cdots & & 0 \\
-% \Vdots & & & \\
-% & & & \Vdots \\
-% 0 & & \Cdots & 0
-% \end{bNiceMatrix}$
-%
-% \bigskip
-% There are also other means to change the size of the matrix. Someone might
-% want to use the optional argument of the command~|\\| for the vertical
-% dimension and a command~|\hspace*| in a cell for the horizontal
-% dimension.\footnote{In \pkg{nicematrix}, one should use |\hspace*| and not
-% |\hspace| for such an usage because \pkg{nicematrix} loads \pkg{array}. One
-% may also remark that it's possible to fix the width of a column by using the
-% environment |{NiceArray}| (or one of its variants) with a column of type~|w|
-% or~|W|: see p.~\pageref{width}}
-%
-% However, a command~|\hspace*| might interfer with the construction of the
-% dotted lines. That's why the package \pkg{nicematrix} provides a
-% command~|\Hspace| which is a variant of |\hspace| transparent for the dotted
-% lines of \pkg{nicematrix}.\par\nobreak
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% \begin{bNiceMatrix}
-% 0 & \Cdots & ~emphase#\Hspace*{1cm}@ & 0 \\
-% \Vdots & & & \Vdots \\~emphase#[1cm]@
-% 0 & \Cdots & & 0
-% \end{bNiceMatrix}
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}
-% 0 & \Cdots & \Hspace*{1cm} & 0 \\
-% \Vdots & & & \Vdots \\[1cm]
-% 0 & \Cdots & & 0
-% \end{bNiceMatrix}$
-%
-% \subsection{The option nullify-dots}
-%
-%
-% Consider the following matrix composed classicaly with the environment
-% |{pmatrix}| of \pkg{amsmath}.\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $A = \begin{pmatrix}
-% h & i & j & k & l & m \\
-% x & & & & & x
-% \end{pmatrix}$
-% \end{BVerbatim}
-% $A = \begin{pmatrix}
-% h & i & j & k & l & m \\
-% x & & & & & x
-% \end{pmatrix}$
-%
-%
-% \bigskip
-% If we add |\ldots| instructions in the second row, the geometry of the
-% matrix is modified.\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $B = \begin{pmatrix}
-% h & i & j & k & l & m \\
-% x & \ldots & \ldots & \ldots & \ldots & x
-% \end{pmatrix}$
-% \end{BVerbatim}
-% $B = \begin{pmatrix}
-% h & i & j & k & l & m \\
-% x & \ldots & \ldots & \ldots & \ldots & x
-% \end{pmatrix}$
-%
-% \bigskip
-% By default, with \pkg{nicematrix}, if we replace |{pmatrix}| by
-% |{pNiceMatrix}| and |\ldots| by |\Ldots|, the geometry of the matrix is not
-% changed.\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $C = \begin{pNiceMatrix}
-% h & i & j & k & l & m \\
-% x & \Ldots & \Ldots & \Ldots & \Ldots & x
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $C = \begin{pNiceMatrix}
-% h & i & j & k & l & m \\
-% x & \Ldots & \Ldots & \Ldots & \Ldots & x
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% However, one may prefer the geometry of the first matrix $A$ and would like to
-% have such a geometry with a dotted line in the second row. It's possible by
-% using the option |nullify-dots| (and only one instruction |\Ldots| is
-% necessary).\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $D = \begin{pNiceMatrix}[~emphase#nullify-dots@]
-% h & i & j & k & l & m \\
-% x & \Ldots & & & & x
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $D = \begin{pNiceMatrix}[nullify-dots]
-% h & i & j & k & l & m \\
-% x & \Ldots & & & & x
-% \end{pNiceMatrix}$
-%
-% \medskip
-% The option |nullify-dots| smashes the instructions |\Ldots| (and the variants)
-% horizontally but also vertically.
-%
-%
-%
-% \subsection{The commands \textbackslash Hdotsfor and \textbackslash Vdotsfor}
-%
-% Some people commonly use the command |\hdotsfor| of \pkg{amsmath} in order to
-% draw horizontal dotted lines in a matrix. In the environments of
-% \pkg{nicematrix}, one should use instead |\Hdotsfor| in order to draw dotted
-% lines similar to the other dotted lines drawn by the package \pkg{nicematrix}.
-%
-% As with the other commands of \pkg{nicematrix} (like |\Cdots|, |\Ldots|,
-% |\Vdots|, etc.), the dotted line drawn with |\Hdotsfor| extends until the
-% contents of the cells on both sides.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=7cm]
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% 1 & ~emphase#\Hdotsfor{3}@ & 5 \\
-% 1 & 2 & 3 & 4 & 5 \\
-% 1 & 2 & 3 & 4 & 5
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% 1 & \Hdotsfor{3} & 5 \\
-% 1 & 2 & 3 & 4 & 5 \\
-% 1 & 2 & 3 & 4 & 5
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% However, if these cells are empty, the dotted line extends only in the cells
-% specified by the argument of |\Hdotsfor| (by design).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=7cm]
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% & ~emphase#\Hdotsfor{3}@ \\
-% 1 & 2 & 3 & 4 & 5 \\
-% 1 & 2 & 3 & 4 & 5
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 \\
-% & \Hdotsfor{3} \\
-% 1 & 2 & 3 & 4 & 5 \\
-% 1 & 2 & 3 & 4 & 5
-% \end{pNiceMatrix}$
-%
-% \medskip
-% Remark: Unlike the command |\hdotsfor| of \pkg{amsmath}, the command
-% |\Hdotsfor| may be used even when the package \pkg{colortbl}\footnote{We
-% recall that when \pkg{xcolor} is loaded with the option |table|, the
-% package \pkg{colortbl} is loaded.} is loaded (but you might have problem if
-% you use |\rowcolor| on the same row as |\Hdotsfor|).
-%
-% \bigskip
-% The package \pkg{nicematrix} also provides a command |\Vdotsfor| similar to
-% |\Hdotsfor| but for the vertical dotted lines.
-% \bigskip
-% The following example uses both |\Hdotsfor| and |\Vdotsfor|:
-%
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% \begin{bNiceMatrix}
-% C[a_1,a_1] & \Cdots & C[a_1,a_n]
-% & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\
-% \Vdots & \Ddots & \Vdots
-% & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\
-% C[a_n,a_1] & \Cdots & C[a_n,a_n]
-% & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\
-% \rule{0pt}{15mm}\NotEmpty & ~emphase#\Vdotsfor{1}@ & & \Ddots & & ~emphase#\Vdotsfor{1}@ \\
-% C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n]
-% & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\
-% \Vdots & \Ddots & \Vdots
-% & ~emphase#\Hdotsfor{1}@ & \Vdots & \Ddots & \Vdots \\
-% C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n]
-% & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}]
-% \end{bNiceMatrix}
-% \end{Verbatim}
-%
-%
-% \[\begin{bNiceMatrix}
-% C[a_1,a_1] & \Cdots & C[a_1,a_n] & \hspace*{20mm} & C[a_1,a_1^{(p)}] & \Cdots & C[a_1,a_n^{(p)}] \\
-% \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\
-% C[a_n,a_1] & \Cdots & C[a_n,a_n] & & C[a_n,a_1^{(p)}] & \Cdots & C[a_n,a_n^{(p)}] \\
-% \rule{0pt}{15mm}\NotEmpty & \Vdotsfor{1} & & \Ddots & & \Vdotsfor{1} \\
-% C[a_1^{(p)},a_1] & \Cdots & C[a_1^{(p)},a_n] & & C[a_1^{(p)},a_1^{(p)}] & \Cdots & C[a_1^{(p)},a_n^{(p)}] \\
-% \Vdots & \Ddots & \Vdots & \Hdotsfor{1} & \Vdots & \Ddots & \Vdots \\
-% C[a_n^{(p)},a_1] & \Cdots & C[a_n^{(p)},a_n] & & C[a_n^{(p)},a_1^{(p)}] & \Cdots & C[a_n^{(p)},a_n^{(p)}]
-% \end{bNiceMatrix}\]
-%
-%
-%
-%
-% \subsection{How to generate the continuous dotted lines transparently}
-%
-% Imagine you have a document with a great number of mathematical matrices with
-% ellipsis. You may wish to use the dotted lines of \pkg{nicematrix} without
-% having to modify the code of each matrix. It's possible with the keys.
-% |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|.}
-%
-% \smallskip
-%
-% \begin{itemize}
-% \item The option |renew-dots|\par\nobreak
-%
-% With this option, the commands |\ldots|, |\cdots|, |\vdots|, |\ddots|,
-% |\iddots|\footnotemark[\thefniddots] and |\hdotsfor| are redefined within the
-% environments provided by \pkg{nicematrix} and behave like |\Ldots|, |\Cdots|,
-% |\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor|; the command |\dots|
-% (``automatic dots'' of |amsmath|) is also redefined to behave like |\Ldots|.
-%
-% \item The option |renew-matrix|\par\nobreak
-%
-% With this option, the environment |{matrix}| is redefined and behave like
-% |{NiceMatrix}|, and so on for the five variants.
-% \end{itemize}
-%
-% \bigskip
-% Therefore, with the keys |renew-dots| and |renew-matrix|, a classical code
-% gives directly the ouput of \pkg{nicematrix}.\par\nobreak
-%
-% \bigskip
-% \begin{scope}
-% \NiceMatrixOptions{renew-dots,renew-matrix}
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% ~emphase#\NiceMatrixOptions{renew-dots,renew-matrix}@
-% \begin{pmatrix}
-% 1 & \cdots & \cdots & 1 \\
-% 0 & \ddots & & \vdots \\
-% \vdots & \ddots & \ddots & \vdots \\
-% 0 & \cdots & 0 & 1
-% \end{pmatrix}
-% \end{BVerbatim}
-% $\begin{pmatrix}
-% 1 & \cdots & \cdots & 1 \\
-% 0 & \ddots & & \vdots \\
-% \vdots & \ddots & \ddots & \vdots \\
-% 0 & \cdots & 0 & 1
-% \end{pmatrix}$
-% \end{scope}
-%
-% \subsection{The labels of the dotted lines}
-%
-% The commands |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor|
-% (and the command |\line| in the |\CodeAfter| which is described
-% p.~\pageref{line-in-code-after}) accept two optional arguments specified
-% by the tokens |_| and |^| for labels positionned below and above the line. The
-% arguments are composed in math mode with |\scriptstyle|.
-%
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{bNiceMatrix}
-% 1 & \hspace*{1cm} & 0 \\[8mm]
-% & ~emphase#\Ddots^{n \text{ times}}@ & \\
-% 0 & & 1
-% \end{bNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}
-% 1 & \hspace*{1cm} & 0 \\[8mm]
-% & \Ddots^{n \text{ times}} & \\
-% 0 & & 1
-% \end{bNiceMatrix}$
-%
-% \subsection{Customisation of the dotted lines}
-%
-% \label{customisation}
-% The dotted lines drawn by |\Ldots|, |\Cdots|, |\Vdots|, |\Ddots|, |\Iddots|,
-% |\Hdotsfor| and |\Vdotsfor| (and by the command |\line| in the |\CodeAfter|
-% which is described p.~\pageref{line-in-code-after}) may be customized by the following
-% options (specified between square brackets after the command):
-% \begin{itemize}
-% \item |color|;
-% \item |radius|;
-% \item |shorten-start|, |shorten-end| and |shorten|;
-% \item |inter|;
-% \item |line-style|.
-% \end{itemize}
-%
-% These options may also be fixed with |\NiceMatrixOptions|, as options of
-% |\CodeAfter| or at the level of a given environment but, in those cases, they
-% must be prefixed by |xdots| (\textsl{xdots} to remind that it works for
-% |\Cdots|, |\Ldots|, |\Vdots|, etc.), and, thus have for names:
-% \begin{itemize}
-% \item |xdots/color|;
-% \item |xdots/radius|;
-% \item |xdots/shorten-start|, |xdots/shorten-end| and |xdots/shorten|;
-% \item |xdots/inter|;
-% \item |xdots/line-style|.
-% \end{itemize}
-%
-% For the clarity of the explanations, we will use those names.
-%
-% \bigskip
-% \textbf{The option xdots/color}\par\nobreak
-%
-% \smallskip
-% The option |xdots/color| fixes the color or the dotted line. However, one should
-% remark that the dotted lines drawn in the exterior rows and columns have a
-% special treatment: cf. p.~\pageref{exterior}.
-%
-% \bigskip
-% \textbf{The option xdots/radius}\par\nobreak
-%
-% The option |radius| fixes the radius of the dots. The initial value is 0.53~pt.
-%
-% \bigskip
-% \textbf{The option xdots/shorten}\par\nobreak
-%
-% \smallskip
-% 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).
-%
-% \bigskip
-% \textbf{The option xdots/inter}\par\nobreak
-%
-% \smallskip
-% The option |xdots/inter| fixes the length between the dots. The initial value
-% is 0.45~em (it is recommanded to use a unit of length dependent of the current
-% font).
-%
-% \bigskip
-% \textbf{The option xdots/line-style}\par\nobreak
-%
-% \smallskip
-% It should be pointed that, by default, the lines drawn by Tikz with the
-% parameter |dotted| are composed of square dots (and not rounded
-% ones).\footnote{The first reason of this behaviour is that the \textsc{pdf}
-% format includes a description for dashed lines. The lines specified with this
-% descriptor are displayed very efficiently by the \textsc{pdf} readers. It's
-% easy, starting from these dashed lines,
-% to create a line composed by square dots whereas a line of rounded dots needs
-% a specification of each dot in the \textsc{pdf} file. Nevertheless, you can
-% have a look at the following page to see how to have dotted rules with rounded
-% dots in Tikz:\newline \small
-% \url{https://tex.stackexchange.com/questions/52848/tikz-line-with-large-dots}}
-%
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \tikz \draw [dotted] (0,0) -- (5,0) ;
-% \end{BVerbatim}
-% \tikz \draw [dotted] (0,0) -- (5,0) ;
-%
-% \medskip
-% In order to provide lines with rounded dots in the style of those provided by
-% |\ldots| (at least with the \emph{Computer Modern} fonts), the package
-% \pkg{nicematrix} embeds its own system to draw a dotted line (and this system
-% uses \textsc{pgf} and not Tikz). This style is called |standard| and that's
-% the initial value of the parameter |xdots/line-style|.
-%
-% However (when Tikz is loaded) it's possible to use for |xdots/line-style| any style
-% provided by Tikz, that is to say any sequence of options provided by Tikz for
-% the Tizk pathes (with the exception of ``|color|'', ``|shorten >|'' and
-% ``|shorten <|'').
-%
-% \medskip
-% Here is for example a tridiagonal matrix with the style |loosely dotted|:\par\nobreak
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c]
-% $\begin{pNiceMatrix}[nullify-dots,~emphase#xdots/line-style=loosely dotted@]
-% a & b & 0 & & \Cdots & 0 \\
-% b & a & b & \Ddots & & \Vdots \\
-% 0 & b & a & \Ddots & & \\
-% & \Ddots & \Ddots & \Ddots & & 0 \\
-% \Vdots & & & & & b \\
-% 0 & \Cdots & & 0 & b & a
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-%
-%
-% \[\begin{pNiceMatrix}[nullify-dots,xdots/line-style=loosely dotted]
-% a & b & 0 & & \Cdots & 0 \\
-% b & a & b & \Ddots & & \Vdots \\
-% 0 & b & a & \Ddots & & \\
-% & \Ddots & \Ddots & \Ddots & & 0 \\
-% \Vdots & & & & & b \\
-% 0 & \Cdots & & 0 & b & a
-% \end{pNiceMatrix}\]
-%
-%
-% \subsection{The dotted lines and the rules}
-%
-% \label{dotted-and-rules}
-%
-% The dotted lines determine virtual blocks which have the same behaviour
-% regarding the rules (the rules specified by the specifier \verb+|+ in the
-% preamble, by the command |\Hline|, by the keys |hlines|, |vlines|,
-% |hvlines| and |hvlines-except-borders| and by the tools created by
-% |custom-line| are not drawn within the
-% blocks).\footnote{On the other side, the command |\line| in the
-% |\CodeAfter| (cf.~p.~\pageref{line-in-code-after}) does \emph{not} create
-% block.}
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{bNiceMatrix}[margin,~emphase#hvlines@]
-% \Block{3-3}<\LARGE>{A} & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% 0 & \Cdots& 0 & 0
-% \end{bNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}[margin,hvlines]
-% \Block{3-3}<\LARGE>{A} & & & 0 \\
-% & \hspace*{1cm} & & \Vdots \\
-% & & & 0 \\
-% 0 & \Cdots& 0 & 0
-% \end{bNiceMatrix}$
-%
-%
-% \section{Delimiters in the preamble of the environnment}
-%
-% \label{delimiters-in-preamble}
-%
-% \colorbox{yellow!50}{\textbf{New 6.16}\enskip}
-% In the environments with preamble (|{NiceArray}|, |{pNiceArray}|, etc.), it's
-% possible to put vertical delimiters directly in the preamble of the
-% environnment.\footnote{This syntax is inspired by the extension \pkg{blkarray}.}
-%
-% \smallskip
-% The opening delimiters should be prefixed by the keyword |\left| and the
-% closing delimiters by the keyword |\right|. It's not mandatory to use
-% |\left| and |\right| pair-wise.
-%
-% \smallskip
-% All the vertical extensible delimiters of LaTeX are allowed.
-%
-% \medskip
-% Here is a example which uses the delimiters |\lgroup| and |\rgroup|.
-%
-% \smallskip
-% \begin{BVerbatim}
-% $\begin{NiceArray}{~emphase#\left\lgroup@ ccc~emphase#\right\rgroup@ l}
-% 1 & 2 & 3 &
-% 4 & 1 & 6 &
-% 7 & 8 & 9 & \scriptstyle L_3 \gets L_3 + L_1 + L_2
-% \end{NiceArray}$
-% \end{BVerbatim}
-%
-% \[\begin{NiceArray}{\left\lgroup ccc\right\rgroup l}
-% 1 & 2 & 3 & \\
-% 4 & 1 & 6 & \\
-% 7 & 8 & 9 & \scriptstyle L_3 \gets L_3 + L_1 + L_2
-% \end{NiceArray}\]
-%
-% \medskip
-% For this example, it would also have been possible to use the environnment
-% |{NiceArrayWithDelims}| (cf. the section \ref{NiceArrayWithDelims},
-% p.~\pageref{NiceArrayWithDelims}) and the key |last-col| (cf. p.~\pageref{exterior}).
-%
-% \bigskip
-% There is a particular case: for the delimiters |(|, |[| and |\{| (and the
-% corresponding closing delimiters), the prefixes |\left| et |\right| are
-% optional.\footnote{For the delimiters |[| and |]|, the prefixes remain mandatory
-% when there is a conflict of notation with the square brackets for the options
-% of some descriptors of columns.}
-%
-%
-%
-% \bigskip
-% When there are two successive delimiters (necessarily a closing one following by
-% an opening one for another submatrix), a space equal to |\enskip| is
-% automatically inserted.
-%
-% \medskip
-% \begin{BVerbatim}
-% $\begin{pNiceArray}{~emphase#(c)(c)(c)@}
-% a_{11} & a_{12} & a_{13} \\
-% a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
-% a_{31} & a_{32} & a_{33}
-% \end{pNiceArray}$
-% \end{BVerbatim}
-%
-% \[\begin{pNiceArray}{(c)(c)(c)}
-% a_{11} & a_{12} & a_{13} \\
-% a_{21} & \displaystyle \int_0^1\dfrac{1}{x^2+1}\,dx & a_{23} \\
-% a_{31} & a_{32} & a_{33}
-% \end{pNiceArray}\]
-%
-%
-% \bigskip
-% For more complex constructions, in particular with delimiters spanning only a
-% \emph{subset} of the rows of the array, one should consider the command
-% |\SubMatrix| available in the |\CodeAfter|. See the section~\ref{sub-matrix},
-% p.~\pageref{sub-matrix}.
-%
-% \section{The \textbackslash CodeAfter}
-%
-% \label{code-after}
-% The option |code-after| may be used to give some code that will be executed
-% \emph{after} the construction of the matrix.\footnote{There is also a key
-% |code-before| described p.~\pageref{code-before}.}
-%
-% \medskip
-% For the legibility of the code, an alternative syntax is provided: it's
-% possible to give the instructions of the |code-after| at the end of the
-% environment, after the keyword |\CodeAfter|. Although |\CodeAfter| is a
-% keyword, it takes in an optional argument (between square
-% brackets).\footnote{Here are the keys accepted in that argument:
-% |delimiters/color|, |rules| and its sub-keys and |sub-matrix| (linked to the
-% command |\SubMatrix|) and its sub-keys.}
-%
-%
-% \medskip
-% The experienced users may, for instance, use the PGF/Tikz nodes created by
-% \pkg{nicematrix} in the |\CodeAfter|. These nodes are described further
-% beginning on p.~\pageref{PGF-nodes}.
-%
-% \medskip
-% Moreover, several special commands are available in the |\CodeAfter|: |line|,
-% |\SubMatrix|, |\OverBrace| and |\UnderBrace|. We will now present these commands.
-%
-% \subsection{The command \textbackslash line in the \textbackslash CodeAfter}
-%
-% \label{line-in-code-after}
-% 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 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
-% adjacent cells.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \NiceMatrixOptions{xdots/shorten = 0.6 em}
-% \begin{pNiceMatrix}
-% I & 0 & \Cdots &0 \\
-% 0 & I & \Ddots &\Vdots\\
-% \Vdots &\Ddots & I &0 \\
-% 0 &\Cdots & 0 &I
-% ~emphase#\CodeAfter \line{2-2}{3-3}@
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% \begin{scope}
-% \NiceMatrixOptions{xdots/shorten = 0.6 em}
-% $\begin{pNiceMatrix}
-% I & 0 & \Cdots &0 \\
-% 0 & I & \Ddots &\Vdots\\
-% \Vdots &\Ddots & I &0 \\
-% 0 &\Cdots & 0 &I
-% \CodeAfter \line{2-2}{3-3}
-% \end{pNiceMatrix}$
-% \end{scope}
-%
-% \bigskip
-% It can also be used to draw a diagonal line not parallel to the other diagonal
-% lines (by default, the dotted lines drawn by |\Ddots| are ``parallelized'':
-% cf.~p.~\pageref{parallelization}).
-%
-% \medskip
-% \begin{BVerbatim}
-% \begin{bNiceMatrix}
-% 1 & \Cdots & & 1 & 2 & \Cdots & 2 \\
-% 0 & \Ddots & & \Vdots & \Vdots & \hspace*{2.5cm} & \Vdots \\
-% \Vdots & \Ddots & & & & & \\
-% 0 & \Cdots & 0 & 1 & 2 & \Cdots & 2
-% ~emphase#\CodeAfter \line[shorten=6pt]{1-5}{4-7}@
-% \end{bNiceMatrix}
-% \end{BVerbatim}
-% \[\begin{bNiceMatrix}
-% 1 & \Cdots & & 1 & 2 & \Cdots & 2 \\
-% 0 & \Ddots & & \Vdots & \Vdots & \hspace*{2.5cm} & \Vdots \\
-% \Vdots & \Ddots & & & & & \\
-% 0 & \Cdots & 0 & 1 & 2 & \Cdots & 2
-% \CodeAfter \line[shorten=6pt]{1-5}{4-7}
-% \end{bNiceMatrix}\]
-%
-%
-%
-%
-% \subsection{The command \textbackslash SubMatrix in the \textbackslash
-% CodeAfter (and the \textbackslash CodeBefore)}
-%
-% \label{sub-matrix}
-%
-% The command |\SubMatrix| provides a way to put delimiters on a portion
-% of the array considered as a submatrix. The command |\SubMatrix| takes in five
-% arguments:
-% \begin{itemize}
-% \item the first argument is the left delimiter, which may be any extensible delimiter
-% provided by LaTeX : |(|, |[|, |\{|, |\langle|, |\lgroup|, |\lfloor|, etc. but also
-% the null delimiter |.|;
-% \item the second argument is the upper-left corner of the submatrix with the
-% syntax $i$|-|$j$ where $i$ the number of row and $j$ the number of column;
-% \item the third argument is the lower-right corner with the same syntax;
-% \item the fourth argument is the right delimiter;
-% \item the last argument, which is optional, is a list of \textsl{key=value}
-% pairs.\footnote{There is no optional argument between square brackets in first
-% position because a square bracket just after |\SubMatrix| must be interpreted
-% as the first (mandatory) argument of the command |\SubMatrix|: that bracket is
-% the left delimiter of the sub-matrix to construct (eg.:
-% |\SubMatrix[{2-2}{4-7}]|).}
-% \end{itemize}
-%
-% One should remark that the command |\SubMatrix| draws the delimiters \emph{after} the
-% construction of the array: no space is inserted by the command |\SubMatrix|
-% itself. That's why, in the following example, we have used the key |margin|
-% and you have added by hand some space between the third and fourth column with
-% |@{\hspace{1.5em}}| in the preamble of the array.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=15cm
-% \fvset{commandchars=\~\#\+}%
-% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
-% \[\begin{NiceArray}{ccc~emphase#@{\hspace{1.5em}}+c}[cell-space-limits=2pt,~emphase#margin+]
-% 1 & 1 & 1 & x \\
-% \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
-% 1 & 2 & 3 & z
-% \CodeAfter
-% ~emphase#\SubMatrix({1-1}{3-3})+
-% ~emphase#\SubMatrix({1-4}{3-4})+
-% \end{NiceArray}\]
-% \end{BVerbatim}
-% \end{scope}
-% $\begin{NiceArray}{ccc@{\hspace{1.5em}}c}[cell-space-limits=2pt,margin]
-% 1 & 1 & 1 & x \\
-% \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
-% 1 & 2 & 3 & z
-% \CodeAfter
-% \SubMatrix({1-1}{3-3})
-% \SubMatrix({1-4}{3-4})
-% \end{NiceArray}$
-%
-% \medskip
-% Eventually, in this example, it would probably have been easier to put the
-% delimiters directly in the preamble of |{NiceArray}| (see
-% section~\ref{delimiters-in-preamble}, p.~\pageref{delimiters-in-preamble})
-% with the following construction.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=15cm
-% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
-% $\begin{NiceArray}{~emphase#(ccc)(c)@}[cell-space-limits=2pt]
-% 1 & 1 & 1 & x \\
-% \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
-% 1 & 2 & 3 & z
-% \end{NiceArray}$
-% \end{BVerbatim}
-% \end{scope}
-% $\begin{NiceArray}{(ccc)(c)}[cell-space-limits=2pt]
-% 1 & 1 & 1 & x \\
-% \dfrac{1}{4} & \dfrac{1}{2} & \dfrac{1}{4} & y \\
-% 1 & 2 & 3 & z
-% \end{NiceArray}$
-%
-% \bigskip
-% In fact, the command |\SubMatrix| also takes in two optional arguments
-% specified by the traditional symbols |^| and |_| for material in superscript
-% and subscript.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=15cm
-% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
-% $\begin{bNiceMatrix}[right-margin=1em]
-% 1 & 1 & 1 \\
-% 1 & a & b \\
-% 1 & c & d
-% \CodeAfter
-% ~emphase#\SubMatrix[{2-2}{3-3}]^{T}@
-% \end{bNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}[right-margin=1em]
-% 1 & 1 & 1 \\
-% 1 & a & b \\
-% 1 & c & d
-% \CodeAfter
-% \SubMatrix[{2-2}{3-3}]^{T}
-% \end{bNiceMatrix}$
-% \end{scope}
-%
-%
-% \bigskip
-% The options of the command |\SubMatrix| are as follows:
-% \begin{itemize}
-% \item \Definition{left-xshift} and \Definition{right-xshift} shift
-% horizontally the delimiters (there exists also the key \Definition{xshift}
-% which fixes both parameters);
-% \item \Definition{extra-height} adds a quantity to the total height of the
-% delimiters (height |\ht| + depth |\dp|);
-% \item \Definition{delimiters/color} fixes the color of the delimiters (also
-% available in |\NiceMatrixOptions|, in the environments with delimiters and as
-% option of the keyword |\CodeAfter|);
-% \item \Definition{slim} is a boolean key: when that key is in force, the horizontal
-% position of the delimiters is computed by using only the contents of the cells
-% of the submatrix whereas, in the general case, the position is computed by
-% taking into account the cells of the whole columns implied in the submatrix
-% (see example below). ;
-% \item \Definition{vlines} contents a list of numbers of vertical rules that
-% will be drawn in the sub-matrix (if this key is used without value, all the
-% vertical rules of the sub-matrix are drawn);
-% \item \Definition{hlines} is similar to |vlines| but for the horizontal rules;
-% \item \Definition{hvlines}, which must be used without value, draws all the
-% vertical and horizontal rules;
-% \item \Definition{code} insert code, especially TikZ code, after the
-% construcion of the submatrix. That key is detailed below.
-% \end{itemize}
-% One should remark that the keys add their rules after the construction of
-% the main matrix: no space is added between the rows and the columns of the
-% array for theses rules.
-%
-% \bigskip
-% All these keys are also available in |\NiceMatrixOptions|, at the level of the
-% environments of \pkg{nicematrix} or as option of the command |\CodeAfter| with
-% the prefix |sub-matrix| which means that their names are therefore
-% |sub-matrix/left-xshift|, |sub-matrix/right-xshift|, |sub-matrix/xshift|, etc.
-%
-% \bigskip
-% \begin{scope}
-% \hfuzz=12cm
-% \fvset{commandchars=\~\#\!}%
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
-% & & \frac12 \\
-% & & \frac14 \\[1mm]
-% a & b & \frac12a+\frac14b \\
-% c & d & \frac12c+\frac14d \\
-% \CodeAfter
-% \SubMatrix({1-3}{2-3})
-% \SubMatrix({3-1}{4-2})
-% \SubMatrix({3-3}{4-3})
-% \end{NiceArray}$
-% \end{BVerbatim}
-% \end{scope}
-% $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
-% & & \frac12 \\
-% & & \frac14 \\[1mm]
-% a & b & \frac12a+\frac14b \\
-% c & d & \frac12c+\frac14d \\
-% \CodeAfter
-% \SubMatrix({1-3}{2-3})
-% \SubMatrix({3-1}{4-2})
-% \SubMatrix({3-3}{4-3})
-% \end{NiceArray}$
-%
-% \medskip
-% Here is the same example with the key |slim| used for one of the submatrices.
-%
-% \medskip
-% \begin{scope}
-% \hfuzz=12cm
-% \fvset{commandchars=\~\#\!}%
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
-% & & \frac12 \\
-% & & \frac14 \\[1mm]
-% a & b & \frac12a+\frac14b \\
-% c & d & \frac12c+\frac14d \\
-% \CodeAfter
-% \SubMatrix({1-3}{2-3})[~emphase#slim!]
-% \SubMatrix({3-1}{4-2})
-% \SubMatrix({3-3}{4-3})
-% \end{NiceArray}$
-% \end{BVerbatim}
-% \end{scope}
-% $\begin{NiceArray}{cc@{\hspace{5mm}}l}[cell-space-limits=2pt]
-% & & \frac12 \\
-% & & \frac14 \\[1mm]
-% a & b & \frac12a+\frac14b \\
-% c & d & \frac12c+\frac14d \\
-% \CodeAfter
-% \SubMatrix({1-3}{2-3})[slim]
-% \SubMatrix({3-1}{4-2})
-% \SubMatrix({3-3}{4-3})
-% \end{NiceArray}$
-%
-%
-% \bigskip
-% There is also a key |name| which gives a name to the submatrix created by
-% |\SubMatrix|. That name is used to create PGF/Tikz nodes: cf
-% p.~\pageref{node-sub-matrix}.
-%
-%
-% \bigskip
-% Despite its name, the command |\SubMatrix| may also be used within a
-% |{NiceTabular}|. Here is an example (which uses |\bottomrule| and
-% |\toprule| of \pkg{booktabs}).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c]
-% \begin{NiceTabular}{~@{}ll~@{}}
-% \toprule
-% Part A & the first part \\
-% \Block{2-1}{Part B} & a first sub-part \\
-% & a second sub-part \\
-% \bottomrule
-% \CodeAfter
-% ~emphase#\SubMatrix{\{}{2-2}{3-2}{.}@
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \hspace{2cm}
-% \begin{NiceTabular}{@{}ll@{}}
-% \toprule
-% Part A & the first part \\
-% \Block{2-1}{Part B} & a first sub-part \\
-% & a second sub-part \\
-% \bottomrule
-% \CodeAfter
-% \SubMatrix{\{}{2-2}{3-2}{.}
-% \end{NiceTabular}
-%
-% \bigskip
-% The command |\SubMatrix| is, in fact, also available in the |\CodeBefore|. By
-% using |\SubMatrix| in the |\CodeBefore|, the delimiters drawn by those
-% commands |\SubMatrix| are taken into account to limit the continuous dotted
-% lines (drawn by |\Cdots|, |\Vdots|, etc.) which have an open extremity.
-%
-% For an example, see voir \ref{submatrix-in-codebefore}
-% p.~\pageref{submatrix-in-codebefore}.
-%
-%
-%
-% \vspace{1cm}
-% \colorbox{yellow!50}{\textbf{New 6.16}}\enskip The key |code| of the command
-% |\SubMatrix| allows the insertion of code after the construction of the
-% submatrix. It's meant to be used to insert TikZ instructions because, in the
-% TikZ instructions inserted by that code, the nodes of the form |i-j| and
-% \verb+i-|j+ are interpreted with |i| and |j| as numbers of row and columns
-% \emph{relative to the submatrix}.\footnote{Be careful: the syntax
-% \verb+j|-i+ is not allowed.}
-%
-% \medskip
-% \begin{scope}
-% \fvset{commandchars=\~\#\!}%
-% \begin{Verbatim}
-% $\begin{NiceArray}{ccc@{}w{c}{5mm}@{}ccc}
-% & & && -1 & 1 & 2 \\
-% & & && 0 & 3 & 4 \\
-% & & && 0 & 0 & 5 \\
-% 1 & 2 & 3 && -1 & 7 & 25 \\
-% 0 & 4 & 5 && 0 & 12 & 41 \\
-% 0 & 0 & 6 && 0 & 0 & 30
-% \CodeAfter
-% ~emphase#\NewDocumentCommand{\MyDraw}{}{\tikz \draw [blue] (2-|1) -| (3-|2) -| (4-|3) ;}!
-% \SubMatrix({1-5}{3-7})[~emphase#code = \MyDraw!]
-% \SubMatrix({4-1}{6-3})[~emphase#code = \MyDraw!]
-% \SubMatrix({4-5}{6-7})[~emphase#code = \MyDraw!]
-% \end{NiceArray}$
-% \end{Verbatim}
-% \end{scope}
-%
-%
-% \[\begin{NiceArray}{ccc@{}w{c}{5mm}@{}ccc}
-% & & && -1 & 1 & 2 \\
-% & & && 0 & 3 & 4 \\
-% & & && 0 & 0 & 5 \\
-% 1 & 2 & 3 && -1 & 7 & 25 \\
-% 0 & 4 & 5 && 0 & 12 & 41 \\
-% 0 & 0 & 6 && 0 & 0 & 30
-% \CodeAfter
-% \NewDocumentCommand{\MyDraw}{}{\tikz \draw [blue] (2-|1) -| (3-|2) -| (4-|3) ;}
-% \SubMatrix({1-5}{3-7})[code = \MyDraw ]
-% \SubMatrix({4-1}{6-3})[code = \MyDraw ]
-% \SubMatrix({4-5}{6-7})[code = \MyDraw ]
-% \end{NiceArray}\]
-%
-% \medskip
-% As we see, the drawing done by our command |\MyDraw| is \emph{relative} to the
-% submatrix to which it is applied.
-%
-% \subsection{The commands \textbackslash OverBrace and \textbackslash
-% UnderBrace in the \textbackslash CodeAfter}
-%
-% The commands |\OverBrace| and |\UnderBrace| provide a way to put
-% horizontal braces on a part of the array. These commands take in three
-% arguments:
-% \begin{itemize}
-% \item the first argument is the upper-left corner of the submatrix with the
-% syntax $i$|-|$j$ where $i$ the number of row and $j$ the number of column;
-% \item the second argument is the lower-right corner with the same syntax;
-% \item the third argument is the label of the brace that will be put by
-% \pkg{nicematrix} (with \textsc{pgf}) above the brace (for the command
-% |\OverBrace|) or under the brace (for |\UnderBrace|).
-% \end{itemize}
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 11 & 12 & 13 & 14 & 15 & 16 \\
-% \CodeAfter
-% ~emphase#\OverBrace{1-1}{2-3}{A}@
-% ~emphase#\OverBrace{1-4}{2-6}{B}@
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 11 & 12 & 13 & 14 & 15 & 16 \\
-% \CodeAfter
-% \OverBrace{1-1}{2-3}{A}
-% \OverBrace{1-4}{2-6}{B}
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% In fact, the commands |\OverBrace| and |\UnderBrace| take in an optional
-% argument (in first position and between square brackets) for a list of
-% \textsl{key=value} pairs. The available keys are:
-% \begin{itemize}
-% \item |left-shorten| and |right-shorten| which do not take in value; when the
-% key |left-shorten| is used, the abscissa of the left extremity of the brace is
-% computed with the contents of the cells of the involved sub-array, otherwise,
-% the position of the potential vertical rule is used (idem for
-% |right-shorten|).
-%
-% \item |shorten|, which is the conjunction of the keys |left-shorten| and
-% |right-shorten|;
-%
-% \item |yshift|, which shifts vertically the brace (and its label) ;
-%
-% \item |color|, which sets the color of the brace (and its label).
-% \end{itemize}
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 11 & 12 & 13 & 14 & 15 & 16 \\
-% \CodeAfter
-% \OverBrace~emphase#[shorten,yshift=3pt]@{1-1}{2-3}{A}
-% \OverBrace~emphase#[shorten,yshift=3pt]@{1-4}{2-6}{B}
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 & 5 & 6 \\
-% 11 & 12 & 13 & 14 & 15 & 16 \\
-% \CodeAfter
-% \OverBrace[shorten,yshift=3pt]{1-1}{2-3}{A}
-% \OverBrace[shorten,yshift=3pt]{1-4}{2-6}{B}
-% \end{pNiceMatrix}$
-%
-%
-%
-% \section{Captions and notes in the tabulars}
-%
-% \label{s:notes}
-%
-% \subsection{Caption of a tabular}
-%
-% \smallskip
-% The environment |{NiceTabular}| provides the keys |caption|, |short-caption|
-% and |label| which may be used when the tabular is inserted in a floating
-% environment (typically the environment |{table}|).
-%
-% \smallskip
-% With the key |caption|, the caption, when it is long, is wrapped at the width
-% of the tabular (excepted the potential exterior columns specified by
-% |first-col| and |last-col|), without the use of the package
-% \pkg{threeparttable} or the package \pkg{floatrow}.
-%
-% \smallskip
-% By default, the caption is composed below the tabular. With the key
-% |caption-above|, available in |\NiceMatrixOptions|, the caption will be
-% composed above de tabular.
-%
-% \smallskip
-% The key |short-caption| corresponds to the optional argument of the clasical
-% command |\caption| and the key |label| corresponds, of course, to the command
-% |\label|.
-%
-% \smallskip
-% See table \ref{t:tabularnote}, p.~\pageref{t:tabularnote} for an example of
-% use the keys |caption| and |label|.
-%
-% \subsection{The footnotes}
-%
-% \smallskip
-% The package \pkg{nicematrix} allows, by using \pkg{footnote} or
-% \pkg{footnotehyper}, the extraction of the notes inserted by |\footnote| in
-% the environments of \pkg{nicematrix} and their composition in the footpage
-% with the other notes of the document.
-%
-% \smallskip
-% If \pkg{nicematrix} is loaded with the option |footnote| (with
-% |\usepackage[footnote]{nicematrix}| or with |\PassOptionsToPackage|), the
-% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
-% extract the footnotes.
-%
-% \smallskip
-% If \pkg{nicematrix} is loaded with the option |footnotehyper|, the package
-% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
-% extract footnotes.
-%
-% \smallskip
-% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
-% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
-% and should be used preferently. The package \pkg{footnote} has some drawbacks,
-% in particular: it must be loaded after the package \pkg{xcolor} and it is not
-% perfectly compatible with \pkg{hyperref}.
-%
-%
-% \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 specified by |first-col| and |last-col|). With no
-% surprise, that command is available only in the environments
-% |{NiceTabular}|, |{NiceTabular*}| and |{NiceTabularX}|.
-%
-% 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
-% at the end of the array with a type of list provided by the package
-% \pkg{enumitem}.
-%
-% \begin{scope}
-% \fvset{commandchars=\~\#\!}
-% \begin{Verbatim}
-% \begin{NiceTabular}{@{}llr@{}}
-% \toprule \RowStyle{\bfseries}
-% Last name & First name & Birth day \\
-% \midrule
-% Achard\tabularnote{~emphase#Achard is an old family of the Poitou.!}
-% & Jacques & 5 juin 1962 \\
-% Lefebvre\tabularnote{~emphase#The name Lefebvre is an alteration of the name Lefebure.!}
-% & Mathilde & 23 mai 1988 \\
-% Vanesse & Stephany & 30 octobre 1994 \\
-% Dupont & Chantal & 15 janvier 1998 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{Verbatim}
-% \end{scope}
-%
-% \begin{center}
-% \begin{NiceTabular}{@{}llr@{}}
-% \toprule \RowStyle{\bfseries}
-% Last name & First name & Birth day \\
-% \midrule
-% Achard\tabularnote{Achard is an old family of the Poitou.}
-% & Jacques & June 5, 2005 \\
-% Lefebvre\tabularnote{The name Lefebvre is an alteration of the name Lefebure.}
-% & Mathilde & January 23, 1975 \\
-% Vanesse & Stephany & October 30, 1994 \\
-% Dupont & Chantal & January 15, 1998 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{center}
-%
-%
-% \bigskip
-% \begin{itemize}
-% \item If you have several successive commands |\tabularnote{...}| \emph{with no
-% space at all between them}, the labels of the corresponding notes are composed
-% together, separated by commas (this is similar to the option |multiple| of
-% \pkg{footmisc} for the footnotes).
-%
-% \item If a command |\tabularnote{...}| is exactly at the end of a cell (with
-% no space at all after), the label of the note is composed in an overlapping
-% position (towards the right). This structure may provide a better alignment of
-% the cells of a given column.
-%
-% \item If the key |notes/para| is used, the notes are composed at the end of
-% the array in a single paragraph (as with the key |para| of \pkg{threeparttable}).
-%
-% \item There is a key |tabularnote| which provides a way to insert some text in
-% the zone of the notes before the numbered tabular notes.
-%
-% An alternative syntaxe is available with the environment |{TabularNote}|. That
-% environment should be used at the end of the environment |{NiceTabular}| (but
-% \emph{before} a potential instruction |\CodeAfter|).
-%
-% \item If the package \pkg{booktabs} has been loaded (before or after
-% \pkg{nicematrix}), the key |notes/bottomrule| draws a |\bottomrule| of
-% \pkg{booktabs} \emph{after} the notes.
-%
-% \item The command |\tabularnote| may be used \emph{before}
-% the environment of \pkg{nicematrix}. Thus, it's possible to use it on the
-% title inserted by |\caption| in an environment |{table}| of LaTeX (or in a
-% command |\captionof| of the package \pkg{caption}). It's also possible, as
-% expected, to use the command |\tabularnote| in the caption provided by the
-% \emph{key} |caption| of the environment |{NiceTabaular}|.
-%
-% 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 control that feature with
-% the key |notes/detect-duplicates|.\footnote{For technical reasons, the final
-% user is not allowed to put several commands |\tabularnote| with exactly the
-% same argument in the caption of the tabular.}
-%
-% \item It's possible to create a reference to a tabular note created by |\tabularnote|
-% (with the usual command |\label| used after the |\tabularnote|).
-% \end{itemize}
-% %
-% For an illustration of some of those remarks, see table
-% \ref{t:tabularnote}, p.~\pageref{t:tabularnote}. This table has been composed
-% with the following code (the package \pkg{caption} has been loaded in this document).
-%
-% \begin{center}
-% \fvset{commandchars=\~\#\!}
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% \begin{table}
-% \centering
-% \NiceMatrixOptions{caption-above}
-% \begin{NiceTabular}{@{}llc@{}
-% [
-% caption = A tabular whose caption has been specified by the key
-% \texttt{caption}~emphase#\tabularnote{It's possible to put a tabular note in the caption}! ,
-% label = t:tabularnote ,
-% tabularnote = Some text before the notes. ,
-% notes/bottomrule
-% ]
-% \toprule
-% Last name & First name & Length of life \\
-% \midrule
-% Churchill & Wiston & 91\\
-% Nightingale~emphase#\tabularnote{Considered as the first nurse of history}!
-% ~emphase#\tabularnote{Nicknamed ``the Lady with the Lamp''.}!
-% & Florence~emphase#\tabularnote{This note is shared by two references.}! & 90 \\
-% Schoelcher & Victor & 89~emphase#\tabularnote{The label of the note is overlapping.}!\\
-% Touchet & Marie~emphase#\tabularnote{This note is shared by two references.}! & 89 \\
-% Wallis & John & 87 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{table}
-% \end{Verbatim}
-% \end{center}
-%
-%
-% \begin{table}[hbt]
-% \centering
-% \NiceMatrixOptions{caption-above}
-% \begin{NiceTabular}{@{}llc@{}}[
-% caption = A tabular whose caption has been specified by the key
-% \texttt{caption}\tabularnote{It's possible to put a tabular note in the caption} ,
-% label = t:tabularnote ,
-% tabularnote = Some text before the notes. ,
-% notes/bottomrule
-% ]
-% \toprule
-% Last name & First name & Length of life \\
-% \midrule
-% Churchill & Wiston & 91\\
-% Nightingale\tabularnote{Considered as the first nurse of
-% history.}\tabularnote{Nicknamed ``the Lady with the Lamp''.}
-% & Florence\tabularnote{This note is shared by two references.} & 90 \\
-% Schoelcher & Victor & 89\tabularnote{The label of the note is overlapping.}\\
-% Touchet & Marie\tabularnote{This note is shared by two references.} & 89 \\
-% Wallis & John & 87 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{table}
-%
-%
-%\subsection{Customisation of the tabular notes}
-%
-%
-% The tabular notes can be customized with a set of keys available in
-% |\NiceMatrixOptions|. The name of these keys is prefixed by |notes|.
-% \begin{itemize}
-% \item |notes/para|
-% \item |notes/bottomrule|
-% \item |notes/style|
-% \item |notes/label-in-tabular|
-% \item |notes/label-in-list|
-% \item |notes/enumitem-keys|
-% \item |notes/enumitem-keys-para|
-% \item |notes/code-before|
-% \end{itemize}
-% For sake of commodity, it is also possible to set these keys in
-% |\NiceMatrixOptions| via a key |notes| which takes in as value a list of
-% pairs \textsl{key=value} where the name of the keys need no longer be
-% prefixed by |notes|:
-% \begin{center}
-% \begin{BVerbatim}[formatcom = \small \color{gray}]
-% \NiceMatrixOptions
-% {
-% notes =
-% {
-% bottomrule ,
-% style = ... ,
-% label-in-tabular = ... ,
-% enumitem-keys =
-% {
-% labelsep = ... ,
-% align = ... ,
-% ...
-% }
-% }
-% }
-% \end{BVerbatim}
-% \end{center}
-%
-%
-% \bigskip
-% We detail these keys.
-%
-% \begin{itemize}[itemsep=\medskipamount]
-% \item The key |notes/para| requires the composition of the notes (at the end of
-% the tabular) in a single paragraph.
-%
-% Initial value: |false|
-%
-% That key is also available within a given environment.
-%
-% \item The key |notes/bottomrule| adds a |\bottomrule| of \pkg{booktabs}
-% \emph{after} the notes. Of course, that rule is drawn only if there is really
-% notes in the tabular. The package \pkg{booktabs} must have been loaded (before
-% or after the package \pkg{nicematrix}). If it is not, an error is raised.
-%
-% Initial value: |false|
-%
-% That key is also available within a given environment.
-%
-% \item The key |notes/style| is a command whose argument is specified by |#1|
-% and which gives the style of numerotation of the notes. That style will be
-% used by |\ref| when referencing a tabular note marked with a command |\label|.
-% The labels formatted by that style are used, separated by commas, when the user
-% puts several consecutive commands |\tabularnote|. The marker |#1| is meant to
-% be the name of a LaTeX counter.
-%
-% Initial value: |\textit{\alph{#1}}|
-%
-% Another possible value should be a mere |\arabic{#1}|
-%
-% \item The key |notes/label-in-tabular| is a command whose argument is
-% specified by |#1| which is used when formatting the label of a note in the
-% tabular. Internally, this number of note has already been formatted by
-% |notes/style| before sent to that command.
-%
-% Initial value: |\textsuperscript{#1}|
-%
-% In French, it's a tradition of putting a small space before the label of note.
-% That tuning could be acheived by the following code:
-% %
-% \begin{Verbatim}
-% \NiceMatrixOptions{notes/label-in-tabular = \,\textsuperscript{~#1}}
-% \end{Verbatim}
-%
-%
-% \item The key |notes/label-in-list| is a command whose argument is specified
-% by |#1| which is used when formatting the label in the list of notes at the
-% end of the tabular. Internally, this number of note has already been formatted by
-% |notes/style| before sent to that command.
-%
-% Initial value: |\textsuperscript{#1}|
-%
-% In French, the labels of notes are not composed in upper position when
-% composing the notes. Such behaviour could be acheived by:
-% \begin{Verbatim}
-% \NiceMatrixOptions{notes/label-in-list = ~#1.\nobreak\hspace{0.25em}}
-% \end{Verbatim}
-% The command |\nobreak| is for the event that the option |para| is used.
-%
-%
-% \item The notes are composed at the end of the tabular by using internally a
-% style of list of \pkg{enumitem}. This style of list is defined as follows (with, of
-% course, keys of \pkg{enumitem}):
-%
-% |noitemsep , leftmargin = * , align = left , labelsep = 0pt|
-%
-% The specification |align = left| in that style requires a
-% composition of the label leftwards in the box affected to that label.
-% With that tuning, the notes are composed flush left, which is pleasant when
-% composing tabulars in the spirit of \pkg{booktabs} (see for example the
-% table \ref{t:tabularnote}, p.~\pageref{t:tabularnote}).
-%
-% \medskip
-% The key |notes/enumitem-keys| specifies a list of pairs
-% \textsl{key=value} (following the specifications of \pkg{enumitem}) to
-% customize that style of list (it uses internally the command |\setlist*| of
-% \pkg{enumitem}).
-%
-%
-% \item The key |notes/enumitem-keys-para| is similar to the previous one but
-% corresponds to the type of list used when the option |para| is in force. Of
-% course, when the option |para| is used, a list of type |inline| (as called by
-% \pkg{enumitem}) is used and the pairs \textsl{key=value} should correspond to
-% such a list of type |inline|.
-%
-% Initially, the style of list is defined by:\quad
-% |afterlabel = \nobreak, itemjoin = \quad|
-%
-%
-% \item The key |notes/code-before| is a token list inserted by \pkg{nicematrix}
-% just before the composition of the notes at the end of the tabular.
-%
-% Initial value: \textsl{empty}
-%
-% For example, if one wishes to compose all the notes in gray and |\footnotesize|,
-% he should use that key:
-% \begin{Verbatim}
-% \NiceMatrixOptions{notes/code-before = \footnotesize \color{gray}}
-% \end{Verbatim}
-% It's also possible to add |\raggedright| or |\RaggedRight| in that key (|\RaggedRight|
-% is a command of \pkg{ragged2e}).
-%
-% \item The key |notes/detect-duplicates| activates the detection of the commands
-% |\tabularnotes| with the same argument.
-%
-% Initial value : |true|
-% \end{itemize}
-%
-%
-%
-% \bigskip
-% For an example of customisation of the tabular notes, see p.~\pageref{ex:notes}.
-%
-%
-% \subsection{Use of \{NiceTabular\} with threeparttable}
-%
-%
-% If you wish to use the environment |{NiceTabular}|, |{NiceTabular*}|
-% |{NiceTabularX}|in an environment |{threeparttable}| of the eponymous package,
-% you have to patch the environment |{threeparttable}| with the following code
-% (with a version of LaTeX at least 2020/10/01).
-% \begin{Verbatim}[commandchars=\~\#\!]
-% \makeatletter
-% \AddToHook{env/threeparttable/begin}
-% {\TPT at hookin{NiceTabular}\TPT at hookin{NiceTabular*}\TPT at hookin{NiceTabularX}}
-% \makeatother
-% \end{Verbatim}
-%
-% Nevertheless, the use of \pkg{threeparttable} in conjonction with
-% \pkg{nicematrix} seems rather point-less because of the functionalities
-% provided by \pkg{nicematrix}.
-%
-%
-% \section{Other features}
-%
-% \subsection{The key rounded-corners of \{NiceTabular\}}
-%
-% \label{tabular-rounded-corners}
-% \colorbox{yellow!50}{\textbf{New 6.18}}\par\nobreak
-%
-% \smallskip
-% The key |rounded-corners| that we will descrite now has no direct link with
-% the key |corners| (which is used to specify ``empty corners'') described in
-% the part~\ref{corners}, p.~\pageref{corners}.
-%
-% \smallskip
-% The environment |{NiceTabular}| provides also a key |rounded-corners| which
-% specify that the tabular should have rounded corners with a radius equal to
-% the value of that key (the default value is 4~pt\footnote{This value is the
-% initial value of the \emph{rounded corners} of Tikz.}). More precisely, that
-% key has two effects that we describe now.
-% \begin{itemize}
-% \item All the commands for coloring the cells, columns and rows (in the
-% |\CodeBefore| but also directly in the array if the key |colortbl-like| is
-% used) will respect those rounded corners.
-%
-% \item When the key |hvlines| is used, the exterior rules will be drawn with
-% rounded corners.
-% \end{itemize}
-
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{NiceTabular}
-% [hvlines,~emphase#rounded-corners@]
-% {ccc}
-% \CodeBefore
-% \rowcolor{red!15}{1}
-% \Body
-% Last name & First name & Profession \\
-% Arvy & Jacques & Physicist \\
-% Jalon & Amandine & Physicist
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}[hvlines,rounded-corners]
-% \CodeBefore
-% \rowcolor{red!15}{1}
-% \Body
-% Last name & First name & Profession \\
-% Arvy & Jacques & Physicist \\
-% Jalon & Amandine & Physicist
-% \end{NiceTabular}
-%
-%
-% \subsection{Command \textbackslash ShowCellNames}
-%
-% The command |\ShowCellNames|, which may be used in the |\CodeBefore| and in
-% the |\CodeAfter| displays the name (with the form $i$-$j$) of each cell. When
-% used in the |\CodeAfter|, that command applies a semi-transparent white
-% rectangle to fade the array (caution: some \textsc{pdf} readers don't support
-% transparency).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% \begin{NiceTabular}{ccc}[hvlines,cell-space-limits=3pt]
-% \Block{2-2}{} & & test \\
-% & & blabla \\
-% & some text & nothing
-% ~emphase#\CodeAfter \ShowCellNames@
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}[hvlines,cell-space-limits=3pt]
-% \Block{2-2}{} & & test \\
-% & & blabla \\
-% & some text & nothing
-% \CodeAfter \ShowCellNames
-% \end{NiceTabular}
-%
-%
-% \subsection{Use of the column type S of siunitx}
-%
-% If the package \pkg{siunitx} is loaded (before or after \pkg{nicematrix}),
-% it's possible to use the |S| column type of \pkg{siunitx} in the environments
-% of \pkg{nicematrix}. The implementation doesn't use explicitly any private
-% macro of \pkg{siunitx}.
-%
-%
-% \medskip
-% \begin{BVerbatim}[baseline = c, boxwidth = 11cm]
-% $\begin{pNiceArray}{~emphase#S at cW{c}{1cm}c}[nullify-dots,first-row]
-% {C_1} & \Cdots & & C_n \\
-% 2.3 & 0 & \Cdots & 0 \\
-% 12.4 & \Vdots & & \Vdots \\
-% 1.45 \\
-% 7.2 & 0 & \Cdots & 0
-% \end{pNiceArray}$
-% \end{BVerbatim}
-% $\begin{pNiceArray}{ScW{c}{1cm}c}[nullify-dots,first-row]
-% {C_1} & \Cdots & & C_n \\
-% 2.3 & 0 & \Cdots & 0 \\
-% 12.4 & \Vdots & & \Vdots \\
-% 1.45 \\
-% 7.2 & 0 & \Cdots & 0
-% \end{pNiceArray}$
-%
-% \medskip
-% On the other hand, the |d| columns of the package \pkg{dcolumn} are not
-% supported by \pkg{nicematrix}.
-%
-%
-% \subsection{Default column type in \{NiceMatrix\}}
-%
-% \label{columns-width}
-%
-% The environments without preamble (|{NiceMatrix}|, |{pNiceMatrix}|,
-% |{bNiceMatrix}|, etc.) and the commande |\pAutoNiceMatrix| (and its variants)
-% provide an option |columns-type| to specify the type of column which will be
-% used (the initial value is, of course, |c|).
-%
-% The keys |l| and |r| are shortcuts for |columns-type=l| and |columns-type=r|.
-%
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{bNiceMatrix}[r]
-% \cos x & - \sin x \\
-% \sin x & \cos x
-% \end{bNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}[r]
-% \cos x & - \sin x \\
-% \sin x & \cos x
-% \end{bNiceMatrix}$
-%
-% \medskip
-% The key |columns-type| is available in |\NiceMatrixOptions| but with the
-% prefix |matrix|, which means that its name is, within |\NiceMatrixOptions| :
-% |matrix/columns-type|.
-%
-% \subsection{The command \textbackslash rotate}
-%
-% \label{rotate}
-%
-% The package \pkg{nicematrix} provides a command |\rotate|. When used in the
-% beginning of a cell, this command composes the contents of the cell after a
-% rotation of 90° in the direct sens.
-%
-% In the following command, we use that command in the
-% |code-for-first-row|.\footnote{It can also be used in |\RowStyle|
-% (cf.~p.~\pageref{RowStyle}.}
-%
-%\bigskip
-%
-%\begin{BVerbatim}[baseline=c,boxwidth=12cm]
-% \NiceMatrixOptions%
-% {code-for-first-row = \scriptstyle ~emphase#\rotate@ \text{image of },
-% code-for-last-col = \scriptstyle }
-% $A = \begin{pNiceMatrix}[first-row,last-col=4]
-% e_1 & e_2 & e_3 \\
-% 1 & 2 & 3 & e_1 \\
-% 4 & 5 & 6 & e_2 \\
-% 7 & 8 & 9 & e_3
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% \begin{varwidth}{10cm}
-% \NiceMatrixOptions%
-% {code-for-first-row = \scriptstyle\rotate \text{image of },
-% code-for-last-col = \scriptstyle }
-% $ A = \begin{pNiceMatrix}[first-row,last-col=4]
-% e_1 & e_2 & e_3 \\
-% 1 & 2 & 3 & e_1 \\
-% 4 & 5 & 6 & e_2 \\
-% 7 & 8 & 9 & e_3
-% \end{pNiceMatrix}$
-% \end{varwidth}
-%
-% \bigskip
-% If the command |\rotate| is used in the ``last row'' (exterior to the matrix),
-% the corresponding elements are aligned upwards as shown below.
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=12cm]
-% \NiceMatrixOptions%
-% {code-for-last-row = \scriptstyle ~emphase#\rotate@ ,
-% code-for-last-col = \scriptstyle }
-% $A = \begin{pNiceMatrix}[last-row=4,last-col=4]
-% 1 & 2 & 3 & e_1 \\
-% 4 & 5 & 6 & e_2 \\
-% 7 & 8 & 9 & e_3 \\
-% \text{image of } e_1 & e_2 & e_3
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% \begin{varwidth}{10cm}
-% \NiceMatrixOptions%
-% {code-for-last-row = \scriptstyle\rotate ,
-% code-for-last-col = \scriptstyle }%
-% $A = \begin{pNiceMatrix}[last-row=4,last-col=4]
-% 1 & 2 & 3 & e_1 \\
-% 4 & 5 & 6 & e_2 \\
-% 7 & 8 & 9 & e_3 \\
-% \text{image of } e_1 & e_2 & e_3
-% \end{pNiceMatrix}$
-% \end{varwidth}
-%
-%
-%
-% \subsection{The option small}
-%
-% \label{small}
-%
-% With the option |small|, the environments of the package \pkg{nicematrix}
-% are composed in a way similar to the environment |{smallmatrix}| of the
-% package \pkg{amsmath} (and the environments |{psmallmatrix}|,
-% |{bsmallmatrix}|, etc. of the package \pkg{mathtools}).
-%
-% \bigskip
-% \begin{Verbatim}
-% $\begin{bNiceArray}{cccc|c}[~emphase#small@,
-% last-col,
-% code-for-last-col = \scriptscriptstyle,
-% columns-width = 3mm ]
-% 1 & -2 & 3 & 4 & 5 \\
-% 0 & 3 & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
-% 0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3
-% \end{bNiceArray}$
-% \end{Verbatim}
-% %
-% \[\begin{bNiceArray}{cccc|c}[small, last-col,
-% code-for-last-col = \scriptscriptstyle,
-% columns-width=3mm]
-% 1 & -2 & 3 & 4 & 5 \\
-% 0 & 3 & 2 & 1 & 2 & L_2 \gets 2 L_1 - L_2 \\
-% 0 & 1 & 1 & 2 & 3 & L_3 \gets L_1 + L_3
-% \end{bNiceArray}\]
-%
-%
-% \bigskip
-% One should note that the environment |{NiceMatrix}| with the option |small| is
-% not composed \emph{exactly} as the environment |{smallmatrix}|. Indeed, all
-% the environments of \pkg{nicematrix} are constructed upon |{array}| (of the
-% package \pkg{array}) whereas the environment |{smallmatrix}| is constructed
-% directly with an |\halign| of TeX.
-%
-% \medskip
-% In fact, the option |small| corresponds to the following tuning:
-% \begin{itemize}
-% \item the cells of the array are composed with |\scriptstyle|;
-% \item |\arraystretch| is set to $0.47$;
-% \item |\arraycolsep| is set to $1.45$~pt;
-% \item the characteristics of the dotted lines are also modified.
-% \end{itemize}
-%
-% \medskip
-% When the key |small| is in force, some functionalities of \pkg{nicematrix} are
-% no longer available: for example, it's no longer possible to put vertical
-% delimiters directly in the preamble of an environment with preamble (cf.
-% section \ref{delimiters-in-preamble}, p.~\pageref{delimiters-in-preamble}).
-%
-%
-% \subsection{The counters iRow and jCol}
-%
-% \label{iRow}
-%
-% In the cells of the array, it's possible to use the LaTeX counters |iRow| and
-% |jCol| which represent the number of the current row and the number of the
-% current column\footnote{We recall that the exterior ``first row'' (if it
-% exists) has the number~$0$ and that the exterior ``first column'' (if it
-% exists) has also the number~$0$.}. Of course, the user must not change the
-% value of these counters which are used internally by \pkg{nicematrix}.
-%
-% In the |\CodeBefore| (cf. p. \pageref{code-before}) and in the |\CodeAfter|
-% (cf. p. \pageref{code-after}), |iRow| represents the total number of rows
-% (excepted the potential exterior rows) and |jCol| represents the total number
-% of columns (excepted the potential exterior columns).
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{pNiceMatrix}% don't forget the %
-% [first-row,
-% first-col,
-% code-for-first-row = \mathbf{~emphase#\alph{jCol}@} ,
-% code-for-first-col = \mathbf{~emphase#\arabic{iRow}@} ]
-% & & & & \\
-% & 1 & 2 & 3 & 4 \\
-% & 5 & 6 & 7 & 8 \\
-% & 9 & 10 & 11 & 12
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[first-row,
-% first-col,
-% code-for-first-row = \mathbf{\alph{jCol}} ,
-% code-for-first-col = \mathbf{\arabic{iRow}} ]
-% & & & & \\
-% & 1 & 2 & 3 & 4 \\
-% & 5 & 6 & 7 & 8 \\
-% & 9 & 10 & 11 & 12
-% \end{pNiceMatrix}$
-%
-% \medskip
-% If LaTeX counters called |iRow| and |jCol| are defined in the document by
-% packages other than \pkg{nicematrix} (or by the final user), they are shadowed
-% in the environments of \pkg{nicematrix}.
-%
-% \bigskip
-% The package \pkg{nicematrix} also provides commands in order to compose
-% automatically matrices from a general pattern. These commands are
-% |\AutoNiceMatrix|, |\pAutoNiceMatrix|, |\bAutoNiceMatrix|, |\vAutoNiceMatrix|,
-% |\VAutoNiceMatrix| and |\BAutoNiceMatrix|.
-%
-% These commands take in two mandatory arguments. The first is the format of the
-% matrix, with the syntax $n$-$p$ where $n$ is the number of rows and $p$ the
-% number of columns. The second argument is the pattern (it's a list of tokens
-% which are inserted in each cell of the constructed matrix).
-%
-% \medskip
-% \begin{Verbatim}
-% $C = ~emphase#\pAutoNiceMatrix@{3-3}{C_{\arabic{iRow},\arabic{jCol}}}$
-% \end{Verbatim}
-%
-%
-% \[C = \pAutoNiceMatrix{3-3}{C_{\arabic{iRow},\arabic{jCol}}}\]
-%
-%
-% \subsection{The key light-syntax}
-%
-% \label{light-syntax}
-% The option |light-syntax| (inpired by the package \pkg{spalign}) allows the
-% user to compose the arrays with a lighter syntax, which gives a better
-% legibility of the TeX source.
-%
-% When this option is used, one should use the semicolon for the end of a row
-% and spaces or tabulations to separate the columns. However, as usual in the
-% TeX world, the spaces after a control sequence are discarded and the elements
-% between curly braces are considered as a whole.
-%
-%
-% \medskip
-% \begin{scope}
-% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
-% $\begin{bNiceMatrix}[~emphase#light-syntax@,first-row,first-col]
-% {} a b ;
-% a 2\cos a {\cos a + \cos b} ;
-% b \cos a+\cos b { 2 \cos b }
-% \end{bNiceMatrix}$
-% \end{BVerbatim}
-% \end{scope}
-% $\begin{bNiceMatrix}[light-syntax,first-row,first-col]
-% {} a b ;
-% a 2\cos a {\cos a + \cos b} ;
-% b \cos a+\cos b { 2 \cos b }
-% \end{bNiceMatrix}$
-%
-% \medskip
-% It's possible to change the character used to mark the end of rows with the
-% option |end-of-row|. As said before, the initial value is a semicolon.
-%
-% \medskip
-% When the option |light-syntax| is used, it is not possible to put verbatim
-% material (for example with the command |\verb|) in the cells of the
-% array.\footnote{The reason is that, when the option |light-syntax| is used,
-% the whole content of the environment is loaded as a TeX argument to be
-% analyzed. The environment doesn't behave in that case as a standard
-% environment of LaTeX which only put TeX commands before and after the content.}
-%
-%
-% \subsection{Color of the delimiters}
-%
-% For the environments with delimiters (|{pNiceArray}|, |{pNiceMatrix}|, etc.),
-% it's possible to change the color of the delimiters with the key
-% |delimiters/color|.
-%
-% \medskip
-% \begin{BVerbatim}[boxwidth=12cm,baseline=c]
-% $\begin{bNiceMatrix}[delimiters/color=red]
-% 1 & 2 \\
-% 3 & 4
-% \end{bNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{bNiceMatrix}[delimiters/color=red]
-% 1 & 2 \\
-% 3 & 4
-% \end{bNiceMatrix}$
-%
-% \medskip
-% This colour also applies to the delimiters drawn by the command |\SubMatrix|
-% (cf.~p.~\pageref{sub-matrix}).
-%
-% \subsection{The environment \{NiceArrayWithDelims\}}
-%
-% \label{NiceArrayWithDelims}
-%
-% In fact, the environment |{pNiceArray}| and its variants are based upon a
-% more general environment, called |{NiceArrayWithDelims}|. The first two
-% mandatory arguments of this environment are the left and right delimiters used
-% in the construction of the matrix. It's possible to use
-% |{NiceArrayWithDelims}| if we want to use atypical or asymetrical delimiters.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{~emphase#NiceArrayWithDelims@}
-% {\downarrow}{\uparrow}{ccc}[margin]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \end{~emphase#NiceArrayWithDelims@}$
-% \end{BVerbatim}
-% $\begin{NiceArrayWithDelims}
-% {\downarrow}{\uparrow}{ccc}[margin]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \end{NiceArrayWithDelims}$
-%
-% \subsection{The command \textbackslash OnlyMainNiceMatrix}
-%
-% The command |\OnlyMainNiceMatrix| executes its argument only when it is in the
-% main part of the array, that is to say it is not in one of the exterior rows.
-% If it is used outside an environment of \pkg{nicematrix}, that command is no-op.
-%
-% For an example of utilisation, see \url{tex.stackexchange.com/questions/488566}
-%
-% \section{Use of Tikz with nicematrix}
-%
-% \label{name}\label{PGF-nodes}
-%
-% \subsection{The nodes corresponding to the contents of the cells}
-%
-% The package \pkg{nicematrix} creates a PGF/Tikz node\footnote{We recall that Tikz
-% is a layer over PGF. The extension \pkg{nicematrix} loads PGF but does not
-% load Tikz. We speak of PGF/Tikz nodes to emphase the fact that the PGF nodes
-% created by \pkg{nicematrix} may be used with PGF but also with Tikz. The final
-% user will probably prefer to use Tikz rather than PGF.} for each (non-empty) cell
-% of the considered array. These nodes are used to draw the dotted lines between
-% the cells of the matrix (inter alia).
-%
-%
-% \smallskip
-% \textbf{Caution} : By default, no node is created in a empty cell.
-%
-% \smallskip
-% However, it's possible to impose the creation of a node with the command
-% |\NotEmpty|. \footnote{One should note that, with that command, the cell is
-% considered as non-empty, which has consequencies for the continuous dotted
-% lines (cf. p.~\pageref{Cdots}) and the computation of the ``corners''
-% (cf.~p.~\pageref{corners}).}
-%
-% \medskip
-% The nodes of a document must have distinct names. That's why the names of the
-% nodes created by \pkg{nicematrix} contains the number of the current
-% environment. Indeed, the environments of \pkg{nicematrix} are numbered by a
-% internal global counter.
-%
-% \smallskip
-% In the environment with the number $n$, the node of the row $i$ and
-% column~$j$ has for name |nm-|$n$|-|$i$|-|$j$.
-%
-% \smallskip
-% The command |\NiceMatrixLastEnv| provides the number of the last environment
-% of \pkg{nicematrix} (for LaTeX, it's a ``fully expandable'' command and not a
-% counter).
-%
-% \smallskip
-% However, it's advisable to use instead the key |name|. This key gives a name
-% to the current environment. When the environment has a name, the nodes are
-% accessible with the name ``\textsl{name}-$i$-$j$'' where \textsl{name} is the
-% name given to the array and $i$ and $j$ the numbers of row and column. It's
-% possible to use these nodes with \textsc{pgf} but the final user will
-% probably prefer to use Tikz (which is a convenient layer upon \textsc{pgf}).
-% However, one should remind that \pkg{nicematrix} doesn't load Tikz by default.
-% In the following examples, we assume that Tikz has been loaded.
-%
-% \bigskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{pNiceMatrix}[name=~emphase#mymatrix@]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \end{pNiceMatrix}$
-% \tikz[remember picture,overlay]
-% \draw ~emphase#(mymatrix-2-2)@ circle (2mm) ;
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}[name=mymatrix]
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \end{pNiceMatrix}$
-% \tikz[remember picture,overlay]
-% \draw (mymatrix-2-2) circle (2mm) ;
-%
-% \medskip
-% Don't forget the options |remember picture| and |overlay|.
-%
-% \bigskip
-% In the |\CodeAfter|, the things are easier : one must refer to the nodes with
-% the form $i$-$j$ (we don't have to indicate the environment which is of
-% course the current environment).
-%
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \CodeAfter
-% \tikz \draw ~emphase#(2-2)@ circle (2mm) ;
-% \end{pNiceMatrix}$
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 \\
-% 4 & 5 & 6 \\
-% 7 & 8 & 9
-% \CodeAfter
-% \tikz \draw (2-2) circle (2mm) ;
-% \end{pNiceMatrix}$
-%
-% \medskip
-% The nodes of the last column (excepted the potential «last column» specified
-% by |last-col|\footnote{For the exterior columns, cf. part~\ref{exterior},
-% p.~\pageref{exterior}.}) may also be indicated by $i$-|last|. Similarly, the
-% nodes of the last row may be indicated by |last|-$j$.
-%
-% \bigskip
-% In the following example, we have underlined all the nodes of the matrix.
-%
-% \[
-% \NiceMatrixOptions
-% {
-% pgf-node-code =
-% {
-% \pgfsetfillcolor{red!15}%
-% \pgfusepathqfill
-% }
-% }
-% \begin{pNiceMatrix}
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
-%
-%
-% \bigskip
-% \colorbox{yellow!50}{\textbf{New 6.17}}\enskip Since those nodes are PGF
-% nodes, one won't be surprised to learn that they are drawn by using a specific
-% PGF style. That style is called |nicematrix/cell-node| and its definition in
-% the source file |nicematrix.sty| is as follows:
-%
-% \begin{Verbatim}
-% \pgfset
-% {
-% ~emphase#nicematrix / cell-node@ /.style =
-% {
-% inner sep = 0 pt ,
-% minimum width = 0 pt
-% }
-% }
-% \end{Verbatim}
-%
-% The final user may modify that style by changing the values of the keys |text/rotate|,
-% |inner xsep|, |inner ysep|, |inner sep|, |outer xsep|, |outer ysep|, |outer sep|,
-% |minimum width|, |minimum height| and |minimum size|.
-%
-% \medskip
-% For an example of utilisation, see part~\ref{triangular}, p.~\pageref{triangular}.
-%
-%
-% \subsubsection{The key pgf-node-code}
-%
-% \colorbox{yellow!50}{\textbf{New 6.17}}\enskip \textbf{For the experienced
-% users}, \pkg{nicematrix} provides the key |pgf-node-code| which corresponds to
-% some PGF node that will be executed at the creation, by PGF, of the nodes
-% corresponding to the cells of the array. More pricisely, the value given to
-% the key |pgf-node-code| will be passed in the fifth argument of the command
-% |\pgfnode|. That value should contain at least an instruction such as
-% |\pgfusepath|, |\pgfusepathqstroke|, |\pgfusepathqfill|, etc.
-%
-% \subsubsection{The columns V of varwidth}
-%
-% \label{node-V}
-% When the extension \pkg{varwidth} is loaded, the columns of the type |V|
-% defined by \pkg{varwidth} are supported by \pkg{nicematrix}. It may be
-% interessant to notice that, for a cell of a column of type |V|, the PGF/Tikz
-% node created by \pkg{nicematrix} for the content of that cell has a width
-% adjusted to the content of the cell. This is in contrast to the case of the
-% columns of type |p|, |m| or |b| for which the nodes have always a width equal
-% to the width of the column. In the following example, the command |\lipsum| is
-% provided by the eponymous package.
-%
-% \begin{Verbatim}
-% \begin{NiceTabular}{V{10cm}}
-% \bfseries \large
-% Titre \\
-% \lipsum[1][1-4]
-% \CodeAfter
-% \tikz \draw [rounded corners] (1-1) -| (last-|2) -- (last-|1) |- (1-1) ;
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-%
-% \begin{center}
-% \begin{NiceTabular}{V{10cm}}
-% \bfseries \large
-% Titre \\
-% \lipsum[1][1-4]
-% \CodeAfter
-% \tikz \draw [rounded corners] (1-1) -| (last-|2) -- (last-|1) |- (1-1) ;
-% \end{NiceTabular}
-% \end{center}
-%
-% We have used the nodes corresponding to the position of the potential rules,
-% which are described below (cf. p.~\pageref{nodes-i}).
-%
-%
-% \subsection[The medium nodes and the large nodes]{The ``medium nodes'' and the ``large nodes''}
-%
-% In fact, the package \pkg{nicematrix} can create ``extra nodes'': the ``medium
-% nodes'' and the ``large nodes''. The first ones
-% are created with the option |create-medium-nodes| and the second ones with the
-% option |create-large-nodes|.\footnote{There is also an option
-% |create-extra-nodes| which is an alias for the conjonction of
-% |create-medium-nodes| and |create-large-nodes|.}
-%
-% \medskip
-% These nodes are not used by \pkg{nicematrix} by default, and that's why they
-% are not created by default.
-%
-% \medskip
-% The names of the ``medium nodes'' are constructed by adding the suffix
-% ``|-medium|'' to the names of the ``normal nodes''. In the following example,
-% we have underlined the ``medium nodes''. We consider that this example is
-% self-explanatory.
-% \[\begin{pNiceMatrix}[create-medium-nodes]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% [every node/.style = {fill = red!15, inner sep = 0 pt},
-% name suffix = -medium]
-% \node [fit = (1-1)] {} ;
-% \node [fit = (1-2)] {} ;
-% \node [fit = (1-3)] {} ;
-% \node [fit = (2-1)] {} ;
-% \node [fit = (2-2)] {} ;
-% \node [fit = (2-3)] {} ;
-% \node [fit = (3-1)] {} ;
-% \node [fit = (3-2)] {} ;
-% \node [fit = (3-3)] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
-%
-%
-% \medskip
-% The names of the ``large nodes'' are constructed by adding the suffix
-% ``|-large|'' to the names of the ``normal nodes''. In the following example,
-% we have underlined the ``large nodes''. We consider that this example is
-% self-explanatory.\footnote{There is no ``large nodes'' created in the exterior
-% rows and columns (for these rows and columns, cf. p.~\pageref{exterior}).}
-% \[\begin{pNiceMatrix}[create-large-nodes]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% [every node/.style = { inner sep = 0 pt} ,
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
-%
-%
-%
-% \medskip
-% The ``large nodes'' of the first column and last column may appear too small
-% for some usage. That's why it's possible to use the options |left-margin| and
-% |right-margin| to add space on both sides of the array and also space in the
-% ``large nodes'' of the first column and last column. In the following example,
-% we have used the options |left-margin| and |right-margin|.\footnote{The
-% options |left-margin| and |right-margin| take dimensions as values but, if no
-% value is given, the default value is used, which is |\arraycolsep| (by
-% default: 5~pt). There is also an option |margin| to fix both |left-margin| and
-% |right-margin| to the same value.}
-% \[\begin{pNiceMatrix}[create-large-nodes,left-margin,right-margin]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% [every node/.style = {inner sep = 0 pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
-%
-%
-% \medskip
-% It's also possible to add more space on both side of the array with the
-% options |extra-left-margin| and |extra-right-margin|. These margins are not
-% incorporated in the ``large nodes''. It's possible to fix both values with the
-% option |extra-margin| and, in the following example, we use |extra-margin|
-% with the value $3$~pt.
-% \[\begin{pNiceMatrix}[create-large-nodes,left-margin,right-margin,extra-right-margin=3pt,extra-left-margin=3pt]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% [every node/.style = {inner sep = 0 pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c \\
-% a & a & a + b \\
-% a & a & a
-% \end{pNiceMatrix}\]
-%
-%
-%
-% \bigskip
-% \textbf{Be careful} : These nodes are reconstructed from the contents of the
-% contents cells of the array. Usually, they do not correspond to the cells
-% delimited by the rules (if we consider that these rules are drawn).
-%
-% \bigskip
-% \begin{minipage}[c]{7.6cm}
-% Here is an array composed with the following code:
-%
-% \medskip
-% \begin{BVerbatim}
-% \large
-% \begin{NiceTabular}{wl{2cm}ll}[hvlines]
-% fraise & amande & abricot \\
-% prune & pêche & poire \\[1ex]
-% noix & noisette & brugnon
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \end{minipage}
-% \hspace{0.9cm}
-% \begin{scope}
-% \large
-% \begin{NiceTabular}[c]{wl{2cm}ll}[hvlines]
-% fraise & amande & abricot \\
-% prune & pêche & poire \\[1ex]
-% noix & noisette & brugnon
-% \end{NiceTabular}
-% \end{scope}
-%
-% \vspace{1cm}
-% \begin{minipage}[c]{7cm}
-% Here, we have colored all the cells of the array with |\chessboardcolors|.
-% \end{minipage}
-% \hspace{1.5cm}
-% \begin{scope}
-% \large
-% \begin{NiceTabular}[c]{wl{2cm}ll}[hvlines,code-before = \chessboardcolors{red!15}{blue!15}]
-% fraise & amande & abricot \\
-% prune & pêche & poire \\[1ex]
-% noix & noisette & brugnon
-% \end{NiceTabular}
-% \end{scope}
-%
-%
-% \vspace{1cm}
-% \begin{minipage}[c]{7cm}
-% Here are the ``large nodes'' of this array (without use of |margin|
-% nor |extra-margin|).
-% \end{minipage}
-% \hspace{1.5cm}
-% \begin{scope}
-% \large
-% \begin{NiceTabular}[c]{w{l}{2cm}ll}[hvlines,create-large-nodes]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% [every node/.style = {inner sep = 0 pt},
-% name suffix = -large]
-% \node [fit = (1-1),fill = red!15] {} ;
-% \node [fit = (1-3),fill = red!15] {} ;
-% \node [fit = (2-2),fill = red!15] {} ;
-% \node [fit = (3-1),fill = red!15] {} ;
-% \node [fit = (3-3),fill = red!15] {} ;
-% \node [fit = (1-2),fill = blue!15] {} ;
-% \node [fit = (2-1),fill = blue!15] {} ;
-% \node [fit = (2-3),fill = blue!15] {} ;
-% \node [fit = (3-2),fill = blue!15] {} ;
-% \end{tikzpicture}
-% \Body
-% fraise & amande & abricot \\
-% prune & pêche & poire \\[1ex]
-% noix & noisette & brugnon
-% \end{NiceTabular}
-% \end{scope}
-%
-%
-% \vspace{1cm}
-% The nodes we have described are not available by default in the |\CodeBefore|
-% (described p.~\pageref{code-before}).\par\nobreak
-%
-% It's possible to have these nodes available in the |\CodeBefore| by using the
-% key |create-cell-nodes| of the keyword |\CodeBefore| (in that case, the nodes
-% are created first before the construction of the array by using informations
-% written on the |aux| file and created a second time during the contruction of
-% the array itself).
-%
-% \bigskip
-% Here is an example which uses these nodes in the |\CodeAfter|.
-%
-% \begin{center}
-% \fvset{commandchars=\~\#\+}
-% \begin{Verbatim}
-% \begin{NiceArray}{c@{\;}c@{\;}c@{\;}c@{\;}c}[create-medium-nodes]
-% u_1 &-& u_0 &=& r \\
-% u_2 &-& u_1 &=& r \\
-% u_3 &-& u_2 &=& r \\
-% u_4 &-& u_3 &=& r \\
-% \phantom{u_5} & & \phantom{u_4} &\smash{\vdots} & \\
-% u_n &-& u_{n-1} &=& r \\[3pt]
-% \hline
-% u_n &-& u_0 &=& nr \\
-% \CodeAfter
-% \tikz[very thick, red, opacity=0.4, name suffix = -medium]
-% \draw (1-1.north west) -- (2-3.south east)
-% (2-1.north west) -- (3-3.south east)
-% (3-1.north west) -- (4-3.south east)
-% (4-1.north west) -- (5-3.south east)
-% (5-1.north west) -- (6-3.south east) ;
-% \end{NiceArray}
-% \end{Verbatim}
-% \end{center}
-%
-% \[\begin{NiceArray}{c@{\;}c@{\;}c@{\;}c@{\;}c}[create-medium-nodes]
-% u_1 &-& u_0 &=& r \\
-% u_2 &-& u_1 &=& r \\
-% u_3 &-& u_2 &=& r \\
-% u_4 &-& u_3 &=& r \\
-% \phantom{u_5} & & \phantom{u_4} &\smash{\vdots} & \\
-% u_n &-& u_{n-1} &=& r \\[3pt]
-% \hline
-% u_n &-& u_0 &=& nr \\
-% \CodeAfter
-% \tikz[very thick, red, opacity=0.4, name suffix = -medium]
-% \draw (1-1.north west) -- (2-3.south east)
-% (2-1.north west) --(3-3.south east)
-% (3-1.north west) -- (4-3.south east)
-% (4-1.north west) -- (5-3.south east)
-% (5-1.north west) -- (6-3.south east) ;
-% \end{NiceArray}\]
-%
-%
-%
-% \subsection{The nodes which indicate the position of the rules}
-%
-% \label{nodes-i}
-% The package \pkg{nicematrix} creates a PGF/Tikz node merely called $i$ (with
-% the classical prefix) at the intersection of the horizontal rule of number~$i$
-% and the vertical rule of number~$i$ (more specifically the potential position
-% of those rules because maybe there are not actually drawn). The last node has
-% also an alias called |last|. There is also a node called $i$|.5| midway
-% between the node $i$ and the node $i+1$.
-%
-% These nodes are available in the |\CodeBefore| and the |\CodeAfter|.
-%
-% \begin{center}
-% \begin{NiceTabular}{ccc}[hvlines,rules/width=1pt,rules/color=gray]
-% & tulipe & lys \\
-% arum & & violette mauve \\
-% muguet & dahlia
-% \CodeAfter
-% \tiny
-% \begin{tikzpicture}
-% \foreach \i in {1,1.5,2,2.5,3,3.5,4}
-% {
-% \fill [red] (\i) circle (0.5mm) ;
-% \node [red,above right] at (\i) {\i} ;
-% }
-% \end{tikzpicture}
-% \end{NiceTabular}
-% \end{center}
-%
-% \bigskip
-% If we use Tikz (we remind that \pkg{nicematrix} does not load Tikz by default,
-% by only \textsc{pgf}, which is a sub-layer of Tikz), we can access, in the
-% |\CodeAfter| but also in the |\CodeBefore|, to the intersection of the
-% (potential) horizontal rule~$i$ and the (potential) vertical rule~$j$ with the
-% syntax |(|$i$\verb+-|+$j$|)|.
-%
-% \medskip
-% \begin{Verbatim}
-% \begin{NiceMatrix}
-% \CodeBefore
-% ~emphase#\tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ;@
-% \Body
-% 1 \\
-% 1 & 1 \\
-% 1 & 2 & 1 \\
-% 1 & 3 & 3 & 1 \\
-% 1 & 4 & 6 & 4 & 1 \\
-% 1 & 5 & 10 & 10 & 5 & 1 \\
-% 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
-% 1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\
-% 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
-% \end{NiceMatrix}
-% \end{Verbatim}
-% %
-% \[\begin{NiceMatrix}
-% \CodeBefore
-% \tikz \draw [fill=red!15] (7-|4) |- (8-|5) |- (9-|6) |- cycle ;
-% \Body
-% 1 \\
-% 1 & 1 \\
-% 1 & 2 & 1 \\
-% 1 & 3 & 3 & 1 \\
-% 1 & 4 & 6 & 4 & 1 \\
-% 1 & 5 & 10 & 10 & 5 & 1 \\
-% 1 & 6 & 15 & 20 & 15 & 6 & 1 \\
-% 1 & 7 & 21 & 35 & 35 & 21 & 7 & 1 \\
-% 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1
-% \end{NiceMatrix}\]
-%
-%
-% \bigskip
-% The nodes of the form $i$|.5| may be used, for example to cross a row of a
-% matrix (if Tikz is loaded).
-%
-% \smallskip
-% \begin{BVerbatim}[boxwidth=11cm,baseline=c]
-% $\begin{pNiceArray}{ccc|c}
-% 2 & 1 & 3 & 0 \\
-% 3 & 3 & 1 & 0 \\
-% 3 & 3 & 1 & 0
-% \CodeAfter
-% \tikz \draw [red] (~emphase#3.5 at -|1) -- (~emphase#3.5 at -|last) ;
-% \end{pNiceArray}$
-% \end{BVerbatim}
-% $\begin{pNiceArray}{ccc|c}
-% 2 & 1 & 3 & 0 \\
-% 3 & 3 & 1 & 0 \\
-% 3 & 3 & 1 & 0
-% \CodeAfter
-% \tikz \draw [red] (3.5-|1) -- (3.5-|last) ;
-% \end{pNiceArray}$
-%
-% \subsection{The nodes corresponding to the command \textbackslash SubMatrix}
-%
-% \label{node-sub-matrix}
-%
-% The command |\SubMatrix| available in the |\CodeAfter| has been described
-% p.~\pageref{sub-matrix}.
-%
-% \smallskip
-% If a command |\SubMatrix| has been used with the key |name| with an expression
-% such as |name=|\textsl{\ttfamily MyName} three PGF/Tikz nodes are created
-% with the names \textsl{\ttfamily MyName}|-left|, \textsl{\ttfamily MyName} and
-% \textsl{\ttfamily MyName}|-right|.
-%
-% \smallskip
-% The nodes \textsl{\ttfamily MyName}|-left| and \textsl{\ttfamily
-% MyName}|-right| correspond to the delimiters left and right and the node
-% \textsl{\ttfamily MyName} correspond to the submatrix itself.
-%
-% \medskip
-% In the following example, we have highlighted these nodes (the submatrix itself has
-% been created with |\SubMatrix\{{2-2}{3-3}\}|).
-%
-% \[\begin{pNiceMatrix}
-% 121 & 23 & 345 & 345\\
-% 45 & 346 & 863 & 444\\
-% 3462 & 38458 & 34 & 294 \\
-% 34 & 7 & 78 & 309 \\
-% \CodeAfter
-% \SubMatrix\{{2-2}{3-3}\}[name=A]
-% \begin{tikzpicture}
-% [every node/.style = {blend mode = multiply,
-% inner sep = 0 pt}]
-% \node [fit = (A),fill = red!15] {} ;
-% \node [fit = (A-left),fill = blue!15] {} ;
-% \node [fit = (A-right),fill = blue!15] {} ;
-% \end{tikzpicture}
-% \end{pNiceMatrix}\]
-%
-% \section{API for the developpers}
-%
-% The package \pkg{nicematrix} provides two variables which are internal but
-% public\footnote{According to the LaTeX3 conventions,
-% each variable with name beginning with |\g_nicematrix| ou |\l_nicematrix| is
-% public and each variable with name beginning with |\g__nicematrix| or
-% |\l__nicematrix| is private.}:
-% \begin{itemize}
-% \item |\g_nicematrix_code_before_tl| ;
-% \item |\g_nicematrix_code_after_tl|.
-% \end{itemize}
-%
-%
-% \medskip
-% These variables contain the code of what we have called the ``|code-before|''
-% (usually specified at the beginning of the environment with the syntax using
-% the keywords |\CodeBefore| and |\Body|) and the ``|code-after|'' (usually
-% specified at the end of the environment after the keyword |\CodeAfter|). The
-% developper can use them to add code from a cell of the array (the affectation
-% must be global, allowing to exit the cell, which is a TeX group).
-%
-% \medskip
-% One should remark that the use of |\g_nicematrix_code_before_tl| needs one
-% compilation more (because the instructions are written on the |aux| file to be
-% used during the next run).
-%
-% \bigskip
-% \emph{Example} : We want to write a command |\crossbox| to draw a cross in the
-% current cell. This command will take in an optional argument between square
-% brackets for a list of pairs \textsl{key}-\textsl{value} which will be given to
-% Tikz before the drawing.
-%
-% It's possible to program such command |\crossbox| as follows, explicitely
-% using the public variable |\g_nicematrix_code_before_tl|.
-%
-% \begin{scope}
-% \fvset{commandchars=\§\¤\μ}
-% \begin{Verbatim}
-% \ExplSyntaxOn
-% \cs_new_protected:Nn \__pantigny_crossbox:nnn
-% {
-% \tikz \draw [ #3 ]
-% ( #1 -| \int_eval:n { #2 + 1 } ) -- ( \int_eval:n { #1 + 1 } -| #2 )
-% ( #1 -| #2 ) -- ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ;
-% }
-%
-% \NewDocumentCommand \crossbox { ! O { } }
-% {
-% \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ
-% {
-% \__pantigny_crossbox:nnn
-% { \int_use:c { c at iRow } }
-% { \int_use:c { c at jCol } }
-% { \exp_not:n { #1 } }
-% }
-% }
-% \ExplSyntaxOff
-% \end{Verbatim}
-% \end{scope}
-%
-%
-% \ExplSyntaxOn
-% \cs_new_protected:Nn \__pantigny_crossbox:nnn
-% {
-% \tikz \draw [ #3 ]
-% ( #1 -| \int_eval:n { #2 + 1 } ) -- ( \int_eval:n { #1 + 1 } -| #2 )
-% ( #1 -| #2 ) -- ( \int_eval:n { #1 + 1 } -| \int_eval:n { #2 + 1 } ) ;
-% }
-%
-%
-% \NewDocumentCommand \crossbox { ! O { } }
-% {
-% \tl_gput_right:Nx \g_nicematrix_code_before_tl
-% {
-% \__pantigny_crossbox:nnn
-% { \int_use:c { c at iRow } }
-% { \int_use:c { c at jCol } }
-% { \exp_not:n { #1 } }
-% }
-% }
-% \ExplSyntaxOff
-%
-% \bigskip
-% Here is an example of utilisation:
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=9cm]
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% \arraycolor{gray!10}
-% \Body
-% merlan & requin & cabillaud \\
-% baleine & ~emphase#\crossbox[red]@ & morue \\
-% mante & raie & poule
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% \arraycolor{gray!10}
-% \Body
-% merlan & requin & cabillaud \\
-% baleine & \crossbox[red] & morue \\
-% mante & raie & poule
-% \end{NiceTabular}
-%
-%
-%
-% \section{Technical remarks}
-%
-% First remark: the package \pkg{underscore} must be loaded before
-% \pkg{nicematrix}. If it is loaded after, an error will be raised.
-%
-% \subsection{Diagonal lines}
-%
-% \label{parallelization}
-% By default, all the diagonal lines\footnote{We speak of the lines created by
-% |\Ddots| and not the lines created by a command |\line| in the |\CodeAfter|.} of a
-% same array are ``parallelized''. That means that the first diagonal line is
-% drawn and, then, the other lines are drawn parallel to the first one (by
-% rotation around the left-most extremity of the line). That's why the position
-% of the instructions |\Ddots| in the array can have a marked effect on the
-% final result.
-%
-% \medskip
-% In the following examples, the first |\Ddots| instruction is written in color:
-%
-% % \medskip
-% \begin{scope}
-% \begin{minipage}{9.5cm}
-% Example with parallelization (default):
-% \begin{Verbatim}
-% $A = \begin{pNiceMatrix}
-% 1 & \Cdots & & 1 \\
-% a+b & ~emphase#\Ddots@~ & & \Vdots \\
-% \Vdots & \Ddots & & \\
-% a+b & \Cdots & a+b & 1
-% \end{pNiceMatrix}$
-% \end{Verbatim}
-% \end{minipage}
-% $A = \begin{pNiceMatrix}
-% 1 & \Cdots & & 1 \\
-% a+b & \Ddots & & \Vdots \\
-% \Vdots & \Ddots & & \\
-% a+b & \Cdots & a+b & 1
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% \NiceMatrixOptions{parallelize-diags=true}%
-% \begin{minipage}{9.5cm}
-% % \begin{Verbatim}
-% $A = \begin{pNiceMatrix}
-% 1 & \Cdots & & 1 \\
-% a+b & & & \Vdots \\
-% \Vdots & ~emphase#\Ddots@~ & \Ddots & \\
-% a+b & \Cdots & a+b & 1
-% \end{pNiceMatrix}$
-% \end{Verbatim}
-% \end{minipage}
-% $A = \begin{pNiceMatrix}
-% 1 & \Cdots & & 1 \\
-% a+b & & & \Vdots \\
-% \Vdots & \Ddots & \Ddots & \\
-% a+b & \Cdots & a+b & 1
-% \end{pNiceMatrix}$
-%
-% \bigskip
-% It's possible to turn off the parallelization with the option
-% |parallelize-diags| set to |false|: \par\nobreak
-%
-% \medskip
-% \NiceMatrixOptions{parallelize-diags=false}%
-% \begin{minipage}{9.5cm}
-% The same example without parallelization:
-% \end{minipage}
-% $A = \begin{pNiceMatrix}
-% 1 & \Cdots & & 1 \\
-% a+b & \Ddots & & \Vdots \\
-% \Vdots & \Ddots & & \\
-% a+b & \Cdots & a+b & 1
-% \end{pNiceMatrix}$
-%
-% \end{scope}
-%
-% It's possible to specify the instruction |\Ddots| which will be drawn first
-% (and which will be used to draw the other diagonal dotted lines when the
-% parallelization is in force) with the key |draw-first|: |\Ddots[draw-first]|.
-%
-% \subsection[The empty cells]{The ``empty'' cells}
-%
-% \label{empty-cells}
-% An instruction like |\Ldots|, |\Cdots|, etc. tries to determine the first
-% non-empty cell on both sides. When the key |corners| is used
-% (cf.~p.~\pageref{corners}), \pkg{nicematrix} computes corners consisting of
-% empty cells. However, an ``empty cell'' is not necessarily a cell with no TeX
-% content (that is to say a cell with no token between the two ampersands~|&|).
-% The precise rules are as follow.
-%
-% \begin{itemize}
-% \item An implicit cell is empty. For example, in the following matrix:
-%
-% \begin{Verbatim}
-% \begin{pmatrix}
-% a & b \\
-% c \\
-% \end{pmatrix}
-% \end{Verbatim}
-%
-% the last cell (second row and second column) is empty.
-%
-% \medskip
-% \item For the columns of type |p|, |m|, |b|, |V|\footnote{The columns of type
-% |V| are provided by \pkg{varwidth}: cf.~p.~\pageref{varwidth}.} and
-% |X|\footnote{See p.~\pageref{X-columns}}, the cell is empty if (and only if)
-% its content in the TeX code is empty (there is only spaces between the
-% ampersands |&|).
-%
-% \medskip
-% \item For the columns of type |c|, |l|, |r| and |w{...}{...}|, the cell is
-% empty if (and only if) its TeX output has a width equal to zero.
-%
-% \medskip
-% \item A cell containing the command |\NotEmpty| is not empty (and a PGF/Tikz
-% node is created in that cell).
-%
-% \medskip
-% \item A cell with only a command |\Hspace| (or |\Hspace*|) is empty. This
-% command |\Hspace| is a command defined by the package \pkg{nicematrix} with
-% the same meaning as |\hspace| except that the cell where it is used is
-% considered as empty. This command can be used to fix the width of some columns
-% of the matrix without interfering with \pkg{nicematrix}.
-% \end{itemize}
-%
-%
-% \subsection{The option exterior-arraycolsep}
-%
-% The environment |{array}| inserts an horizontal space equal to |\arraycolsep|
-% before and after each column. In particular, there is a space equal to
-% |\arraycolsep| before and after the array. This feature of the environment
-% |{array}| was probably not a good idea\footnote{In the documentation of
-% \pkg{amsmath}, we can read: {\itshape The extra space of |\arraycolsep| that
-% \pkg{array} adds on each side is a waste so we remove it [in |{matrix}|]
-% (perhaps we should instead remove it from array in general, but that's a
-% harder task).}}. The environment |{matrix}| of
-% \pkg{amsmath} and its variants (|{pmatrix}|, |{vmatrix}|, etc.) of
-% \pkg{amsmath} prefer to delete these spaces with explicit instructions
-% |\hskip -\arraycolsep|\footnote{And not by inserting |@{}| on both sides of the
-% preamble of the array. As a consequence, the length of the |\hline| is not
-% modified and may appear too long, in particular when using square brackets.}.
-% The package \pkg{nicematrix} does the same in all its environments,
-% |{NiceArray}| included. However, if the user wants the environment
-% |{NiceArray}| behaving by default like the environment |{array}| of
-% \pkg{array} (for example, when adapting an existing document) it's possible to
-% control this behaviour with the option |exterior-arraycolsep|, set by the
-% command |\NiceMatrixOptions|. With this option, exterior spaces of length
-% |\arraycolsep| will be inserted in the environments |{NiceArray}| (the other
-% environments of \pkg{nicematrix} are not affected).
-%
-%
-%
-%
-% \subsection{Incompatibilities}
-%
-%
-% The package \pkg{nicematrix} is not compatible with the class \cls{ieeeaccess}
-% (because that class is not compatible with PGF/Tikz).\footnote{See
-% \url{https://tex.stackexchange.com/questions/528975/error-loading-tikz-in-ieeeaccess-class}}
-%
-% \bigskip
-% In order to use \pkg{nicematrix} with the class \cls{aastex631}
-% (of the \emph{American Astronomical Society}), you have to
-% add the following lines in the preamble of your document :
-%
-% \begin{Verbatim}
-% \BeforeBegin{NiceTabular}{\let\begin\BeginEnvironment\let\end\EndEnvironment}
-% \BeforeBegin{NiceArray}{\let\begin\BeginEnvironment}
-% \BeforeBegin{NiceMatrix}{\let\begin\BeginEnvironment}
-% \end{Verbatim}
-%
-% \bigskip
-% In order to use \pkg{nicematrix} with the class \cls{sn-jnl} (of
-% \emph{Springer Nature}), \pkg{pgf} must
-% be loaded before the |\documentclass| with |\RequirePackage|:
-%
-% \begin{Verbatim}
-% \RequirePackage{pgf}
-% \documentclass{sn-jnl}
-% \end{Verbatim}
-%
-% \bigskip
-% The package \pkg{nicematrix} is not fully compatible with the packages and classes
-% of \LuaTeX-ja: the detection of the empty corners (cf. % p.~\pageref{corners})
-% may be wrong in some circonstances.
-%
-% \bigskip
-% The package \pkg{nicematrix} is not fully compatible with the package
-% \pkg{arydshln} (because this package redefines many internals of \pkg{array}).
-% By any means, in the context of \pkg{nicematrix}, it's recommended to draw
-% dashed rules with the tools provided by \pkg{nicematrix}, by creating a
-% customized line style with |custom-line|: cf.~p.~\pageref{custom-line}.
-%
-% \bigskip
-% The columns |d| of \pkg{dcolumn} are not supported (but it's possible to use
-% the colums |S| of \pkg{siunitx}).
-%
-% \section{Examples}
-%
-% \subsection[{Utilisation of the key 'tikz' of the command \textbackslash
-% Block}]{Utilisation of the key ``tikz'' of the command \textbackslash Block}
-% \label{tikz-key-examples}
-%
-%
-% The key |tikz| of the command |\Block| is available only when Tikz is
-% loaded.\footnote{By default, \pkg{nicematrix} only loads \textsc{pgf}, which is
-% a sub-layer of Tikz.}
-%
-% For the following example, we also need the Tikz library |patterns|.
-%
-% \begin{Verbatim}
-% \usetikzlibrary{patterns}
-% \end{Verbatim}
-%
-%
-% \begin{Verbatim}
-% \ttfamily \small
-% \begin{NiceTabular}{X[m]X[m]X[m]}[hvlines,cell-space-limits=3pt]
-% \Block[~emphase#tikz={pattern=grid,pattern color=lightgray}@]{}
-% {pattern = grid,\\ pattern color = lightgray}
-% & \Block[~emphase#tikz={pattern = north west lines,pattern color=blue}@]{}
-% {pattern = north west lines,\\ pattern color = blue}
-% & \Block[~emphase#tikz={outer color = red!50, inner color=white }@]{2-1}
-% {outer color = red!50,\\ inner color = white} \\
-% \Block[~emphase#tikz={pattern = sixpointed stars, pattern color = blue!15}@]{}
-% {pattern = sixpointed stars,\\ pattern color = blue!15}
-% & \Block[~emphase#tikz={left color = blue!50}@]{}
-% {left color = blue!50} \\
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-% \begin{center}
-% \ttfamily \small
-% \begin{NiceTabular}{X[m]X[m]X[m]}[hvlines,cell-space-limits=3pt]
-% \Block[tikz={pattern=grid,pattern color=lightgray}]{}
-% {pattern = grid,\\ pattern color = lightgray}
-% & \Block[tikz={pattern = north west lines,pattern color=blue}]{}
-% {pattern = north west lines,\\ pattern color = blue}
-% & \Block[tikz={outer color = red!50, inner color=white }]{2-1}
-% {outer color = red!50,\\ inner color = white} \\
-% \Block[tikz={pattern = sixpointed stars, pattern color = blue!15}]{}
-% {pattern = sixpointed stars,\\ pattern color = blue!15}
-% & \Block[tikz={left color = blue!50}]{}
-% {left color = blue!50} \\
-% \end{NiceTabular}
-% \end{center}
-%
-% \bigskip
-% In the following example, we use the key |tikz| to hatch a row of the tabular.
-% Remark that you use the key |transparent| of the command |\Block| in order to
-% have the rules drawn in the block.\footnote{By default, the rules are not
-% drawn in the blocks created by the command |\Block|: cf.~section~\ref{rules}
-% p.~\pageref{rules}}
-%
-% \begin{Verbatim}
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% \columncolor[RGB]{169,208,142}{2}
-% \Body
-% one & two & three \\
-% \Block[~emphase#transparent, tikz={pattern = north west lines, pattern color = gray}@]{1-*}{}
-% four & five & six \\
-% seven & eight & nine
-% \end{Verbatim}
-%
-% \begin{center}
-% \begin{NiceTabular}{ccc}[hvlines]
-% \CodeBefore
-% \columncolor[RGB]{169,208,142}{2}
-% \Body
-% one & two & three \\
-% \Block[transparent, tikz={pattern = north west lines, pattern color = gray}]{1-*}{}
-% four & five & six \\
-% seven & eight & nine
-% \end{NiceTabular}
-% \end{center}
-%
-% \subsection{Use with tcolorbox}
-%
-% \label{tcolorbox}
-%
-% Here is an example of use of |{NiceTabular}| within a command |\tcbox| of
-% \pkg{tcolorbox}. We have used the key |hvlines-except-borders| in order all
-% the rules excepted on the borders (which are, of course, added by \pkg{tcolorbox})
-%
-% \medskip
-% \begin{BVerbatim}
-% \tcbset
-% {
-% colframe = blue!50!black ,
-% colback = white ,
-% colupper = red!50!black ,
-% fonttitle = \bfseries ,
-% nobeforeafter ,
-% center title
-% }
-%
-% \tcbox
-% [
-% left = 0mm ,
-% right = 0mm ,
-% top = 0mm ,
-% bottom = 0mm ,
-% boxsep = 0mm ,
-% toptitle = 0.5mm ,
-% bottomtitle = 0.5mm ,
-% title = My table
-% ]
-% {
-% \renewcommand{\arraystretch}{1.2}% <-- the % is mandatory here
-% \begin{NiceTabular}{rcl}[~emphase#hvlines-except-borders@,rules/color=blue!50!black]
-% \CodeBefore
-% \rowcolor{red!15}{1}
-% \Body
-% One & Two & Three \\
-% Men & Mice & Lions \\
-% Upper & Middle & Lower
-% \end{NiceTabular}
-% }
-% \end{BVerbatim}
-%
-% \medskip
-% \begin{center}
-% \tcbset
-% {
-% colframe = blue!50!black ,
-% colback = white ,
-% colupper = red!50!black ,
-% fonttitle = \bfseries ,
-% nobeforeafter ,
-% center title
-% }
-%
-% \tcbox
-% [
-% left = 0mm ,
-% right = 0mm ,
-% top = 0mm ,
-% bottom = 0mm ,
-% boxsep = 0mm ,
-% toptitle = 0.5mm ,
-% bottomtitle = 0.5mm ,
-% title = My table
-% ]
-% {
-% \renewcommand{\arraystretch}{1.2}\begin{NiceTabular}{rcl}[hvlines-except-borders,rules/color=blue!50!black]
-% \CodeBefore
-% \rowcolor{red!15}{1}
-% \Body
-% One & Two & Three \\
-% Men & Mice & Lions \\
-% Upper & Middle & Lower
-% \end{NiceTabular}
-% }
-% \end{center}
-%
-%
-%
-% \vspace{1cm}
-% That example shows the use of \pkg{nicematrix} in conjunction with
-% \pkg{tcolorbox}. If one wishes a tabular with an exterior frame with rounded
-% corners, it's not necessary to use \pkg{tcolorbox}: it's possible to use the
-% command |\Block| with the key |rounded-corners|.
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.5cm]
-% \begin{NiceTabular}{rcl}[hvlines-except-borders]
-% \Block[draw,transparent,~emphase#rounded-corners@]{*-*}{}
-% One & Two & Three \\
-% Men & Mice & Lions \\
-% Upper & Middle & Lower
-% \end{NiceTabular}
-% \end{BVerbatim}
-% \begin{NiceTabular}{rcl}[hvlines-except-borders]
-% \Block[draw,transparent,rounded-corners]{*-*}{}
-% One & Two & Three \\
-% Men & Mice & Lions \\
-% Upper & Middle & Lower
-% \end{NiceTabular}
-%
-% \medskip
-% We have used the key |transparent| to have the rules specified by
-% |hvlines-except-borders| drawn in the blocks (by default, the rules are not
-% drawn in the blocks).
-%
-% \subsection{Notes in the tabulars}
-%
-% \label{ex:notes}
-%
-% The tools provided by \pkg{nicematrix} for the composition of the tabular
-% notes have been presented in the section \ref{s:notes} p.~\pageref{s:notes}.
-%
-% \medskip
-% Let's consider that we wish to number the notes of a tabular with
-% stars.\footnote{Of course, it's realistic only when there is very few notes in
-% the tabular.}
-%
-% \medskip
-% First, we write a command |\stars| similar the well-known commands
-% |\arabic|, |\alph|, |\Alph|, etc. which produces a number of stars equal to
-% its argument\footnote{In fact: the value of its argument.}.
-% \begin{Verbatim}
-% \ExplSyntaxOn
-% \NewDocumentCommand ~emphase#\stars@ { m }
-% { \prg_replicate:nn { \value { ~#1 } } { $ \star $ } }
-% \ExplSyntaxOff
-% \end{Verbatim}
-% %
-% Of course, we change the style of the labels with the key |notes/style|.
-% However, it would be interesting to change also some parameters in the type of
-% list used to compose the notes at the end of the tabular.
-% First, we required a composition flush right for the labels with the setting
-% |align=right|.
-% Moreover, we want the labels to be composed on a width equal to the width of
-% the widest label. The widest label is, of course, the label with the greatest
-% number of stars. We know that number: it is equal to |\value{tabularnote}|
-% (because |tabularnote| is the LaTeX counter used by |\tabularnote| and,
-% therefore, at the end of the tabular, its value is equal to the total number
-% of tabular notes). We use the key |widest*| of \pkg{enumitem} in order to
-% require a width equal to that value: |widest*=\value{tabularnote}|.
-% \begin{Verbatim}
-% \NiceMatrixOptions
-% {
-% notes =
-% {
-% ~emphase#style = \stars{~#1} , @
-% ~emphase#enumitem-keys = @
-% ~emphase# { @
-% ~emphase# widest* = \value{tabularnote} ,@
-% ~emphase# align = right @
-% ~emphase# } @
-% }
-% }
-% \end{Verbatim}
-%
-%
-%
-% \begin{scope}
-% \ExplSyntaxOn
-% \NewDocumentCommand \stars { m }
-% { \prg_replicate:nn { \value { #1 } } { $ \star $ } }
-% \NiceMatrixOptions
-% {
-% notes =
-% {
-% style = \stars{#1} ,
-% enumitem-keys =
-% {
-% widest* = \value{tabularnote} ,
-% align = right
-% }
-% }
-% }
-% \ExplSyntaxOff
-% \begin{Verbatim}
-% \begin{NiceTabular}{~@{}llr~@{}}
-% \toprule \RowStyle{\bfseries}
-% Last name & First name & Birth day \\
-% \midrule
-% Achard\tabularnote{~emphase#Achard is an old family of the Poitou.@}
-% & Jacques & 5 juin 1962 \\
-% Lefebvre\tabularnote{~emphase#The name Lefebvre is an alteration of the name Lefebure.@}
-% & Mathilde & 23 mai 1988 \\
-% Vanesse & Stephany & 30 octobre 1994 \\
-% Dupont & Chantal & 15 janvier 1998 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{Verbatim}
-%
-% \begin{center}
-% \begin{NiceTabular}{@{}llr@{}}
-% \toprule \RowStyle{\bfseries}
-% Last name & First name & Birth day \\
-% \midrule
-% Achard\tabularnote{Achard is an old family of the Poitou.}
-% & Jacques & June 5, 2005 \\
-% Lefebvre\tabularnote{The name Lefebvre is an alteration of the name Lefebure.}
-% & Mathilde & January 23, 1975 \\
-% Vanesse & Stephany & October 30, 1994 \\
-% Dupont & Chantal & January 15, 1998 \\
-% \bottomrule
-% \end{NiceTabular}
-% \end{center}
-% \end{scope}
-%
-%
-%
-% \subsection{Dotted lines}
-%
-% An example with the resultant of two polynoms:\par\nobreak
-%
-% \bigskip
-% \begin{BVerbatim}
-% \setlength{\extrarowheight}{1mm}
-% \[\begin{vNiceArray}{cccc:ccc}[columns-width=6mm]
-% a_0 & && &b_0 & & \\
-% a_1 &\Ddots&& &b_1 &\Ddots& \\
-% \Vdots&\Ddots&& &\Vdots &\Ddots&b_0 \\
-% a_p & &&a_0 & & &b_1 \\
-% &\Ddots&&a_1 &b_q & &\Vdots\\
-% & &&\Vdots & &\Ddots& \\
-% & &&a_p & & &b_q
-% \end{vNiceArray}\]
-% \end{BVerbatim}
-%
-% \bigskip
-%
-% \begin{scope}
-% \setlength{\extrarowheight}{1mm}
-% \[\begin{vNiceArray}{cccc:ccc}[columns-width=6mm]
-% a_0 & && &b_0 & & \\
-% a_1 &\Ddots&& &b_1 &\Ddots& \\
-% \Vdots&\Ddots&& &\Vdots &\Ddots&b_0 \\
-% a_p & &&a_0 & & &b_1 \\
-% &\Ddots&&a_1 &b_q & &\Vdots\\
-% & &&\Vdots & &\Ddots& \\
-% & &&a_p & & &b_q
-% \end{vNiceArray}\]
-% \end{scope}
-%
-% \vspace{2cm}
-% An example for a linear system:\par\nobreak
-%
-% \begin{Verbatim}
-% $\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
-% 1 & 1 & 1 &\Cdots & & 1 & 0 & \\
-% 0 & 1 & 0 &\Cdots & & 0 & & L_2 \gets L_2-L_1 \\
-% 0 & 0 & 1 &\Ddots & & \Vdots & & L_3 \gets L_3-L_1 \\
-% & & &\Ddots & & & \Vdots & \Vdots \\
-% \Vdots & & &\Ddots & & 0 & \\
-% 0 & & &\Cdots & 0 & 1 & 0 & L_n \gets L_n-L_1
-% \end{pNiceArray}$
-% \end{Verbatim}
-%
-%
-% \[\begin{pNiceArray}{*6c|c}[nullify-dots,last-col,code-for-last-col=\scriptstyle]
-% 1 & 1 & 1 &\Cdots & & 1 & 0 & \\
-% 0 & 1 & 0 &\Cdots & & 0 & & L_2 \gets L_2-L_1 \\
-% 0 & 0 & 1 &\Ddots & & \Vdots & & L_3 \gets L_3-L_1 \\
-% & & &\Ddots & & & \Vdots & \Vdots \\
-% \Vdots & & &\Ddots & & 0 & \\
-% 0 & & &\Cdots & 0 & 1 & 0 & L_n \gets L_n-L_1
-% \end{pNiceArray}\]
-%
-%
-%
-% \subsection{Dotted lines which are no longer dotted}
-%
-% The option |line-style| controls the style of the lines drawn by |\Ldots|,
-% |\Cdots|, etc. Thus, it's possible with these commands to draw lines which are
-% not longer dotted.
-%
-%
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% \NiceMatrixOptions{code-for-first-row = \scriptstyle,code-for-first-col = \scriptstyle }
-% \setcounter{MaxMatrixCols}{12}
-% \newcommand{\blue}{\color{blue}}
-% \[\begin{pNiceMatrix}[last-row,last-col,nullify-dots,xdots/line-style={dashed,blue}]
-% 1& & & \Vdots & & & & \Vdots \\
-% & \Ddots[line-style=standard] \\
-% & & 1 \\
-% \Cdots[color=blue,line-style=dashed]& & & \blue 0 &
-% \Cdots & & & \blue 1 & & & \Cdots & \blue \leftarrow i \\
-% & & & & 1 \\
-% & & &\Vdots & & \Ddots[line-style=standard] & & \Vdots \\
-% & & & & & & 1 \\
-% \Cdots & & & \blue 1 & \Cdots & & \Cdots & \blue 0 & & & \Cdots & \blue \leftarrow j \\
-% & & & & & & & & 1 \\
-% & & & & & & & & & \Ddots[line-style=standard] \\
-% & & & \Vdots & & & & \Vdots & & & 1 \\
-% & & & \blue \overset{\uparrow}{i} & & & & \blue \overset{\uparrow}{j} \\
-% \end{pNiceMatrix}\]
-% \end{Verbatim}
-%
-%
-% \begin{scope}
-% \NiceMatrixOptions{code-for-first-row = \scriptstyle,code-for-first-col = \scriptstyle }
-% \setcounter{MaxMatrixCols}{12}
-% \newcommand{\blue}{\color{blue}}
-% \[\begin{pNiceMatrix}[last-row,last-col,nullify-dots,xdots/line-style={dashed,blue}]
-% 1& & & \Vdots & & & & \Vdots \\
-% & \Ddots[line-style=standard] \\
-% & & 1 \\
-% \Cdots[color=blue,line-style=dashed]& & & \blue 0 &
-% \Cdots & & & \blue 1 & & & \Cdots & \blue \leftarrow i \\
-% & & & & 1 \\
-% & & &\Vdots & & \Ddots[line-style=standard] & & \Vdots \\
-% & & & & & & 1 \\
-% \Cdots & & & \blue 1 & \Cdots & & \Cdots & \blue 0 & & & \Cdots & \blue \leftarrow j \\
-% & & & & & & & & 1 \\
-% & & & & & & & & & \Ddots[line-style=standard] \\
-% & & & \Vdots & & & & \Vdots & & & 1 \\
-% & & & \blue \overset{\uparrow}{i} & & & & \blue \overset{\uparrow}{j} \\
-% \end{pNiceMatrix}\]
-% \end{scope}
-%
-% \interitem
-% In fact, it's even possible to draw solid lines with the commands |\Cdots|,
-% |\Vdots|, etc.\footnote{In this document, the Tikz library \pkg{arrows.meta}
-% has been loaded, which impacts the shape of the arrow tips.}
-%
-% \begin{Verbatim}
-% \NiceMatrixOptions
-% {nullify-dots,code-for-first-col = \color{blue},code-for-first-row=\color{blue}}
-% $\begin{pNiceMatrix}[first-row,first-col]
-% & & \Ldots[line-style={solid,<->},shorten=0pt]^{n \text{ columns}} \\
-% & 1 & 1 & 1 & \Ldots & 1 \\
-% & 1 & 1 & 1 & & 1 \\
-% \Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 & & 1 \\
-% & 1 & 1 & 1 & & 1 \\
-% & 1 & 1 & 1 & \Ldots & 1
-% \end{pNiceMatrix}$
-% \end{Verbatim}
-%
-%
-% \begin{scope}
-% \NiceMatrixOptions
-% {nullify-dots,code-for-first-col = \color{blue},code-for-first-row=\color{blue}}
-% \[\begin{pNiceMatrix}[first-row,first-col]
-% & & \Ldots[line-style={solid,<->},shorten=0pt]^{n \text{ columns}} \\
-% & 1 & 1 & 1 & \Ldots & 1 \\
-% & 1 & 1 & 1 & & 1 \\
-% \Vdots[line-style={solid,<->}]_{n \text{ rows}} & 1 & 1 & 1 & & 1 \\
-% & 1 & 1 & 1 & & 1 \\
-% & 1 & 1 & 1 & \Ldots & 1
-% \end{pNiceMatrix}\]
-% \end{scope}
-%
-% \subsection{Dashed rules}
-% \label{dashed}
-%
-% In the following example, we use the command |\Block| to draw dashed rules.
-% For that example, Tikz should be loaded (by |\usepackage{tikz}|).
-%
-%
-% \begin{Verbatim}
-% \begin{pNiceMatrix}
-% ~emphase#\Block[borders={bottom,right,tikz=dashed}]{2-2}{}@
-% 1 & 2 & 0 & 0 & 0 & 0 \\
-% 4 & 5 & 0 & 0 & 0 & 0 \\
-% 0 & 0 & ~emphase#\Block[borders={bottom,top,right,left,tikz=dashed}]{2-2}{}@
-% 7 & 1 & 0 & 0 \\
-% 0 & 0 & -1 & 2 & 0 & 0 \\
-% 0 & 0 & 0 & 0 & ~emphase#\Block[borders={left,top,tikz=dashed}]{2-2}{}@
-% 3 & 4 \\
-% 0 & 0 & 0 & 0 & 1 & 4
-% \end{pNiceMatrix}
-% \end{Verbatim}
-%
-%
-% \[\begin{pNiceMatrix}
-% \Block[borders={bottom,right,tikz=dashed}]{2-2}{}
-% 1 & 2 & 0 & 0 & 0 & 0 \\
-% 4 & 5 & 0 & 0 & 0 & 0 \\
-% 0 & 0 & \Block[borders={bottom,top,right,left,tikz=dashed}]{2-2}{}
-% 7 & 1 & 0 & 0 \\
-% 0 & 0 & -1 & 2 & 0 & 0 \\
-% 0 & 0 & 0 & 0 & \Block[borders={left,top,tikz=dashed}]{2-2}{}
-% 3 & 4 \\
-% 0 & 0 & 0 & 0 & 1 & 4
-% \end{pNiceMatrix}\]
-%
-%
-% \subsection{Stacks of matrices}
-%
-% We often need to compose mathematical matrices on top on each other (for
-% example for the resolution of linear systems).
-%
-% \medskip
-% In order to have the columns aligned one above the other, it's possible to
-% fix a width for all the columns. That's what is done in the following example
-% with the environment |{NiceMatrixBlock}| and its option |auto-columns-width|.
-%
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
-% \NiceMatrixOptions
-% {
-% light-syntax,
-% last-col, code-for-last-col = \color{blue} \scriptstyle,
-% }
-% \setlength{\extrarowheight}{1mm}
-%
-% $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 3 -18 12 1 4 ;
-% -3 -46 29 -2 -15 ;
-% 9 10 -5 4 7
-% \end{pNiceArray}$
-%
-% \smallskip
-% $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 ;
-% 0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ;
-% 0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ;
-% 0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ;
-% \end{pNiceArray}$
-%
-% \smallskip
-% $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 ;
-% 0 64 -41 1 19 ;
-% 0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 }
-% \end{pNiceArray}$
-%
-% \smallskip
-% $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 0 64 -41 1 19 ;
-% \end{pNiceArray}$
-%
-% ~emphase#\end{NiceMatrixBlock}@
-% \end{Verbatim}
-%
-% \bigskip
-% \begin{NiceMatrixBlock}[auto-columns-width]
-% \NiceMatrixOptions
-% {
-% light-syntax,
-% last-col, code-for-last-col = \color{blue} \scriptstyle ,
-% }
-% \setlength{\extrarowheight}{1mm}
-%
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 3 -18 12 1 4 ;
-% -3 -46 29 -2 -15 ;
-% 9 10 -5 4 7
-% \end{pNiceArray}$
-%
-% \smallskip
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 ;
-% 0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ;
-% 0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ;
-% 0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ;
-% \end{pNiceArray}$
-%
-% \smallskip
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 ;
-% 0 64 -41 1 19 ;
-% 0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 }
-% \end{pNiceArray}$\par\nobreak
-%
-% \smallskip
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 0 64 -41 1 19 ;
-% \end{pNiceArray}$
-% \end{NiceMatrixBlock}
-%
-% \bigskip
-% However, one can see that the last matrix is not perfectly aligned with
-% others. That's why, in LaTeX, the parenthesis have not exactly the same width
-% (smaller parenthesis are a bit slimer).
-%
-% \medskip
-% In order the solve that problem, it's possible to require the delimiters to be
-% composed with the maximal width, thanks to the boolean key
-% |delimiters/max-width|.
-%
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% ~emphase#\begin{NiceMatrixBlock}[auto-columns-width]@
-% \NiceMatrixOptions
-% {
-% ~emphase#delimiters/max-width@,
-% light-syntax,
-% last-col, code-for-last-col = \color{blue}\scriptstyle,
-% }
-% \setlength{\extrarowheight}{1mm}
-%
-% $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 3 -18 12 1 4 ;
-% -3 -46 29 -2 -15 ;
-% 9 10 -5 4 7
-% \end{pNiceArray}$
-%
-% ...
-% ~emphase#\end{NiceMatrixBlock}@
-% \end{Verbatim}
-%
-% \bigskip
-% \begin{NiceMatrixBlock}[auto-columns-width]
-% \NiceMatrixOptions
-% {
-% delimiters/max-width,
-% light-syntax,
-% last-col, code-for-last-col = \color{blue}\scriptstyle,
-% }
-% \setlength{\extrarowheight}{1mm}
-%
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 3 -18 12 1 4 ;
-% -3 -46 29 -2 -15 ;
-% 9 10 -5 4 7
-% \end{pNiceArray}$
-%
-% \smallskip
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 ;
-% 0 64 -41 1 19 { L_2 \gets L_1-4L_2 } ;
-% 0 -192 123 -3 -57 { L_3 \gets L_1+4L_3 } ;
-% 0 -64 41 -1 -19 { L_4 \gets 3L_1-4L_4 } ;
-% \end{pNiceArray}$
-%
-% \smallskip
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 ;
-% 0 64 -41 1 19 ;
-% 0 0 0 0 0 { L_3 \gets 3 L_2 + L_3 }
-% \end{pNiceArray}$\par\nobreak
-%
-% \smallskip
-% \quad $\begin{pNiceArray}{rrrr|r}
-% 12 -8 7 5 3 {} ;
-% 0 64 -41 1 19 ;
-% \end{pNiceArray}$
-%
-% \end{NiceMatrixBlock}
-%
-%
-% \interitem
-% If you wish an alignment of the different matrices without the same width
-% for all the columns, you can construct a unique array and place the
-% parenthesis with commands |\SubMatrix| in the |\CodeAfter|. Of course, that
-% array can't be broken by a page break.
-%
-% \medskip
-% \begin{Verbatim}
-% \setlength{\extrarowheight}{1mm}
-% \[\begin{NiceMatrix}[ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ]
-% 12 & -8 & 7 & 5 & 3 \\
-% 3 & -18 & 12 & 1 & 4 \\
-% -3 & -46 & 29 &-2 &-15 \\
-% 9 & 10 &-5 &4 & 7 \\[1mm]
-% 12 & -8 & 7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
-% 0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
-% 0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 &1 &19 \\
-% 0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 \\
-% ~emphase#\CodeAfter [sub-matrix/vlines=4]@
-% ~emphase# \SubMatrix({1-1}{4-5})@
-% ~emphase# \SubMatrix({5-1}{8-5})@
-% ~emphase# \SubMatrix({9-1}{11-5})@
-% ~emphase# \SubMatrix({12-1}{13-5})@
-% \end{NiceMatrix}\]
-% \end{Verbatim}
-%
-% \medskip
-% \begin{scope}
-% \setlength{\extrarowheight}{1mm}
-% \[\begin{NiceMatrix}[ r, last-col=6, code-for-last-col = \scriptstyle \color{blue} ]
-% 12 & -8 & 7 & 5 & 3 \\
-% 3 & -18 & 12 & 1 & 4 \\
-% -3 & -46 & 29 &-2 &-15 \\
-% 9 & 10 &-5 &4 & 7 \\[1mm]
-% 12 & -8 & 7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
-% 0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
-% 0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 &1 &19 \\
-% 0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 \\
-% \CodeAfter [sub-matrix/vlines=4]
-% \SubMatrix({1-1}{4-5})
-% \SubMatrix({5-1}{8-5})
-% \SubMatrix({9-1}{11-5})
-% \SubMatrix({12-1}{13-5})
-% \end{NiceMatrix}\]
-% \end{scope}
-%
-% \bigskip
-% In this tabular, the instructions |\SubMatrix| are executed after the
-% composition of the tabular and, thus, the vertical rules are drawn without
-% adding space between the columns.
-%
-%
-%\bigskip
-% In fact, it's possible, with the key |vlines-in-sub-matrix|, to choice a
-% letter in the preamble of the array to specify vertical rules which will be
-% drawn in the |\SubMatrix| only (by adding space between the columns).
-%
-% \medskip
-% \begin{Verbatim}
-% \setlength{\extrarowheight}{1mm}
-% \[\begin{NiceArray}
-% [
-% ~emphase#vlines-in-sub-matrix=I@,
-% last-col,
-% code-for-last-col = \scriptstyle \color{blue}
-% ]
-% {rrrrIr}
-% 12 & -8 & 7 & 5 & 3 \\
-% 3 & -18 & 12 & 1 & 4 \\
-% -3 & -46 & 29 &-2 &-15 \\
-% 9 & 10 &-5 &4 & 7 \\[1mm]
-% 12 & -8 & 7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
-% 0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
-% 0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 &1 &19 \\
-% 0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 \\
-% \CodeAfter
-% \SubMatrix({1-1}{4-5})
-% \SubMatrix({5-1}{8-5})
-% \SubMatrix({9-1}{11-5})
-% \SubMatrix({12-1}{13-5})
-% \end{NiceArray}\]
-% \end{Verbatim}
-%
-%
-% \medskip
-% \begin{scope}
-% \setlength{\extrarowheight}{1mm}
-% \[\begin{NiceArray}
-% [
-% vlines-in-sub-matrix=I,
-% last-col,
-% code-for-last-col = \scriptstyle \color{blue}
-% ]
-% {rrrrIr}
-% 12 & -8 & 7 & 5 & 3 \\
-% 3 & -18 & 12 & 1 & 4 \\
-% -3 & -46 & 29 &-2 &-15 \\
-% 9 & 10 &-5 &4 & 7 \\[1mm]
-% 12 & -8 & 7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 & L_2 \gets L_1-4L_2 \\
-% 0 & -192 &123 &-3 &-57 & L_3 \gets L_1+4L_3 \\
-% 0 & -64 & 41 &-1 &-19 & L_4 \gets 3L_1-4L_4 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 &1 &19 \\
-% 0 & 0 &0 &0 & 0 & L_3 \gets 3L_2+L_3 \\[1mm]
-% 12 & -8 &7 &5 & 3 \\
-% 0 & 64 &-41 & 1 & 19 \\
-% \CodeAfter
-% \SubMatrix({1-1}{4-5})
-% \SubMatrix({5-1}{8-5})
-% \SubMatrix({9-1}{11-5})
-% \SubMatrix({12-1}{13-5})
-% \end{NiceArray}\]
-% \end{scope}
-%
-%
-%
-%
-%
-% \subsection{How to highlight cells of a matrix}
-%
-%
-% \label{highlight}
-%
-% \medskip
-% In order to highlight a cell of a matrix, it's possible to ``draw'' that cell
-% with the key |draw| of the command |\Block| (this is one of the uses of a
-% mono-cell block\footnote{We recall that, if the first mandatory argument of
-% the command |\Block| is left empty, that means that the block is a mono-cell block}).
-%
-% \label{example-CodeAfter}
-%
-%
-% \begin{Verbatim}
-% $\begin{pNiceArray}{>{\strut}cccc}[margin,rules/color=blue]
-% ~emphase#\Block[draw]{}{a_{11}}@ & a_{12} & a_{13} & a_{14} \\
-% a_{21} & \Block[draw]{}{a_{22}} & a_{23} & a_{24} \\
-% a_{31} & a_{32} & \Block[draw]{}{a_{33}} & a_{34} \\
-% a_{41} & a_{42} & a_{43} & \Block[draw]{}{a_{44}} \\
-% \end{pNiceArray}$
-% \end{Verbatim}
-% \[\begin{pNiceArray}{>{\strut}cccc}[margin,rules/color=blue]
-% \Block[draw]{}{a_{11}} & a_{12} & a_{13} & a_{14} \\
-% a_{21} & \Block[draw]{}{a_{22}} & a_{23} & a_{24} \\
-% a_{31} & a_{32} & \Block[draw]{}{a_{33}} & a_{34} \\
-% a_{41} & a_{42} & a_{43} & \Block[draw]{}{a_{44}} \\
-% \end{pNiceArray}\]
-%
-% We should remark that the rules we have drawn are drawn \emph{after} the
-% construction of the array and thus, they don't spread the cells of the array.
-% We recall that, on the other side, the commands |\hline| and |\Hline|, the
-% specifier ``"|"'' and the options |hlines|, |vlines|, |hvlines| and
-% |hvlines-except-borders| spread the cells.\footnote{For the command |\cline|,
-% see the remark p.~\pageref{remark-cline}.}
-%
-%
-% \vspace{1cm}
-% It's possible to color a row with |\rowcolor| in the |code-before| (or with
-% |\rowcolor| in the first cell of the row if the key |colortbl-like| is
-% used−even when \pkg{colortbl} is not loaded).
-%
-% \medskip
-% \begin{Verbatim}
-% \begin{pNiceArray}{>{\strut}cccc}[margin, extra-margin=2pt,colortbl-like]
-% ~emphase#\rowcolor{red!15}@A_{11} & A_{12} & A_{13} & A_{14} \\
-% A_{21} & ~emphase#\rowcolor{red!15}@A_{22} & A_{23} & A_{24} \\
-% A_{31} & A_{32} & ~emphase#\rowcolor{red!15}@A_{33} & A_{34} \\
-% A_{41} & A_{42} & A_{43} & ~emphase#\rowcolor{red!15}@A_{44}
-% \end{pNiceArray}
-% \end{Verbatim}
-%
-%
-%
-% \[\begin{pNiceArray}{>{\strut}cccc}[margin, extra-margin=2pt,colortbl-like]
-% \rowcolor{red!15}A_{11} & A_{12} & A_{13} & A_{14} \\
-% A_{21} & \rowcolor{red!15}A_{22} & A_{23} & A_{24} \\
-% A_{31} & A_{32} & \rowcolor{red!15}A_{33} & A_{34} \\
-% A_{41} & A_{42} & A_{43} & \rowcolor{red!15}A_{44}
-% \end{pNiceArray}\]
-%
-% \bigskip
-% However, it's not possible to do a fine tuning. That's why we describe now a
-% method to highlight a row of the matrix.
-%
-% \medskip
-% That example and the following ones require Tikz (by default, \pkg{nicematrix}
-% only loads \textsc{pgf}, which is a sub-layer of Tikz) and the Tikz library
-% |fit|. The following lines in the preamble of your document do the job:
-% \begin{verbatim}
-% \usepackage{tikz}
-% \usetikzlibrary{fit}
-% \end{verbatim}
-%
-% \medskip
-% We create a rectangular Tikz node which encompasses the nodes of the second
-% row by using the tools of the Tikz library \pkg{fit}. Those nodes are not
-% available by default in the |\CodeBefore| (for efficiency). We have to require
-% their creation with the key |create-cell-nodes| of the keyword |\CodeBefore|.
-%
-% \tikzset{highlight/.style={rectangle,
-% fill=red!15,
-% rounded corners = 0.5 mm,
-% inner sep=1pt,
-% fit = #1}}
-%
-% \medskip
-% \begin{Verbatim}
-% \tikzset{highlight/.style={rectangle,
-% fill=red!15,
-% rounded corners = 0.5 mm,
-% inner sep=1pt,
-% fit=~#1}}
-%
-% $\begin{bNiceMatrix}
-% ~emphase#\CodeBefore [create-cell-nodes] @
-% ~emphase# \tikz \node [highlight = (2-1) (2-3)] {} ; @
-% ~emphase# \Body @
-% 0 & \Cdots & 0 \\
-% 1 & \Cdots & 1 \\
-% 0 & \Cdots & 0 \\
-% \end{bNiceMatrix}$
-% \end{Verbatim}
-% \[\begin{bNiceMatrix}
-% \CodeBefore [create-cell-nodes]
-% \tikz \node [highlight = (2-1) (2-3)] {} ;
-% \Body
-% 0 & \Cdots & 0 \\
-% 1 & \Cdots & 1 \\
-% 0 & \Cdots & 0 \\
-% \end{bNiceMatrix}\]
-%
-%
-% \vspace{1cm}
-% We consider now the following matrix. If we want to highlight each row of
-% this matrix, we can use the previous technique three times.
-%
-% \begin{Verbatim}
-% \[\begin{pNiceArray}{ccc}[last-col, margin = 2pt]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% ~emphase# \node [highlight = (1-1) (1-3)] {} ;@
-% ~emphase# \node [highlight = (2-1) (2-3)] {} ;@
-% ~emphase# \node [highlight = (3-1) (3-3)] {} ;@
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c & L_1 \\
-% a & a & a + b & L_2 \\
-% a & a & a & L_3
-% \end{pNiceArray}\]
-% \end{Verbatim}
-%
-%
-% \[\begin{pNiceArray}{ccc}[last-col, margin = 2pt]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture}
-% \node [highlight = (1-1) (1-3)] {} ;
-% \node [highlight = (2-1) (2-3)] {} ;
-% \node [highlight = (3-1) (3-3)] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c & L_1 \\
-% a & a & a + b & L_2 \\
-% a & a & a & L_3
-% \end{pNiceArray}\]
-%
-% \medskip
-% The result may seem disappointing. We can improve it by using the ``medium
-% nodes'' instead of the ``normal nodes''.
-%
-% \begin{Verbatim}
-% \[\begin{pNiceArray}{ccc}[last-col, margin = 2pt, create-medium-nodes]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture} ~emphase#[name suffix = -medium]@
-% \node [highlight = (1-1) (1-3)] {} ;
-% \node [highlight = (2-1) (2-3)] {} ;
-% \node [highlight = (3-1) (3-3)] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c & L_1 \\
-% a & a & a + b & L_2 \\
-% a & a & a & L_3
-% \end{pNiceArray}\]
-% \end{Verbatim}
-%
-%
-%\[\begin{pNiceArray}{ccc}[last-col, margin = 2pt, create-medium-nodes]
-% \CodeBefore [create-cell-nodes]
-% \begin{tikzpicture} [name suffix = -medium]
-% \node [highlight = (1-1) (1-3)] {} ;
-% \node [highlight = (2-1) (2-3)] {} ;
-% \node [highlight = (3-1) (3-3)] {} ;
-% \end{tikzpicture}
-% \Body
-% a & a + b & a + b + c & L_1 \\
-% a & a & a + b & L_2 \\
-% a & a & a & L_3
-% \end{pNiceArray}\]
-%
-%
-
-%
-% \subsection{Utilisation of \textbackslash SubMatrix in the \textbackslash CodeBefore}
-%
-% \label{submatrix-in-codebefore}
-%
-% In the following example, we illustrate the mathematical product of two
-% matrices.
-%
-% The whole figure is an environment |{NiceArray}| and the three pairs of
-% parenthesis have been added with |\SubMatrix| in the |\CodeBefore|.
-%
-% \tikzset{highlight/.style={rectangle,
-% fill=red!15,
-% rounded corners = 0.5 mm,
-% inner sep=1pt,
-% fit=#1}}%
-% \[\begin{NiceArray}{*{6}{c}@{\hspace{6mm}}*{5}{c}}[nullify-dots]
-% \CodeBefore [create-cell-nodes]
-% \SubMatrix({2-7}{6-last})
-% \SubMatrix({7-2}{last-6})
-% \SubMatrix({7-7}{last-last})
-% \begin{tikzpicture}
-% \node [highlight = (9-2) (9-6)] { } ;
-% \node [highlight = (2-9) (6-9)] { } ;
-% \end{tikzpicture}
-% \Body
-% & & & & & & & & \color{blue}\scriptstyle C_j \\
-% & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
-% & & & & & & \Vdots & & \Vdots & & \Vdots \\
-% & & & & & & & & b_{kj} \\
-% & & & & & & & & \Vdots \\
-% & & & & & & b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} \\[3mm]
-% & a_{11} & \Cdots & & & a_{1n} \\
-% & \Vdots & & & & \Vdots & & & \Vdots \\
-% \color{blue}\scriptstyle L_i
-% & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} & \Cdots & & c_{ij} \\
-% & \Vdots & & & & \Vdots \\
-% & a_{n1} & \Cdots & & & a_{nn} \\
-% \CodeAfter
-% \tikz \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ;
-% \end{NiceArray}\]
-%
-%
-% \vspace{1cm}
-% \begin{Verbatim}
-% \tikzset{highlight/.style={rectangle,
-% fill=red!15,
-% rounded corners = 0.5 mm,
-% inner sep=1pt,
-% fit=~#1}}
-% \end{Verbatim}
-%
-% \begin{Verbatim}[formatcom = \small\color{gray}]
-% \[\begin{NiceArray}{*{6}{c}~LetterAt{\hspace{6mm}}*{5}{c}}[nullify-dots]
-% \CodeBefore [create-cell-nodes]
-% \SubMatrix({2-7}{6-last})
-% \SubMatrix({7-2}{last-6})
-% \SubMatrix({7-7}{last-last})
-% \begin{tikzpicture}
-% \node [highlight = (9-2) (9-6)] { } ;
-% \node [highlight = (2-9) (6-9)] { } ;
-% \end{tikzpicture}
-% \Body
-% & & & & & & & & \color{blue}\scriptstyle C_j \\
-% & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\
-% & & & & & & \Vdots & & \Vdots & & \Vdots \\
-% & & & & & & & & b_{kj} \\
-% & & & & & & & & \Vdots \\
-% & & & & & & b_{n1} & \Cdots & b_{nj} & \Cdots & b_{nn} \\[3mm]
-% & a_{11} & \Cdots & & & a_{1n} \\
-% & \Vdots & & & & \Vdots & & & \Vdots \\
-% \color{blue}\scriptstyle L_i
-% & a_{i1} & \Cdots & a_{ik} & \Cdots & a_{in} & \Cdots & & c_{ij} \\
-% & \Vdots & & & & \Vdots \\
-% & a_{n1} & \Cdots & & & a_{nn} \\
-% \CodeAfter
-% \tikz \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ;
-% \end{NiceArray}\]
-% \end{Verbatim}
-%
-%
-%
-% \subsection{A triangular tabular}
-%
-% \label{triangular}
-%
-% In the following example, we use the style PGF/TikZ |nicematrix/cell-node|
-% to rotate the contents of the cells (and, then, we compensate that rotation by
-% a rotation of the whole tabular with the command |\adjustbox| of the eponymous
-% package, which must be loaded previously).
-%
-%
-% \medskip
-% \begin{Verbatim}
-% \pgfset
-% {
-% ~emphase#nicematrix/cell-node@/.append style =
-% { text/rotate = 45, minimum size = 6 mm }
-% }
-%
-% \setlength{\tabcolsep}{0pt}
-%
-% ~emphase#\adjustbox@{rotate = -45, set depth = 6mm + 1.414 \arrayrulewidth}
-% {\begin{NiceTabular} [ hvlines, corners=SE, baseline = line-9 ] { cccccccc }
-% \CodeBefore
-% \chessboardcolors{red!15}{blue!15}
-% \Body
-% 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
-% 1 & 2 & 3 & 4 & 5 & 6 & 7 \\
-% 1 & 3 & 6 & 10 & 15 & 21 \\
-% 1 & 4 & 10 & 20 & 35 \\
-% 1 & 5 & 15 & 35 \\
-% 1 & 6 & 21 \\
-% 1 & 7 \\
-% 1
-% \end{NiceTabular}}
-% \end{Verbatim}
-%
-%
-% \begin{center}
-% \pgfset
-% {
-% nicematrix/cell-node/.append style =
-% { text/rotate = 45, minimum size = 6 mm }
-% }%
-% \setlength{\tabcolsep}{0pt}%
-% \adjustbox{rotate = -45, set depth = 6mm + 1.414 \arrayrulewidth}
-% {\begin{NiceTabular} [ hvlines, corners=SE, baseline = line-9 ] { cccccccc }
-% \CodeBefore
-% \chessboardcolors{red!15}{blue!15}
-% \Body
-% 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\
-% 1 & 2 & 3 & 4 & 5 & 6 & 7 \\
-% 1 & 3 & 6 & 10 & 15 & 21 \\
-% 1 & 4 & 10 & 20 & 35 \\
-% 1 & 5 & 15 & 35 \\
-% 1 & 6 & 21 \\
-% 1 & 7 \\
-% 1
-% \end{NiceTabular}}
-% \end{center}
-%
-%
-%
-% \section{Implementation}
-%
-% By default, the package \pkg{nicematrix} doesn't patch any existing code.
-%
-% \smallskip
-% However, when the option |renew-dots| is used, the commands |\cdots|,
-% |\ldots|, |\dots|, |\vdots|, |\ddots| and |\iddots| are redefined in the
-% environments provided by \pkg{nicematrix} as explained previously. In the same
-% way, if the option |renew-matrix| is used, the environment |{matrix}| of
-% \pkg{amsmath} is redefined.
-%
-% \smallskip
-% On the other hand, the environment |{array}| is never redefined.
-%
-% \smallskip
-% Of course, the package \pkg{nicematrix} uses the features of the package
-% \pkg{array}. It tries to be independent of its implementation. Unfortunately,
-% it was not possible to be strictly independent. For example, the package
-% \pkg{nicematrix} relies upon the fact that the package |{array}| uses
-% |\ialign| to begin the |\halign|.
-%
-%
-% \bigskip
-% \subsection*{Declaration of the package and packages loaded}
-%
-%
-% The prefix |nicematrix| has been registred for this package.
-%
-% See: |http://mirrors.ctan.org/macros/latex/contrib/l3kernel/l3prefixes.pdf|
-%
-%<@@=nicematrix>
-%
-% \bigskip
-% First, we load \pkg{pgfcore} and the module \pkg{shapes}. We do so because
-% it's not possible to use |\usepgfmodule| in |\ExplSyntaxOn|.
-% \begin{macrocode}
-\RequirePackage{pgfcore}
-\usepgfmodule{shapes}
-% \end{macrocode}
-%
-%
-% We give the traditional declaration of a package written with the L3
-% programming layer.
-% \begin{macrocode}
-\RequirePackage{l3keys2e}
-\ProvidesExplPackage
- {nicematrix}
- {\myfiledate}
- {\myfileversion}
- {Enhanced arrays with the help of PGF/TikZ}
-% \end{macrocode}
-%
-%
-% \bigskip
-% The command for the treatment of the options of |\usepackage| is at the end of
-% this package for technical reasons.
-%
-% \bigskip
-% We load some packages.
-% \begin{macrocode}
-\RequirePackage { array }
-\RequirePackage { amsmath }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_error:n { \msg_error:nn { nicematrix } }
-\cs_new_protected:Npn \@@_warning:n { \msg_warning: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 } }
-\cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { 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}
-%
-% \bigskip
-% We also create a command which will genereate usually an error but only a
-% warning on Overleaf. The argument is given by currification.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_error_or_warning:n
- { \bool_if:NTF \c_@@_messages_for_Overleaf_bool \@@_warning:n \@@_error:n }
-% \end{macrocode}
-%
-% We try to detect whether the compilation is done on Overleaf. We use
-% |\c_sys_jobname_str| because, with Overleaf, the value of |\c_sys_jobname_str|
-% is always ``|output|''.
-% \begin{macrocode}
-\bool_set:Nn \c_@@_messages_for_Overleaf_bool
- {
- \str_if_eq_p:Vn \c_sys_jobname_str { _region_ } % for Emacs
- || \str_if_eq_p:Vn \c_sys_jobname_str { output } % for Overleaf
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_msg_redirect_name:nn
- { \msg_redirect_name:nnn { nicematrix } }
-\cs_new_protected:Npn \@@_gredirect_none:n #1
- {
- \group_begin:
- \globaldefs = 1
- \@@_msg_redirect_name:nn { #1 } { none }
- \group_end:
- }
-\cs_new_protected:Npn \@@_err_gredirect_none:n #1
- {
- \@@_error:n { #1 }
- \@@_gredirect_none:n { #1 }
- }
-\cs_new_protected:Npn \@@_warning_gredirect_none:n #1
- {
- \@@_warning:n { #1 }
- \@@_gredirect_none:n { #1 }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection*{Security test}
-%
-% Within the package \pkg{nicematrix}, we will have to test whether a cell of a
-% |{NiceTabular}| is empty. For the cells of the columns of type |p|, |b|, |m|,
-% |X| and |V|, we will test whether the cell is syntactically empty (that is to
-% say that there is only spaces between the ampersands |&|). That test will be
-% done with the command |\@@_test_if_empty:| by testing if the two first tokens
-% in the cells are (during the TeX process) are |\ignorespaces| and |\unskip|.
-%
-% However, if, one day, there is a changement in the implementation of
-% \pkg{array}, maybe that this test will be broken (and \pkg{nicematrix} also).
-%
-% That's why, by security, we will take a test in a small |{tabular}| composed
-% in the box |\l_tmpa_box| used as sandbox.
-%
-% \begin{macrocode}
-\@@_msg_new:nn { Internal~error }
- {
- Potential~problem~when~using~nicematrix.\\
- The~package~nicematrix~have~detected~a~modification~of~the~
- standard~environment~{array}~(of~the~package~array).~Maybe~you~will~encounter~
- some~slight~problems~when~using~nicematrix.~If~you~don't~want~to~see~
- this~message~again,~load~nicematrix~with:~\token_to_str:N
- \usepackage[no-test-for-array]{nicematrix}.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\@@_msg_new:nn { mdwtab~loaded }
- {
- The~packages~'mdwtab'~and~'nicematrix'~are~incompatible.~
- This~error~is~fatal.
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_security_test:n #1
- {
- \peek_meaning:NTF \ignorespaces
- { \@@_security_test_i:w }
- { \@@_error:n { Internal~error } }
- #1
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_security_test_i:w \ignorespaces #1
- {
- \peek_meaning:NF \unskip { \@@_error:n { Internal~error } }
- #1
- }
-% \end{macrocode}
-%
-% \bigskip
-% Here, the box |\l_tmpa_box| will be used as sandbox to take our security test.
-% This code has benne modified in version 6.18 (see question 682891 on TeX
-% StackExchange).
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument / after } { . }
- {
- \@ifpackageloaded { mdwtab }
- { \@@_fatal:n { mdwtab~loaded } }
- {
- \bool_if:NF \c_@@_no_test_for_array_bool
- {
- \group_begin:
- \hbox_set:Nn \l_tmpa_box
- {
- \begin { tabular } { c > { \@@_security_test:n } c c }
- text & & text
- \end { tabular }
- }
- \group_end:
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection*{Technical definitions}
-%
-% \begin{macrocode}
-\tl_new:N \l_@@_argspec_tl
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \seq_set_split:Nnn { N V n }
-\cs_generate_variant:Nn \keys_define:nn { n x }
-\cs_generate_variant:Nn \str_lowercase:n { V }
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument } { . }
- {
- \@ifpackageloaded { varwidth }
- { \bool_const:Nn \c_@@_varwidth_loaded_bool { \c_true_bool } }
- { \bool_const:Nn \c_@@_varwidth_loaded_bool { \c_false_bool } }
- \@ifpackageloaded { booktabs }
- { \bool_const:Nn \c_@@_booktabs_loaded_bool { \c_true_bool } }
- { \bool_const:Nn \c_@@_booktabs_loaded_bool { \c_false_bool } }
- \@ifpackageloaded { enumitem }
- { \bool_const:Nn \c_@@_enumitem_loaded_bool { \c_true_bool } }
- { \bool_const:Nn \c_@@_enumitem_loaded_bool { \c_false_bool } }
- \@ifpackageloaded { tabularx }
- { \bool_const:Nn \c_@@_tabularx_loaded_bool { \c_true_bool } }
- { \bool_const:Nn \c_@@_tabularx_loaded_bool { \c_false_bool } }
- \@ifpackageloaded { floatrow }
- { \bool_const:Nn \c_@@_floatrow_loaded_bool { \c_true_bool } }
- { \bool_const:Nn \c_@@_floatrow_loaded_bool { \c_false_bool } }
- \@ifpackageloaded { tikz }
- {
-% \end{macrocode}
-% In some constructions, we will have to use a |{pgfpicture}| which \emph{must}
-% be replaced by a |{tikzpicture}| if Tikz is loaded. However, this switch
-% between |{pgfpicture}| and |{tikzpicture}| can't be done dynamically with a
-% conditional because, when the Tikz library |external| is loaded by the user,
-% the pair |\tikzpicture|-|\endtikpicture| (or
-% |\begin{tikzpicture}-\end{tikzpicture}|) must be statically ``visible'' (even
-% when externalization is not activated).
-%
-% That's why we create |\c_@@_pgfortikzpicture_tl| and
-% |\c_@@_endpgfortikzpicture_tl| which will be used to construct in a
-% |\AtBeginDocument| the correct version of some commands. The tokens
-% |\exp_not:N| are mandatory.
-% \begin{macrocode}
- \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 }
- }
- }
-% \end{macrocode}
-%
-% 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 March 2023, the current
-% version \cls{revtex4-2} is 4.2e (compatible with \pkg{booktabs}).
-%
-% \begin{macrocode}
-\@ifclassloaded { revtex4-1 }
- { \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_const:Nn \c_@@_revtex_bool \c_true_bool }
- { \bool_const:Nn \c_@@_revtex_bool \c_false_bool }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_generate_variant:Nn \tl_if_single_token_p:n { V }
-% \end{macrocode}
-%
-% \bigskip
-% The following regex will be used to modify the preamble of the array when the
-% key |colortbl-like| is used.
-% \begin{macrocode}
-\regex_const:Nn \c_@@_columncolor_regex { \c { columncolor } }
-% \end{macrocode}
-%
-% \bigskip
-% If the final user uses \pkg{nicematrix}, PGF/Tikz will write instruction
-% |\pgfsyspdfmark| in the |aux| file. If he changes its mind and no longer loads
-% \pkg{nicematrix}, an error may occur at the next compilation because of
-% remanent instructions |\pgfsyspdfmark| in the |aux| file. With the following
-% code, we try to avoid that situation.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_provide_pgfsyspdfmark:
- {
- \iow_now:Nn \@mainaux
- {
- \ExplSyntaxOn
- \cs_if_free:NT \pgfsyspdfmark
- { \cs_set_eq:NN \pgfsyspdfmark \@gobblethree }
- \ExplSyntaxOff
- }
- \cs_gset_eq:NN \@@_provide_pgfsyspdfmark: \prg_do_nothing:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% We define a command |\iddots| similar to |\ddots| ($\ddots$) but with dots
-% going forward ($\iddots$). We use |\ProvideDocumentCommand| and so, if the
-% command |\iddots| has already been defined (for example by the package
-% \pkg{mathdots}), we don't define it again.
-%
-% \begin{macrocode}
-\ProvideDocumentCommand \iddots { }
- {
- \mathinner
- {
- \tex_mkern:D 1 mu
- \box_move_up:nn { 1 pt } { \hbox:n { . } }
- \tex_mkern:D 2 mu
- \box_move_up:nn { 4 pt } { \hbox:n { . } }
- \tex_mkern:D 2 mu
- \box_move_up:nn { 7 pt }
- { \vbox:n { \kern 7 pt \hbox:n { . } } }
- \tex_mkern:D 1 mu
- }
- }
-% \end{macrocode}
-%
-% This definition is a variant of the standard definition of |\ddots|.
-%
-%
-% \bigskip
-% In the |aux| file, we will have the references of the PGF/Tikz nodes created
-% by \pkg{nicematrix}. However, when \pkg{booktabs} is used, some nodes (more
-% precisely, some |row| nodes) will be defined twice because their position will
-% be modified. In order to avoid an error message in this case, we will redefine
-% |\pgfutil at check@rerun| in the |aux| file.
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument } { . }
- {
- \@ifpackageloaded { booktabs }
- { \iow_now:Nn \@mainaux \nicematrix at redefine@check at rerun }
- { }
- }
-\cs_set_protected:Npn \nicematrix at redefine@check at rerun
- {
- \cs_set_eq:NN \@@_old_pgfutil at check@rerun \pgfutil at check@rerun
-% \end{macrocode}
-% The new version of |\pgfutil at check@rerun| will not check the PGF nodes whose
-% names start with |nm-| (which is the prefix for the nodes created by
-% \pkg{nicematrix}).
-% \begin{macrocode}
- \cs_set_protected:Npn \pgfutil at check@rerun ##1 ##2
- {
- \str_if_eq:eeF { nm- } { \tl_range:nnn { ##1 } 1 3 }
- { \@@_old_pgfutil at check@rerun { ##1 } { ##2 } }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% We have to know whether \pkg{colortbl} is loaded in particular for the
-% redefinition of |\everycr|.
-% \begin{macrocode}
-\bool_new:N \l_@@_colortbl_loaded_bool
-\hook_gput_code:nnn { begindocument } { . }
- {
- \@ifpackageloaded { colortbl }
- { \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
-% the rules in the array. We will use it to store the instruction of color for
-% the rules even if \pkg{colortbl} is not loaded.
-% \begin{macrocode}
- \cs_set_protected:Npn \CT at arc@ { }
- \cs_set:Npn \arrayrulecolor #1 # { \CT at arc { #1 } }
- \cs_set:Npn \CT at arc #1 #2
- {
- \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign
- { \cs_gset:Npn \CT at arc@ { \color #1 { #2 } } }
- }
-% \end{macrocode}
-% Idem for |\CT at drs@|.
-% \begin{macrocode}
- \cs_set:Npn \doublerulesepcolor #1 # { \CT at drs { #1 } }
- \cs_set:Npn \CT at drs #1 #2
- {
- \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign
- { \cs_gset:Npn \CT at drsc@ { \color #1 { #2 } } }
- }
- \cs_set:Npn \hline
- {
- \noalign { \ifnum 0 = `} \fi
- \cs_set_eq:NN \hskip \vskip
- \cs_set_eq:NN \vrule \hrule
- \cs_set_eq:NN \@width \@height
- { \CT at arc@ \vline }
- \futurelet \reserved at a
- \@xhline
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% We have to redefine |\cline| for several reasons. The command |\@@_cline| will
-% be linked to |\cline| in the beginning of |{NiceArrayWithDelims}|. The
-% following commands must \emph{not} be protected.
-% \begin{macrocode}
-\cs_set:Npn \@@_standard_cline #1 { \@@_standard_cline:w #1 \q_stop }
-\cs_set:Npn \@@_standard_cline:w #1-#2 \q_stop
- {
- \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & }
- \int_compare:nNnT { #1 } > 1 { \multispan { \int_eval:n { #1 - 1 } } & }
- \multispan { \int_eval:n { #2 - #1 + 1 } }
- {
- \CT at arc@
- \leaders \hrule \@height \arrayrulewidth \hfill
-% \end{macrocode}
-% The following |\skip_horizontal:N \c_zero_dim| is to prevent a potential
-% |\unskip| to delete the |\leaders|\footnote{See question 99041 on TeX
-% StackExchange.}
-% \begin{macrocode}
- \skip_horizontal:N \c_zero_dim
- }
-% \end{macrocode}
-% Our |\everycr| has been modified. In particular, the creation of the |row|
-% node is in the |\everycr| (maybe we should put it with the incrementation of
-% |\c at iRow|). Since the following |\cr| correspond to a ``false row'', we have
-% to nullify |\everycr|.
-% \begin{macrocode}
- \everycr { }
- \cr
- \noalign { \skip_vertical:N -\arrayrulewidth }
- }
-% \end{macrocode}
-%
-% \bigskip
-% The following version of |\cline| spreads the array of a quantity equal
-% to |\arrayrulewidth| as does |\hline|. It will be loaded excepted if the key
-% |standard-cline| has been used.
-% \begin{macrocode}
-\cs_set:Npn \@@_cline
-% \end{macrocode}
-% We have to act in a fully expandable way since there may be |\noalign| (in the
-% |\multispan|) to detect. That's why we use |\@@_cline_i:en|.
-% \begin{macrocode}
- { \@@_cline_i:en \l_@@_first_col_int }
-% \end{macrocode}
-% The command |\cline_i:nn| has two arguments. The first is the number of the
-% current column (it \emph{must} be used in that column). The second is a
-% standard argument of |\cline| of the form \textsl{i}-\textsl{j} or the form
-% \textsl{i}.
-% \begin{macrocode}
-\cs_set:Npn \@@_cline_i:nn #1 #2 { \@@_cline_i:w #1|#2- \q_stop }
-\cs_set:Npn \@@_cline_i:w #1|#2-#3 \q_stop
- {
- \tl_if_empty:nTF { #3 }
- { \@@_cline_iii:w #1|#2-#2 \q_stop }
- { \@@_cline_ii:w #1|#2-#3 \q_stop }
- }
-\cs_set:Npn \@@_cline_ii:w #1|#2-#3-\q_stop
- { \@@_cline_iii:w #1|#2-#3 \q_stop }
-\cs_set:Npn \@@_cline_iii:w #1|#2-#3 \q_stop
- {
-% \end{macrocode}
-% Now, |#1| is the number of the current column and we have to draw a line from
-% the column |#2| to the column |#3| (both included).
-% \begin{macrocode}
- \int_compare:nNnT { #1 } < { #2 }
- { \multispan { \int_eval:n { #2 - #1 } } & }
- \multispan { \int_eval:n { #3 - #2 + 1 } }
- {
- \CT at arc@
- \leaders \hrule \@height \arrayrulewidth \hfill
- \skip_horizontal:N \c_zero_dim
- }
-% \end{macrocode}
-% You look whether there is another |\cline| to draw (the final user may put
-% several |\cline|).
-% \begin{macrocode}
- \peek_meaning_remove_ignore_spaces:NTF \cline
- { & \@@_cline_i:en { \int_eval:n { #3 + 1 } } }
- { \everycr { } \cr }
- }
-\cs_generate_variant:Nn \@@_cline_i:nn { e n }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following command is a small shortcut.
-% \begin{macrocode}
-\cs_new:Npn \@@_math_toggle_token:
- { \bool_if:NF \l_@@_NiceTabular_bool \c_math_toggle_token }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_CT at arc@:n #1
- {
- \tl_if_blank:nF { #1 }
- {
- \tl_if_head_eq_meaning:nNTF { #1 } [
- { \cs_set:Npn \CT at arc@ { \color #1 } }
- { \cs_set:Npn \CT at arc@ { \color { #1 } } }
- }
- }
-\cs_generate_variant:Nn \@@_set_CT at arc@:n { V }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_set_CT at drsc@:n #1
- {
- \tl_if_head_eq_meaning:nNTF { #1 } [
- { \cs_set:Npn \CT at drsc@ { \color #1 } }
- { \cs_set:Npn \CT at drsc@ { \color { #1 } } }
- }
-\cs_generate_variant:Nn \@@_set_CT at drsc@:n { V }
-% \end{macrocode}
-%
-% \bigskip
-% The following command must \emph{not} be protected since it will be used to
-% write instructions in the (internal) |\CodeBefore|.
-% \begin{macrocode}
-\cs_new:Npn \@@_exp_color_arg:Nn #1 #2
- {
- \tl_if_head_eq_meaning:nNTF { #2 } [
- { #1 #2 }
- { #1 { #2 } }
- }
-\cs_generate_variant:Nn \@@_exp_color_arg:Nn { N V }
-% \end{macrocode}
-%
-% The following command must be protected because of its use of the command |\color|.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_color:n #1
- {
- \tl_if_blank:nF { #1 }
- { \@@_exp_color_arg:Nn \color { #1 } }
- }
-\cs_generate_variant:Nn \@@_color:n { V }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_set_eq:NN \@@_old_pgfpointanchor \pgfpointanchor
-% \end{macrocode}
-%
-% \bigskip
-% \textbf{The column S of siunitx}\par\nobreak
-%
-% \medskip
-% We want to know whether the package \pkg{siunitx} is loaded and, if it is
-% loaded, we redefine the |S| columns of \pkg{siunitx}.
-% \begin{macrocode}
-\bool_new:N \l_@@_siunitx_loaded_bool
-\hook_gput_code:nnn { begindocument } { . }
- {
- \@ifpackageloaded { siunitx }
- { \bool_set_true:N \l_@@_siunitx_loaded_bool }
- { }
- }
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The command |\@@_renew_NC at rewrite@S:| will be used in each environment of
-% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment.
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument } { . }
- {
- \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:
- {
- \renewcommand*{\NC at rewrite@S}[1][]
- {
-% \end{macrocode}
-% |\@temptokena| is a toks (not supported by the L3 programming layer).
-% \begin{macrocode}
- \tl_if_empty:nTF { ##1 }
- {
- \@temptokena \exp_after:wN
- { \tex_the:D \@temptokena \@@_S: }
- }
- {
- \@temptokena \exp_after:wN
- { \tex_the:D \@temptokena \@@_S: [ ##1 ] }
- }
- \NC at find
- }
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_rescan_for_spanish:N #1
- {
- \tl_set_rescan:Nno
- #1
- {
- \char_set_catcode_other:N >
- \char_set_catcode_other:N <
- }
- #1
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection*{Parameters}
-%
-% \bigskip
-% The following counter will count the environments |{NiceArray}|. The value of
-% this counter will be used to prefix the names of the Tikz nodes created in the
-% array.
-% \begin{macrocode}
-\int_new:N \g_@@_env_int
-% \end{macrocode}
-%
-% \bigskip
-% The following command is only a syntaxic shortcut. It must \emph{not} be
-% protected (it will be used in names of \textsc{pgf} nodes).
-% \begin{macrocode}
-\cs_new:Npn \@@_env: { nm - \int_use:N \g_@@_env_int }
-% \end{macrocode}
-%
-% \bigskip
-% The command |\NiceMatrixLastEnv| is not used by the package \pkg{nicematrix}.
-% It's only a facility given to the final user. It gives the number of the last
-% environment (in fact the number of the current environment but it's meant to
-% be used after the environment in order to refer to that environment --- and
-% its nodes --- without having to give it a name). This command \emph{must} be
-% expandable since it will be used in \pkg{pgf} nodes.
-% \begin{macrocode}
-\NewExpandableDocumentCommand \NiceMatrixLastEnv { }
- { \int_use:N \g_@@_env_int }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following command is only a syntaxic shortcut. The |q| in |qpoint| means
-% \emph{quick}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_qpoint:n #1
- { \pgfpointanchor { \@@_env: - #1 } { center } }
-% \end{macrocode}
-%
-% \bigskip
-% The following counter will count the environments |{NiceMatrixBlock}|.
-% \begin{macrocode}
-\int_new:N \g_@@_NiceMatrixBlock_int
-% \end{macrocode}
-%
-% \bigskip
-% If, in a tabular, there is a tabular note in a caption that must be composed
-% \emph{above} the tabular, we will store in |\l_@@_note_in_caption_int| the
-% number of notes in that caption. It will be stored in the |aux| file.
-% \begin{macrocode}
-\int_new:N \l_@@_note_in_caption_int
-% \end{macrocode}
-%
-% \bigskip
-% The dimension |\l_@@_columns_width_dim| will be used when the options specify
-% that all the columns must have the same width (but, if the key |columns-width|
-% is used with the special value |auto|, the boolean
-% |l_@@_auto_columns_width_bool| also will be raised).
-% \begin{macrocode}
-\dim_new:N \l_@@_columns_width_dim
-% \end{macrocode}
-%
-% \bigskip
-% The dimension |\l_@@_col_width_dim| will be available in each cell which
-% belongs to a column of fixed width: |w{...}{...}|, |W{...}{...}|, |p{}|,
-% |m{}|, |b{}| but also |X| (when the actual width of that column is known, that
-% is to say after the first compilation). It's the width of that column. It will
-% be used by some commands |\Block|. A non positive value means that the column
-% has no fixed width (it's a column of type |c|, |r|, |l|, etc.).
-% \begin{macrocode}
-\dim_new:N \l_@@_col_width_dim
-\dim_set:Nn \l_@@_col_width_dim { -1 cm }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following counters will be used to count the numbers of rows and columns
-% of the array.
-% \begin{macrocode}
-\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
-% |\RowStyle|.
-% \begin{macrocode}
-\int_new:N \l_@@_key_nb_rows_int
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following token list will contain the type of horizontal alignment of the
-% current cell as provided by the corresponding column. The possible values are
-% |r|, |l|, |c|. For example, a column |p[l]{3cm}| will provide the value |l|
-% for all the cells of the column.
-% \begin{macrocode}
-\str_new:N \l_@@_hpos_cell_str
-\str_set:Nn \l_@@_hpos_cell_str { c }
-% \end{macrocode}
-%
-% \bigskip
-% When there is a mono-column block (created by the command |\Block|), we want
-% to take into account the width of that block for the width of the column.
-% That's why we compute the width of that block in the |\g_@@_blocks_wd_dim|
-% and, after the construction of the box |\l_@@_cell_box|, we change the width
-% of that box to take into account the length |\g_@@_blocks_wd_dim|.
-% \begin{macrocode}
-\dim_new:N \g_@@_blocks_wd_dim
-% \end{macrocode}
-%
-% \bigskip
-% Idem for the mono-row blocks.
-% \begin{macrocode}
-\dim_new:N \g_@@_blocks_ht_dim
-\dim_new:N \g_@@_blocks_dp_dim
-% \end{macrocode}
-%
-% \bigskip
-% The following dimension will be used by the command |\Block| for the blocks
-% with a key of vertical position equal to |T| or |B|.
-% \begin{macrocode}
-\dim_new:N \l_@@_block_ysep_dim
-% \end{macrocode}
-%
-% \bigskip
-% The following dimension correspond to the key |width| (which may be fixed in
-% |\NiceMatrixOptions| but also in an environment |{NiceTabular}|).
-% \begin{macrocode}
-\dim_new:N \l_@@_width_dim
-% \end{macrocode}
-%
-% \bigskip
-% The sequence |\g_@@_names_seq| will be the list of all the names of
-% environments used (via the option |name|) in the document: two environments
-% must not have the same name. However, it's possible to use the option
-% |allow-duplicate-names|.
-% \begin{macrocode}
-\seq_new:N \g_@@_names_seq
-% \end{macrocode}
-%
-% \bigskip
-% We want to know whether we are in an environment of \pkg{nicematrix} because we
-% will raise an error if the user tries to use nested environments.
-% \begin{macrocode}
-\bool_new:N \l_@@_in_env_bool
-% \end{macrocode}
-%
-% \bigskip
-% 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
-% |\g_@@_NiceArray_bool| will be raised.
-% \begin{macrocode}
-\bool_new:N \g_@@_NiceArray_bool
-% \end{macrocode}
-% In fact, if there is delimiters in the preamble of |{NiceArray}| (eg:
-% |[cccc]|), this boolean will be set to false.
-%
-% \bigskip
-% If the user uses |{NiceTabular}|, |{NiceTabular*}| or |{NiceTabularX}|, we
-% will raise the following flag.
-% \begin{macrocode}
-\bool_new:N \l_@@_NiceTabular_bool
-% \end{macrocode}
-%
-% \bigskip
-% If the user uses |{NiceTabular*}|, the width of the tabular (in the first
-% argument of the environment |{NiceTabular*}|) will be stored in the following
-% dimension.
-% \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
-% flag.
-% \begin{macrocode}
-\bool_new:N \l_@@_Matrix_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following boolean will be raised when the command |\rotate| is used.
-% \begin{macrocode}
-\bool_new:N \g_@@_rotate_bool
-% \end{macrocode}
-%
-% \bigskip
-% In a cell, it will be possible to know whether we are in a cell of a column of
-% type |X| thanks to that flag.
-% \begin{macrocode}
-\bool_new:N \l_@@_X_column_bool
-% \end{macrocode}
-%
-% \begin{macrocode}
-\bool_new:N \g_@@_caption_finished_bool
-% \end{macrocode}
-%
-% \bigskip
-% We will write in |\g_@@_aux_tl| all the instructions that we have to write on
-% the |aux| file for the current environment. The contain of that token list
-% will be written on the |aux| file at the end of the environment (in an
-% instruction |\tl_gset:cn { c_@@_ \int_use:N \g_@@_env_int _ tl }|).
-% \begin{macrocode}
-\tl_new:N \g_@@_aux_tl
-% \end{macrocode}
-%
-% \bigskip
-% The following parameter corresponds to the key |columns-type| of the
-% environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. and also the key
-% |matrix / columns-type| of |\NiceMatrixOptions|. However, it does \emph{not}
-% contain the value provided by the final user. Indeed, a transformation is done
-% in order to have a preamble (for the package \pkg{array}) which is
-% nicematrix-aware. That transformation is done with the command
-% |\@@_set_preamble:Nn|.
-% \begin{macrocode}
-\tl_new:N \l_@@_columns_type_tl
-\hook_gput_code:nnn { begindocument } { . }
- { \@@_set_preamble:Nn \l_@@_columns_type_tl { c } }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_test_if_math_mode:
- {
- \if_mode_math: \else:
- \@@_fatal:n { Outside~math~mode }
- \fi:
- }
-% \end{macrocode}
-%
-% \bigskip
-% The letter used for the vlines which will be drawn only in the sub-matrices.
-% |vlism| stands for \emph{vertical lines in sub-matrices}.
-% \begin{macrocode}
-\tl_new:N \l_@@_letter_vlism_tl
-% \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
-% analyse of the preamble of the array.
-% \begin{macrocode}
-\seq_new:N \g_@@_cols_vlism_seq
-% \end{macrocode}
-%
-% \bigskip
-% The following colors will be used to memorize the color of the potential ``first
-% col'' and the potential ``first row''.
-% \begin{macrocode}
-\colorlet { nicematrix-last-col } { . }
-\colorlet { nicematrix-last-row } { . }
-% \end{macrocode}
-% \bigskip
-% The following string is the name of the current environment or the current
-% command of \pkg{nicematrix} (despite its name which contains \textsl{env}).
-% \begin{macrocode}
-\str_new:N \g_@@_name_env_str
-% \end{macrocode}
-%
-% \bigskip
-% The following string will contain the word \emph{command} or
-% \emph{environment} whether we are in a command of \pkg{nicematrix} or in an
-% environment of \pkg{nicematrix}. The default value is \emph{environment}.
-% \begin{macrocode}
-\tl_new:N \g_@@_com_or_env_str
-\tl_gset:Nn \g_@@_com_or_env_str { environment }
-% \end{macrocode}
-%
-% \bigskip
-% The following command will be able to reconstruct the full name of the current
-% command or environment (despite its name which contains \textsl{env}). This
-% command must \emph{not} be protected since it will be used in error messages
-% and we have to use |\str_if_eq:VnTF| and not |\tl_if_eq:NnTF| because we need
-% to be fully expandable).
-% \begin{macrocode}
-\cs_new:Npn \@@_full_name_env:
- {
- \str_if_eq:VnTF \g_@@_com_or_env_str { command }
- { command \space \c_backslash_str \g_@@_name_env_str }
- { environment \space \{ \g_@@_name_env_str \} }
- }
-% \end{macrocode}
-%
-% \bigskip
-% The following token list corresponds to the option |code-after| (it's also
-% possible to set the value of that parameter with the keyword |\CodeAfter|).
-% That parameter is \emph{public}.
-% \begin{macrocode}
-\tl_new:N \g_nicematrix_code_after_tl
-\bool_new:N \l_@@_in_code_after_bool
-% \end{macrocode}
-%
-% \bigskip
-% For the key |code| of the command |\SubMatrix| (itself in the main
-% |\CodeAfter|), we will use the following token list.
-% \begin{macrocode}
-\tl_new:N \l_@@_code_tl
-% \end{macrocode}
-%
-% \bigskip
-% For the key |pgf-node-code|. That code will be used when the nodes of the
-% cells (that is to say the nodes of the form |i-j|) will be created.
-% \begin{macrocode}
-\tl_new:N \l_@@_pgf_node_code_tl
-% \end{macrocode}
-%
-% \bigskip
-% The following token list has a function similar to
-% |\g_nicematrix_code_after_tl| but it is used internally by \pkg{nicematrix}.
-% In fact, we have to distinguish between |\g_nicematrix_code_after_tl| and
-% |\g_@@_pre_code_after_tl| because we must take care of the order in which
-% instructions stored in that parameters are executed.
-% \begin{macrocode}
-\tl_new:N \g_@@_pre_code_after_tl
-% \end{macrocode}
-%
-% \bigskip
-% The value of the key |code-before| will be added to the left of
-% |\g_@@_pre_code_before_tl|. Idem for the code between |\CodeBefore| and
-% |\Body|.
-% \begin{macrocode}
-\tl_new:N \g_nicematrix_code_before_tl
-\tl_new:N \g_@@_pre_code_before_tl
-% \end{macrocode}
-%
-% \bigskip
-% The counters |\l_@@_old_iRow_int| and |\l_@@_old_jCol_int| will be used to
-% save the values of the potential LaTeX counters |iRow| and |jCol|. These LaTeX
-% counters will be restored at the end of the environment.
-% \begin{macrocode}
-\int_new:N \l_@@_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| by the key |command| or |ccommand| (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}
-\tl_new:N \l_@@_rules_color_tl
-% \end{macrocode}
-%
-% \bigskip
-% The sum of the weights of all the |X|-columns in the preamble. The weight of a
-% |X|-column is given as an optional argument between square brackets. The
-% default value, of course, is $1$.
-% \begin{macrocode}
-\int_new:N \g_@@_total_X_weight_int
-% \end{macrocode}
-%
-% If there is at least one |X|-column in the preamble of the array, the
-% following flag will be raised via the |aux| file. The length
-% |l_@@_x_columns_dim| will be the width of |X|-columns of weight $1$ (the width
-% of a column of weigth $n$ will be that dimension multiplied by~$n$). That
-% value is computed after the construction of the array during the first
-% compilation in order to be used in the following run.
-% \begin{macrocode}
-\bool_new:N \l_@@_X_columns_aux_bool
-\dim_new:N \l_@@_X_columns_dim
-% \end{macrocode}
-%
-%
-% \bigskip
-% This boolean will be used only to detect in an expandable way whether we are
-% at the beginning of the (potential) column zero, in order to raise an error if
-% |\Hdotsfor| is used in that column.
-% \begin{macrocode}
-\bool_new:N \g_@@_after_col_zero_bool
-% \end{macrocode}
-%
-% \bigskip
-% A kind of false row will be inserted at the end of the array for the
-% construction of the |col| nodes (and also to fix the width of the columns when
-% |columns-width| is used). When this special row will be created, we will raise
-% the flag |\g_@@_row_of_col_done_bool| in order to avoid some actions set in
-% the redefinition of |\everycr| when the last |\cr| of the |\halign| will occur
-% (after that row of |col| nodes).
-% \begin{macrocode}
-\bool_new:N \g_@@_row_of_col_done_bool
-% \end{macrocode}
-%
-%
-% \bigskip
-% It's possible to use the command |\NotEmpty| to specify explicitely that a
-% cell must be considered as non empty by \pkg{nicematrix} (the Tikz nodes are
-% constructed only in the non empty cells).
-% \begin{macrocode}
-\bool_new:N \g_@@_not_empty_cell_bool
-% \end{macrocode}
-%
-% \bigskip
-% |\l_@@_code_before_tl| may contain two types of informations:
-% \begin{itemize}
-% \item A |code-before| written in the |aux| file by a previous run. When the
-% |aux| file is read, this |code-before| is stored in
-% |\g_@@_code_before_|\textsl{i}|_tl| (where \textsl{i} is the number of the
-% environment) and, at the beginning of the environment, it will be put in
-% |\l_@@_code_before_tl|.
-% \item The final user can explicitly add material in |\l_@@_code_before_tl| by
-% using the key |code-before| or the keyword |\CodeBefore| (with the keyword
-% |\Body|).
-% \end{itemize}
-% \begin{macrocode}
-\tl_new:N \l_@@_code_before_tl
-\bool_new:N \l_@@_code_before_bool
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following token list will contain the code inserted in each cell of the
-% current row (this token list will be cleared at the beginning of each row).
-% \begin{macrocode}
-\tl_new:N \g_@@_row_style_tl
-% \end{macrocode}
-%
-% \bigskip
-% The following dimensions will be used when drawing the dotted lines.
-% \begin{macrocode}
-\dim_new:N \l_@@_x_initial_dim
-\dim_new:N \l_@@_y_initial_dim
-\dim_new:N \l_@@_x_final_dim
-\dim_new:N \l_@@_y_final_dim
-% \end{macrocode}
-%
-% \bigskip
-% The L3 programming layer provides scratch dimensions |\l_tmpa_dim| and
-% |\l_tmpb_dim|. We creates two more in the same spirit.
-% \begin{macrocode}
-\dim_zero_new:N \l_@@_tmpc_dim
-\dim_zero_new:N \l_@@_tmpd_dim
-% \end{macrocode}
-%
-% \bigskip
-% Some cells will be declared as ``empty'' (for example a cell with an
-% instruction |\Cdots|).
-% \begin{macrocode}
-\bool_new:N \g_@@_empty_cell_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following boolean will be used to deal with the commands |\tabularnote| in
-% the caption (command |\caption| or key |caption|).
-% \begin{macrocode}
-\bool_new:N \g_@@_second_composition_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following dimensions will be used internally to compute the width of the
-% potential ``first column'' and ``last column''.
-% \begin{macrocode}
-\dim_new:N \g_@@_width_last_col_dim
-\dim_new:N \g_@@_width_first_col_dim
-% \end{macrocode}
-%
-% \bigskip
-% The following sequence will contain the characteristics of the blocks of the
-% array, specified by the command |\Block|. Each block is represented by 6
-% components surrounded by curly braces:
-%
-% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|\textsl{options}|}{|\textsl{contents}|}|.
-%
-% The variable is global because it will be modified in the cells of the array.
-% \begin{macrocode}
-\seq_new:N \g_@@_blocks_seq
-% \end{macrocode}
-% We also manage a sequence of the \emph{positions} of the blocks. In that
-% sequence, each block is represented by only five components:
-% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|%
-% \textsl{name}|}|. A block with the key |hvlines| won't appear in that
-% sequence (otherwise, the lines in that block would not be drawn!).
-% \begin{macrocode}
-\seq_new:N \g_@@_pos_of_blocks_seq
-% \end{macrocode}
-% In fact, this sequence will also contain the positions of the cells with a
-% |\diagbox|. The sequence |\g_@@_pos_of_blocks_seq| will be used when we will
-% draw the rules (which respect the blocks).
-%
-% \bigskip
-% We will also manage a sequence for the positions of the dotted lines. These
-% dotted lines are created in the array by |\Cdots|, |\Vdots|, |\Ddots|, etc.
-% However, their positions, that is to say, their extremities, will be
-% determined only after the construction of the array. In this sequence, each
-% item contains five components:
-% |{|\textsl{imin}|}{|\textsl{jmin}|}{|\textsl{imax}|}{|\textsl{jmax}|}{|%
-% \textsl{name}|}|.
-% \begin{macrocode}
-\seq_new:N \g_@@_pos_of_xdots_seq
-% \end{macrocode}
-% The sequence |\g_@@_pos_of_xdots_seq| will be used when we will draw the rules
-% required by the key |hvlines| (these rules won't be drawn within the virtual
-% blocks corresponding to the dotted lines).
-%
-% \medskip
-% The final user may decide to ``stroke'' a block (using, for example, the key
-% |draw=red!15| when using the command |\Block|). In that case, the rules
-% specified, for instance, by |hvlines| must not be drawn around the block.
-% That's why we keep the information of all that stroken blocks in the following
-% sequence.
-% \begin{macrocode}
-\seq_new:N \g_@@_pos_of_stroken_blocks_seq
-% \end{macrocode}
-%
-%
-% \medskip
-% 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
-% \end{macrocode}
-%
-% \medskip
-% The list of the names of the potential |\SubMatrix| in the |\CodeAfter| of an
-% environment. Unfortunately, that list has to be global (we have to use it
-% inside the group for the options of a given |\SubMatrix|).
-% \begin{macrocode}
-\seq_new:N \g_@@_submatrix_names_seq
-% \end{macrocode}
-%
-% \medskip
-% The following flag will be raised if the key |width| is used in an environment
-% |{NiceTabular}| (not in a command |\NiceMatrixOptions|). You use it to raise
-% an error when this key is used while no column |X| is used.
-% \begin{macrocode}
-\bool_new:N \l_@@_width_used_bool
-% \end{macrocode}
-%
-% \medskip
-% The sequence |\g_@@_multicolumn_cells_seq| will contain the list of the cells
-% of the array where a command |\multicolumn{|$n$|}{...}{...}| with $n>1$ is
-% issued. In |\g_@@_multicolumn_sizes_seq|, the ``sizes'' (that is to say the
-% values of $n$) correspondant will be stored. These lists will be used for the
-% creation of the ``medium nodes'' (if they are created).
-% \begin{macrocode}
-\seq_new:N \g_@@_multicolumn_cells_seq
-\seq_new:N \g_@@_multicolumn_sizes_seq
-% \end{macrocode}
-%
-% \medskip
-% The following counters will be used when searching the extremities of a dotted
-% line (we need these counters because of the potential ``open'' lines in the
-% |\SubMatrix|---the |\SubMatrix| in the |code-before|).
-% \begin{macrocode}
-\int_new:N \l_@@_row_min_int
-\int_new:N \l_@@_row_max_int
-\int_new:N \l_@@_col_min_int
-\int_new:N \l_@@_col_max_int
-% \end{macrocode}
-%
-% \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 |\CodeBefore|. Each sub-matrix is
-% represented by an ``object'' of the form |{|$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.
-% \begin{macrocode}
-\seq_new:N \g_@@_submatrix_seq
-% \end{macrocode}
-%
-% \medskip
-% We are able to determine the number of columns specified in the preamble (for
-% the environments with explicit preamble of course and without the potential
-% exterior columns).
-% \begin{macrocode}
-\int_new:N \g_@@_static_num_of_col_int
-% \end{macrocode}
-%
-% \medskip
-% The following parameters correspond to the keys |fill|, |draw|, |tikz|, |borders|,
-% and |rounded-corners| of the command |\Block|.
-% \begin{macrocode}
-\tl_new:N \l_@@_fill_tl
-\tl_new:N \l_@@_draw_tl
-\seq_new:N \l_@@_tikz_seq
-\clist_new:N \l_@@_borders_clist
-\dim_new:N \l_@@_rounded_corners_dim
-% \end{macrocode}
-% The last parameter has no direct link with the [empty] corners of the array
-% (which are computed and taken into account by \pkg{nicematrix} when the key
-% |corners| is used).
-%
-% \medskip
-% The following dimension corresponds to the key |rounded-corners| available in
-% an individual environment |{NiceTabular}|. When that key is used, a clipping
-% is applied in the |\CodeBefore| of the environment in order to have rounded
-% corners for the potential colored panels.
-% \begin{macrocode}
-\dim_new:N \l_@@_tab_rounded_corners_dim
-% \end{macrocode}
-%
-% \medskip
-% The following token list correspond to the key |color| of the command |\Block|
-% and also the key |color| of the command |\RowStyle|.
-% \begin{macrocode}
-\tl_new:N \l_@@_color_tl
-% \end{macrocode}
-%
-% \medskip
-% Here is the dimension for the width of the rule when a block (created by
-% |\Block|) is stroked.
-% \begin{macrocode}
-\dim_new:N \l_@@_line_width_dim
-% \end{macrocode}
-%
-% \medskip
-% The parameters of the horizontal position of the label of a block. If the user
-% uses the key |c| or |C|, the value is |c|. If the user uses the key |l| or
-% |L|, the value is |l|. If the user uses the key |r| or |R|, the value is |r|.
-% If the user has used a capital letter, the boolean
-% |\l_@@_hpos_of_block_cap_bool| will be raised (in the second pass of the
-% analyze of the keys of the command |\Block|).
-% \begin{macrocode}
-\str_new:N \l_@@_hpos_block_str
-\str_set:Nn \l_@@_hpos_block_str { c }
-\bool_new:N \l_@@_hpos_of_block_cap_bool
-% \end{macrocode}
-%
-% \medskip
-% For the vertical position, the possible values are |c|, |t| and |b|. Of
-% course, it would be interesting to program a key |T| and a key |B|.
-% \begin{macrocode}
-\str_new:N \l_@@_vpos_of_block_str
-\str_set:Nn \l_@@_vpos_of_block_str { c }
-% \end{macrocode}
-%
-%
-% \medskip
-% Used when the key |draw-first| is used for |\Ddots| or |\Iddots|.
-% \begin{macrocode}
-\bool_new:N \l_@@_draw_first_bool
-% \end{macrocode}
-%
-%
-% \medskip
-% The following flag corresponds to the keys |vlines| and |hlines| of the
-% command |\Block| (the key |hvlines| is the conjunction of both).
-% \begin{macrocode}
-\bool_new:N \l_@@_vlines_block_bool
-\bool_new:N \l_@@_hlines_block_bool
-% \end{macrocode}
-%
-%
-% \medskip
-% The blocks which use the key |-| will store their content in a box. These
-% boxes are numbered with the following counter.
-% \begin{macrocode}
-\int_new:N \g_@@_block_box_int
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
-\dim_new:N \l_@@_submatrix_extra_height_dim
-\dim_new:N \l_@@_submatrix_left_xshift_dim
-\dim_new:N \l_@@_submatrix_right_xshift_dim
-\clist_new:N \l_@@_hlines_clist
-\clist_new:N \l_@@_vlines_clist
-\clist_new:N \l_@@_submatrix_hlines_clist
-\clist_new:N \l_@@_submatrix_vlines_clist
-% \end{macrocode}
-%
-% \medskip
-% The following key is set when the keys |hvlines| and |hvlines-except-borders|
-% are used. It's used only to change slightly the clipping path set by the key
-% |rounded-corners| (for a |{tabular}|).
-% \begin{macrocode}
-\bool_new:N \l_@@_hvlines_bool
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following flag will be used by (for instance) |\@@_vline_ii:|.
-% When |\l_@@_dotted_bool| is |true|, a dotted line (with our system) will be drawn.
-% \begin{macrocode}
-\bool_new:N \l_@@_dotted_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following flag will be set to true during the composition of a caption
-% specified (by the key |caption|).
-% \begin{macrocode}
-\bool_new:N \l_@@_in_caption_bool
-% \end{macrocode}
-%
-%
-% \bigskip
-% \textbf{Variables for the exterior rows and columns}\par\nobreak
-%
-% \medskip
-% The keys for the exterior rows and columns are |first-row|, |first-col|,
-% |last-row| and |last-col|. However, internally, these keys are not coded in a
-% similar way.
-%
-% \bigskip
-% \begin{itemize}
-% \item \textbf{First row}\par\nobreak
-% The integer |\l_@@_first_row_int| is the number of the first row of the
-% array. The default value is $1$, but, if the option |first-row| is used,
-% the value will be~$0$.
-% \begin{macrocode}
-\int_new:N \l_@@_first_row_int
-\int_set:Nn \l_@@_first_row_int 1
-% \end{macrocode}
-%
-% \medskip
-% \item \textbf{First column}\par\nobreak
-% The integer |\l_@@_first_col_int| is the number of the first column of the
-% array. The default value is $1$, but, if the option |first-col| is used,
-% the value will be~$0$.
-% \begin{macrocode}
-\int_new:N \l_@@_first_col_int
-\int_set:Nn \l_@@_first_col_int 1
-% \end{macrocode}
-%
-% \medskip
-% \item \textbf{Last row}\par\nobreak
-% The counter |\l_@@_last_row_int| is the number of the potential ``last row'',
-% as specified by the key |last-row|. A value of $-2$ means that there is no
-% ``last row''. A value of $-1$ means that there is a ``last row'' but we don't
-% know the number of that row (the key |last-row| has been used without value
-% and the actual value has not still been read in the |aux| file).
-% \begin{macrocode}
-\int_new:N \l_@@_last_row_int
-\int_set:Nn \l_@@_last_row_int { -2 }
-% \end{macrocode}
-%
-% \smallskip
-% If, in an environment like |{pNiceArray}|, the option |last-row| is used
-% without value, we will globally raise the following flag. It will be used to
-% know if we have, after the construction of the array, to write in the |aux|
-% file the number of the ``last row''.\footnote{We can't use
-% |\l_@@_last_row_int| for this usage because, if \pkg{nicematrix} has read its
-% value from the |aux| file, the value of the counter won't be $-1$ any longer.}
-% \begin{macrocode}
-\bool_new:N \l_@@_last_row_without_value_bool
-% \end{macrocode}
-%
-% \smallskip
-% Idem for |\l_@@_last_col_without_value_bool|
-% \begin{macrocode}
-\bool_new:N \l_@@_last_col_without_value_bool
-% \end{macrocode}
-%
-% \medskip
-% \item \textbf{Last column}\par\nobreak
-%
-% For the potential ``last column'', we use an integer. A value of $-2$ means
-% that there is no last column. A value of $-1$ means that we are in an
-% environment without preamble (e.g. |{bNiceMatrix}|) and there is a last column
-% but we don't know its value because the user has used the option |last-col|
-% without value. A value of $0$ means that the option |last-col| has been used
-% in an environment with preamble (like |{pNiceArray}|): in this case, the key
-% was necessary without argument.
-% \begin{macrocode}
-\int_new:N \l_@@_last_col_int
-\int_set:Nn \l_@@_last_col_int { -2 }
-% \end{macrocode}
-%
-% However, we have also a boolean. Consider the following code:
-% \begin{center}
-% \begin{BVerbatim}
-% \begin{pNiceArray}{cc}[last-col]
-% 1 & 2 \\
-% 3 & 4
-% \end{pNiceArray}
-% \end{BVerbatim}
-% \end{center}
-% In such a code, the ``last column'' specified by the key |last-col| is not
-% used. We want to be able to detect such a situation and we create a boolean
-% for that job.
-% \begin{macrocode}
-\bool_new:N \g_@@_last_col_found_bool
-% \end{macrocode}
-% This boolean is set to |false| at the end of |\@@_pre_array_ii:|.
-% \end{itemize}
-%
-% \bigskip
-% \textbf{Some utilities}
-%
-% \medskip
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_cut_on_hyphen:w #1-#2\q_stop
- {
- \tl_set:Nn \l_tmpa_tl { #1 }
- \tl_set:Nn \l_tmpb_tl { #2 }
- }
-% \end{macrocode}
-%
-%
-% The following takes as argument the name of a |clist| and which should be a
-% list of intervals of integers. It \emph{expands} that list, that is to say,
-% it replaces (by a sort of |mapcan| or |flat_map|) the interval by the explicit
-% list of the integers.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_expand_clist:N #1
- {
- \clist_if_in:NnF #1 { all }
- {
- \clist_clear:N \l_tmpa_clist
- \clist_map_inline:Nn #1
- {
- \tl_if_in:nnTF { ##1 } { - }
- { \@@_cut_on_hyphen:w ##1 \q_stop }
- {
- \tl_set:Nn \l_tmpa_tl { ##1 }
- \tl_set:Nn \l_tmpb_tl { ##1 }
- }
- \int_step_inline:nnn { \l_tmpa_tl } { \l_tmpb_tl }
- { \clist_put_right:Nn \l_tmpa_clist { ####1 } }
- }
- \tl_set_eq:NN #1 \l_tmpa_clist
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection*{The command \textbackslash tabularnote}
-%
-% \bigskip
-% Of course, it's possible to use |\tabularnote| in the main tabular. But there
-% is also the possibility to use that command in the caption of the tabular. And
-% the caption may be specified by two means:
-%
-% \begin{itemize}
-% \item The caption may of course be provided by the command |\caption| in a
-% floating environment. Of course, a command |\tabularnote| in that |\caption|
-% makes sens only if the |\caption| is \emph{before} the |{tabular}|.
-% \item It's also possible to use |\tabularnote| in the value of the key
-% |caption| of the |{NiceTabular}| when the key |caption-above| is in force.
-% However, in that case, one must remind that the caption is composed
-% \emph{after} the composition of the box which contains the main tabular
-% (that's mandatory since that caption must be wrapped with a line width equal
-% to the width ot the tabular). However, we want the labels of the successive
-% tabular notes in the logical order. That's why:
-% \begin{itemize}
-% \item The number of tabular notes present in the caption will be written on
-% the |aux| file and available in |\l_@@_note_in_caption_int|.
-% \item During the composition of the main tabular, the tabular notes will be
-% numbered from |\l_@@_note_in_caption_int|+1 and the notes will be stored in
-% |\g_@@_notes_seq|.
-% \item During the composition of the caption (value of |\l_@@_caption_tl|), the
-% tabular notes will be numbered from $1$ to |\l_@@_note_in_caption_int| and the
-% notes themselves will be stored in |\g_@@_notes_in_caption_seq|.
-% \item After the composition of the main tabular and after the composition of
-% the caption, the sequences |\g_@@_notes_in_caption_seq| and |\g_@@_notes_seq|
-% will be merged (in that order) and the notes will be composed.
-% \end{itemize}
-% \end{itemize}
-%
-%
-% \bigskip
-% The LaTeX counter |tabularnote| will be used to count the tabular notes during
-% the construction of the array (this counter won't be used during the
-% composition of the notes at the end of the array). You use a LaTeX counter
-% because we will use |\refstepcounter| in order to have the tabular notes
-% referenceable.
-% \begin{macrocode}
-\newcounter { tabularnote }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\seq_new:N \g_@@_notes_seq
-\seq_new:N \g_@@_notes_in_caption_seq
-% \end{macrocode}
-%
-% \bigskip
-% Before the actual tabular notes, it's possible to put a text
-% specified by the key |tabularnote| of the environment. The token list
-% |\l_@@_tabularnote_tl| corresponds to the value of that key.
-% \begin{macrocode}
-\tl_new:N \g_@@_tabularnote_tl
-% \end{macrocode}
-%
-% \bigskip
-% We prepare the tools for the formatting of the references of the footnotes (in
-% the tabular itself). There may have several references of footnote at the same
-% point and we have to take into account that point.
-% \begin{macrocode}
-\seq_new:N \l_@@_notes_labels_seq
-\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|.
-% \begin{macrocode}
-\cs_new:Npn \@@_notes_style:n #1 { \textit { \alph { #1 } } }
-% \end{macrocode}
-%
-% \bigskip
-% The following fonction can be redefined by using the key
-% |notes/label-in-tabular|.
-% \begin{macrocode}
-\cs_new:Npn \@@_notes_label_in_tabular:n #1 { \textsuperscript { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% The following function can be redefined by using the key |notes/label-in-list|.
-% \begin{macrocode}
-\cs_new:Npn \@@_notes_label_in_list:n #1 { \textsuperscript { #1 } }
-% \end{macrocode}
-%
-% \bigskip
-% We define |\thetabularnote| because it will be used by LaTeX if the user want
-% to reference a tabular which has been marked by a |\label|. The TeX group is
-% for the case where the user has put an instruction such as |\color{red}| in
-% |\@@_notes_style:n|.
-% \begin{macrocode}
-\cs_set:Npn \thetabularnote { { \@@_notes_style:n { tabularnote } } }
-% \end{macrocode}
-%
-% \bigskip
-% The tabular notes will be available for the final user only when
-% \pkg{enumitem} is loaded. Indeed, the tabular notes will be composed at the end
-% of the array with a list customized by \pkg{enumitem} (a list |tabularnotes|
-% in the general case and a list |tabularnotes*| if the key |para| is in force).
-% However, we can test whether \pkg{enumitem} has been loaded only at the
-% beginning of the document (we want to allow the user to load \pkg{enumitem}
-% after \pkg{nicematrix}).
-% \begin{macrocode}
-\hook_gput_code:nnn { begindocument } { . }
- {
- \bool_if:nTF { ! \c_@@_enumitem_loaded_bool }
- {
- \NewDocumentCommand \tabularnote { m }
- {
- \@@_error_or_warning:n { enumitem~not~loaded }
- \@@_gredirect_none:n { enumitem~not~loaded }
- }
- }
- {
-% \end{macrocode}
-% The type of list |tabularnotes| will be used to format the tabular notes at
-% the end of the array in the general case and |tabularnotes*| will be used if
-% the key |para| is in force.
-% \begin{macrocode}
- \newlist { tabularnotes } { enumerate } { 1 }
- \setlist [ tabularnotes ]
- {
- topsep = 0pt ,
- noitemsep ,
- leftmargin = * ,
- align = left ,
- labelsep = 0pt ,
- label =
- \@@_notes_label_in_list:n { \@@_notes_style:n { tabularnotesi } } ,
- }
- \newlist { tabularnotes* } { enumerate* } { 1 }
- \setlist [ tabularnotes* ]
- {
- afterlabel = \nobreak ,
- itemjoin = \quad ,
- label =
- \@@_notes_label_in_list:n { \@@_notes_style:n { tabularnotes*i } }
- }
-% \end{macrocode}
-%
-% \bigskip
-% One must remind that we have allowed a |\tabular| in the caption and
-% that caption may also be found in the list of tables (|\listoftables|). We
-% want the command |\tabularnote| be no-op during the composition of that list.
-% That's why we program |\tabularnote| to be no-op excepted in a floating
-% environment or in an environment of \pkg{nicematrix}.
-% \begin{macrocode}
- \NewDocumentCommand \tabularnote { m }
- {
- \bool_if:nT { \cs_if_exist_p:N \@captype || \l_@@_in_env_bool }
- {
- \bool_if:nTF { ! \l_@@_NiceTabular_bool && \l_@@_in_env_bool }
- { \@@_error:n { tabularnote~forbidden } }
- {
- \bool_if:NTF \l_@@_in_caption_bool
- { \@@_tabularnote_ii:n { #1 } }
- { \@@_tabularnote_i:n { #1 } }
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% For the version in normal conditions, that is to say not in the key |caption|.
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_tabularnote_i:n #1
- {
-% \end{macrocode}
-% 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_@@_notes_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_zero:N \l_tmpa_int
- \bool_if:NT \l_@@_notes_detect_duplicates_bool
- {
- \seq_map_indexed_inline:Nn \g_@@_notes_seq
- {
- \tl_if_eq:nnT { #1 } { ##2 }
- { \int_set:Nn \l_tmpa_int { ##1 } \seq_map_break: }
- }
- \int_compare:nNnF \l_tmpa_int = 0
- { \int_add:Nn \l_tmpa_int \l_@@_note_in_caption_int }
- }
- \int_compare:nNnTF \l_tmpa_int = 0
- {
- \int_gincr:N \c at tabularnote
- \seq_put_right:Nx \l_@@_notes_labels_seq
- { \@@_notes_format:n { \int_use:c { c @ tabularnote } } }
- \seq_gput_right:Nn \g_@@_notes_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}
-% If the following token is \emph{not} a |\tabularnote|, we have finished the
-% sequence of successive commands |\tabularnote| and we have to format the
-% labels of these tabular notes (in the array). We compose those labels in a box
-% |\l_tmpa_box| because we will do a special construction in order to have this
-% box in an overlapping position if we are at the end of a cell.
-% \begin{macrocode}
- \hbox_set:Nn \l_tmpa_box
- {
-% \end{macrocode}
-% We remind that it is the command |\@@_notes_label_in_tabular:n| that will
-% put the labels in a |\textsuperscript|.
-% \begin{macrocode}
- \@@_notes_label_in_tabular:n
- {
- \seq_use:Nnnn
- \l_@@_notes_labels_seq { , } { , } { , }
- }
- }
-% \end{macrocode}
-% We want the (last) tabular note referenceable (with the standard command |\label|).
-% \begin{macrocode}
- \int_gsub:Nn \c at tabularnote { 1 }
- \int_set_eq:NN \l_tmpa_int \c at tabularnote
- \refstepcounter { tabularnote }
- \int_compare:nNnT \l_tmpa_int = \c at tabularnote
- { \int_gincr:N \c at tabularnote }
- \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
-% |\unskip| (inserted by \pkg{array}?) will delete the skip we insert now
-% and the label of the footnote will be composed in an overlapping position (by
-% design).
-% \begin{macrocode}
- \skip_horizontal:n { \box_wd:N \l_tmpa_box }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% Now the version when the command is used in the key |caption|. The main
-% difficulty is that the argument of the command |\caption| is composed several
-% times. In order to know the number of commands |\tabularnote| in the caption,
-% we will consider that there should not be the same tabular note twice in the
-% caption (in the main tabular, it's possible). Once we have found a tabular
-% note which has yet been encoutered, we consider that you are in a new
-% composition of the argument of |\caption|. At that time, we store in
-% |\g_@@_nb_of_notes_int| the number of notes in the |\caption|.
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_tabularnote_ii:n #1
- {
- \int_gincr:N \c at tabularnote
- \bool_if:NTF \g_@@_caption_finished_bool
- {
- \int_compare:nNnTF
- \c at tabularnote > { \tl_count:N \g_@@_notes_in_caption_seq }
- { \int_gset:Nn \c at tabularnote { 1 } }
- \seq_if_in:NnF \g_@@_notes_in_caption_seq { #1 }
- { \@@_fatal:n { Identical~notes~in~caption } }
- }
- {
- \seq_if_in:NnTF \g_@@_notes_in_caption_seq { #1 }
- {
- \bool_gset_true:N \g_@@_caption_finished_bool
- \int_gset:Nn \c at tabularnote { 1 }
- }
- { \seq_gput_right:Nn \g_@@_notes_in_caption_seq { #1 } }
- }
- \seq_put_right:Nx \l_@@_notes_labels_seq
- { \@@_notes_format:n { \int_use:N \c at tabularnote } }
- \peek_meaning:NF \tabularnote
- {
- \hbox_set:Nn \l_tmpa_box
- {
- \@@_notes_label_in_tabular:n
- {
- \seq_use:Nnnn
- \l_@@_notes_labels_seq { , } { , } { , }
- }
- }
- \seq_clear:N \l_@@_notes_labels_seq
- \hbox_overlap_right:n { \box_use:N \l_tmpa_box }
- \skip_horizontal:n { \box_wd:N \l_tmpa_box }
- }
- }
- }
- }
-% \end{macrocode}
-%
-%
-%
-% \subsection*{Command for creation of rectangle nodes}
-%
-% The following command should be used in a |{pgfpicture}|. It creates a
-% rectangle (empty but with a name).
-%
-% |#1| is the name of the node which will be created;
-% |#2| and |#3| are the coordinates of one of the corner of the rectangle;
-% |#4| and |#5| are the coordinates of the opposite corner.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pgf_rect_node:nnnnn #1 #2 #3 #4 #5
- {
- \begin { pgfscope }
- \pgfset
- {
- % outer~sep = \c_zero_dim ,
- inner~sep = \c_zero_dim ,
- minimum~size = \c_zero_dim
- }
- \pgftransformshift { \pgfpoint { 0.5 * ( #2 + #4 ) } { 0.5 * ( #3 + #5 ) } }
- \pgfnode
- { rectangle }
- { center }
- {
- \vbox_to_ht:nn
- { \dim_abs:n { #5 - #3 } }
- {
- \vfill
- \hbox_to_wd:nn { \dim_abs:n { #4 - #2 } } { }
- }
- }
- { #1 }
- { }
- \end { pgfscope }
- }
-% \end{macrocode}
-%
-% \medskip
-% The command |\@@_pgf_rect_node:nnn| is a variant of |\@@_pgf_rect_node:nnnnn|:
-% it takes two \textsc{pgf} points as arguments instead of the four dimensions
-% which are the coordinates.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pgf_rect_node:nnn #1 #2 #3
- {
- \begin { pgfscope }
- \pgfset
- {
- % outer~sep = \c_zero_dim ,
- inner~sep = \c_zero_dim ,
- minimum~size = \c_zero_dim
- }
- \pgftransformshift { \pgfpointscale { 0.5 } { \pgfpointadd { #2 } { #3 } } }
- \pgfpointdiff { #3 } { #2 }
- \pgfgetlastxy \l_tmpa_dim \l_tmpb_dim
- \pgfnode
- { rectangle }
- { center }
- {
- \vbox_to_ht:nn
- { \dim_abs:n \l_tmpb_dim }
- { \vfill \hbox_to_wd:nn { \dim_abs:n \l_tmpa_dim } { } }
- }
- { #1 }
- { }
- \end { pgfscope }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsection*{The options}
-%
-% The following parameter corresponds to the keys |caption|, |short-caption| and
-% |label| of the environment |{NiceTabular}|.
-% \begin{macrocode}
-\tl_new:N \l_@@_caption_tl
-\tl_new:N \l_@@_short_caption_tl
-\tl_new:N \l_@@_label_tl
-% \end{macrocode}
-%
-% \bigskip
-% The following parameter corresponds to the key |caption-above| of
-% |\NiceMatrixOptions|. When this paremeter is |true|, the captions of the
-% environments |{NiceTabular}|, specified with the key |caption| are put above
-% the tabular (and below elsewhere).
-% \begin{macrocode}
-\bool_new:N \l_@@_caption_above_bool
-% \end{macrocode}
-%
-% \bigskip
-% By default, the commands |\cellcolor| and |\rowcolor| are available for the
-% user in the cells of the tabular (the user may use the commands provided by
-% |\colortbl|). However, if the key |colortbl-like| is used, these
-% commands are available.
-% \begin{macrocode}
-\bool_new:N \l_@@_colortbl_like_bool
-% \end{macrocode}
-%
-% \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
-% |\arrayrulewidth|. It's possible to disable this feature with the key
-% |\l_@@_standard_line_bool|.
-% \begin{macrocode}
-\bool_new:N \l_@@_standard_cline_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following dimensions correspond to the options |cell-space-top-limit| and co
-% (these parameters are inspired by the package \pkg{cellspace}).
-% \begin{macrocode}
-\dim_new:N \l_@@_cell_space_top_limit_dim
-\dim_new:N \l_@@_cell_space_bottom_limit_dim
-% \end{macrocode}
-%
-% \bigskip
-% The following dimension is the distance between two dots for the dotted lines
-% (when |line-style| is equal to |standard|, which is the initial value). The
-% initial value is 0.45~em but it will be changed if the option |small| is used.
-% \begin{macrocode}
-\dim_new:N \l_@@_xdots_inter_dim
-\hook_gput_code:nnn { begindocument } { . }
- { \dim_set:Nn \l_@@_xdots_inter_dim { 0.45 em } }
-% \end{macrocode}
-% We use a hook only by security in case \cls{revtex4-1}
-% is used (even though it is obsolete).
-%
-% \bigskip
-% The following dimension is the minimal distance between a node (in fact an
-% anchor of that node) and a dotted line (we say ``minimal'' because, by
-% definition, a dotted line is not a continuous line and, therefore, this
-% distance may vary a little).
-% \begin{macrocode}
-\dim_new:N \l_@@_xdots_shorten_start_dim
-\dim_new:N \l_@@_xdots_shorten_end_dim
-\hook_gput_code:nnn { begindocument } { . }
- {
- \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).
-%
-% \bigskip
-% The following dimension is the radius of the dots for the dotted lines (when
-% |line-style| is equal to |standard|, which is the initial value). The initial
-% value is 0.53~pt but it will be changed if the option |small| is used.
-% \begin{macrocode}
-\dim_new:N \l_@@_xdots_radius_dim
-\hook_gput_code:nnn { begindocument } { . }
- { \dim_set:Nn \l_@@_xdots_radius_dim { 0.53 pt } }
-% \end{macrocode}
-% We use a hook only by security in case \cls{revtex4-1} is used (even though it
-% is obsolete).
-%
-%
-% \bigskip
-% The token list |\l_@@_xdots_line_style_tl| corresponds to the option |tikz| of the
-% commands |\Cdots|, |\Ldots|, etc. and of the options |line-style| for the
-% environments and |\NiceMatrixOptions|. The constant |\c_@@_standard_tl| will
-% be used in some tests.
-% \begin{macrocode}
-\tl_new:N \l_@@_xdots_line_style_tl
-\tl_const:Nn \c_@@_standard_tl { standard }
-\tl_set_eq:NN \l_@@_xdots_line_style_tl \c_@@_standard_tl
-% \end{macrocode}
-%
-% \bigskip
-% The boolean |\l_@@_light_syntax_bool| corresponds to the option |light-syntax|.
-% \begin{macrocode}
-\bool_new:N \l_@@_light_syntax_bool
-% \end{macrocode}
-%
-% \bigskip
-% The string |\l_@@_baseline_tl| may contain one of the three values |t|,
-% |c| or |b| as in the option of the environment |{array}|. However, it may also
-% contain an integer (which represents the number of the row to which align the
-% array).
-% \begin{macrocode}
-\tl_new:N \l_@@_baseline_tl
-\tl_set:Nn \l_@@_baseline_tl c
-% \end{macrocode}
-%
-% \bigskip
-% The flag |\l_@@_exterior_arraycolsep_bool| corresponds to the option
-% |exterior-arraycolsep|. If this option is set, a space equal to |\arraycolsep|
-% will be put on both sides of an environment |{NiceArray}| (as it is done in
-% |{array}| of \pkg{array}).
-% \begin{macrocode}
-\bool_new:N \l_@@_exterior_arraycolsep_bool
-% \end{macrocode}
-%
-% \bigskip
-% The flag |\l_@@_parallelize_diags_bool| controls whether the diagonals are
-% parallelized. The initial value is~|true|.
-% \begin{macrocode}
-\bool_new:N \l_@@_parallelize_diags_bool
-\bool_set_true:N \l_@@_parallelize_diags_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following parameter correspond to the key |corners|. The elements of that
-% |clist| must be in |NW|, |SW|, |NE| and |SE|.
-% \begin{macrocode}
-\clist_new:N \l_@@_corners_clist
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\dim_new:N \l_@@_notes_above_space_dim
-\hook_gput_code:nnn { begindocument } { . }
- { \dim_set:Nn \l_@@_notes_above_space_dim { 1 mm } }
-% \end{macrocode}
-% We use a hook only by security in case \cls{revtex4-1} is used (even though it
-% is obsolete).
-%
-% \bigskip
-% The flag |\l_@@_nullify_dots_bool| corresponds to the option |nullify-dots|.
-% When the flag is down, the instructions like |\vdots| are inserted within a
-% |\hphantom| (and so the constructed matrix has exactly the same size as a
-% matrix constructed with the classical |{matrix}| and |\ldots|, |\vdots|,
-% etc.).
-% \begin{macrocode}
-\bool_new:N \l_@@_nullify_dots_bool
-% \end{macrocode}
-%
-% \medskip
-% The following flag corresponds to the key |respect-arraystretch| (that key has
-% an effect on the blocks).
-% \begin{macrocode}
-\bool_new:N \l_@@_respect_arraystretch_bool
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following flag will be used when the current options specify that all the
-% columns of the array must have the same width equal to the largest width of a
-% cell of the array (except the cells of the potential exterior columns).
-% \begin{macrocode}
-\bool_new:N \l_@@_auto_columns_width_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following boolean corresponds to the key |create-cell-nodes| of the
-% keyword |\CodeBefore|.
-% \begin{macrocode}
-\bool_new:N \g_@@_recreate_cell_nodes_bool
-% \end{macrocode}
-%
-% \bigskip
-% The string |\l_@@_name_str| will contain the optional name of the
-% environment: this name can be used to access to the Tikz nodes created in the
-% array from outside the environment.
-% \begin{macrocode}
-\str_new:N \l_@@_name_str
-% \end{macrocode}
-%
-% \bigskip
-% The boolean |\l_@@_medium_nodes_bool| will be used to indicate whether the
-% ``medium nodes'' are created in the array. Idem for the ``large nodes''.
-% \begin{macrocode}
-\bool_new:N \l_@@_medium_nodes_bool
-\bool_new:N \l_@@_large_nodes_bool
-% \end{macrocode}
-%
-% \bigskip
-% The boolean |\l_@@_except_borders_bool| will be raised when the key
-% |hvlines-except-borders| will be used (but that key has also other effects).
-% \begin{macrocode}
-\bool_new:N \l_@@_except_borders_bool
-% \end{macrocode}
-%
-%
-% \bigskip
-% The dimension |\l_@@_left_margin_dim| correspond to the option |left-margin|.
-% Idem for the right margin. These parameters are involved in the creation of
-% the ``medium nodes'' but also in the placement of the delimiters and the
-% drawing of the horizontal dotted lines (|\hdottedline|).
-% \begin{macrocode}
-\dim_new:N \l_@@_left_margin_dim
-\dim_new:N \l_@@_right_margin_dim
-% \end{macrocode}
-%
-%
-% \bigskip
-% The dimensions |\l_@@_extra_left_margin_dim| and
-% |\l_@@_extra_right_margin_dim| correspond to the options |extra-left-margin|
-% and |extra-right-margin|.
-% \begin{macrocode}
-\dim_new:N \l_@@_extra_left_margin_dim
-\dim_new:N \l_@@_extra_right_margin_dim
-% \end{macrocode}
-%
-% \medskip
-% The token list |\l_@@_end_of_row_tl| corresponds to the option |end-of-row|.
-% It specifies the symbol used to mark the ends of rows when the light syntax is
-% used.
-% \begin{macrocode}
-\tl_new:N \l_@@_end_of_row_tl
-\tl_set:Nn \l_@@_end_of_row_tl { ; }
-% \end{macrocode}
-%
-% \medskip
-% The following parameter is for the color the dotted lines drawn by |\Cdots|,
-% |\Ldots|, |\Vdots|, |\Ddots|, |\Iddots| and |\Hdotsfor| but \emph{not} the
-% dotted lines drawn by |\hdottedline| and ``|:|''.
-% \begin{macrocode}
-\tl_new:N \l_@@_xdots_color_tl
-% \end{macrocode}
-%
-% \bigskip
-% The following token list corresponds to the key |delimiters/color|.
-% \begin{macrocode}
-\tl_new:N \l_@@_delimiters_color_tl
-% \end{macrocode}
-%
-%
-% \bigskip
-% Sometimes, we want to have several arrays vertically juxtaposed in order to
-% have an alignment of the columns of these arrays. To acheive this goal, one
-% may wish to use the same width for all the columns (for example with the
-% option |columns-width| or the option |auto-columns-width| of the environment
-% |{NiceMatrixBlock}|). However, even if we use the same type of delimiters, the
-% width of the delimiters may be different from an array to another because the
-% width of the delimiter is fonction of its size. That's why we create an option
-% called |delimiters/max-width| which will give to the delimiters the width of
-% a delimiter (of the same type) of big size. The following boolean corresponds
-% to this option.
-% \begin{macrocode}
-\bool_new:N \l_@@_delimiters_max_width_bool
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / xdots }
- {
- line-style .code:n =
- {
- \bool_lazy_or:nnTF
-% \end{macrocode}
-% We can't use |\c_@@_tikz_loaded_bool| to test whether \pkg{tikz} is loaded
-% because |\NiceMatrixOptions| may be used in the preamble of the document.
-% \begin{macrocode}
- { \cs_if_exist_p:N \tikzpicture }
- { \str_if_eq_p:nn { #1 } { standard } }
- { \tl_set:Nn \l_@@_xdots_line_style_tl { #1 } }
- { \@@_error:n { bad~option~for~line-style } }
- } ,
- line-style .value_required:n = true ,
- color .tl_set:N = \l_@@_xdots_color_tl ,
- color .value_required:n = true ,
- shorten .code:n =
- \hook_gput_code:nnn { begindocument } { . }
- {
- \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 } } ,
- radius .value_required:n = true ,
- inter .code:n =
- \hook_gput_code:nnn { begindocument } { . }
- { \dim_set:Nn \l_@@_xdots_inter_dim { #1 } } ,
- radius .value_required:n = true ,
-% \end{macrocode}
-% The options |down| and |up| are not documented for the final user because he
-% should use the syntax with |^| and |_|.
-% \begin{macrocode}
- down .tl_set:N = \l_@@_xdots_down_tl ,
- up .tl_set:N = \l_@@_xdots_up_tl ,
-% \end{macrocode}
-% The key |draw-first|, which is meant to be used only with |\Ddots| and
-% |\Iddots|, which be catched when |\Ddots| or |\Iddots| is used (during the
-% construction of the array and not when we draw the dotted lines).
-% \begin{macrocode}
- draw-first .code:n = \prg_do_nothing: ,
- unknown .code:n = \@@_error:n { Unknown~key~for~xdots }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / rules }
- {
- color .tl_set:N = \l_@@_rules_color_tl ,
- color .value_required:n = true ,
- width .dim_set:N = \arrayrulewidth ,
- width .value_required:n = true ,
- unknown .code:n = \@@_error:n { Unknown~key~for~rules }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% First, we define a set of keys ``|NiceMatrix / Global|'' which will be used
-% (with the mechanism of |.inherit:n|) by other sets of keys.
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / Global }
- {
- custom-line .code:n = \@@_custom_line:n { #1 } ,
- rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } ,
- rules .value_required:n = true ,
- standard-cline .bool_set:N = \l_@@_standard_cline_bool ,
- standard-cline .default:n = true ,
- cell-space-top-limit .dim_set:N = \l_@@_cell_space_top_limit_dim ,
- cell-space-top-limit .value_required:n = true ,
- cell-space-bottom-limit .dim_set:N = \l_@@_cell_space_bottom_limit_dim ,
- cell-space-bottom-limit .value_required:n = true ,
- cell-space-limits .meta:n =
- {
- cell-space-top-limit = #1 ,
- cell-space-bottom-limit = #1 ,
- } ,
- cell-space-limits .value_required:n = true ,
- xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } ,
- light-syntax .bool_set:N = \l_@@_light_syntax_bool ,
- light-syntax .default:n = true ,
- end-of-row .tl_set:N = \l_@@_end_of_row_tl ,
- end-of-row .value_required:n = true ,
- first-col .code:n = \int_zero:N \l_@@_first_col_int ,
- first-row .code:n = \int_zero:N \l_@@_first_row_int ,
- last-row .int_set:N = \l_@@_last_row_int ,
- last-row .default:n = -1 ,
- code-for-first-col .tl_set:N = \l_@@_code_for_first_col_tl ,
- code-for-first-col .value_required:n = true ,
- code-for-last-col .tl_set:N = \l_@@_code_for_last_col_tl ,
- code-for-last-col .value_required:n = true ,
- code-for-first-row .tl_set:N = \l_@@_code_for_first_row_tl ,
- code-for-first-row .value_required:n = true ,
- code-for-last-row .tl_set:N = \l_@@_code_for_last_row_tl ,
- code-for-last-row .value_required:n = true ,
- hlines .clist_set:N = \l_@@_hlines_clist ,
- vlines .clist_set:N = \l_@@_vlines_clist ,
- hlines .default:n = all ,
- vlines .default:n = all ,
- vlines-in-sub-matrix .code:n =
- {
- \tl_if_single_token:nTF { #1 }
- { \tl_set:Nn \l_@@_letter_vlism_tl { #1 } }
- { \@@_error:n { One~letter~allowed } }
- } ,
- vlines-in-sub-matrix .value_required:n = true ,
- hvlines .code:n =
- {
- \bool_set_true:N \l_@@_hvlines_bool
- \clist_set:Nn \l_@@_vlines_clist { all }
- \clist_set:Nn \l_@@_hlines_clist { all }
- } ,
- hvlines-except-borders .code:n =
- {
- \clist_set:Nn \l_@@_vlines_clist { all }
- \clist_set:Nn \l_@@_hlines_clist { all }
- \bool_set_true:N \l_@@_hvlines_bool
- \bool_set_true:N \l_@@_except_borders_bool
- } ,
- parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool ,
-% \end{macrocode}
-%
-% \bigskip
-% With the option |renew-dots|, the command |\cdots|, |\ldots|, |\vdots|,
-% |\ddots|, etc. are redefined and behave like the commands |\Cdots|, |\Ldots|,
-% |\Vdots|, |\Ddots|, etc.
-% \begin{macrocode}
- renew-dots .bool_set:N = \l_@@_renew_dots_bool ,
- renew-dots .value_forbidden:n = true ,
- nullify-dots .bool_set:N = \l_@@_nullify_dots_bool ,
- create-medium-nodes .bool_set:N = \l_@@_medium_nodes_bool ,
- create-large-nodes .bool_set:N = \l_@@_large_nodes_bool ,
- create-extra-nodes .meta:n =
- { create-medium-nodes , create-large-nodes } ,
- left-margin .dim_set:N = \l_@@_left_margin_dim ,
- left-margin .default:n = \arraycolsep ,
- right-margin .dim_set:N = \l_@@_right_margin_dim ,
- right-margin .default:n = \arraycolsep ,
- margin .meta:n = { left-margin = #1 , right-margin = #1 } ,
- margin .default:n = \arraycolsep ,
- extra-left-margin .dim_set:N = \l_@@_extra_left_margin_dim ,
- extra-right-margin .dim_set:N = \l_@@_extra_right_margin_dim ,
- extra-margin .meta:n =
- { extra-left-margin = #1 , extra-right-margin = #1 } ,
- extra-margin .value_required:n = true ,
- respect-arraystretch .bool_set:N = \l_@@_respect_arraystretch_bool ,
- respect-arraystretch .default:n = true ,
- pgf-node-code .tl_set:N = \l_@@_pgf_node_code_tl ,
- pgf-node-code .value_required:n = true
- }
-% \end{macrocode}
-%
-% \bigskip
-% We define a set of keys used by the environments of \pkg{nicematrix} (but not
-% by the command |\NiceMatrixOptions|).
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / Env }
- {
- corners .clist_set:N = \l_@@_corners_clist ,
- corners .default:n = { NW , SW , NE , SE } ,
- code-before .code:n =
- {
- \tl_if_empty:nF { #1 }
- {
- \tl_gput_left:Nn \g_@@_pre_code_before_tl { #1 }
- \bool_set_true:N \l_@@_code_before_bool
- }
- } ,
- code-before .value_required:n = true ,
-% \end{macrocode}
-% \bigskip
-% The options |c|, |t| and |b| of the environment |{NiceArray}| have the same
-% meaning as the option of the classical environment |{array}|.
-% \begin{macrocode}
- c .code:n = \tl_set:Nn \l_@@_baseline_tl c ,
- t .code:n = \tl_set:Nn \l_@@_baseline_tl t ,
- b .code:n = \tl_set:Nn \l_@@_baseline_tl b ,
- baseline .tl_set:N = \l_@@_baseline_tl ,
- baseline .value_required:n = true ,
- columns-width .code:n =
- \tl_if_eq:nnTF { #1 } { auto }
- { \bool_set_true:N \l_@@_auto_columns_width_bool }
- { \dim_set:Nn \l_@@_columns_width_dim { #1 } } ,
- columns-width .value_required:n = true ,
- name .code:n =
-% \end{macrocode}
-% We test whether we are in the measuring phase of an environment of
-% \pkg{amsmath} (always loaded by \pkg{nicematrix}) because we want to avoid a
-% fallacious message of duplicate name in this case.
-% \begin{macrocode}
- \legacy_if:nF { measuring@ }
- {
- \str_set:Nn \l_tmpa_str { #1 }
- \seq_if_in:NVTF \g_@@_names_seq \l_tmpa_str
- { \@@_error:nn { Duplicate~name } { #1 } }
- { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str }
- \str_set_eq:NN \l_@@_name_str \l_tmpa_str
- } ,
- name .value_required:n = true ,
- code-after .tl_gset:N = \g_nicematrix_code_after_tl ,
- code-after .value_required:n = true ,
- colortbl-like .code:n =
- \bool_set_true:N \l_@@_colortbl_like_bool
- \bool_set_true:N \l_@@_code_before_bool ,
- colortbl-like .value_forbidden:n = true
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / notes }
- {
- para .bool_set:N = \l_@@_notes_para_bool ,
- para .default:n = true ,
- code-before .tl_set:N = \l_@@_notes_code_before_tl ,
- code-before .value_required:n = true ,
- code-after .tl_set:N = \l_@@_notes_code_after_tl ,
- code-after .value_required:n = true ,
- bottomrule .bool_set:N = \l_@@_notes_bottomrule_bool ,
- bottomrule .default:n = true ,
- style .code:n = \cs_set:Nn \@@_notes_style:n { #1 } ,
- style .value_required:n = true ,
- label-in-tabular .code:n =
- \cs_set:Nn \@@_notes_label_in_tabular:n { #1 } ,
- label-in-tabular .value_required:n = true ,
- label-in-list .code:n =
- \cs_set:Nn \@@_notes_label_in_list:n { #1 } ,
- label-in-list .value_required:n = true ,
- enumitem-keys .code:n =
- {
- \hook_gput_code:nnn { begindocument } { . }
- {
- \bool_if:NT \c_@@_enumitem_loaded_bool
- { \setlist* [ tabularnotes ] { #1 } }
- }
- } ,
- enumitem-keys .value_required:n = true ,
- enumitem-keys-para .code:n =
- {
- \hook_gput_code:nnn { begindocument } { . }
- {
- \bool_if:NT \c_@@_enumitem_loaded_bool
- { \setlist* [ tabularnotes* ] { #1 } }
- }
- } ,
- 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}
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / delimiters }
- {
- max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
- max-width .default:n = true ,
- color .tl_set:N = \l_@@_delimiters_color_tl ,
- color .value_required:n = true ,
- }
-% \end{macrocode}
-%
-% \bigskip
-% We begin the construction of the major sets of keys (used by the different
-% user commands and environments).
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix }
- {
- NiceMatrixOptions .inherit:n =
- { NiceMatrix / Global } ,
- NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots ,
- NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules ,
- NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes ,
- NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
- SubMatrix / rules .inherit:n = NiceMatrix / rules ,
- CodeAfter / xdots .inherit:n = NiceMatrix / xdots ,
- CodeBefore / sub-matrix .inherit:n = NiceMatrix / sub-matrix ,
- NiceMatrix .inherit:n =
- {
- NiceMatrix / Global ,
- NiceMatrix / Env ,
- } ,
- NiceMatrix / xdots .inherit:n = NiceMatrix / xdots ,
- NiceMatrix / rules .inherit:n = NiceMatrix / rules ,
- NiceTabular .inherit:n =
- {
- NiceMatrix / Global ,
- NiceMatrix / Env
- } ,
- NiceTabular / xdots .inherit:n = NiceMatrix / xdots ,
- NiceTabular / rules .inherit:n = NiceMatrix / rules ,
- NiceTabular / notes .inherit:n = NiceMatrix / notes ,
- NiceArray .inherit:n =
- {
- NiceMatrix / Global ,
- NiceMatrix / Env ,
- } ,
- NiceArray / xdots .inherit:n = NiceMatrix / xdots ,
- NiceArray / rules .inherit:n = NiceMatrix / rules ,
- pNiceArray .inherit:n =
- {
- NiceMatrix / Global ,
- NiceMatrix / Env ,
- } ,
- pNiceArray / xdots .inherit:n = NiceMatrix / xdots ,
- pNiceArray / rules .inherit:n = NiceMatrix / rules ,
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% We finalise the definition of the set of keys
-% ``|NiceMatrix / NiceMatrixOptions|'' with the options specific to
-% |\NiceMatrixOptions|.
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / NiceMatrixOptions }
- {
- delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
- delimiters / color .value_required:n = true ,
- delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
- delimiters / max-width .default:n = true ,
- delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
- delimiters .value_required:n = true ,
- width .code:n = \dim_set:Nn \l_@@_width_dim { #1 } ,
- width .value_required:n = true ,
- last-col .code:n =
- \tl_if_empty:nF { #1 }
- { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } }
- \int_zero:N \l_@@_last_col_int ,
- small .bool_set:N = \l_@@_small_bool ,
- small .value_forbidden:n = true ,
-% \end{macrocode}
-%
-% With the option |renew-matrix|, the environment |{matrix}| of \pkg{amsmath}
-% and its variants are redefined to behave like the environment |{NiceMatrix}|
-% and its variants.
-% \begin{macrocode}
- renew-matrix .code:n = \@@_renew_matrix: ,
- renew-matrix .value_forbidden:n = true ,
-% \end{macrocode}
-%
-% \bigskip
-% The option |exterior-arraycolsep| will have effect only in |{NiceArray}| for
-% those who want to have for |{NiceArray}| the same behaviour as |{array}|.
-% \begin{macrocode}
- exterior-arraycolsep .bool_set:N = \l_@@_exterior_arraycolsep_bool ,
-% \end{macrocode}
-%
-% \bigskip
-% If the option |columns-width| is used, all the columns will have the same
-% width.
-%
-% In |\NiceMatrixOptions|, the special value |auto| is not available.
-% \begin{macrocode}
- columns-width .code:n =
- \tl_if_eq:nnTF { #1 } { auto }
- { \@@_error:n { Option~auto~for~columns-width } }
- { \dim_set:Nn \l_@@_columns_width_dim { #1 } } ,
-% \end{macrocode}
-%
-% \bigskip
-% Usually, an error is raised when the user tries to give the same name to two
-% distincts environments of \pkg{nicematrix} (these names are global and not
-% local to the current TeX scope). However, the option |allow-duplicate-names|
-% disables this feature.
-% \begin{macrocode}
- allow-duplicate-names .code:n =
- \@@_msg_redirect_name:nn { Duplicate~name } { none } ,
- allow-duplicate-names .value_forbidden:n = true ,
- notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
- notes .value_required:n = true ,
- sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
- sub-matrix .value_required:n = true ,
- matrix / columns-type .code:n =
- \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 },
- matrix / columns-type .value_required:n = true ,
- caption-above .bool_set:N = \l_@@_caption_above_bool ,
- caption-above .default:n = true ,
- unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrixOptions }
- }
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% |\NiceMatrixOptions| is the command of the \pkg{nicematrix} package to fix
-% options at the document level. The scope of these specifications is the
-% current TeX group.
-% \begin{macrocode}
-\NewDocumentCommand \NiceMatrixOptions { m }
- { \keys_set:nn { NiceMatrix / NiceMatrixOptions } { #1 } }
-% \end{macrocode}
-%
-%
-% \bigskip
-% We finalise the definition of the set of keys ``|NiceMatrix / NiceMatrix|''.
-% That set of keys will be used by |{NiceMatrix}|, |{pNiceMatrix}|,
-% |{bNiceMatrix}|, etc.
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / NiceMatrix }
- {
- last-col .code:n = \tl_if_empty:nTF {#1}
- {
- \bool_set_true:N \l_@@_last_col_without_value_bool
- \int_set:Nn \l_@@_last_col_int { -1 }
- }
- { \int_set:Nn \l_@@_last_col_int { #1 } } ,
- columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } ,
- columns-type .value_required:n = true ,
- l .meta:n = { columns-type = l } ,
- r .meta:n = { columns-type = r } ,
- delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
- delimiters / color .value_required:n = true ,
- delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
- delimiters / max-width .default:n = true ,
- delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
- delimiters .value_required:n = true ,
- small .bool_set:N = \l_@@_small_bool ,
- small .value_forbidden:n = true ,
- unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrix }
- }
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% We finalise the definition of the set of keys ``|NiceMatrix / NiceArray|''
-% with the options specific to |{NiceArray}|.
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / NiceArray }
- {
-% \end{macrocode}
-%
-% In the environments |{NiceArray}| and its variants, the option |last-col| must
-% be used without value because the number of columns of the array is read
-% from the preamble of the array.
-% \begin{macrocode}
- small .bool_set:N = \l_@@_small_bool ,
- small .value_forbidden:n = true ,
- last-col .code:n = \tl_if_empty:nF { #1 }
- { \@@_error:n { last-col~non~empty~for~NiceArray } }
- \int_zero:N \l_@@_last_col_int ,
- r .code:n = \@@_error:n { r~or~l~with~preamble } ,
- l .code:n = \@@_error:n { r~or~l~with~preamble } ,
- unknown .code:n = \@@_error:n { Unknown~key~for~NiceArray }
- }
-% \end{macrocode}
-%
-%
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / pNiceArray }
- {
- first-col .code:n = \int_zero:N \l_@@_first_col_int ,
- last-col .code:n = \tl_if_empty:nF {#1}
- { \@@_error:n { last-col~non~empty~for~NiceArray } }
- \int_zero:N \l_@@_last_col_int ,
- first-row .code:n = \int_zero:N \l_@@_first_row_int ,
- delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
- delimiters / color .value_required:n = true ,
- delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool ,
- delimiters / max-width .default:n = true ,
- delimiters .code:n = \keys_set:nn { NiceMatrix / delimiters } { #1 } ,
- delimiters .value_required:n = true ,
- small .bool_set:N = \l_@@_small_bool ,
- small .value_forbidden:n = true ,
- r .code:n = \@@_error:n { r~or~l~with~preamble } ,
- l .code:n = \@@_error:n { r~or~l~with~preamble } ,
- unknown .code:n = \@@_error:n { Unknown~key~for~NiceMatrix }
- }
-% \end{macrocode}
-%
-% \bigskip
-% We finalise the definition of the set of keys ``|NiceMatrix / NiceTabular|''
-% with the options specific to |{NiceTabular}|.
-%
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / NiceTabular }
- {
-% \end{macrocode}
-% The dimension |width| will be used if at least a column of type |X| is used.
-% If there is no column of type |X|, an error will be raised.
-% \begin{macrocode}
- width .code:n = \dim_set:Nn \l_@@_width_dim { #1 }
- \bool_set_true:N \l_@@_width_used_bool ,
- width .value_required:n = true ,
- rounded-corners .dim_set:N = \l_@@_tab_rounded_corners_dim ,
- rounded-corners .default:n = 4 pt ,
- notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } ,
- tabularnote .tl_gset:N = \g_@@_tabularnote_tl ,
- tabularnote .value_required:n = true ,
- caption .tl_set:N = \l_@@_caption_tl ,
- caption .value_required:n = true ,
- short-caption .tl_set:N = \l_@@_short_caption_tl ,
- short-caption .value_required:n = true ,
- label .tl_set:N = \l_@@_label_tl ,
- label .value_required:n = true ,
- last-col .code:n = \tl_if_empty:nF {#1}
- { \@@_error:n { last-col~non~empty~for~NiceArray } }
- \int_zero:N \l_@@_last_col_int ,
- r .code:n = \@@_error:n { r~or~l~with~preamble } ,
- l .code:n = \@@_error:n { r~or~l~with~preamble } ,
- unknown .code:n = \@@_error:n { Unknown~key~for~NiceTabular }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \subsection*{Important code used by \{NiceArrayWithDelims\} }
-%
-% The pseudo-environment |\@@_cell_begin:w|--|\@@_cell_end:| will be used to format the
-% cells of the array. In the code, the affectations are global because this
-% pseudo-environment will be used in the cells of a |\halign| (via an
-% environment |{array}|).
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cell_begin:w
- {
-% \end{macrocode}
-% |\g_@@_cell_after_hook_tl| will be set during the composition of the box
-% |\l_@@_cell_box| and will be used \emph{after} the composition in order to
-% modify that box.
-% \begin{macrocode}
- \tl_gclear:N \g_@@_cell_after_hook_tl
-% \end{macrocode}
-% At the beginning of the cell, we link |\CodeAfter| to a command which do
-% begin with |\\| (whereas the standard version of |\CodeAfter| does
-% not).
-% \begin{macrocode}
- \cs_set_eq:NN \CodeAfter \@@_CodeAfter_i:
-% \end{macrocode}
-% We increment |\c at jCol|, which is the counter of the columns.
-% \begin{macrocode}
- \int_gincr:N \c at jCol
-% \end{macrocode}
-% Now, we increment the counter of the rows. We don't do this incrementation in
-% the |\everycr| because some packages, like \pkg{arydshln}, create special rows
-% in the |\halign| that we don't want to take into account.
-% \begin{macrocode}
- \int_compare:nNnT \c at jCol = 1
- { \int_compare:nNnT \l_@@_first_col_int = 1 \@@_begin_of_row: }
-% \end{macrocode}
-% The content of the cell is composed in the box |\l_@@_cell_box|. The
-% |\hbox_set_end:| corresponding to this |\hbox_set:Nw| will be in the
-% |\@@_cell_end:| (and the potential |\c_math_toggle_token| also).
-% \begin{macrocode}
- \hbox_set:Nw \l_@@_cell_box
- \bool_if:NF \l_@@_NiceTabular_bool
- {
- \c_math_toggle_token
- \bool_if:NT \l_@@_small_bool \scriptstyle
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
- \g_@@_row_style_tl
-% \end{macrocode}
-%
-% We will call \emph{corners} of the matrix the cases which are at the
-% intersection of the exterior rows and exterior columns (of course, the four
-% corners doesn't always exist simultaneously).
-%
-% The codes |\l_@@_code_for_first_row_tl| and \emph{al} don't apply in the
-% corners of the matrix.
-% \begin{macrocode}
- \int_compare:nNnTF \c at iRow = 0
- {
- \int_compare:nNnT \c at jCol > 0
- {
- \l_@@_code_for_first_row_tl
- \xglobal \colorlet { nicematrix-first-row } { . }
- }
- }
- {
- \int_compare:nNnT \c at iRow = \l_@@_last_row_int
- {
- \l_@@_code_for_last_row_tl
- \xglobal \colorlet { nicematrix-last-row } { . }
- }
- }
- }
-% \end{macrocode}
-%
-% \interitem
-% The following macro |\@@_begin_of_row| is usually used in the cell
-% number~$1$ of the row. However, when the key |first-col| is used,
-% |\@@_begin_of_row| is executed in the cell number~$0$ of the row.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_begin_of_row:
- {
- \int_gincr:N \c at iRow
- \dim_gset_eq:NN \g_@@_dp_ante_last_row_dim \g_@@_dp_last_row_dim
- \dim_gset:Nn \g_@@_dp_last_row_dim { \box_dp:N \@arstrutbox }
- \dim_gset:Nn \g_@@_ht_last_row_dim { \box_ht:N \@arstrutbox }
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfcoordinate
- { \@@_env: - row - \int_use:N \c at iRow - base }
- { \pgfpoint \c_zero_dim { 0.5 \arrayrulewidth } }
- \str_if_empty:NF \l_@@_name_str
- {
- \pgfnodealias
- { \l_@@_name_str - row - \int_use:N \c at iRow - base }
- { \@@_env: - row - \int_use:N \c at iRow - base }
- }
- \endpgfpicture
- }
-% \end{macrocode}
-% Remark: If the key |recreate-cell-nodes| of the |\CodeBefore| is used, then we
-% will add some lines to that command.
-%
-%
-% \interitem
-% The following code is used in each cell of the array. It actualises quantities
-% that, at the end of the array, will give informations about the vertical
-% dimension of the two first rows and the two last rows. If the user uses the
-% |last-row|, some lines of code will be dynamically added to this command.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_update_for_first_and_last_row:
- {
- \int_compare:nNnTF \c at iRow = 0
- {
- \dim_gset:Nn \g_@@_dp_row_zero_dim
- { \dim_max:nn \g_@@_dp_row_zero_dim { \box_dp:N \l_@@_cell_box } }
- \dim_gset:Nn \g_@@_ht_row_zero_dim
- { \dim_max:nn \g_@@_ht_row_zero_dim { \box_ht:N \l_@@_cell_box } }
- }
- {
- \int_compare:nNnT \c at iRow = 1
- {
- \dim_gset:Nn \g_@@_ht_row_one_dim
- { \dim_max:nn \g_@@_ht_row_one_dim { \box_ht:N \l_@@_cell_box } }
- }
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_rotate_cell_box:
- {
- \box_rotate:Nn \l_@@_cell_box { 90 }
- \int_compare:nNnT \c at iRow = \l_@@_last_row_int
- {
- \vbox_set_top:Nn \l_@@_cell_box
- {
- \vbox_to_zero:n { }
- \skip_vertical:n { - \box_ht:N \@arstrutbox + 0.8 ex }
- \box_use:N \l_@@_cell_box
- }
- }
- \bool_gset_false:N \g_@@_rotate_bool
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_adjust_size_box:
- {
- \dim_compare:nNnT \g_@@_blocks_wd_dim > \c_zero_dim
- {
- \box_set_wd:Nn \l_@@_cell_box
- { \dim_max:nn { \box_wd:N \l_@@_cell_box } \g_@@_blocks_wd_dim }
- \dim_gzero:N \g_@@_blocks_wd_dim
- }
- \dim_compare:nNnT \g_@@_blocks_dp_dim > \c_zero_dim
- {
- \box_set_dp:Nn \l_@@_cell_box
- { \dim_max:nn { \box_dp:N \l_@@_cell_box } \g_@@_blocks_dp_dim }
- \dim_gzero:N \g_@@_blocks_dp_dim
- }
- \dim_compare:nNnT \g_@@_blocks_ht_dim > \c_zero_dim
- {
- \box_set_ht:Nn \l_@@_cell_box
- { \dim_max:nn { \box_ht:N \l_@@_cell_box } \g_@@_blocks_ht_dim }
- \dim_gzero:N \g_@@_blocks_ht_dim
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cell_end:
- {
- \@@_math_toggle_token:
- \hbox_set_end:
- \@@_cell_end_i:
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cell_end_i:
- {
-% \end{macrocode}
-% The token list |\g_@@_cell_after_hook_tl| is (potentially) set during the
-% composition of the box |\l_@@_cell_box| and is used now \emph{after} the
-% composition in order to modify that box.
-% \begin{macrocode}
- \g_@@_cell_after_hook_tl
- \bool_if:NT \g_@@_rotate_bool \@@_rotate_cell_box:
- \@@_adjust_size_box:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \box_set_ht:Nn \l_@@_cell_box
- { \box_ht:N \l_@@_cell_box + \l_@@_cell_space_top_limit_dim }
- \box_set_dp:Nn \l_@@_cell_box
- { \box_dp:N \l_@@_cell_box + \l_@@_cell_space_bottom_limit_dim }
-% \end{macrocode}
-%
-% We want to compute in |\g_@@_max_cell_width_dim| the width of the widest cell
-% of the array (except the cells of the ``first column'' and the ``last
-% column'').
-% \begin{macrocode}
- \dim_gset:Nn \g_@@_max_cell_width_dim
- { \dim_max:nn \g_@@_max_cell_width_dim { \box_wd:N \l_@@_cell_box } }
-% \end{macrocode}
-%
-% The following computations are for the ``first row'' and the ``last row''.
-% \begin{macrocode}
- \@@_update_for_first_and_last_row:
-% \end{macrocode}
-%
-% \medskip
-% If the cell is empty, or may be considered as if, we must not create the
-% \textsc{pgf} node, for two reasons:
-% \begin{itemize}
-% \item it's a waste of time since such a node would be rather pointless;
-% \item we test the existence of these nodes in order to determine whether a
-% cell is empty when we search the extremities of a dotted line.
-% \end{itemize}
-% However, it's very difficult to determine whether a cell is empty. Up to now
-% we use the following technic:
-% \begin{itemize}
-% \item for the columns of type |p|, |m|, |b|, |V| (of \pkg{varwidth}) or |X|,
-% we test whether the cell is syntactically empty with |\@@_test_if_empty:| and
-% |\@@_test_if_empty_for_S:|
-% \item if the width of the box |\l_@@_cell_box| (created with the content of
-% the cell) is equal to zero, we consider the cell as empty (however,
-% this is not perfect since the user may have used a |\rlap|, |\llap|, |\clap|
-% or a |\mathclap| of \pkg{mathtools}).
-% \item the cells with a command |\Ldots| or |\Cdots|, |\Vdots|, etc.,
-% should also be considered as empty; if |nullify-dots| is in force, there would
-% be nothing to do (in this case the previous commands only write an instruction
-% in a kind of |\CodeAfter|); however, if |nullify-dots| is not in force, a
-% phantom of |\ldots|, |\cdots|, |\vdots| is inserted and its width is not equal
-% to zero; that's why these commands raise a boolean |\g_@@_empty_cell_bool| and
-% we begin by testing this boolean.
-% \end{itemize}
-% \begin{macrocode}
- \bool_if:NTF \g_@@_empty_cell_bool
- { \box_use_drop:N \l_@@_cell_box }
- {
- \bool_lazy_or:nnTF
- \g_@@_not_empty_cell_bool
- { \dim_compare_p:nNn { \box_wd:N \l_@@_cell_box } > \c_zero_dim }
- \@@_node_for_cell:
- { \box_use_drop:N \l_@@_cell_box }
- }
- \int_gset:Nn \g_@@_col_total_int { \int_max:nn \g_@@_col_total_int \c at jCol }
- \bool_gset_false:N \g_@@_empty_cell_bool
- \bool_gset_false:N \g_@@_not_empty_cell_bool
- }
-% \end{macrocode}
-%
-% \bigskip
-% The following variant of |\@@_cell_end:| is only for the columns of type
-% |w{s}{...}| or |W{s}{...}| (which use the horizontal alignement key |s| of
-% |\makebox|).
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_cell_end_for_w_s:
- {
- \@@_math_toggle_token:
- \hbox_set_end:
- \bool_if:NF \g_@@_rotate_bool
- {
- \hbox_set:Nn \l_@@_cell_box
- {
- \makebox [ \l_@@_col_width_dim ] [ s ]
- { \hbox_unpack_drop:N \l_@@_cell_box }
- }
- }
- \@@_cell_end_i:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following command creates the \textsc{pgf} name of the node with, of
-% course, |\l_@@_cell_box| as the content.
-% \begin{macrocode}
-\pgfset
- {
- nicematrix / cell-node /.style =
- {
- inner~sep = \c_zero_dim ,
- minimum~width = \c_zero_dim
- }
- }
-\cs_new_protected:Npn \@@_node_for_cell:
- {
- \pgfpicture
- \pgfsetbaseline \c_zero_dim
- \pgfrememberpicturepositiononpagetrue
- \pgfset { nicematrix / cell-node }
- \pgfnode
- { rectangle }
- { base }
- {
-% \end{macrocode}
-% The following instruction |\set at color| has been added on 2022/10/06. It's
-% necessary only with XeLaTeX and not with the other engines (we don't know why).
-% \begin{macrocode}
- \set at color
- \box_use_drop:N \l_@@_cell_box
- }
- { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol }
- { \l_@@_pgf_node_code_tl }
- \str_if_empty:NF \l_@@_name_str
- {
- \pgfnodealias
- { \l_@@_name_str - \int_use:N \c at iRow - \int_use:N \c at jCol }
- { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol }
- }
- \endpgfpicture
- }
-% \end{macrocode}
-%
-% \medskip
-% As its name says, the following command is a patch for the command
-% |\@@_node_for_cell:|. This patch will be appended on the left of
-% |\@@_node_for_the_cell:| when the construction of the cell nodes (of the form
-% |(i-j)|) in the |\CodeBefore| is required.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_patch_node_for_cell:n #1
- {
- \cs_new_protected:Npn \@@_patch_node_for_cell:
- {
- \hbox_set:Nn \l_@@_cell_box
- {
- \box_move_up:nn { \box_ht:N \l_@@_cell_box}
- \hbox_overlap_left:n
- {
- \pgfsys at markposition
- { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol - NW }
-% \end{macrocode}
-% I don't know why the following adjustement is needed when the compilation is
-% done with XeLaTeX or with the classical way |latex|, |divps|, |ps2pdf| (or
-% Adobe Distiller). However, it seems to work.
-% \begin{macrocode}
- #1
- }
- \box_use:N \l_@@_cell_box
- \box_move_down:nn { \box_dp:N \l_@@_cell_box }
- \hbox_overlap_left:n
- {
- \pgfsys at markposition
- { \@@_env: - \int_use:N \c at iRow - \int_use:N \c at jCol - SE }
- #1
- }
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% We have no explanation for the different behaviour between the TeX engines...
-% \begin{macrocode}
-\bool_lazy_or:nnTF \sys_if_engine_xetex_p: \sys_if_output_dvi_p:
- {
- \@@_patch_node_for_cell:n
- { \skip_horizontal:n { 0.5 \box_wd:N \l_@@_cell_box } }
- }
- { \@@_patch_node_for_cell:n { } }
-% \end{macrocode}
-%
-%
-% \interitem
-% The second argument of the following command |\@@_instruction_of_type:nnn|
-% defined below is the type of the instruction (|Cdots|, |Vdots|, |Ddots|,
-% etc.). The third argument is the list of options. This command writes in the
-% corresponding |\g_@@_|\textsl{type}|_lines_tl| the instruction which will
-% actually draw the line after the construction of the matrix.
-%
-% \medskip
-% For example, for the following matrix,
-%
-% \smallskip
-% \begin{BVerbatim}[baseline=c,boxwidth=11cm]
-% \begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 \\
-% 5 & \Cdots & & 6 \\
-% 7 & \Cdots[color=red]
-% \end{pNiceMatrix}
-% \end{BVerbatim}
-% $\begin{pNiceMatrix}
-% 1 & 2 & 3 & 4 \\
-% 5 & \Cdots & & 6 \\
-% 7 & \Cdots[color=red]
-% \end{pNiceMatrix}$
-%
-% \smallskip
-% the content of |\g_@@_Cdots_lines_tl| will be:
-%
-% \smallskip
-% \begin{scope}
-% \color{gray}
-% |\@@_draw_Cdots:nnn {2}{2}{}|
-%
-% |\@@_draw_Cdots:nnn {3}{2}{color=red}|
-% \end{scope}
-%
-%
-% \bigskip
-% The first argument is a boolean which indicates whether you must put the
-% instruction on the left or on the right on the list of instructions.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_instruction_of_type:nnn #1 #2 #3
- {
- \bool_if:nTF { #1 } \tl_gput_left:cx \tl_gput_right:cx
- { g_@@_ #2 _ lines _ tl }
- {
- \use:c { @@ _ draw _ #2 : nnn }
- { \int_use:N \c at iRow }
- { \int_use:N \c at jCol }
- { \exp_not:n { #3 } }
- }
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_array:n
- {
- \bool_if:NTF \l_@@_NiceTabular_bool
- { \dim_set_eq:NN \col at sep \tabcolsep }
- { \dim_set_eq:NN \col at sep \arraycolsep }
- \dim_compare:nNnTF \l_@@_tabular_width_dim = \c_zero_dim
- { \cs_set_nopar:Npn \@halignto { } }
- { \cs_set_nopar:Npx \@halignto { to \dim_use:N \l_@@_tabular_width_dim } }
-% \end{macrocode}
-% It \pkg{colortbl} is loaded, |\@tabarray| has been redefined to incorporate
-% |\CT at start|.
-% \begin{macrocode}
- \@tabarray
-% \end{macrocode}
-% |\l_@@_baseline_tl| may have the value |t|, |c| or |b|. However, if the value
-% is |b|, we compose the |\array| (of \pkg{array}) with the option |t| and the
-% right translation will be done further. Remark that |\str_if_eq:VnTF| is
-% fully expandable and you need something fully expandable here.
-% \begin{macrocode}
- [ \str_if_eq:VnTF \l_@@_baseline_tl c c t ]
- }
-\cs_generate_variant:Nn \@@_array:n { V }
-% \end{macrocode}
-%
-% \medskip
-% We keep in memory the standard version of |\ialign| because we will redefine
-% |\ialign| in the environment |{NiceArrayWithDelims}| but restore the standard
-% version for use in the cells of the array.
-% \begin{macrocode}
-\cs_set_eq:NN \@@_old_ialign: \ialign
-% \end{macrocode}
-%
-%
-% The following command creates a |row| node (and not a row of nodes!).
-% \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
- {
- \bool_if:NT \l_@@_code_before_bool
- {
- \vtop
- {
- \skip_vertical:N 0.5\arrayrulewidth
- \pgfsys at markposition
- { \@@_env: - row - \int_eval:n { \c at iRow + 1 } }
- \skip_vertical:N -0.5\arrayrulewidth
- }
- }
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfcoordinate { \@@_env: - row - \int_eval:n { \c at iRow + 1 } }
- { \pgfpoint \c_zero_dim { - 0.5 \arrayrulewidth } }
- \str_if_empty:NF \l_@@_name_str
- {
- \pgfnodealias
- { \l_@@_name_str - row - \int_eval:n { \c at iRow + 1 } }
- { \@@_env: - row - \int_eval:n { \c at iRow + 1 } }
- }
- \endpgfpicture
- }
- }
-% \end{macrocode}
-%
-%
-%
-% \bigskip
-% The following must \emph{not} be protected because it begins with |\noalign|.
-% \begin{macrocode}
-\cs_new:Npn \@@_everycr: { \noalign { \@@_everycr_i: } }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_everycr_i:
- {
- \int_gzero:N \c at jCol
- \bool_gset_false:N \g_@@_after_col_zero_bool
- \bool_if:NF \g_@@_row_of_col_done_bool
- {
- \@@_create_row_node:
-% \end{macrocode}
-% We don't draw now the rules of the key |hlines| (or |hvlines|) but we reserve the
-% vertical space for theses rules (the rules will be drawn by \textsc{pgf}).
-% \begin{macrocode}
- \tl_if_empty:NF \l_@@_hlines_clist
- {
- \tl_if_eq:NnF \l_@@_hlines_clist { all }
- {
- \exp_args:NNx
- \clist_if_in:NnT
- \l_@@_hlines_clist
- { \int_eval:n { \c at iRow + 1 } }
- }
- {
-% \end{macrocode}
-% The counter |\c at iRow| has the value $-1$ only if there is a ``first
-% row'' and that we are before that ``first row'', i.e. just before the
-% beginning of the array.
-% \begin{macrocode}
- \int_compare:nNnT \c at iRow > { -1 }
- {
- \int_compare:nNnF \c at iRow = \l_@@_last_row_int
-% \end{macrocode}
-% The command |\CT at arc@| is a command of \pkg{colortbl} which sets the color of
-% the rules in the array. The package \pkg{nicematrix} uses it even if
-% \pkg{colortbl} is not loaded. We use a TeX group in order to limit the scope
-% of |\CT at arc@|.
-% \begin{macrocode}
- { \hrule height \arrayrulewidth width \c_zero_dim }
- }
- }
- }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% The command |\@@_newcolumntype| is the command |\newcolumntype| of
-% \pkg{array} without the warnings for redefinitions of columns types (we will
-% use it to redefine the columns types |w| and |W|).
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_newcolumntype #1
- {
- \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } }
- \peek_meaning:NTF [
- { \newcol@ #1 }
- { \newcol@ #1 [ 0 ] }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% When the key |renew-dots| is used, the following code will be executed.
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_renew_dots:
- {
- \cs_set_eq:NN \ldots \@@_Ldots
- \cs_set_eq:NN \cdots \@@_Cdots
- \cs_set_eq:NN \vdots \@@_Vdots
- \cs_set_eq:NN \ddots \@@_Ddots
- \cs_set_eq:NN \iddots \@@_Iddots
- \cs_set_eq:NN \dots \@@_Ldots
- \cs_set_eq:NN \hdotsfor \@@_Hdotsfor:
- }
-% \end{macrocode}
-%
-% \bigskip
-% When the key |colortbl-like| is used, the following code will be executed.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_colortbl_like:
- {
- \cs_set_eq:NN \cellcolor \@@_cellcolor_tabular
- \cs_set_eq:NN \rowcolor \@@_rowcolor_tabular
- \cs_set_eq:NN \columncolor \@@_columncolor_preamble
- }
-% \end{macrocode}
-%
-% \bigskip
-% The following code |\@@_pre_array_ii:| is used in |{NiceArrayWithDelims}|. It
-% exists as a standalone macro only for legibility.
-% \label{prearray}
-%
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pre_array_ii:
- {
-% \end{macrocode}
-% The number of letters |X| in the preamble of the array.
-% \begin{macrocode}
- \int_gzero:N \g_@@_total_X_weight_int
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_expand_clist:N \l_@@_hlines_clist
- \@@_expand_clist:N \l_@@_vlines_clist
-% \end{macrocode}
-%
-% If \pkg{booktabs} is loaded, we have to patch the macro |\@BTnormal| which is
-% a macro of \pkg{booktabs}. The macro |\@BTnormal| draws an horizontal rule but
-% it occurs after a vertical skip done by a low level TeX command. When this
-% macro |\@BTnormal| occurs, the |row| node has yet been inserted by
-% \pkg{nicematrix} \emph{before} the vertical skip (and thus, at a wrong place).
-% That why we decide to create a new |row| node (for the same row). We patch the
-% macro |\@BTnormal| to create this |row| node. This new |row| node will
-% overwrite the previous definition of that |row| node and we have managed to
-% avoid the error messages of that redefinition
-% \footnote{cf. |\nicematrix at redefine@check at rerun|}.
-% \begin{macrocode}
- \bool_if:NT \c_@@_booktabs_loaded_bool
- { \tl_put_left:Nn \@BTnormal \@@_create_row_node_i: }
- \box_clear_new:N \l_@@_cell_box
- \normalbaselines
-% \end{macrocode}
-% If the option |small| is used, we have to do some tuning. In particular, we
-% change the value of |\arraystretch| (this parameter is used in the
-% construction of |\@arstrutbox| in the beginning of |{array}|).
-% \begin{macrocode}
- \bool_if:NT \l_@@_small_bool
- {
-% \end{macrocode}
-% \begin{macrocode}
- \cs_set_nopar:Npn \arraystretch { 0.47 }
- \dim_set:Nn \arraycolsep { 1.45 pt }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
- \bool_if:NT \g_@@_recreate_cell_nodes_bool
- {
- \tl_put_right:Nn \@@_begin_of_row:
- {
- \pgfsys at markposition
- { \@@_env: - row - \int_use:N \c at iRow - base }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% The environment |{array}| uses internally the command |\ialign|. We change the
-% definition of |\ialign| for several reasons. In particular, |\ialign| sets
-% |\everycr| to |{ }| and we \emph{need} to have to change the value of
-% |\everycr|.
-% \begin{macrocode}
- \cs_set_nopar:Npn \ialign
- {
- \bool_if:NTF \l_@@_colortbl_loaded_bool
- {
- \CT at everycr
- {
- \noalign { \cs_gset_eq:NN \CT at row@color \prg_do_nothing: }
- \@@_everycr:
- }
- }
- { \everycr { \@@_everycr: } }
- \tabskip = \c_zero_skip
-% \end{macrocode}
-%
-% The box |\@arstrutbox| is a box constructed in the beginning of the
-% environment |{array}|. The construction of that box takes into account the
-% current value of |\arraystretch|\footnote{The option |small| of
-% \pkg{nicematrix} changes (among others) the value of |\arraystretch|. This is
-% done, of course, before the call of |{array}|.} and |\extrarowheight| (of
-% \pkg{array}). That box is inserted (via |\@arstrut|) in the beginning of each
-% row of the array. That's why we use the dimensions of that box to initialize
-% the variables which will be the dimensions of the potential first and last row
-% of the environment. This initialization must be done after the creation of
-% |\@arstrutbox| and that's why we do it in the |\ialign|.
-% \begin{macrocode}
- \dim_gzero_new:N \g_@@_dp_row_zero_dim
- \dim_gset:Nn \g_@@_dp_row_zero_dim { \box_dp:N \@arstrutbox }
- \dim_gzero_new:N \g_@@_ht_row_zero_dim
- \dim_gset:Nn \g_@@_ht_row_zero_dim { \box_ht:N \@arstrutbox }
- \dim_gzero_new:N \g_@@_ht_row_one_dim
- \dim_gset:Nn \g_@@_ht_row_one_dim { \box_ht:N \@arstrutbox }
- \dim_gzero_new:N \g_@@_dp_ante_last_row_dim
- \dim_gzero_new:N \g_@@_ht_last_row_dim
- \dim_gset:Nn \g_@@_ht_last_row_dim { \box_ht:N \@arstrutbox }
- \dim_gzero_new:N \g_@@_dp_last_row_dim
- \dim_gset:Nn \g_@@_dp_last_row_dim { \box_dp:N \@arstrutbox }
-% \end{macrocode}
-% After its first use, the definition of |\ialign| will revert
-% automatically to its default definition. With this programmation, we will
-% have, in the cells of the array, a clean version of |\ialign|.
-% \begin{macrocode}
- \cs_set_eq:NN \ialign \@@_old_ialign:
- \halign
- }
-% \end{macrocode}
-%
-% We keep in memory the old versions or |\ldots|, |\cdots|, etc. only because we
-% use them inside |\phantom| commands in order that the new commands |\Ldots|,
-% |\Cdots|, etc. give the same spacing (except when the option |nullify-dots| is
-% used).
-% \begin{macrocode}
- \cs_set_eq:NN \@@_old_ldots \ldots
- \cs_set_eq:NN \@@_old_cdots \cdots
- \cs_set_eq:NN \@@_old_vdots \vdots
- \cs_set_eq:NN \@@_old_ddots \ddots
- \cs_set_eq:NN \@@_old_iddots \iddots
- \bool_if:NTF \l_@@_standard_cline_bool
- { \cs_set_eq:NN \cline \@@_standard_cline }
- { \cs_set_eq:NN \cline \@@_cline }
- \cs_set_eq:NN \Ldots \@@_Ldots
- \cs_set_eq:NN \Cdots \@@_Cdots
- \cs_set_eq:NN \Vdots \@@_Vdots
- \cs_set_eq:NN \Ddots \@@_Ddots
- \cs_set_eq:NN \Iddots \@@_Iddots
- \cs_set_eq:NN \Hline \@@_Hline:
- \cs_set_eq:NN \Hspace \@@_Hspace:
- \cs_set_eq:NN \Hdotsfor \@@_Hdotsfor:
- \cs_set_eq:NN \Vdotsfor \@@_Vdotsfor:
- \cs_set_eq:NN \Block \@@_Block:
- \cs_set_eq:NN \rotate \@@_rotate:
- \cs_set_eq:NN \OnlyMainNiceMatrix \@@_OnlyMainNiceMatrix:n
- \cs_set_eq:NN \dotfill \@@_dotfill:
- \cs_set_eq:NN \CodeAfter \@@_CodeAfter:
- \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}
-% We redefine |\multicolumn| and, since we want |\multicolumn| to be available
-% in the potential environments |{tabular}| nested in the environments of
-% \pkg{nicematrix}, we patch |{tabular}| to go back to the original definition.
-% \begin{macrocode}
- \cs_set_eq:NN \multicolumn \@@_multicolumn:nnn
- \hook_gput_code:nnn { env / tabular / begin } { . }
- { \cs_set_eq:NN \multicolumn \@@_old_multicolumn }
-% \end{macrocode}
-% If there is one or several commands |\tabularnote| in the caption specified
-% by the key |caption| and if that caption has to be composed above the tabular,
-% we have now that information because it has been written in the |aux| file at
-% a previous run. We use that information to start couting the tabular notes in
-% the main array at the right value (that remember that the caption will be
-% composed \emph{after} the array!).
-% \begin{macrocode}
- \tl_if_exist:NT \l_@@_note_in_caption_tl
- {
- \tl_if_empty:NF \l_@@_note_in_caption_tl
- {
- \int_set_eq:NN \l_@@_note_in_caption_int
- { \l_@@_note_in_caption_tl }
- \int_gset:Nn \c at tabularnote { \l_@@_note_in_caption_tl }
- }
- }
-% \end{macrocode}
-%
-%
-% The sequence |\g_@@_multicolumn_cells_seq| will contain the list of the cells
-% of the array where a command |\multicolumn{|$n$|}{...}{...}| with $n>1$ is
-% issued. In |\g_@@_multicolumn_sizes_seq|, the ``sizes'' (that is to say the
-% values of $n$) correspondant will be stored. These lists will be used for the
-% creation of the ``medium nodes'' (if they are created).
-% \begin{macrocode}
- \seq_gclear:N \g_@@_multicolumn_cells_seq
- \seq_gclear:N \g_@@_multicolumn_sizes_seq
-% \end{macrocode}
-%
-% The counter |\c at iRow| will be used to count the rows of the array (its
-% incrementation will be in the first cell of the row).
-% \begin{macrocode}
- \int_gset:Nn \c at iRow { \l_@@_first_row_int - 1 }
-% \end{macrocode}
-%
-% At the end of the environment |{array}|, |\c at iRow| will be the total
-% number de rows.
-%
-% |\g_@@_row_total_int| will be the number or rows excepted the last row (if
-% |\l_@@_last_row_bool| has been raised with the option |last-row|).
-% \begin{macrocode}
- \int_gzero_new:N \g_@@_row_total_int
-% \end{macrocode}
-%
-% The counter |\c at jCol| will be used to count the columns of the array.
-% Since we want to know the total number of columns of the matrix, we also
-% create a counter |\g_@@_col_total_int|. These counters are updated in the
-% command |\@@_cell_begin:w| executed at the beginning of each cell.
-% \begin{macrocode}
- \int_gzero_new:N \g_@@_col_total_int
-% \end{macrocode}
-%
-% \begin{macrocode}
- \cs_set_eq:NN \@ifnextchar \new at ifnextchar
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_renew_NC at rewrite@S:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \bool_gset_false:N \g_@@_last_col_found_bool
-% \end{macrocode}
-%
-% \medskip
-% During the construction of the array, the instructions |\Cdots|, |\Ldots|,
-% etc. will be written in token lists |\g_@@_Cdots_lines_tl|, etc. which will be
-% executed after the construction of the array.
-% \begin{macrocode}
- \tl_gclear_new:N \g_@@_Cdots_lines_tl
- \tl_gclear_new:N \g_@@_Ldots_lines_tl
- \tl_gclear_new:N \g_@@_Vdots_lines_tl
- \tl_gclear_new:N \g_@@_Ddots_lines_tl
- \tl_gclear_new:N \g_@@_Iddots_lines_tl
- \tl_gclear_new:N \g_@@_HVdotsfor_lines_tl
-% \end{macrocode}
-%
-% \medskip
-% \begin{macrocode}
- \tl_gclear:N \g_nicematrix_code_before_tl
- \tl_gclear:N \g_@@_pre_code_before_tl
- }
-% \end{macrocode}
-% This is the end of |\@@_pre_array_ii:|.
-%
-%
-% \bigskip
-% The command |\@@_pre_array:| will be executed after analyse of the keys of the
-% environment.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pre_array:
- {
-% \end{macrocode}
-%
-% \begin{macrocode}
- \cs_if_exist:NT \theiRow { \int_set_eq:NN \l_@@_old_iRow_int \c at iRow }
- \int_gzero_new:N \c at iRow
- \cs_if_exist:NT \thejCol { \int_set_eq:NN \l_@@_old_jCol_int \c at jCol }
- \int_gzero_new:N \c at jCol
-% \end{macrocode}
-%
-% \bigskip
-% We recall that |\l_@@_last_row_int| and |\l_@@_last_column_int| are \emph{not}
-% the numbers of the last row and last column of the array. There are only the
-% values of the keys |last-row| and |last-column| (maybe the user has provided
-% erroneous values). The meaning of that counters does not change during the
-% environment of \pkg{nicematrix}. There is only a slight adjustment: if the
-% user have used one of those keys without value, we provide now the right value
-% as read on the |aux| file (of course, it's possible only after the first compilation).
-% \begin{macrocode}
- \int_compare:nNnT \l_@@_last_row_int = { -1 }
- {
- \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 \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 \g_@@_size_seq 6 } }
- }
-% \end{macrocode}
-%
-% \bigskip
-% If there is an exterior row, we patch a command used in |\@@_cell_begin:w| in order to
-% keep track of some dimensions needed to the construction of that ``last row''.
-% \begin{macrocode}
- \int_compare:nNnT \l_@@_last_row_int > { -2 }
- {
- \tl_put_right:Nn \@@_update_for_first_and_last_row:
- {
- \dim_gset:Nn \g_@@_ht_last_row_dim
- { \dim_max:nn \g_@@_ht_last_row_dim { \box_ht:N \l_@@_cell_box } }
- \dim_gset:Nn \g_@@_dp_last_row_dim
- { \dim_max:nn \g_@@_dp_last_row_dim { \box_dp:N \l_@@_cell_box } }
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
- \seq_gclear:N \g_@@_cols_vlism_seq
- \seq_gclear:N \g_@@_submatrix_seq
-% \end{macrocode}
-%
-% \bigskip
-% Now the |\CodeBefore|.
-% \begin{macrocode}
- \bool_if:NT \l_@@_code_before_bool \@@_exec_code_before:
-% \end{macrocode}
-%
-% \bigskip
-% The value of |\g_@@_pos_of_blocks_seq| has been written on the |aux| file and
-% loaded before the (potential) execution of the |\CodeBefore|. Now, we clear
-% that variable because it will be reconstructed during the creation of the
-% array.
-% \begin{macrocode}
- \seq_gclear:N \g_@@_pos_of_blocks_seq
-% \end{macrocode}
-% Idem for other sequences written on the |aux| file.
-% \begin{macrocode}
- \seq_gclear_new:N \g_@@_multicolumn_cells_seq
- \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 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 { -2 }
-% \end{macrocode}
-% The value $-2$ is important.
-%
-%
-% \interitem
-% The code in |\@@_pre_array_ii:| is used only here.
-% \begin{macrocode}
- \@@_pre_array_ii:
-% \end{macrocode}
-%
-% \medskip
-% The array will be composed in a box (named |\l_@@_the_array_box|) because we
-% have to do manipulations concerning the potential exterior rows.
-% \begin{macrocode}
- \box_clear_new:N \l_@@_the_array_box
-% \end{macrocode}
-%
-%
-% \medskip
-% We compute the width of both delimiters. We remind that, when the
-% environment |{NiceArray}| is used, it's possible to specify the delimiters in
-% the preamble (eg |[ccc]|).
-% \begin{macrocode}
- \dim_zero_new:N \l_@@_left_delim_dim
- \dim_zero_new:N \l_@@_right_delim_dim
- \bool_if:NTF \g_@@_NiceArray_bool
- {
- \dim_gset:Nn \l_@@_left_delim_dim { 2 \arraycolsep }
- \dim_gset:Nn \l_@@_right_delim_dim { 2 \arraycolsep }
- }
- {
-% \end{macrocode}
-% The command |\bBigg@| is a command of \pkg{amsmath}.
-% \begin{macrocode}
- \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g_@@_left_delim_tl $ }
- \dim_set:Nn \l_@@_left_delim_dim { \box_wd:N \l_tmpa_box }
- \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \g_@@_right_delim_tl $ }
- \dim_set:Nn \l_@@_right_delim_dim { \box_wd:N \l_tmpa_box }
- }
-% \end{macrocode}
-%
-% \bigskip
-% Here is the beginning of the box which will contain the array. The
-% |\hbox_set_end:| corresponding to this |\hbox_set:Nw| will be in the second
-% part of the environment (and the closing |\c_math_toggle_token| also).
-% \begin{macrocode}
- \hbox_set:Nw \l_@@_the_array_box
-% \end{macrocode}
-%
-% \begin{macrocode}
- \skip_horizontal:N \l_@@_left_margin_dim
- \skip_horizontal:N \l_@@_extra_left_margin_dim
- \c_math_toggle_token
- \bool_if:NTF \l_@@_light_syntax_bool
- { \use:c { @@-light-syntax } }
- { \use:c { @@-normal-syntax } }
- }
-% \end{macrocode}
-%
-% \bigskip
-% 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_nopar:Npn \@@_CodeBefore_Body:w #1 \Body
- {
- \tl_gput_left:Nn \g_@@_pre_code_before_tl { #1 }
- \bool_set_true:N \l_@@_code_before_bool
-% \end{macrocode}
-% We go on with |\@@_pre_array:| which will (among other) execute the
-% |\CodeBefore| (specified in the key |code-before| or after the keyword
-% |\CodeBefore|). By definition, the |\CodeBefore| must be executed before the
-% body of the array...
-% \begin{macrocode}
- \@@_pre_array:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsection*{The \textbackslash CodeBefore}
-%
-% The following command will be executed if the |\CodeBefore| has to be actually executed.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_pre_code_before:
- {
-% \end{macrocode}
-% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that,
-% in the |\CodeBefore| (and in the |\CodeAfter|) they represent the numbers of
-% rows and columns of the array (without the potential last row and last
-% column). The value of |\g_@@_row_total_int| is the number of the last row
-% (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 \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}
-%
-%
-% Now, we will create all the |col| nodes and |row| nodes with the informations
-% written in the |aux| file. You use the technique described in the page~1229 of
-% |pgfmanual.pdf|, version~3.1.4b.
-% \begin{macrocode}
- \pgfsys at markposition { \@@_env: - position }
- \pgfsys at getposition { \@@_env: - position } \@@_picture_position:
- \pgfpicture
- \pgf at relevantforpicturesizefalse
-% \end{macrocode}
-% First, the recreation of the |row| nodes.
-% \begin{macrocode}
- \int_step_inline:nnn \l_@@_first_row_int { \g_@@_row_total_int + 1 }
- {
- \pgfsys at getposition { \@@_env: - row - ##1 } \@@_node_position:
- \pgfcoordinate { \@@_env: - row - ##1 }
- { \pgfpointdiff \@@_picture_position: \@@_node_position: }
- }
-% \end{macrocode}
-% Now, the recreation of the |col| nodes.
-% \begin{macrocode}
- \int_step_inline:nnn \l_@@_first_col_int { \g_@@_col_total_int + 1 }
- {
- \pgfsys at getposition { \@@_env: - col - ##1 } \@@_node_position:
- \pgfcoordinate { \@@_env: - col - ##1 }
- { \pgfpointdiff \@@_picture_position: \@@_node_position: }
- }
-% \end{macrocode}
-% Now, you recreate the diagonal nodes by using the |row| nodes and the |col|
-% nodes.
-% \begin{macrocode}
- \@@_create_diag_nodes:
-% \end{macrocode}
-%
-% \medskip
-% Now, the creation of the cell nodes |(i-j)|, and, maybe also the ``medium
-% nodes'' and the ``large nodes''.
-% \begin{macrocode}
- \bool_if:NT \g_@@_recreate_cell_nodes_bool \@@_recreate_cell_nodes:
- \endpgfpicture
-% \end{macrocode}
-%
-% \medskip
-% Now, the recreation of the nodes of the blocks \emph{which have a name}.
-% \begin{macrocode}
- \@@_create_blocks_nodes:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \bool_if:NT \c_@@_tikz_loaded_bool
- {
- \tikzset
- {
- every~picture / .style =
- { overlay , name~prefix = \@@_env: - }
- }
- }
- \cs_set_eq:NN \cellcolor \@@_cellcolor
- \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor
- \cs_set_eq:NN \roundedrectanglecolor \@@_roundedrectanglecolor
- \cs_set_eq:NN \rowcolor \@@_rowcolor
- \cs_set_eq:NN \rowcolors \@@_rowcolors
- \cs_set_eq:NN \rowlistcolors \@@_rowlistcolors
- \cs_set_eq:NN \arraycolor \@@_arraycolor
- \cs_set_eq:NN \columncolor \@@_columncolor
- \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors
- \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before
- \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_exec_code_before:
- {
- \seq_gclear_new:N \g_@@_colors_seq
- \bool_gset_false:N \g_@@_recreate_cell_nodes_bool
- \group_begin:
-% \end{macrocode}
-%
-% We compose the |\CodeBefore| in math mode in order to nullify the spaces put
-% by the user between instructions in the |\CodeBefore|.
-% \begin{macrocode}
- \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
-% \end{macrocode}
-%
-% \bigskip
-% The following code is a security for the case the user has used \pkg{babel}
-% with the option \pkg{spanish}: in that case, the characters |<| (de code
-% \textsc{ascci} 60) and |>| are activated and Tikz is not able to solve the
-% problem (even with the Tikz library \pkg{babel}).
-% \begin{macrocode}
- \int_compare:nNnT { \char_value_catcode:n { 60 } } = { 13 }
- {
- \@@_rescan_for_spanish:N \g_@@_pre_code_before_tl
- \@@_rescan_for_spanish:N \l_@@_code_before_tl
- }
-% \end{macrocode}
-%
-% Here is the |\CodeBefore|. The construction is a bit complicated because
-% |\g_@@_pre_code_before_tl| may begin with keys between square brackets. Moreover,
-% after the analyze of those keys, we sometimes have to decide to do \emph{not}
-% execute the rest of |\g_@@_pre_code_before_tl| (when it is asked for the creation
-% of cell nodes in the |\CodeBefore|). That's why we use a |\q_stop|: it
-% will be used to discard the rest of |\g_@@_pre_code_before_tl|.
-% \begin{macrocode}
- \exp_last_unbraced:NV \@@_CodeBefore_keys:
- \g_@@_pre_code_before_tl
-% \end{macrocode}
-% Now, all the cells which are specified to be colored by instructions in the
-% |\CodeBefore| will actually be colored. It's a two-stages mechanism because we
-% want to draw all the cells with the same color at the same time to absolutely
-% avoid thin white lines in some \textsc{pdf} viewers.
-% \begin{macrocode}
- \@@_actually_color:
- \l_@@_code_before_tl
- \q_stop
- \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token
- \group_end:
- \bool_if:NT \g_@@_recreate_cell_nodes_bool
- { \tl_put_left:Nn \@@_node_for_cell: \@@_patch_node_for_cell: }
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\keys_define:nn { NiceMatrix / CodeBefore }
- {
- create-cell-nodes .bool_gset:N = \g_@@_recreate_cell_nodes_bool ,
- create-cell-nodes .default:n = true ,
- sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } ,
- sub-matrix .value_required:n = true ,
- delimiters / color .tl_set:N = \l_@@_delimiters_color_tl ,
- delimiters / color .value_required:n = true ,
- unknown .code:n = \@@_error:n { Unknown~key~for~CodeBefore }
- }
-% \end{macrocode}
-%
-%
-% \begin{macrocode}
-\NewDocumentCommand \@@_CodeBefore_keys: { O { } }
- {
- \keys_set:nn { NiceMatrix / CodeBefore } { #1 }
- \@@_CodeBefore:w
- }
-% \end{macrocode}
-%
-% We have extracted the options of the keyword |\CodeBefore| in order to see
-% whether the key |create-cell-nodes| has been used. Now, you can execute the
-% rest of the |\CodeAfter|, excepted, of course, if we are in the first
-% compilation.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_CodeBefore:w #1 \q_stop
- {
- \bool_if:NT \g_@@_aux_found_bool
- {
- \@@_pre_code_before:
- #1
- }
- }
-% \end{macrocode}
-%
-% \bigskip
-%
-%
-% \bigskip
-% By default, if the user uses the |\CodeBefore|, only the |col| nodes, |row|
-% nodes and |diag| nodes are available in that |\CodeBefore|. With the key
-% |create-cell-nodes|, the cell nodes, that is to say the nodes of the form
-% |(i-j)| (but not the extra nodes) are also available because those nodes also
-% are recreated and that recreation is done by the following command.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_recreate_cell_nodes:
- {
- \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int
- {
- \pgfsys at getposition { \@@_env: - ##1 - base } \@@_node_position:
- \pgfcoordinate { \@@_env: - row - ##1 - base }
- { \pgfpointdiff \@@_picture_position: \@@_node_position: }
- \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int
- {
- \cs_if_exist:cT
- { pgf @ sys @ pdf @ mark @ pos @ \@@_env: - ##1 - ####1 - NW }
- {
- \pgfsys at getposition
- { \@@_env: - ##1 - ####1 - NW }
- \@@_node_position:
- \pgfsys at getposition
- { \@@_env: - ##1 - ####1 - SE }
- \@@_node_position_i:
- \@@_pgf_rect_node:nnn
- { \@@_env: - ##1 - ####1 }
- { \pgfpointdiff \@@_picture_position: \@@_node_position: }
- { \pgfpointdiff \@@_picture_position: \@@_node_position_i: }
- }
- }
- }
- \int_step_inline:nn \c at iRow
- {
- \pgfnodealias
- { \@@_env: - ##1 - last }
- { \@@_env: - ##1 - \int_use:N \c at jCol }
- }
- \int_step_inline:nn \c at jCol
- {
- \pgfnodealias
- { \@@_env: - last - ##1 }
- { \@@_env: - \int_use:N \c at iRow - ##1 }
- }
- \@@_create_extra_nodes:
- }
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_create_blocks_nodes:
- {
- \pgfpicture
- \pgf at relevantforpicturesizefalse
- \pgfrememberpicturepositiononpagetrue
- \seq_map_inline:Nn \g_@@_pos_of_blocks_seq
- { \@@_create_one_block_node:nnnnn ##1 }
- \endpgfpicture
- }
-% \end{macrocode}
-%
-% The following command is called |\@@_create_one_block_node:nnnnn| but, in
-% fact, it creates a node only if the last argument (|#5|) which is the name of
-% the block, is not empty.\footnote{Moreover, there is also in the list
-% |\g_@@_pos_of_blocks_seq| the positions of the dotted lines (created by
-% |\Cdots|, etc.) and, for these entries, there is, of course, no name (the
-% fifth component is empty).}
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_create_one_block_node:nnnnn #1 #2 #3 #4 #5
- {
- \tl_if_empty:nF { #5 }
- {
- \@@_qpoint:n { col - #2 }
- \dim_set_eq:NN \l_tmpa_dim \pgf at x
- \@@_qpoint:n { #1 }
- \dim_set_eq:NN \l_tmpb_dim \pgf at y
- \@@_qpoint:n { col - \int_eval:n { #4 + 1 } }
- \dim_set_eq:NN \l_@@_tmpc_dim \pgf at x
- \@@_qpoint:n { \int_eval:n { #3 + 1 } }
- \dim_set_eq:NN \l_@@_tmpd_dim \pgf at y
- \@@_pgf_rect_node:nnnnn
- { \@@_env: - #5 }
- { \dim_use:N \l_tmpa_dim }
- { \dim_use:N \l_tmpb_dim }
- { \dim_use:N \l_@@_tmpc_dim }
- { \dim_use:N \l_@@_tmpd_dim }
- }
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_patch_for_revtex:
- {
- \cs_set_eq:NN \@addamp \@addamp at LaTeX
- \cs_set_eq:NN \insert at column \insert at column@array
- \cs_set_eq:NN \@classx \@classx at array
- \cs_set_eq:NN \@xarraycr \@xarraycr at array
- \cs_set_eq:NN \@arraycr \@arraycr at array
- \cs_set_eq:NN \@xargarraycr \@xargarraycr at array
- \cs_set_eq:NN \array \array at array
- \cs_set_eq:NN \@array \@array at array
- \cs_set_eq:NN \@tabular \@tabular at array
- \cs_set_eq:NN \@mkpream \@mkpream at array
- \cs_set_eq:NN \endarray \endarray at array
- \cs_set:Npn \@tabarray { \@ifnextchar [ { \@array } { \@array [ c ] } }
- \cs_set:Npn \endtabular { \endarray $\egroup} % $
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% \subsection*{The environment \{NiceArrayWithDelims\}}
-%
-% \begin{macrocode}
-\NewDocumentEnvironment { NiceArrayWithDelims }
- { m m O { } m ! O { } t \CodeBefore }
- {
- \bool_if:NT \c_@@_revtex_bool \@@_patch_for_revtex:
-% \end{macrocode}
-%
-% \begin{macrocode}
- \@@_provide_pgfsyspdfmark:
- \bool_if:NT \c_@@_footnote_bool \savenotes
-% \end{macrocode}
-%
-% The aim of the following |\bgroup| (the corresponding |\egroup| is, of course,
-% at the end of the environment) is to be able to put an exposant to a matrix in
-% a mathematical formula.
-% \begin{macrocode}
- \bgroup
-% \end{macrocode}
-%
-% \bigskip
-% \begin{macrocode}
- \tl_gset:Nn \g_@@_left_delim_tl { #1 }
- \tl_gset:Nn \g_@@_right_delim_tl { #2 }
- \tl_gset:Nn \g_@@_preamble_tl { #4 }
-% \end{macrocode}
-%
-%
-% \bigskip
-%
-% \begin{macrocode}
- \int_gzero:N \g_@@_block_box_int
- \dim_zero:N \g_@@_width_last_col_dim
- \dim_zero:N \g_@@_width_first_col_dim
- \bool_gset_false:N \g_@@_row_of_col_done_bool
- \str_if_empty:NT \g_@@_name_env_str
- { \str_gset:Nn \g_@@_name_env_str { NiceArrayWithDelims } }
- \bool_if:NTF \l_@@_NiceTabular_bool
- \mode_leave_vertical:
- \@@_test_if_math_mode:
- \bool_if:NT \l_@@_in_env_bool { \@@_fatal:n { Yet~in~env } }
- \bool_set_true:N \l_@@_in_env_bool
-% \end{macrocode}
-% The command |\CT at arc@| contains the instruction of color for the rules of the
-% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by |\CT at arc@| but
-% we use it also for compatibility with \pkg{colortbl}. But we want also to be
-% able to use color for the rules of the array when \pkg{colortbl} is \emph{not}
-% loaded. That's why we do the following instruction which is in the patch of
-% the beginning of arrays done by \pkg{colortbl}. Of course, we restore the
-% value of |\CT at arc@| at the end of our environment.
-% \begin{macrocode}
- \cs_gset_eq:NN \@@_old_CT at arc@ \CT at arc@
-% \end{macrocode}
-%
-% We deactivate Tikz externalization because we will use \textsc{pgf} pictures
-% with the options |overlay| and |remember picture| (or equivalent forms). We
-% deactivate with |\tikzexternaldisable| and not with
-% |\tikzset{external/export=false}| which is \emph{not} equivalent.
-% \begin{macrocode}
- \cs_if_exist:NT \tikz at library@external at loaded
- {
- \tikzexternaldisable
- \cs_if_exist:NT \ifstandalone
- { \tikzset { external / optimize = false } }
- }
-% \end{macrocode}
-%
-% We increment the counter |\g_@@_env_int| which counts the environments
-% of the package.
-% \begin{macrocode}
- \int_gincr:N \g_@@_env_int
- \bool_if:NF \l_@@_block_auto_columns_width_bool
- { \dim_gzero_new:N \g_@@_max_cell_width_dim }
-% \end{macrocode}
-%
-%
-% The sequence |\g_@@_blocks_seq| will contain the carateristics of the blocks
-% (specified by |\Block|) of the array. The sequence |\g_@@_pos_of_blocks_seq|
-% will contain only the position of the blocks (except the blocks with the key
-% |hvlines|).
-% \begin{macrocode}
- \seq_gclear:N \g_@@_blocks_seq
- \seq_gclear:N \g_@@_pos_of_blocks_seq
-% \end{macrocode}
-% In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the
-% positions of the cells with a |\diagbox|.
-%
-% \begin{macrocode}
- \seq_gclear:N \g_@@_pos_of_stroken_blocks_seq
- \seq_gclear:N \g_@@_pos_of_xdots_seq
- \tl_gclear_new:N \g_@@_code_before_tl
- \tl_gclear:N \g_@@_row_style_tl
-% \end{macrocode}
-%
-% \bigskip
-% We load all the informations written in the |aux| file during previous
-% compilations corresponding to the current environment.
-% \begin{macrocode}
@@ Diff output truncated at 1234567 characters. @@
More information about the tex-live-commits
mailing list.