diff options
author | Karl Berry <karl@freefriends.org> | 2023-09-29 21:05:29 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-09-29 21:05:29 +0000 |
commit | a40c1b67ba5d7a6be3d8f1725ca0041b5956b353 (patch) | |
tree | 542eb940279fcdcddd5741a8606f3e149a55d48d /Master/texmf-dist/source/latex | |
parent | ff14c4fc4652aedeb907888df883eb9ad0e68340 (diff) |
nicematrix (29sep23)
git-svn-id: svn://tug.org/texlive/trunk@68398 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex')
-rw-r--r-- | Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx | 1093 |
1 files changed, 587 insertions, 506 deletions
diff --git a/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx b/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx index 9a4e6cc8639..8246cffbd8f 100644 --- a/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx +++ b/Master/texmf-dist/source/latex/nicematrix/nicematrix-code.dtx @@ -17,11 +17,11 @@ % % \fi % \iffalse -\def\myfileversion{6.23} -\def\myfiledate{2023/09/02} +\def\myfileversion{6.24} +\def\myfiledate{2023/09/28} % % -%<*batchfile> +%<*batchfile> \begingroup \input l3docstrip.tex \keepsilent @@ -708,40 +708,6 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% \textbf{The column S of siunitx}\par\nobreak -% -% The command |\@@_renew_NC@rewrite@S:| will be used in each environment of -% \pkg{nicematrix} in order to ``rewrite'' the |S| column in each environment. -% \begin{macrocode} -\hook_gput_code:nnn { begindocument } { . } - { - \IfPackageLoadedTF { siunitx } - { - \cs_new_protected:Npn \@@_renew_NC@rewrite@S: - { - \renewcommand*{\NC@rewrite@S}[1][] - { -% \end{macrocode} -% |\@temptokena| is a toks (not supported by the L3 programming layer). -% \begin{macrocode} - \tl_if_empty:nTF { ##1 } - { - \@temptokena \exp_after:wN - { \tex_the:D \@temptokena \@@_S: } - } - { - \@temptokena \exp_after:wN - { \tex_the:D \@temptokena \@@_S: [ ##1 ] } - } - \NC@find - } - } - } - { \cs_set_eq:NN \@@_renew_NC@rewrite@S: \prg_do_nothing: } - } -% \end{macrocode} -% -% \bigskip % \begin{macrocode} \cs_new_protected:Npn \@@_rescan_for_spanish:N #1 { @@ -965,6 +931,13 @@ version 2005/12/01 or later. % \begin{macrocode} \dim_new:N \l_@@_rule_width_dim % \end{macrocode} +% +% \bigskip +% The key |color| in a command of rule such as |\Hline| (or the specifier +% ``\verb+|+'' in the preamble of an environment). +% \begin{macrocode} +\tl_new:N \l_@@_rule_color_tl +% \end{macrocode} % % \bigskip % The following boolean will be raised when the command |\rotate| is used. @@ -1017,21 +990,32 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_new:N \g_@@_left_delim_tl \tl_new:N \g_@@_right_delim_tl +% \end{macrocode} +% +% \bigskip +% The token list |\g_@@_user_preamble_tl| will contain the preamble provided by +% the the final user of \pkg{nicematrix} (eg the preamble of an environment +% |{NiceTabular}|). +% \begin{macrocode} +\tl_new:N \g_@@_user_preamble_tl +% \end{macrocode} +% The token list |\g_@@_array_preamble_tl| will contain the preamble constructed +% by \pkg{nicematrix} for the environment |{array}| (of \pkg{array}). +% \begin{macrocode} +\tl_new:N \g_@@_array_preamble_tl +% \end{macrocode} +% For |\multicolumn|. +% \begin{macrocode} \tl_new:N \g_@@_preamble_tl % \end{macrocode} % % \bigskip % The following parameter corresponds to the key |columns-type| of the % environments |{NiceMatrix}|, |{pNiceMatrix}|, etc. and also the key -% |matrix / columns-type| of |\NiceMatrixOptions|. However, it does \emph{not} -% contain the value provided by the final user. Indeed, a transformation is done -% in order to have a preamble (for the package \pkg{array}) which is -% nicematrix-aware. That transformation is done with the command -% |\@@_set_preamble:Nn|. +% |matrix / columns-type| of |\NiceMatrixOptions|. % \begin{macrocode} \tl_new:N \l_@@_columns_type_tl -\hook_gput_code:nnn { begindocument } { . } - { \@@_set_preamble:Nn \l_@@_columns_type_tl { c } } +\tl_set:Nn \l_@@_columns_type_tl { c } % \end{macrocode} % % \bigskip @@ -1432,6 +1416,15 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_new:N \l_@@_color_tl % \end{macrocode} +% +% \medskip +% In the key |tikz| of a command |\Block| or in the argument of a command +% |\TikzEveryCell|, the final user puts a list of tikz keys. But, you have added +% another key, named |offset| (which means that an offset will be used for the +% frame of the block or the cell). The following parameter corresponds to that key. +% \begin{macrocode} +\dim_new:N \l_@@_offset_dim +% \end{macrocode} % % \medskip % Here is the dimension for the width of the rule when a block (created by @@ -2363,8 +2356,7 @@ version 2005/12/01 or later. \bool_new:N \l_@@_delimiters_max_width_bool % \end{macrocode} % -% \bigskip -% \begin{macrocode} +% % \bigskip % \begin{macrocode} \keys_define:nn { NiceMatrix / xdots } @@ -2663,6 +2655,7 @@ version 2005/12/01 or later. SubMatrix / rules .inherit:n = NiceMatrix / rules , CodeAfter / xdots .inherit:n = NiceMatrix / xdots , CodeBefore / sub-matrix .inherit:n = NiceMatrix / sub-matrix , + CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix , NiceMatrix .inherit:n = { NiceMatrix / Global , @@ -2759,8 +2752,7 @@ version 2005/12/01 or later. notes .value_required:n = true , sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , sub-matrix .value_required:n = true , - matrix / columns-type .code:n = - \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 }, + matrix / columns-type .tl_set:N = \l_@@_columns_type_tl , matrix / columns-type .value_required:n = true , caption-above .bool_set:N = \l_@@_caption_above_bool , caption-above .default:n = true , @@ -2794,7 +2786,7 @@ version 2005/12/01 or later. \int_set:Nn \l_@@_last_col_int { -1 } } { \int_set:Nn \l_@@_last_col_int { #1 } } , - columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } , + columns-type .tl_set:N = \l_@@_columns_type_tl , columns-type .value_required:n = true , l .meta:n = { columns-type = l } , r .meta:n = { columns-type = r } , @@ -2892,6 +2884,31 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% \bigskip +% The |\CodeAfter| (inserted with the key |code-after| or after the keyword +% |\CodeAfter|) may always begin with a list of pairs \textsl{key=value} between +% square brackets. Here is the corresponding set of keys. +% +% We \emph{must} put the following instructions \emph{after} the : +% +% \begin{verbatim} +% CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix +% \end{verbatim} +% +% \begin{macrocode} +\keys_define:nn { NiceMatrix / CodeAfter } + { + delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , + delimiters / color .value_required:n = true , + rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , + rules .value_required:n = true , + xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , + sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , + sub-matrix .value_required:n = true , + unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter } + } +% \end{macrocode} % % \bigskip % \section{Important code used by \{NiceArrayWithDelims\} } @@ -3459,19 +3476,6 @@ version 2005/12/01 or later. } % \end{macrocode} % -% \bigskip -% The command |\@@_newcolumntype| is the command |\newcolumntype| of -% \pkg{array} without the warnings for redefinitions of columns types (we will -% use it to redefine the columns types |w| and |W|). -% \begin{macrocode} -\cs_set_protected:Npn \@@_newcolumntype #1 - { - \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } } - \peek_meaning:NTF [ - { \newcol@ #1 } - { \newcol@ #1 [ 0 ] } - } -% \end{macrocode} % % % \bigskip @@ -3712,10 +3716,6 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_set_eq:NN \@ifnextchar \new@ifnextchar % \end{macrocode} -% -% \begin{macrocode} - \@@_renew_NC@rewrite@S: -% \end{macrocode} % % \begin{macrocode} \bool_gset_false:N \g_@@_last_col_found_bool @@ -3998,6 +3998,7 @@ version 2005/12/01 or later. \cs_set_eq:NN \chessboardcolors \@@_chessboardcolors \cs_set_eq:NN \SubMatrix \@@_SubMatrix_in_code_before \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames + \cs_set_eq:NN \TikzEveryCell \@@_TikzEveryCell } % \end{macrocode} % @@ -4231,7 +4232,7 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_gset:Nn \g_@@_left_delim_tl { #1 } \tl_gset:Nn \g_@@_right_delim_tl { #2 } - \tl_gset:Nn \g_@@_preamble_tl { #4 } + \tl_gset:Nn \g_@@_user_preamble_tl { #4 } % \end{macrocode} % % @@ -4611,20 +4612,17 @@ version 2005/12/01 or later. % \vspace{1cm} % \section{We construct the preamble of the array} % -% \bigskip -% The transformation of the preamble is an operation in several -% steps.\footnote{Be careful: the transformation of the preamble may also have -% by-side effects, for example, the boolean |\g_@@_delims_bool| will be set -% to |true| if we detect in the preamble a delimiter at the beginning or at the -% end.} +% \bigskip +% The final user provides a preamble, but we must convert that preamble into a +% preamble that will be given to |{array}| (of the package \pkg{array}). % % \bigskip -% The preamble given by the final user is in |\g_@@_preamble_tl| and the modified -% version will be stored in |\g_@@_preamble_tl| also. +% The preamble given by the final user is stored in |\g_@@_user_preamble_tl|. +% The modified version will be stored in |\g_@@_array_preamble_tl| also. % \begin{macrocode} \cs_new_protected:Npn \@@_transform_preamble: { - \bool_if:NT \l_@@_preamble_bool \@@_transform_preamble_i: + \@@_transform_preamble_i: \@@_transform_preamble_ii: } % \end{macrocode} @@ -4632,97 +4630,50 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_transform_preamble_i: { -% \end{macrocode} -% First, we will do an ``expansion'' of the preamble with the tools of the -% package \pkg{array} itself. This ``expansion'' will expand all the constructions -% with |*| and all column types (defined by the user or by various packages -% using |\newcolumntype|). -% -% Since we use the tools of \pkg{array} to do this expansion, we will have a -% programmation which is not in the style of the L3 programming layer. -% -% -% \bigskip -% We redefine the column types |w| and |W|. We use |\@@_newcolumntype| instead -% of |\newcolumtype| because we don't want warnings for column types already -% defined. These redefinitions are in fact \emph{protections} of the letters |w| -% and |W|. We don't want these columns type expanded because we will do the -% patch ourselves after. We want to be able to use the standard column types |w| -% and |W| in potential |{tabular}| of \pkg{array} in some cells of our array. -% That's why we do those redefinitions in a TeX group. -% \begin{macrocode} + \int_gzero:N \c@jCol \group_begin: - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } -% \end{macrocode} -% -% \bigskip -% If the package \pkg{varwidth} has defined the column type |V|, we protect from -% expansion by redefining it to |\@@_V:| (which will be catched by our system). -% \begin{macrocode} - \cs_if_exist:NT \NC@find@V { \@@_newcolumntype V { \@@_V: } } % \end{macrocode} -% -% First, we have to store our preamble in the token register |\@temptokena| -% (those ``token registers'' are \emph{not} supported by the L3 programming layer). +% The sequence |\g_@@_cols_vlsim_seq| will contain the numbers of the columns +% where you will to have to draw vertical lines in the potential sub-matrices +% (hence the name |vlism|). % \begin{macrocode} - \exp_args:NV \@temptokena \g_@@_preamble_tl + \seq_gclear:N \g_@@_cols_vlism_seq % \end{macrocode} -% Initialisation of a flag used by \pkg{array} to detect the end of the expansion. +% |\g_tmpb_bool| will be raised if you have a \verb+|+ at the end of the +% preamble provided by the final user. % \begin{macrocode} - \@tempswatrue + \bool_gset_false:N \g_tmpb_bool % \end{macrocode} -% The following line actually does the expansion (it's has been copied from -% |array.sty|). The expanded version is still in |\@temptokena|. +% +% The following sequence will store the arguments of the successive |>| in the +% preamble. % \begin{macrocode} - \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } - \int_gzero:N \c@jCol - \tl_gclear:N \g_@@_preamble_tl + \tl_gclear_new:N \g_@@_pre_cell_tl % \end{macrocode} -% |\g_tmpb_bool| will be raised if you have a \verb+|+ at the end of the preamble. +% The counter |\l_tmpa_int| will count the number of consecutive occurrences +% of the symbol \verb+|+. % \begin{macrocode} - \bool_gset_false:N \g_tmpb_bool + \int_zero:N \l_tmpa_int + \tl_gclear:N \g_@@_array_preamble_tl \tl_if_eq:NnTF \l_@@_vlines_clist { all } { - \tl_gset:Nn \g_@@_preamble_tl + \tl_gset:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } { \clist_if_in:NnT \l_@@_vlines_clist 1 { - \tl_gset:Nn \g_@@_preamble_tl + \tl_gset:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } } % \end{macrocode} -% The sequence |\g_@@_cols_vlsim_seq| will contain the numbers of the columns -% where you will to have to draw vertical lines in the potential sub-matrices -% (hence the name |vlism|). -% \begin{macrocode} - \seq_clear:N \g_@@_cols_vlism_seq -% \end{macrocode} -% -% \bigskip -% The following sequence will store the arguments of the successive |>| in the -% preamble. +% Now, we actually make the preamble (which will be given to |{array}|). It will +% be stored in |\g_@@_array_preamble_tl|. % \begin{macrocode} - \tl_gclear_new:N \g_@@_pre_cell_tl -% \end{macrocode} -% -% The counter |\l_tmpa_int| will count the number of consecutive occurrences -% of the symbol \verb+|+. -% \begin{macrocode} - \int_zero:N \l_tmpa_int -% \end{macrocode} -% Now, we actually patch the preamble (and it is constructed in -% |\g_@@_preamble_tl|). -% \begin{macrocode} - \exp_after:wN \@@_patch_preamble:n \the \@temptokena \q_stop + \exp_last_unbraced:NV \@@_make_preamble:n \g_@@_user_preamble_tl \q_stop \int_gset_eq:NN \g_@@_static_num_of_col_int \c@jCol % \end{macrocode} -% Remark that |\g_@@_static_num_of_col_int| will stay equel to zero in the -% environments without preamble since we are in a code that is executed only -% in the environments \emph{with} preamble. % % \medskip % Now, we replace |\columncolor| by |\@@_columncolor_preamble|. @@ -4732,28 +4683,18 @@ version 2005/12/01 or later. \regex_replace_all:NnN \c_@@_columncolor_regex { \c { @@_columncolor_preamble } } - \g_@@_preamble_tl + \g_@@_array_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|. +% We are not sure that the following TeX group is still necessary. % \begin{macrocode} \group_end: } % \end{macrocode} % -% -% % \bigskip -% Now, we have to ``patch'' that preamble by transforming some columns. -% We will insert in the TeX flow the preamble in its actual form (that is to say -% after the ``expansion'') following by a marker |\q_stop| and we will consume -% these tokens constructing the (new form of the) preamble in -% |\g_@@_preamble_tl|. This is done recursively with the command -% |\@@_patch_preamble:n|. In the same time, we will count the columns with the -% counter |\c@jCol|. % \begin{macrocode} \cs_new_protected:Npn \@@_transform_preamble_ii: { @@ -4779,7 +4720,7 @@ version 2005/12/01 or later. % We complete the preamble with the potential ``exterior columns'' (on both sides). % \begin{macrocode} \int_compare:nNnTF \l_@@_first_col_int = 0 - { \tl_gput_left:NV \g_@@_preamble_tl \c_@@_preamble_first_col_tl } + { \tl_gput_left:NV \g_@@_array_preamble_tl \c_@@_preamble_first_col_tl } { \bool_lazy_all:nT { @@ -4788,10 +4729,10 @@ version 2005/12/01 or later. { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } } - { \tl_gput_left:Nn \g_@@_preamble_tl { @ { } } } + { \tl_gput_left:Nn \g_@@_array_preamble_tl { @ { } } } } \int_compare:nNnTF \l_@@_last_col_int > { -1 } - { \tl_gput_right:NV \g_@@_preamble_tl \c_@@_preamble_last_col_tl } + { \tl_gput_right:NV \g_@@_array_preamble_tl \c_@@_preamble_last_col_tl } { \bool_lazy_all:nT { @@ -4800,7 +4741,7 @@ version 2005/12/01 or later. { \tl_if_empty_p:N \l_@@_vlines_clist } { \bool_not_p:n \l_@@_exterior_arraycolsep_bool } } - { \tl_gput_right:Nn \g_@@_preamble_tl { @ { } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { } } } } % \end{macrocode} % We add a last column to raise a good error message when the user puts more @@ -4810,61 +4751,31 @@ version 2005/12/01 or later. % \begin{macrocode} \dim_compare:nNnT \l_@@_tabular_width_dim = \c_zero_dim { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_error_too_much_cols: } l } } } % \end{macrocode} % % \bigskip -% The command |\@@_patch_preamble:n| is the main function for the transformation +% The command |\@@_make_preamble:n| is the main function for the creation % of the preamble. It is recursive. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble:n #1 +\cs_new_protected:Npn \@@_make_preamble:n #1 { - \str_case:nnF { #1 } + \str_if_eq:nnF { #1 } { \q_stop } { - c { \@@_patch_preamble_i:n #1 } - l { \@@_patch_preamble_i:n #1 } - r { \@@_patch_preamble_i:n #1 } - > { \@@_patch_preamble_xiv:n } - ! { \@@_patch_preamble_ii:nn #1 } - @ { \@@_patch_preamble_ii:nn #1 } - | { \@@_patch_preamble_iii:n #1 } - p { \@@_patch_preamble_iv:n #1 } - b { \@@_patch_preamble_iv:n #1 } - m { \@@_patch_preamble_iv:n #1 } - \@@_V: { \@@_patch_preamble_v:n } - V { \@@_patch_preamble_v:n } - \@@_w: { \@@_patch_preamble_vi:nnnn { } #1 } - \@@_W: { \@@_patch_preamble_vi:nnnn { \@@_special_W: } #1 } - \@@_S: { \@@_patch_preamble_vii:n } - ( { \@@_patch_preamble_viii:nn #1 } - [ { \@@_patch_preamble_viii:nn #1 } - \{ { \@@_patch_preamble_viii:nn #1 } - \left { \@@_patch_preamble_viii:nn } - ) { \@@_patch_preamble_ix:nn #1 } - ] { \@@_patch_preamble_ix:nn #1 } - \} { \@@_patch_preamble_ix:nn #1 } - \right { \@@_patch_preamble_ix:nn } - X { \@@_patch_preamble_x:n } -% \end{macrocode} -% When \pkg{tabularx} is loaded, a local redefinition of the specifier |X| is -% done to replace |X| by |\@@_X|. Thus, our column type |X| will be used in the -% |{NiceTabularX}|. -% \begin{macrocode} - \@@_X { \@@_patch_preamble_x:n } - \q_stop { } - } - { - \str_if_eq:nVTF { #1 } \l_@@_letter_vlism_tl + \cs_if_exist:cTF { @@ \token_to_str:N #1 } + { \use:c { @@ \token_to_str:N #1 } { #1 } } { - \seq_gput_right:Nx \g_@@_cols_vlism_seq - { \int_eval:n { \c@jCol + 1 } } - \tl_gput_right:Nx \g_@@_preamble_tl - { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } } - \@@_patch_preamble:n - } + \str_if_eq:nVTF { #1 } \l_@@_letter_vlism_tl + { + \seq_gput_right:Nx \g_@@_cols_vlism_seq + { \int_eval:n { \c@jCol + 1 } } + \tl_gput_right:Nx \g_@@_array_preamble_tl + { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } } + \@@_make_preamble:n + } % \end{macrocode} % Now the case of a letter set by the final user for a customized rule. Such % customized rule is defined by using the key |custom-line| in @@ -4876,35 +4787,72 @@ version 2005/12/01 or later. % keys of that set of keys won't never be used as keys by the final user (he % will use, instead, letters in the preamble of its array). % \begin{macrocode} - { - \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 } - { - \keys_set:nn { NiceMatrix / ColumnTypes } { #1 } - \@@_patch_preamble:n - } { - \tl_if_eq:nnT { #1 } { S } - { \@@_fatal:n { unknown~column~type~S } } - { \@@_fatal:nn { unknown~column~type } { #1 } } + \keys_if_exist:nnTF { NiceMatrix / ColumnTypes } { #1 } + { + \keys_set:nn { NiceMatrix / ColumnTypes } { #1 } + \@@_make_preamble:n + } + { + \cs_if_exist:cTF { NC @ find @ #1 } + { + \tl_set_eq:Nc \l_tmpb_tl { NC @ rewrite @ #1 } + \exp_last_unbraced:NV \@@_make_preamble:n \l_tmpb_tl + } + { + \tl_if_eq:nnT { #1 } { S } + { \@@_fatal:n { unknown~column~type~S } } + { \@@_fatal:nn { unknown~column~type } { #1 } } + } + } } } } } % \end{macrocode} % -% % \bigskip % Now, we will list all the auxiliary functions for the different types of % entries in the preamble of the array. +% \begin{macrocode} +\cs_new:cpn { @@ \string c } { \@@_make_preamble_i:n } +\cs_new:cpn { @@ \string l } { \@@_make_preamble_i:n } +\cs_new:cpn { @@ \string r } { \@@_make_preamble_i:n } +\cs_new:cpn { @@ \string > } { \@@_make_preamble_xiv:nn } +\cs_new:cpn { @@ \string ! } { \@@_make_preamble_ii:nn } +\cs_new:cpn { @@ \string @ } { \@@_make_preamble_ii:nn } +\cs_new:cpn { @@ \string | } { \@@_make_preamble_iii:n } +\cs_new:cpn { @@ \string p } { \@@_make_preamble_iv:n } +\cs_new:cpn { @@ \string b } { \@@_make_preamble_iv:n } +\cs_new:cpn { @@ \string m } { \@@_make_preamble_iv:n } +\cs_new:cpn { @@ \string V } { \@@_make_preamble_v:nn } +\cs_new:cpn { @@ \string w } { \@@_make_preamble_vi:nnnn { } } +\cs_new:cpn { @@ \string W } { \@@_make_preamble_vi:nnnn { \@@_special_W: } } +\cs_new:cpn { @@ \string S } { \@@_make_preamble_vii:nn } +\cs_new:cpn { @@ \string ( } { \@@_make_preamble_viii:nn } +\cs_new:cpn { @@ \string [ } { \@@_make_preamble_viii:nn } +\cs_new:cpn { @@ \string \{ } { \@@_make_preamble_viii:nn } +\cs_new:cpn { @@ \string \left } { \@@_make_preamble_viii_ii:n } +\cs_new:cpn { @@ \string ) } { \@@_make_preamble_ix:nn } +\cs_new:cpn { @@ \string ] } { \@@_make_preamble_ix:nn } +\cs_new:cpn { @@ \string \} } { \@@_make_preamble_ix:nn } +\cs_new:cpn { @@ \string \right } { \@@_make_preamble_ix_ii:n } +\cs_new:cpn { @@ \string X } { \@@_make_preamble_x:nn } +\cs_new:cpn { @@ \string * } { \@@_make_preamble_xvi:nnn } +\cs_new:cpn { @@ \string \NC@find } { \@@_make_preamble_xx:n } +% \end{macrocode} +% The token |\NC@find| is at the head of the definition of the columns type done +% by |\newcolumntype|. We wan't that token to be no-op here. +% % -% \medskip +% \bigskip % For |c|, |l| and |r| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_i:n #1 +\cs_new_protected:Npn \@@_make_preamble_i:n #1 { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_cell_begin:w \str_set:Nn \l_@@_hpos_cell_str { #1 } } #1 @@ -4915,17 +4863,17 @@ version 2005/12/01 or later. % We increment the counter of columns and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % % \medskip % For |>|, |!| and |@| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_ii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_ii:nn #1 #2 { - \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } } - \@@_patch_preamble:n + \tl_gput_right:Nn \g_@@_array_preamble_tl { #1 { #2 } } + \@@_make_preamble:n } % \end{macrocode} % @@ -4933,34 +4881,41 @@ version 2005/12/01 or later. % \medskip % For \verb+|+ % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iii:n #1 +\cs_new_protected:Npn \@@_make_preamble_iii:n #1 { % \end{macrocode} % |\l_tmpa_int| is the number of successive occurrences of \verb+|+ % \begin{macrocode} \int_incr:N \l_tmpa_int - \@@_patch_preamble_iii_i:n + \@@_make_preamble_iii_i:n } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iii_i:n #1 +\cs_new_protected:Npn \@@_make_preamble_iii_i:n #1 { \str_if_eq:nnTF { #1 } | - { \@@_patch_preamble_iii:n | } - { - \str_if_eq:nnTF { #1 } [ - { \@@_patch_preamble_iii_ii:nw { } [ } - { \@@_patch_preamble_iii_ii:nw { #1 } [ ] } - } + { \@@_make_preamble_iii:n | } + { \@@_make_preamble_iii_ii:nn { } #1 } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iii_ii:nw #1 [ #2 ] +\cs_new_protected:Npn \@@_make_preamble_iii_ii:nn #1 #2 + { + \str_if_eq:nnTF { #2 } [ + { \@@_make_preamble_iii_ii:nw { #1 } [ } + { \@@_make_preamble_iii_iii:nn { #2 } { #1 } } + } +\cs_new_protected:Npn \@@_make_preamble_iii_ii:nw #1 [ #2 ] + { \@@_make_preamble_iii_ii:nn { #1 , #2 } } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_iii_iii:nn #1 #2 { \@@_compute_rule_width:n { multiplicity = \l_tmpa_int , #2 } - \tl_gput_right:Nx \g_@@_preamble_tl + \tl_gput_right:Nx \g_@@_array_preamble_tl { % \end{macrocode} % Here, the command |\dim_eval:n| is mandatory. @@ -4984,15 +4939,15 @@ version 2005/12/01 or later. } \int_zero:N \l_tmpa_int \str_if_eq:nnT { #1 } { \q_stop } { \bool_gset_true:N \g_tmpb_bool } - \@@_patch_preamble:n #1 + \@@_make_preamble:n #1 } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xiv:n #1 +\cs_new_protected:Npn \@@_make_preamble_xiv:nn #1 #2 { - \tl_gput_right:Nn \g_@@_pre_cell_tl { > { #1 } } - \@@_patch_preamble:n + \tl_gput_right:Nn \g_@@_pre_cell_tl { > { #2 } } + \@@_make_preamble:n } % \end{macrocode} % @@ -5053,29 +5008,29 @@ version 2005/12/01 or later. % \medskip % For |p|, |b| and |m|. The argument |#1| is that value : |p|, |b| or |m|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv:n #1 +\cs_new_protected:Npn \@@_make_preamble_iv:n #1 { \str_set:Nn \l_@@_vpos_col_str { #1 } % \end{macrocode} % Now, you look for a potential character |[| after the letter of the specifier % (for the options). % \begin{macrocode} - \@@_patch_preamble_iv_i:n + \@@_make_preamble_iv_i:n } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_i:n #1 +\cs_new_protected:Npn \@@_make_preamble_iv_i:n #1 { \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_iv_ii:w [ } - { \@@_patch_preamble_iv_ii:w [ ] { #1 } } + { \@@_make_preamble_iv_ii:w [ } + { \@@_make_preamble_iv_ii:w [ ] { #1 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_ii:w [ #1 ] - { \@@_patch_preamble_iv_iii:nn { #1 } } +\cs_new_protected:Npn \@@_make_preamble_iv_ii:w [ #1 ] + { \@@_make_preamble_iv_iii:nn { #1 } } % \end{macrocode} % % \medskip @@ -5084,7 +5039,7 @@ version 2005/12/01 or later. % % |#2| is the mandatory argument of the specifier: the width of the column. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_iii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_iv_iii:nn #1 #2 { % \end{macrocode} % The possible values of |\l_@@_hpos_col_str| are |j| (for \emph{justified} which is @@ -5093,9 +5048,8 @@ version 2005/12/01 or later. % \begin{macrocode} \str_set:Nn \l_@@_hpos_col_str { j } \tl_set:Nn \l_tmpa_tl { #1 } - \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S } \@@_keys_p_column:V \l_tmpa_tl - \@@_patch_preamble_iv_iv:nn { #2 } { minipage } + \@@_make_preamble_iv_iv:nn { #2 } { minipage } } % \end{macrocode} % @@ -5109,11 +5063,11 @@ version 2005/12/01 or later. % The first argument is the width of the column. The second is the type of % environment: |minipage| or |varwidth|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_iv:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_iv_iv:nn #1 #2 { \use:x { - \@@_patch_preamble_iv_v:nnnnnnnn + \@@_make_preamble_iv_v:nnnnnnnn { \str_if_eq:VnTF \l_@@_vpos_col_str { p } { t } { b } } { \dim_eval:n { #1 } } { @@ -5160,7 +5114,7 @@ version 2005/12/01 or later. % We increment the counter of columns, and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5189,14 +5143,14 @@ version 2005/12/01 or later. % |#8| is the letter |c| or |r| or |l| which is the basic specificier of column % which is used \emph{in fine}. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_iv_v:nnnnnnnn #1 #2 #3 #4 #5 #6 #7 #8 +\cs_new_protected:Npn \@@_make_preamble_iv_v:nnnnnnnn #1 #2 #3 #4 #5 #6 #7 #8 { \str_if_eq:VnTF \l_@@_hpos_col_str { si } - { \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_test_if_empty_for_S: } } } - { \tl_gput_right:Nn \g_@@_preamble_tl { > { \@@_test_if_empty: } } } - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + { \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_test_if_empty_for_S: } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_test_if_empty: } } } + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { % \end{macrocode} @@ -5324,26 +5278,25 @@ version 2005/12/01 or later. % \medskip % For |V| (similar to the |V| of \pkg{varwidth}). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_v:n #1 +\cs_new_protected:Npn \@@_make_preamble_v:nn #1 #2 { - \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_v_i:w [ } - { \@@_patch_preamble_v_i:w [ ] { #1 } } + \str_if_eq:nnTF { #2 } { [ } + { \@@_make_preamble_v_i:w [ } + { \@@_make_preamble_v_i:w [ ] { #2 } } } -\cs_new_protected:Npn \@@_patch_preamble_v_i:w [ #1 ] - { \@@_patch_preamble_v_ii:nn { #1 } } -\cs_new_protected:Npn \@@_patch_preamble_v_ii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_v_i:w [ #1 ] + { \@@_make_preamble_v_ii:nn { #1 } } +\cs_new_protected:Npn \@@_make_preamble_v_ii:nn #1 #2 { \str_set:Nn \l_@@_vpos_col_str { p } \str_set:Nn \l_@@_hpos_col_str { j } \tl_set:Nn \l_tmpa_tl { #1 } - \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S } \@@_keys_p_column:V \l_tmpa_tl \IfPackageLoadedTF { varwidth } - { \@@_patch_preamble_iv_iv:nn { #2 } { varwidth } } + { \@@_make_preamble_iv_iv:nn { #2 } { varwidth } } { \@@_error_or_warning:n { varwidth~not~loaded } - \@@_patch_preamble_iv_iv:nn { #2 } { minipage } + \@@_make_preamble_iv_iv:nn { #2 } { minipage } } } % \end{macrocode} @@ -5360,11 +5313,11 @@ version 2005/12/01 or later. % |#4| is the width of the column. % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vi:nnnn #1 #2 #3 #4 +\cs_new_protected:Npn \@@_make_preamble_vi:nnnn #1 #2 #3 #4 { \str_if_eq:nnTF { #3 } { s } - { \@@_patch_preamble_vi_i:nnnn { #1 } { #4 } } - { \@@_patch_preamble_vi_ii:nnnn { #1 } { #2 } { #3 } { #4 } } + { \@@_make_preamble_vi_i:nnnn { #1 } { #4 } } + { \@@_make_preamble_vi_ii:nnnn { #1 } { #2 } { #3 } { #4 } } } % \end{macrocode} % @@ -5376,11 +5329,11 @@ version 2005/12/01 or later. % % |#2| is the width of the column. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vi_i:nnnn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_vi_i:nnnn #1 #2 { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \dim_set:Nn \l_@@_col_width_dim { #2 } @@ -5396,7 +5349,7 @@ version 2005/12/01 or later. } } \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5404,11 +5357,11 @@ version 2005/12/01 or later. % Then, the most important version, for the horizontal alignments types of |c|, % |l| and |r| (and not |s|). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vi_ii:nnnn #1 #2 #3 #4 +\cs_new_protected:Npn \@@_make_preamble_vi_ii:nnnn #1 #2 #3 #4 { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { % \end{macrocode} @@ -5434,7 +5387,7 @@ version 2005/12/01 or later. % We increment the counter of columns and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5448,31 +5401,29 @@ version 2005/12/01 or later. % \end{macrocode} % % \medskip -% For |\@@_S:|. If the user has used |S[...]|, |S| has been replaced by |\@@_S:| -% during the first expansion of the preamble (done with the tools of standard -% LaTeX and \pkg{array}). +% For |S| (of \pkg{siunitx}). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii:n #1 +\cs_new_protected:Npn \@@_make_preamble_vii:nn #1 #2 { - \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_vii_i:w [ } - { \@@_patch_preamble_vii_i:w [ ] { #1 } } + \str_if_eq:nnTF { #2 } { [ } + { \@@_make_preamble_vii_i:w [ } + { \@@_make_preamble_vii_i:w [ ] { #2 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii_i:w [ #1 ] - { \@@_patch_preamble_vii_ii:n { #1 } } +\cs_new_protected:Npn \@@_make_preamble_vii_i:w [ #1 ] + { \@@_make_preamble_vii_ii:n { #1 } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_vii_ii:n #1 +\cs_new_protected:Npn \@@_make_preamble_vii_ii:n #1 { \IfPackageAtLeastTF { siunitx } { 2022/01/01 } { - \tl_gput_right:NV \g_@@_preamble_tl \g_@@_pre_cell_tl + \tl_gput_right:NV \g_@@_array_preamble_tl \g_@@_pre_cell_tl \tl_gclear:N \g_@@_pre_cell_tl - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_cell_begin:w @@ -5486,7 +5437,7 @@ version 2005/12/01 or later. % We increment the counter of columns and then we test for the presence of a |<|. % \begin{macrocode} \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } { \@@_fatal:n { Version~of~siunitx~too~old } } } @@ -5496,7 +5447,7 @@ version 2005/12/01 or later. % \medskip % For |(|, |[| and |\{|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_viii:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_viii:nn #1 #2 { \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } } % \end{macrocode} @@ -5513,30 +5464,35 @@ version 2005/12/01 or later. % \begin{macrocode} \tl_gset:Nn \g_@@_left_delim_tl { #1 } \tl_gset:Nn \g_@@_right_delim_tl { . } - \@@_patch_preamble:n #2 + \@@_make_preamble:n #2 } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } - \@@_patch_preamble_viii_i:nn { #1 } { #2 } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } + \@@_make_preamble_viii_i:nn { #1 } { #2 } } } - { \@@_patch_preamble_viii_i:nn { #1 } { #2 } } + { \@@_make_preamble_viii_i:nn { #1 } { #2 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_viii_i:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_viii_i:nn #1 #2 { \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_eval:n { \c@jCol + 1 } } \c_true_bool } \tl_if_in:nnTF { ( [ \{ ) ] \} \left \right } { #2 } { \@@_error:nn { delimiter~after~opening } { #2 } - \@@_patch_preamble:n + \@@_make_preamble:n } - { \@@_patch_preamble:n #2 } + { \@@_make_preamble:n #2 } } % \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_viii_ii:n #1 + { \@@_make_preamble_viii:nn } +% \end{macrocode} % % \bigskip % For the closing delimiters. We have two arguments for the following command because @@ -5546,48 +5502,48 @@ version 2005/12/01 or later. % considered as the right delimiter of the environment if the environment is % |{NiceArray}|). % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_ix:nn #1 #2 +\cs_new_protected:Npn \@@_make_preamble_ix:nn #1 #2 { \bool_if:NT \l_@@_small_bool { \@@_fatal:n { Delimiter~with~small } } \tl_if_in:nnTF { ) ] \} } { #2 } - { \@@_patch_preamble_ix_i:nnn #1 #2 } + { \@@_make_preamble_ix_i:nnn #1 #2 } { \tl_if_eq:nnTF { \q_stop } { #2 } { \str_if_eq:VnTF \g_@@_right_delim_tl { . } { \tl_gset:Nn \g_@@_right_delim_tl { #1 } } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } - \@@_patch_preamble:n #2 + \@@_make_preamble:n #2 } } { \tl_if_in:nnT { ( [ \{ \left } { #2 } - { \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } - \@@_patch_preamble:n #2 + \@@_make_preamble:n #2 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_ix_i:nnn #1 #2 #3 +\cs_new_protected:Npn \@@_make_preamble_ix_i:nnn #1 #2 #3 { \tl_if_eq:nnTF { \q_stop } { #3 } { \str_if_eq:VnTF \g_@@_right_delim_tl { . } { - \tl_gput_right:Nn \g_@@_preamble_tl { ! { \enskip } } + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_pre_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:Nn \g_@@_array_preamble_tl { ! { \enskip } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } \@@_error:nn { double~closing~delimiter } { #2 } @@ -5597,27 +5553,32 @@ version 2005/12/01 or later. \tl_gput_right:Nx \g_@@_pre_code_after_tl { \@@_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } \@@_error:nn { double~closing~delimiter } { #2 } - \@@_patch_preamble:n #3 + \@@_make_preamble:n #3 } } % \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_ix_ii:n #1 + { \@@_make_preamble_ix:nn } +% \end{macrocode} % % \bigskip % For the case of a letter |X|. This specifier may take in an optional argument % (between square brackets). That's why we test whether there is a |[| after the % letter |X|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_x:n #1 +\cs_new_protected:Npn \@@_make_preamble_x:nn #1 #2 { - \str_if_eq:nnTF { #1 } { [ } - { \@@_patch_preamble_x_i:w [ } - { \@@_patch_preamble_x_i:w [ ] #1 } + \str_if_eq:nnTF { #2 } { [ } + { \@@_make_preamble_x_i:w [ } + { \@@_make_preamble_x_i:w [ ] #2 } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_x_i:w [ #1 ] - { \@@_patch_preamble_x_ii:n { #1 } } +\cs_new_protected:Npn \@@_make_preamble_x_i:w [ #1 ] + { \@@_make_preamble_x_ii:n { #1 } } % \end{macrocode} % |#1| is the optional argument of the |X| specifier (a list of % \emph{key}-\emph{value} pairs). @@ -5636,7 +5597,7 @@ version 2005/12/01 or later. % \medskip % In the following command, |#1| is the list of the options of the specifier |X|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_x_ii:n #1 +\cs_new_protected:Npn \@@_make_preamble_x_ii:n #1 { % \end{macrocode} % The possible values of |\l_@@_hpos_col_str| are |j| (for \emph{justified} which is @@ -5661,7 +5622,6 @@ version 2005/12/01 or later. \int_zero_new:N \l_@@_weight_int \int_set:Nn \l_@@_weight_int { 1 } \tl_set:Nn \l_tmpa_tl { #1 } - \tl_replace_all:Nnn \l_tmpa_tl { \@@_S: } { S } \@@_keys_p_column:V \l_tmpa_tl \keys_set:nV { WithArrows / X-column } \l_tmpa_tl \int_compare:nNnT \l_@@_weight_int < 0 @@ -5679,12 +5639,12 @@ version 2005/12/01 or later. \bool_if:NTF \l_@@_X_columns_aux_bool { \exp_args:Nnx - \@@_patch_preamble_iv_iv:nn + \@@_make_preamble_iv_iv:nn { \l_@@_weight_int \l_@@_X_columns_dim } { minipage } } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { > { \@@_cell_begin:w @@ -5715,7 +5675,7 @@ version 2005/12/01 or later. } } \int_gincr:N \c@jCol - \@@_patch_preamble_xi:n + \@@_make_preamble_xi:n } } % \end{macrocode} @@ -5727,38 +5687,38 @@ version 2005/12/01 or later. % |!{\skip_horizontal:N ...}| when the key |vlines| is used. In fact, we have % also to test whether there is, after the |<{...}|, a |@{...}|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xi:n #1 +\cs_new_protected:Npn \@@_make_preamble_xi:n #1 { \str_if_eq:nnTF { #1 } { < } - \@@_patch_preamble_xiii:n + \@@_make_preamble_xiii:n { \str_if_eq:nnTF { #1 } { @ } - \@@_patch_preamble_xv:n + \@@_make_preamble_xv:n { \tl_if_eq:NnTF \l_@@_vlines_clist { all } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } { \exp_args:NNx \clist_if_in:NnT \l_@@_vlines_clist { \int_eval:n { \c@jCol + 1 } } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } } - \@@_patch_preamble:n { #1 } + \@@_make_preamble:n { #1 } } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xiii:n #1 +\cs_new_protected:Npn \@@_make_preamble_xiii:n #1 { - \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } } - \@@_patch_preamble_xi:n + \tl_gput_right:Nn \g_@@_array_preamble_tl { < { #1 } } + \@@_make_preamble_xi:n } % \end{macrocode} % @@ -5766,43 +5726,41 @@ version 2005/12/01 or later. % draw a vertical rule, we have to add in that |@{...}| a |\hskip| corresponding % to the width of the vertical rule. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_preamble_xv:n #1 +\cs_new_protected:Npn \@@_make_preamble_xv:n #1 { \tl_if_eq:NnTF \l_@@_vlines_clist { all } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { #1 \skip_horizontal:N \arrayrulewidth } } } { \exp_args:NNx \clist_if_in:NnTF \l_@@_vlines_clist { \int_eval:n { \c@jCol + 1 } } { - \tl_gput_right:Nn \g_@@_preamble_tl + \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { #1 \skip_horizontal:N \arrayrulewidth } } } - { \tl_gput_right:Nn \g_@@_preamble_tl { @ { #1 } } } + { \tl_gput_right:Nn \g_@@_array_preamble_tl { @ { #1 } } } } - \@@_patch_preamble:n + \@@_make_preamble:n } % \end{macrocode} % +% \begin{macrocode} +\cs_new_protected:Npn \@@_make_preamble_xx:n #1 { \@@_make_preamble:n } +% \end{macrocode} +% % \bigskip % \begin{macrocode} -\cs_new_protected:Npn \@@_set_preamble:Nn #1 #2 - { - \group_begin: - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } - \@temptokena { #2 } - \@tempswatrue - \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } - \tl_gclear:N \g_@@_preamble_tl - \exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop - \group_end: - \tl_set_eq:NN #1 \g_@@_preamble_tl +\cs_new_protected:Npn \@@_make_preamble_xvi:nnn #1 #2 #3 + { + \tl_clear:N \l_tmpa_tl + \int_step_inline:nn { #2 } { \tl_put_right:Nn \l_tmpa_tl { #3 } } + \exp_last_unbraced:NV \@@_make_preamble:n \l_tmpa_tl } % \end{macrocode} % +% % \bigskip % \section{The redefinition of \textbackslash multicolumn} % @@ -5823,25 +5781,12 @@ version 2005/12/01 or later. \cs_set:Npn \@addamp { \if@firstamp \@firstampfalse \else \@preamerr 5 \fi } % \end{macrocode} % -% \begin{macrocode} - \@@_newcolumntype w [ 2 ] { \@@_w: { ##1 } { ##2 } } - \@@_newcolumntype W [ 2 ] { \@@_W: { ##1 } { ##2 } } -% \end{macrocode} -% -% \medskip -% You do the expansion of the (small) preamble with the tools of \pkg{array}. -% \begin{macrocode} - \@temptokena = { #2 } - \@tempswatrue - \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } -% \end{macrocode} -% % \medskip % Now, we patch the (small) preamble as we have done with the main preamble of % the array. % \begin{macrocode} \tl_gclear:N \g_@@_preamble_tl - \exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop + \@@_make_m_preamble:n #2 \q_stop % \end{macrocode} % % \medskip @@ -5905,28 +5850,40 @@ version 2005/12/01 or later. % All those commands have a |m| in their name to recall that they deal with the % redefinition of |\multicolumn|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble:n #1 +\cs_new_protected:Npn \@@_make_m_preamble:n #1 { \str_case:nnF { #1 } { - c { \@@_patch_m_preamble_i:n #1 } - l { \@@_patch_m_preamble_i:n #1 } - r { \@@_patch_m_preamble_i:n #1 } - > { \@@_patch_m_preamble_ii:nn #1 } - ! { \@@_patch_m_preamble_ii:nn #1 } - @ { \@@_patch_m_preamble_ii:nn #1 } - | { \@@_patch_m_preamble_iii:n #1 } - p { \@@_patch_m_preamble_iv:nnn t #1 } - m { \@@_patch_m_preamble_iv:nnn c #1 } - b { \@@_patch_m_preamble_iv:nnn b #1 } - \@@_w: { \@@_patch_m_preamble_v:nnnn { } #1 } - \@@_W: { \@@_patch_m_preamble_v:nnnn { \@@_special_W: } #1 } + c { \@@_make_m_preamble_i:n #1 } + l { \@@_make_m_preamble_i:n #1 } + r { \@@_make_m_preamble_i:n #1 } + > { \@@_make_m_preamble_ii:nn #1 } + ! { \@@_make_m_preamble_ii:nn #1 } + @ { \@@_make_m_preamble_ii:nn #1 } + | { \@@_make_m_preamble_iii:n #1 } + p { \@@_make_m_preamble_iv:nnn t #1 } + m { \@@_make_m_preamble_iv:nnn c #1 } + b { \@@_make_m_preamble_iv:nnn b #1 } + w { \@@_make_m_preamble_v:nnnn { } #1 } + W { \@@_make_m_preamble_v:nnnn { \@@_special_W: } #1 } \q_stop { } +% \end{macrocode} +% The token |\NC@find| is at the head of the definition of the columns type done +% by |\newcolumntype|. We wan't that token to no-op here. +% \begin{macrocode} + \NC@find { \@@_make_preamble:n } } { - \tl_if_eq:nnT { #1 } { S } - { \@@_fatal:n { unknown~column~type~S } } - { \@@_fatal:nn { unknown~column~type } { #1 } } + \cs_if_exist:cTF { NC @ find @ #1 } + { + \tl_set_eq:Nc \l_tmpa_tl { NC @ rewrite @ #1 } + \exp_last_unbraced:NV \@@_make_m_preamble:n \l_tmpa_tl + } + { + \tl_if_eq:nnT { #1 } { S } + { \@@_fatal:n { unknown~column~type~S } } + { \@@_fatal:nn { unknown~column~type } { #1 } } + } } } % \end{macrocode} @@ -5934,7 +5891,7 @@ version 2005/12/01 or later. % \medskip % For |c|, |l| and |r| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_i:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_i:n #1 { \tl_gput_right:Nn \g_@@_preamble_tl { @@ -5946,17 +5903,17 @@ version 2005/12/01 or later. % % We test for the presence of a |<|. % \begin{macrocode} - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % % \medskip % For |>|, |!| and |@| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_ii:nn #1 #2 +\cs_new_protected:Npn \@@_make_m_preamble_ii:nn #1 #2 { \tl_gput_right:Nn \g_@@_preamble_tl { #1 { #2 } } - \@@_patch_m_preamble:n + \@@_make_m_preamble:n } % \end{macrocode} % @@ -5964,17 +5921,17 @@ version 2005/12/01 or later. % \medskip % For \verb+|+ % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_iii:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_iii:n #1 { \tl_gput_right:Nn \g_@@_preamble_tl { #1 } - \@@_patch_m_preamble:n + \@@_make_m_preamble:n } % \end{macrocode} % % \medskip % For |p|, |m| and |b| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_iv:nnn #1 #2 #3 +\cs_new_protected:Npn \@@_make_m_preamble_iv:nnn #1 #2 #3 { \tl_gput_right:Nn \g_@@_preamble_tl { @@ -5995,14 +5952,14 @@ version 2005/12/01 or later. % \end{macrocode} % We test for the presence of a |<|. % \begin{macrocode} - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % % \medskip % For |w| and |W| % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_v:nnnn #1 #2 #3 #4 +\cs_new_protected:Npn \@@_make_m_preamble_v:nnnn #1 #2 #3 #4 { \tl_gput_right:Nn \g_@@_preamble_tl { @@ -6025,7 +5982,7 @@ version 2005/12/01 or later. % \end{macrocode} % We test for the presence of a |<|. % \begin{macrocode} - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % @@ -6033,19 +5990,19 @@ version 2005/12/01 or later. % After a specifier of column, we have to test whether there is one or several % |<{..}|. % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_x:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_x:n #1 { \str_if_eq:nnTF { #1 } { < } - \@@_patch_m_preamble_ix:n - { \@@_patch_m_preamble:n { #1 } } + \@@_make_m_preamble_ix:n + { \@@_make_m_preamble:n { #1 } } } % \end{macrocode} % % \begin{macrocode} -\cs_new_protected:Npn \@@_patch_m_preamble_ix:n #1 +\cs_new_protected:Npn \@@_make_m_preamble_ix:n #1 { \tl_gput_right:Nn \g_@@_preamble_tl { < { #1 } } - \@@_patch_m_preamble_x:n + \@@_make_m_preamble_x:n } % \end{macrocode} % @@ -6521,7 +6478,7 @@ version 2005/12/01 or later. % Here is the call to |\array| (we have a dedicated macro |\@@_array:n| because % of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}). % \begin{macrocode} - \@@_array:V \g_@@_preamble_tl + \@@_array:V \g_@@_array_preamble_tl } } } @@ -6656,7 +6613,7 @@ version 2005/12/01 or later. % |\@@_array:n| because of compatibility with the classes \cls{revtex4-1} and % \cls{revtex4-2}). % \begin{macrocode} - \@@_array:V \g_@@_preamble_tl \l_@@_new_body_tl + \@@_array:V \g_@@_array_preamble_tl \l_@@_new_body_tl } % \end{macrocode} % @@ -7273,31 +7230,11 @@ version 2005/12/01 or later. { \endNiceArray } % \end{macrocode} % -% \bigskip -% \begin{macrocode} -\cs_set_protected:Npn \@@_newcolumntype #1 - { - \cs_if_free:cT { NC @ find @ #1 } - { \NC@list \expandafter { \the \NC@list \NC@do #1 } } - \cs_set:cpn {NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } } - \peek_meaning:NTF [ - { \newcol@ #1 } - { \newcol@ #1 [ 0 ] } - } -% \end{macrocode} % % \bigskip % \begin{macrocode} \NewDocumentEnvironment { NiceTabularX } { m O { } m ! O { } } { -% \end{macrocode} -% The following code prevents the expansion of the `X` columns with the -% definition of that columns in \pkg{tabularx} (this would result in an error in -% |{NiceTabularX}|). -% \begin{macrocode} - \IfPackageLoadedTF { tabularx } - { \newcolumntype { X } { \@@_X } } - { } \str_gset:Nn \g_@@_name_env_str { NiceTabularX } \dim_zero_new:N \l_@@_width_dim \dim_set:Nn \l_@@_width_dim { #1 } @@ -7305,7 +7242,11 @@ version 2005/12/01 or later. \bool_set_true:N \l_@@_tabular_bool \NiceArray { #3 } } - { \endNiceArray } + { + \endNiceArray + \int_compare:nNnT \g_@@_total_X_weight_int = \c_zero_int + { \@@_error:n { NiceTabularX~without~X } } + } % \end{macrocode} % % \bigskip @@ -7578,6 +7519,7 @@ version 2005/12/01 or later. \cs_set_eq:NN \UnderBrace \@@_UnderBrace \cs_set_eq:NN \OverBrace \@@_OverBrace \cs_set_eq:NN \ShowCellNames \@@_ShowCellNames + \cs_set_eq:NN \TikzEveryCell \@@_TikzEveryCell \cs_set_eq:NN \line \@@_line \g_@@_pre_code_after_tl \tl_gclear:N \g_@@_pre_code_after_tl @@ -10608,7 +10550,7 @@ version 2005/12/01 or later. { \peek_remove_spaces:n { - \tl_gput_right:Nx \g__nicematrix_pre_code_before_tl + \tl_gput_right:Nx \g_@@_pre_code_before_tl { \@@_rowlistcolors [ #1 ] { \int_use:N \c@iRow } { #2 } @@ -10754,7 +10696,17 @@ version 2005/12/01 or later. dotted .bool_set:N = \l_@@_dotted_bool , dotted .initial:n = false , dotted .default:n = true , - color .code:n = \@@_set_CT@arc@:n { #1 } , +% \end{macrocode} +% We want that, even when the rule has been defined with TikZ by the key |tikz|, +% the user has still the possibility to change the color of the rule with the key +% |color| (in the command |\Hline|, not in the key |tikz| of the command +% |\Hline|). The main use is, when the user has defined its own command +% |\MyDashedLine| by |\newcommand{\MyDashedRule}{\Hline[tikz=dashed]}|, to give +% the ability to write |\MyDashedRule[color=red]|. +% \begin{macrocode} + color .code:n = + \@@_set_CT@arc@:n { #1 } + \tl_set:Nn \l_@@_rule_color_tl { #1 } , color .value_required:n = true , sep-color .code:n = \@@_set_CT@drsc@:n { #1 } , sep-color .value_required:n = true , @@ -10763,9 +10715,11 @@ version 2005/12/01 or later. % sub-rules since a rule may be broken by blocks or others) will be drawn with % Tikz. % \begin{macrocode} - tikz .tl_set:N = \l_@@_tikz_rule_tl , + tikz .code:n = + \IfPackageLoadedTF { tikz } + { \clist_put_right:Nn \l_@@_tikz_rule_tl { #1 } } + { \@@_error:n { tikz~without~tikz } } , tikz .value_required:n = true , - tikz .initial:n = , total-width .dim_set:N = \l_@@_rule_width_dim , total-width .value_required:n = true , width .meta:n = { total-width = #1 } , @@ -10887,6 +10841,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_vline_ii: { + \tl_clear:N \l_@@_tikz_rule_tl \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl \bool_if:NTF \l_@@_dotted_bool \@@_vline_iv: @@ -10983,12 +10938,21 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip -% The following code is for the case when the user uses the key |tikz| (in the -% definition of a customized rule by using the key |custom-line|). +% The following code is for the case when the user uses the key |tikz|. % \begin{macrocode} \cs_new_protected:Npn \@@_vline_v: { \begin {tikzpicture } + % added 2023/09/25 +% \end{macrocode} +% By default, the color defined by |\arrayrulecolor| or by |rules/color| will be +% used, but it's still possible to change the color by using the key |color| or, +% of course, the key |color| inside the key |tikz| (that is to say the key +% |color| provided by \textsc{pgf}. +% \begin{macrocode} + \CT@arc@ + \tl_if_empty:NF \l_@@_rule_color_tl + { \tl_put_right:Nx \l_@@_tikz_rule_tl { , color = \l_@@_rule_color_tl } } \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \@@_qpoint:n { row - \int_use:N \l_@@_local_start_int } @@ -11142,6 +11106,7 @@ version 2005/12/01 or later. % \begin{macrocode} \cs_new_protected:Npn \@@_hline_ii: { + \tl_clear:N \l_@@_tikz_rule_tl \keys_set:nV { NiceMatrix / RulesBis } \l_@@_other_keys_tl \bool_if:NTF \l_@@_dotted_bool \@@_hline_iv: @@ -11304,6 +11269,16 @@ version 2005/12/01 or later. \cs_new_protected:Npn \@@_hline_v: { \begin { tikzpicture } + % added 2023/09/25 +% \end{macrocode} +% By default, the color defined by |\arrayrulecolor| or by |rules/color| will be +% used, but it's still possible to change the color by using the key |color| or, +% of course, the key |color| inside the key |tikz| (that is to say the key +% |color| provided by \textsc{pgf}. +% \begin{macrocode} + \CT@arc@ + \tl_if_empty:NF \l_@@_rule_color_tl + { \tl_put_right:Nx \l_@@_tikz_rule_tl { , color = \l_@@_rule_color_tl } } \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \@@_qpoint:n { col - \int_use:N \l_@@_local_start_int } @@ -11481,7 +11456,7 @@ version 2005/12/01 or later. { \IfPackageLoadedTF { tikz } { } - { \@@_error:n { tikz~in~custom-line~without~tikz }} + { \@@_error:n { tikz~in~custom-line~without~tikz } } \bool_if:NT \l_@@_color_bool { \@@_error:n { color~in~custom-line~with~tikz } } } @@ -11589,25 +11564,10 @@ version 2005/12/01 or later. { % \end{macrocode} % We use |\cs_set:cpn| and not |\cs_new:cpn| because we want a local definition. -% Moreover, the command must \emph{not} be protected since it begins with |\noalign|. +% Moreover, the command must \emph{not} be protected since it begins with +% |\noalign| (which is in |\Hline|). % \begin{macrocode} - \cs_set:cpn { nicematrix - \l_@@_command_str } - { - \noalign - { - \@@_compute_rule_width:n { #1 } - \skip_vertical:n { \l_@@_rule_width_dim } - \tl_gput_right:Nx \g_@@_pre_code_after_tl - { - \@@_hline:n - { - #1 , - position = \int_eval:n { \c@iRow + 1 } , - total-width = \dim_use:N \l_@@_rule_width_dim - } - } - } - } + \cs_set:cpn { nicematrix - \l_@@_command_str } { \Hline [ #1 ] } \seq_put_left:NV \l_@@_custom_line_commands_seq \l_@@_command_str } % \end{macrocode} @@ -11697,7 +11657,7 @@ version 2005/12/01 or later. % \end{macrocode} % In the following line, the |\dim_use:N| is mandatory since we do an expansion. % \begin{macrocode} - \tl_gput_right:Nx \g_@@_preamble_tl + \tl_gput_right:Nx \g_@@_array_preamble_tl { \exp_not:N ! { \skip_horizontal:n { \dim_use:N \l_@@_rule_width_dim } } } \tl_gput_right:Nx \g_@@_pre_code_after_tl { @@ -12365,9 +12325,7 @@ version 2005/12/01 or later. % |\multicolumn{|$n$|}{...}{...}| with $n$>1 was issued and in % |\g_@@_multicolumn_sizes_seq| the correspondant values of $n$. % \begin{macrocode} - \cs_if_exist_use:NF \seq_map_pairwise_function:NNN - \seq_mapthread_function:NNN \g_@@_multicolumn_cells_seq \g_@@_multicolumn_sizes_seq \@@_node_for_multicolumn:nn @@ -13839,7 +13797,7 @@ version 2005/12/01 or later. borders .clist_set:N = \l_@@_borders_clist , rounded-corners .dim_set:N = \l_@@_rounded_corners_dim , rounded-corners .default:n = 4 pt , - line-width .dim_set:N = \l_@@_line_width_dim , + line-width .dim_set:N = \l_@@_line_width_dim } % \end{macrocode} % @@ -13847,21 +13805,44 @@ version 2005/12/01 or later. % The following command will be used if the key |tikz| has been used for the % command |\Block|. The arguments |#1| and |#2| are the coordinates of the first % cell and |#3| and |#4| the coordinates of the last cell of the block. |#5| is -% a comma-separated list of the Tikz keys used with the path. +% a comma-separated list of the Tikz keys used with the path. However, among +% those keys, you have added in \pkg{nicematrix} a special key |offset| (an +% offset for the rectangle of the block). That's why we have to extract that key +% first. % \begin{macrocode} -\cs_new_protected:Npn \@@_block_tikz:nnnnn #1 #2 #3 #4 #5 +\cs_new_protected:Npn \@@_block_tikz:nnnnn #1 #2 #3 #4 #5 { \begin { tikzpicture } \@@_clip_with_rounded_corners: \clist_map_inline:nn { #5 } { - \path [ ##1 ] - ( #1 -| #2 ) + \keys_set_known:nnN { NiceMatrix / SpecialOffset } { ##1 } \l_tmpa_tl + \use:x { \exp_not:N \path [ \l_tmpa_tl ] } + ( + [ + xshift = \dim_use:N \l_@@_offset_dim , + yshift = - \dim_use:N \l_@@_offset_dim + ] + #1 -| #2 + ) rectangle - ( \int_eval:n { #3 + 1 } -| \int_eval:n { #4 + 1 } ) ; + ( + [ + xshift = - \dim_use:N \l_@@_offset_dim , + yshift = \dim_use:N \l_@@_offset_dim + ] + \int_eval:n { #3 + 1 } -| \int_eval:n { #4 + 1 } + ) ; } \end { tikzpicture } } +\cs_generate_variant:Nn \@@_block_tikz:nnnnn { n n n n V } +% \end{macrocode} +% +% \medskip +% \begin{macrocode} +\keys_define:nn { NiceMatrix / SpecialOffset } + { offset .dim_set:N = \l_@@_offset_dim } % \end{macrocode} % % @@ -13898,7 +13879,7 @@ version 2005/12/01 or later. % \begin{macrocode} \keys_define:nn { NiceMatrix / Auto } { - columns-type .code:n = \@@_set_preamble:Nn \l_@@_columns_type_tl { #1 } , + columns-type .tl_set:N = \l_@@_columns_type_tl , columns-type .value_required:n = true , l .meta:n = { columns-type = l } , r .meta:n = { columns-type = r } , @@ -13934,7 +13915,7 @@ version 2005/12/01 or later. % preamble which is yet transformed (by using |\l_@@_columns_type_tl| which is % yet nicematrix-ready). % \begin{macrocode} - \bool_set_false:N \l_@@_preamble_bool + % \bool_set_false:N \l_@@_preamble_bool \use:x { \exp_not:N \begin { NiceArrayWithDelims } { #1 } { #2 } @@ -14133,27 +14114,6 @@ version 2005/12/01 or later. % \section{The keyword \textbackslash CodeAfter} % % -% The |\CodeAfter| (inserted with the key |code-after| or after the keyword -% |\CodeAfter|) may always begin with a list of pairs \textsl{key=value} between -% square brackets. Here is the corresponding set of keys. -% \begin{macrocode} -\keys_define:nn { NiceMatrix } - { - CodeAfter / rules .inherit:n = NiceMatrix / rules , - CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix - } -\keys_define:nn { NiceMatrix / CodeAfter } - { - sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , - sub-matrix .value_required:n = true , - delimiters / color .tl_set:N = \l_@@_delimiters_color_tl , - delimiters / color .value_required:n = true , - rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , - rules .value_required:n = true , - xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , - unknown .code:n = \@@_error:n { Unknown~key~for~CodeAfter } - } -% \end{macrocode} % % \medskip % In fact, in this subsection, we define the user command |\CodeAfter| for the @@ -14334,13 +14294,11 @@ version 2005/12/01 or later. vlines .clist_set:N = \l_@@_submatrix_vlines_clist , vlines .default:n = all , hvlines .meta:n = { hlines, vlines } , - hvlines .value_forbidden:n = true , + hvlines .value_forbidden:n = true } \keys_define:nn { NiceMatrix } { SubMatrix .inherit:n = NiceMatrix / sub-matrix , - CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix , - NiceMatrix / sub-matrix .inherit:n = NiceMatrix / sub-matrix , NiceArray / sub-matrix .inherit:n = NiceMatrix / sub-matrix , pNiceArray / sub-matrix .inherit:n = NiceMatrix / sub-matrix , NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix , @@ -14385,6 +14343,8 @@ version 2005/12/01 or later. } % \end{macrocode} % +% +% % \bigskip % \begin{macrocode} \NewDocumentCommand \@@_SubMatrix_in_code_before { m m m m ! O { } } @@ -15133,6 +15093,109 @@ version 2005/12/01 or later. { } } % \end{macrocode} +% +% \bigskip +% \section{The command TikzEveryCell} +% +% \begin{macrocode} + + +\bool_new:N \l_@@_not_empty_bool +\bool_new:N \l_@@_empty_bool + +\keys_define:nn { NiceMatrix / TikzEveryCell } + { + not-empty .code:n = + \bool_lazy_or:nnTF + \l_@@_in_code_after_bool + \g_@@_recreate_cell_nodes_bool + { \bool_set_true:N \l_@@_not_empty_bool } + { \@@_error:n { detection~of~empty~cells } } , + not-empty .value_forbidden:n = true , + empty .code:n = + \bool_lazy_or:nnTF + \l_@@_in_code_after_bool + \g_@@_recreate_cell_nodes_bool + { \bool_set_true:N \l_@@_empty_bool } + { \@@_error:n { detection~of~empty~cells } } , + empty .value_forbidden:n = true , + unknown .code:n = \@@_error:n { Unknown~key~for~TikzEveryCell } + } + + +\NewDocumentCommand { \@@_TikzEveryCell } { O { } m } + { + \IfPackageLoadedTF { tikz } + { + \group_begin: + \keys_set:nn { NiceMatrix / TikzEveryCell } { #1 } + \tl_set:Nn \l_tmpa_tl { #2 } + \seq_map_inline:Nn \g_@@_pos_of_blocks_seq + { \@@_for_a_block:nnnnn ##1 } + \@@_all_the_cells: + \group_end: + } + { \@@_error:n { TikzEveryCell~without~tikz } } + } + +\tl_new:N \@@_i_tl +\tl_new:N \@@_j_tl + +\cs_new_protected:Nn \@@_all_the_cells: + { + \int_step_variable:nNn { \int_use:c { c@iRow } } \@@_i_tl + { + \int_step_variable:nNn { \int_use:c { c@jCol } } \@@_j_tl + { + \cs_if_exist:cF { cell - \@@_i_tl - \@@_j_tl } + { + \exp_args:NNx \seq_if_in:NnF \l_@@_corners_cells_seq + { \@@_i_tl - \@@_j_tl } + { + \bool_set_false:N \l_tmpa_bool + \cs_if_exist:cTF + { pgf @ sh @ ns @ \@@_env: - \@@_i_tl - \@@_j_tl } + { + \bool_if:NF \l_@@_empty_bool + { \bool_set_true:N \l_tmpa_bool } + } + { + \bool_if:NF \l_@@_not_empty_bool + { \bool_set_true:N \l_tmpa_bool } + } + \bool_if:NT \l_tmpa_bool + { + \@@_block_tikz:nnnnV + \@@_i_tl \@@_j_tl \@@_i_tl \@@_j_tl \l_tmpa_tl + } + } + } + } + } + } + +\cs_new_protected:Nn \@@_for_a_block:nnnnn + { + \bool_if:NF \l_@@_empty_bool + { + \@@_block_tikz:nnnnV + { #1 } { #2 } { #3 } { #4 } \l_tmpa_tl + } + \@@_mark_cells_of_block:nnnn { #1 } { #2 } { #3 } { #4 } + } + +\cs_new_protected:Nn \@@_mark_cells_of_block:nnnn + { + \int_step_inline:nnn { #1 } { #3 } + { + \int_step_inline:nnn { #2 } { #4 } + { \cs_set:cpn { cell - ##1 - ####1 } { } } + } + } + + +% \end{macrocode} +% % % \bigskip % \section{The command \textbackslash ShowCellNames} @@ -15494,27 +15557,7 @@ version 2005/12/01 or later. } } } - { - \IfPackageLoadedTF { tabularx } - { - \str_if_eq:VnTF \g_@@_name_env_str { NiceTabularX } - { - \int_compare:nNnTF \c@iRow = \c_zero_int - { \@@_fatal:n { X~columns~with~tabularx } } - { - \@@_fatal:nn { too~much~cols~for~array } - { - However,~this~message~may~be~erroneous:~ - maybe~you~have~used~X~columns~while~'tabularx'~is~loaded,~ - ~which~is~forbidden~(however,~it's~still~possible~to~use~ - X~columns~in~{NiceTabularX}). - } - } - } - { \@@_fatal:nn { too~much~cols~for~array } { } } - } - { \@@_fatal:nn { too~much~cols~for~array } { } } - } + { \@@_fatal:nn { too~much~cols~for~array } } } % \end{macrocode} % @@ -15593,22 +15636,11 @@ version 2005/12/01 or later. ~you~try~to~use~more~columns~than~allowed~by~your~ \@@_full_name_env:.\@@_message_hdotsfor:\ The~maximal~number~of~columns~is~ \int_use:N \g_@@_static_num_of_col_int\ - ~(plus~the~potential~exterior~ones).~#1 + ~(plus~the~potential~exterior~ones). This~error~is~fatal. } % \end{macrocode} % -% \medskip -% \begin{macrocode} -\@@_msg_new:nn { X~columns~with~tabularx } - { - There~is~a~problem.\\ - You~have~probably~used~X~columns~in~your~environment~{\g_@@_name_env_str}.~ - That's~not~allowed~because~'tabularx'~is~loaded~(however,~you~can~use~X~columns~ - in~an~environment~{NiceTabularX}).\\ - This~error~is~fatal. - } -% \end{macrocode} % % \begin{macrocode} \@@_msg_new:nn { columns~not~used } @@ -15735,6 +15767,16 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { Unknown~key~for~TikzEveryCell } + { + Unknown~key.\\ + There~is~only~two~keys~available~here:~ + 'empty'~and~'not-empty'.\\ + Your~key~'\l_keys_key_str'~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { Unknown~key~for~rotate } { Unknown~key.\\ @@ -15876,6 +15918,17 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { detection~of~empty~cells } + { + Problem~with~'not-empty'\\ + For~technical~reasons,~you~must~activate~ + 'recreate-cell-nodes'~in~\token_to_str:N \CodeBefore\ + in~order~to~use~the~key~'\l_keys_key_str'.\\ + That~key~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { ragged2e~not~loaded } { You~have~to~load~'ragged2e'~in~order~to~use~the~key~'\l_keys_key_str'~in~ @@ -16066,9 +16119,19 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { TikzEveryCell~without~tikz } + { + TikZ~not~loaded.\\ + You~can't~use~\token_to_str:N \TikzEveryCell\ + because~you~have~not~loaded~tikz.~ + This~command~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { tikz~key~without~tikz } { - Tikz~not~loaded.\\ + TikZ~not~loaded.\\ You~can't~use~the~key~'tikz'~for~the~command~'\token_to_str:N \Block'~because~you~have~not~loaded~tikz.~ This~key~will~be~ignored. @@ -16190,6 +16253,15 @@ version 2005/12/01 or later. % \end{macrocode} % % \begin{macrocode} +\@@_msg_new:nn { tikz~without~tikz } + { + Tikz~not~loaded.\\ + You~can't~use~the~key~'tikz'~here~because~Tikz~is~not~ + loaded.~If~you~go~on,~that~key~will~be~ignored. + } +% \end{macrocode} +% +% \begin{macrocode} \@@_msg_new:nn { tikz~in~custom-line~without~tikz } { Tikz~not~loaded.\\ @@ -16714,6 +16786,15 @@ version 2005/12/01 or later. } % \end{macrocode} % +% \begin{macrocode} +\@@_msg_new:nn { NiceTabularX~without~X } + { + NiceTabularX~without~X.\\ + You~should~not~use~{NiceTabularX}~without~X~columns.\\ + However,~you~can~go~on. + } +% \end{macrocode} +% % \newpage % \tableofcontents % |