From d23ce5cb0bb42ef0380b13d2d43d48afcc51b897 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 6 May 2021 20:23:54 +0000 Subject: nicematrix (6may21) git-svn-id: svn://tug.org/texlive/trunk@59105 c570f23f-e606-0410-a88d-b1316a301751 --- .../doc/latex/nicematrix/nicematrix-french.pdf | Bin 462451 -> 462481 bytes .../doc/latex/nicematrix/nicematrix-french.tex | 24 +- .../texmf-dist/doc/latex/nicematrix/nicematrix.pdf | Bin 1235344 -> 1248363 bytes .../source/latex/nicematrix/nicematrix.dtx | 764 +++++++++++++-------- .../texmf-dist/tex/latex/nicematrix/nicematrix.sty | 453 +++++++----- 5 files changed, 809 insertions(+), 432 deletions(-) diff --git a/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.pdf b/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.pdf index f5af6a6a759..972985be67a 100644 Binary files a/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.pdf and b/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.pdf differ diff --git a/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex b/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex index 9d33132192c..b9f2c804537 100644 --- a/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex +++ b/Master/texmf-dist/doc/latex/nicematrix/nicematrix-french.tex @@ -4207,6 +4207,10 @@ L'extension \pkg{nicematrix} n'est pas compatible avec la classe \cls{aastex63}. Si vous souhaitez utiliser \pkg{nicematrix} with \cls{aastex63}, envoyez-moi un courrier électronique et j'essaierai de résoudre les incompatibilités. +\bigskip +L'extension \pkg{nicematrix} n'est pas compatible avec la classe \cls{ieeeaccess} +(car cette classe n'est pas compatible avec PGF/Tikz). + \section{Exemples} \subsection{Notes dans les tableaux} @@ -4937,11 +4941,22 @@ source de ce document. % % % +\tikzset{highlight/.style={rectangle, + fill=red!15, + rounded corners = 0.5 mm, + inner sep=1pt, + fit=#1}}% +% +% \[\begin{NiceArray}{*{6}{c}@{\hspace{6mm}}*{5}{c}}[nullify-dots] -\CodeBefore +\CodeBefore [create-cell-nodes] \SubMatrix({2-7}{6-11}) \SubMatrix({7-2}{11-6}) \SubMatrix({7-7}{11-11}) + \begin{tikzpicture} + \node [highlight = (9-2) (9-6)] { } ; + \node [highlight = (2-9) (6-9)] { } ; + \end{tikzpicture} \Body & & & & & & & & \color{blue}\scriptstyle C_j \\ & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ @@ -4956,15 +4971,12 @@ source de ce document. & \Vdots & & & & \Vdots \\ & a_{n1} & \Cdots & & & a_{nn} \\ \CodeAfter -\begin{tikzpicture} -\node [highlight = (9-2) (9-6)] { } ; -\node [highlight = (2-9) (6-9)] { } ; -\draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ; -\end{tikzpicture} +\tikz \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ; \end{NiceArray}\] + \section*{Autre documentation} Le document |nicematrix.pdf| (fourni avec l'extension \pkg{nicematrix}) contient diff --git a/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf b/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf index b7104253956..9bae2b15ba7 100644 Binary files a/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf and b/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf differ diff --git a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx index 1b475cebada..0718d3cae59 100644 --- a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx +++ b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx @@ -15,8 +15,8 @@ % % \fi % \iffalse -\def\myfileversion{5.15} -\def\myfiledate{2021/04/25} +\def\myfileversion{5.15a} +\def\myfiledate{2021/05/06} % % %<*batchfile> @@ -26,6 +26,8 @@ \usedir{tex/latex/nicematrix} \preamble + + Copyright (C) 2018-2021 by F. Pantigny ----------------------------------- @@ -4136,6 +4138,11 @@ version 2005/12/01 or later. % \cls{aastex63}. If you want to use \pkg{nicematrix} with \cls{aastex63}, send % me an email and I will try to solve the incompatibilies. % +% +% \bigskip +% the package \pkg{nicematrix} is not compatible with the class \cls{ieeeaccess} +% (because that class is not compatible with PGF/Tikz). +% % \section{Examples} % % \subsection{Notes in the tabulars} @@ -4855,12 +4862,20 @@ version 2005/12/01 or later. % % You will find the LaTeX code of that figure in the source file of this % document. -% +% \tikzset{highlight/.style={rectangle, +% fill=red!15, +% rounded corners = 0.5 mm, +% inner sep=1pt, +% fit=#1}}% % \[\begin{NiceArray}{*{6}{c}@{\hspace{6mm}}*{5}{c}}[nullify-dots] -% \CodeBefore +% \CodeBefore [create-cell-nodes] % \SubMatrix({2-7}{6-11}) % \SubMatrix({7-2}{11-6}) % \SubMatrix({7-7}{11-11}) +% \begin{tikzpicture} +% \node [highlight = (9-2) (9-6)] { } ; +% \node [highlight = (2-9) (6-9)] { } ; +% \end{tikzpicture} % \Body % & & & & & & & & \color{blue}\scriptstyle C_j \\ % & & & & & & b_{11} & \Cdots & b_{1j} & \Cdots & b_{1n} \\ @@ -4875,12 +4890,9 @@ version 2005/12/01 or later. % & \Vdots & & & & \Vdots \\ % & a_{n1} & \Cdots & & & a_{nn} \\ % \CodeAfter -% \begin{tikzpicture} -% \node [highlight = (9-2) (9-6)] { } ; -% \node [highlight = (2-9) (6-9)] { } ; -% \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ; -% \end{tikzpicture} +% \tikz \draw [gray,shorten > = 1mm, shorten < = 1mm] (9-4.north) to [bend left] (4-9.west) ; % \end{NiceArray}\] +% % %\section{Implementation} % @@ -5477,6 +5489,14 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip +% The following counters will be used to count the numbers of rows and columns +% of the array. +% \begin{macrocode} +\int_new:N \g_@@_row_total_int +\int_new:N \g_@@_col_total_int +% \end{macrocode} +% +% \bigskip % The following token list will contain the type of the current cell (|l|, |c| % or |r|). It will be used by the blocks. % \begin{macrocode} @@ -5519,9 +5539,9 @@ version 2005/12/01 or later. % % \bigskip % If the user uses |{NiceArray}| or |{NiceTabular}| the flag -% |\g_@@_NiceArray_bool| will be raised. +% |\l_@@_NiceArray_bool| will be raised. % \begin{macrocode} -\bool_new:N \g_@@_NiceArray_bool +\bool_new:N \l_@@_NiceArray_bool % \end{macrocode} % In fact, if there is delimiters in the preamble of |{NiceArray}| (eg: % |[cccc]|), this boolean will be set to false. @@ -6121,7 +6141,7 @@ version 2005/12/01 or later. % \begin{macrocode} \NewDocumentCommand \tabularnote { m } { - \bool_if:nTF { ! \g_@@_NiceArray_bool && \l_@@_in_env_bool } + \bool_if:nTF { ! \l_@@_NiceArray_bool && \l_@@_in_env_bool } { \@@_error:n { tabularnote~forbidden } } { % \end{macrocode} @@ -6190,7 +6210,6 @@ version 2005/12/01 or later. % % % \subsection*{Command for creation of rectangle nodes} -% % % The following command should be used in a |{pgfpicture}|. It creates a % rectangle (empty but with a name). @@ -6257,7 +6276,7 @@ version 2005/12/01 or later. } % \end{macrocode} % -% +% % \bigskip % \subsection*{The options} % @@ -6398,7 +6417,13 @@ version 2005/12/01 or later. % \begin{macrocode} \bool_new:N \l_@@_auto_columns_width_bool % \end{macrocode} -% +% +% \bigskip +% The following boolean corresponds to the key |create-cell-nodes| of the +% keyword |\CodeBefore|. +% \begin{macrocode} +\bool_new:N \g_@@_recreate_cell_nodes_bool +% \end{macrocode} % % \bigskip % The string |\l_@@_name_str| will contain the optional name of the @@ -6531,6 +6556,9 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / Global } { + delimiters .code:n = + \keys_set:nn { NiceMatrix / delimiters } { #1 } , + delimiters .value_required:n = true , rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , rules .value_required:n = true , standard-cline .bool_set:N = \l_@@_standard_cline_bool , @@ -6613,7 +6641,7 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / Env } { - delimiters/max-width .bool_set:N = \l_@@_delimiters_max_width_bool , + % \end{macrocode} % The key |hvlines-except-corners| is now deprecated. % \begin{macrocode} @@ -6727,7 +6755,17 @@ version 2005/12/01 or later. unknown .code:n = \@@_error:n { Unknown~key~for~notes } } % \end{macrocode} -% +% +% \begin{macrocode} +\keys_define:nn { NiceMatrix / delimiters } + { + max-width .bool_set:N = \l_@@_delimiters_max_width_bool , + max-width .default:n = true , + color .tl_set:N = \l_@@_delimiters_color_tl , + color .value_required:n = true , + } +% \end{macrocode} +% % \bigskip % We begin the construction of the major sets of keys (used by the different % user commands and environments). @@ -6739,6 +6777,7 @@ version 2005/12/01 or later. NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots , NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules , NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes , + NiceMatrixOptions / delimiters .inherit:n = NiceMatrix / delimiters , NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix , SubMatrix / rules .inherit:n = NiceMatrix / rules , CodeAfter / xdots .inherit:n = NiceMatrix / xdots , @@ -6749,6 +6788,7 @@ version 2005/12/01 or later. } , NiceMatrix / xdots .inherit:n = NiceMatrix / xdots , NiceMatrix / rules .inherit:n = NiceMatrix / rules , + NiceMatrix / delimiters .inherit:n = NiceMatrix / delimiters , NiceTabular .inherit:n = { NiceMatrix / Global , @@ -6756,6 +6796,7 @@ version 2005/12/01 or later. } , NiceTabular / xdots .inherit:n = NiceMatrix / xdots , NiceTabular / rules .inherit:n = NiceMatrix / rules , + NiceTabular / delimiters .inherit:n = NiceMatrix / delimiters , NiceArray .inherit:n = { NiceMatrix / Global , @@ -6763,6 +6804,7 @@ version 2005/12/01 or later. } , NiceArray / xdots .inherit:n = NiceMatrix / xdots , NiceArray / rules .inherit:n = NiceMatrix / rules , + NiceArray / delimiters .inherit:n = NiceMatrix / delimiters , pNiceArray .inherit:n = { NiceMatrix / Global , @@ -6770,6 +6812,7 @@ version 2005/12/01 or later. } , pNiceArray / xdots .inherit:n = NiceMatrix / xdots , pNiceArray / rules .inherit:n = NiceMatrix / rules , + pNiceArray / delimiters .inherit:n = NiceMatrix / delimiters , } % \end{macrocode} % @@ -6781,13 +6824,6 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / NiceMatrixOptions } { - delimiters / max-width .bool_set:N = \l_@@_delimiters_max_width_bool , - delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , - delimiters / color .value_required:n = true , - delimiters-color .code:n = - \tl_set:Nn \l_@@_delimiters_color_tl { #1 } - \@@_error:n { delimiters-color deleted } , - delimiters-color .value_required:n = true , last-col .code:n = \tl_if_empty:nF { #1 } { \@@_error:n { last-col~non~empty~for~NiceMatrixOptions } } \int_zero:N \l_@@_last_col_int , @@ -6900,12 +6936,6 @@ version 2005/12/01 or later. r .code:n = \tl_set:Nn \l_@@_type_of_col_tl r , small .bool_set:N = \l_@@_small_bool , small .value_forbidden:n = true , - delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , - delimiters / color .value_required:n = true , - delimiters-color .code:n = - \tl_set:Nn \l_@@_delimiters_color_tl { #1 } - \@@_error:n { delimiters-color deleted } , - delimiters-color .value_required:n = true , unknown .code:n = \@@_error:n { Unknown~option~for~NiceMatrix } } % \end{macrocode} @@ -6936,11 +6966,6 @@ version 2005/12/01 or later. notes / bottomrule .default:n = true , tabularnote .tl_set:N = \l_@@_tabularnote_tl , tabularnote .value_required:n = true , - delimiters-color .code:n = - \tl_set:Nn \l_@@_delimiters_color_tl { #1 } - \@@_error:n { delimiters-color deleted } , - delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , - delimiters / color .value_required:n = true , r .code:n = \@@_error:n { r~or~l~with~preamble } , l .code:n = \@@_error:n { r~or~l~with~preamble } , unknown .code:n = \@@_error:n { Unknown~option~for~NiceArray } @@ -7206,7 +7231,7 @@ version 2005/12/01 or later. \bool_lazy_or:nnTF \g_@@_not_empty_cell_bool { \dim_compare_p:nNn { \box_wd:N \l_@@_cell_box } > \c_zero_dim } - \@@_node_for_the_cell: + \@@_node_for_cell: { \box_use_drop:N \l_@@_cell_box } } \int_gset:Nn \g_@@_col_total_int { \int_max:nn \g_@@_col_total_int \c@jCol } @@ -7214,12 +7239,12 @@ version 2005/12/01 or later. \bool_gset_false:N \g_@@_not_empty_cell_bool } % \end{macrocode} -% +% % \medskip % The following command creates the \textsc{pgf} name of the node with, of % course, |\l_@@_cell_box| as the content. % \begin{macrocode} -\cs_new_protected:Npn \@@_node_for_the_cell: +\cs_new_protected:Npn \@@_node_for_cell: { \pgfpicture \pgfsetbaseline \c_zero_dim @@ -7244,6 +7269,53 @@ version 2005/12/01 or later. \endpgfpicture } % \end{macrocode} +% +% \medskip +% As its name says, the following command is a patch for the command +% |\@@_node_for_cell:|. This patch will be appended on the left of +% |\@@_noce_for_the_cell:| when the construction of the cell nodes (of the forme +% |(i-j)|) in the |\CodeBefore| is required. +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_node_for_cell:n #1 + { + \cs_new_protected:Npn \@@_patch_node_for_cell: + { + \hbox_set:Nn \l_@@_cell_box + { + \box_move_up:nn { \box_ht:N \l_@@_cell_box} + \hbox_overlap_left:n + { + \pgfsys@markposition + { \@@_env: - \int_use:N \c@iRow - \int_use:N \c@jCol - NW } +% \end{macrocode} +% I don't know why the following adjustement is needed when the compilation is +% done with XeLaTeX or with the classical way |latex|, |divps|, |ps2pdf| (or +% Adobe Distiller). However, it seems to work. +% \begin{macrocode} + #1 + } + \box_use:N \l_@@_cell_box + \box_move_down:nn { \box_dp:N \l_@@_cell_box } + \hbox_overlap_left:n + { + \pgfsys@markposition + { \@@_env: - \int_use:N \c@iRow - \int_use:N \c@jCol - SE } + #1 + } + } + } + } +% \end{macrocode} +% +% \begin{macrocode} +\bool_lazy_or:nnTF \sys_if_engine_xetex_p: \sys_if_output_dvi_p: + { + \@@_patch_node_for_cell:n + { \skip_horizontal:n { 0.5 \box_wd:N \l_@@_cell_box } } + } + { \@@_patch_node_for_cell:n { } } +% \end{macrocode} +% % % \interitem % The second argument of the following command |\@@_instruction_of_type:nnn| @@ -7450,7 +7522,7 @@ version 2005/12/01 or later. \peek_meaning:NTF [ { \newcol@ #1 } { \newcol@ #1 [ 0 ] } - } + } % \end{macrocode} % % @@ -7679,138 +7751,13 @@ version 2005/12/01 or later. % \end{macrocode} % This is the end of |\@@_pre_array_ii:|. % +% % \bigskip -% If the key |code-before| is used, we have to create the |col| nodes and the -% |row| nodes before the creation of the array. First, we have to test whether -% the size of the array has been written in the |aux| file in a previous run. In -% this case, a command |\@@_size_|{\slshape\ttfamily nb_of_env}|:| has been -% created. % \begin{macrocode} \cs_new_protected:Npn \@@_pre_array: { \seq_gclear:N \g_@@_submatrix_seq - \bool_if:NT \l_@@_code_before_bool - { -% \end{macrocode} -% The list of the cells which are in the (empty) corners is stored in the |aux| -% file because we have to know it before the execution of the |\CodeBefore| (the -% commands which color the cells, row and columns won't color the cells which -% are in the corners). -% \begin{macrocode} - \seq_if_exist:cT - { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq } - { - \seq_set_eq:Nc \l_@@_corners_cells_seq - { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq } - } -% \end{macrocode} -% Now, we have to reconstruct the |row| nodes and the |col| nodes. -% \begin{macrocode} - \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq } - { -% \end{macrocode} -% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that, -% in the |code-before| (and in the |\CodeAfter|) they represent the numbers of -% rows and columns of the array (without the potential last row and last column). -% \begin{macrocode} - \int_zero_new:N \c@iRow - \int_set:Nn \c@iRow - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 } - \int_zero_new:N \c@jCol - \int_set:Nn \c@jCol - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 } -% \end{macrocode} -% We have to adjust the values of |\c@iRow| and |\c@jCol| to take into account -% the potential last row and last column. A value of $-2$ for -% |\l_@@_last_row_int| means that there is no last row. Idem for the columns. -% \begin{macrocode} - \int_compare:nNnF \l_@@_last_row_int = { -2 } - { \int_decr:N \c@iRow } - \int_compare:nNnF \l_@@_last_col_int = { -2 } - { \int_decr:N \c@jCol } -% \end{macrocode} -% -% Now, we will create all the |col| nodes and |row| nodes with the informations -% written in the |aux| file. You use the technique described in the page~1229 of -% |pgfmanual.pdf|, version~3.1.4b. -% \begin{macrocode} - \pgfsys@markposition { \@@_env: - position } - \pgfsys@getposition { \@@_env: - position } \@@_picture_position: - \pgfpicture -% \end{macrocode} -% First, the creation of the |row| nodes. -% \begin{macrocode} - \int_step_inline:nnn - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 1 } - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 + 1 } - { - \pgfsys@getposition { \@@_env: - row - ##1 } \@@_node_position: - \pgfcoordinate { \@@_env: - row - ##1 } - { \pgfpointdiff \@@_picture_position: \@@_node_position: } - } -% \end{macrocode} -% Now, the creation of the |col| nodes. -% \begin{macrocode} - \int_step_inline:nnn - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 3 } - { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 + 1 } - { - \pgfsys@getposition { \@@_env: - col - ##1 } \@@_node_position: - \pgfcoordinate { \@@_env: - col - ##1 } - { \pgfpointdiff \@@_picture_position: \@@_node_position: } - } - \endpgfpicture -% \end{macrocode} -% Now, you create the diagonal nodes by using the |row| nodes and the |col| -% nodes. If the engine is |xetex| or |luatex| we also create the ``½ nodes''. -% \begin{macrocode} - \@@_create_diag_nodes: -% \end{macrocode} -% -% \medskip -% Now, yet other settings before the execution of the |code-before|. -% \begin{macrocode} - \group_begin: - \bool_if:NT \c_@@_tikz_loaded_bool - { - \tikzset - { - every~picture / .style = - { overlay , name~prefix = \@@_env: - } - } - } - \cs_set_eq:NN \cellcolor \@@_cellcolor - \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor - \cs_set_eq:NN \roundedrectanglecolor \@@_roundedrectanglecolor - \cs_set_eq:NN \rowcolor \@@_rowcolor - \cs_set_eq:NN \rowcolors \@@_rowcolors - \cs_set_eq:NN \arraycolor \@@_arraycolor - \cs_set_eq:NN \columncolor \@@_columncolor - \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors - \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before -% \end{macrocode} -% We compose the |code-before| in math mode in order to nullify the spaces put -% by the user between instructions in the |code-before|. -% \begin{macrocode} - \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token - \seq_gclear_new:N \g_@@_colors_seq -% \end{macrocode} -% Here is the |\CodeBefore|. As of now, the keys that may be provided to the -% keyword |\CodeBefore| are the same as keys that may be provided to -% |\CodeAfter|, hence the |\@@_CodeAfter_keys:|. -% \begin{macrocode} - \exp_last_unbraced:NV \@@_CodeAfter_keys: \l_@@_code_before_tl -% \end{macrocode} -% Now, all the cells which are specified to be colored by instructions in the -% |\CodeBefore| will actually be colored. It's a two-stages mechanism because we -% want to draw all the cells with the same color at the same time to absolutely -% avoid thin white lines in some \textsc{pdf} viewers. -% \begin{macrocode} - \@@_actually_color: - \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token - \group_end: - } - } + \bool_if:NT \l_@@_code_before_bool \@@_exec_code_before: % \end{macrocode} % % A value of $-1$ for the counter |\l_@@_last_row_int| means that the user has @@ -7854,7 +7801,6 @@ version 2005/12/01 or later. } % \end{macrocode} % -% % A value of $-1$ for the counter |\l_@@_last_col_int| means that the user has % used the option |last-col| without value, that is to say without specifying % the number of that last column. In this case, we try to read that value from @@ -7885,7 +7831,6 @@ version 2005/12/01 or later. % \begin{macrocode} \@@_pre_array_ii: % \end{macrocode} -% % % \medskip % The array will be composed in a box (named |\l_@@_the_array_box|) because we @@ -7908,7 +7853,6 @@ version 2005/12/01 or later. % \begin{macrocode} \@@_construct_preamble: % \end{macrocode} -% % Now, the preamble is constructed in |\g_@@_preamble_tl| % % \medskip @@ -7918,7 +7862,7 @@ version 2005/12/01 or later. % \begin{macrocode} \dim_zero_new:N \l_@@_left_delim_dim \dim_zero_new:N \l_@@_right_delim_dim - \bool_if:NTF \g_@@_NiceArray_bool + \bool_if:NTF \l_@@_NiceArray_bool { \dim_gset:Nn \l_@@_left_delim_dim { 2 \arraycolsep } \dim_gset:Nn \l_@@_right_delim_dim { 2 \arraycolsep } @@ -7933,8 +7877,6 @@ version 2005/12/01 or later. \dim_set:Nn \l_@@_right_delim_dim { \box_wd:N \l_tmpa_box } } % \end{macrocode} -% -% % % \bigskip % Here is the beginning of the box which will contain the array. The @@ -7972,6 +7914,226 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% \bigskip +% \subsection*{The \textbackslash CodeBefore} +% +% The following command will be executed if the |\CodeBefore| has to be actually executed. +% \begin{macrocode} +\cs_new_protected:Npn \@@_pre_code_before: + { +% \end{macrocode} +% First, we give values to the LaTeX counters |iRow| and |jCol|. We remind that, +% in the |code-before| (and in the |\CodeAfter|) they represent the numbers of +% rows and columns of the array (without the potential last row and last column). +% \begin{macrocode} + \int_zero_new:N \c@iRow + \int_set:Nn \c@iRow + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 } + \int_zero_new:N \c@jCol + \int_set:Nn \c@jCol + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 } +% \end{macrocode} +% We have to adjust the values of |\c@iRow| and |\c@jCol| to take into account +% the potential last row and last column. A value of $-2$ for +% |\l_@@_last_row_int| means that there is no last row. Idem for the columns. +% \begin{macrocode} + \int_compare:nNnF \l_@@_last_row_int = { -2 } + { \int_decr:N \c@iRow } + \int_compare:nNnF \l_@@_last_col_int = { -2 } + { \int_decr:N \c@jCol } +% \end{macrocode} +% +% Now, we will create all the |col| nodes and |row| nodes with the informations +% written in the |aux| file. You use the technique described in the page~1229 of +% |pgfmanual.pdf|, version~3.1.4b. +% \begin{macrocode} + \pgfsys@markposition { \@@_env: - position } + \pgfsys@getposition { \@@_env: - position } \@@_picture_position: + \pgfpicture + \pgf@relevantforpicturesizefalse +% \end{macrocode} +% First, the recreation of the |row| nodes. +% \begin{macrocode} + \int_step_inline:nnn + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 1 } + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 + 1 } + { + \pgfsys@getposition { \@@_env: - row - ##1 } \@@_node_position: + \pgfcoordinate { \@@_env: - row - ##1 } + { \pgfpointdiff \@@_picture_position: \@@_node_position: } + } +% \end{macrocode} +% Now, the recreation of the |col| nodes. +% \begin{macrocode} + \int_step_inline:nnn + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 3 } + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 + 1 } + { + \pgfsys@getposition { \@@_env: - col - ##1 } \@@_node_position: + \pgfcoordinate { \@@_env: - col - ##1 } + { \pgfpointdiff \@@_picture_position: \@@_node_position: } + } +% \end{macrocode} +% Now, you recreate the diagonal nodes by using the |row| nodes and the |col| +% nodes. +% \begin{macrocode} + \@@_create_diag_nodes: +% \end{macrocode} +% +% \medskip +% Now, the creation of the cell nodes |(i-j)|. +% \begin{macrocode} + \bool_if:NT \g_@@_recreate_cell_nodes_bool \@@_recreate_cell_nodes: + \endpgfpicture +% \end{macrocode} +% +% \begin{macrocode} + \bool_if:NT \c_@@_tikz_loaded_bool + { + \tikzset + { + every~picture / .style = + { overlay , name~prefix = \@@_env: - } + } + } + \cs_set_eq:NN \cellcolor \@@_cellcolor + \cs_set_eq:NN \rectanglecolor \@@_rectanglecolor + \cs_set_eq:NN \roundedrectanglecolor \@@_roundedrectanglecolor + \cs_set_eq:NN \rowcolor \@@_rowcolor + \cs_set_eq:NN \rowcolors \@@_rowcolors + \cs_set_eq:NN \arraycolor \@@_arraycolor + \cs_set_eq:NN \columncolor \@@_columncolor + \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors + \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before +% \end{macrocode} +% The list of the cells which are in the (empty) corners is stored in the |aux| +% file because we have to know it before the execution of the |\CodeBefore| (the +% commands which color the cells, rows and columns won't color the cells which +% are in the corners). +% \begin{macrocode} + \seq_if_exist:cT + { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq } + { + \seq_set_eq:Nc \l_@@_corners_cells_seq + { c_@@_corners_cells_ \int_use:N \g_@@_env_int _ seq } + } + } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} +\cs_new_protected:Npn \@@_exec_code_before: + { + \seq_gclear_new:N \g_@@_colors_seq + \bool_gset_false:N \g_@@_recreate_cell_nodes_bool + \group_begin: +% \end{macrocode} +% +% We compose the |code-before| in math mode in order to nullify the spaces put +% by the user between instructions in the |code-before|. +% \begin{macrocode} + \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token +% \end{macrocode} +% +% Here is the |\CodeBefore|. The construction is a bit complicated because +% |\l_@@_code_before_tl| may begin with keys between square brackets. Moreover, +% after the analyze of those keys, we sometimes have to decide to do \emph{not} +% execute the rest of |\l_@@_code_before_tl| (when it is asked for the creation +% of cell nodes in the |\CodeBefore|). That's why we begin with a |\q_stop|: it +% will be used to discard the rest of |\l_@@_code_before_tl|. +% \begin{macrocode} + \exp_last_unbraced:NV \@@_CodeBefore_keys: \l_@@_code_before_tl \q_stop +% \end{macrocode} +% Now, all the cells which are specified to be colored by instructions in the +% |\CodeBefore| will actually be colored. It's a two-stages mechanism because we +% want to draw all the cells with the same color at the same time to absolutely +% avoid thin white lines in some \textsc{pdf} viewers. +% \begin{macrocode} + \@@_actually_color: + \bool_if:NT \l_@@_NiceTabular_bool \c_math_toggle_token + \group_end: + \bool_if:NT \g_@@_recreate_cell_nodes_bool + { \tl_put_left:Nn \@@_node_for_cell: \@@_patch_node_for_cell: } + } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} +\keys_define:nn { NiceMatrix / CodeBefore } + { + create-cell-nodes .bool_gset:N = \g_@@_recreate_cell_nodes_bool , + create-cell-nodes .default:n = true , + sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , + sub-matrix .value_required:n = true , + delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , + delimiters / color .value_required:n = true , + unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter } + } +% \end{macrocode} +% +% \begin{macrocode} +\NewDocumentCommand \@@_CodeBefore_keys: { O { } } + { + \keys_set:nn { NiceMatrix / CodeBefore } { #1 } + \@@_CodeBefore:w + } +% \end{macrocode} +% +% We have extracted the options of the keyword |\CodeBefore| in order to see +% whether the key |create-cell-nodes| has been used. Now, you can execute the +% rest of the |\CodeAfter|, excepted, of course, if we are in the first +% compilation. +% \begin{macrocode} +\cs_new_protected:Npn \@@_CodeBefore:w #1 \q_stop + { + \seq_if_exist:cT { @@_size_ \int_use:N \g_@@_env_int _ seq } + { + \@@_pre_code_before: + #1 + } + } +% \end{macrocode} +% +% \bigskip +% +% +% \bigskip +% By default, if the user uses the |\CodeBefore|, only the |col| nodes, |row| +% nodes and |diag| nodes are available in that |\CodeBefore|. With the key +% |create-cell-nodes|, the cell nodes, that is to say the nodes of the form +% |(i-j)| (but not the extra nodes) are also available because those nodes also +% are recreated and that recreation is done by the following command. +% \begin{macrocode} +\cs_new_protected:Npn \@@_recreate_cell_nodes: + { + \int_step_inline:nnn + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 1 } + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 2 } + { + \int_step_inline:nnn + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 3 } + { \seq_item:cn { @@_size_ \int_use:N \g_@@_env_int _ seq } 4 } + { + \cs_if_exist:cT + { pgf @ sys @ pdf @ mark @ pos @ \@@_env: - ##1 - ####1 - NW } + { + \pgfsys@getposition + { \@@_env: - ##1 - ####1 - NW } + \@@_node_position: + \pgfsys@getposition + { \@@_env: - ##1 - ####1 - SE } + \@@_node_position_i: + \@@_pgf_rect_node:nnn + { \@@_env: - ##1 - ####1 } + { \pgfpointdiff \@@_picture_position: \@@_node_position: } + { \pgfpointdiff \@@_picture_position: \@@_node_position_i: } + } + } + } + } +% \end{macrocode} +% % % \bigskip % \subsection*{The environment \{NiceArrayWithDelims\}} @@ -8076,7 +8238,7 @@ version 2005/12/01 or later. % of |{NiceArray}| (|{pNiceArray}|, |{bNiceArray}|, etc.) because, for % |{NiceArray}|, we have the options |t|, |c|, |b| and |baseline|. % \begin{macrocode} - \bool_if:NTF \g_@@_NiceArray_bool + \bool_if:NTF \l_@@_NiceArray_bool { \keys_set:nn { NiceMatrix / NiceArray } } { \keys_set:nn { NiceMatrix / pNiceArray } } { #3 , #5 } @@ -8167,14 +8329,14 @@ version 2005/12/01 or later. } % \end{macrocode} % -% The construction of the real box is different when |\g_@@_NiceArray_bool| is +% The construction of the real box is different when |\l_@@_NiceArray_bool| is % true (|{NiceArray}| or |{NiceTabular}|) and in the other environments because, % in |{NiceArray}| or |{NiceTabular}|, we have no delimiter to put (but we have % tabular notes to put). We begin with this case. % % Remark that, in all cases, |@@_use_arraybox_with_notes_c:| is used. % \begin{macrocode} - \bool_if:NTF \g_@@_NiceArray_bool + \bool_if:NTF \l_@@_NiceArray_bool { \str_case:VnF \l_@@_baseline_tl { @@ -8338,9 +8500,9 @@ version 2005/12/01 or later. % the end). % \begin{macrocode} \bool_if:NF \l_@@_Matrix_bool - { - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } + { + \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } + \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } % \end{macrocode} % % First, we have to store our preamble in the token register |\@temptokena| @@ -8394,18 +8556,10 @@ version 2005/12/01 or later. % \begin{macrocode} \int_zero:N \l_tmpa_int % \end{macrocode} -% We will raise |\l_tmpa_bool| if we are in |{NiceArray}| and that the first -% letter of the preamble is a opening delimiter (|[|, |(| of |\{|). In that -% case, the environment |{NiceArray}| will be transformed to an environment of -% the form |{xNiceArray}| after the construction of the preamble. -% \begin{macrocode} - \bool_set_false:N \l_tmpa_bool -% \end{macrocode} % Now, we actually patch the preamble (and it is constructed in % |\g_@@_preamble_tl|). % \begin{macrocode} \exp_after:wN \@@_patch_preamble:n \the \@temptokena \q_stop - \bool_if:NT \l_tmpa_bool { \bool_gset_false:N \g_@@_NiceArray_bool } \int_gset_eq:NN \g_@@_static_num_of_col_int \c@jCol } % \end{macrocode} @@ -8421,6 +8575,23 @@ version 2005/12/01 or later. \g_@@_preamble_tl } % \end{macrocode} +% +% \medskip +% Now, we can close the TeX group which was opened for the redefinition of +% the columns of type |w| and |W|. +% \begin{macrocode} + \group_end: +% \end{macrocode} +% +% \medskip +% If there was delimiters at the beginning or at the end of the preamble, the +% environment |{NiceArray}| is transformed into an environment |{xNiceMatrix}|. +% \begin{macrocode} + \bool_lazy_or:nnT + { ! \str_if_eq_p:Vn \g_@@_left_delim_tl { . } } + { ! \str_if_eq_p:Vn \g_@@_right_delim_tl { . } } + { \bool_set_false:N \l_@@_NiceArray_bool } +% \end{macrocode} % % \bigskip % We complete the preamble with the potential ``exterior columns''. @@ -8430,7 +8601,7 @@ version 2005/12/01 or later. { \bool_lazy_all:nT { - \g_@@_NiceArray_bool + \l_@@_NiceArray_bool { \bool_not_p:n \l_@@_NiceTabular_bool } { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } @@ -8442,7 +8613,7 @@ version 2005/12/01 or later. { \bool_lazy_all:nT { - \g_@@_NiceArray_bool + \l_@@_NiceArray_bool { \bool_not_p:n \l_@@_NiceTabular_bool } { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } @@ -8459,13 +8630,6 @@ version 2005/12/01 or later. \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_error_too_much_cols: } l } } -% \end{macrocode} -% -% \medskip -% Now, we have to close the TeX group which was opened for the redefinition of -% the columns of type |w| and |W|. -% \begin{macrocode} - \group_end: } % \end{macrocode} % @@ -8488,9 +8652,9 @@ version 2005/12/01 or later. \@@_w: { \@@_patch_preamble_v:nnnn { } #1 } \@@_W: { \@@_patch_preamble_v:nnnn { \cs_set_eq:NN \hss \hfil } #1 } \@@_true_c: { \@@_patch_preamble_vi:n #1 } - ( { \@@_patch_preamble_vii:n #1 } - [ { \@@_patch_preamble_vii:n #1 } - \{ { \@@_patch_preamble_vii:n #1 } + ( { \@@_patch_preamble_vii:nn #1 } + [ { \@@_patch_preamble_vii:nn #1 } + \{ { \@@_patch_preamble_vii:nn #1 } ) { \@@_patch_preamble_viii:nn #1 } ] { \@@_patch_preamble_viii:nn #1 } \} { \@@_patch_preamble_viii:nn #1 } @@ -8677,17 +8841,16 @@ version 2005/12/01 or later. % \medskip % For |(|, |[| and |\{|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii:n #1 +\cs_new_protected:Npn \@@_patch_preamble_vii:nn #1 #2 { - \bool_if:NT \l_@@_small_bool - { \@@_fatal:n { Delimiter~with~small } } + \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } } % \end{macrocode} % If we are before the column 1 and not in |{NiceArray}|, we reserve space for % the left delimiter. % \begin{macrocode} \int_compare:nNnTF \c@jCol = \c_zero_int { - \bool_if:NTF \g_@@_NiceArray_bool + \str_if_eq:VnTF \g_@@_left_delim_tl { . } { % \end{macrocode} % In that case, in fact, the firt letter of the preamble must be considered as @@ -8695,67 +8858,52 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_gset:Nn \g_@@_left_delim_tl { #1 } \tl_gset:Nn \g_@@_right_delim_tl { . } -% \end{macrocode} -% We raise the boolean |\l_tmpa_bool|, which means that the environment -% |{NiceArray}| will be transformed to |{xNiceArray}|. -% \begin{macrocode} - \bool_set_true:N \l_tmpa_bool - \@@_patch_preamble:n + \@@_patch_preamble:n #2 } { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_internal_code_after_tl { \@@_delimiter:nnn #1 { \@@_succ:n \c@jCol } \c_true_bool } - \@@_patch_preamble_vii_i:n + \tl_if_in:nnTF { ( [ \{ ) ] \} } { #2 } + { + \@@_error:nn { delimiter~after~opening } { #2 } + \@@_patch_preamble:n + } + { \@@_patch_preamble:n #2 } } } { \tl_gput_right:Nx \g_@@_internal_code_after_tl { \@@_delimiter:nnn #1 { \@@_succ:n \c@jCol } \c_true_bool } - \@@_patch_preamble_vii_i:n + \tl_if_in:nnTF { ( [ \{ ) ] \} } { #2 } + { + \@@_error:nn { delimiter~after~opening } { #2 } + \@@_patch_preamble:n + } + { \@@_patch_preamble:n #2 } } } % \end{macrocode} % -% \bigskip -% \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii_i:n #1 - { - \tl_if_in:nnTF { ( [ \{ ) ] \} } { #1 } - { - \@@_error:nn { delimiter~after~opening } { #1 } - \@@_patch_preamble:n - } - { \@@_patch_preamble:n #1 } - } -% \end{macrocode} % % \bigskip % For |)|, |]| and |\}|. We have two arguments for the following command because % we directly read the following letter in the preamble (we have to see whether % we have a opening delimiter following and we also have to see whether we are % at the end of the preamble because, in that case, our letter must be -% considered as the right delimiter of the environment). +% considered as the right delimiter of the environment if the environment is +% |{NiceArray}|). % \begin{macrocode} \cs_new_protected:Npn \@@_patch_preamble_viii:nn #1 #2 { - \bool_if:NT \l_@@_small_bool - { \@@_fatal:n { Delimiter~with~small } } + \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } } \tl_if_in:nnTF { ) ] \} } { #2 } - { - \tl_gput_right:Nx \g_@@_internal_code_after_tl - { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } - \@@_error:nn { double~closing~delimiter } { #2 } - \@@_patch_preamble:n - } + { \@@_patch_preamble_viii_i:nnn #1 #2 } { \tl_if_eq:nnTF { \q_stop } { #2 } { - \bool_if:NTF \g_@@_NiceArray_bool - { - \tl_gset:Nn \g_@@_right_delim_tl { #1 } - \bool_set_true:N \l_tmpa_bool - } + \str_if_eq:VnTF \g_@@_right_delim_tl { . } + { \tl_gset:Nn \g_@@_right_delim_tl { #1 } } { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_internal_code_after_tl @@ -8774,7 +8922,34 @@ version 2005/12/01 or later. } % \end{macrocode} % -% +% \begin{macrocode} +\cs_new_protected:Npn \@@_patch_preamble_viii_i:nnn #1 #2 #3 + { + \tl_if_eq:nnTF { \q_stop } { #3 } + { + \str_if_eq:VnTF \g_@@_right_delim_tl { . } + { + \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nx \g_@@_internal_code_after_tl + { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } + \tl_gset:Nn \g_@@_right_delim_tl { #2 } + } + { + \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nx \g_@@_internal_code_after_tl + { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } + \@@_error:nn { double~closing~delimiter } { #2 } + } + } + { + \tl_gput_right:Nx \g_@@_internal_code_after_tl + { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } + \@@_error:nn { double~closing~delimiter } { #2 } + \@@_patch_preamble:n #3 + } + } +% \end{macrocode} +% % \begin{macrocode} \cs_new_protected:Npn \@@_patch_preamble_xi:n #1 { @@ -9510,7 +9685,7 @@ version 2005/12/01 or later. \hbox_overlap_left:n { \dim_compare:nNnTF { \box_wd:N \l_@@_cell_box } > \c_zero_dim - \@@_node_for_the_cell: + \@@_node_for_cell: { \box_use_drop:N \l_@@_cell_box } \skip_horizontal:N \l_@@_left_delim_dim \skip_horizontal:N \l_@@_left_margin_dim @@ -9591,7 +9766,7 @@ version 2005/12/01 or later. \skip_horizontal:N \l_@@_right_delim_dim \skip_horizontal:N \l_@@_right_margin_dim \skip_horizontal:N \l_@@_extra_right_margin_dim - \@@_node_for_the_cell: + \@@_node_for_cell: } } \bool_gset_false:N \g_@@_empty_cell_bool @@ -9602,19 +9777,19 @@ version 2005/12/01 or later. % % \interitem % The environment |{NiceArray}| is constructed upon the environment -% |{NiceArrayWithDelims}| but, in fact, there is a flag |\g_@@_NiceArray_bool|. +% |{NiceArrayWithDelims}| but, in fact, there is a flag |\l_@@_NiceArray_bool|. % In |{NiceArrayWithDelims}|, some special code will be executed if this flag is % raised. % \begin{macrocode} \NewDocumentEnvironment { NiceArray } { } { - \bool_gset_true:N \g_@@_NiceArray_bool + \bool_set_true:N \l_@@_NiceArray_bool \str_if_empty:NT \g_@@_name_env_str { \str_gset:Nn \g_@@_name_env_str { NiceArray } } % \end{macrocode} % We put . and . for the delimiters but, in fact, that doesn't matter because % these arguments won't be used in |{NiceArrayWithDelims}| (because the flag -% |\g_@@_NiceArray_bool| is raised). +% |\l_@@_NiceArray_bool| is raised). % \begin{macrocode} \NiceArrayWithDelims . . } @@ -9803,7 +9978,7 @@ version 2005/12/01 or later. % \end{macrocode} % % If the key |code-before| is used, we have to write on the |aux| file the actual -% size of the array. +% size of the array and other informations. % \begin{macrocode} \bool_if:NT \l_@@_code_before_bool { @@ -9837,12 +10012,13 @@ version 2005/12/01 or later. { c_@@_pos_of_blocks_ \int_use:N \g_@@_env_int _ seq } { \seq_use:Nnnn \g_@@_pos_of_blocks_seq , , , } } + \iow_now:Nn \@mainaux \ExplSyntaxOff } % \end{macrocode} % % \medskip % Now, you create the diagonal nodes by using the |row| nodes and the |col| -% nodes. If the engine is |xetex| or |luatex| we also create the ``½ nodes''. +% nodes. % \begin{macrocode} \@@_create_diag_nodes: % \end{macrocode} @@ -10020,9 +10196,12 @@ version 2005/12/01 or later. } % \end{macrocode} % +% \begin{macrocode} + % \bool_if:NT \l_@@_code_before_bool \@@_write_aux_for_cell_nodes: +% \end{macrocode} +% % \medskip % \begin{macrocode} - \bool_gset_false:N \g_@@_NiceArray_bool \str_gclear:N \g_@@_name_env_str \@@_restore_iRow_jCol: % \end{macrocode} @@ -10040,12 +10219,14 @@ version 2005/12/01 or later. % \bigskip % The following command will extract the potential options (between square % brackets) at the beginning of the |\CodeAfter| (that is to say, when -% |\CodeAfter| is used, the options of that ``command'' |\CodeAfter|). +% |\CodeAfter| is used, the options of that ``command'' |\CodeAfter|). Idem for +% the |\CodeBefore.| % \begin{macrocode} \NewDocumentCommand \@@_CodeAfter_keys: { O { } } { \keys_set:nn { NiceMatrix / CodeAfter } { #1 } } % \end{macrocode} % +% % % \bigskip % We remind that the first mandatory argument of the command |\Block| is the @@ -10144,6 +10325,53 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% \bigskip +% \begin{macrocode} +\cs_new_protected:Npn \@@_write_aux_for_cell_nodes: + { + \pgfpicture + \pgfrememberpicturepositiononpagetrue + \pgf@relevantforpicturesizefalse + \int_step_inline:nnn \l_@@_first_row_int \g_@@_row_total_int + { + \int_step_inline:nnn \l_@@_first_col_int \g_@@_col_total_int + { + \cs_if_exist:cT { pgf @ sh @ ns @ \@@_env: - ##1 - ####1 } + { + \pgfscope + \pgftransformshift + { \pgfpointanchor { \@@_env: - ##1 - ####1 } { north~west } } + \pgfnode + { rectangle } + { center } + { + \hbox + { \pgfsys@markposition { \@@_env: - ##1 - ####1 - NW } } + } + { } + { } + \endpgfscope + \pgfscope + \pgftransformshift + { \pgfpointanchor { \@@_env: - ##1 - ####1 } { south~east } } + \pgfnode + { rectangle } + { center } + { + \hbox + { \pgfsys@markposition { \@@_env: - ##1 - ####1 - SE } } + } + { } + { } + \endpgfscope + } + } + } + \endpgfpicture + \@@_create_extra_nodes: + } +% \end{macrocode} % % \bigskip % The following command creates the diagonal nodes (in fact, if the matrix is @@ -12765,8 +12993,8 @@ version 2005/12/01 or later. \cs_new_protected:Npn \@@_draw_vlines: { \int_step_inline:nnn - { \bool_if:NTF \g_@@_NiceArray_bool 1 2 } - { \bool_if:NTF \g_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } + { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } + { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@jCol } \c@jCol } { \tl_if_eq:NnF \l_@@_vlines_clist { all } { \clist_if_in:NnT \l_@@_vlines_clist { ##1 } } @@ -12939,8 +13167,8 @@ version 2005/12/01 or later. \cs_new_protected:Npn \@@_draw_hlines: { \int_step_inline:nnn - { \bool_if:NTF \g_@@_NiceArray_bool 1 2 } - { \bool_if:NTF \g_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow } + { \bool_if:NTF \l_@@_NiceArray_bool 1 2 } + { \bool_if:NTF \l_@@_NiceArray_bool { \@@_succ:n \c@iRow } \c@iRow } { \tl_if_eq:NnF \l_@@_hlines_clist { all } { \clist_if_in:NnT \l_@@_hlines_clist { ##1 } } @@ -13377,14 +13605,14 @@ version 2005/12/01 or later. % We do a reduction by |\arraycolsep| for the environments with delimiters (and % not for the other). % \begin{macrocode} - \bool_if:NTF \g_@@_NiceArray_bool \c_zero_dim \arraycolsep + \bool_if:NTF \l_@@_NiceArray_bool \c_zero_dim \arraycolsep - \l_@@_left_margin_dim } \@@_qpoint:n { col - \@@_succ:n \c@jCol } \dim_set:Nn \l_@@_x_final_dim { \pgf@x - - \bool_if:NTF \g_@@_NiceArray_bool \c_zero_dim \arraycolsep + \bool_if:NTF \l_@@_NiceArray_bool \c_zero_dim \arraycolsep + \l_@@_right_margin_dim } % \end{macrocode} @@ -13545,7 +13773,8 @@ version 2005/12/01 or later. } % \end{macrocode} % -% \bigskip +% +% % \subsection*{The extra nodes} % % First, two variants of the functions |\dim_min:nn| and |\dim_max:nn|. @@ -13558,7 +13787,7 @@ version 2005/12/01 or later. % \bigskip % The following command is called in |\@@_use_arraybox_with_notes_c:| just % before the construction of the blocks (if the creation of medium nodes is -% required, medium nodes are also created for the blocks dans that construction +% required, medium nodes are also created for the blocks and that construction % uses the standard medium nodes). % \begin{macrocode} \cs_new_protected:Npn \@@_create_extra_nodes: @@ -14570,7 +14799,7 @@ version 2005/12/01 or later. % % \medskip % If the creation of the ``medium nodes'' is required, we create a ``medium -% node'' for the block. The function |\@@_pgf_rect_node:nnnnn| takes in as +% node'' for the block. The function |\@@_pgf_rect_node:nnn| takes in as % arguments the name of the node and two \textsc{pgf} points. % \begin{macrocode} \bool_if:NT \l_@@_medium_nodes_bool @@ -15013,13 +15242,14 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% We define also an command |\AutoNiceMatrix| similar to the environment |{NiceMatrix}|. +% We define also a command |\AutoNiceMatrix| similar to the environment |{NiceMatrix}|. % \begin{macrocode} \NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } } { - \bool_gset_true:N \g_@@_NiceArray_bool + \group_begin: + \bool_set_true:N \l_@@_NiceArray_bool \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ] - \bool_gset_false: \g_@@_NiceArray_bool + \group_end: } % \end{macrocode} % @@ -16010,17 +16240,6 @@ version 2005/12/01 or later. % \end{macrocode} % % -% \medskip -% The following message will be deleted when we will delete the key -% |delimiters-color| (and keep only the key |delimiters/color|). -% \begin{macrocode} -\@@_msg_new:nn { delimiters-color deleted } - { - The~key~'delimiters-color'~has~been~renamed~'delimiters/color'.\\ - ~However,~you~can~go~on~for~this~time. - } -% \end{macrocode} -% % \begin{macrocode} \seq_new:N \c_@@_types_of_matrix_seq \seq_set_from_clist:Nn \c_@@_types_of_matrix_seq @@ -16579,7 +16798,7 @@ version 2005/12/01 or later. create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ - delimiters/color,~ + delimiters~(several~subkeys),~ end-of-row,~ first-col,~ first-row,~ @@ -16689,7 +16908,7 @@ version 2005/12/01 or later. create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ - delimiters/color,~ + delimiters~(several~subkeys),~ extra-left-margin,~ extra-right-margin,~ first-col,~ @@ -17271,6 +17490,9 @@ version 2005/12/01 or later. % It's now possible to specify delimiters for submatrices in the preamble of an % environment. % +% +% \subsection*{Changes between versions 5.15 and 5.16} +% % \PrintIndex % % \tableofcontents diff --git a/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty b/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty index 1f21908183f..f8439a04692 100644 --- a/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty +++ b/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty @@ -18,8 +18,8 @@ %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% -\def\myfileversion{5.15} -\def\myfiledate{2021/04/25} +\def\myfileversion{5.15a} +\def\myfiledate{2021/05/06} \RequirePackage{pgfcore} \usepgfmodule{shapes} \RequirePackage{l3keys2e} @@ -256,6 +256,8 @@ { \pgfpointanchor { \__nicematrix_env: - #1 } { center } } \int_new:N \g__nicematrix_NiceMatrixBlock_int \dim_new:N \l__nicematrix_columns_width_dim +\int_new:N \g__nicematrix_row_total_int +\int_new:N \g__nicematrix_col_total_int \tl_new:N \l__nicematrix_cell_type_tl \tl_set:Nn \l__nicematrix_cell_type_tl { c } \dim_new:N \g__nicematrix_blocks_wd_dim @@ -263,7 +265,7 @@ \dim_new:N \g__nicematrix_blocks_dp_dim \seq_new:N \g__nicematrix_names_seq \bool_new:N \l__nicematrix_in_env_bool -\bool_new:N \g__nicematrix_NiceArray_bool +\bool_new:N \l__nicematrix_NiceArray_bool \bool_new:N \l__nicematrix_NiceTabular_bool \dim_new:N \l__nicematrix_tabular_width_dim \bool_new:N \l__nicematrix_Matrix_bool @@ -386,7 +388,7 @@ } \NewDocumentCommand \tabularnote { m } { - \bool_if:nTF { ! \g__nicematrix_NiceArray_bool && \l__nicematrix_in_env_bool } + \bool_if:nTF { ! \l__nicematrix_NiceArray_bool && \l__nicematrix_in_env_bool } { \__nicematrix_error:n { tabularnote~forbidden } } { \int_incr:N \l__nicematrix_number_of_notes_int @@ -490,6 +492,7 @@ \AtBeginDocument { \dim_set:Nn \l__nicematrix_notes_above_space_dim { 1 mm } } \bool_new:N \l__nicematrix_nullify_dots_bool \bool_new:N \l__nicematrix_auto_columns_width_bool +\bool_new:N \g__nicematrix_recreate_cell_nodes_bool \str_new:N \l__nicematrix_name_str \bool_new:N \l__nicematrix_medium_nodes_bool \bool_new:N \l__nicematrix_large_nodes_bool @@ -531,6 +534,9 @@ } \keys_define:nn { NiceMatrix / Global } { + delimiters .code:n = + \keys_set:nn { NiceMatrix / delimiters } { #1 } , + delimiters .value_required:n = true , rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , rules .value_required:n = true , standard-cline .bool_set:N = \l__nicematrix_standard_cline_bool , @@ -600,7 +606,7 @@ } \keys_define:nn { NiceMatrix / Env } { - delimiters/max-width .bool_set:N = \l__nicematrix_delimiters_max_width_bool , + hvlines-except-corners .code:n = { \clist_set:Nn \l__nicematrix_corners_clist { #1 } @@ -697,6 +703,13 @@ enumitem-keys-para .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~notes } } +\keys_define:nn { NiceMatrix / delimiters } + { + max-width .bool_set:N = \l__nicematrix_delimiters_max_width_bool , + max-width .default:n = true , + color .tl_set:N = \l__nicematrix_delimiters_color_tl , + color .value_required:n = true , + } \keys_define:nn { NiceMatrix } { NiceMatrixOptions .inherit:n = @@ -704,6 +717,7 @@ NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots , NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules , NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes , + NiceMatrixOptions / delimiters .inherit:n = NiceMatrix / delimiters , NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix , SubMatrix / rules .inherit:n = NiceMatrix / rules , CodeAfter / xdots .inherit:n = NiceMatrix / xdots , @@ -714,6 +728,7 @@ } , NiceMatrix / xdots .inherit:n = NiceMatrix / xdots , NiceMatrix / rules .inherit:n = NiceMatrix / rules , + NiceMatrix / delimiters .inherit:n = NiceMatrix / delimiters , NiceTabular .inherit:n = { NiceMatrix / Global , @@ -721,6 +736,7 @@ } , NiceTabular / xdots .inherit:n = NiceMatrix / xdots , NiceTabular / rules .inherit:n = NiceMatrix / rules , + NiceTabular / delimiters .inherit:n = NiceMatrix / delimiters , NiceArray .inherit:n = { NiceMatrix / Global , @@ -728,6 +744,7 @@ } , NiceArray / xdots .inherit:n = NiceMatrix / xdots , NiceArray / rules .inherit:n = NiceMatrix / rules , + NiceArray / delimiters .inherit:n = NiceMatrix / delimiters , pNiceArray .inherit:n = { NiceMatrix / Global , @@ -735,16 +752,10 @@ } , pNiceArray / xdots .inherit:n = NiceMatrix / xdots , pNiceArray / rules .inherit:n = NiceMatrix / rules , + pNiceArray / delimiters .inherit:n = NiceMatrix / delimiters , } \keys_define:nn { NiceMatrix / NiceMatrixOptions } { - delimiters / max-width .bool_set:N = \l__nicematrix_delimiters_max_width_bool , - delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl , - delimiters / color .value_required:n = true , - delimiters-color .code:n = - \tl_set:Nn \l__nicematrix_delimiters_color_tl { #1 } - \__nicematrix_error:n { delimiters-color deleted } , - delimiters-color .value_required:n = true , last-col .code:n = \tl_if_empty:nF { #1 } { \__nicematrix_error:n { last-col~non~empty~for~NiceMatrixOptions } } \int_zero:N \l__nicematrix_last_col_int , @@ -797,12 +808,6 @@ r .code:n = \tl_set:Nn \l__nicematrix_type_of_col_tl r , small .bool_set:N = \l__nicematrix_small_bool , small .value_forbidden:n = true , - delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl , - delimiters / color .value_required:n = true , - delimiters-color .code:n = - \tl_set:Nn \l__nicematrix_delimiters_color_tl { #1 } - \__nicematrix_error:n { delimiters-color deleted } , - delimiters-color .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~option~for~NiceMatrix } } \keys_define:nn { NiceMatrix / NiceArray } @@ -818,11 +823,6 @@ notes / bottomrule .default:n = true , tabularnote .tl_set:N = \l__nicematrix_tabularnote_tl , tabularnote .value_required:n = true , - delimiters-color .code:n = - \tl_set:Nn \l__nicematrix_delimiters_color_tl { #1 } - \__nicematrix_error:n { delimiters-color deleted } , - delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl , - delimiters / color .value_required:n = true , r .code:n = \__nicematrix_error:n { r~or~l~with~preamble } , l .code:n = \__nicematrix_error:n { r~or~l~with~preamble } , unknown .code:n = \__nicematrix_error:n { Unknown~option~for~NiceArray } @@ -973,14 +973,14 @@ \bool_lazy_or:nnTF \g__nicematrix_not_empty_cell_bool { \dim_compare_p:nNn { \box_wd:N \l__nicematrix_cell_box } > \c_zero_dim } - \__nicematrix_node_for_the_cell: + \__nicematrix_node_for_cell: { \box_use_drop:N \l__nicematrix_cell_box } } \int_gset:Nn \g__nicematrix_col_total_int { \int_max:nn \g__nicematrix_col_total_int \c@jCol } \bool_gset_false:N \g__nicematrix_empty_cell_bool \bool_gset_false:N \g__nicematrix_not_empty_cell_bool } -\cs_new_protected:Npn \__nicematrix_node_for_the_cell: +\cs_new_protected:Npn \__nicematrix_node_for_cell: { \pgfpicture \pgfsetbaseline \c_zero_dim @@ -1004,6 +1004,36 @@ } \endpgfpicture } +\cs_new_protected:Npn \__nicematrix_patch_node_for_cell:n #1 + { + \cs_new_protected:Npn \__nicematrix_patch_node_for_cell: + { + \hbox_set:Nn \l__nicematrix_cell_box + { + \box_move_up:nn { \box_ht:N \l__nicematrix_cell_box} + \hbox_overlap_left:n + { + \pgfsys@markposition + { \__nicematrix_env: - \int_use:N \c@iRow - \int_use:N \c@jCol - NW } + #1 + } + \box_use:N \l__nicematrix_cell_box + \box_move_down:nn { \box_dp:N \l__nicematrix_cell_box } + \hbox_overlap_left:n + { + \pgfsys@markposition + { \__nicematrix_env: - \int_use:N \c@iRow - \int_use:N \c@jCol - SE } + #1 + } + } + } + } +\bool_lazy_or:nnTF \sys_if_engine_xetex_p: \sys_if_output_dvi_p: + { + \__nicematrix_patch_node_for_cell:n + { \skip_horizontal:n { 0.5 \box_wd:N \l__nicematrix_cell_box } } + } + { \__nicematrix_patch_node_for_cell:n { } } \cs_new_protected:Npn \__nicematrix_instruction_of_type:nnn #1 #2 #3 { \bool_if:nTF { #1 } \tl_gput_left:cx \tl_gput_right:cx @@ -1205,73 +1235,7 @@ \cs_new_protected:Npn \__nicematrix_pre_array: { \seq_gclear:N \g__nicematrix_submatrix_seq - \bool_if:NT \l__nicematrix_code_before_bool - { - \seq_if_exist:cT - { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq } - { - \seq_set_eq:Nc \l__nicematrix_corners_cells_seq - { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq } - } - \seq_if_exist:cT { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } - { - \int_zero_new:N \c@iRow - \int_set:Nn \c@iRow - { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 2 } - \int_zero_new:N \c@jCol - \int_set:Nn \c@jCol - { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 4 } - \int_compare:nNnF \l__nicematrix_last_row_int = { -2 } - { \int_decr:N \c@iRow } - \int_compare:nNnF \l__nicematrix_last_col_int = { -2 } - { \int_decr:N \c@jCol } - \pgfsys@markposition { \__nicematrix_env: - position } - \pgfsys@getposition { \__nicematrix_env: - position } \__nicematrix_picture_position: - \pgfpicture - \int_step_inline:nnn - { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 1 } - { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 2 + 1 } - { - \pgfsys@getposition { \__nicematrix_env: - row - ##1 } \__nicematrix_node_position: - \pgfcoordinate { \__nicematrix_env: - row - ##1 } - { \pgfpointdiff \__nicematrix_picture_position: \__nicematrix_node_position: } - } - \int_step_inline:nnn - { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 3 } - { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 4 + 1 } - { - \pgfsys@getposition { \__nicematrix_env: - col - ##1 } \__nicematrix_node_position: - \pgfcoordinate { \__nicematrix_env: - col - ##1 } - { \pgfpointdiff \__nicematrix_picture_position: \__nicematrix_node_position: } - } - \endpgfpicture - \__nicematrix_create_diag_nodes: - \group_begin: - \bool_if:NT \c__nicematrix_tikz_loaded_bool - { - \tikzset - { - every~picture / .style = - { overlay , name~prefix = \__nicematrix_env: - } - } - } - \cs_set_eq:NN \cellcolor \__nicematrix_cellcolor - \cs_set_eq:NN \rectanglecolor \__nicematrix_rectanglecolor - \cs_set_eq:NN \roundedrectanglecolor \__nicematrix_roundedrectanglecolor - \cs_set_eq:NN \rowcolor \__nicematrix_rowcolor - \cs_set_eq:NN \rowcolors \__nicematrix_rowcolors - \cs_set_eq:NN \arraycolor \__nicematrix_arraycolor - \cs_set_eq:NN \columncolor \__nicematrix_columncolor - \cs_set_eq:NN \chessboardcolors \__nicematrix_chessboardcolors - \cs_set_eq:NN \SubMatrix \__nicematrix_SubMatrix_in_code_before - \bool_if:NT \l__nicematrix_NiceTabular_bool \c_math_toggle_token - \seq_gclear_new:N \g__nicematrix_colors_seq - \exp_last_unbraced:NV \__nicematrix_CodeAfter_keys: \l__nicematrix_code_before_tl - \__nicematrix_actually_color: - \bool_if:NT \l__nicematrix_NiceTabular_bool \c_math_toggle_token - \group_end: - } - } + \bool_if:NT \l__nicematrix_code_before_bool \__nicematrix_exec_code_before: \int_compare:nNnT \l__nicematrix_last_row_int > { -2 } { \tl_put_right:Nn \__nicematrix_update_for_first_and_last_row: @@ -1325,7 +1289,7 @@ \__nicematrix_construct_preamble: \dim_zero_new:N \l__nicematrix_left_delim_dim \dim_zero_new:N \l__nicematrix_right_delim_dim - \bool_if:NTF \g__nicematrix_NiceArray_bool + \bool_if:NTF \l__nicematrix_NiceArray_bool { \dim_gset:Nn \l__nicematrix_left_delim_dim { 2 \arraycolsep } \dim_gset:Nn \l__nicematrix_right_delim_dim { 2 \arraycolsep } @@ -1350,6 +1314,128 @@ \bool_set_true:N \l__nicematrix_code_before_bool \__nicematrix_pre_array: } +\cs_new_protected:Npn \__nicematrix_pre_code_before: + { + \int_zero_new:N \c@iRow + \int_set:Nn \c@iRow + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 2 } + \int_zero_new:N \c@jCol + \int_set:Nn \c@jCol + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 4 } + \int_compare:nNnF \l__nicematrix_last_row_int = { -2 } + { \int_decr:N \c@iRow } + \int_compare:nNnF \l__nicematrix_last_col_int = { -2 } + { \int_decr:N \c@jCol } + \pgfsys@markposition { \__nicematrix_env: - position } + \pgfsys@getposition { \__nicematrix_env: - position } \__nicematrix_picture_position: + \pgfpicture + \pgf@relevantforpicturesizefalse + \int_step_inline:nnn + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 1 } + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 2 + 1 } + { + \pgfsys@getposition { \__nicematrix_env: - row - ##1 } \__nicematrix_node_position: + \pgfcoordinate { \__nicematrix_env: - row - ##1 } + { \pgfpointdiff \__nicematrix_picture_position: \__nicematrix_node_position: } + } + \int_step_inline:nnn + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 3 } + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 4 + 1 } + { + \pgfsys@getposition { \__nicematrix_env: - col - ##1 } \__nicematrix_node_position: + \pgfcoordinate { \__nicematrix_env: - col - ##1 } + { \pgfpointdiff \__nicematrix_picture_position: \__nicematrix_node_position: } + } + \__nicematrix_create_diag_nodes: + \bool_if:NT \g__nicematrix_recreate_cell_nodes_bool \__nicematrix_recreate_cell_nodes: + \endpgfpicture + \bool_if:NT \c__nicematrix_tikz_loaded_bool + { + \tikzset + { + every~picture / .style = + { overlay , name~prefix = \__nicematrix_env: - } + } + } + \cs_set_eq:NN \cellcolor \__nicematrix_cellcolor + \cs_set_eq:NN \rectanglecolor \__nicematrix_rectanglecolor + \cs_set_eq:NN \roundedrectanglecolor \__nicematrix_roundedrectanglecolor + \cs_set_eq:NN \rowcolor \__nicematrix_rowcolor + \cs_set_eq:NN \rowcolors \__nicematrix_rowcolors + \cs_set_eq:NN \arraycolor \__nicematrix_arraycolor + \cs_set_eq:NN \columncolor \__nicematrix_columncolor + \cs_set_eq:NN \chessboardcolors \__nicematrix_chessboardcolors + \cs_set_eq:NN \SubMatrix \__nicematrix_SubMatrix_in_code_before + \seq_if_exist:cT + { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq } + { + \seq_set_eq:Nc \l__nicematrix_corners_cells_seq + { c__nicematrix_corners_cells_ \int_use:N \g__nicematrix_env_int _ seq } + } + } +\cs_new_protected:Npn \__nicematrix_exec_code_before: + { + \seq_gclear_new:N \g__nicematrix_colors_seq + \bool_gset_false:N \g__nicematrix_recreate_cell_nodes_bool + \group_begin: + \bool_if:NT \l__nicematrix_NiceTabular_bool \c_math_toggle_token + \exp_last_unbraced:NV \__nicematrix_CodeBefore_keys: \l__nicematrix_code_before_tl \q_stop + \__nicematrix_actually_color: + \bool_if:NT \l__nicematrix_NiceTabular_bool \c_math_toggle_token + \group_end: + \bool_if:NT \g__nicematrix_recreate_cell_nodes_bool + { \tl_put_left:Nn \__nicematrix_node_for_cell: \__nicematrix_patch_node_for_cell: } + } +\keys_define:nn { NiceMatrix / CodeBefore } + { + create-cell-nodes .bool_gset:N = \g__nicematrix_recreate_cell_nodes_bool , + create-cell-nodes .default:n = true , + sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , + sub-matrix .value_required:n = true , + delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl , + delimiters / color .value_required:n = true , + unknown .code:n = \__nicematrix_error:n { Unknown~key~for~CodeAfter } + } +\NewDocumentCommand \__nicematrix_CodeBefore_keys: { O { } } + { + \keys_set:nn { NiceMatrix / CodeBefore } { #1 } + \__nicematrix_CodeBefore:w + } +\cs_new_protected:Npn \__nicematrix_CodeBefore:w #1 \q_stop + { + \seq_if_exist:cT { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } + { + \__nicematrix_pre_code_before: + #1 + } + } +\cs_new_protected:Npn \__nicematrix_recreate_cell_nodes: + { + \int_step_inline:nnn + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 1 } + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 2 } + { + \int_step_inline:nnn + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 3 } + { \seq_item:cn { __nicematrix_size_ \int_use:N \g__nicematrix_env_int _ seq } 4 } + { + \cs_if_exist:cT + { pgf @ sys @ pdf @ mark @ pos @ \__nicematrix_env: - ##1 - ####1 - NW } + { + \pgfsys@getposition + { \__nicematrix_env: - ##1 - ####1 - NW } + \__nicematrix_node_position: + \pgfsys@getposition + { \__nicematrix_env: - ##1 - ####1 - SE } + \__nicematrix_node_position_i: + \__nicematrix_pgf_rect_node:nnn + { \__nicematrix_env: - ##1 - ####1 } + { \pgfpointdiff \__nicematrix_picture_position: \__nicematrix_node_position: } + { \pgfpointdiff \__nicematrix_picture_position: \__nicematrix_node_position_i: } + } + } + } + } \NewDocumentEnvironment { NiceArrayWithDelims } { m m O { } m ! O { } t \CodeBefore } { @@ -1391,7 +1477,7 @@ \exp_args:NNv \tl_put_right:Nn \l__nicematrix_code_before_tl { g__nicematrix_code_before_ \int_use:N \g__nicematrix_env_int _ tl } } - \bool_if:NTF \g__nicematrix_NiceArray_bool + \bool_if:NTF \l__nicematrix_NiceArray_bool { \keys_set:nn { NiceMatrix / NiceArray } } { \keys_set:nn { NiceMatrix / pNiceArray } } { #3 , #5 } @@ -1432,7 +1518,7 @@ \skip_horizontal:N \col@sep \skip_horizontal:N \g__nicematrix_width_first_col_dim } - \bool_if:NTF \g__nicematrix_NiceArray_bool + \bool_if:NTF \l__nicematrix_NiceArray_bool { \str_case:VnF \l__nicematrix_baseline_tl { @@ -1509,9 +1595,9 @@ { \group_begin: \bool_if:NF \l__nicematrix_Matrix_bool - { - \__nicematrix_newcolumntype w [ 2 ] { \__nicematrix_w: { ##1 } { ##2 } } - \__nicematrix_newcolumntype W [ 2 ] { \__nicematrix_W: { ##1 } { ##2 } } + { + \__nicematrix_newcolumntype w [ 2 ] { \__nicematrix_w: { ##1 } { ##2 } } + \__nicematrix_newcolumntype W [ 2 ] { \__nicematrix_W: { ##1 } { ##2 } } \exp_args:NV \@temptokena \g__nicematrix_preamble_tl \@tempswatrue \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } @@ -1531,9 +1617,7 @@ } \seq_clear:N \g__nicematrix_cols_vlism_seq \int_zero:N \l_tmpa_int - \bool_set_false:N \l_tmpa_bool \exp_after:wN \__nicematrix_patch_preamble:n \the \@temptokena \q_stop - \bool_if:NT \l_tmpa_bool { \bool_gset_false:N \g__nicematrix_NiceArray_bool } \int_gset_eq:NN \g__nicematrix_static_num_of_col_int \c@jCol } \bool_if:NT \l__nicematrix_colortbl_like_bool @@ -1543,12 +1627,17 @@ { \c { __nicematrix_columncolor_preamble } } \g__nicematrix_preamble_tl } + \group_end: + \bool_lazy_or:nnT + { ! \str_if_eq_p:Vn \g__nicematrix_left_delim_tl { . } } + { ! \str_if_eq_p:Vn \g__nicematrix_right_delim_tl { . } } + { \bool_set_false:N \l__nicematrix_NiceArray_bool } \int_compare:nNnTF \l__nicematrix_first_col_int = 0 { \tl_gput_left:NV \g__nicematrix_preamble_tl \c__nicematrix_preamble_first_col_tl } { \bool_lazy_all:nT { - \g__nicematrix_NiceArray_bool + \l__nicematrix_NiceArray_bool { \bool_not_p:n \l__nicematrix_NiceTabular_bool } { \tl_if_empty_p:N \l__nicematrix_vlines_clist } { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool } @@ -1560,7 +1649,7 @@ { \bool_lazy_all:nT { - \g__nicematrix_NiceArray_bool + \l__nicematrix_NiceArray_bool { \bool_not_p:n \l__nicematrix_NiceTabular_bool } { \tl_if_empty_p:N \l__nicematrix_vlines_clist } { \bool_not_p:n \l__nicematrix_exterior_arraycolsep_bool } @@ -1572,7 +1661,6 @@ \tl_gput_right:Nn \g__nicematrix_preamble_tl { > { \__nicematrix_error_too_much_cols: } l } } - \group_end: } \cs_new_protected:Npn \__nicematrix_patch_preamble:n #1 { @@ -1591,9 +1679,9 @@ \__nicematrix_w: { \__nicematrix_patch_preamble_v:nnnn { } #1 } \__nicematrix_W: { \__nicematrix_patch_preamble_v:nnnn { \cs_set_eq:NN \hss \hfil } #1 } \__nicematrix_true_c: { \__nicematrix_patch_preamble_vi:n #1 } - ( { \__nicematrix_patch_preamble_vii:n #1 } - [ { \__nicematrix_patch_preamble_vii:n #1 } - \{ { \__nicematrix_patch_preamble_vii:n #1 } + ( { \__nicematrix_patch_preamble_vii:nn #1 } + [ { \__nicematrix_patch_preamble_vii:nn #1 } + \{ { \__nicematrix_patch_preamble_vii:nn #1 } ) { \__nicematrix_patch_preamble_viii:nn #1 } ] { \__nicematrix_patch_preamble_viii:nn #1 } \} { \__nicematrix_patch_preamble_viii:nn #1 } @@ -1722,60 +1810,50 @@ \int_gincr:N \c@jCol \__nicematrix_patch_preamble_x:n } -\cs_new_protected:Npn \__nicematrix_patch_preamble_vii:n #1 +\cs_new_protected:Npn \__nicematrix_patch_preamble_vii:nn #1 #2 { - \bool_if:NT \l__nicematrix_small_bool - { \__nicematrix_fatal:n { Delimiter~with~small } } + \bool_if:NT \l__nicematrix_small_bool { \__nicematrix_fatal:n { Delimiter~with~small } } \int_compare:nNnTF \c@jCol = \c_zero_int { - \bool_if:NTF \g__nicematrix_NiceArray_bool + \str_if_eq:VnTF \g__nicematrix_left_delim_tl { . } { \tl_gset:Nn \g__nicematrix_left_delim_tl { #1 } \tl_gset:Nn \g__nicematrix_right_delim_tl { . } - \bool_set_true:N \l_tmpa_bool - \__nicematrix_patch_preamble:n + \__nicematrix_patch_preamble:n #2 } { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_delimiter:nnn #1 { \__nicematrix_succ:n \c@jCol } \c_true_bool } - \__nicematrix_patch_preamble_vii_i:n + \tl_if_in:nnTF { ( [ \{ ) ] \} } { #2 } + { + \__nicematrix_error:nn { delimiter~after~opening } { #2 } + \__nicematrix_patch_preamble:n + } + { \__nicematrix_patch_preamble:n #2 } } } { \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_delimiter:nnn #1 { \__nicematrix_succ:n \c@jCol } \c_true_bool } - \__nicematrix_patch_preamble_vii_i:n - } - } -\cs_new_protected:Npn \__nicematrix_patch_preamble_vii_i:n #1 - { - \tl_if_in:nnTF { ( [ \{ ) ] \} } { #1 } - { - \__nicematrix_error:nn { delimiter~after~opening } { #1 } - \__nicematrix_patch_preamble:n + \tl_if_in:nnTF { ( [ \{ ) ] \} } { #2 } + { + \__nicematrix_error:nn { delimiter~after~opening } { #2 } + \__nicematrix_patch_preamble:n + } + { \__nicematrix_patch_preamble:n #2 } } - { \__nicematrix_patch_preamble:n #1 } } \cs_new_protected:Npn \__nicematrix_patch_preamble_viii:nn #1 #2 { - \bool_if:NT \l__nicematrix_small_bool - { \__nicematrix_fatal:n { Delimiter~with~small } } + \bool_if:NT \l__nicematrix_small_bool { \__nicematrix_fatal:n { Delimiter~with~small } } \tl_if_in:nnTF { ) ] \} } { #2 } - { - \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl - { \__nicematrix_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } - \__nicematrix_error:nn { double~closing~delimiter } { #2 } - \__nicematrix_patch_preamble:n - } + { \__nicematrix_patch_preamble_viii_i:nnn #1 #2 } { \tl_if_eq:nnTF { \q_stop } { #2 } { - \bool_if:NTF \g__nicematrix_NiceArray_bool - { - \tl_gset:Nn \g__nicematrix_right_delim_tl { #1 } - \bool_set_true:N \l_tmpa_bool - } + \str_if_eq:VnTF \g__nicematrix_right_delim_tl { . } + { \tl_gset:Nn \g__nicematrix_right_delim_tl { #1 } } { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl @@ -1792,6 +1870,31 @@ } } } +\cs_new_protected:Npn \__nicematrix_patch_preamble_viii_i:nnn #1 #2 #3 + { + \tl_if_eq:nnTF { \q_stop } { #3 } + { + \str_if_eq:VnTF \g__nicematrix_right_delim_tl { . } + { + \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } + \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl + { \__nicematrix_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } + \tl_gset:Nn \g__nicematrix_right_delim_tl { #2 } + } + { + \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } + \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl + { \__nicematrix_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } + \__nicematrix_error:nn { double~closing~delimiter } { #2 } + } + } + { + \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl + { \__nicematrix_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } + \__nicematrix_error:nn { double~closing~delimiter } { #2 } + \__nicematrix_patch_preamble:n #3 + } + } \cs_new_protected:Npn \__nicematrix_patch_preamble_xi:n #1 { \tl_gput_right:Nn \g__nicematrix_preamble_tl @@ -2250,7 +2353,7 @@ \hbox_overlap_left:n { \dim_compare:nNnTF { \box_wd:N \l__nicematrix_cell_box } > \c_zero_dim - \__nicematrix_node_for_the_cell: + \__nicematrix_node_for_cell: { \box_use_drop:N \l__nicematrix_cell_box } \skip_horizontal:N \l__nicematrix_left_delim_dim \skip_horizontal:N \l__nicematrix_left_margin_dim @@ -2300,7 +2403,7 @@ \skip_horizontal:N \l__nicematrix_right_delim_dim \skip_horizontal:N \l__nicematrix_right_margin_dim \skip_horizontal:N \l__nicematrix_extra_right_margin_dim - \__nicematrix_node_for_the_cell: + \__nicematrix_node_for_cell: } } \bool_gset_false:N \g__nicematrix_empty_cell_bool @@ -2308,7 +2411,7 @@ } \NewDocumentEnvironment { NiceArray } { } { - \bool_gset_true:N \g__nicematrix_NiceArray_bool + \bool_set_true:N \l__nicematrix_NiceArray_bool \str_if_empty:NT \g__nicematrix_name_env_str { \str_gset:Nn \g__nicematrix_name_env_str { NiceArray } } \NiceArrayWithDelims . . @@ -2443,6 +2546,7 @@ { c__nicematrix_pos_of_blocks_ \int_use:N \g__nicematrix_env_int _ seq } { \seq_use:Nnnn \g__nicematrix_pos_of_blocks_seq , , , } } + \iow_now:Nn \@mainaux \ExplSyntaxOff } \__nicematrix_create_diag_nodes: \bool_if:NT \l__nicematrix_parallelize_diags_bool @@ -2517,7 +2621,7 @@ \iow_now:Nn \@mainaux \ExplSyntaxOff \bool_set_true:N \l__nicematrix_code_before_bool } - \bool_gset_false:N \g__nicematrix_NiceArray_bool + % \bool_if:NT \l__nicematrix_code_before_bool \__nicematrix_write_aux_for_cell_nodes: \str_gclear:N \g__nicematrix_name_env_str \__nicematrix_restore_iRow_jCol: \cs_gset_eq:NN \CT@arc@ \__nicematrix_old_CT@arc@ @@ -2579,6 +2683,49 @@ \anchor { 5 } { \five } \anchor { center } { \pgfpointorigin } } +\cs_new_protected:Npn \__nicematrix_write_aux_for_cell_nodes: + { + \pgfpicture + \pgfrememberpicturepositiononpagetrue + \pgf@relevantforpicturesizefalse + \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int + { + \int_step_inline:nnn \l__nicematrix_first_col_int \g__nicematrix_col_total_int + { + \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - ####1 } + { + \pgfscope + \pgftransformshift + { \pgfpointanchor { \__nicematrix_env: - ##1 - ####1 } { north~west } } + \pgfnode + { rectangle } + { center } + { + \hbox + { \pgfsys@markposition { \__nicematrix_env: - ##1 - ####1 - NW } } + } + { } + { } + \endpgfscope + \pgfscope + \pgftransformshift + { \pgfpointanchor { \__nicematrix_env: - ##1 - ####1 } { south~east } } + \pgfnode + { rectangle } + { center } + { + \hbox + { \pgfsys@markposition { \__nicematrix_env: - ##1 - ####1 - SE } } + } + { } + { } + \endpgfscope + } + } + } + \endpgfpicture + \__nicematrix_create_extra_nodes: + } \cs_new_protected:Npn \__nicematrix_create_diag_nodes: { \pgfpicture @@ -4206,8 +4353,8 @@ \cs_new_protected:Npn \__nicematrix_draw_vlines: { \int_step_inline:nnn - { \bool_if:NTF \g__nicematrix_NiceArray_bool 1 2 } - { \bool_if:NTF \g__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c@jCol } \c@jCol } + { \bool_if:NTF \l__nicematrix_NiceArray_bool 1 2 } + { \bool_if:NTF \l__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c@jCol } \c@jCol } { \tl_if_eq:NnF \l__nicematrix_vlines_clist { all } { \clist_if_in:NnT \l__nicematrix_vlines_clist { ##1 } } @@ -4329,8 +4476,8 @@ \cs_new_protected:Npn \__nicematrix_draw_hlines: { \int_step_inline:nnn - { \bool_if:NTF \g__nicematrix_NiceArray_bool 1 2 } - { \bool_if:NTF \g__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c@iRow } \c@iRow } + { \bool_if:NTF \l__nicematrix_NiceArray_bool 1 2 } + { \bool_if:NTF \l__nicematrix_NiceArray_bool { \__nicematrix_succ:n \c@iRow } \c@iRow } { \tl_if_eq:NnF \l__nicematrix_hlines_clist { all } { \clist_if_in:NnT \l__nicematrix_hlines_clist { ##1 } } @@ -4547,14 +4694,14 @@ \dim_set:Nn \l__nicematrix_x_initial_dim { \pgf@x + - \bool_if:NTF \g__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep + \bool_if:NTF \l__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep - \l__nicematrix_left_margin_dim } \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \c@jCol } \dim_set:Nn \l__nicematrix_x_final_dim { \pgf@x - - \bool_if:NTF \g__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep + \bool_if:NTF \l__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep + \l__nicematrix_right_margin_dim } \tl_if_eq:NnF \g__nicematrix_left_delim_tl ( @@ -5536,9 +5683,10 @@ \__nicematrix_define_com:nnn B \{ \} \NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } } { - \bool_gset_true:N \g__nicematrix_NiceArray_bool + \group_begin: + \bool_set_true:N \l__nicematrix_NiceArray_bool \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ] - \bool_gset_false: \g__nicematrix_NiceArray_bool + \group_end: } \cs_set_eq:NN \__nicematrix_old_dotfill \dotfill \cs_new_protected:Npn \__nicematrix_dotfill: @@ -6130,11 +6278,6 @@ the~key~'corners'~in~your~\__nicematrix_full_name_env:.\\ If~you~go~on,~this~key~will~be~ignored. } -\__nicematrix_msg_new:nn { delimiters-color deleted } - { - The~key~'delimiters-color'~has~been~renamed~'delimiters/color'.\\ - ~However,~you~can~go~on~for~this~time. - } \seq_new:N \c__nicematrix_types_of_matrix_seq \seq_set_from_clist:Nn \c__nicematrix_types_of_matrix_seq { @@ -6518,7 +6661,7 @@ create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ - delimiters/color,~ + delimiters~(several~subkeys),~ end-of-row,~ first-col,~ first-row,~ @@ -6618,7 +6761,7 @@ create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ - delimiters/color,~ + delimiters~(several~subkeys),~ extra-left-margin,~ extra-right-margin,~ first-col,~ -- cgit v1.2.3