From e2dfc4cc8dc03d323073de46903005e3a9d12255 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 20 Aug 2020 03:01:54 +0000 Subject: CTAN sync 202008200301 --- .../latex/contrib/nicematrix/nicematrix-french.pdf | Bin 408728 -> 421955 bytes .../latex/contrib/nicematrix/nicematrix-french.tex | 304 ++++- macros/latex/contrib/nicematrix/nicematrix.dtx | 1414 +++++++++++++------- macros/latex/contrib/nicematrix/nicematrix.pdf | Bin 990520 -> 1016556 bytes 4 files changed, 1142 insertions(+), 576 deletions(-) (limited to 'macros/latex/contrib/nicematrix') diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.pdf b/macros/latex/contrib/nicematrix/nicematrix-french.pdf index 18e3ce9336..bddd1a53c0 100644 Binary files a/macros/latex/contrib/nicematrix/nicematrix-french.pdf and b/macros/latex/contrib/nicematrix/nicematrix-french.pdf differ diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.tex b/macros/latex/contrib/nicematrix/nicematrix-french.tex index bd13654d0d..7ea4ab69f8 100644 --- a/macros/latex/contrib/nicematrix/nicematrix-french.tex +++ b/macros/latex/contrib/nicematrix/nicematrix-french.tex @@ -10,7 +10,7 @@ \usepackage{nicematrix} \usepackage{tikz} -\usetikzlibrary{fit} +\usetikzlibrary{fit,patterns} \usepackage{enumitem} @@ -300,7 +300,7 @@ Dans l'exemple suivant, on utilise l'option |t| (synonyme de |baseline=t|) immédiatement après un |\item| de liste. On remarquera que la présence d'un |\hline| initial n'empêche pas l'alignement sur la ligne de base de la première rangée (avec |{tabular}| ou |{array}| de \pkg{array}, il faut utiliser -|\firsthline|. +|\firsthline|). \smallskip \begin{BVerbatim}[baseline=c,boxwidth=9cm] @@ -367,6 +367,39 @@ u_n & 1 & 2 & 4 & 8 & 16 & 32 \\ \end{minipage} +\bigskip +\colorbox{yellow!50}{\textbf{Nouveau 5.2}}\enskip On peut aussi utiliser la clé +|baseline| pour aligner une matrice sur un filet horizontal (tracé par +|\hline|). On doit pour cela donner la valeur |line-|\textsl{i} où \textsl{i} +est le numéro de la rangée qui suit ce filet horizontal. + +\smallskip +\begin{Verbatim} +\NiceMatrixOptions{cell-space-top-limit=1pt,cell-space-bottom-limit=1pt} +\end{Verbatim} + +\smallskip +\begin{BVerbatim}[baseline=c,boxwidth=9cm] +$A=\begin{pNiceArray}{cc|cc}[baseline=line-3] +\dfrac1A & \dfrac1B & 0 & 0 \\ +\dfrac1C & \dfrac1D & 0 & 0 \\ +\hline +0 & 0 & A & B \\ +0 & 0 & D & D \\ +\end{pNiceArray}$ +\end{BVerbatim} +\begin{scope} +\NiceMatrixOptions{cell-space-top-limit=1pt,cell-space-bottom-limit=1pt} +\raisebox{-5mm}{$A=\begin{pNiceArray}{cc|cc}[baseline=line-3] +\dfrac1A & \dfrac1B & 0 & 0 \\ +\dfrac1C & \dfrac1D & 0 & 0 \\ +\hline +0 & 0 & A & B \\ +0 & 0 & D & D \\ +\end{pNiceArray}$} +\end{scope} + + \section{Les blocs} @@ -527,6 +560,11 @@ Marie & Pauline \\ \hline \end{NiceTabular} +\bigskip +\colorbox{yellow!50}{\textbf{Nouveau 5.2}}\enskip En revanche, les filets +verticaux ne sont pas tracés à l'intérieur des blocs. + + \bigskip Si vous utilisez \pkg{booktabs} (qui fournit |\toprule|, |\midrule|, |\bottomrule|, etc.) et que vous tenez absolument à mettre des filets verticaux @@ -680,7 +718,8 @@ p.~\pageref{OnlyMainNiceMatrix}. \subsection{Les clés hlines et vlines} La clé |hlines| demande un tracé de tous les filets horizontaux et la clé -|vlines| demande un tracé de tous les filets verticaux. En fait, dans les +|vlines| demande un tracé de tous les filets verticaux (sauf dans les blocs et +dans les blocs virtuels déterminés par des lignes en pointillés). En fait, dans les environnements avec délimiteurs (comme |{pNiceMatrix}| ou |{bNiceArray}|), les filets extérieurs ne sont pas tracés (ce qui est le comportement certainement attendu). @@ -706,10 +745,8 @@ $\begin{pNiceMatrix}[vlines,rules/width=0.2pt] \label{hvlines} La clé |hvlines| demande le tracé de tous les filets horizontaux et verticaux -\emph{sauf dans les blocs}.\footnote{En fait, quand la clé |hvlines| (ou la clé - |hvlines-except-corners| décrite juste après) est utilisée, les filets ne sont - pas non plus tracés dans les blocs virtuels délimités par des cases reliées - par des lignes pointillées (cf. p. \pageref{dotted-and-hvlines}).} +(sauf dans les blocs et dans les blocks virtuels déterminés par des +lignes en pointillés). \medskip \begin{Verbatim} @@ -734,7 +771,8 @@ arum & iris & jacinthe & muguet \subsection{La clé hvlines-except-corners} La clé |hvlines-except-corners| demande le tracé de tous les filets horizontaux -et verticaux \emph{sauf dans les blocs} et sauf dans les coins vides. +et verticaux sauf dans les blocs (y compris dans les blocks virtuels déterminés par des +lignes en pointillés) et sauf dans les coins vides. \medskip \begin{Verbatim} @@ -769,9 +807,15 @@ Comme on le voit, un «coin vide» est constitué de la réunion de tous les rectangles vides partant de la case située exactement dans le coin. \bigskip +\colorbox{yellow!50}{\textbf{Nouveau 5.2}}\enskip On peut passer en argument de +|\hvlines-except-corners| une liste de coins à prendre en considération. Les +coins étant désignés par |NW|, |SW|, |NE| et |SE| (\emph{north west}, +\emph{south west}, \emph{north east} et \emph{south east}). + +\medskip \begin{BVerbatim}[boxwidth=11cm,baseline=c] \begin{NiceTabular}{*{6}{c}}% - [~emphase#hvlines-except-corners@,cell-space-top-limit=3pt] + [~emphase#hvlines-except-corners=NE@,cell-space-top-limit=3pt] 1\\ 1&1\\ 1&2&1\\ @@ -781,7 +825,7 @@ rectangles vides partant de la case située exactement dans le coin. \end{NiceTabular} \end{BVerbatim} \begin{NiceTabular}{*{6}{c}}% - [c,hvlines-except-corners,cell-space-top-limit=3pt] + [c,hvlines-except-corners=NE,cell-space-top-limit=3pt] 1\\ 1&1\\ 1&2&1\\ @@ -904,10 +948,28 @@ incompatibilités (par exemple avec la commande |\hdotsfor|). \item L'extension \pkg{colortbl} construit le tableau ligne par ligne, en alternant rectangles colorés, filets et contenu des cases. Le \textsc{pdf} -résultant déroute certains lecteurs de \textsc{pdf} et on a des artefacts -d'affichage : des filets verticaux semblent disparaître ; au contraire, de fines -lignes blanches peuvent apparaître. L'extension \pkg{nicematrix} proposent des -outils qui évitent ces inconvénients. +résultant déroute certains lecteurs de \textsc{pdf} et on a parfois des artefacts +d'affichage. + +\begin{itemize} +\item Certains filets semblent disparaître. Ce phénomène est dû au fait que les +lecteurs de PDF donnent souvent la priorité aux éléments graphiques qui ont été +tracés postérieurement (conformément à l'esprit du «modèle du peintre» de +PostScript et PDF). De ce point de vue, MuPDF (qui est utilisé par exemple par +SumatraPDF) donne de meilleurs résultats que Adobe Reader. + +\item Une fine ligne blanche semble apparaître entre deux cellules de même +couleur. Ce phénomène se produit quand chaque cellule est coloriée avec sa +propre instruction |fill| (opérateur |fill| de PostScript noté |f| en PDF). +C'est le cas avec \pkg{colortbl} avec lequel chaque cellule est coloriée +individuellement même si on utilise |\columncolor| ou |\rowcolor|. + +Concernant ce phénomène, Adobe Reader donne de meilleurs résultats que +MuPDF. +\end{itemize} + +L'extension \pkg{nicematrix} proposent des outils qui permettent d'éviter ces +inconvénients. \end{itemize} \subsection{Les outils de nicematrix dans le code-before} @@ -958,6 +1020,10 @@ h & i & j \\ \hline \end{NiceTabular} \end{scope} +\medskip +Une commande |\cellcolor| ne produit qu'une instruction |fill| (codée |f|) dans +le \textsc{pdf}. + \bigskip \item La commande |\rectanglecolor| prend trois arguments obligatoires. Le premier est la couleur, les deux suivants fournissent la case en haut à gauche @@ -1025,6 +1091,10 @@ a_{10} & b_{10} & c_{10} \\ \end{NiceArray}$ \end{scope} +\medskip +Une commande |\rowcolor| ne produit qu'une instruction |fill| (codée |f|) dans +le \textsc{pdf}. + \bigskip \item La commande |\columncolor| doit son nom à la commande |\columncolor| de @@ -1061,6 +1131,45 @@ Estelle & 15 \end{NiceTabular} \end{scope} +\bigskip +\colorbox{yellow!50}{\textbf{Nouveau 5.2}}\enskip Il existe une option |respect-blocks| +pour la commande |\rowcolor|. Avec cette option, les ``rangées'' colorées +alternativement peuvent s'étendre sur plusieurs rangées réelles du tableau pour +englober les blocs. + +\medskip +\begin{scope} +\hfuzz=10cm +\begin{BVerbatim}[baseline=c,boxwidth=9cm] +\begin{NiceTabular}{cr}[hvlines,code-before = +~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@] +\Block{2-1}{Pierre} & 12 \\ + & 13 \\ +Jacques & 8 \\ +\Block{3-1}{Stéphanie} & 18 \\ + & 17 \\ + & 15 \\ +Amélie & 20 \\ +Henri & 14 \\ +\Block{2-1}{Estelle} & 15 \\ + & 19 +\end{NiceTabular} +\end{BVerbatim} +\begin{NiceTabular}{cr}[hvlines,code-before = \rowcolors{1}{blue!10}{}[respect-blocks],baseline=c] +\Block{2-1}{Pierre} & 12 \\ + & 13 \\ +Jacques & 8 \\ +\Block{3-1}{Stéphanie} & 18 \\ + & 17 \\ + & 15 \\ +Amélie & 20 \\ +Henri & 14 \\ +\Block{2-1}{Estelle} & 15 \\ + & 19 +\end{NiceTabular} +\end{scope} + + \bigskip @@ -1142,7 +1251,7 @@ On a utilisé le type de colonne |S| de \pkg{siunitx}. On peut accéder aux outils de coloriage précédents avec une syntaxe proche de celle proposée par \pkg{colortbl}. On doit pour cela utiliser la clé |colortbl-like| dans l'environnement concerné.\footnote{Pour le moment, cette - clé n'est pas disponible disponible dans |\NiceMatrixOptions|.} + clé n'est pas disponible dans |\NiceMatrixOptions|.} On a alors accès aux trois commandes suivantes : \begin{itemize} @@ -1157,7 +1266,7 @@ autre commande, elle-même utilisée dans le préambule.}. \medskip \begin{Verbatim} -\begin{NiceTabular}[colortbl-like]{>{~emphase#\columncolor{blue!15}}@ccc} +\begin{NiceTabular}[colortbl-like]{*{2}{>{~emphase#\columncolor{blue!15}@}c}c} \toprule ~emphase#\rowcolor{red!15}@ Nom & Prénom & Année de naissance \\ @@ -1172,7 +1281,7 @@ Dupont & Chantal & 15 janvier 1998 \\ \begin{center} -\begin{NiceTabular}[colortbl-like]{>{\columncolor{blue!15}}ccc} +\begin{NiceTabular}[colortbl-like]{*{2}{>{\columncolor{blue!15}}c}c} \toprule \rowcolor{red!15} Nom & Prénom & Année de naissance \\ @@ -1185,6 +1294,53 @@ Dupont & Chantal & 15 janvier 1998 \\ \end{NiceTabular} \end{center} +\medskip +\emph{Remarque}\par\nobreak + +Chacune de ces instructions |\cellcolor|, |\rowcolor| ou |\columncolor| +(utilisée hors du |code-before|) produit une instruction |fill| (codée |f|) dans +le \textsc{pdf} final. En cas de juxtaposition de rectangles de même couleur, +une fine ligne blanche peut donc apparaître dans certains lecteurs de +\textsc{pdf}\footnote{Par exemple SumatraPDF v3.1.2, qui utilise MuPDF de Artifex + Software, dont le moteur de rendu \textsc{pdf} est appelé Fitz.} (entre les +deux premières colonnes dans l'exemple ci-dessus). Pour éviter cela, il convient +d'utiliser les outils proposés dans le |code-before|. C'est ce que l'on fait +dans le codage qui suit. + + +\medskip +\begin{Verbatim} +\begin{NiceTabular}[colortbl-like]{ccc}% + [code-before = ~emphase#\columncolor{blue!15}{1,2}@] +\toprule +\rowcolor{red!15} +Nom & Prénom & Année de naissance \\ +\midrule +Achard & Jacques & 5 juin 1962 \\ +Lefebvre & Mathilde & 23 mai 1988 \\ +Vanesse & Stéphanie & 30 octobre 1994 \\ +Dupont & Chantal & 15 janvier 1998 \\ +\bottomrule +\end{NiceTabular} +\end{Verbatim} + + +\begin{center} +\begin{NiceTabular}[colortbl-like]{ccc}% + [code-before = \columncolor{blue!15}{1,2}] +\toprule +\rowcolor{red!15} +Nom & Prénom & Année de naissance \\ +\midrule +Achard & Jacques & 5 juin 1962 \\ +Lefebvre & Mathilde & 23 mai 1988 \\ +Vanesse & Stéphanie & 30 octobre 1994 \\ +Dupont & Chantal & 15 janvier 1998 \\ +\bottomrule +\end{NiceTabular} +\end{center} + + \section{La largeur des colonnes} \label{width} @@ -1946,14 +2102,16 @@ b & a & b & \Ddots & & \Vdots \\ \end{pNiceMatrix}\] -\subsection{Les lignes pointillées et la clé hvlines} +\subsection{Les lignes pointillées et les filets} + +\label{dotted-and-rules} -\label{dotted-and-hvlines} +Les lignes pointillées délimitent des blocs virtuels qui ont le même +comportement vis à vis des filets que les blocs créés par |\Block| (les filets +spécifiés par le spécificateur \verb+|+ dans le préambule et par les clés +|vlines|, |hlines|, |hvlines| et |hvlines-except-corners| ne sont pas tracés +dans les blocs). -On a dit (cf. p. \pageref{hvlines}) que la clé |hvlines| trace tous les filets -horizontaux et verticaux, exceptés dans les blocs. En fait, avec cette clé, les -filets ne sont pas non plus tracés dans les blocs virtuels délimités par des -cases reliées par des lignes pointillées. \medskip \begin{BVerbatim}[baseline=c,boxwidth=10.6cm] @@ -2397,11 +2555,6 @@ $\begin{bNiceMatrix}[r] \sin x & \cos x \end{bNiceMatrix}$ -\medskip -Il existe aussi l'option |S| qui impose que toutes les colonnes soient des -colonnes |S| de \pkg{siunitx} (si cette extension est chargée).\footnote{Cela - reprend une partie des fonctionnalités proposées par les environnements - |{pmatrix*}|, |{bmatrix*}|, etc. de \pkg{mathtools}.} \subsection{La commande \textbackslash rotate} @@ -3044,54 +3197,59 @@ l'intersection du filet horizontal~$i$ et du filet vertical~$j$ avec la syntaxe \end{NiceMatrix}\] -\section{Outils pour les développeurs} +\section{API pour les développeurs} -Comme son nom l'indique, la liste de tokens |\g_nicematrix_code_after_tl| est -publique (conformément aux conventions de LaTeX3, toute variable dont le nom -débute par |\g_nicematrix| ou |\l_nicematrix| est publique alors que toute variable -dont le nom débute par |\g__nicematrix| ou par |\l__nicematrix| est privée). +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 + par |\l__nicematrix| est privée.} : +\begin{itemize} +\item \colorbox{yellow!50}{\textbf{Nouveau 5.2}}\enskip |\g_nicematrix_code_before_tl| ; +\item |\g_nicematrix_code_after_tl|. +\end{itemize} \medskip -Cette variable contient le code qui constitue le «|code-after|». Le développeur -peut donc l'utiliser pour y ajouter du code à partir d'une cellule du tableau -(l'affectation devra être globale, ce qui permettra de sortir de la cellule, qui -est un groupe au sens de TeX). +Ces variables constituent le code du «|code-before|» et du «|code-after|». Le +développeur peut donc les utiliser pour y ajouter du code à partir d'une cellule +du tableau (l'affectation devra être globale, ce qui permettra de sortir de la +cellule, qui est un groupe au sens de TeX). \medskip -\emph{Exemple} : On souhaite écrire une commande |\crossbox| qui barre en croix -la cellule courante. Cette commande prendra en argument optionnel une liste de -couples \textsl{clé}-\textsl{valeur} qui sera passée à Tikz avant que la croix -ne soit tracée. - +On remarquera que l'utilisation de |\g_nicematrix_code_before_tl| nécessite une +compilation supplémentaire (car les instructions sont écrites dans le fichier +|aux| pour être utilisées à la compilation suivante). -On peut alors programmer cette commande |\crossbox| de la manière suivante, qui -utilise explicitement la variable publique |\g_nicematrix_code_after_tl|. +\bigskip +\emph{Example} : On souhaite écrire une commande |\hatchcell| pour hachurer la +cellule courante (avec un argument optionnel entre crochets pour la couleur des +hachures). Il est possible de programmer une telle commande |\hatchcell| comme +suit, en utilisant explicitement la variable publique +|\g_nicematrix_code_before_tl| (ce code nécessite le chargement préalable de la +bibliothèque Tikz \pkg{patterns}). \begin{scope} \fvset{commandchars=\§\¤\μ} \begin{Verbatim} \ExplSyntaxOn -\cs_new_protected:Nn \__pantigny_crossbox:nnn +\cs_new_protected:Nn \__pantigny_hatchcell:nnn { \begin { tikzpicture } - \draw [ #3 ] - ( row-#1 -| col-\int_eval:n { #2 + 1 } ) - -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) - ( row-#1 -| col-\int_eval:n #2 ) - -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; + \fill [ pattern = north~west~lines , pattern~color = #3 ] + ( row - #1 -| col - #2) + rectangle + ( row - \int_eval:n { #1 + 1 } -| col - \int_eval:n { #2 + 1 } ) ; \end { tikzpicture } } - -\NewDocumentCommand \crossbox { ! O { } } +\NewDocumentCommand \hatchcell { ! O { black } } { - \tl_gput_right:Nx §emphase¤\g_nicematrix_code_after_tlμ + \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ { - \__pantigny_crossbox:nnn + \__pantigny_hatchcell:nnn { \int_use:c { c@iRow } } { \int_use:c { c@jCol } } - { \exp_not:n { #1 } } + { #1 } } } \ExplSyntaxOff @@ -3100,47 +3258,47 @@ utilise explicitement la variable publique |\g_nicematrix_code_after_tl|. \ExplSyntaxOn -\cs_new_protected:Nn \__pantigny_crossbox:nnn +\cs_new_protected:Nn \__pantigny_hatchcell:nnn { \begin { tikzpicture } - \draw [ #3 ] - ( row-#1 -| col-\int_eval:n { #2 + 1 } ) - -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) - ( row-#1 -| col-\int_eval:n #2 ) - -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; + \fill [ pattern = north~west~lines , pattern~color = #3 ] + ( row - #1 -| col - #2) + rectangle + ( row - \int_eval:n { #1 + 1 } -| col - \int_eval:n { #2 + 1 } ) ; \end { tikzpicture } } - -\NewDocumentCommand \crossbox { ! O { } } +\NewDocumentCommand \hatchcell { ! O { black } } { - \tl_gput_right:Nx \g_nicematrix_code_after_tl + \tl_gput_right:Nx \g_nicematrix_code_before_tl { - \__pantigny_crossbox:nnn + \__pantigny_hatchcell:nnn { \int_use:c { c@iRow } } { \int_use:c { c@jCol } } - { \exp_not:n { #1 } } + { #1 } } } \ExplSyntaxOff + \bigskip -Voici un exemple d'utilisation : +Voici un exemple d'utilisation. \medskip \begin{BVerbatim}[baseline=c,boxwidth=9cm] \begin{NiceTabular}{ccc}[hvlines] -merlan & requin & cabillaud \\ -baleine & ~emphase#\crossbox[red]@ & morue \\ -mante & raie & poule +Tokyo & Paris & London \\ +Roma & ~emphase#\hatchcell[blue!30]@Oslo & Miami \\ +Los Angeles & Madrid & Roma \end{NiceTabular} \end{BVerbatim} \begin{NiceTabular}{ccc}[hvlines] -merlan & requin & cabillaud \\ -baleine & \crossbox[red] & morue \\ -mante & raie & poule +Tokyo & Paris & London \\ +Lima & \hatchcell[blue!30]Oslo & Miami \\ +Los Angeles & Madrid & Roma \end{NiceTabular} + \section{Remarques techniques} Première remarque : l'extension \pkg{nicematrix} doit être chargée après diff --git a/macros/latex/contrib/nicematrix/nicematrix.dtx b/macros/latex/contrib/nicematrix/nicematrix.dtx index c2856d51a2..10e84b7b07 100644 --- a/macros/latex/contrib/nicematrix/nicematrix.dtx +++ b/macros/latex/contrib/nicematrix/nicematrix.dtx @@ -15,8 +15,8 @@ % % \fi % \iffalse -\def\myfileversion{5.1} -\def\myfiledate{2020/07/31} +\def\myfileversion{5.2} +\def\myfiledate{2020/08/19} % % %<*batchfile> @@ -52,7 +52,7 @@ version 2005/12/01 or later. \geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}} \usepackage{tikz} -\usetikzlibrary{fit} +\usetikzlibrary{fit,patterns} \usepackage{nicematrix} \usepackage{siunitx} @@ -408,6 +408,38 @@ version 2005/12/01 or later. % \end{enumerate} % \end{minipage} % +% \bigskip +% \colorbox{yellow!50}{\textbf{New 5.2}}\enskip 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 following the horizontal rule. +% +% \smallskip +% \begin{Verbatim} +% \NiceMatrixOptions{cell-space-top-limit=1pt,cell-space-bottom-limit=1pt} +% \end{Verbatim} +% +% \smallskip +% \begin{BVerbatim}[baseline=c,boxwidth=9cm] +% $A=\begin{pNiceArray}{cc|cc}[baseline=line-3] +% \dfrac1A & \dfrac1B & 0 & 0 \\ +% \dfrac1C & \dfrac1D & 0 & 0 \\ +% \hline +% 0 & 0 & A & B \\ +% 0 & 0 & D & D \\ +% \end{pNiceArray}$ +% \end{BVerbatim} +% \begin{scope} +% \NiceMatrixOptions{cell-space-top-limit=1pt,cell-space-bottom-limit=1pt} +% \raisebox{-5mm}{$A=\begin{pNiceArray}{cc|cc}[baseline=line-3] +% \dfrac1A & \dfrac1B & 0 & 0 \\ +% \dfrac1C & \dfrac1D & 0 & 0 \\ +% \hline +% 0 & 0 & A & B \\ +% 0 & 0 & D & D \\ +% \end{pNiceArray}$} +% \end{scope} +% % % \section{The blocks} % \label{Block} @@ -569,6 +601,11 @@ version 2005/12/01 or later. % Mary & George \\ \hline % \end{NiceTabular} % +% +% \bigskip +% \colorbox{yellow!50}{\textbf{New 5.2}}\enskip However, the vertical rules are +% not drawn in the blocks. +% % \bigskip % If you use \pkg{booktabs} (which provides |\toprule|, |\midrule|, % |\bottomrule|, etc.) and if you really want to add vertical rules (which is @@ -712,9 +749,10 @@ version 2005/12/01 or later. % \subsection{The keys hlines and vlines} % % The key |hlines| draws all the horizontal rules and the key |vlines| draws all -% the vertical rules. In fact, in the environments with delimiters (as +% the vertical rules excepted in the blocks (and the virtual blocks determined +% by dotted lines). In fact, in the environments with delimiters (as % |{pNiceMatrix}| or |{bNiceArray}|) the exteriors rules are not drawn (as -% expected). +% expected). % % \medskip % \begin{BVerbatim}[baseline=c,boxwidth=10.6cm] @@ -735,11 +773,8 @@ version 2005/12/01 or later. % \subsection{The key hvlines} % \label{hvlines} % -% The key |hvlines| draws all the vertical and horizontal rules \emph{excepted -% in the blocks}.\footnote{In fact, when the key |hvlines| (or the key -% |hvlines-except-corners| described just after) is in force, the -% rules are also not drawn in the virtual blocks delimited by cells relied par -% dotted lines (cf. p. \pageref{dotted-and-hvlines}).} +% The key |hvlines| draws all the vertical and horizontal rules excepted +% in the blocks (and the virtual blocks determined by dotted lines). % % \medskip % \begin{Verbatim} @@ -766,7 +801,8 @@ version 2005/12/01 or later. % \subsection{The key hvlines-except-corners} % % The key |hvlines-except-corners| draws all the horizontal and vertical rules, -% \emph{excepted in the blocks} and excepted in the empty corners. +% excepted in the blocks (and the virtual blocks determined by dotted lines) and +% excepted in the empty corners. % % \medskip % \begin{Verbatim} @@ -801,9 +837,16 @@ version 2005/12/01 or later. % rectangles starting from the cell actually in the corner of the array. % % \bigskip +% \colorbox{yellow!50}{\textbf{New 5.2}}\enskip It's possible to give as value to the +% key |\hvlines-except-corners| a list of the corners to take into +% consideration. The corners are designed by |NW|, |SW|, |NE| and |SE| +% (\emph{north west}, \emph{south west}, \emph{north east} and \emph{south +% east}). +% +% \bigskip % \begin{BVerbatim}[boxwidth=11cm,baseline=c] % \begin{NiceTabular}{*{6}{c}}% -% [~emphase#hvlines-except-corners@,cell-space-top-limit=3pt] +% [~emphase#hvlines-except-corners=NE@,cell-space-top-limit=3pt] % 1\\ % 1&1\\ % 1&2&1\\ @@ -812,7 +855,7 @@ version 2005/12/01 or later. % 1&5&10&10&5&1 % \end{NiceTabular} % \end{BVerbatim} -% \begin{NiceTabular}{*{6}{c}}[c,hvlines-except-corners,cell-space-top-limit=3pt] +% \begin{NiceTabular}{*{6}{c}}[c,hvlines-except-corners=NE,cell-space-top-limit=3pt] % 1\\ % 1&1\\ % 1&2&1\\ @@ -912,7 +955,7 @@ version 2005/12/01 or later. % %\section{The color of the rows and columns} % -% \subsection{Utilisation of colortbl} +% \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|: @@ -931,9 +974,23 @@ version 2005/12/01 or later. % \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 : some rules seem to disappear and on the -% other side, some thin white lines appear. The package \pkg{nicematrix} -% provides some tools without those drawbacks. +% 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 code-before} @@ -985,6 +1042,10 @@ version 2005/12/01 or later. % h & i & j \\ \hline % \end{NiceTabular} % \end{scope} +% +% \medskip +% A command |\cellcolor| generates only one instruction |fill| (coded |f|) in the +% resulting \textsc{pdf}. % % \bigskip % \item The command |\rectanglecolor| takes three mandatory arguments. The first @@ -1050,6 +1111,10 @@ version 2005/12/01 or later. % a_{10} & b_{10} & c_{10} \\ % \end{NiceArray}$ % \end{scope} +% +% \medskip +% A command |\rowcolor| generates only one instruction |fill| (coded |f|) in the +% resulting \textsc{pdf}. % % % \bigskip @@ -1088,6 +1153,44 @@ version 2005/12/01 or later. % Madison & 15 % \end{NiceTabular} % \end{scope} +% +% \bigskip +% \colorbox{yellow!50}{\textbf{New 5.2}}\enskip There is a key |respect-blocks| +% for the instruction |\rowcolor|. With that key, the ``rows'' alternately +% colored may extend over several row if they have to incorporate blocks. +% +% \medskip +% \begin{scope} +% \hfuzz=10cm +% \begin{BVerbatim}[baseline=c,boxwidth=9cm] +% \begin{NiceTabular}{cr}[hvlines,code-before = +% ~emphase#\rowcolors{1}{blue!10}{}[respect-blocks]@] +% \Block{2-1}{John} & 12 \\ +% & 13 \\ +% Stephen & 8 \\ +% \Block{3-1}{Sarah} & 18 \\ +% & 17 \\ +% & 15 \\ +% Ashley & 20 \\ +% Henry & 14 \\ +% \Block{2-1}{Madison} & 15 \\ +% & 19 +% \end{NiceTabular} +% \end{BVerbatim} +% \begin{NiceTabular}{cr}[hvlines,code-before = \rowcolors{1}{blue!10}{}[respect-blocks],baseline=c] +% \Block{2-1}{John} & 12 \\ +% & 13 \\ +% Stephen & 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 command |\chessboardcolors| takes in as mandatory arguments two colors @@ -1184,7 +1287,7 @@ version 2005/12/01 or later. % % \medskip % \begin{Verbatim} -% \begin{NiceTabular}[colortbl-like]{>{~emphase#\columncolor{blue!15}}@ccc} +% \begin{NiceTabular}[colortbl-like]{*{2}{>{~emphase#\columncolor{blue!15}@}c}c} % \toprule % ~emphase#\rowcolor{red!15}@ % Last name & First name & Birth day \\ @@ -1199,7 +1302,7 @@ version 2005/12/01 or later. % % % \begin{center} -% \begin{NiceTabular}[colortbl-like]{>{\columncolor{blue!15}}ccc} +% \begin{NiceTabular}[colortbl-like]{*{2}{>{\columncolor{blue!15}}c}c} % \toprule % \rowcolor{red!15} % Last name & First name & Birth day \\ @@ -1212,6 +1315,47 @@ version 2005/12/01 or later. % \end{NiceTabular} % \end{center} % +% \medskip +% Each instruction |\cellcolor|, |\rowcolor| or |\columncolor| will generate an +% instruction |fill| (coded~|f|) in the resulting \textsc{pdf}. In cases of +% juxtaposed colored rectangles, one may have a thin white color line in some +% \textsc{pdf} viewers\footnote{For example SumatraPDF v3.1.2, which uses MuPDF +% of Artifex Software, whose \textsc{pdf} renderer is called Fitz.} (between the +% two first columns in the above example). In you want to avoid this problem, +% you should use the tools in the |code-before|. That's what we do with the +% following code. +% +% +% \medskip +% \begin{Verbatim} +% \begin{NiceTabular}[colortbl-like]{ccc}% +% [code-before = ~emphase#\columncolor{blue!15}{1,2}@] +% \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{Verbatim} +% +% +% \begin{center} +% \begin{NiceTabular}[colortbl-like]{ccc}[code-before = \columncolor{blue!15}{1,2}] +% \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 width of the columns} % \label{width} @@ -1957,14 +2101,14 @@ version 2005/12/01 or later. % \end{pNiceMatrix}\] % % -% \subsection{The dotted lines and the key hvlines} +% \subsection{The dotted lines and the rules} % -% \label{dotted-and-hvlines} +% \label{dotted-and-rules} % -% We have said (cf. p. \pageref{hvlines}) that the key |hvlines| draws all the -% horizontal and vertical rules, excepted in the blocks. In fact, when this key -% is in force, the rules are also not drawn in the virtual blocks delimited by -% cells relied par dotted lines. +% The dotted lines determine virtual blocks which have the same behaviour +% regarding the rules (the rules specified by the specifier \verb+|+ in the +% preamble and by the keys |hlines|, |vlines|, |hvlines| and +% |hvlines-except-corners| are not drawn within the blocks). % % \medskip % \begin{BVerbatim}[baseline=c,boxwidth=10.6cm] @@ -2145,7 +2289,7 @@ version 2005/12/01 or later. % \begin{table} % \setlength{\belowcaptionskip}{1ex} % \centering -% \caption{Utilisation of \texttt{\textbackslash tabularnote}~emphase#\tabularnote{It's possible! +% \caption{Use of \texttt{\textbackslash tabularnote}~emphase#\tabularnote{It's possible! % ~emphase#to put a note in the caption.}}! % \label{t:tabularnote} % \begin{NiceTabular}{@{}llc@{}[~emphase#notes/bottomrule!] @@ -2169,7 +2313,7 @@ version 2005/12/01 or later. % \begin{table} % \setlength{\belowcaptionskip}{1ex} % \centering -% \caption{Utilisation of \texttt{\textbackslash tabularnote}\tabularnote{It's possible +% \caption{Use of \texttt{\textbackslash tabularnote}\tabularnote{It's possible % to put a note in the caption.}} % \label{t:tabularnote} % \begin{NiceTabular}{@{}llc@{}}[notes/bottomrule] @@ -2255,7 +2399,7 @@ version 2005/12/01 or later. % puts several consecutive commands |\tabularnote|. The marker |#1| is meant to % be the name of a LaTeX counter. % -% Initial value: |\emph{\alph{#1}}| +% Initial value: |\textit{\alph{#1}}| % % Another possible value should be a mere |\arabic{#1}| % @@ -2334,7 +2478,7 @@ version 2005/12/01 or later. % For an example of customization of the tabular notes, see p.~\pageref{ex:notes}. % % -% \subsection{Utilisation of \{NiceTabular\} with threeparttable} +% \subsection{Use of \{NiceTabular\} with threeparttable} % % % If you wish to use the environment |{NiceTabular}| in an environment @@ -2404,11 +2548,6 @@ version 2005/12/01 or later. % \sin x & \cos x % \end{bNiceMatrix}$ % -% \medskip -% There is also a key |S| which sets all the columns all type |S| of -% \pkg{siunitx} (if this package is loaded).\footnote{This is a part of the -% functionality provided by the environments |{pmatrix*}|, |{bmatrix*}|, etc. of -% \pkg{mathtools}.} % % \subsection{The command \textbackslash rotate} % @@ -2655,7 +2794,7 @@ version 2005/12/01 or later. % % % -% \section{Utilisation of Tikz with nicematrix} +% \section{Use of Tikz with nicematrix} % % \label{name} % \subsection{The nodes corresponding to the contents of the cells} @@ -2936,7 +3075,7 @@ version 2005/12/01 or later. % % \vspace{1cm} % \begin{minipage}[c]{7cm} -% Here are the ``large nodes'' of this array (without utilisation of |margin| +% Here are the ``large nodes'' of this array (without use of |margin| % nor |extra-margin|). % \end{minipage} % \hspace{1.5cm} @@ -3041,53 +3180,60 @@ version 2005/12/01 or later. % 1 & 8 & 28 & 56 & 70 & 56 & 28 & 8 & 1 % \end{NiceMatrix}\] % -% \section{Tools for the developpers} -% -% As its name implies, the token list |\g_nicematrix_code_after_tl| is public -% (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). +% \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 \colorbox{yellow!50}{\textbf{New 5.2}}\enskip |\g_nicematrix_code_before_tl| ; +% \item |\g_nicematrix_code_after_tl|. +% \end{itemize} +% % % \medskip -% This variable contains the code of what we have called the ``|code-after|''. -% The developper can use it to add code from a cell of the array (the -% affectation must be global, allowing to exit the cell, which is a TeX group). +% These variables contain the code of what we have called the ``|code-before|'' +% and the ``|code-after|''. 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 -% \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. +% 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). % -% It's possible to program such command |\crossbox| as follows, explicitely -% using the public variable |\g_nicematrix_code_after_tl|. +% \bigskip +% \emph{Example} : We want to write a command |\hatchcell| to hatch the current +% cell (with an optional argument between brackets for the color). It's possible +% to program such command |\hatchcell| as follows, explicitely using the public +% variable |\g_nicematrix_code_before_tl| (this code requires the Tikz library +% \pkg{patterns}). % % % \begin{scope} % \fvset{commandchars=\§\¤\μ} % \begin{Verbatim} -% \ExplSyntaxOn -% \cs_new_protected:Nn \__pantigny_crossbox:nnn +%\ExplSyntaxOn +% \cs_new_protected:Nn \__pantigny_hatchcell:nnn % { % \begin { tikzpicture } -% \draw [ #3 ] -% ( row-#1 -| col-\int_eval:n { #2 + 1 } ) -% -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) -% ( row-#1 -| col-\int_eval:n #2 ) -% -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; +% \fill [ pattern = north~west~lines , pattern~color = #3 ] +% ( row - #1 -| col - #2) +% rectangle +% ( row - \int_eval:n { #1 + 1 } -| col - \int_eval:n { #2 + 1 } ) ; % \end { tikzpicture } % } % -% -% \NewDocumentCommand \crossbox { ! O { } } +% \NewDocumentCommand \hatchcell { ! O { black } } % { -% \tl_gput_right:Nx §emphase¤\g_nicematrix_code_after_tlμ +% \tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ % { -% \__pantigny_crossbox:nnn +% \__pantigny_hatchcell:nnn % { \int_use:c { c@iRow } } % { \int_use:c { c@jCol } } -% { \exp_not:n { #1 } } +% { #1 } % } % } % \ExplSyntaxOff @@ -3095,45 +3241,44 @@ version 2005/12/01 or later. % \end{scope} % % -% \ExplSyntaxOn -% \cs_new_protected:Nn \__pantigny_crossbox:nnn +%\ExplSyntaxOn +% \cs_new_protected:Nn \__pantigny_hatchcell:nnn % { % \begin { tikzpicture } -% \draw [ #3 ] -% ( row-#1 -| col-\int_eval:n { #2 + 1 } ) -% -- ( row-\int_eval:n { #1 + 1 } -| col-#2 ) -% ( row-#1 -| col-\int_eval:n #2 ) -% -- ( row-\int_eval:n { #1 + 1 } -| col-\int_eval:n { #2 + 1 } ) ; +% \fill [ pattern = north~west~lines , pattern~color = #3 ] +% ( row - #1 -| col - #2) +% rectangle +% ( row - \int_eval:n { #1 + 1 } -| col - \int_eval:n { #2 + 1 } ) ; % \end { tikzpicture } % } % -% -% \NewDocumentCommand \crossbox { ! O { } } +% \NewDocumentCommand \hatchcell { ! O { black } } % { -% \tl_gput_right:Nx \g_nicematrix_code_after_tl +% \tl_gput_right:Nx \g_nicematrix_code_before_tl % { -% \__pantigny_crossbox:nnn +% \__pantigny_hatchcell:nnn % { \int_use:c { c@iRow } } % { \int_use:c { c@jCol } } -% { \exp_not:n { #1 } } +% { #1 } % } % } % \ExplSyntaxOff % +% % \bigskip -% Here is an example of utilisation: +% Here is an example of use: % % \medskip % \begin{BVerbatim}[baseline=c,boxwidth=9cm] % \begin{NiceTabular}{ccc}[hvlines] % Tokyo & Paris & London \\ -% Cap Town & ~emphase#\crossbox[red]@ & Miami \\ +% Roma & ~emphase#\hatchcell[blue!30]@Oslo & Miami \\ % Los Angeles & Madrid & Roma % \end{NiceTabular} % \end{BVerbatim} % \begin{NiceTabular}{ccc}[hvlines] % Tokyo & Paris & London \\ -% Cap Town & \crossbox[red] & Miami \\ +% Lima & \hatchcell[blue!30]Oslo & Miami \\ % Los Angeles & Madrid & Roma % \end{NiceTabular} % @@ -4330,14 +4475,24 @@ version 2005/12/01 or later. % \end{macrocode} % The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of % the rules in the array. We will use it to store the instruction of color for -% the rules even if \pkg{colortbl} is not loaded. +% the rules even if \pkg{colortbl} is not loaded. Idem for % \begin{macrocode} \cs_set_protected:Npn \CT@arc@ { } \cs_set:Npn \arrayrulecolor #1 # { \CT@arc { #1 } } \cs_set:Npn \CT@arc #1 #2 { \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign - { \cs_gset:Npn \CT@arc@ { \color #1 { #2 } } } + { \cs_gset:Npn \CT@arc@ { \color #1 { #2 } } } + } +% \end{macrocode} +% Idem for |\CT@drs@|. +% \begin{macrocode} + \cs_set_protected:Npn \CT@drsc@ { } + \cs_set:Npn \doublerulesepcolor #1 # { \CT@drs { #1 } } + \cs_set:Npn\CT@drs #1 #2 + { + \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign + { \cs_gset:Npn \CT@drsc@ { \color #1 { #2 } } } } \cs_set:Npn \hline { @@ -4364,7 +4519,16 @@ version 2005/12/01 or later. \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & } \int_compare:nNnT { #1 } > 1 { \multispan { \@@_pred:n { #1 } } & } \multispan { \int_eval:n { #2 - #1 + 1 } } - { \CT@arc@ \leaders \hrule \@height \arrayrulewidth \hfill } + { + \CT@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 @@ -4379,7 +4543,7 @@ version 2005/12/01 or later. % % \bigskip % The following version of |\cline| spreads the array of a quantity equal -% to |\arrayrulewidth| as does |\hline|. It will be loaded except if the key +% to |\arrayrulewidth| as does |\hline|. It will be loaded excepted if the key % |standard-cline| has been used. % \begin{macrocode} \cs_set:Npn \@@_cline @@ -4403,7 +4567,11 @@ version 2005/12/01 or later. \int_compare:nNnT { #1 } < { #2 } { \multispan { \int_eval:n { #2 - #1 } } & } \multispan { \int_eval:n { #3 - #2 + 1 } } - { \CT@arc@ \leaders \hrule \@height \arrayrulewidth \hfill } + { + \CT@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|). @@ -4596,7 +4764,7 @@ version 2005/12/01 or later. { \ExplSyntaxOn \cs_if_free:NT \pgfsyspdfmark - { \cs_set_eq:NN \pgfsyspdfmark \use:nnn } + { \cs_set_eq:NN \pgfsyspdfmark \@gobblethree } \ExplSyntaxOff } \cs_gset_eq:NN \@@_provide_pgfsyspdfmark: \prg_do_nothing: @@ -4750,7 +4918,7 @@ version 2005/12/01 or later. % \emph{environment} whether we are in a command of \pkg{nicematrix} or in an % environment of \pkg{nicematrix}. The default value is \emph{environment}. % \begin{macrocode} -\str_set:Nn \g_@@_com_or_env_str { environment } +\tl_set:Nn \g_@@_com_or_env_str { environment } % \end{macrocode} % % \bigskip @@ -4813,6 +4981,7 @@ version 2005/12/01 or later. \bool_new:N \g_@@_row_of_col_done_bool % \end{macrocode} % +% % \bigskip % |\l_@@_code_before_tl| may contain two types of informations: % \begin{itemize} @@ -4889,7 +5058,7 @@ version 2005/12/01 or later. % \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 required by the keys |hvlines| or |hvlines-except-corners|. +% draw the rules (which respect the blocks). % % \bigskip % We will also manage a sequence for the positions of the dotted lines. These @@ -5031,10 +5200,10 @@ version 2005/12/01 or later. % % \bigskip % The following counter will be used to count the number of successive tabular -% notes such as in +% notes such as in % |\tabularnote{Note 1}\tabularnote{Note 2}\tabularnote{Note 3}|. % In the tabular, the labels of those nodes are composed as a comma -% separated list (e.g. \textsuperscript{\emph{a},\emph{b},\emph{c}}). +% separated list (e.g. \textsuperscript{\textit{a},\textit{b},\textit{c}}). % \begin{macrocode} \int_new:N \l_@@_number_of_notes_int % \end{macrocode} @@ -5042,7 +5211,7 @@ version 2005/12/01 or later. % \bigskip % The following function can be redefined by using the key |notes/style|. % \begin{macrocode} -\cs_new:Npn \@@_notes_style:n #1 { \emph { \alph { #1 } } } +\cs_new:Npn \@@_notes_style:n #1 { \textit { \alph { #1 } } } % \end{macrocode} % % \bigskip @@ -5134,7 +5303,7 @@ version 2005/12/01 or later. % \begin{macrocode} \int_incr:N \l_@@_number_of_notes_int % \end{macrocode} -% We expand the content of the note at the point of utilisation of +% We expand the content of the note at the point of use of % |\tabularnote| as does |\footnote|. % \begin{macrocode} \seq_gput_right:Nx \g_@@_tabularnotes_seq { #1 } @@ -5339,7 +5508,7 @@ version 2005/12/01 or later. % array). % \begin{macrocode} \str_new:N \l_@@_baseline_str -\str_set:Nn \l_@@_baseline_str c +\tl_set:Nn \l_@@_baseline_str c % \end{macrocode} % % \bigskip @@ -5360,21 +5529,28 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% The flag |\l_@@_hlines_bool| corresponds to the key |hlines|, the flag -% |\l_@@_vlines_bool| to the key |vlines| and the flag |hvlines| to the key -% |hvlines|. The key |hvlines| is not a mere alias for the conjonction of -% |hlines| and |vlines|. Indeed, with |hvlines|, the vertical and horizontal -% rules are \emph{not} drawn within the blocks (created by |\Block|). +% If the flag |\l_@@_vlines_bool| is raised, horizontal space will be reserved +% in the the preamble of the array (for the vertical rules) and, after the +% construction of the array, the vertical rules will be drawn. % \begin{macrocode} -\bool_new:N \l_@@_hlines_bool \bool_new:N \l_@@_vlines_bool -\bool_new:N \l_@@_hvlines_bool % \end{macrocode} % % \bigskip -% The flag |\l_@@_hlines_except_corners_bool| corresponds to the key |hlines-except-corners|. +% If the flag |\l_@@_hlines_bool| is raised, vertical space will be reserved +% between the rows of the array (for the horizontal rules) and, after the +% construction of the array, the vertical rules will be drawn. % \begin{macrocode} -\bool_new:N \l_@@_hvlines_except_corners_bool +\bool_new:N \l_@@_hlines_bool +% \end{macrocode} +% +% \bigskip +% The flag |\l_@@_except_corners_bool| will be raised when the key +% |except-corners| will be used. In that case, the corners will be computed +% before we draw rules and the rules won't be drawn in the corners. As expected, +% the key |hvlines-except-corners| raises the key |except-corners|. +% \begin{macrocode} +\clist_new:N \l_@@_except_corners_clist % \end{macrocode} % % \begin{macrocode} @@ -5553,7 +5729,6 @@ version 2005/12/01 or later. vlines .bool_set:N = \l_@@_vlines_bool , hvlines .code:n = { - \bool_set_true:N \l_@@_hvlines_bool \bool_set_true:N \l_@@_vlines_bool \bool_set_true:N \l_@@_hlines_bool } , @@ -5590,30 +5765,37 @@ version 2005/12/01 or later. % 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 } - { - hvlines-except-corners .bool_set:N = \l_@@_hvlines_except_corners_bool , - hvlines-except-corners .default:n = true , - code-before .code:n = +\keys_define:nn { NiceMatrix / Env } + { + except-corners .clist_set:N = \l_@@_except_corners_clist , + except-corners .default:n = { NW , SW , NE , SE } , + hvlines-except-corners .code:n = { - \tl_if_empty:nF { #1 } - { - \tl_put_right:Nn \l_@@_code_before_tl { #1 } - \bool_set_true:N \l_@@_code_before_bool - } + \clist_set:Nn \l_@@_except_corners_clist { #1 } + \bool_set_true:N \l_@@_vlines_bool + \bool_set_true:N \l_@@_hlines_bool } , + hvlines-except-corners .default:n = { NW , SW , NE , SE } , + code-before .code:n = + { + \tl_if_empty:nF { #1 } + { + \tl_put_right:Nn \l_@@_code_before_tl { #1 } + \bool_set_true:N \l_@@_code_before_bool + } + } , % \end{macrocode} % \bigskip % The options |c|, |t| and |b| of the environment |{NiceArray}| have the same % meaning as the option of the classical environment |{array}|. % \begin{macrocode} - c .code:n = \str_set:Nn \l_@@_baseline_str c , - t .code:n = \str_set:Nn \l_@@_baseline_str t , - b .code:n = \str_set:Nn \l_@@_baseline_str b , + c .code:n = \tl_set:Nn \l_@@_baseline_str c , + t .code:n = \tl_set:Nn \l_@@_baseline_str t , + b .code:n = \tl_set:Nn \l_@@_baseline_str b , baseline .tl_set:N = \l_@@_baseline_str , baseline .value_required:n = true , columns-width .code:n = - \str_if_eq:nnTF { #1 } { auto } + \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 , @@ -5778,7 +5960,7 @@ version 2005/12/01 or later. % In |\NiceMatrixOptions|, the special value |auto| is not available. % \begin{macrocode} columns-width .code:n = - \str_if_eq:nnTF { #1 } { auto } + \tl_if_eq:nnTF { #1 } { auto } { \@@_error:n { Option~auto~for~columns-width } } { \dim_set:Nn \l_@@_columns_width_dim { #1 } } , % \end{macrocode} @@ -5803,7 +5985,7 @@ version 2005/12/01 or later. % \begin{macrocode} letter-for-dotted-lines .code:n = { - \int_compare:nTF { \tl_count:n { #1 } = 1 } + \tl_if_single_token:nTF { #1 } { \str_set:Nx \l_@@_letter_for_dotted_lines_str { #1 } } { \@@_error:n { Bad~value~for~letter~for~dotted~lines } } } , @@ -5845,9 +6027,6 @@ version 2005/12/01 or later. { \int_set:Nn \l_@@_last_col_int { #1 } } , l .code:n = \tl_set:Nn \l_@@_type_of_col_tl l , r .code:n = \tl_set:Nn \l_@@_type_of_col_tl r , - S .code:n = \bool_if:NTF \c_@@_siunitx_loaded_bool - { \tl_set:Nn \l_@@_type_of_col_tl S } - { \@@_error:n { option~S~without~siunitx } } , small .bool_set:N = \l_@@_small_bool , small .value_forbidden:n = true , unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix } @@ -6466,6 +6645,7 @@ version 2005/12/01 or later. \cs_set_eq:NN \Ddots \@@_Ddots \cs_set_eq:NN \Iddots \@@_Iddots \cs_set_eq:NN \hdottedline \@@_hdottedline: + \cs_set_eq:NN \Hline \@@_Hline: \cs_set_eq:NN \Hspace \@@_Hspace: \cs_set_eq:NN \Hdotsfor \@@_Hdotsfor: \cs_set_eq:NN \Vdotsfor \@@_Vdotsfor: @@ -6473,7 +6653,7 @@ version 2005/12/01 or later. \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 \dotfill \@@_old_dotfill: \cs_set_eq:NN \CodeAfter \@@_CodeAfter:n \cs_set_eq:NN \diagbox \@@_diagbox:nn \bool_if:NT \l_@@_colortbl_like_bool \@@_colortbl_like: @@ -6542,7 +6722,7 @@ version 2005/12/01 or later. % % \medskip % \begin{macrocode} - \tl_gclear_new:N \g_@@_code_before_tl + \tl_gclear_new:N \g_nicematrix_code_before_tl } % \end{macrocode} % This is the end of |\@@_pre_array:|. @@ -6575,7 +6755,7 @@ version 2005/12/01 or later. \bool_set_true:N \l_@@_in_env_bool % \end{macrocode} % The command |\CT@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@arc@| but +% array\footnote{e.g. |\color[rgb]{0.5,0.5,0}|}. This command is used by |\CT@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 @@ -6605,20 +6785,14 @@ version 2005/12/01 or later. % \end{macrocode} % % -% We do a redefinition of |\@arrayrule| because we want that the vertical rules -% drawn by "|" in the preamble of the array don't extend in the potential -% exterior rows. -% \begin{macrocode} - \cs_set_protected:Npn \@arrayrule { \@addtopreamble \@@_vline: } -% \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. Of course, this is redundant but % it's for efficiency. % \begin{macrocode} - \seq_clear:N \g_@@_blocks_seq - \seq_clear:N \g_@@_pos_of_blocks_seq + \seq_gclear:N \g_@@_blocks_seq + \seq_gclear:N \g_@@_pos_of_blocks_seq + \seq_gclear:N \g_@@_pos_of_xdots_seq % \end{macrocode} % In fact, the sequence |\g_@@_pos_of_blocks_seq| will also contain the % positions of the cells with a |\diagbox|. @@ -7217,7 +7391,6 @@ version 2005/12/01 or later. l { \@@_patch_preamble_i:n #1 } r { \@@_patch_preamble_i:n #1 } > { \@@_patch_preamble_ii:nn #1 } - < { \@@_patch_preamble_ii:nn #1 } ! { \@@_patch_preamble_ii:nn #1 } @ { \@@_patch_preamble_ii:nn #1 } | { \@@_patch_preamble_iii:n #1 } @@ -7247,17 +7420,14 @@ version 2005/12/01 or later. % We increment the counter of columns. % \begin{macrocode} \int_gincr:N \c@jCol - \bool_if:NT \l_@@_vlines_bool - { - \tl_gput_right:Nn \g_@@_preamble_tl - { ! { \skip_horizontal:N \arrayrulewidth } } - } - \@@_patch_preamble:n + \@@_patch_preamble_viii:n } % \end{macrocode} % +% +% % \medskip -% For |>|, |<|, |!| and |@| +% For |>|, |!| and |@| % \begin{macrocode} \cs_new_protected:Npn \@@_patch_preamble_ii:nn #1 #2 { @@ -7301,7 +7471,7 @@ version 2005/12/01 or later. } } \tl_gput_right:Nx \g_@@_internal_code_after_tl - { \@@_vline:nn { \int_use:N \c@jCol } { \int_use:N \l_tmpa_int } } + { \@@_vline:nn { \@@_succ:n \c@jCol } { \int_use:N \l_tmpa_int } } \int_zero:N \l_tmpa_int \@@_patch_preamble:n #1 } @@ -7329,7 +7499,7 @@ version 2005/12/01 or later. % We increment the counter of columns. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble:n + \@@_patch_preamble_viii:n } % \end{macrocode} % @@ -7356,7 +7526,7 @@ version 2005/12/01 or later. % We increment the counter of columns. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble:n + \@@_patch_preamble_viii:n } % \end{macrocode} % @@ -7371,22 +7541,13 @@ version 2005/12/01 or later. % We increment the counter of columns. % \begin{macrocode} \int_gincr:N \c@jCol - \bool_if:NT \l_@@_vlines_bool - { - \tl_gput_right:Nn \g_@@_preamble_tl - { ! { \skip_horizontal:N \arrayrulewidth } } - } - \@@_patch_preamble:n + \@@_patch_preamble_viii:n } % \end{macrocode} % % \begin{macrocode} \cs_new_protected:Npn \@@_patch_preamble_vii:n #1 { -% \end{macrocode} -% Here, we have a problem in the cases of the use in the first column or the ``last -% one''. -% \begin{macrocode} \tl_gput_right:Nn \g_@@_preamble_tl { ! { \skip_horizontal:N 2\l_@@_radius_dim } } % \end{macrocode} @@ -7399,6 +7560,33 @@ version 2005/12/01 or later. } % \end{macrocode} % +% 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. +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_preamble_viii:n #1 + { + \str_if_eq:nnTF { #1 } { < } + \@@_patch_preamble_ix:n + { + \bool_if:NT \l_@@_vlines_bool + { + \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_ix:n #1 + { + \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } } + \@@_patch_preamble_viii:n + } +% \end{macrocode} +% % % \bigskip % The command |\@@_put_box_in_flow:| puts the box |\l_tmpa_box| (which contains @@ -7425,21 +7613,6 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_put_box_in_flow_i: { - \str_case:VnF \l_@@_baseline_str - { - { t } { \int_set:Nn \l_tmpa_int 1 } - { b } { \int_set_eq:NN \l_tmpa_int \c@iRow } - } - { \int_set:Nn \l_tmpa_int \l_@@_baseline_str } - \bool_if:nT - { - \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 - } \pgfpicture \@@_qpoint:n { row - 1 } \dim_gset_eq:NN \g_tmpa_dim \pgf@y @@ -7450,12 +7623,38 @@ version 2005/12/01 or later. % Now, |\g_tmpa_dim| contains the $y$-value of the center of the array (the % delimiters are centered in relation with this value). % \begin{macrocode} - \@@_qpoint:n { row - \int_use:N \l_tmpa_int - base } - \dim_gsub:Nn \g_tmpa_dim \pgf@y + \str_if_in:NnTF \l_@@_baseline_str { line- } + { + \int_set:Nn \l_tmpa_int + { + \str_range:Nnn + \l_@@_baseline_str + 6 + { \str_count:N \l_@@_baseline_str } + } + \@@_qpoint:n { row - \int_use:N \l_tmpa_int } + } + { + \str_case:VnF \l_@@_baseline_str + { + { t } { \int_set:Nn \l_tmpa_int 1 } + { b } { \int_set_eq:NN \l_tmpa_int \c@iRow } + } + { \int_set:Nn \l_tmpa_int \l_@@_baseline_str } + \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 { \fontdimen22 \textfont2 } + } + \dim_gsub:Nn \g_tmpa_dim \pgf@y % \end{macrocode} % Now, |\g_tmpa_dim| contains the value of the $y$ translation we have to to. % \begin{macrocode} @@ -7561,7 +7760,7 @@ version 2005/12/01 or later. % We convert a value of |t| to a value of |1|. % \begin{macrocode} \str_if_eq:VnT \l_@@_baseline_str { t } - { \str_set:Nn \l_@@_baseline_str { 1 } } + { \tl_set:Nn \l_@@_baseline_str { 1 } } % \end{macrocode} % Now, we convert the value of |\l_@@_baseline_str| (which should represent an % integer) to an integer stored in |\l_tmpa_int|. @@ -8173,7 +8372,7 @@ version 2005/12/01 or later. \str_gset:Nn \g_@@_name_env_str { #1 NiceMatrix } \tl_set:Nn \l_@@_type_of_col_tl c \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 } - \exp_args:Nnx \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl + \exp_args:Nne \@@_begin_of_NiceMatrix:nn { #1 } \l_@@_type_of_col_tl } { \use:c { end #1 NiceArray } } } @@ -8317,6 +8516,13 @@ version 2005/12/01 or later. \int_use:N \g_@@_col_total_int } +% \end{macrocode} +% We write also the potential content of |\g_@@_pos_of_blocks_seq| (it will be +% useful if the commands |\rowcolors| is used with the key |respect-blocks|. +% \begin{macrocode} + \seq_gset_from_clist:cn + { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq } + { \seq_use:Nnnn \g_@@_pos_of_blocks_seq , , , } } \iow_now:Nn \@mainaux \ExplSyntaxOff } @@ -8385,29 +8591,54 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% Now, we actually draw the dotted lines. +% 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 will do nothing. % \begin{macrocode} - \bool_if:NTF \l_@@_hvlines_bool - \@@_draw_hvlines: - { - \bool_if:NT \l_@@_hlines_bool \@@_draw_hlines: - \bool_if:NT \l_@@_vlines_bool \@@_draw_vlines: - \bool_if:NT \l_@@_hvlines_except_corners_bool - \@@_draw_hvlines_except_corners: - } + \@@_compute_corners: % \end{macrocode} -% -% We have to revert to a clean version of |\ialign| because there may be -% tabulars in the |\Block| instructions that will be composed now. +% +% \bigskip +% The following code is only for efficiency. We determine whether the potential +% horizontal and vertical rules are ``complete'', that is to say drawn in the +% whole array. We are sure that all the rules will be complete when there is no +% block, no virtual block (determined by a command such as |\Cdots|, |\Vdots|, +% etc.) and no corners. In that case, we switch to a shortcut version of +% |\@@_vline_i:nn| and |\@@_hline:nn|. % \begin{macrocode} - \cs_set_eq:NN \ialign \@@_old_ialign: - \seq_if_empty:NF \g_@@_blocks_seq \@@_draw_blocks: + % \bool_lazy_all:nT + % { + % { \seq_if_empty_p:N \g_@@_pos_of_blocks_seq } + % { \seq_if_empty_p:N \g_@@_pos_of_xdots_seq } + % { \seq_if_empty_p:N \l_@@_empty_corner_cells_seq } + % } + % { + % \cs_set_eq:NN \@@_vline_i:nn \@@_vline_i_complete:nn + % \cs_set_eq:NN \@@_hline_i:nn \@@_hline_i_complete:nn + % } + \bool_if:NT \l_@@_hlines_bool \@@_draw_hlines: + \bool_if:NT \l_@@_vlines_bool \@@_draw_vlines: \g_@@_internal_code_after_tl \tl_gclear:N \g_@@_internal_code_after_tl +% \end{macrocode} +% +% \bigskip +% We draw the blocks. 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_set_eq:NN \ialign \@@_old_ialign: + \seq_if_empty:NF \g_@@_blocks_seq \@@_draw_blocks: +% \end{macrocode} +% +% \bigskip +% Now, the |code-after|. +% \begin{macrocode} \bool_if:NT \c_@@_tikz_loaded_bool { \tikzset @@ -8438,17 +8669,17 @@ version 2005/12/01 or later. % % % \medskip -% |\g_@@_code_before_tl| is for instructions in the cells of the array such as +% |\g_nicematrix_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_@@_code_before_tl + \tl_if_empty:NF \g_nicematrix_code_before_tl { % \end{macrocode} % The command |\rowcolor| in tabular will in fact use |\rectanglecolor| in order % to follow the behaviour of |\rowcolor| of \pkg{colortbl}. That's why there may -% be a command |\rectanglecolor| in |\g_@@_code_before_tl|. In order to avoid an +% be a command |\rectanglecolor| in |\g_nicematrix_code_before_tl|. In order to avoid an % error during the expansion, we define a protected version of |\rectanglecolor|. % \begin{macrocode} \cs_set_protected:Npn \rectanglecolor { } @@ -8458,7 +8689,7 @@ version 2005/12/01 or later. { \tl_gset:cn { g_@@_code_before_ \int_use:N \g_@@_env_int _ tl } - { \g_@@_code_before_tl } + { \g_nicematrix_code_before_tl } } \iow_now:Nn \@mainaux \ExplSyntaxOff \bool_set_true:N \l_@@_code_before_bool @@ -8751,19 +8982,16 @@ version 2005/12/01 or later. } } % \end{macrocode} -% If the key |hvlines| is used, 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. +% 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} - \bool_if:NT \l_@@_hvlines_bool - { - \seq_gput_right:Nx \g_@@_pos_of_xdots_seq - { - { \int_use:N \l_@@_initial_i_int } - { \int_use:N \l_@@_initial_j_int } - { \int_use:N \l_@@_final_i_int } - { \int_use:N \l_@@_final_j_int } - } + \seq_gput_right:Nx \g_@@_pos_of_xdots_seq + { + { \int_use:N \l_@@_initial_i_int } + { \int_use:N \l_@@_initial_j_int } + { \int_use:N \l_@@_final_i_int } + { \int_use:N \l_@@_final_j_int } } } % \end{macrocode} @@ -9700,11 +9928,22 @@ version 2005/12/01 or later. % since |\tl_lower_case:n| seems to be deprecated. % \begin{macrocode} { - > \@@_Cell: - \bool_if:NT \c_@@_define_L_C_R_bool \tl_lower_case:n - #2 - < \@@_end_Cell: - } + \exp_args:Ne \str_case:nn { \tl_lower_case:n { #2 } } + { + l { > \@@_Cell: l < \@@_end_Cell: } + r { > \@@_Cell: r < \@@_end_Cell: } + c { > \@@_Cell: c < \@@_end_Cell: } + { l | } { > \@@_Cell: l < \@@_end_Cell: | } + { r | } { > \@@_Cell: r < \@@_end_Cell: | } + { c | } { > \@@_Cell: c < \@@_end_Cell: | } + { | l } { | > \@@_Cell: l < \@@_end_Cell: } + { | r } { | > \@@_Cell: r < \@@_end_Cell: } + { | c } { | > \@@_Cell: c < \@@_end_Cell: } + { | l | } { | > \@@_Cell: l < \@@_end_Cell: | } + { | r | } { | > \@@_Cell: r < \@@_end_Cell: | } + { | c | } { | > \@@_Cell: c < \@@_end_Cell: | } + } + } { #3 } % \end{macrocode} % The |\peek_remove_spaces:n| is mandatory. @@ -9990,7 +10229,7 @@ version 2005/12/01 or later. \vbox_to_zero:n { } % \end{macrocode} % |0.8 ex| will be the distance between the principal part of the array and our -% element (which is composed with |\rotate|. +% element (which is composed with |\rotate|). % \begin{macrocode} \skip_vertical:n { - \box_ht:N \@arstrutbox + 0.8 ex } \box_use:N \l_@@_cell_box @@ -10033,7 +10272,7 @@ version 2005/12/01 or later. \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:x + \use:e { \@@_line_i:nn { \@@_double_int_eval:n #2 \q_stop } @@ -10295,17 +10534,127 @@ version 2005/12/01 or later. % 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}. +% optional argument of the command |\rowcolors| of \pkg{xcolor}. Here is an +% example: |\rowcolors{1}{blue!10}{}[respect-blocks]|. +% +% The last optional argument is for options. As of now, there is only one key +% available : |respect-blocks|. +% +% \begin{macrocode} +\keys_define:nn { NiceMatrix / rowcolors } + { + respect-blocks .bool_set:N = \l_@@_respect_blocks_bool , + respect-blocks .default:n = true , + unknown .code:n = \@@_error:n { Unknown~option~for~rowcolors } + } +% \end{macrocode} +% % \begin{macrocode} -\NewDocumentCommand \@@_rowcolors { O { } m m m } +\NewDocumentCommand \@@_rowcolors { O { } m m m O { } } { - \int_step_inline:nnn { #2 } { \int_use:N \c@iRow } + \keys_set:nn { NiceMatrix / rowcolors } { #5 } + \bool_lazy_and:nnTF + \l_@@_respect_blocks_bool + { \cs_if_exist_p:c { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq } } + { \@@_rowcolors_i:nnnn { #1 } { #2 } { #3 } { #4 } } { - \int_if_odd:nTF { ##1 } - { \@@_rowcolor [ #1 ] { #3 } } - { \@@_rowcolor [ #1 ] { #4 } } - { ##1 } - } + \int_step_inline:nnn { #2 } { \int_use:N \c@iRow } + { + \int_if_odd:nTF { ##1 } + { \@@_rowcolor [ #1 ] { #3 } } + { \@@_rowcolor [ #1 ] { #4 } } + { ##1 } + } + } + } +% \end{macrocode} +% +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_rowcolors_i:nnnn #1 #2 #3 #4 + { + \seq_set_eq:Nc \l_tmpb_seq + { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq } +% \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''. +% \begin{macrocode} + \seq_set_filter:NNn \l_tmpa_seq \l_tmpb_seq + { \@@_not_in_exterior_p:nnnn ##1 } +% \end{macrocode} +% The counter |\l_tmpa_int| will be the index of the loop. +% \begin{macrocode} + \int_set:Nn \l_tmpa_int { #2 } +% \end{macrocode} +% The boolean |\l_tmpa_bool| will indicate whereas we are in a row of the first +% color or of the second color. +% \begin{macrocode} + \bool_set_false:N \l_tmpa_bool +% \end{macrocode} +% We recall that, in the |code-before|, |\c@iRow| is the total number of rows of +% the array (excepted the potential exterior rows). +% \begin{macrocode} + \int_do_until:nNnn \l_tmpa_int > \c@iRow + { + \seq_set_filter:NNn \l_tmpb_seq \l_tmpa_seq + { \@@_intersect_our_row_p:nnnn ##1 } +% \end{macrocode} +% We compute in |\l_tmpb_int| the last row covered by a block. +% \begin{macrocode} + \int_set_eq:NN \l_tmpb_int \l_tmpa_int + \seq_map_inline:Nn \l_tmpb_seq { \@@_rowcolors_ii:nnnn ##1 } + \bool_if:NTF \l_tmpa_bool + { + \@@_rowcolor [ #1 ] { #4 } + { \int_use:N \l_tmpa_int - \int_use:N \l_tmpb_int } + \bool_set_false:N \l_tmpa_bool + } + { + \@@_rowcolor [ #1 ] { #3 } + { \int_use:N \l_tmpa_int - \int_use:N \l_tmpb_int } + \bool_set_true:N \l_tmpa_bool + } + \int_set:Nn \l_tmpa_int { \l_tmpb_int + 1 } + } + } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} +\cs_new_protected:Npn \@@_rowcolors_ii:nnnn #1 #2 #3 #4 + { + \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:nnnn p + { + \bool_lazy_or:nnTF + { \int_compare_p:nNn { #4 } = \c_zero_int } + { \int_compare_p:nNn { #2 } = { \@@_succ:n { \c@jCol } } } + \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:nnnn 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} % @@ -10332,7 +10681,7 @@ version 2005/12/01 or later. % \begin{macrocode} \NewDocumentCommand \@@_cellcolor_tabular { O { } m } { - \tl_gput_right:Nx \g_@@_code_before_tl + \tl_gput_right:Nx \g_nicematrix_code_before_tl { \cellcolor [ #1 ] { #2 } { \int_use:N \c@iRow - \int_use:N \c@jCol } } } % \end{macrocode} @@ -10343,7 +10692,7 @@ version 2005/12/01 or later. % \begin{macrocode} \NewDocumentCommand \@@_rowcolor_tabular { O { } m } { - \tl_gput_right:Nx \g_@@_code_before_tl + \tl_gput_right:Nx \g_nicematrix_code_before_tl { \exp_not:N \rectanglecolor [ #1 ] { #2 } { \int_use:N \c@iRow - \int_use:N \c@jCol } @@ -10362,7 +10711,7 @@ version 2005/12/01 or later. % 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). % \begin{macrocode} - \tl_gput_left:Nx \g_@@_code_before_tl + \tl_gput_left:Nx \g_nicematrix_code_before_tl { \exp_not:N \columncolor [ #1 ] { #2 } { \int_use:N \c@jCol } } } } @@ -10424,45 +10773,118 @@ version 2005/12/01 or later. % |\l_@@_last_row_int| may be equal to $-2$ or $-1$ (we can't write % |\int_compare:nNnT \c@iRow < \l_@@_last_row_int|). % -% -% % % \bigskip -% The following command will be executed in the |internal-code-after|. |#1| is -% the number the column where to draw the rule and |#2| is the number of -% consecutive occurrences of \verb+|+. +% The following command will be executed in the |internal-code-after|. The rule +% will be drawn \emph{before} the column |#1|. |#2| is the number of consecutive +% occurrences of \verb+|+. % \begin{macrocode} \cs_new_protected:Npn \@@_vline:nn #1 #2 { - \bool_if:NTF \c_@@_tikz_loaded_bool - { - \tikzpicture - \@@_vline_i:nn { #1 } { #2 } - \endtikzpicture - } +% \end{macrocode} +% The following test is for the case where the user don't 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 { #1 } < { \c@jCol + 2 } { \pgfpicture - \@@_vline_i:nn { #1 } { #2 } + \@@_vline_i:nn { #1 } { #2 } \endpgfpicture } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_vline_i:nn #1 #2 +\cs_new_protected:Npn \@@_vline_i:nn #1 #2 + { +% \end{macrocode} +% |\l_tmpa_tl| is the number of row and |\l_tmpb_tl| the number of column. +% \begin{macrocode} + \tl_set:Nx \l_tmpb_tl { #1 } + \int_step_variable:nNn \c@iRow \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_if_vline_in_block:nnnn ##1 } + \seq_map_inline:Nn \g_@@_pos_of_xdots_seq + { \@@_test_if_vline_in_block:nnnn ##1 } + \clist_if_empty:NF \l_@@_except_corners_clist + \@@_test_in_corner_v: + \bool_if:NT \g_tmpa_bool + { \@@_vline_ii:nnnn { #1 } { #2 } \l_tmpa_tl \l_tmpa_tl } + } + } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} +\cs_new_protected:Npn \@@_test_in_corner_v: + { + \int_compare:nNnTF \l_tmpb_tl = { \@@_succ:n \c@jCol } + { + \seq_if_in:NxT + \l_@@_empty_corner_cells_seq + { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl } + { \bool_set_false:N \g_tmpa_bool } + } + { + \seq_if_in:NxT + \l_@@_empty_corner_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_@@_empty_corner_cells_seq + { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl } + { \bool_set_false:N \g_tmpa_bool } + } + } + } + } +% \end{macrocode} +% +% \bigskip +% |#1| is the number of the column; |#2| is the number of vertical rules to +% draw (with potentially a color between); |#3| and |#4| are the number of the +% rows between which the rule has to be drawn. +% \begin{macrocode} +\cs_new_protected:Npn \@@_vline_ii:nnnn #1 #2 #3 #4 { - \CT@arc@ \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse - \pgfsetlinewidth { 1.1 \arrayrulewidth } - \pgfsetrectcap - \@@_qpoint:n { row - 1 } + \@@_qpoint:n { row - #3 } \dim_set_eq:NN \l_tmpa_dim \pgf@y - \@@_qpoint:n { col - \int_eval:n { #1 + 1 } } + \@@_qpoint:n { col - #1 } \dim_set_eq:NN \l_tmpb_dim \pgf@x - \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } - \@@_qpoint:n { row - \@@_succ:n \c@iRow } + \@@_qpoint:n { row - \@@_succ:n { #4 } } \dim_set_eq:NN \l_tmpc_dim \pgf@y + \bool_lazy_and:nnT + { \int_compare_p:nNn { #2 } > 1 } + { ! \tl_if_blank_p:V \CT@drsc@ } + { + \group_begin: + \CT@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 ) * ( #2 - 1 ) } + \pgfpathrectanglecorners + { \pgfpoint \l_tmpb_dim \l_tmpa_dim } + { \pgfpoint \l_tmpd_dim \l_tmpc_dim } + \pgfusepathqfill + \group_end: + } + \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim } \prg_replicate:nn { #2 - 1 } { @@ -10471,268 +10893,215 @@ version 2005/12/01 or later. \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim } } + \CT@arc@ + \pgfsetlinewidth { 1.1 \arrayrulewidth } + \pgfsetrectcap \pgfusepathqstroke } % \end{macrocode} % % \bigskip -% The command |\@@_draw_vlines| will be executed when the user uses the option -% |vlines| (which draws all the vlines of the array). +% The following draws a complete vertical rule in the column |#1| (|#2| is the +% number of consecutive rules specified by the number of \verb+|+ in the +% preamble). This command will be used if there is no block in the array (and +% the key |except-corners| is not used). % \begin{macrocode} -\cs_new_protected:Npn \@@_draw_vlines: - { - \group_begin: +\cs_new_protected:Npn \@@_vline_i_complete:nn #1 #2 + { \@@_vline_ii:nnnn { #1 } { #2 } 1 { \int_use:N \c@iRow } } % \end{macrocode} % -% The command |\CT@arc@| is a command of \pkg{colortbl} which sets the color of -% the rules in the array. The package \pkg{nicematrix} uses it even when -% \pkg{colortbl} is not loaded. -% \begin{macrocode} - \CT@arc@ - \pgfpicture - \pgfrememberpicturepositiononpagetrue - \pgf@relevantforpicturesizefalse - \pgfsetlinewidth \arrayrulewidth - \pgfsetrectcap - \@@_qpoint:n { row - 1 } - \dim_set_eq:NN \l_tmpa_dim \pgf@y - \@@_qpoint:n { row - \@@_succ:n \c@iRow } - \dim_set_eq:NN \l_tmpb_dim \pgf@y -% \end{macrocode} -% -% Now, we can draw the vertical rules with a loop. +% \bigskip +% The command |\@@_draw_hlines:| 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 |except-corners| is used). % \begin{macrocode} +\cs_new_protected:Npn \@@_draw_vlines: + { \int_step_inline:nnn - { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } - { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } - { - \@@_qpoint:n { col - ##1 } - \dim_set_eq:NN \l_tmpc_dim \pgf@x - \pgfpathmoveto { \pgfpoint \l_tmpc_dim \l_tmpa_dim } - \pgfpathlineto { \pgfpoint \l_tmpc_dim \l_tmpb_dim } - } - \pgfusepathqstroke - \endpgfpicture - \group_end: + { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } + { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } + { \@@_vline:nn { ##1 } 1 } } % \end{macrocode} % % -% \subsection*{The key hvlines} -% -% \subsubsection*{The key hvlines} +% +% \subsection*{The horizontal rules} % +% \bigskip +% The following command will be executed in the |internal-code-after|. The row +% will be drawn \emph{before} the row |#1|. |#2| is the number of consecutive +% occurrences of |\Hline|. % \begin{macrocode} -\cs_new_protected:Npn \@@_draw_hlines: +\cs_new_protected:Npn \@@_hline:nn #1 #2 { \pgfpicture - \CT@arc@ - \pgfrememberpicturepositiononpagetrue - \pgf@relevantforpicturesizefalse - \pgfsetlinewidth \arrayrulewidth - \int_step_inline:nnn - { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } - { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow } - { - \@@_qpoint:n { row - ##1 } - \dim_set_eq:NN \l_tmpa_dim \pgf@y - \pgfpathmoveto { \pgfpoint \pgf@x \pgf@y } - \@@_qpoint:n { col - \@@_succ:n { \c@jCol } } - \dim_set:Nn \l_tmpb_dim { \pgf@x + 0.5 \arrayrulewidth } - \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } - } - \pgfusepathqstroke + \@@_hline_i:nn { #1 } { #2 } \endpgfpicture } % \end{macrocode} -% -% \bigskip -% Since version 4.1, the key |hvlines| is no longer a mere alias for -% the conjonction of |hlines| and |vlines|. Indeed, with |hvlines|, the vertical -% and horizontal rules are \emph{not} drawn within the blocks (created by -% |\Block|) nor within the ``virtual blocks'' (corresponding to the dotted lines -% drawn by |\Cdots|, |\Vdots|, etc.). -% \begin{macrocode} -\cs_new_protected:Npn \@@_draw_hvlines: - { - \bool_lazy_and:nnTF - { \seq_if_empty_p:N \g_@@_pos_of_blocks_seq } - { \seq_if_empty_p:N \g_@@_pos_of_xdots_seq } - \@@_draw_hvlines_i: - \@@_draw_hvlines_ii: - } -% \end{macrocode} % -% \bigskip -% This version is only for efficiency. The general case (in -% |\@@_draw_hvlines_ii:|) does the job in all case (but slower). % \begin{macrocode} -\cs_new_protected:Npn \@@_draw_hvlines_i: +\cs_new_protected:Npn \@@_hline_i:nn #1 #2 { - \@@_draw_hlines: - \@@_draw_vlines: - } % \end{macrocode} -% -% \bigskip -% Now, the general case, where there are blocks or dots in the array. +% |\l_tmpa_tl| is the number of row and |\l_tmpb_tl| the number of column. % \begin{macrocode} -\cs_new_protected:Npn \@@_draw_hvlines_ii: - { - \group_begin: - \CT@arc@ -% \end{macrocode} -% -% The horizontal rules. -% \begin{macrocode} - \int_step_variable:nnNn - { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } - { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow } - \l_tmpa_tl + \tl_set:Nn \l_tmpa_tl { #1 } + \int_step_variable:nNn \c@jCol \l_tmpb_tl { - \int_step_variable:nNn \c@jCol \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. +% 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_if_hline_in_block:nnnn ##1 } - \seq_map_inline:Nn \g_@@_pos_of_xdots_seq - { \@@_test_if_hline_in_block:nnnn ##1 } + \bool_gset_true:N \g_tmpa_bool + \seq_map_inline:Nn \g_@@_pos_of_blocks_seq + { \@@_test_if_hline_in_block:nnnn ##1 } + \seq_map_inline:Nn \g_@@_pos_of_xdots_seq + { \@@_test_if_hline_in_block:nnnn ##1 } + \clist_if_empty:NF \l_@@_except_corners_clist \@@_test_in_corner_h: + \bool_if:NT \g_tmpa_bool + { \@@_hline_ii:nnnn { #1 } { #2 } \l_tmpb_tl \l_tmpb_tl } + } + } % \end{macrocode} +% +% \bigskip % \begin{macrocode} - \bool_if:NT \l_@@_hvlines_except_corners_bool - { - \int_compare:nNnTF \l_tmpa_tl = { \c@iRow + 1 } - { - \seq_if_in:NxT - \l_@@_empty_corner_cells_seq - { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl } - { \bool_set_false:N \g_tmpa_bool } - } - { - \seq_if_in:NxT - \l_@@_empty_corner_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_@@_empty_corner_cells_seq - { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl } - { \bool_set_false:N \g_tmpa_bool } - } - } - } - } +\cs_new_protected:Npn \@@_test_in_corner_h: + { + \int_compare:nNnTF \l_tmpa_tl = { \@@_succ:n \c@iRow } + { + \seq_if_in:NxT + \l_@@_empty_corner_cells_seq + { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl } + { \bool_set_false:N \g_tmpa_bool } + } + { + \seq_if_in:NxT + \l_@@_empty_corner_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_@@_empty_corner_cells_seq + { \@@_pred:n \l_tmpa_tl - \l_tmpb_tl } + { \bool_set_false:N \g_tmpa_bool } + } + } + } + } % \end{macrocode} +% +% \bigskip +% |#1| is the number of the row; |#2| is the number of horizontal rules to +% draw (with potentially a color between); |#3| and |#4| are the number of the +% columns between which the rule has to be drawn. % \begin{macrocode} - \bool_if:NT \g_tmpa_bool - { - \pgfpicture - \pgfrememberpicturepositiononpagetrue - \pgf@relevantforpicturesizefalse - \pgfsetlinewidth \arrayrulewidth - \pgfsetrectcap - \@@_qpoint:n { row - \l_tmpa_tl } - \dim_set_eq:NN \l_tmpb_dim \pgf@y - \@@_qpoint:n { col - \l_tmpb_tl } - \dim_set_eq:NN \l_tmpa_dim \pgf@x - \@@_qpoint:n { col - \@@_succ:n \l_tmpb_tl } - \dim_set_eq:NN \l_tmpc_dim \pgf@x - \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim } - \pgfpathlineto { \pgfpoint \l_tmpc_dim \l_tmpb_dim } - \pgfusepathqstroke - \endpgfpicture - } - } +\cs_new_protected:Npn \@@_hline_ii:nnnn #1 #2 #3 #4 + { + \pgfrememberpicturepositiononpagetrue + \pgf@relevantforpicturesizefalse + \@@_qpoint:n { col - #3 } + \dim_set_eq:NN \l_tmpa_dim \pgf@x + \@@_qpoint:n { row - #1 } + \dim_set_eq:NN \l_tmpb_dim \pgf@y + \@@_qpoint:n { col - \@@_succ:n { #4 } } + \dim_set_eq:NN \l_tmpc_dim \pgf@x + \bool_lazy_and:nnT + { \int_compare_p:nNn { #2 } > 1 } + { ! \tl_if_blank_p:V \CT@drsc@ } + { + \group_begin: + \CT@drsc@ + \dim_set:Nn \l_tmpd_dim + { \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth ) * ( #2 - 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 { #2 - 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@arc@ + \pgfsetlinewidth { 1.1 \arrayrulewidth } + \pgfsetrectcap + \pgfusepathqstroke + } % \end{macrocode} -% Now, the vertical rules. +% +% \bigskip % \begin{macrocode} - \int_step_variable:nNn \c@iRow \l_tmpa_tl - { - \int_step_variable:nnNn - { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } - { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } - \l_tmpb_tl - { +\cs_new_protected:Npn \@@_hline_i_complete:nn #1 #2 + { \@@_hline_ii:nnnn #1 #2 1 { \int_use:N \c@jCol } } % \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. +% +% \bigskip +% The command |\@@_draw_hlines:| draws all the horizontal rules excepted in the +% blocks (even the virtual drawn determined by commands such as |\Cdots| and in +% the corners (if the key |except-corners| is used). % \begin{macrocode} - \bool_gset_true:N \g_tmpa_bool - \seq_map_inline:Nn \g_@@_pos_of_blocks_seq - { \@@_test_if_vline_in_block:nnnn ##1 } - \seq_map_inline:Nn \g_@@_pos_of_xdots_seq - { \@@_test_if_vline_in_block:nnnn ##1 } +\cs_new_protected:Npn \@@_draw_hlines: + { + \int_step_inline:nnn + { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } + { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow } + { \@@_hline:nn { ##1 } 1 } + } % \end{macrocode} % +% +% \medskip +% The command |\@@_Hline:| will be linked to |\Hline| in the environments of \pkg{nicematrix}. % \begin{macrocode} - \bool_if:NT \l_@@_hvlines_except_corners_bool - { - \int_compare:nNnTF \l_tmpb_tl = { \@@_succ:n \c@jCol } - { - \seq_if_in:NxT - \l_@@_empty_corner_cells_seq - { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl } - { \bool_set_false:N \g_tmpa_bool } - } - { - \seq_if_in:NxT - \l_@@_empty_corner_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_@@_empty_corner_cells_seq - { \l_tmpa_tl - \@@_pred:n \l_tmpb_tl } - { \bool_set_false:N \g_tmpa_bool } - } - } - } - } +\cs_set:Npn \@@_Hline: { \noalign { \ifnum 0 = `} \fi \@@_Hline_i:n { 1 } } % \end{macrocode} -% +% +% \medskip +% The argument of the command |\@@_Hline_i:n| is the number of successive +% |\Hline| found. % \begin{macrocode} - \bool_if:NT \g_tmpa_bool - { - \pgfpicture - \pgfrememberpicturepositiononpagetrue - \pgf@relevantforpicturesizefalse - \pgfsetlinewidth \arrayrulewidth - \pgfsetrectcap - \@@_qpoint:n { row - \l_tmpa_tl } - \dim_set_eq:NN \l_tmpb_dim \pgf@y - \@@_qpoint:n { col - \l_tmpb_tl } - \dim_set_eq:NN \l_tmpa_dim \pgf@x - \@@_qpoint:n { row - \@@_succ:n \l_tmpa_tl } - \dim_set_eq:NN \l_tmpc_dim \pgf@y - \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim } - \pgfpathlineto { \pgfpoint \l_tmpa_dim \l_tmpc_dim } - \pgfusepathqstroke - \endpgfpicture - } - } - } +\cs_set:Npn \@@_Hline_i:n #1 + { + \peek_meaning_ignore_spaces:NTF \Hline + { \@@_Hline_ii:nn { #1 + 1 } } + { \@@_Hline_iii:n { #1 } } + } % \end{macrocode} -% The group was for the color of the rules. +% % \begin{macrocode} - \group_end: - \seq_gclear:N \g_@@_pos_of_xdots_seq +\cs_set:Npn \@@_Hline_ii:nn #1 #2 { \@@_Hline_i:n { #1 } } +% \end{macrocode} +% +% \begin{macrocode} +\cs_set:Npn \@@_Hline_iii:n #1 + { + \skip_vertical:n + { + \arrayrulewidth * ( #1 ) + + \doublerulesep * ( \int_max:nn 0 { #1 - 1 } ) + } + \tl_gput_right:Nx \g_@@_internal_code_after_tl + { \@@_hline:nn { \@@_succ:n { \c@iRow } } { #1 } } + \ifnum 0 = `{ \fi } } % \end{macrocode} +% +% \subsection*{The key hvlines} +% % % The following command tests wether the current position in the array (given by % |\l_tmpa_tl| for the row and |\l_tmpb_tl| for the col) would provide an @@ -10770,25 +11139,39 @@ version 2005/12/01 or later. % % % \bigskip -% \subsubsection*{The key hvlines-except-corners} +% \subsubsection*{The key except-corners} % +% When the key |except-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 \@@_draw_hvlines_except_corners: +\cs_new_protected:Npn \@@_compute_corners: { % \end{macrocode} % The sequence |\l_@@_empty_corner_cells_seq| will be the sequence of all the -% cells empty (and not in a block) considered in the corners of the array. +% empty cells (and not in a block) considered in the corners of the array. % \begin{macrocode} \seq_clear_new:N \l_@@_empty_corner_cells_seq - \@@_compute_a_corner:nnnnnn 1 1 1 1 \c@iRow \c@jCol - \@@_compute_a_corner:nnnnnn 1 \c@jCol 1 { -1 } \c@iRow 1 - \@@_compute_a_corner:nnnnnn \c@iRow 1 { -1 } 1 1 \c@jCol - \@@_compute_a_corner:nnnnnn \c@iRow \c@jCol { -1 } { -1 } 1 1 - \@@_draw_hvlines_ii: + \clist_map_inline:Nn \l_@@_except_corners_clist + { + \str_case:nnF { ##1 } + { + { NW } + { \@@_compute_a_corner:nnnnnn 1 1 1 1 \c@iRow \c@jCol } + { NE } + { \@@_compute_a_corner:nnnnnn 1 \c@jCol 1 { -1 } \c@iRow 1 } + { SW } + { \@@_compute_a_corner:nnnnnn \c@iRow 1 { -1 } 1 1 \c@jCol } + { SE } + { \@@_compute_a_corner:nnnnnn \c@iRow \c@jCol { -1 } { -1 } 1 1 } + } + { \@@_error:nn { bad~corner } { ##1 } } + } } % \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 @@ -10798,11 +11181,11 @@ version 2005/12/01 or later. % 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 step in rows and the step in columns when moving -% from the corner ; +% 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 ; +% corner; % \item |#6| is the number of the final column when scanning the columns from % the corner. % \end{itemize} @@ -10818,17 +11201,17 @@ version 2005/12/01 or later. % |\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_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_if:nTF + \bool_lazy_or:nnTF { \cs_if_exist_p:c { pgf @ sh @ ns @ \@@_env: - ##1 - \int_eval:n { #2 } } - || - \l_tmpb_bool } + \l_tmpb_bool { \bool_set_true:N \l_tmpa_bool } { \bool_if:NF \l_tmpa_bool @@ -10839,15 +11222,16 @@ version 2005/12/01 or later. % 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_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_if:nTF + \bool_lazy_or:nnTF + \l_tmpb_bool { \cs_if_exist_p:c { pgf @ sh @ ns @ \@@_env: - \int_eval:n { #1 } - ##1 } - || \l_tmpb_bool } { \bool_set_true:N \l_tmpa_bool } { @@ -10867,11 +11251,11 @@ version 2005/12/01 or later. \int_step_inline:nnnn { #2 } { #4 } \l_@@_last_empty_column_int { \@@_test_if_cell_in_a_block:nn { ##1 } { ####1 } - \bool_if:nTF + \bool_lazy_or:nnTF + \l_tmpb_bool { - \cs_if_exist_p:c - { pgf @ sh @ ns @ \@@_env: - ##1 - ####1 } - || \l_tmpb_bool + \cs_if_exist_p:c + { pgf @ sh @ ns @ \@@_env: - ##1 - ####1 } } { \bool_set_true:N \l_tmpa_bool } { @@ -10901,7 +11285,7 @@ version 2005/12/01 or later. \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 } + { \@@_test_if_cell_in_block:nnnnnnn \l_tmpa_int \l_tmpb_int ##1 } } % \end{macrocode} % @@ -10909,14 +11293,17 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_test_if_cell_in_block:nnnnnnn #1 #2 #3 #4 #5 #6 { - \bool_lazy_all: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_compare:nNnT { #3 } < { \@@_succ:n { #1 } } + { + \int_compare:nNnT { #1 } < { \@@_succ:n { #5 } } + { + \int_compare:nNnT { #4 } < { \@@_succ:n { #2 } } + { + \int_compare:nNnT { #2 } < { \@@_succ:n { #6 } } + { \bool_set_true:N \l_tmpb_bool } + } + } } - { \bool_set_true:N \l_tmpb_bool } } % \end{macrocode} % @@ -11564,7 +11951,7 @@ version 2005/12/01 or later. % put before the math mode of the label) % % It's mandatory to use a expandable command (probably because of the first -% optional argument ?). +% optional argument?). % \begin{macrocode} \NewExpandableDocumentCommand \@@_Block: { O { } m D < > { } m } { \@@_Block_i #2 \q_stop { #1 } { #3 } { #4 } } @@ -11663,7 +12050,7 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_if_empty:NF \l_@@_color_tl { - \tl_gput_right:Nx \g_@@_code_before_tl + \tl_gput_right:Nx \g_nicematrix_code_before_tl { \exp_not:N \rectanglecolor { \l_@@_color_tl } @@ -11690,7 +12077,7 @@ version 2005/12/01 or later. % \begin{macrocode} \bool_lazy_or:nnTF { \int_compare_p:nNn { #3 } > \g_@@_row_total_int } - { \int_compare_p:nNn { #4 } > \c@jCol } + { \int_compare_p:nNn { #4 } > \g_@@_col_total_int } { \msg_error:nnnn { nicematrix } { Block~too~large } { #1 } { #2 } } { % \end{macrocode} @@ -11995,14 +12382,14 @@ version 2005/12/01 or later. % \subsection*{The redefinition of the command \textbackslash dotfill } % % \begin{macrocode} -\cs_set_eq:NN \@@_dotfill \dotfill +\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} - \@@_dotfill + \@@_old_dotfill \bool_if:NT \l_@@_NiceTabular_bool { \group_insert_after:N \@@_dotfill_ii: } { \group_insert_after:N \@@_dotfill_i: } @@ -12016,7 +12403,7 @@ version 2005/12/01 or later. % array, and it will extend, since it is no longer in |\l_@@_cell_box|. % \begin{macrocode} \cs_new_protected:Npn \@@_dotfill_iii: - { \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } = \c_zero_dim \@@_dotfill } + { \dim_compare:nNnT { \box_wd:N \l_@@_cell_box } = \c_zero_dim \@@_old_dotfill } % \end{macrocode} % % \bigskip @@ -12041,7 +12428,7 @@ version 2005/12/01 or later. % \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 -% |hvlines-except-corners|. +% |except-corners|. % \begin{macrocode} \seq_gput_right:Nx \g_@@_pos_of_blocks_seq { @@ -12425,15 +12812,6 @@ version 2005/12/01 or later. } % \end{macrocode} % -% -% \begin{macrocode} -\@@_msg_new:nn { option~S~without~siunitx } - { - You~can't~use~the~option~'S'~in~your~environment~\@@_full_name_env: - because~you~have~not~loaded~siunitx.\\ - If~you~go~on,~this~option~will~be~ignored. - } -% \end{macrocode} % % \begin{macrocode} \@@_msg_new:nn { bad~option~for~line-style } @@ -12452,6 +12830,14 @@ version 2005/12/01 or later. } % \end{macrocode} % +% \begin{macrocode} +\@@_msg_new:nn { Unknown~option~for~rowcolors } + { + As~for~now~there~is~only~one~option~available~here:~'respect-blocks'~ + (and~you~try~to~use~'\l_keys_key_tl').~If~you~go~on,~ + this~option~will~be~ignored. + } +% \end{macrocode} % % \begin{macrocode} \@@_msg_new:nn { ampersand~in~light-syntax } @@ -12504,7 +12890,16 @@ version 2005/12/01 or later. } % \end{macrocode} % -% +% \begin{macrocode} +\@@_msg_new:nn { bad~corner } + { + #1~is~an~incorrect~specification~for~a~corner~(in~the~keys~ + 'except-corners'~and~'hvlines-except-corners').~The~available~ + values~are:~NW,~SW,~NE~and~SE.\\ + If~you~go~on,~this~specification~of~corner~will~be~ignored. + } +% \end{macrocode} +% % \begin{macrocode} \@@_msg_new:nn { last-col~non~empty~for~NiceArray } { @@ -12780,7 +13175,6 @@ version 2005/12/01 or later. right-margin,~ rules/color,~ rules/width,~ - S,~ small,~ t,~ vlines,~ @@ -12849,7 +13243,8 @@ version 2005/12/01 or later. 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~option~'allow-duplicate-names'.\\ + message~again,~use~the~option~'allow-duplicate-names'~in~ + '\token_to_str:N \NiceMatrixOptions'.\\ For~a~list~of~the~names~already~used,~type~H~. \\ } { @@ -13208,6 +13603,19 @@ version 2005/12/01 or later. % % The variable |\g_nicematrix_code_after_tl| is now public. % +% \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| can take in as value 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 corner (eg: NW,SE). % % \PrintIndex % diff --git a/macros/latex/contrib/nicematrix/nicematrix.pdf b/macros/latex/contrib/nicematrix/nicematrix.pdf index f2ebe92444..ebefac27a8 100644 Binary files a/macros/latex/contrib/nicematrix/nicematrix.pdf and b/macros/latex/contrib/nicematrix/nicematrix.pdf differ -- cgit v1.2.3