%% %% This is file `nicematrix.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% nicematrix.dtx (with options: `package') %% %% Copyright (C) 2018-2021 by F. Pantigny %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either %% version 1.3 of this license or (at your option) any later %% version. The latest version of this license is in: %% %% http://www.latex-project.org/lppl.txt %% %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% \def\myfileversion{5.12} \def\myfiledate{2021/03/10} \RequirePackage{pgfcore} \usepgfmodule{shapes} \RequirePackage{l3keys2e} \ProvidesExplPackage {nicematrix} {\myfiledate} {\myfileversion} {Enhanced arrays with the help of PGF/TikZ} \RequirePackage { xparse } \RequirePackage { array } \RequirePackage { amsmath } \cs_new_protected:Npn \__nicematrix_error:n { \msg_error:nn { nicematrix } } \cs_new_protected:Npn \__nicematrix_error:nn { \msg_error:nnn { nicematrix } } \cs_new_protected:Npn \__nicematrix_error:nnn { \msg_error:nnnn { nicematrix } } \cs_new_protected:Npn \__nicematrix_fatal:n { \msg_fatal:nn { nicematrix } } \cs_new_protected:Npn \__nicematrix_fatal:nn { \msg_fatal:nnn { nicematrix } } \cs_new_protected:Npn \__nicematrix_msg_new:nn { \msg_new:nnn { nicematrix } } \cs_new_protected:Npn \__nicematrix_msg_new:nnn { \msg_new:nnnn { nicematrix } } \cs_new_protected:Npn \__nicematrix_msg_redirect_name:nn { \msg_redirect_name:nnn { nicematrix } } \bool_new:N \c__nicematrix_in_preamble_bool \bool_set_true:N \c__nicematrix_in_preamble_bool \AtBeginDocument { \bool_set_false:N \c__nicematrix_in_preamble_bool } \bool_new:N \c__nicematrix_arydshln_loaded_bool \bool_new:N \c__nicematrix_booktabs_loaded_bool \bool_new:N \c__nicematrix_enumitem_loaded_bool \bool_new:N \c__nicematrix_tikz_loaded_bool \AtBeginDocument { \@ifpackageloaded { arydshln } { \bool_set_true:N \c__nicematrix_arydshln_loaded_bool } { } \@ifpackageloaded { booktabs } { \bool_set_true:N \c__nicematrix_booktabs_loaded_bool } { } \@ifpackageloaded { enumitem } { \bool_set_true:N \c__nicematrix_enumitem_loaded_bool } { } \@ifpackageloaded { tikz } { \bool_set_true:N \c__nicematrix_tikz_loaded_bool \tl_const:Nn \c__nicematrix_pgfortikzpicture_tl { \exp_not:N \tikzpicture } \tl_const:Nn \c__nicematrix_endpgfortikzpicture_tl { \exp_not:N \endtikzpicture } } { \tl_const:Nn \c__nicematrix_pgfortikzpicture_tl { \exp_not:N \pgfpicture } \tl_const:Nn \c__nicematrix_endpgfortikzpicture_tl { \exp_not:N \endpgfpicture } } } \bool_new:N \c__nicematrix_revtex_bool \@ifclassloaded { revtex4-1 } { \bool_set_true:N \c__nicematrix_revtex_bool } { } \@ifclassloaded { revtex4-2 } { \bool_set_true:N \c__nicematrix_revtex_bool } { } \cs_if_exist:NT \rvtx@ifformat@geq { \bool_set_true:N \c__nicematrix_revtex_bool } \cs_generate_variant:Nn \tl_if_single_token_p:n { V } \ProvideDocumentCommand \iddots { } { \mathinner { \tex_mkern:D 1 mu \box_move_up:nn { 1 pt } { \hbox:n { . } } \tex_mkern:D 2 mu \box_move_up:nn { 4 pt } { \hbox:n { . } } \tex_mkern:D 2 mu \box_move_up:nn { 7 pt } { \vbox:n { \kern 7 pt \hbox:n { . } } } \tex_mkern:D 1 mu } } \AtBeginDocument { \@ifpackageloaded { booktabs } { \iow_now:Nn \@mainaux \nicematrix@redefine@check@rerun } { } } \cs_set_protected:Npn \nicematrix@redefine@check@rerun { \cs_set_eq:NN \__nicematrix_old_pgfutil@check@rerun \pgfutil@check@rerun \cs_set_protected:Npn \pgfutil@check@rerun ##1 ##2 { \str_if_eq:eeF { nm- } { \tl_range:nnn { ##1 } 1 3 } { \__nicematrix_old_pgfutil@check@rerun { ##1 } { ##2 } } } } \bool_new:N \c__nicematrix_colortbl_loaded_bool \AtBeginDocument { \@ifpackageloaded { colortbl } { \bool_set_true:N \c__nicematrix_colortbl_loaded_bool } { \cs_set_protected:Npn \CT@arc@ { } \cs_set:Npn \arrayrulecolor #1 # { \CT@arc { #1 } } \cs_set:Npn \CT@arc #1 #2 { \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign { \cs_gset:Npn \CT@arc@ { \color #1 { #2 } } } } \cs_set_protected:Npn \CT@drsc@ { } \cs_set:Npn \doublerulesepcolor #1 # { \CT@drs { #1 } } \cs_set:Npn\CT@drs #1 #2 { \dim_compare:nNnT \baselineskip = \c_zero_dim \noalign { \cs_gset:Npn \CT@drsc@ { \color #1 { #2 } } } } \cs_set:Npn \hline { \noalign { \ifnum 0 = `} \fi \cs_set_eq:NN \hskip \vskip \cs_set_eq:NN \vrule \hrule \cs_set_eq:NN \@width \@height { \CT@arc@ \vline } \futurelet \reserved@a \@xhline } } } \cs_set:Npn \__nicematrix_standard_cline #1 { \__nicematrix_standard_cline:w #1 \q_stop } \cs_set:Npn \__nicematrix_standard_cline:w #1-#2 \q_stop { \int_compare:nNnT \l__nicematrix_first_col_int = 0 { \omit & } \int_compare:nNnT { #1 } > 1 { \multispan { \__nicematrix_pred:n { #1 } } & } \multispan { \int_eval:n { #2 - #1 + 1 } } { \CT@arc@ \leaders \hrule \@height \arrayrulewidth \hfill \skip_horizontal:N \c_zero_dim } \everycr { } \cr \noalign { \skip_vertical:N -\arrayrulewidth } } \cs_set:Npn \__nicematrix_cline { \__nicematrix_cline_i:en \l__nicematrix_first_col_int } \cs_set:Npn \__nicematrix_cline_i:nn #1 #2 { \__nicematrix_cline_i:w #1-#2 \q_stop } \cs_set:Npn \__nicematrix_cline_i:w #1-#2-#3 \q_stop { \int_compare:nNnT { #1 } < { #2 } { \multispan { \int_eval:n { #2 - #1 } } & } \multispan { \int_eval:n { #3 - #2 + 1 } } { \CT@arc@ \leaders \hrule \@height \arrayrulewidth \hfill \skip_horizontal:N \c_zero_dim } \peek_meaning_remove_ignore_spaces:NTF \cline { & \__nicematrix_cline_i:en { \__nicematrix_succ:n { #3 } } } { \everycr { } \cr } } \cs_generate_variant:Nn \__nicematrix_cline_i:nn { e n } \cs_new:Npn \__nicematrix_succ:n #1 { \the \numexpr #1 + 1 \relax } \cs_new:Npn \__nicematrix_pred:n #1 { \the \numexpr #1 - 1 \relax } \cs_new:Npn \__nicematrix_math_toggle_token: { \bool_if:NF \l__nicematrix_NiceTabular_bool \c_math_toggle_token } \cs_new_protected:Npn \__nicematrix_set_CT@arc@: { \peek_meaning:NTF [ \__nicematrix_set_CT@arc@_i: \__nicematrix_set_CT@arc@_ii: } \cs_new_protected:Npn \__nicematrix_set_CT@arc@_i: [ #1 ] #2 \q_stop { \cs_set:Npn \CT@arc@ { \color [ #1 ] { #2 } } } \cs_new_protected:Npn \__nicematrix_set_CT@arc@_ii: #1 \q_stop { \cs_set:Npn \CT@arc@ { \color { #1 } } } \cs_set_eq:NN \__nicematrix_old_pgfpointanchor \pgfpointanchor \bool_new:N \c__nicematrix_siunitx_loaded_bool \AtBeginDocument { \@ifpackageloaded { siunitx } { \bool_set_true:N \c__nicematrix_siunitx_loaded_bool } { } } \cs_set_protected:Npn \__nicematrix_adapt_S_column: { \bool_if:NT \c__nicematrix_siunitx_loaded_bool { \group_begin: \@temptokena = { } \cs_set_eq:NN \NC@find \prg_do_nothing: \NC@rewrite@S { } \tl_gset:NV \g_tmpa_tl \@temptokena \group_end: \tl_new:N \c__nicematrix_table_collect_begin_tl \tl_set:Nx \l_tmpa_tl { \tl_item:Nn \g_tmpa_tl 2 } \tl_gset:Nx \c__nicematrix_table_collect_begin_tl { \tl_item:Nn \l_tmpa_tl 1 } \tl_new:N \c__nicematrix_table_print_tl \tl_gset:Nx \c__nicematrix_table_print_tl { \tl_item:Nn \g_tmpa_tl { -1 } } \cs_gset_eq:NN \__nicematrix_adapt_S_column: \prg_do_nothing: } } \AtBeginDocument { \bool_if:nTF { ! \c__nicematrix_siunitx_loaded_bool } { \cs_set_eq:NN \__nicematrix_renew_NC@rewrite@S: \prg_do_nothing: } { \cs_new_protected:Npn \__nicematrix_renew_NC@rewrite@S: { \renewcommand*{\NC@rewrite@S}[1][] { \@temptokena \exp_after:wN { \tex_the:D \@temptokena > { \__nicematrix_Cell: \c__nicematrix_table_collect_begin_tl S {##1} } \__nicematrix_true_c: < { \c__nicematrix_table_print_tl \__nicematrix_end_Cell: } } \NC@find } } } } \regex_const:Nn \c__nicematrix_columncolor_regex { \c { columncolor } } \cs_new_protected:Npn \__nicematrix_provide_pgfsyspdfmark: { \iow_now:Nn \@mainaux { \ExplSyntaxOn \cs_if_free:NT \pgfsyspdfmark { \cs_set_eq:NN \pgfsyspdfmark \@gobblethree } \ExplSyntaxOff } \cs_gset_eq:NN \__nicematrix_provide_pgfsyspdfmark: \prg_do_nothing: } \bool_new:N \c__nicematrix_define_L_C_R_bool \cs_new_protected:Npn \__nicematrix_define_L_C_R: { \newcolumntype L l \newcolumntype C c \newcolumntype R r } \int_new:N \g__nicematrix_env_int \cs_new:Npn \__nicematrix_env: { nm - \int_use:N \g__nicematrix_env_int } \NewExpandableDocumentCommand \NiceMatrixLastEnv { } { \int_use:N \g__nicematrix_env_int } \cs_new_protected:Npn \__nicematrix_qpoint:n #1 { \pgfpointanchor { \__nicematrix_env: - #1 } { center } } \int_new:N \g__nicematrix_NiceMatrixBlock_int \dim_new:N \l__nicematrix_columns_width_dim \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 \dim_new:N \g__nicematrix_blocks_ht_dim \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 \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 \bool_new:N \g__nicematrix_rotate_bool \cs_new_protected:Npn \__nicematrix_test_if_math_mode: { \if_mode_math: \else: \__nicematrix_fatal:n { Outside~math~mode } \fi: } \tl_new:N \l__nicematrix_letter_vlism_tl \seq_new:N \g__nicematrix_cols_vlism_seq \colorlet { nicematrix-last-col } { . } \colorlet { nicematrix-last-row } { . } \str_new:N \g__nicematrix_name_env_str \tl_set:Nn \g__nicematrix_com_or_env_str { environment } \cs_new:Npn \__nicematrix_full_name_env: { \str_if_eq:VnTF \g__nicematrix_com_or_env_str { command } { command \space \c_backslash_str \g__nicematrix_name_env_str } { environment \space \{ \g__nicematrix_name_env_str \} } } \tl_new:N \g_nicematrix_code_after_tl \tl_new:N \l__nicematrix_code_tl \tl_new:N \g__nicematrix_internal_code_after_tl \int_new:N \l__nicematrix_old_iRow_int \int_new:N \l__nicematrix_old_jCol_int \tl_new:N \l__nicematrix_rules_color_tl \bool_new:N \g__nicematrix_after_col_zero_bool \bool_new:N \g__nicematrix_row_of_col_done_bool \bool_new:N \g__nicematrix_not_empty_cell_bool \tl_new:N \l__nicematrix_code_before_tl \bool_new:N \l__nicematrix_code_before_bool \dim_new:N \l__nicematrix_x_initial_dim \dim_new:N \l__nicematrix_y_initial_dim \dim_new:N \l__nicematrix_x_final_dim \dim_new:N \l__nicematrix_y_final_dim \dim_zero_new:N \l_tmpc_dim \dim_zero_new:N \l_tmpd_dim \bool_new:N \g__nicematrix_empty_cell_bool \dim_new:N \g__nicematrix_width_last_col_dim \dim_new:N \g__nicematrix_width_first_col_dim \seq_new:N \g__nicematrix_blocks_seq \seq_new:N \g__nicematrix_pos_of_blocks_seq \seq_new:N \g__nicematrix_pos_of_xdots_seq \seq_new:N \g__nicematrix_pos_of_stroken_blocks_seq \seq_new:N \g__nicematrix_submatrix_names_seq \int_new:N \l__nicematrix_row_min_int \int_new:N \l__nicematrix_row_max_int \int_new:N \l__nicematrix_col_min_int \int_new:N \l__nicematrix_col_max_int \seq_new:N \g__nicematrix_submatrix_seq \int_new:N \g__nicematrix_static_num_of_col_int \tl_new:N \l__nicematrix_fill_tl \tl_new:N \l__nicematrix_draw_tl \dim_new:N \l__nicematrix_rounded_corners_dim \tl_new:N \l__nicematrix_color_tl \dim_new:N \l__nicematrix_line_width_dim \tl_new:N \l__nicematrix_pos_of_block_tl \tl_set:Nn \l__nicematrix_pos_of_block_tl { c } \bool_new:N \l__nicematrix_draw_first_bool \int_new:N \g__nicematrix_block_box_int \dim_new:N \l__nicematrix_submatrix_extra_height_dim \dim_new:N \l__nicematrix_submatrix_left_xshift_dim \dim_new:N \l__nicematrix_submatrix_right_xshift_dim \clist_new:N \l__nicematrix_hlines_clist \clist_new:N \l__nicematrix_vlines_clist \int_new:N \l__nicematrix_first_row_int \int_set:Nn \l__nicematrix_first_row_int 1 \int_new:N \l__nicematrix_first_col_int \int_set:Nn \l__nicematrix_first_col_int 1 \int_new:N \l__nicematrix_last_row_int \int_set:Nn \l__nicematrix_last_row_int { -2 } \bool_new:N \l__nicematrix_last_row_without_value_bool \bool_new:N \l__nicematrix_last_col_without_value_bool \int_new:N \l__nicematrix_last_col_int \int_set:Nn \l__nicematrix_last_col_int { -2 } \bool_new:N \g__nicematrix_last_col_found_bool \newcounter { tabularnote } \seq_new:N \g__nicematrix_tabularnotes_seq \tl_new:N \l__nicematrix_tabularnote_tl \int_new:N \l__nicematrix_number_of_notes_int \cs_new:Npn \__nicematrix_notes_style:n #1 { \textit { \alph { #1 } } } \cs_new:Npn \__nicematrix_notes_label_in_tabular:n #1 { \textsuperscript { #1 } } \cs_new:Npn \__nicematrix_notes_label_in_list:n #1 { \textsuperscript { #1 } } \cs_set:Npn \thetabularnote { { \__nicematrix_notes_style:n { tabularnote } } } \AtBeginDocument { \bool_if:nTF { ! \c__nicematrix_enumitem_loaded_bool } { \NewDocumentCommand \tabularnote { m } { \__nicematrix_error:n { enumitem~not~loaded } } } { \newlist { tabularnotes } { enumerate } { 1 } \setlist [ tabularnotes ] { topsep = 0pt , noitemsep , leftmargin = * , align = left , labelsep = 0pt , label = \__nicematrix_notes_label_in_list:n { \__nicematrix_notes_style:n { tabularnotesi } } , } \newlist { tabularnotes* } { enumerate* } { 1 } \setlist [ tabularnotes* ] { afterlabel = \nobreak , itemjoin = \quad , label = \__nicematrix_notes_label_in_list:n { \__nicematrix_notes_style:n { tabularnotes*i } } } \NewDocumentCommand \tabularnote { m } { \bool_if:nTF { ! \l__nicematrix_NiceArray_bool && \l__nicematrix_in_env_bool } { \__nicematrix_error:n { tabularnote~forbidden } } { \int_incr:N \l__nicematrix_number_of_notes_int \seq_gput_right:Nn \g__nicematrix_tabularnotes_seq { #1 } \peek_meaning:NF \tabularnote { \hbox_set:Nn \l_tmpa_box { \__nicematrix_notes_label_in_tabular:n { \stepcounter { tabularnote } \__nicematrix_notes_style:n { tabularnote } \prg_replicate:nn { \l__nicematrix_number_of_notes_int - 1 } { , \stepcounter { tabularnote } \__nicematrix_notes_style:n { tabularnote } } } } \addtocounter { tabularnote } { -1 } \refstepcounter { tabularnote } \int_zero:N \l__nicematrix_number_of_notes_int \hbox_overlap_right:n { \box_use:N \l_tmpa_box } \skip_horizontal:n { \box_wd:N \l_tmpa_box } } } } } } \cs_new_protected:Npn \__nicematrix_pgf_rect_node:nnnnn #1 #2 #3 #4 #5 { \begin { pgfscope } \pgfset { outer~sep = \c_zero_dim , inner~sep = \c_zero_dim , minimum~size = \c_zero_dim } \pgftransformshift { \pgfpoint { 0.5 * ( #2 + #4 ) } { 0.5 * ( #3 + #5 ) } } \pgfnode { rectangle } { center } { \vbox_to_ht:nn { \dim_abs:n { #5 - #3 } } { \vfill \hbox_to_wd:nn { \dim_abs:n { #4 - #2 } } { } } } { #1 } { } \end { pgfscope } } \cs_new_protected:Npn \__nicematrix_pgf_rect_node:nnn #1 #2 #3 { \begin { pgfscope } \pgfset { outer~sep = \c_zero_dim , inner~sep = \c_zero_dim , minimum~size = \c_zero_dim } \pgftransformshift { \pgfpointscale { 0.5 } { \pgfpointadd { #2 } { #3 } } } \pgfpointdiff { #3 } { #2 } \pgfgetlastxy \l_tmpa_dim \l_tmpb_dim \pgfnode { rectangle } { center } { \vbox_to_ht:nn { \dim_abs:n \l_tmpb_dim } { \vfill \hbox_to_wd:nn { \dim_abs:n \l_tmpa_dim } { } } } { #1 } { } \end { pgfscope } } \bool_new:N \l__nicematrix_colortbl_like_bool \bool_new:N \l__nicematrix_standard_cline_bool \dim_new:N \l__nicematrix_cell_space_top_limit_dim \dim_new:N \l__nicematrix_cell_space_bottom_limit_dim \dim_new:N \l__nicematrix_inter_dots_dim \AtBeginDocument { \dim_set:Nn \l__nicematrix_inter_dots_dim { 0.45 em } } \dim_new:N \l__nicematrix_xdots_shorten_dim \AtBeginDocument { \dim_set:Nn \l__nicematrix_xdots_shorten_dim { 0.3 em } } \dim_new:N \l__nicematrix_radius_dim \AtBeginDocument { \dim_set:Nn \l__nicematrix_radius_dim { 0.53 pt } } \tl_new:N \l__nicematrix_xdots_line_style_tl \tl_const:Nn \c__nicematrix_standard_tl { standard } \tl_set_eq:NN \l__nicematrix_xdots_line_style_tl \c__nicematrix_standard_tl \bool_new:N \l__nicematrix_light_syntax_bool \tl_new:N \l__nicematrix_baseline_tl \tl_set:Nn \l__nicematrix_baseline_tl c \bool_new:N \l__nicematrix_exterior_arraycolsep_bool \bool_new:N \l__nicematrix_parallelize_diags_bool \bool_set_true:N \l__nicematrix_parallelize_diags_bool \clist_new:N \l__nicematrix_except_corners_clist \dim_new:N \l__nicematrix_notes_above_space_dim \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 \str_new:N \l__nicematrix_name_str \bool_new:N \l__nicematrix_medium_nodes_bool \bool_new:N \l__nicematrix_large_nodes_bool \dim_new:N \l__nicematrix_left_margin_dim \dim_new:N \l__nicematrix_right_margin_dim \dim_new:N \l__nicematrix_extra_left_margin_dim \dim_new:N \l__nicematrix_extra_right_margin_dim \tl_new:N \l__nicematrix_end_of_row_tl \tl_set:Nn \l__nicematrix_end_of_row_tl { ; } \tl_new:N \l__nicematrix_xdots_color_tl \tl_new:N \l__nicematrix_delimiters_color_tl \bool_new:N \l__nicematrix_delimiters_max_width_bool \keys_define:nn { NiceMatrix / xdots } { line-style .code:n = { \bool_lazy_or:nnTF { \cs_if_exist_p:N \tikzpicture } { \str_if_eq_p:nn { #1 } { standard } } { \tl_set:Nn \l__nicematrix_xdots_line_style_tl { #1 } } { \__nicematrix_error:n { bad~option~for~line-style } } } , line-style .value_required:n = true , color .tl_set:N = \l__nicematrix_xdots_color_tl , color .value_required:n = true , shorten .dim_set:N = \l__nicematrix_xdots_shorten_dim , shorten .value_required:n = true , down .tl_set:N = \l__nicematrix_xdots_down_tl , up .tl_set:N = \l__nicematrix_xdots_up_tl , draw-first .code:n = \prg_do_nothing: , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~xdots } } \keys_define:nn { NiceMatrix / rules } { color .tl_set:N = \l__nicematrix_rules_color_tl , color .value_required:n = true , width .dim_set:N = \arrayrulewidth , width .value_required:n = true } \keys_define:nn { NiceMatrix / Global } { rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , rules .value_required:n = true , standard-cline .bool_set:N = \l__nicematrix_standard_cline_bool , standard-cline .default:n = true , cell-space-top-limit .dim_set:N = \l__nicematrix_cell_space_top_limit_dim , cell-space-top-limit .value_required:n = true , cell-space-bottom-limit .dim_set:N = \l__nicematrix_cell_space_bottom_limit_dim , cell-space-bottom-limit .value_required:n = true , cell-space-limits .meta:n = { cell-space-top-limit = #1 , cell-space-bottom-limit = #1 , } , cell-space-limits .value_required:n = true , xdots .code:n = \keys_set:nn { NiceMatrix / xdots } { #1 } , light-syntax .bool_set:N = \l__nicematrix_light_syntax_bool , light-syntax .default:n = true , end-of-row .tl_set:N = \l__nicematrix_end_of_row_tl , end-of-row .value_required:n = true , first-col .code:n = \int_zero:N \l__nicematrix_first_col_int , first-row .code:n = \int_zero:N \l__nicematrix_first_row_int , last-row .int_set:N = \l__nicematrix_last_row_int , last-row .default:n = -1 , code-for-first-col .tl_set:N = \l__nicematrix_code_for_first_col_tl , code-for-first-col .value_required:n = true , code-for-last-col .tl_set:N = \l__nicematrix_code_for_last_col_tl , code-for-last-col .value_required:n = true , code-for-first-row .tl_set:N = \l__nicematrix_code_for_first_row_tl , code-for-first-row .value_required:n = true , code-for-last-row .tl_set:N = \l__nicematrix_code_for_last_row_tl , code-for-last-row .value_required:n = true , hlines .clist_set:N = \l__nicematrix_hlines_clist , vlines .clist_set:N = \l__nicematrix_vlines_clist , hlines .default:n = all , vlines .default:n = all , vlines-in-sub-matrix .code:n = { \tl_if_single_token:nTF { #1 } { \tl_set:Nn \l__nicematrix_letter_vlism_tl { #1 } } { \__nicematrix_error:n { One~letter~allowed } } } , vlines-in-sub-matrix .value_required:n = true , hvlines .code:n = { \clist_set:Nn \l__nicematrix_vlines_clist { all } \clist_set:Nn \l__nicematrix_hlines_clist { all } } , parallelize-diags .bool_set:N = \l__nicematrix_parallelize_diags_bool , renew-dots .bool_set:N = \l__nicematrix_renew_dots_bool , renew-dots .value_forbidden:n = true , nullify-dots .bool_set:N = \l__nicematrix_nullify_dots_bool , create-medium-nodes .bool_set:N = \l__nicematrix_medium_nodes_bool , create-large-nodes .bool_set:N = \l__nicematrix_large_nodes_bool , create-extra-nodes .meta:n = { create-medium-nodes , create-large-nodes } , left-margin .dim_set:N = \l__nicematrix_left_margin_dim , left-margin .default:n = \arraycolsep , right-margin .dim_set:N = \l__nicematrix_right_margin_dim , right-margin .default:n = \arraycolsep , margin .meta:n = { left-margin = #1 , right-margin = #1 } , margin .default:n = \arraycolsep , extra-left-margin .dim_set:N = \l__nicematrix_extra_left_margin_dim , extra-right-margin .dim_set:N = \l__nicematrix_extra_right_margin_dim , extra-margin .meta:n = { extra-left-margin = #1 , extra-right-margin = #1 } , extra-margin .value_required:n = true , } \keys_define:nn { NiceMatrix / Env } { delimiters/max-width .bool_set:N = \l__nicematrix_delimiters_max_width_bool , except-corners .clist_set:N = \l__nicematrix_except_corners_clist , except-corners .default:n = { NW , SW , NE , SE } , hvlines-except-corners .code:n = { \clist_set:Nn \l__nicematrix_except_corners_clist { #1 } \clist_set:Nn \l__nicematrix_vlines_clist { all } \clist_set:Nn \l__nicematrix_hlines_clist { all } } , hvlines-except-corners .default:n = { NW , SW , NE , SE } , code-before .code:n = { \tl_if_empty:nF { #1 } { \tl_put_right:Nn \l__nicematrix_code_before_tl { #1 } \bool_set_true:N \l__nicematrix_code_before_bool } } , c .code:n = \tl_set:Nn \l__nicematrix_baseline_tl c , t .code:n = \tl_set:Nn \l__nicematrix_baseline_tl t , b .code:n = \tl_set:Nn \l__nicematrix_baseline_tl b , baseline .tl_set:N = \l__nicematrix_baseline_tl , baseline .value_required:n = true , columns-width .code:n = \tl_if_eq:nnTF { #1 } { auto } { \bool_set_true:N \l__nicematrix_auto_columns_width_bool } { \dim_set:Nn \l__nicematrix_columns_width_dim { #1 } } , columns-width .value_required:n = true , name .code:n = \legacy_if:nF { measuring@ } { \str_set:Nn \l_tmpa_str { #1 } \seq_if_in:NVTF \g__nicematrix_names_seq \l_tmpa_str { \__nicematrix_error:nn { Duplicate~name } { #1 } } { \seq_gput_left:NV \g__nicematrix_names_seq \l_tmpa_str } \str_set_eq:NN \l__nicematrix_name_str \l_tmpa_str } , name .value_required:n = true , code-after .tl_gset:N = \g_nicematrix_code_after_tl , code-after .value_required:n = true , colortbl-like .code:n = \bool_set_true:N \l__nicematrix_colortbl_like_bool \bool_set_true:N \l__nicematrix_code_before_bool , colortbl-like .value_forbidden:n = true } \keys_define:nn { NiceMatrix / notes } { para .bool_set:N = \l__nicematrix_notes_para_bool , para .default:n = true , code-before .tl_set:N = \l__nicematrix_notes_code_before_tl , code-before .value_required:n = true , code-after .tl_set:N = \l__nicematrix_notes_code_after_tl , code-after .value_required:n = true , bottomrule .bool_set:N = \l__nicematrix_notes_bottomrule_bool , bottomrule .default:n = true , style .code:n = \cs_set:Nn \__nicematrix_notes_style:n { #1 } , style .value_required:n = true , label-in-tabular .code:n = \cs_set:Nn \__nicematrix_notes_label_in_tabular:n { #1 } , label-in-tabular .value_required:n = true , label-in-list .code:n = \cs_set:Nn \__nicematrix_notes_label_in_list:n { #1 } , label-in-list .value_required:n = true , enumitem-keys .code:n = { \bool_if:NTF \c__nicematrix_in_preamble_bool { \AtBeginDocument { \bool_if:NT \c__nicematrix_enumitem_loaded_bool { \setlist* [ tabularnotes ] { #1 } } } } { \bool_if:NT \c__nicematrix_enumitem_loaded_bool { \setlist* [ tabularnotes ] { #1 } } } } , enumitem-keys .value_required:n = true , enumitem-keys-para .code:n = { \bool_if:NTF \c__nicematrix_in_preamble_bool { \AtBeginDocument { \bool_if:NT \c__nicematrix_enumitem_loaded_bool { \setlist* [ tabularnotes* ] { #1 } } } } { \bool_if:NT \c__nicematrix_enumitem_loaded_bool { \setlist* [ tabularnotes* ] { #1 } } } } , enumitem-keys-para .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~notes } } \keys_define:nn { NiceMatrix } { NiceMatrixOptions .inherit:n = { NiceMatrix / Global } , NiceMatrixOptions / xdots .inherit:n = NiceMatrix / xdots , NiceMatrixOptions / rules .inherit:n = NiceMatrix / rules , NiceMatrixOptions / notes .inherit:n = NiceMatrix / notes , NiceMatrixOptions / sub-matrix .inherit:n = NiceMatrix / sub-matrix , SubMatrix / rules .inherit:n = NiceMatrix / rules , CodeAfter / xdots .inherit:n = NiceMatrix / xdots , NiceMatrix .inherit:n = { NiceMatrix / Global , NiceMatrix / Env , } , NiceMatrix / xdots .inherit:n = NiceMatrix / xdots , NiceMatrix / rules .inherit:n = NiceMatrix / rules , NiceTabular .inherit:n = { NiceMatrix / Global , NiceMatrix / Env } , NiceTabular / xdots .inherit:n = NiceMatrix / xdots , NiceTabular / rules .inherit:n = NiceMatrix / rules , NiceArray .inherit:n = { NiceMatrix / Global , NiceMatrix / Env , } , NiceArray / xdots .inherit:n = NiceMatrix / xdots , NiceArray / rules .inherit:n = NiceMatrix / rules , pNiceArray .inherit:n = { NiceMatrix / Global , NiceMatrix / Env , } , pNiceArray / xdots .inherit:n = NiceMatrix / xdots , pNiceArray / rules .inherit:n = NiceMatrix / rules , } \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 .tl_set:N = \l__nicematrix_delimiters_color_tl , 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 , small .bool_set:N = \l__nicematrix_small_bool , small .value_forbidden:n = true , renew-matrix .code:n = \__nicematrix_renew_matrix: , renew-matrix .value_forbidden:n = true , transparent .code:n = { \__nicematrix_renew_matrix: \bool_set_true:N \l__nicematrix_renew_dots_bool \__nicematrix_error:n { Key~transparent } } , transparent .value_forbidden:n = true, exterior-arraycolsep .bool_set:N = \l__nicematrix_exterior_arraycolsep_bool , columns-width .code:n = \tl_if_eq:nnTF { #1 } { auto } { \__nicematrix_error:n { Option~auto~for~columns-width } } { \dim_set:Nn \l__nicematrix_columns_width_dim { #1 } } , allow-duplicate-names .code:n = \__nicematrix_msg_redirect_name:nn { Duplicate~name } { none } , allow-duplicate-names .value_forbidden:n = true , letter-for-dotted-lines .code:n = { \tl_if_single_token:nTF { #1 } { \str_set:Nx \l__nicematrix_letter_for_dotted_lines_str { #1 } } { \__nicematrix_error:n { One~letter~allowed } } } , letter-for-dotted-lines .value_required:n = true , notes .code:n = \keys_set:nn { NiceMatrix / notes } { #1 } , notes .value_required:n = true , sub-matrix .code:n = \keys_set:nn { NiceMatrix / sub-matrix } { #1 } , sub-matrix .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~NiceMatrixOptions } } \str_new:N \l__nicematrix_letter_for_dotted_lines_str \str_set_eq:NN \l__nicematrix_letter_for_dotted_lines_str \c_colon_str \NewDocumentCommand \NiceMatrixOptions { m } { \keys_set:nn { NiceMatrix / NiceMatrixOptions } { #1 } } \keys_define:nn { NiceMatrix / NiceMatrix } { last-col .code:n = \tl_if_empty:nTF {#1} { \bool_set_true:N \l__nicematrix_last_col_without_value_bool \int_set:Nn \l__nicematrix_last_col_int { -1 } } { \int_set:Nn \l__nicematrix_last_col_int { #1 } } , l .code:n = \tl_set:Nn \l__nicematrix_type_of_col_tl l , 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 .tl_set:N = \l__nicematrix_delimiters_color_tl , delimiters-color .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~option~for~NiceMatrix } } \keys_define:nn { NiceMatrix / NiceArray } { small .bool_set:N = \l__nicematrix_small_bool , small .value_forbidden:n = true , last-col .code:n = \tl_if_empty:nF { #1 } { \__nicematrix_error:n { last-col~non~empty~for~NiceArray } } \int_zero:N \l__nicematrix_last_col_int , notes / para .bool_set:N = \l__nicematrix_notes_para_bool , notes / para .default:n = true , notes / bottomrule .bool_set:N = \l__nicematrix_notes_bottomrule_bool , notes / bottomrule .default:n = true , tabularnote .tl_set:N = \l__nicematrix_tabularnote_tl , tabularnote .value_required:n = true , delimiters-color .tl_set:N = \l__nicematrix_delimiters_color_tl , delimiters-color .value_required:n = true , 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 } } \keys_define:nn { NiceMatrix / pNiceArray } { first-col .code:n = \int_zero:N \l__nicematrix_first_col_int , last-col .code:n = \tl_if_empty:nF {#1} { \__nicematrix_error:n { last-col~non~empty~for~NiceArray } } \int_zero:N \l__nicematrix_last_col_int , first-row .code:n = \int_zero:N \l__nicematrix_first_row_int , small .bool_set:N = \l__nicematrix_small_bool , small .value_forbidden: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~NiceMatrix } } \keys_define:nn { NiceMatrix / NiceTabular } { notes / para .bool_set:N = \l__nicematrix_notes_para_bool , notes / para .default:n = true , notes / bottomrule .bool_set:N = \l__nicematrix_notes_bottomrule_bool , notes / bottomrule .default:n = true , tabularnote .tl_set:N = \l__nicematrix_tabularnote_tl , tabularnote .value_required:n = true , last-col .code:n = \tl_if_empty:nF {#1} { \__nicematrix_error:n { last-col~non~empty~for~NiceArray } } \int_zero:N \l__nicematrix_last_col_int , 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~NiceTabular } } \cs_new_protected:Npn \__nicematrix_Cell: { \cs_set_eq:NN \CodeAfter \__nicematrix_CodeAfter_i:n \int_gincr:N \c@jCol \int_compare:nNnT \c@jCol = 1 { \int_compare:nNnT \l__nicematrix_first_col_int = 1 \__nicematrix_begin_of_row: } \int_gset:Nn \g__nicematrix_col_total_int { \int_max:nn \g__nicematrix_col_total_int \c@jCol } \hbox_set:Nw \l__nicematrix_cell_box \bool_if:NF \l__nicematrix_NiceTabular_bool { \c_math_toggle_token \bool_if:NT \l__nicematrix_small_bool \scriptstyle } \int_compare:nNnTF \c@iRow = 0 { \int_compare:nNnT \c@jCol > 0 { \l__nicematrix_code_for_first_row_tl \xglobal \colorlet { nicematrix-first-row } { . } } } { \int_compare:nNnT \c@iRow = \l__nicematrix_last_row_int { \l__nicematrix_code_for_last_row_tl \xglobal \colorlet { nicematrix-last-row } { . } } } } \cs_new_protected:Npn \__nicematrix_begin_of_row: { \int_gincr:N \c@iRow \dim_gset_eq:NN \g__nicematrix_dp_ante_last_row_dim \g__nicematrix_dp_last_row_dim \dim_gset:Nn \g__nicematrix_dp_last_row_dim { \box_dp:N \@arstrutbox } \dim_gset:Nn \g__nicematrix_ht_last_row_dim { \box_ht:N \@arstrutbox } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - row - \int_use:N \c@iRow - base } { \pgfpoint \c_zero_dim { 0.5 \arrayrulewidth } } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - row - \int_use:N \c@iRow - base } { \__nicematrix_env: - row - \int_use:N \c@iRow - base } } \endpgfpicture } \cs_new_protected:Npn \__nicematrix_update_for_first_and_last_row: { \int_compare:nNnTF \c@iRow = 0 { \dim_gset:Nn \g__nicematrix_dp_row_zero_dim { \dim_max:nn \g__nicematrix_dp_row_zero_dim { \box_dp:N \l__nicematrix_cell_box } } \dim_gset:Nn \g__nicematrix_ht_row_zero_dim { \dim_max:nn \g__nicematrix_ht_row_zero_dim { \box_ht:N \l__nicematrix_cell_box } } } { \int_compare:nNnT \c@iRow = 1 { \dim_gset:Nn \g__nicematrix_ht_row_one_dim { \dim_max:nn \g__nicematrix_ht_row_one_dim { \box_ht:N \l__nicematrix_cell_box } } } } } \cs_new_protected:Npn \__nicematrix_rotate_cell_box: { \box_rotate:Nn \l__nicematrix_cell_box { 90 } \int_compare:nNnT \c@iRow = \l__nicematrix_last_row_int { \vbox_set_top:Nn \l__nicematrix_cell_box { \vbox_to_zero:n { } \skip_vertical:n { - \box_ht:N \@arstrutbox + 0.8 ex } \box_use:N \l__nicematrix_cell_box } } \bool_gset_false:N \g__nicematrix_rotate_bool } \cs_new_protected:Npn \__nicematrix_adjust_size_box: { \dim_compare:nNnT \g__nicematrix_blocks_wd_dim > \c_zero_dim { \box_set_wd:Nn \l__nicematrix_cell_box { \dim_max:nn { \box_wd:N \l__nicematrix_cell_box } \g__nicematrix_blocks_wd_dim } \dim_gzero:N \g__nicematrix_blocks_wd_dim } \dim_compare:nNnT \g__nicematrix_blocks_dp_dim > \c_zero_dim { \box_set_dp:Nn \l__nicematrix_cell_box { \dim_max:nn { \box_dp:N \l__nicematrix_cell_box } \g__nicematrix_blocks_dp_dim } \dim_gzero:N \g__nicematrix_blocks_dp_dim } \dim_compare:nNnT \g__nicematrix_blocks_ht_dim > \c_zero_dim { \box_set_ht:Nn \l__nicematrix_cell_box { \dim_max:nn { \box_ht:N \l__nicematrix_cell_box } \g__nicematrix_blocks_ht_dim } \dim_gzero:N \g__nicematrix_blocks_ht_dim } } \cs_new_protected:Npn \__nicematrix_end_Cell: { \__nicematrix_math_toggle_token: \hbox_set_end: \bool_if:NT \g__nicematrix_rotate_bool \__nicematrix_rotate_cell_box: \__nicematrix_adjust_size_box: \box_set_ht:Nn \l__nicematrix_cell_box { \box_ht:N \l__nicematrix_cell_box + \l__nicematrix_cell_space_top_limit_dim } \box_set_dp:Nn \l__nicematrix_cell_box { \box_dp:N \l__nicematrix_cell_box + \l__nicematrix_cell_space_bottom_limit_dim } \dim_gset:Nn \g__nicematrix_max_cell_width_dim { \dim_max:nn \g__nicematrix_max_cell_width_dim { \box_wd:N \l__nicematrix_cell_box } } \__nicematrix_update_for_first_and_last_row: \bool_if:NTF \g__nicematrix_empty_cell_bool { \box_use_drop:N \l__nicematrix_cell_box } { \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: { \box_use_drop:N \l__nicematrix_cell_box } } \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: { \pgfpicture \pgfsetbaseline \c_zero_dim \pgfrememberpicturepositiononpagetrue \pgfset { inner~sep = \c_zero_dim , minimum~width = \c_zero_dim } \pgfnode { rectangle } { base } { \box_use_drop:N \l__nicematrix_cell_box } { \__nicematrix_env: - \int_use:N \c@iRow - \int_use:N \c@jCol } { } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - \int_use:N \c@iRow - \int_use:N \c@jCol } { \__nicematrix_env: - \int_use:N \c@iRow - \int_use:N \c@jCol } } \endpgfpicture } \cs_new_protected:Npn \__nicematrix_instruction_of_type:nnn #1 #2 #3 { \bool_if:nTF { #1 } \tl_gput_left:cx \tl_gput_right:cx { g__nicematrix_ #2 _ lines _ tl } { \use:c { __nicematrix _ draw _ #2 : nnn } { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \exp_not:n { #3 } } } } \cs_new_protected:Npn \__nicematrix_revtex_array: { \cs_set_eq:NN \@acoll \@arrayacol \cs_set_eq:NN \@acolr \@arrayacol \cs_set_eq:NN \@acol \@arrayacol \cs_set_nopar:Npn \@halignto { } \@array@array } \cs_new_protected:Npn \__nicematrix_array: { \bool_if:NTF \c__nicematrix_revtex_bool \__nicematrix_revtex_array: { \bool_if:NTF \l__nicematrix_NiceTabular_bool { \dim_set_eq:NN \col@sep \tabcolsep } { \dim_set_eq:NN \col@sep \arraycolsep } \dim_compare:nNnTF \l__nicematrix_tabular_width_dim = \c_zero_dim { \cs_set_nopar:Npn \@halignto { } } { \cs_set_nopar:Npx \@halignto { to \dim_use:N \l__nicematrix_tabular_width_dim } } \@tabarray } [ \str_if_eq:VnTF \l__nicematrix_baseline_tl c c t ] } \cs_set_eq:NN \__nicematrix_old_ialign: \ialign \cs_new_protected:Npn \__nicematrix_create_row_node: { \hbox { \bool_if:NT \l__nicematrix_code_before_bool { \vtop { \skip_vertical:N 0.5\arrayrulewidth \pgfsys@markposition { \__nicematrix_env: - row - \__nicematrix_succ:n \c@iRow } \skip_vertical:N -0.5\arrayrulewidth } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - row - \__nicematrix_succ:n \c@iRow } { \pgfpoint \c_zero_dim { - 0.5 \arrayrulewidth } } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - row - \int_use:N \c@iRow } { \__nicematrix_env: - row - \int_use:N \c@iRow } } \endpgfpicture } } \cs_new:Npn \__nicematrix_everycr: { \noalign { \__nicematrix_everycr_i: } } \cs_new_protected:Npn \__nicematrix_everycr_i: { \int_gzero:N \c@jCol \bool_gset_false:N \g__nicematrix_after_col_zero_bool \bool_if:NF \g__nicematrix_row_of_col_done_bool { \__nicematrix_create_row_node: \tl_if_empty:NF \l__nicematrix_hlines_clist { \tl_if_eq:NnF \l__nicematrix_hlines_clist { all } { \exp_args:NNx \clist_if_in:NnT \l__nicematrix_hlines_clist { \__nicematrix_succ:n \c@iRow } } { \int_compare:nNnT \c@iRow > { -1 } { \int_compare:nNnF \c@iRow = \l__nicematrix_last_row_int { \hrule height \arrayrulewidth width \c_zero_dim } } } } } } \cs_set_protected:Npn \__nicematrix_newcolumntype #1 { \cs_set:cpn { NC @ find @ #1 } ##1 #1 { \NC@ { ##1 } } \peek_meaning:NTF [ { \newcol@ #1 } { \newcol@ #1 [ 0 ] } } \cs_set_protected:Npn \__nicematrix_renew_dots: { \cs_set_eq:NN \ldots \__nicematrix_Ldots \cs_set_eq:NN \cdots \__nicematrix_Cdots \cs_set_eq:NN \vdots \__nicematrix_Vdots \cs_set_eq:NN \ddots \__nicematrix_Ddots \cs_set_eq:NN \iddots \__nicematrix_Iddots \cs_set_eq:NN \dots \__nicematrix_Ldots \cs_set_eq:NN \hdotsfor \__nicematrix_Hdotsfor: } \cs_new_protected:Npn \__nicematrix_colortbl_like: { \cs_set_eq:NN \cellcolor \__nicematrix_cellcolor_tabular \cs_set_eq:NN \rowcolor \__nicematrix_rowcolor_tabular \cs_set_eq:NN \columncolor \__nicematrix_columncolor_preamble } \cs_new_protected:Npn \__nicematrix_pre_array_ii: { \bool_if:NT \c__nicematrix_booktabs_loaded_bool { \tl_put_left:Nn \@BTnormal \__nicematrix_create_row_node: } \box_clear_new:N \l__nicematrix_cell_box \cs_if_exist:NT \theiRow { \int_set_eq:NN \l__nicematrix_old_iRow_int \c@iRow } \int_gzero_new:N \c@iRow \cs_if_exist:NT \thejCol { \int_set_eq:NN \l__nicematrix_old_jCol_int \c@jCol } \int_gzero_new:N \c@jCol \normalbaselines \bool_if:NT \l__nicematrix_small_bool { \cs_set_nopar:Npn \arraystretch { 0.47 } \dim_set:Nn \arraycolsep { 1.45 pt } } \cs_set_nopar:Npn \ialign { \bool_if:NTF \c__nicematrix_colortbl_loaded_bool { \CT@everycr { \noalign { \cs_gset_eq:NN \CT@row@color \prg_do_nothing: } \__nicematrix_everycr: } } { \everycr { \__nicematrix_everycr: } } \tabskip = \c_zero_skip \dim_gzero_new:N \g__nicematrix_dp_row_zero_dim \dim_gset:Nn \g__nicematrix_dp_row_zero_dim { \box_dp:N \@arstrutbox } \dim_gzero_new:N \g__nicematrix_ht_row_zero_dim \dim_gset:Nn \g__nicematrix_ht_row_zero_dim { \box_ht:N \@arstrutbox } \dim_gzero_new:N \g__nicematrix_ht_row_one_dim \dim_gset:Nn \g__nicematrix_ht_row_one_dim { \box_ht:N \@arstrutbox } \dim_gzero_new:N \g__nicematrix_dp_ante_last_row_dim \dim_gzero_new:N \g__nicematrix_ht_last_row_dim \dim_gset:Nn \g__nicematrix_ht_last_row_dim { \box_ht:N \@arstrutbox } \dim_gzero_new:N \g__nicematrix_dp_last_row_dim \dim_gset:Nn \g__nicematrix_dp_last_row_dim { \box_dp:N \@arstrutbox } \cs_set_eq:NN \ialign \__nicematrix_old_ialign: \halign } \cs_set_eq:NN \__nicematrix_old_ldots \ldots \cs_set_eq:NN \__nicematrix_old_cdots \cdots \cs_set_eq:NN \__nicematrix_old_vdots \vdots \cs_set_eq:NN \__nicematrix_old_ddots \ddots \cs_set_eq:NN \__nicematrix_old_iddots \iddots \bool_if:NTF \l__nicematrix_standard_cline_bool { \cs_set_eq:NN \cline \__nicematrix_standard_cline } { \cs_set_eq:NN \cline \__nicematrix_cline } \cs_set_eq:NN \Ldots \__nicematrix_Ldots \cs_set_eq:NN \Cdots \__nicematrix_Cdots \cs_set_eq:NN \Vdots \__nicematrix_Vdots \cs_set_eq:NN \Ddots \__nicematrix_Ddots \cs_set_eq:NN \Iddots \__nicematrix_Iddots \cs_set_eq:NN \hdottedline \__nicematrix_hdottedline: \cs_set_eq:NN \Hline \__nicematrix_Hline: \cs_set_eq:NN \Hspace \__nicematrix_Hspace: \cs_set_eq:NN \Hdotsfor \__nicematrix_Hdotsfor: \cs_set_eq:NN \Vdotsfor \__nicematrix_Vdotsfor: \cs_set_eq:NN \multicolumn \__nicematrix_multicolumn:nnn \cs_set_eq:NN \Block \__nicematrix_Block: \cs_set_eq:NN \rotate \__nicematrix_rotate: \cs_set_eq:NN \OnlyMainNiceMatrix \__nicematrix_OnlyMainNiceMatrix:n \cs_set_eq:NN \dotfill \__nicematrix_old_dotfill: \cs_set_eq:NN \CodeAfter \__nicematrix_CodeAfter: \cs_set_eq:NN \diagbox \__nicematrix_diagbox:nn \cs_set_eq:NN \NotEmpty \__nicematrix_NotEmpty: \bool_if:NT \l__nicematrix_colortbl_like_bool \__nicematrix_colortbl_like: \bool_if:NT \l__nicematrix_renew_dots_bool \__nicematrix_renew_dots: \seq_gclear_new:N \g__nicematrix_multicolumn_cells_seq \seq_gclear_new:N \g__nicematrix_multicolumn_sizes_seq \int_gset:Nn \c@iRow { \l__nicematrix_first_row_int - 1 } \int_gzero_new:N \g__nicematrix_row_total_int \int_gzero_new:N \g__nicematrix_col_total_int \cs_set_eq:NN \@ifnextchar \new@ifnextchar \__nicematrix_renew_NC@rewrite@S: \bool_gset_false:N \g__nicematrix_last_col_found_bool \tl_gclear_new:N \g__nicematrix_Cdots_lines_tl \tl_gclear_new:N \g__nicematrix_Ldots_lines_tl \tl_gclear_new:N \g__nicematrix_Vdots_lines_tl \tl_gclear_new:N \g__nicematrix_Ddots_lines_tl \tl_gclear_new:N \g__nicematrix_Iddots_lines_tl \tl_gclear_new:N \g__nicematrix_HVdotsfor_lines_tl \tl_gclear_new:N \g_nicematrix_code_before_tl } \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 { __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 \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_clear_new:N \l__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: } } \int_compare:nNnT \l__nicematrix_last_row_int > { -2 } { \tl_put_right:Nn \__nicematrix_update_for_first_and_last_row: { \dim_gset:Nn \g__nicematrix_ht_last_row_dim { \dim_max:nn \g__nicematrix_ht_last_row_dim { \box_ht:N \l__nicematrix_cell_box } } \dim_gset:Nn \g__nicematrix_dp_last_row_dim { \dim_max:nn \g__nicematrix_dp_last_row_dim { \box_dp:N \l__nicematrix_cell_box } } } } \int_compare:nNnT \l__nicematrix_last_row_int = { -1 } { \bool_set_true:N \l__nicematrix_last_row_without_value_bool \str_if_empty:NTF \l__nicematrix_name_str { \cs_if_exist:cT { __nicematrix_last_row_ \int_use:N \g__nicematrix_env_int } { \int_set:Nn \l__nicematrix_last_row_int { \use:c { __nicematrix_last_row_ \int_use:N \g__nicematrix_env_int } } } } { \cs_if_exist:cT { __nicematrix_last_row_ \l__nicematrix_name_str } { \int_set:Nn \l__nicematrix_last_row_int { \use:c { __nicematrix_last_row_ \l__nicematrix_name_str } } } } } \int_compare:nNnT \l__nicematrix_last_col_int = { -1 } { \str_if_empty:NTF \l__nicematrix_name_str { \cs_if_exist:cT { __nicematrix_last_col_ \int_use:N \g__nicematrix_env_int } { \int_set:Nn \l__nicematrix_last_col_int { \use:c { __nicematrix_last_col_ \int_use:N \g__nicematrix_env_int } } } } { \cs_if_exist:cT { __nicematrix_last_col_ \l__nicematrix_name_str } { \int_set:Nn \l__nicematrix_last_col_int { \use:c { __nicematrix_last_col_ \l__nicematrix_name_str } } } } } \__nicematrix_pre_array_ii: \dim_zero_new:N \l__nicematrix_left_delim_dim \dim_zero_new:N \l__nicematrix_right_delim_dim \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 } } { \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l__nicematrix_left_delim_tl $ } \dim_set:Nn \l__nicematrix_left_delim_dim { \box_wd:N \l_tmpa_box } \hbox_set:Nn \l_tmpa_box { $ \bBigg@ 5 \l__nicematrix_right_delim_tl $ } \dim_set:Nn \l__nicematrix_right_delim_dim { \box_wd:N \l_tmpa_box } } \box_clear_new:N \l__nicematrix_the_array_box \bool_if:NT \c__nicematrix_define_L_C_R_bool \__nicematrix_define_L_C_R: \__nicematrix_construct_preamble: \hbox_set:Nw \l__nicematrix_the_array_box \skip_horizontal:N \l__nicematrix_left_margin_dim \skip_horizontal:N \l__nicematrix_extra_left_margin_dim \c_math_toggle_token \bool_if:NTF \l__nicematrix_light_syntax_bool { \use:c { __nicematrix-light-syntax } } { \use:c { __nicematrix-normal-syntax } } } \cs_new_protected:Npn \__nicematrix_pre_array_i:w #1 \Body { \tl_put_right:Nn \l__nicematrix_code_before_tl { #1 } \bool_set_true:N \l__nicematrix_code_before_bool \__nicematrix_pre_array: } \NewDocumentEnvironment { NiceArrayWithDelims } { m m O { } m ! O { } t \CodeBefore } { \__nicematrix_provide_pgfsyspdfmark: \bool_if:NT \c__nicematrix_footnote_bool \savenotes \bgroup \tl_set:Nn \l__nicematrix_left_delim_tl { #1 } \tl_set:Nn \l__nicematrix_right_delim_tl { #2 } \tl_gset:Nn \g__nicematrix_preamble_tl { #4 } \int_gzero:N \g__nicematrix_block_box_int \dim_zero:N \g__nicematrix_width_last_col_dim \dim_zero:N \g__nicematrix_width_first_col_dim \bool_gset_false:N \g__nicematrix_row_of_col_done_bool \str_if_empty:NT \g__nicematrix_name_env_str { \str_gset:Nn \g__nicematrix_name_env_str { NiceArrayWithDelims } } \__nicematrix_adapt_S_column: \bool_if:NTF \l__nicematrix_NiceTabular_bool \mode_leave_vertical: \__nicematrix_test_if_math_mode: \bool_if:NT \l__nicematrix_in_env_bool { \__nicematrix_fatal:n { Yet~in~env } } \bool_set_true:N \l__nicematrix_in_env_bool \cs_gset_eq:NN \__nicematrix_old_CT@arc@ \CT@arc@ \cs_if_exist:NT \tikz@library@external@loaded { \tikzexternaldisable \cs_if_exist:NT \ifstandalone { \tikzset { external / optimize = false } } } \int_gincr:N \g__nicematrix_env_int \bool_if:NF \l__nicematrix_block_auto_columns_width_bool { \dim_gzero_new:N \g__nicematrix_max_cell_width_dim } \seq_gclear:N \g__nicematrix_blocks_seq \seq_gclear:N \g__nicematrix_pos_of_blocks_seq \seq_gclear:N \g__nicematrix_pos_of_stroken_blocks_seq \seq_gclear:N \g__nicematrix_pos_of_xdots_seq \tl_if_exist:cT { g__nicematrix_code_before_ \int_use:N \g__nicematrix_env_int _ tl } { \bool_set_true:N \l__nicematrix_code_before_bool \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 \l__nicematrix_NiceArray_bool { \keys_set:nn { NiceMatrix / NiceArray } } { \keys_set:nn { NiceMatrix / pNiceArray } } { #3 , #5 } \tl_if_empty:NF \l__nicematrix_rules_color_tl { \exp_after:wN \__nicematrix_set_CT@arc@: \l__nicematrix_rules_color_tl \q_stop } \IfBooleanTF { #6 } \__nicematrix_pre_array_i:w \__nicematrix_pre_array: } { \bool_if:NTF \l__nicematrix_light_syntax_bool { \use:c { end __nicematrix-light-syntax } } { \use:c { end __nicematrix-normal-syntax } } \c_math_toggle_token \skip_horizontal:N \l__nicematrix_right_margin_dim \skip_horizontal:N \l__nicematrix_extra_right_margin_dim \hbox_set_end: \int_compare:nNnT \l__nicematrix_last_row_int > { -2 } { \bool_if:NF \l__nicematrix_last_row_without_value_bool { \int_compare:nNnF \l__nicematrix_last_row_int = \c@iRow { \__nicematrix_error:n { Wrong~last~row } \int_gset_eq:NN \l__nicematrix_last_row_int \c@iRow } } } \int_gset_eq:NN \c@jCol \g__nicematrix_col_total_int \bool_if:nTF \g__nicematrix_last_col_found_bool { \int_gdecr:N \c@jCol } { \int_compare:nNnT \l__nicematrix_last_col_int > { -1 } { \__nicematrix_error:n { last~col~not~used } } } \int_gset_eq:NN \g__nicematrix_row_total_int \c@iRow \int_compare:nNnT \l__nicematrix_last_row_int > { -1 } { \int_gdecr:N \c@iRow } \int_compare:nNnT \l__nicematrix_first_col_int = 0 { \skip_horizontal:N \col@sep \skip_horizontal:N \g__nicematrix_width_first_col_dim } \bool_if:NTF \l__nicematrix_NiceArray_bool { \str_case:VnF \l__nicematrix_baseline_tl { b \__nicematrix_use_arraybox_with_notes_b: c \__nicematrix_use_arraybox_with_notes_c: } \__nicematrix_use_arraybox_with_notes: } { \int_compare:nNnTF \l__nicematrix_first_row_int = 0 { \dim_set_eq:NN \l_tmpa_dim \g__nicematrix_dp_row_zero_dim \dim_add:Nn \l_tmpa_dim \g__nicematrix_ht_row_zero_dim } { \dim_zero:N \l_tmpa_dim } \int_compare:nNnTF \l__nicematrix_last_row_int > { -2 } { \dim_set_eq:NN \l_tmpb_dim \g__nicematrix_ht_last_row_dim \dim_add:Nn \l_tmpb_dim \g__nicematrix_dp_last_row_dim } { \dim_zero:N \l_tmpb_dim } \hbox_set:Nn \l_tmpa_box { \c_math_toggle_token \tl_if_empty:NF \l__nicematrix_delimiters_color_tl { \color { \l__nicematrix_delimiters_color_tl } } \exp_after:wN \left \l__nicematrix_left_delim_tl \vcenter { \skip_vertical:N -\l_tmpa_dim \hbox { \bool_if:NTF \l__nicematrix_NiceTabular_bool { \skip_horizontal:N -\tabcolsep } { \skip_horizontal:N -\arraycolsep } \__nicematrix_use_arraybox_with_notes_c: \bool_if:NTF \l__nicematrix_NiceTabular_bool { \skip_horizontal:N -\tabcolsep } { \skip_horizontal:N -\arraycolsep } } \skip_vertical:N -\l_tmpb_dim } \tl_if_empty:NF \l__nicematrix_delimiters_color_tl { \color { \l__nicematrix_delimiters_color_tl } } \exp_after:wN \right \l__nicematrix_right_delim_tl \c_math_toggle_token } \bool_if:NTF \l__nicematrix_delimiters_max_width_bool { \__nicematrix_put_box_in_flow_bis:nn { #1 } { #2 } } \__nicematrix_put_box_in_flow: } \bool_if:NT \g__nicematrix_last_col_found_bool { \skip_horizontal:N \g__nicematrix_width_last_col_dim \skip_horizontal:N \col@sep } \bool_if:NF \l__nicematrix_Matrix_bool { \int_compare:nNnT \c@jCol < \g__nicematrix_static_num_of_col_int { \__nicematrix_error:n { columns~not~used } } } \group_begin: \globaldefs = 1 \__nicematrix_msg_redirect_name:nn { columns~not~used } { error } \group_end: \__nicematrix_after_array: \egroup \bool_if:NT \c__nicematrix_footnote_bool \endsavenotes } \cs_new_protected:Npn \__nicematrix_construct_preamble: { \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 } } \exp_args:NV \@temptokena \g__nicematrix_preamble_tl \@tempswatrue \@whilesw \if@tempswa \fi { \@tempswafalse \the \NC@list } \int_gzero_new:N \c@jCol \tl_gclear:N \g__nicematrix_preamble_tl \tl_if_eq:NnTF \l__nicematrix_vlines_clist { all } { \tl_gset:Nn \g__nicematrix_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } { \clist_if_in:NnT \l__nicematrix_vlines_clist 1 { \tl_gset:Nn \g__nicematrix_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } } \seq_clear:N \g__nicematrix_cols_vlism_seq \int_zero:N \l_tmpa_int \exp_after:wN \__nicematrix_patch_preamble:n \the \@temptokena \q_stop \int_gset_eq:NN \g__nicematrix_static_num_of_col_int \c@jCol } \bool_if:NT \l__nicematrix_colortbl_like_bool { \regex_replace_all:NnN \c__nicematrix_columncolor_regex { \c { __nicematrix_columncolor_preamble } } \g__nicematrix_preamble_tl } \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 { \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 } } { \tl_gput_left:Nn \g__nicematrix_preamble_tl { @ { } } } } \int_compare:nNnTF \l__nicematrix_last_col_int > { -1 } { \tl_gput_right:NV \g__nicematrix_preamble_tl \c__nicematrix_preamble_last_col_tl } { \bool_lazy_all:nT { \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 } } { \tl_gput_right:Nn \g__nicematrix_preamble_tl { @ { } } } } \dim_compare:nNnT \l__nicematrix_tabular_width_dim = \c_zero_dim { \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 { \str_case:nnF { #1 } { c { \__nicematrix_patch_preamble_i:n #1 } l { \__nicematrix_patch_preamble_i:n #1 } r { \__nicematrix_patch_preamble_i:n #1 } > { \__nicematrix_patch_preamble_ii:nn #1 } ! { \__nicematrix_patch_preamble_ii:nn #1 } @ { \__nicematrix_patch_preamble_ii:nn #1 } | { \__nicematrix_patch_preamble_iii:n #1 } p { \__nicematrix_patch_preamble_iv:nnn t #1 } m { \__nicematrix_patch_preamble_iv:nnn c #1 } b { \__nicematrix_patch_preamble_iv:nnn b #1 } \__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_viii:n #1 } ] { \__nicematrix_patch_preamble_viii:n #1 } \} { \__nicematrix_patch_preamble_viii:n #1 } C { \__nicematrix_error:nn { old~column~type } #1 } L { \__nicematrix_error:nn { old~column~type } #1 } R { \__nicematrix_error:nn { old~column~type } #1 } \q_stop { } } { \str_if_eq:VnTF \l__nicematrix_letter_for_dotted_lines_str { #1 } { \__nicematrix_patch_preamble_xi:n #1 } { \str_if_eq:VnTF \l__nicematrix_letter_vlism_tl { #1 } { \seq_gput_right:Nx \g__nicematrix_cols_vlism_seq { \int_eval:n { \c@jCol + 1 } } \tl_gput_right:Nx \g__nicematrix_preamble_tl { \exp_not:N ! { \skip_horizontal:N \arrayrulewidth } } \__nicematrix_patch_preamble:n } { \bool_lazy_and:nnTF { \str_if_eq_p:nn { : } { #1 } } \c__nicematrix_arydshln_loaded_bool { \tl_gput_right:Nn \g__nicematrix_preamble_tl { : } \__nicematrix_patch_preamble:n } { \__nicematrix_fatal:nn { unknown~column~type } { #1 } } } } } } \cs_new_protected:Npn \__nicematrix_patch_preamble_i:n #1 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { > { \__nicematrix_Cell: \tl_set:Nn \l__nicematrix_cell_type_tl { #1 } } #1 < \__nicematrix_end_Cell: } \int_gincr:N \c@jCol \__nicematrix_patch_preamble_x:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_ii:nn #1 #2 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { #1 { #2 } } \__nicematrix_patch_preamble:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_iii:n #1 { \int_incr:N \l_tmpa_int \__nicematrix_patch_preamble_iii_i:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_iii_i:n #1 { \str_if_eq:nnTF { #1 } | { \__nicematrix_patch_preamble_iii:n | } { \tl_gput_right:Nx \g__nicematrix_preamble_tl { \exp_not:N ! { \skip_horizontal:n { \dim_eval:n { \arrayrulewidth * \l_tmpa_int + \doublerulesep * ( \l_tmpa_int - 1) } } } } \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_vline:nn { \__nicematrix_succ:n \c@jCol } { \int_use:N \l_tmpa_int } } \int_zero:N \l_tmpa_int \__nicematrix_patch_preamble:n #1 } } \cs_new_protected:Npn \__nicematrix_patch_preamble_iv:nnn #1 #2 #3 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { > { \__nicematrix_Cell: \begin { minipage } [ #1 ] { #3 } \mode_leave_vertical: \arraybackslash \vrule height \box_ht:N \@arstrutbox depth 0 pt width 0 pt % v. 5.11 } c < { \vrule height 0 pt depth \box_dp:N \@arstrutbox width 0 pt % v. 5.11 \end { minipage } \__nicematrix_end_Cell: } } \int_gincr:N \c@jCol \__nicematrix_patch_preamble_x:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_v:nnnn #1 #2 #3 #4 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { > { \hbox_set:Nw \l__nicematrix_cell_box \__nicematrix_Cell: \tl_set:Nn \l__nicematrix_cell_type_tl { #3 } } c < { \__nicematrix_end_Cell: #1 \hbox_set_end: \bool_if:NT \g__nicematrix_rotate_bool \__nicematrix_rotate_cell_box: \__nicematrix_adjust_size_box: \makebox [ #4 ] [ #3 ] { \box_use_drop:N \l__nicematrix_cell_box } } } \int_gincr:N \c@jCol \__nicematrix_patch_preamble_x:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_vi:n #1 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { c } \int_gincr:N \c@jCol \__nicematrix_patch_preamble_x:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_vii:n #1 { \bool_if:NT \l__nicematrix_small_bool { \__nicematrix_fatal:n { Delimiter~with~small } } \int_compare:nNnT \c@jCol = \c_zero_int { \tl_gput_right:Nx \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:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_viii:n #1 { \bool_if:NT \l__nicematrix_small_bool { \__nicematrix_fatal:n { Delimiter~with~small } } \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_delimiter:nnn #1 { \int_use:N \c@jCol } \c_false_bool } \__nicematrix_patch_preamble_viii_i:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_viii_i:n #1 { \bool_lazy_any:nT { { \str_if_eq_p:nn { #1 } ( } { \str_if_eq_p:nn { #1 } [ } { \str_if_eq_p:nn { #1 } \{ } { \str_if_eq_p:nn { #1 } \q_stop } } { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \enskip } } } \__nicematrix_patch_preamble:n #1 } \cs_new_protected:Npn \__nicematrix_patch_preamble_xi:n #1 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \skip_horizontal:N 2\l__nicematrix_radius_dim } } \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_vdottedline:n { \int_use:N \c@jCol } } \__nicematrix_patch_preamble:n } \cs_new_protected:Npn \__nicematrix_patch_preamble_x:n #1 { \str_if_eq:nnTF { #1 } { < } \__nicematrix_patch_preamble_ix:n { \tl_if_eq:NnTF \l__nicematrix_vlines_clist { all } { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } { \exp_args:NNx \clist_if_in:NnT \l__nicematrix_vlines_clist { \__nicematrix_succ:n \c@jCol } { \tl_gput_right:Nn \g__nicematrix_preamble_tl { ! { \skip_horizontal:N \arrayrulewidth } } } } \__nicematrix_patch_preamble:n { #1 } } } \cs_new_protected:Npn \__nicematrix_patch_preamble_ix:n #1 { \tl_gput_right:Nn \g__nicematrix_preamble_tl { < { #1 } } \__nicematrix_patch_preamble_x:n } \cs_new_protected:Npn \__nicematrix_put_box_in_flow: { \box_set_ht:Nn \l_tmpa_box { \box_ht:N \l_tmpa_box + \l_tmpa_dim } \box_set_dp:Nn \l_tmpa_box { \box_dp:N \l_tmpa_box + \l_tmpb_dim } \tl_if_eq:NnTF \l__nicematrix_baseline_tl { c } { \box_use_drop:N \l_tmpa_box } \__nicematrix_put_box_in_flow_i: } \cs_new_protected:Npn \__nicematrix_put_box_in_flow_i: { \pgfpicture \__nicematrix_qpoint:n { row - 1 } \dim_gset_eq:NN \g_tmpa_dim \pgf@y \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \c@iRow } \dim_gadd:Nn \g_tmpa_dim \pgf@y \dim_gset:Nn \g_tmpa_dim { 0.5 \g_tmpa_dim } \str_if_in:NnTF \l__nicematrix_baseline_tl { line- } { \int_set:Nn \l_tmpa_int { \str_range:Nnn \l__nicematrix_baseline_tl 6 { \tl_count:V \l__nicematrix_baseline_tl } } \__nicematrix_qpoint:n { row - \int_use:N \l_tmpa_int } } { \str_case:VnF \l__nicematrix_baseline_tl { { t } { \int_set:Nn \l_tmpa_int 1 } { b } { \int_set_eq:NN \l_tmpa_int \c@iRow } } { \int_set:Nn \l_tmpa_int \l__nicematrix_baseline_tl } \bool_lazy_or:nnT { \int_compare_p:nNn \l_tmpa_int < \l__nicematrix_first_row_int } { \int_compare_p:nNn \l_tmpa_int > \g__nicematrix_row_total_int } { \__nicematrix_error:n { bad~value~for~baseline } \int_set:Nn \l_tmpa_int 1 } \__nicematrix_qpoint:n { row - \int_use:N \l_tmpa_int - base } \dim_gsub:Nn \g_tmpa_dim { \fontdimen22 \textfont2 } } \dim_gsub:Nn \g_tmpa_dim \pgf@y \endpgfpicture \box_move_up:nn \g_tmpa_dim { \box_use_drop:N \l_tmpa_box } \box_use_drop:N \l_tmpa_box } \cs_new_protected:Npn \__nicematrix_use_arraybox_with_notes_c: { \begin { minipage } [ t ] { \box_wd:N \l__nicematrix_the_array_box } \box_use_drop:N \l__nicematrix_the_array_box \__nicematrix_create_extra_nodes: \seq_if_empty:NF \g__nicematrix_blocks_seq \__nicematrix_draw_blocks: \bool_lazy_or:nnT { \int_compare_p:nNn \c@tabularnote > 0 } { ! \tl_if_empty_p:V \l__nicematrix_tabularnote_tl } \__nicematrix_insert_tabularnotes: \end { minipage } } \cs_new_protected:Npn \__nicematrix_insert_tabularnotes: { \skip_vertical:N 0.65ex \group_begin: \l__nicematrix_notes_code_before_tl \tl_if_empty:NF \l__nicematrix_tabularnote_tl { \l__nicematrix_tabularnote_tl \par } \int_compare:nNnT \c@tabularnote > 0 { \bool_if:NTF \l__nicematrix_notes_para_bool { \begin { tabularnotes* } \seq_map_inline:Nn \g__nicematrix_tabularnotes_seq { \item ##1 } \strut \end { tabularnotes* } \par } { \tabularnotes \seq_map_inline:Nn \g__nicematrix_tabularnotes_seq { \item ##1 } \strut \endtabularnotes } } \unskip \group_end: \bool_if:NT \l__nicematrix_notes_bottomrule_bool { \bool_if:NTF \c__nicematrix_booktabs_loaded_bool { \skip_vertical:N \aboverulesep { \CT@arc@ \hrule height \heavyrulewidth } } { \__nicematrix_error:n { bottomrule~without~booktabs } } } \l__nicematrix_notes_code_after_tl \seq_gclear:N \g__nicematrix_tabularnotes_seq \int_gzero:N \c@tabularnote } \cs_new_protected:Npn \__nicematrix_use_arraybox_with_notes_b: { \pgfpicture \__nicematrix_qpoint:n { row - 1 } \dim_gset_eq:NN \g_tmpa_dim \pgf@y \__nicematrix_qpoint:n { row - \int_use:N \c@iRow - base } \dim_gsub:Nn \g_tmpa_dim \pgf@y \endpgfpicture \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth \int_compare:nNnT \l__nicematrix_first_row_int = 0 { \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_ht_row_zero_dim \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_dp_row_zero_dim } \box_move_up:nn \g_tmpa_dim { \hbox { \__nicematrix_use_arraybox_with_notes_c: } } } \cs_new_protected:Npn \__nicematrix_use_arraybox_with_notes: { \tl_if_eq:NnT \l__nicematrix_baseline_tl { t } { \tl_set:Nn \l__nicematrix_baseline_tl { 1 } } \pgfpicture \__nicematrix_qpoint:n { row - 1 } \dim_gset_eq:NN \g_tmpa_dim \pgf@y \str_if_in:NnTF \l__nicematrix_baseline_tl { line- } { \int_set:Nn \l_tmpa_int { \str_range:Nnn \l__nicematrix_baseline_tl 6 { \tl_count:V \l__nicematrix_baseline_tl } } \__nicematrix_qpoint:n { row - \int_use:N \l_tmpa_int } } { \int_set:Nn \l_tmpa_int \l__nicematrix_baseline_tl \bool_lazy_or:nnT { \int_compare_p:nNn \l_tmpa_int < \l__nicematrix_first_row_int } { \int_compare_p:nNn \l_tmpa_int > \g__nicematrix_row_total_int } { \__nicematrix_error:n { bad~value~for~baseline } \int_set:Nn \l_tmpa_int 1 } \__nicematrix_qpoint:n { row - \int_use:N \l_tmpa_int - base } } \dim_gsub:Nn \g_tmpa_dim \pgf@y \endpgfpicture \dim_gadd:Nn \g_tmpa_dim \arrayrulewidth \int_compare:nNnT \l__nicematrix_first_row_int = 0 { \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_ht_row_zero_dim \dim_gadd:Nn \g_tmpa_dim \g__nicematrix_dp_row_zero_dim } \box_move_up:nn \g_tmpa_dim { \hbox { \__nicematrix_use_arraybox_with_notes_c: } } } \cs_new_protected:Npn \__nicematrix_put_box_in_flow_bis:nn #1 #2 { \dim_zero_new:N \l__nicematrix_real_left_delim_dim \dim_zero_new:N \l__nicematrix_real_right_delim_dim \hbox_set:Nn \l_tmpb_box { \c_math_toggle_token \left #1 \vcenter { \vbox_to_ht:nn { \box_ht:N \l_tmpa_box + \box_dp:N \l_tmpa_box } { } } \right . \c_math_toggle_token } \dim_set:Nn \l__nicematrix_real_left_delim_dim { \box_wd:N \l_tmpb_box - \nulldelimiterspace } \hbox_set:Nn \l_tmpb_box { \c_math_toggle_token \left . \vbox_to_ht:nn { \box_ht:N \l_tmpa_box + \box_dp:N \l_tmpa_box } { } \right #2 \c_math_toggle_token } \dim_set:Nn \l__nicematrix_real_right_delim_dim { \box_wd:N \l_tmpb_box - \nulldelimiterspace } \skip_horizontal:N \l__nicematrix_left_delim_dim \skip_horizontal:N -\l__nicematrix_real_left_delim_dim \__nicematrix_put_box_in_flow: \skip_horizontal:N \l__nicematrix_right_delim_dim \skip_horizontal:N -\l__nicematrix_real_right_delim_dim } \NewDocumentEnvironment { __nicematrix-normal-syntax } { } { \peek_meaning_ignore_spaces:NTF \end \__nicematrix_analyze_end:Nn { \exp_args:NV \__nicematrix_array: \g__nicematrix_preamble_tl } } { \__nicematrix_create_col_nodes: \endarray } \NewDocumentEnvironment { __nicematrix-light-syntax } { b } { \tl_if_empty:nT { #1 } { \__nicematrix_fatal:n { empty~environment } } \tl_map_inline:nn { #1 } { \str_if_eq:nnT { ##1 } { & } { \__nicematrix_fatal:n { ampersand~in~light-syntax } } \str_if_eq:nnT { ##1 } { \\ } { \__nicematrix_fatal:n { double-backslash~in~light-syntax } } } \__nicematrix_light_syntax_i #1 \CodeAfter \q_stop } { } \cs_new_protected:Npn \__nicematrix_light_syntax_i #1\CodeAfter #2\q_stop { \tl_gput_right:Nn \g_nicematrix_code_after_tl { #2 } \seq_gclear_new:N \g__nicematrix_rows_seq \tl_set_rescan:Nno \l__nicematrix_end_of_row_tl { } \l__nicematrix_end_of_row_tl \exp_args:NNV \seq_gset_split:Nnn \g__nicematrix_rows_seq \l__nicematrix_end_of_row_tl { #1 } \int_compare:nNnT \l__nicematrix_last_row_int = { -1 } { \int_set:Nn \l__nicematrix_last_row_int { \seq_count:N \g__nicematrix_rows_seq } } \exp_args:NV \__nicematrix_array: \g__nicematrix_preamble_tl \seq_gpop_left:NN \g__nicematrix_rows_seq \l_tmpa_tl \exp_args:NV \__nicematrix_line_with_light_syntax_i:n \l_tmpa_tl \seq_map_function:NN \g__nicematrix_rows_seq \__nicematrix_line_with_light_syntax:n \__nicematrix_create_col_nodes: \endarray } \cs_new_protected:Npn \__nicematrix_line_with_light_syntax:n #1 { \tl_if_empty:nF { #1 } { \\ \__nicematrix_line_with_light_syntax_i:n { #1 } } } \cs_new_protected:Npn \__nicematrix_line_with_light_syntax_i:n #1 { \seq_gclear_new:N \g__nicematrix_cells_seq \seq_gset_split:Nnn \g__nicematrix_cells_seq { ~ } { #1 } \seq_gpop_left:NN \g__nicematrix_cells_seq \l_tmpa_tl \l_tmpa_tl \seq_map_inline:Nn \g__nicematrix_cells_seq { & ##1 } } \cs_new_protected:Npn \__nicematrix_analyze_end:Nn #1 #2 { \str_if_eq:VnT \g__nicematrix_name_env_str { #2 } { \__nicematrix_fatal:n { empty~environment } } \end { #2 } } \cs_new:Npn \__nicematrix_create_col_nodes: { \crcr \int_compare:nNnT \l__nicematrix_first_col_int = 0 { \omit \hbox_overlap_left:n { \bool_if:NT \l__nicematrix_code_before_bool { \pgfsys@markposition { \__nicematrix_env: - col - 0 } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - col - 0 } \pgfpointorigin \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - col - 0 } { \__nicematrix_env: - col - 0 } } \endpgfpicture \skip_horizontal:N 2\col@sep \skip_horizontal:N \g__nicematrix_width_first_col_dim } & } \omit \bool_gset_true:N \g__nicematrix_row_of_col_done_bool \int_compare:nNnTF \l__nicematrix_first_col_int = 0 { \bool_if:NT \l__nicematrix_code_before_bool { \hbox { \skip_horizontal:N -0.5\arrayrulewidth \pgfsys@markposition { \__nicematrix_env: - col - 1 } \skip_horizontal:N 0.5\arrayrulewidth } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - col - 1 } { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - col - 1 } { \__nicematrix_env: - col - 1 } } \endpgfpicture } { \bool_if:NT \l__nicematrix_code_before_bool { \hbox { \skip_horizontal:N 0.5\arrayrulewidth \pgfsys@markposition { \__nicematrix_env: - col - 1 } \skip_horizontal:N -0.5\arrayrulewidth } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - col - 1 } { \pgfpoint { 0.5 \arrayrulewidth } \c_zero_dim } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - col - 1 } { \__nicematrix_env: - col - 1 } } \endpgfpicture } \skip_gset:Nn \g_tmpa_skip { 0 pt~plus 1 fill } \bool_if:NF \l__nicematrix_auto_columns_width_bool { \dim_compare:nNnT \l__nicematrix_columns_width_dim > \c_zero_dim } { \bool_lazy_and:nnTF \l__nicematrix_auto_columns_width_bool { \bool_not_p:n \l__nicematrix_block_auto_columns_width_bool } { \skip_gset_eq:NN \g_tmpa_skip \g__nicematrix_max_cell_width_dim } { \skip_gset_eq:NN \g_tmpa_skip \l__nicematrix_columns_width_dim } \skip_gadd:Nn \g_tmpa_skip { 2 \col@sep } } \skip_horizontal:N \g_tmpa_skip \hbox { \bool_if:NT \l__nicematrix_code_before_bool { \hbox { \skip_horizontal:N -0.5\arrayrulewidth \pgfsys@markposition { \__nicematrix_env: - col - 2 } \skip_horizontal:N 0.5\arrayrulewidth } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - col - 2 } { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - col - 2 } { \__nicematrix_env: - col - 2 } } \endpgfpicture } \int_gset:Nn \g_tmpa_int 1 \bool_if:NTF \g__nicematrix_last_col_found_bool { \prg_replicate:nn { \g__nicematrix_col_total_int - 2 } } { \prg_replicate:nn { \g__nicematrix_col_total_int - 1 } } { & \omit \int_gincr:N \g_tmpa_int \skip_horizontal:N \g_tmpa_skip \bool_if:NT \l__nicematrix_code_before_bool { \hbox { \skip_horizontal:N -0.5\arrayrulewidth \pgfsys@markposition { \__nicematrix_env: - col - \__nicematrix_succ:n \g_tmpa_int } \skip_horizontal:N 0.5\arrayrulewidth } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - col - \__nicematrix_succ:n \g_tmpa_int } { \pgfpoint { - 0.5 \arrayrulewidth } \c_zero_dim } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - col - \__nicematrix_succ:n \g_tmpa_int } { \__nicematrix_env: - col - \__nicematrix_succ:n \g_tmpa_int } } \endpgfpicture } \bool_if:NT \g__nicematrix_last_col_found_bool { \hbox_overlap_right:n { % \skip_horizontal:N \col@sep \skip_horizontal:N \g__nicematrix_width_last_col_dim \bool_if:NT \l__nicematrix_code_before_bool { \pgfsys@markposition { \__nicematrix_env: - col - \__nicematrix_succ:n \g__nicematrix_col_total_int } } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfcoordinate { \__nicematrix_env: - col - \__nicematrix_succ:n \g__nicematrix_col_total_int } \pgfpointorigin \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - col - \__nicematrix_succ:n \g__nicematrix_col_total_int } { \__nicematrix_env: - col - \__nicematrix_succ:n \g__nicematrix_col_total_int } } \endpgfpicture } } \cr } \tl_const:Nn \c__nicematrix_preamble_first_col_tl { > { \cs_set_eq:NN \CodeAfter \__nicematrix_CodeAfter_i:n \bool_gset_true:N \g__nicematrix_after_col_zero_bool \__nicematrix_begin_of_row: \hbox_set:Nw \l__nicematrix_cell_box \__nicematrix_math_toggle_token: \bool_if:NT \l__nicematrix_small_bool \scriptstyle \bool_lazy_and:nnT { \int_compare_p:nNn \c@iRow > 0 } { \bool_lazy_or_p:nn { \int_compare_p:nNn \l__nicematrix_last_row_int < 0 } { \int_compare_p:nNn \c@iRow < \l__nicematrix_last_row_int } } { \l__nicematrix_code_for_first_col_tl \xglobal \colorlet { nicematrix-first-col } { . } } } l < { \__nicematrix_math_toggle_token: \hbox_set_end: \bool_if:NT \g__nicematrix_rotate_bool \__nicematrix_rotate_cell_box: \__nicematrix_adjust_size_box: \__nicematrix_update_for_first_and_last_row: \dim_gset:Nn \g__nicematrix_width_first_col_dim { \dim_max:nn \g__nicematrix_width_first_col_dim { \box_wd:N \l__nicematrix_cell_box } } \hbox_overlap_left:n { \dim_compare:nNnTF { \box_wd:N \l__nicematrix_cell_box } > \c_zero_dim \__nicematrix_node_for_the_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 \skip_horizontal:N \l__nicematrix_extra_left_margin_dim } \bool_gset_false:N \g__nicematrix_empty_cell_bool \skip_horizontal:N -2\col@sep } } \tl_const:Nn \c__nicematrix_preamble_last_col_tl { > { \cs_set_eq:NN \CodeAfter \__nicematrix_CodeAfter_i:n \bool_gset_true:N \g__nicematrix_last_col_found_bool \int_gincr:N \c@jCol \int_gset_eq:NN \g__nicematrix_col_total_int \c@jCol \hbox_set:Nw \l__nicematrix_cell_box \__nicematrix_math_toggle_token: \bool_if:NT \l__nicematrix_small_bool \scriptstyle \int_compare:nNnT \c@iRow > 0 { \bool_lazy_or:nnT { \int_compare_p:nNn \l__nicematrix_last_row_int < 0 } { \int_compare_p:nNn \c@iRow < \l__nicematrix_last_row_int } { \l__nicematrix_code_for_last_col_tl \xglobal \colorlet { nicematrix-last-col } { . } } } } l < { \__nicematrix_math_toggle_token: \hbox_set_end: \bool_if:NT \g__nicematrix_rotate_bool \__nicematrix_rotate_cell_box: \__nicematrix_adjust_size_box: \__nicematrix_update_for_first_and_last_row: \dim_gset:Nn \g__nicematrix_width_last_col_dim { \dim_max:nn \g__nicematrix_width_last_col_dim { \box_wd:N \l__nicematrix_cell_box } } \skip_horizontal:N -2\col@sep \hbox_overlap_right:n { \dim_compare:nNnT { \box_wd:N \l__nicematrix_cell_box } > \c_zero_dim { \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: } } \bool_gset_false:N \g__nicematrix_empty_cell_bool } } \NewDocumentEnvironment { NiceArray } { } { \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 . . } { \endNiceArrayWithDelims } \cs_new_protected:Npn \__nicematrix_def_env:nnn #1 #2 #3 { \NewDocumentEnvironment { #1 NiceArray } { } { \str_if_empty:NT \g__nicematrix_name_env_str { \str_gset:Nn \g__nicematrix_name_env_str { #1 NiceArray } } \__nicematrix_test_if_math_mode: \NiceArrayWithDelims #2 #3 } { \endNiceArrayWithDelims } } \__nicematrix_def_env:nnn p ( ) \__nicematrix_def_env:nnn b [ ] \__nicematrix_def_env:nnn B \{ \} \__nicematrix_def_env:nnn v | | \__nicematrix_def_env:nnn V \| \| \cs_new_protected:Npn \__nicematrix_begin_of_NiceMatrix:nn #1 #2 { \bool_set_true:N \l__nicematrix_Matrix_bool \use:c { #1 NiceArray } { * { \int_compare:nNnTF \l__nicematrix_last_col_int < 0 \c@MaxMatrixCols { \__nicematrix_pred:n \l__nicematrix_last_col_int } } { > \__nicematrix_Cell: #2 < \__nicematrix_end_Cell: } } } \clist_map_inline:nn { { } , p , b , B , v , V } { \NewDocumentEnvironment { #1 NiceMatrix } { ! O { } } { \str_gset:Nn \g__nicematrix_name_env_str { #1 NiceMatrix } \tl_set:Nn \l__nicematrix_type_of_col_tl c \keys_set:nn { NiceMatrix / NiceMatrix } { ##1 } \exp_args:Nne \__nicematrix_begin_of_NiceMatrix:nn { #1 } \l__nicematrix_type_of_col_tl } { \use:c { end #1 NiceArray } } } \cs_new_protected:Npn \__nicematrix_NotEmpty: { \bool_gset_true:N \g__nicematrix_not_empty_cell_bool } \NewDocumentEnvironment { NiceTabular } { O { } m ! O { } } { \str_gset:Nn \g__nicematrix_name_env_str { NiceTabular } \keys_set:nn { NiceMatrix / NiceTabular } { #1 , #3 } \bool_set_true:N \l__nicematrix_NiceTabular_bool \NiceArray { #2 } } { \endNiceArray } \NewDocumentEnvironment { NiceTabular* } { m O { } m ! O { } } { \str_gset:Nn \g__nicematrix_name_env_str { NiceTabular* } \dim_set:Nn \l__nicematrix_tabular_width_dim { #1 } \keys_set:nn { NiceMatrix / NiceTabular } { #2 , #4 } \bool_set_true:N \l__nicematrix_NiceTabular_bool \NiceArray { #3 } } { \endNiceArray } \cs_new_protected:Npn \__nicematrix_after_array: { \group_begin: \bool_if:NT \g__nicematrix_last_col_found_bool { \int_set_eq:NN \l__nicematrix_last_col_int \g__nicematrix_col_total_int } \bool_if:NT \l__nicematrix_last_col_without_value_bool { \dim_set_eq:NN \l__nicematrix_last_col_int \g__nicematrix_col_total_int \iow_shipout:Nn \@mainaux \ExplSyntaxOn \iow_shipout:Nx \@mainaux { \cs_gset:cpn { __nicematrix_last_col_ \int_use:N \g__nicematrix_env_int } { \int_use:N \g__nicematrix_col_total_int } } \str_if_empty:NF \l__nicematrix_name_str { \iow_shipout:Nx \@mainaux { \cs_gset:cpn { __nicematrix_last_col_ \l__nicematrix_name_str } { \int_use:N \g__nicematrix_col_total_int } } } \iow_shipout:Nn \@mainaux \ExplSyntaxOff } \bool_if:NT \l__nicematrix_last_row_without_value_bool { \dim_set_eq:NN \l__nicematrix_last_row_int \g__nicematrix_row_total_int \bool_if:NF \l__nicematrix_light_syntax_bool { \iow_shipout:Nn \@mainaux \ExplSyntaxOn \iow_shipout:Nx \@mainaux { \cs_gset:cpn { __nicematrix_last_row_ \int_use:N \g__nicematrix_env_int } { \int_use:N \g__nicematrix_row_total_int } } \str_if_empty:NF \l__nicematrix_name_str { \iow_shipout:Nx \@mainaux { \cs_gset:cpn { __nicematrix_last_row_ \l__nicematrix_name_str } { \int_use:N \g__nicematrix_row_total_int } } } \iow_shipout:Nn \@mainaux \ExplSyntaxOff } } \bool_if:NT \l__nicematrix_code_before_bool { \iow_now:Nn \@mainaux \ExplSyntaxOn \iow_now:Nx \@mainaux { \seq_clear_new:c { __nicematrix_size _ \int_use:N \g__nicematrix_env_int _ seq } } \iow_now:Nx \@mainaux { \seq_gset_from_clist:cn { __nicematrix_size _ \int_use:N \g__nicematrix_env_int _ seq } { \int_use:N \l__nicematrix_first_row_int , \int_use:N \g__nicematrix_row_total_int , \int_use:N \l__nicematrix_first_col_int , \bool_lazy_and:nnTF { \int_compare_p:nNn \l__nicematrix_last_col_int > { -2 } } { \bool_not_p:n \g__nicematrix_last_col_found_bool } \__nicematrix_succ:n \int_use:N \g__nicematrix_col_total_int } \seq_gset_from_clist:cn { 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: \str_if_empty:NF \l__nicematrix_name_str { \pgfpicture \pgfrememberpicturepositiononpagetrue \pgfnodealias { \l__nicematrix_name_str - ##1 } { \__nicematrix_env: - ##1 } \endpgfpicture } \bool_if:NT \l__nicematrix_parallelize_diags_bool { \int_gzero_new:N \g__nicematrix_ddots_int \int_gzero_new:N \g__nicematrix_iddots_int \dim_gzero_new:N \g__nicematrix_delta_x_one_dim \dim_gzero_new:N \g__nicematrix_delta_y_one_dim \dim_gzero_new:N \g__nicematrix_delta_x_two_dim \dim_gzero_new:N \g__nicematrix_delta_y_two_dim } \int_zero_new:N \l__nicematrix_initial_i_int \int_zero_new:N \l__nicematrix_initial_j_int \int_zero_new:N \l__nicematrix_final_i_int \int_zero_new:N \l__nicematrix_final_j_int \bool_set_false:N \l__nicematrix_initial_open_bool \bool_set_false:N \l__nicematrix_final_open_bool \bool_if:NT \l__nicematrix_small_bool { \dim_set:Nn \l__nicematrix_radius_dim { 0.37 pt } \dim_set:Nn \l__nicematrix_inter_dots_dim { 0.25 em } \dim_set:Nn \l__nicematrix_xdots_shorten_dim { 0.6 \l__nicematrix_xdots_shorten_dim } } \__nicematrix_draw_dotted_lines: \__nicematrix_compute_corners: \__nicematrix_adjust_pos_of_blocks_seq: \bool_lazy_all:nT { { \seq_if_empty_p:N \g__nicematrix_pos_of_blocks_seq } { \seq_if_empty_p:N \g__nicematrix_pos_of_xdots_seq } { \seq_if_empty_p:N \l__nicematrix_empty_corner_cells_seq } } { \cs_set_eq:NN \__nicematrix_vline_i:nn \__nicematrix_vline_i_complete:nn \cs_set_eq:NN \__nicematrix_hline_i:nn \__nicematrix_hline_i_complete:nn } \tl_if_empty:NF \l__nicematrix_hlines_clist \__nicematrix_draw_hlines: \tl_if_empty:NF \l__nicematrix_vlines_clist \__nicematrix_draw_vlines: \cs_set_eq:NN \SubMatrix \__nicematrix_SubMatrix \bool_if:NT \c__nicematrix_tikz_loaded_bool { \tikzset { every~picture / .style = { overlay , remember~picture , name~prefix = \__nicematrix_env: - } } } \cs_set_eq:NN \line \__nicematrix_line \g__nicematrix_internal_code_after_tl \tl_gclear:N \g__nicematrix_internal_code_after_tl \cs_set_eq:NN \CodeAfter \prg_do_nothing: \seq_gclear:N \g__nicematrix_submatrix_names_seq \exp_last_unbraced:NV \__nicematrix_CodeAfter_keys: \g_nicematrix_code_after_tl \scan_stop: \tl_gclear:N \g_nicematrix_code_after_tl \group_end: \tl_if_empty:NF \g_nicematrix_code_before_tl { \cs_set_protected:Npn \rectanglecolor { } \cs_set_protected:Npn \columncolor { } \iow_now:Nn \@mainaux \ExplSyntaxOn \iow_now:Nx \@mainaux { \tl_gset:cn { g__nicematrix_code_before_ \int_use:N \g__nicematrix_env_int _ tl } { \exp_not:V \g_nicematrix_code_before_tl } } \iow_now:Nn \@mainaux \ExplSyntaxOff \bool_set_true:N \l__nicematrix_code_before_bool } \str_gclear:N \g__nicematrix_name_env_str \__nicematrix_restore_iRow_jCol: \cs_gset_eq:NN \CT@arc@ \__nicematrix_old_CT@arc@ } \NewDocumentCommand \__nicematrix_CodeAfter_keys: { O { } } { \keys_set:nn { NiceMatrix / CodeAfter } { #1 } } \cs_new_protected:Npn \__nicematrix_adjust_pos_of_blocks_seq: { \seq_gset_map_x:NNn \g__nicematrix_pos_of_blocks_seq \g__nicematrix_pos_of_blocks_seq { \__nicematrix_adjust_pos_of_blocks_seq_i:nnnn ##1 } } \cs_new:Npn \__nicematrix_adjust_pos_of_blocks_seq_i:nnnn #1 #2 #3 #4 { { #1 } { #2 } { \int_compare:nNnTF { #3 } > { 99 } { \int_use:N \c@iRow } { #3 } } { \int_compare:nNnTF { #4 } > { 99 } { \int_use:N \c@jCol } { #4 } } } \AtBeginDocument { \cs_new_protected:Npx \__nicematrix_draw_dotted_lines: { \c__nicematrix_pgfortikzpicture_tl \__nicematrix_draw_dotted_lines_i: \c__nicematrix_endpgfortikzpicture_tl } } \cs_new_protected:Npn \__nicematrix_draw_dotted_lines_i: { \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \g__nicematrix_HVdotsfor_lines_tl \g__nicematrix_Vdots_lines_tl \g__nicematrix_Ddots_lines_tl \g__nicematrix_Iddots_lines_tl \g__nicematrix_Cdots_lines_tl \g__nicematrix_Ldots_lines_tl } \cs_new_protected:Npn \__nicematrix_restore_iRow_jCol: { \cs_if_exist:NT \theiRow { \int_gset_eq:NN \c@iRow \l__nicematrix_old_iRow_int } \cs_if_exist:NT \thejCol { \int_gset_eq:NN \c@jCol \l__nicematrix_old_jCol_int } } \cs_new_protected:Npn \__nicematrix_create_diag_nodes: { \int_step_inline:nn { \int_max:nn \c@iRow \c@jCol + 1 } { \pgfpicture \pgfrememberpicturepositiononpagetrue \__nicematrix_qpoint:n { row - \int_min:nn { ##1 } { \c@iRow + 1 } } \dim_set_eq:NN \l_tmpa_dim \pgf@y \__nicematrix_qpoint:n { col - \int_min:nn { ##1 } { \c@jCol + 1 } } \pgfcoordinate { \__nicematrix_env: - ##1 } { \pgfpoint \pgf@x \l_tmpa_dim } \endpgfpicture } } \cs_new_protected:Npn \__nicematrix_find_extremities_of_line:nnnn #1 #2 #3 #4 { \cs_set:cpn { __nicematrix _ dotted _ #1 - #2 } { } \int_set:Nn \l__nicematrix_initial_i_int { #1 } \int_set:Nn \l__nicematrix_initial_j_int { #2 } \int_set:Nn \l__nicematrix_final_i_int { #1 } \int_set:Nn \l__nicematrix_final_j_int { #2 } \bool_set_false:N \l__nicematrix_stop_loop_bool \bool_do_until:Nn \l__nicematrix_stop_loop_bool { \int_add:Nn \l__nicematrix_final_i_int { #3 } \int_add:Nn \l__nicematrix_final_j_int { #4 } \bool_set_false:N \l__nicematrix_final_open_bool \int_compare:nNnTF \l__nicematrix_final_i_int > \l__nicematrix_row_max_int { \int_compare:nNnTF { #3 } = 1 { \bool_set_true:N \l__nicematrix_final_open_bool } { \int_compare:nNnT \l__nicematrix_final_j_int > \l__nicematrix_col_max_int { \bool_set_true:N \l__nicematrix_final_open_bool } } } { \int_compare:nNnTF \l__nicematrix_final_j_int < \l__nicematrix_col_min_int { \int_compare:nNnT { #4 } = { -1 } { \bool_set_true:N \l__nicematrix_final_open_bool } } { \int_compare:nNnT \l__nicematrix_final_j_int > \l__nicematrix_col_max_int { \int_compare:nNnT { #4 } = 1 { \bool_set_true:N \l__nicematrix_final_open_bool } } } } \bool_if:NTF \l__nicematrix_final_open_bool { \int_sub:Nn \l__nicematrix_final_i_int { #3 } \int_sub:Nn \l__nicematrix_final_j_int { #4 } \bool_set_true:N \l__nicematrix_stop_loop_bool } { \cs_if_exist:cTF { __nicematrix _ dotted _ \int_use:N \l__nicematrix_final_i_int - \int_use:N \l__nicematrix_final_j_int } { \int_sub:Nn \l__nicematrix_final_i_int { #3 } \int_sub:Nn \l__nicematrix_final_j_int { #4 } \bool_set_true:N \l__nicematrix_final_open_bool \bool_set_true:N \l__nicematrix_stop_loop_bool } { \cs_if_exist:cTF { pgf @ sh @ ns @ \__nicematrix_env: - \int_use:N \l__nicematrix_final_i_int - \int_use:N \l__nicematrix_final_j_int } { \bool_set_true:N \l__nicematrix_stop_loop_bool } { \cs_set:cpn { __nicematrix _ dotted _ \int_use:N \l__nicematrix_final_i_int - \int_use:N \l__nicematrix_final_j_int } { } } } } } \bool_set_false:N \l__nicematrix_stop_loop_bool \bool_do_until:Nn \l__nicematrix_stop_loop_bool { \int_sub:Nn \l__nicematrix_initial_i_int { #3 } \int_sub:Nn \l__nicematrix_initial_j_int { #4 } \bool_set_false:N \l__nicematrix_initial_open_bool \int_compare:nNnTF \l__nicematrix_initial_i_int < \l__nicematrix_row_min_int { \int_compare:nNnTF { #3 } = 1 { \bool_set_true:N \l__nicematrix_initial_open_bool } { \int_compare:nNnT \l__nicematrix_initial_j_int = { \l__nicematrix_col_min_int -1 } { \bool_set_true:N \l__nicematrix_initial_open_bool } } } { \int_compare:nNnTF \l__nicematrix_initial_j_int < \l__nicematrix_col_min_int { \int_compare:nNnT { #4 } = 1 { \bool_set_true:N \l__nicematrix_initial_open_bool } } { \int_compare:nNnT \l__nicematrix_initial_j_int > \l__nicematrix_col_max_int { \int_compare:nNnT { #4 } = { -1 } { \bool_set_true:N \l__nicematrix_initial_open_bool } } } } \bool_if:NTF \l__nicematrix_initial_open_bool { \int_add:Nn \l__nicematrix_initial_i_int { #3 } \int_add:Nn \l__nicematrix_initial_j_int { #4 } \bool_set_true:N \l__nicematrix_stop_loop_bool } { \cs_if_exist:cTF { __nicematrix _ dotted _ \int_use:N \l__nicematrix_initial_i_int - \int_use:N \l__nicematrix_initial_j_int } { \int_add:Nn \l__nicematrix_initial_i_int { #3 } \int_add:Nn \l__nicematrix_initial_j_int { #4 } \bool_set_true:N \l__nicematrix_initial_open_bool \bool_set_true:N \l__nicematrix_stop_loop_bool } { \cs_if_exist:cTF { pgf @ sh @ ns @ \__nicematrix_env: - \int_use:N \l__nicematrix_initial_i_int - \int_use:N \l__nicematrix_initial_j_int } { \bool_set_true:N \l__nicematrix_stop_loop_bool } { \cs_set:cpn { __nicematrix _ dotted _ \int_use:N \l__nicematrix_initial_i_int - \int_use:N \l__nicematrix_initial_j_int } { } } } } } \seq_gput_right:Nx \g__nicematrix_pos_of_xdots_seq { { \int_use:N \l__nicematrix_initial_i_int } { \int_use:N \l__nicematrix_initial_j_int } { \int_use:N \l__nicematrix_final_i_int } { \int_use:N \l__nicematrix_final_j_int } } } \cs_new_protected:Npn \__nicematrix_adjust_to_submatrix:nn #1 #2 { \int_set:Nn \l__nicematrix_row_min_int 1 \int_set:Nn \l__nicematrix_col_min_int 1 \int_set_eq:NN \l__nicematrix_row_max_int \c@iRow \int_set_eq:NN \l__nicematrix_col_max_int \c@jCol \seq_map_inline:Nn \g__nicematrix_submatrix_seq { \__nicematrix_adjust_to_submatrix:nnnnnn { #1 } { #2 } ##1 } } \cs_set_protected:Npn \__nicematrix_adjust_to_submatrix:nnnnnn #1 #2 #3 #4 #5 #6 { \bool_if:nT { \int_compare_p:n { #3 <= #1 } && \int_compare_p:n { #1 <= #5 } && \int_compare_p:n { #4 <= #2 } && \int_compare_p:n { #2 <= #6 } } { \int_set:Nn \l__nicematrix_row_min_int { \int_max:nn \l__nicematrix_row_min_int { #3 } } \int_set:Nn \l__nicematrix_col_min_int { \int_max:nn \l__nicematrix_col_min_int { #4 } } \int_set:Nn \l__nicematrix_row_max_int { \int_min:nn \l__nicematrix_row_max_int { #5 } } \int_set:Nn \l__nicematrix_col_max_int { \int_min:nn \l__nicematrix_col_max_int { #6 } } } } \cs_new_protected:Npn \__nicematrix_set_initial_coords: { \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf@x \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf@y } \cs_new_protected:Npn \__nicematrix_set_final_coords: { \dim_set_eq:NN \l__nicematrix_x_final_dim \pgf@x \dim_set_eq:NN \l__nicematrix_y_final_dim \pgf@y } \cs_new_protected:Npn \__nicematrix_set_initial_coords_from_anchor:n #1 { \pgfpointanchor { \__nicematrix_env: - \int_use:N \l__nicematrix_initial_i_int - \int_use:N \l__nicematrix_initial_j_int } { #1 } \__nicematrix_set_initial_coords: } \cs_new_protected:Npn \__nicematrix_set_final_coords_from_anchor:n #1 { \pgfpointanchor { \__nicematrix_env: - \int_use:N \l__nicematrix_final_i_int - \int_use:N \l__nicematrix_final_j_int } { #1 } \__nicematrix_set_final_coords: } \cs_new_protected:Npn \__nicematrix_open_x_initial_dim: { \dim_set_eq:NN \l__nicematrix_x_initial_dim \c_max_dim \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - \int_use:N \l__nicematrix_initial_j_int } { \pgfpointanchor { \__nicematrix_env: - ##1 - \int_use:N \l__nicematrix_initial_j_int } { west } \dim_set:Nn \l__nicematrix_x_initial_dim { \dim_min:nn \l__nicematrix_x_initial_dim \pgf@x } } } \dim_compare:nNnT \l__nicematrix_x_initial_dim = \c_max_dim { \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_initial_j_int } \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf@x \dim_add:Nn \l__nicematrix_x_initial_dim \col@sep } } \cs_new_protected:Npn \__nicematrix_open_x_final_dim: { \dim_set:Nn \l__nicematrix_x_final_dim { - \c_max_dim } \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - \int_use:N \l__nicematrix_final_j_int } { \pgfpointanchor { \__nicematrix_env: - ##1 - \int_use:N \l__nicematrix_final_j_int } { east } \dim_set:Nn \l__nicematrix_x_final_dim { \dim_max:nn \l__nicematrix_x_final_dim \pgf@x } } } \dim_compare:nNnT \l__nicematrix_x_final_dim = { - \c_max_dim } { \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \l__nicematrix_final_j_int } \dim_set_eq:NN \l__nicematrix_x_final_dim \pgf@x \dim_sub:Nn \l__nicematrix_x_final_dim \col@sep } } \cs_new_protected:Npn \__nicematrix_draw_Ldots:nnn #1 #2 #3 { \__nicematrix_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { __nicematrix _ dotted _ #1 - #2 } { \__nicematrix_find_extremities_of_line:nnnn { #1 } { #2 } 0 1 \group_begin: \int_compare:nNnTF { #1 } = 0 { \color { nicematrix-first-row } } { \int_compare:nNnT { #1 } = \l__nicematrix_last_row_int { \color { nicematrix-last-row } } } \keys_set:nn { NiceMatrix / xdots } { #3 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Ldots: \group_end: } } \cs_new_protected:Npn \__nicematrix_actually_draw_Ldots: { \bool_if:NTF \l__nicematrix_initial_open_bool { \__nicematrix_open_x_initial_dim: \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_initial_i_int - base } \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf@y } { \__nicematrix_set_initial_coords_from_anchor:n { base~east } } \bool_if:NTF \l__nicematrix_final_open_bool { \__nicematrix_open_x_final_dim: \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_final_i_int - base } \dim_set_eq:NN \l__nicematrix_y_final_dim \pgf@y } { \__nicematrix_set_final_coords_from_anchor:n { base~west } } \dim_add:Nn \l__nicematrix_y_initial_dim \l__nicematrix_radius_dim \dim_add:Nn \l__nicematrix_y_final_dim \l__nicematrix_radius_dim \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_draw_Cdots:nnn #1 #2 #3 { \__nicematrix_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { __nicematrix _ dotted _ #1 - #2 } { \__nicematrix_find_extremities_of_line:nnnn { #1 } { #2 } 0 1 \group_begin: \int_compare:nNnTF { #1 } = 0 { \color { nicematrix-first-row } } { \int_compare:nNnT { #1 } = \l__nicematrix_last_row_int { \color { nicematrix-last-row } } } \keys_set:nn { NiceMatrix / xdots } { #3 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Cdots: \group_end: } } \cs_new_protected:Npn \__nicematrix_actually_draw_Cdots: { \bool_if:NTF \l__nicematrix_initial_open_bool { \__nicematrix_open_x_initial_dim: } { \__nicematrix_set_initial_coords_from_anchor:n { mid~east } } \bool_if:NTF \l__nicematrix_final_open_bool { \__nicematrix_open_x_final_dim: } { \__nicematrix_set_final_coords_from_anchor:n { mid~west } } \bool_lazy_and:nnTF \l__nicematrix_initial_open_bool \l__nicematrix_final_open_bool { \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_initial_i_int } \dim_set_eq:NN \l_tmpa_dim \pgf@y \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \l__nicematrix_initial_i_int } \dim_set:Nn \l__nicematrix_y_initial_dim { ( \l_tmpa_dim + \pgf@y ) / 2 } \dim_set_eq:NN \l__nicematrix_y_final_dim \l__nicematrix_y_initial_dim } { \bool_if:NT \l__nicematrix_initial_open_bool { \dim_set_eq:NN \l__nicematrix_y_initial_dim \l__nicematrix_y_final_dim } \bool_if:NT \l__nicematrix_final_open_bool { \dim_set_eq:NN \l__nicematrix_y_final_dim \l__nicematrix_y_initial_dim } } \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_open_y_initial_dim: { \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_initial_i_int - base } \dim_set:Nn \l__nicematrix_y_initial_dim { \pgf@y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch } \int_step_inline:nnn \l__nicematrix_first_col_int \g__nicematrix_col_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - \int_use:N \l__nicematrix_initial_i_int - ##1 } { \pgfpointanchor { \__nicematrix_env: - \int_use:N \l__nicematrix_initial_i_int - ##1 } { north } \dim_set:Nn \l__nicematrix_y_initial_dim { \dim_max:nn \l__nicematrix_y_initial_dim \pgf@y } } } } \cs_new_protected:Npn \__nicematrix_open_y_final_dim: { \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_final_i_int - base } \dim_set:Nn \l__nicematrix_y_final_dim { \pgf@y - ( \box_dp:N \strutbox ) * \arraystretch } \int_step_inline:nnn \l__nicematrix_first_col_int \g__nicematrix_col_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - \int_use:N \l__nicematrix_final_i_int - ##1 } { \pgfpointanchor { \__nicematrix_env: - \int_use:N \l__nicematrix_final_i_int - ##1 } { south } \dim_set:Nn \l__nicematrix_y_final_dim { \dim_min:nn \l__nicematrix_y_final_dim \pgf@y } } } } \cs_new_protected:Npn \__nicematrix_draw_Vdots:nnn #1 #2 #3 { \__nicematrix_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { __nicematrix _ dotted _ #1 - #2 } { \__nicematrix_find_extremities_of_line:nnnn { #1 } { #2 } 1 0 \group_begin: \int_compare:nNnTF { #2 } = 0 { \color { nicematrix-first-col } } { \int_compare:nNnT { #2 } = \l__nicematrix_last_col_int { \color { nicematrix-last-col } } } \keys_set:nn { NiceMatrix / xdots } { #3 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Vdots: \group_end: } } \cs_new_protected:Npn \__nicematrix_actually_draw_Vdots: { \bool_set_false:N \l_tmpa_bool \bool_lazy_or:nnF \l__nicematrix_initial_open_bool \l__nicematrix_final_open_bool { \__nicematrix_set_initial_coords_from_anchor:n { south~west } \__nicematrix_set_final_coords_from_anchor:n { north~west } \bool_set:Nn \l_tmpa_bool { \dim_compare_p:nNn \l__nicematrix_x_initial_dim = \l__nicematrix_x_final_dim } } \bool_if:NTF \l__nicematrix_initial_open_bool \__nicematrix_open_y_initial_dim: { \__nicematrix_set_initial_coords_from_anchor:n { south } } \bool_if:NTF \l__nicematrix_final_open_bool \__nicematrix_open_y_final_dim: { \__nicematrix_set_final_coords_from_anchor:n { north } } \bool_if:NTF \l__nicematrix_initial_open_bool { \bool_if:NTF \l__nicematrix_final_open_bool { \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_initial_j_int } \dim_set_eq:NN \l_tmpa_dim \pgf@x \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \l__nicematrix_initial_j_int } \dim_set:Nn \l__nicematrix_x_initial_dim { ( \pgf@x + \l_tmpa_dim ) / 2 } \dim_set_eq:NN \l__nicematrix_x_final_dim \l__nicematrix_x_initial_dim \int_compare:nNnT \l__nicematrix_last_col_int > { -2 } { \int_compare:nNnT \l__nicematrix_initial_j_int = \g__nicematrix_col_total_int { \dim_set_eq:NN \l_tmpa_dim \l__nicematrix_right_margin_dim \dim_add:Nn \l_tmpa_dim \l__nicematrix_extra_right_margin_dim \dim_add:Nn \l__nicematrix_x_initial_dim \l_tmpa_dim \dim_add:Nn \l__nicematrix_x_final_dim \l_tmpa_dim } } } { \dim_set_eq:NN \l__nicematrix_x_initial_dim \l__nicematrix_x_final_dim } } { \bool_if:NTF \l__nicematrix_final_open_bool { \dim_set_eq:NN \l__nicematrix_x_final_dim \l__nicematrix_x_initial_dim } { \dim_compare:nNnF \l__nicematrix_x_initial_dim = \l__nicematrix_x_final_dim { \dim_set:Nn \l__nicematrix_x_initial_dim { \bool_if:NTF \l_tmpa_bool \dim_min:nn \dim_max:nn \l__nicematrix_x_initial_dim \l__nicematrix_x_final_dim } \dim_set_eq:NN \l__nicematrix_x_final_dim \l__nicematrix_x_initial_dim } } } \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_draw_Ddots:nnn #1 #2 #3 { \__nicematrix_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { __nicematrix _ dotted _ #1 - #2 } { \__nicematrix_find_extremities_of_line:nnnn { #1 } { #2 } 1 1 \group_begin: \keys_set:nn { NiceMatrix / xdots } { #3 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Ddots: \group_end: } } \cs_new_protected:Npn \__nicematrix_actually_draw_Ddots: { \bool_if:NTF \l__nicematrix_initial_open_bool { \__nicematrix_open_y_initial_dim: % \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_initial_j_int } % \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf@x \__nicematrix_open_x_initial_dim: } { \__nicematrix_set_initial_coords_from_anchor:n { south~east } } \bool_if:NTF \l__nicematrix_final_open_bool { % \__nicematrix_open_y_final_dim: % \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \l__nicematrix_final_j_int } \__nicematrix_open_x_final_dim: \dim_set_eq:NN \l__nicematrix_x_final_dim \pgf@x } { \__nicematrix_set_final_coords_from_anchor:n { north~west } } \bool_if:NT \l__nicematrix_parallelize_diags_bool { \int_gincr:N \g__nicematrix_ddots_int \int_compare:nNnTF \g__nicematrix_ddots_int = 1 { \dim_gset:Nn \g__nicematrix_delta_x_one_dim { \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim } \dim_gset:Nn \g__nicematrix_delta_y_one_dim { \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim } } { \dim_set:Nn \l__nicematrix_y_final_dim { \l__nicematrix_y_initial_dim + ( \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) * \dim_ratio:nn \g__nicematrix_delta_y_one_dim \g__nicematrix_delta_x_one_dim } } } \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_draw_Iddots:nnn #1 #2 #3 { \__nicematrix_adjust_to_submatrix:nn { #1 } { #2 } \cs_if_free:cT { __nicematrix _ dotted _ #1 - #2 } { \__nicematrix_find_extremities_of_line:nnnn { #1 } { #2 } 1 { -1 } \group_begin: \keys_set:nn { NiceMatrix / xdots } { #3 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Iddots: \group_end: } } \cs_new_protected:Npn \__nicematrix_actually_draw_Iddots: { \bool_if:NTF \l__nicematrix_initial_open_bool { % \__nicematrix_qpoint:n { row - \int_use:N \l__nicematrix_initial_i_int } % \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf@y \__nicematrix_open_y_initial_dim: % \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \l__nicematrix_initial_j_int } % \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf@x \__nicematrix_open_x_initial_dim: } { \__nicematrix_set_initial_coords_from_anchor:n { south~west } } \bool_if:NTF \l__nicematrix_final_open_bool { % \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \l__nicematrix_final_i_int } % \dim_set_eq:NN \l__nicematrix_y_final_dim \pgf@y \__nicematrix_open_y_final_dim: % \__nicematrix_qpoint:n { col - \int_use:N \l__nicematrix_final_j_int } % \dim_set_eq:NN \l__nicematrix_x_final_dim \pgf@x \__nicematrix_open_x_final_dim: } { \__nicematrix_set_final_coords_from_anchor:n { north~east } } \bool_if:NT \l__nicematrix_parallelize_diags_bool { \int_gincr:N \g__nicematrix_iddots_int \int_compare:nNnTF \g__nicematrix_iddots_int = 1 { \dim_gset:Nn \g__nicematrix_delta_x_two_dim { \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim } \dim_gset:Nn \g__nicematrix_delta_y_two_dim { \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim } } { \dim_set:Nn \l__nicematrix_y_final_dim { \l__nicematrix_y_initial_dim + ( \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) * \dim_ratio:nn \g__nicematrix_delta_y_two_dim \g__nicematrix_delta_x_two_dim } } } \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_draw_line: { \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \tl_if_eq:NNTF \l__nicematrix_xdots_line_style_tl \c__nicematrix_standard_tl \__nicematrix_draw_standard_dotted_line: \__nicematrix_draw_non_standard_dotted_line: } \cs_new_protected:Npn \__nicematrix_draw_non_standard_dotted_line: { \begin { scope } \exp_args:No \__nicematrix_draw_non_standard_dotted_line:n { \l__nicematrix_xdots_line_style_tl , \l__nicematrix_xdots_color_tl } } \cs_new_protected:Npn \__nicematrix_draw_non_standard_dotted_line:n #1 { \__nicematrix_draw_non_standard_dotted_line:nVV { #1 } \l__nicematrix_xdots_up_tl \l__nicematrix_xdots_down_tl } \cs_new_protected:Npn \__nicematrix_draw_non_standard_dotted_line:nnn #1 #2 #3 { \draw [ #1 , shorten~> = \l__nicematrix_xdots_shorten_dim , shorten~< = \l__nicematrix_xdots_shorten_dim , ] ( \l__nicematrix_x_initial_dim , \l__nicematrix_y_initial_dim ) -- node [ sloped , above ] { $ \scriptstyle #2 $ } node [ sloped , below ] { $ \scriptstyle #3 $ } ( \l__nicematrix_x_final_dim , \l__nicematrix_y_final_dim ) ; \end { scope } } \cs_generate_variant:Nn \__nicematrix_draw_non_standard_dotted_line:nnn { n V V } \cs_new_protected:Npn \__nicematrix_draw_standard_dotted_line: { \bool_lazy_and:nnF { \tl_if_empty_p:N \l__nicematrix_xdots_up_tl } { \tl_if_empty_p:N \l__nicematrix_xdots_down_tl } { \pgfscope \pgftransformshift { \pgfpointlineattime { 0.5 } { \pgfpoint \l__nicematrix_x_initial_dim \l__nicematrix_y_initial_dim } { \pgfpoint \l__nicematrix_x_final_dim \l__nicematrix_y_final_dim } } \pgftransformrotate { \fp_eval:n { atand ( \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim , \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) } } \pgfnode { rectangle } { south } { \c_math_toggle_token \scriptstyle \l__nicematrix_xdots_up_tl \c_math_toggle_token } { } { \pgfusepath { } } \pgfnode { rectangle } { north } { \c_math_toggle_token \scriptstyle \l__nicematrix_xdots_down_tl \c_math_toggle_token } { } { \pgfusepath { } } \endpgfscope } \group_begin: \dim_zero_new:N \l__nicematrix_l_dim \dim_set:Nn \l__nicematrix_l_dim { \fp_to_dim:n { sqrt ( ( \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) ^ 2 + ( \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim ) ^ 2 ) } } \bool_lazy_or:nnF { \dim_compare_p:nNn { \dim_abs:n \l__nicematrix_l_dim } > \c__nicematrix_max_l_dim } { \dim_compare_p:nNn \l__nicematrix_l_dim = \c_zero_dim } \__nicematrix_draw_standard_dotted_line_i: \group_end: } \dim_const:Nn \c__nicematrix_max_l_dim { 50 cm } \cs_new_protected:Npn \__nicematrix_draw_standard_dotted_line_i: { \bool_if:NTF \l__nicematrix_initial_open_bool { \bool_if:NTF \l__nicematrix_final_open_bool { \int_set:Nn \l_tmpa_int { \dim_ratio:nn \l__nicematrix_l_dim \l__nicematrix_inter_dots_dim } } { \int_set:Nn \l_tmpa_int { \dim_ratio:nn { \l__nicematrix_l_dim - \l__nicematrix_xdots_shorten_dim } \l__nicematrix_inter_dots_dim } } } { \bool_if:NTF \l__nicematrix_final_open_bool { \int_set:Nn \l_tmpa_int { \dim_ratio:nn { \l__nicematrix_l_dim - \l__nicematrix_xdots_shorten_dim } \l__nicematrix_inter_dots_dim } } { \int_set:Nn \l_tmpa_int { \dim_ratio:nn { \l__nicematrix_l_dim - 2 \l__nicematrix_xdots_shorten_dim } \l__nicematrix_inter_dots_dim } } } \dim_set:Nn \l_tmpa_dim { ( \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) * \dim_ratio:nn \l__nicematrix_inter_dots_dim \l__nicematrix_l_dim } \dim_set:Nn \l_tmpb_dim { ( \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim ) * \dim_ratio:nn \l__nicematrix_inter_dots_dim \l__nicematrix_l_dim } \int_set:Nn \l_tmpb_int { \bool_if:NTF \l__nicematrix_initial_open_bool { \bool_if:NTF \l__nicematrix_final_open_bool 1 0 } { \bool_if:NTF \l__nicematrix_final_open_bool 2 1 } } \dim_gadd:Nn \l__nicematrix_x_initial_dim { ( \l__nicematrix_x_final_dim - \l__nicematrix_x_initial_dim ) * \dim_ratio:nn { \l__nicematrix_l_dim - \l__nicematrix_inter_dots_dim * \l_tmpa_int } { 2 \l__nicematrix_l_dim } * \l_tmpb_int } \dim_gadd:Nn \l__nicematrix_y_initial_dim { ( \l__nicematrix_y_final_dim - \l__nicematrix_y_initial_dim ) * \dim_ratio:nn { \l__nicematrix_l_dim - \l__nicematrix_inter_dots_dim * \l_tmpa_int } { 2 \l__nicematrix_l_dim } * \l_tmpb_int } \pgf@relevantforpicturesizefalse \int_step_inline:nnn 0 \l_tmpa_int { \pgfpathcircle { \pgfpoint \l__nicematrix_x_initial_dim \l__nicematrix_y_initial_dim } { \l__nicematrix_radius_dim } \dim_add:Nn \l__nicematrix_x_initial_dim \l_tmpa_dim \dim_add:Nn \l__nicematrix_y_initial_dim \l_tmpb_dim } \pgfusepathqfill } \AtBeginDocument { \tl_set:Nn \l__nicematrix_argspec_tl { O { } E { _ ^ } { { } { } } } \tl_set_rescan:Nno \l__nicematrix_argspec_tl { } \l__nicematrix_argspec_tl \exp_args:NNV \NewDocumentCommand \__nicematrix_Ldots \l__nicematrix_argspec_tl { \int_compare:nNnTF \c@jCol = 0 { \__nicematrix_error:nn { in~first~col } \Ldots } { \int_compare:nNnTF \c@jCol = \l__nicematrix_last_col_int { \__nicematrix_error:nn { in~last~col } \Ldots } { \__nicematrix_instruction_of_type:nnn \c_false_bool { Ldots } { #1 , down = #2 , up = #3 } } } \bool_if:NF \l__nicematrix_nullify_dots_bool { \phantom { \ensuremath { \__nicematrix_old_ldots } } } \bool_gset_true:N \g__nicematrix_empty_cell_bool } \exp_args:NNV \NewDocumentCommand \__nicematrix_Cdots \l__nicematrix_argspec_tl { \int_compare:nNnTF \c@jCol = 0 { \__nicematrix_error:nn { in~first~col } \Cdots } { \int_compare:nNnTF \c@jCol = \l__nicematrix_last_col_int { \__nicematrix_error:nn { in~last~col } \Cdots } { \__nicematrix_instruction_of_type:nnn \c_false_bool { Cdots } { #1 , down = #2 , up = #3 } } } \bool_if:NF \l__nicematrix_nullify_dots_bool { \phantom { \ensuremath { \__nicematrix_old_cdots } } } \bool_gset_true:N \g__nicematrix_empty_cell_bool } \exp_args:NNV \NewDocumentCommand \__nicematrix_Vdots \l__nicematrix_argspec_tl { \int_compare:nNnTF \c@iRow = 0 { \__nicematrix_error:nn { in~first~row } \Vdots } { \int_compare:nNnTF \c@iRow = \l__nicematrix_last_row_int { \__nicematrix_error:nn { in~last~row } \Vdots } { \__nicematrix_instruction_of_type:nnn \c_false_bool { Vdots } { #1 , down = #2 , up = #3 } } } \bool_if:NF \l__nicematrix_nullify_dots_bool { \phantom { \ensuremath { \__nicematrix_old_vdots } } } \bool_gset_true:N \g__nicematrix_empty_cell_bool } \exp_args:NNV \NewDocumentCommand \__nicematrix_Ddots \l__nicematrix_argspec_tl { \int_case:nnF \c@iRow { 0 { \__nicematrix_error:nn { in~first~row } \Ddots } \l__nicematrix_last_row_int { \__nicematrix_error:nn { in~last~row } \Ddots } } { \int_case:nnF \c@jCol { 0 { \__nicematrix_error:nn { in~first~col } \Ddots } \l__nicematrix_last_col_int { \__nicematrix_error:nn { in~last~col } \Ddots } } { \keys_set_known:nn { NiceMatrix / Ddots } { #1 } \__nicematrix_instruction_of_type:nnn \l__nicematrix_draw_first_bool { Ddots } { #1 , down = #2 , up = #3 } } } \bool_if:NF \l__nicematrix_nullify_dots_bool { \phantom { \ensuremath { \__nicematrix_old_ddots } } } \bool_gset_true:N \g__nicematrix_empty_cell_bool } \exp_args:NNV \NewDocumentCommand \__nicematrix_Iddots \l__nicematrix_argspec_tl { \int_case:nnF \c@iRow { 0 { \__nicematrix_error:nn { in~first~row } \Iddots } \l__nicematrix_last_row_int { \__nicematrix_error:nn { in~last~row } \Iddots } } { \int_case:nnF \c@jCol { 0 { \__nicematrix_error:nn { in~first~col } \Iddots } \l__nicematrix_last_col_int { \__nicematrix_error:nn { in~last~col } \Iddots } } { \keys_set_known:nn { NiceMatrix / Ddots } { #1 } \__nicematrix_instruction_of_type:nnn \l__nicematrix_draw_first_bool { Iddots } { #1 , down = #2 , up = #3 } } } \bool_if:NF \l__nicematrix_nullify_dots_bool { \phantom { \ensuremath { \__nicematrix_old_iddots } } } \bool_gset_true:N \g__nicematrix_empty_cell_bool } } \keys_define:nn { NiceMatrix / Ddots } { draw-first .bool_set:N = \l__nicematrix_draw_first_bool , draw-first .default:n = true , draw-first .value_forbidden:n = true } \cs_new_protected:Npn \__nicematrix_Hspace: { \bool_gset_true:N \g__nicematrix_empty_cell_bool \hspace } \cs_set_eq:NN \__nicematrix_old_multicolumn \multicolumn \cs_new:Npn \__nicematrix_multicolumn:nnn #1 #2 #3 { \exp_args:NNe \__nicematrix_old_multicolumn { #1 } { \exp_args:Ne \str_case:nn { \str_foldcase:n { #2 } } { l { > \__nicematrix_Cell: l < \__nicematrix_end_Cell: } r { > \__nicematrix_Cell: r < \__nicematrix_end_Cell: } c { > \__nicematrix_Cell: c < \__nicematrix_end_Cell: } { l | } { > \__nicematrix_Cell: l < \__nicematrix_end_Cell: | } { r | } { > \__nicematrix_Cell: r < \__nicematrix_end_Cell: | } { c | } { > \__nicematrix_Cell: c < \__nicematrix_end_Cell: | } { | l } { | > \__nicematrix_Cell: l < \__nicematrix_end_Cell: } { | r } { | > \__nicematrix_Cell: r < \__nicematrix_end_Cell: } { | c } { | > \__nicematrix_Cell: c < \__nicematrix_end_Cell: } { | l | } { | > \__nicematrix_Cell: l < \__nicematrix_end_Cell: | } { | r | } { | > \__nicematrix_Cell: r < \__nicematrix_end_Cell: | } { | c | } { | > \__nicematrix_Cell: c < \__nicematrix_end_Cell: | } } } { #3 } \peek_remove_spaces:n { \int_compare:nNnT #1 > 1 { \seq_gput_left:Nx \g__nicematrix_multicolumn_cells_seq { \int_use:N \c@iRow - \int_use:N \c@jCol } \seq_gput_left:Nn \g__nicematrix_multicolumn_sizes_seq { #1 } \seq_gput_right:Nx \g__nicematrix_pos_of_blocks_seq { { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \int_use:N \c@iRow } { \int_eval:n { \c@jCol + #1 - 1 } } } } \int_gadd:Nn \c@jCol { #1 - 1 } \int_compare:nNnT \c@jCol > \g__nicematrix_col_total_int { \int_gset_eq:NN \g__nicematrix_col_total_int \c@jCol } } } \cs_new:Npn \__nicematrix_Hdotsfor: { \bool_lazy_and:nnTF { \int_compare_p:nNn \c@jCol = 0 } { \int_compare_p:nNn \l__nicematrix_first_col_int = 0 } { \bool_if:NTF \g__nicematrix_after_col_zero_bool { \multicolumn { 1 } { c } { } \__nicematrix_Hdotsfor_i } { \__nicematrix_fatal:n { Hdotsfor~in~col~0 } } } { \multicolumn { 1 } { c } { } \__nicematrix_Hdotsfor_i } } \AtBeginDocument { \tl_set:Nn \l__nicematrix_argspec_tl { O { } m O { } E { _ ^ } { { } { } } } \tl_set_rescan:Nno \l__nicematrix_argspec_tl { } \l__nicematrix_argspec_tl \exp_args:NNV \NewDocumentCommand \__nicematrix_Hdotsfor_i \l__nicematrix_argspec_tl { \tl_gput_right:Nx \g__nicematrix_HVdotsfor_lines_tl { \__nicematrix_Hdotsfor:nnnn { \int_use:N \c@iRow } { \int_use:N \c@jCol } { #2 } { #1 , #3 , down = \exp_not:n { #4 } , up = \exp_not:n { #5 } } } \prg_replicate:nn { #2 - 1 } { & \multicolumn { 1 } { c } { } } } } \cs_new_protected:Npn \__nicematrix_Hdotsfor:nnnn #1 #2 #3 #4 { \bool_set_false:N \l__nicematrix_initial_open_bool \bool_set_false:N \l__nicematrix_final_open_bool \int_set:Nn \l__nicematrix_initial_i_int { #1 } \int_set_eq:NN \l__nicematrix_final_i_int \l__nicematrix_initial_i_int \int_compare:nNnTF #2 = 1 { \int_set:Nn \l__nicematrix_initial_j_int 1 \bool_set_true:N \l__nicematrix_initial_open_bool } { \cs_if_exist:cTF { pgf @ sh @ ns @ \__nicematrix_env: - \int_use:N \l__nicematrix_initial_i_int - \int_eval:n { #2 - 1 } } { \int_set:Nn \l__nicematrix_initial_j_int { #2 - 1 } } { \int_set:Nn \l__nicematrix_initial_j_int { #2 } \bool_set_true:N \l__nicematrix_initial_open_bool } } \int_compare:nNnTF { #2 + #3 -1 } = \c@jCol { \int_set:Nn \l__nicematrix_final_j_int { #2 + #3 - 1 } \bool_set_true:N \l__nicematrix_final_open_bool } { \cs_if_exist:cTF { pgf @ sh @ ns @ \__nicematrix_env: - \int_use:N \l__nicematrix_final_i_int - \int_eval:n { #2 + #3 } } { \int_set:Nn \l__nicematrix_final_j_int { #2 + #3 } } { \int_set:Nn \l__nicematrix_final_j_int { #2 + #3 - 1 } \bool_set_true:N \l__nicematrix_final_open_bool } } \group_begin: \int_compare:nNnTF { #1 } = 0 { \color { nicematrix-first-row } } { \int_compare:nNnT { #1 } = \g__nicematrix_row_total_int { \color { nicematrix-last-row } } } \keys_set:nn { NiceMatrix / xdots } { #4 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Ldots: \group_end: \int_step_inline:nnn { #2 } { #2 + #3 - 1 } { \cs_set:cpn { __nicematrix _ dotted _ #1 - ##1 } { } } } \AtBeginDocument { \tl_set:Nn \l__nicematrix_argspec_tl { O { } m O { } E { _ ^ } { { } { } } } \tl_set_rescan:Nno \l__nicematrix_argspec_tl { } \l__nicematrix_argspec_tl \exp_args:NNV \NewDocumentCommand \__nicematrix_Vdotsfor: \l__nicematrix_argspec_tl { \tl_gput_right:Nx \g__nicematrix_HVdotsfor_lines_tl { \__nicematrix_Vdotsfor:nnnn { \int_use:N \c@iRow } { \int_use:N \c@jCol } { #2 } { #1 , #3 , down = \exp_not:n { #4 } , up = \exp_not:n { #5 } } } } } \cs_new_protected:Npn \__nicematrix_Vdotsfor:nnnn #1 #2 #3 #4 { \bool_set_false:N \l__nicematrix_initial_open_bool \bool_set_false:N \l__nicematrix_final_open_bool \int_set:Nn \l__nicematrix_initial_j_int { #2 } \int_set_eq:NN \l__nicematrix_final_j_int \l__nicematrix_initial_j_int \int_compare:nNnTF #1 = 1 { \int_set:Nn \l__nicematrix_initial_i_int 1 \bool_set_true:N \l__nicematrix_initial_open_bool } { \cs_if_exist:cTF { pgf @ sh @ ns @ \__nicematrix_env: - \int_eval:n { #1 - 1 } - \int_use:N \l__nicematrix_initial_j_int } { \int_set:Nn \l__nicematrix_initial_i_int { #1 - 1 } } { \int_set:Nn \l__nicematrix_initial_i_int { #1 } \bool_set_true:N \l__nicematrix_initial_open_bool } } \int_compare:nNnTF { #1 + #3 -1 } = \c@iRow { \int_set:Nn \l__nicematrix_final_i_int { #1 + #3 - 1 } \bool_set_true:N \l__nicematrix_final_open_bool } { \cs_if_exist:cTF { pgf @ sh @ ns @ \__nicematrix_env: - \int_eval:n { #1 + #3 } - \int_use:N \l__nicematrix_final_j_int } { \int_set:Nn \l__nicematrix_final_i_int { #1 + #3 } } { \int_set:Nn \l__nicematrix_final_i_int { #1 + #3 - 1 } \bool_set_true:N \l__nicematrix_final_open_bool } } \group_begin: \int_compare:nNnTF { #2 } = 0 { \color { nicematrix-first-col } } { \int_compare:nNnT { #2 } = \g__nicematrix_col_total_int { \color { nicematrix-last-col } } } \keys_set:nn { NiceMatrix / xdots } { #4 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \__nicematrix_actually_draw_Vdots: \group_end: \int_step_inline:nnn { #1 } { #1 + #3 - 1 } { \cs_set:cpn { __nicematrix _ dotted _ ##1 - #2 } { } } } \cs_new_protected:Npn \__nicematrix_rotate: { \bool_gset_true:N \g__nicematrix_rotate_bool } \cs_new:Npn \__nicematrix_double_int_eval:n #1-#2 \q_stop { \int_eval:n { #1 } - \int_eval:n { #2 } } \AtBeginDocument { \tl_set:Nn \l__nicematrix_argspec_tl { O { } m m ! O { } E { _ ^ } { { } { } } } \tl_set_rescan:Nno \l__nicematrix_argspec_tl { } \l__nicematrix_argspec_tl \exp_args:NNV \NewDocumentCommand \__nicematrix_line \l__nicematrix_argspec_tl { \group_begin: \keys_set:nn { NiceMatrix / xdots } { #1 , #4 , down = #5 , up = #6 } \tl_if_empty:VF \l__nicematrix_xdots_color_tl { \color { \l__nicematrix_xdots_color_tl } } \use:e { \__nicematrix_line_i:nn { \__nicematrix_double_int_eval:n #2 \q_stop } { \__nicematrix_double_int_eval:n #3 \q_stop } } \group_end: } } \cs_new_protected:Npn \__nicematrix_line_i:nn #1 #2 { \bool_set_false:N \l__nicematrix_initial_open_bool \bool_set_false:N \l__nicematrix_final_open_bool \bool_if:nTF { \cs_if_free_p:c { pgf @ sh @ ns @ \__nicematrix_env: - #1 } || \cs_if_free_p:c { pgf @ sh @ ns @ \__nicematrix_env: - #2 } } { \__nicematrix_error:nnn { unknown~cell~for~line~in~CodeAfter } { #1 } { #2 } } { \__nicematrix_draw_line_ii:nn { #1 } { #2 } } } \AtBeginDocument { \cs_new_protected:Npx \__nicematrix_draw_line_ii:nn #1 #2 { \c__nicematrix_pgfortikzpicture_tl \__nicematrix_draw_line_iii:nn { #1 } { #2 } \c__nicematrix_endpgfortikzpicture_tl } } \cs_new_protected:Npn \__nicematrix_draw_line_iii:nn #1 #2 { \pgfrememberpicturepositiononpagetrue \pgfpointshapeborder { \__nicematrix_env: - #1 } { \__nicematrix_qpoint:n { #2 } } \dim_set_eq:NN \l__nicematrix_x_initial_dim \pgf@x \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf@y \pgfpointshapeborder { \__nicematrix_env: - #2 } { \__nicematrix_qpoint:n { #1 } } \dim_set_eq:NN \l__nicematrix_x_final_dim \pgf@x \dim_set_eq:NN \l__nicematrix_y_final_dim \pgf@y \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_add_to_colors_seq:nn #1 #2 { \int_zero:N \l_tmpa_int \seq_map_indexed_inline:Nn \l__nicematrix_colors_seq { \tl_if_eq:nnT { #1 } { ##2 } { \int_set:Nn \l_tmpa_int { ##1 } } } \int_compare:nNnTF \l_tmpa_int = \c_zero_int { \seq_put_right:Nn \l__nicematrix_colors_seq { #1 } \tl_set:cn { l__nicematrix_color _ \seq_count:N \l__nicematrix_colors_seq _ tl } { #2 } } { \tl_put_right:cn { l__nicematrix_color _ \int_use:N \l_tmpa_int _tl } { #2 } } } \cs_generate_variant:Nn \__nicematrix_add_to_colors_seq:nn { x n } \cs_new_protected:Npn \__nicematrix_actually_color: { \pgfpicture \pgf@relevantforpicturesizefalse \seq_map_indexed_inline:Nn \l__nicematrix_colors_seq { \color ##2 \use:c { l__nicematrix_color _ ##1 _tl } \pgfusepath { fill } } \endpgfpicture } \cs_set_protected:Npn \__nicematrix_cut_on_hyphen:w #1-#2\q_stop { \tl_set:Nn \l_tmpa_tl { #1 } \tl_set:Nn \l_tmpb_tl { #2 } } \NewDocumentCommand \__nicematrix_rowcolor { O { } m m } { \tl_if_blank:nF { #2 } { \__nicematrix_add_to_colors_seq:xn { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } } { \__nicematrix_rowcolor:n { #3 } } } } \cs_new_protected:Npn \__nicematrix_rowcolor:n #1 { \tl_set:Nn \l__nicematrix_rows_tl { #1 } \tl_set:Nn \l__nicematrix_cols_tl { - } \__nicematrix_cartesian_path: } \NewDocumentCommand \__nicematrix_columncolor { O { } m m } { \tl_if_blank:nF { #2 } { \__nicematrix_add_to_colors_seq:xn { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } } { \__nicematrix_columncolor:n { #3 } } } } \cs_new_protected:Npn \__nicematrix_columncolor:n #1 { \tl_set:Nn \l__nicematrix_rows_tl { - } \tl_set:Nn \l__nicematrix_cols_tl { #1 } \__nicematrix_cartesian_path: } \NewDocumentCommand \__nicematrix_rectanglecolor { O { } m m m } { \tl_if_blank:nF { #2 } { \__nicematrix_add_to_colors_seq:xn { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } } { \__nicematrix_rectanglecolor:nnn { #3 } { #4 } { 0 pt }} } } \NewDocumentCommand \__nicematrix_roundedrectanglecolor { O { } m m m m } { \tl_if_blank:nF { #2 } { \__nicematrix_add_to_colors_seq:xn { \tl_if_blank:nF { #1 } { [ #1 ] } { #2 } } { \__nicematrix_rectanglecolor:nnn { #3 } { #4 } { #5 } } } } \cs_new_protected:Npn \__nicematrix_rectanglecolor:nnn #1 #2 #3 { \__nicematrix_cut_on_hyphen:w #1 \q_stop \tl_clear_new:N \l_tmpc_tl \tl_clear_new:N \l_tmpd_tl \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl \__nicematrix_cut_on_hyphen:w #2 \q_stop \tl_set:Nx \l__nicematrix_rows_tl { \l_tmpc_tl - \l_tmpa_tl } \tl_set:Nx \l__nicematrix_cols_tl { \l_tmpd_tl - \l_tmpb_tl } \__nicematrix_cartesian_path:n { #3 } } \NewDocumentCommand \__nicematrix_cellcolor { O { } m m } { \clist_map_inline:nn { #3 } { \__nicematrix_rectanglecolor [ #1 ] { #2 } { ##1 } { ##1 } } } \NewDocumentCommand \__nicematrix_chessboardcolors { O { } m m } { \int_step_inline:nn { \int_use:N \c@iRow } { \int_step_inline:nn { \int_use:N \c@jCol } { \int_if_even:nTF { ####1 + ##1 } { \__nicematrix_cellcolor [ #1 ] { #2 } } { \__nicematrix_cellcolor [ #1 ] { #3 } } { ##1 - ####1 } } } } \keys_define:nn { NiceMatrix / rowcolors } { respect-blocks .bool_set:N = \l__nicematrix_respect_blocks_bool , respect-blocks .default:n = true , cols .tl_set:N = \l__nicematrix_cols_tl , restart .bool_set:N = \l__nicematrix_rowcolors_restart_bool , restart .default:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~rowcolors } } \NewDocumentCommand \__nicematrix_rowcolors { O { } m m m O { } } { \group_begin: \tl_clear_new:N \l__nicematrix_cols_tl \tl_set:Nn \l__nicematrix_cols_tl { - } \keys_set:nn { NiceMatrix / rowcolors } { #5 } \bool_set_true:N \l_tmpa_bool \bool_lazy_and:nnT \l__nicematrix_respect_blocks_bool { \cs_if_exist_p:c { c__nicematrix_pos_of_blocks_ \int_use:N \g__nicematrix_env_int _ seq } } { \seq_set_eq:Nc \l_tmpb_seq { c__nicematrix_pos_of_blocks_ \int_use:N \g__nicematrix_env_int _ seq } \seq_set_filter:NNn \l_tmpa_seq \l_tmpb_seq { \__nicematrix_not_in_exterior_p:nnnn ##1 } } \pgfpicture \pgf@relevantforpicturesizefalse \clist_map_inline:nn { #2 } { \tl_set:Nn \l_tmpa_tl { ##1 } \tl_if_in:NnTF \l_tmpa_tl { - } { \__nicematrix_cut_on_hyphen:w ##1 \q_stop } { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } } \int_set:Nn \l_tmpa_int \l_tmpa_tl \bool_if:NTF \l__nicematrix_rowcolors_restart_bool { \bool_set_true:N \l_tmpa_bool } { \bool_set:Nn \l_tmpa_bool { \int_if_odd_p:n { \l_tmpa_tl } } } \int_zero_new:N \l_tmpc_int \int_set:Nn \l_tmpc_int \l_tmpb_tl \int_do_until:nNnn \l_tmpa_int > \l_tmpc_int { \int_set_eq:NN \l_tmpb_int \l_tmpa_int \bool_lazy_and:nnT \l__nicematrix_respect_blocks_bool { \cs_if_exist_p:c { c__nicematrix_pos_of_blocks_ \int_use:N \g__nicematrix_env_int _ seq } } { \seq_set_filter:NNn \l_tmpb_seq \l_tmpa_seq { \__nicematrix_intersect_our_row_p:nnnn ####1 } \seq_map_inline:Nn \l_tmpb_seq { \__nicematrix_rowcolors_i:nnnn ####1 } } \tl_set:Nx \l__nicematrix_rows_tl { \int_use:N \l_tmpa_int - \int_use:N \l_tmpb_int } \bool_if:NTF \l_tmpa_bool { \tl_if_blank:nF { #3 } { \tl_if_empty:nTF { #1 } \color { \color [ #1 ] } { #3 } \__nicematrix_cartesian_path: \pgfusepath { fill } } \bool_set_false:N \l_tmpa_bool } { \tl_if_blank:nF { #4 } { \tl_if_empty:nTF { #1 } \color { \color [ #1 ] } { #4 } \__nicematrix_cartesian_path: \pgfusepath { fill } } \bool_set_true:N \l_tmpa_bool } \int_set:Nn \l_tmpa_int { \l_tmpb_int + 1 } } } \endpgfpicture \group_end: } \cs_new_protected:Npn \__nicematrix_rowcolors_i:nnnn #1 #2 #3 #4 { \int_compare:nNnT { #3 } > \l_tmpb_int { \int_set:Nn \l_tmpb_int { #3 } } } \prg_new_conditional:Nnn \__nicematrix_not_in_exterior:nnnn p { \bool_lazy_or:nnTF { \int_compare_p:nNn { #4 } = \c_zero_int } { \int_compare_p:nNn { #2 } = { \__nicematrix_succ:n { \c@jCol } } } \prg_return_false: \prg_return_true: } \prg_new_conditional:Nnn \__nicematrix_intersect_our_row:nnnn p { \bool_if:nTF { \int_compare_p:n { #1 <= \l_tmpa_int } && \int_compare_p:n { \l_tmpa_int <= #3 } } \prg_return_true: \prg_return_false: } \cs_new:Npn \__nicematrix_cartesian_path: { \__nicematrix_cartesian_path:n { 0 pt } } \cs_new_protected:Npn \__nicematrix_cartesian_path:n #1 { \clist_map_inline:Nn \l__nicematrix_cols_tl { \tl_set:Nn \l_tmpa_tl { ##1 } \tl_if_in:NnTF \l_tmpa_tl { - } { \__nicematrix_cut_on_hyphen:w ##1 \q_stop } { \__nicematrix_cut_on_hyphen:w ##1 - ##1 \q_stop } \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } } \tl_if_empty:NT \l_tmpb_tl { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } } \int_compare:nNnT \l_tmpb_tl > \c@jCol { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } } \__nicematrix_qpoint:n { col - \l_tmpa_tl } \int_compare:nNnTF \l__nicematrix_first_col_int = \l_tmpa_tl { \dim_set:Nn \l_tmpc_dim { \pgf@x - 0.5 \arrayrulewidth } } { \dim_set:Nn \l_tmpc_dim { \pgf@x + 0.5 \arrayrulewidth } } \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \l_tmpb_tl } \dim_set:Nn \l_tmpa_dim { \pgf@x + 0.5 \arrayrulewidth } \clist_map_inline:Nn \l__nicematrix_rows_tl { \tl_set:Nn \l_tmpa_tl { ####1 } \tl_if_in:NnTF \l_tmpa_tl { - } { \__nicematrix_cut_on_hyphen:w ####1 \q_stop } { \__nicematrix_cut_on_hyphen:w ####1 - ####1 \q_stop } \tl_if_empty:NT \l_tmpa_tl { \tl_set:Nn \l_tmpa_tl { 1 } } \tl_if_empty:NT \l_tmpb_tl { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } } \int_compare:nNnT \l_tmpb_tl > \c@iRow { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@iRow } } \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \l_tmpb_tl } \dim_set:Nn \l_tmpb_dim { \pgf@y + 0.5 \arrayrulewidth } \__nicematrix_qpoint:n { row - \l_tmpa_tl } \dim_set:Nn \l_tmpd_dim { \pgf@y + 0.5 \arrayrulewidth } \pgfsetcornersarced { \pgfpoint { #1 } { #1 } } \pgfpathrectanglecorners { \pgfpoint \l_tmpc_dim \l_tmpd_dim } { \pgfpoint \l_tmpa_dim \l_tmpb_dim } } } } \NewDocumentCommand \__nicematrix_cellcolor_tabular { O { } m } { \tl_gput_right:Nx \g_nicematrix_code_before_tl { \cellcolor [ #1 ] { \exp_not:n { #2 } } { \int_use:N \c@iRow - \int_use:N \c@jCol } } } \NewDocumentCommand \__nicematrix_rowcolor_tabular { O { } m } { \tl_gput_right:Nx \g_nicematrix_code_before_tl { \exp_not:N \rectanglecolor [ #1 ] { \exp_not:n { #2 } } { \int_use:N \c@iRow - \int_use:N \c@jCol } { \int_use:N \c@iRow - \exp_not:n { \int_use:N \c@jCol } } } } \NewDocumentCommand \__nicematrix_columncolor_preamble { O { } m } { \int_compare:nNnT \c@iRow = 1 { \tl_gput_left:Nx \g_nicematrix_code_before_tl { \exp_not:N \columncolor [ #1 ] { \exp_not:n { #2 } } { \int_use:N \c@jCol } } } } \cs_set_eq:NN \OnlyMainNiceMatrix \use:n \cs_new_protected:Npn \__nicematrix_OnlyMainNiceMatrix:n #1 { \int_compare:nNnTF \l__nicematrix_first_col_int = 0 { \__nicematrix_OnlyMainNiceMatrix_i:n { #1 } } { \int_compare:nNnTF \c@jCol = 0 { \int_compare:nNnF \c@iRow = { -1 } { \int_compare:nNnF \c@iRow = { \l__nicematrix_last_row_int - 1 } { #1 } } } { \__nicematrix_OnlyMainNiceMatrix_i:n { #1 } } } } \cs_new_protected:Npn \__nicematrix_OnlyMainNiceMatrix_i:n #1 { \int_compare:nNnF \c@iRow = 0 { \int_compare:nNnF \c@iRow = \l__nicematrix_last_row_int { #1 } } } \cs_new_protected:Npn \__nicematrix_vline:nn #1 #2 { \int_compare:nNnT { #1 } < { \c@jCol + 2 } { \pgfpicture \__nicematrix_vline_i:nn { #1 } { #2 } \endpgfpicture } } \cs_new_protected:Npn \__nicematrix_vline_i:nn #1 #2 { \tl_set:Nx \l_tmpb_tl { #1 } \tl_clear_new:N \l_tmpc_tl \int_step_variable:nNn \c@iRow \l_tmpa_tl { \bool_gset_true:N \g_tmpa_bool \seq_map_inline:Nn \g__nicematrix_pos_of_blocks_seq { \__nicematrix_test_vline_in_block:nnnn ##1 } \seq_map_inline:Nn \g__nicematrix_pos_of_xdots_seq { \__nicematrix_test_vline_in_block:nnnn ##1 } \seq_map_inline:Nn \g__nicematrix_pos_of_stroken_blocks_seq { \__nicematrix_test_vline_in_stroken_block:nnnn ##1 } \clist_if_empty:NF \l__nicematrix_except_corners_clist \__nicematrix_test_in_corner_v: \bool_if:NTF \g_tmpa_bool { \tl_if_empty:NT \l_tmpc_tl { \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl } } { \tl_if_empty:NF \l_tmpc_tl { \__nicematrix_vline_ii:nnnn { #1 } { #2 } \l_tmpc_tl { \int_eval:n { \l_tmpa_tl - 1 } } \tl_clear:N \l_tmpc_tl } } } \tl_if_empty:NF \l_tmpc_tl { \__nicematrix_vline_ii:nnnn { #1 } { #2 } \l_tmpc_tl { \int_use:N \c@iRow } \tl_clear:N \l_tmpc_tl } } \cs_new_protected:Npn \__nicematrix_test_in_corner_v: { \int_compare:nNnTF \l_tmpb_tl = { \__nicematrix_succ:n \c@jCol } { \seq_if_in:NxT \l__nicematrix_empty_corner_cells_seq { \l_tmpa_tl - \__nicematrix_pred:n \l_tmpb_tl } { \bool_set_false:N \g_tmpa_bool } } { \seq_if_in:NxT \l__nicematrix_empty_corner_cells_seq { \l_tmpa_tl - \l_tmpb_tl } { \int_compare:nNnTF \l_tmpb_tl = 1 { \bool_set_false:N \g_tmpa_bool } { \seq_if_in:NxT \l__nicematrix_empty_corner_cells_seq { \l_tmpa_tl - \__nicematrix_pred:n \l_tmpb_tl } { \bool_set_false:N \g_tmpa_bool } } } } } \cs_new_protected:Npn \__nicematrix_vline_ii:nnnn #1 #2 #3 #4 { \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_qpoint:n { row - #3 } \dim_set_eq:NN \l_tmpa_dim \pgf@y \__nicematrix_qpoint:n { col - #1 } \dim_set_eq:NN \l_tmpb_dim \pgf@x \__nicematrix_qpoint:n { row - \__nicematrix_succ:n { #4 } } \dim_set_eq:NN \l_tmpc_dim \pgf@y \bool_lazy_and:nnT { \int_compare_p:nNn { #2 } > 1 } { ! \tl_if_blank_p:V \CT@drsc@ } { \group_begin: \CT@drsc@ \dim_add:Nn \l_tmpa_dim { 0.5 \arrayrulewidth } \dim_sub:Nn \l_tmpc_dim { 0.5 \arrayrulewidth } \dim_set:Nn \l_tmpd_dim { \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth ) * ( #2 - 1 ) } \pgfpathrectanglecorners { \pgfpoint \l_tmpb_dim \l_tmpa_dim } { \pgfpoint \l_tmpd_dim \l_tmpc_dim } \pgfusepath { fill } \group_end: } \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim } \prg_replicate:nn { #2 - 1 } { \dim_sub:Nn \l_tmpb_dim \arrayrulewidth \dim_sub:Nn \l_tmpb_dim \doublerulesep \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } \pgfpathlineto { \pgfpoint \l_tmpb_dim \l_tmpc_dim } } \CT@arc@ \pgfsetlinewidth { 1.1 \arrayrulewidth } \pgfsetrectcap \pgfusepathqstroke } \cs_new_protected:Npn \__nicematrix_vline_i_complete:nn #1 #2 { \__nicematrix_vline_ii:nnnn { #1 } { #2 } 1 { \int_use:N \c@iRow } } \cs_new_protected:Npn \__nicematrix_draw_vlines: { \int_step_inline:nnn { \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 } } { \__nicematrix_vline:nn { ##1 } 1 } } } \cs_new_protected:Npn \__nicematrix_hline:nn #1 #2 { \pgfpicture \__nicematrix_hline_i:nn { #1 } { #2 } \endpgfpicture } \cs_new_protected:Npn \__nicematrix_hline_i:nn #1 #2 { \tl_set:Nn \l_tmpa_tl { #1 } \tl_clear_new:N \l_tmpc_tl \int_step_variable:nNn \c@jCol \l_tmpb_tl { \bool_gset_true:N \g_tmpa_bool \seq_map_inline:Nn \g__nicematrix_pos_of_blocks_seq { \__nicematrix_test_hline_in_block:nnnn ##1 } \seq_map_inline:Nn \g__nicematrix_pos_of_xdots_seq { \__nicematrix_test_hline_in_block:nnnn ##1 } \seq_map_inline:Nn \g__nicematrix_pos_of_stroken_blocks_seq { \__nicematrix_test_hline_in_stroken_block:nnnn ##1 } \clist_if_empty:NF \l__nicematrix_except_corners_clist \__nicematrix_test_in_corner_h: \bool_if:NTF \g_tmpa_bool { \tl_if_empty:NT \l_tmpc_tl { \tl_set_eq:NN \l_tmpc_tl \l_tmpb_tl } } { \tl_if_empty:NF \l_tmpc_tl { \__nicematrix_hline_ii:nnnn { #1 } { #2 } \l_tmpc_tl { \int_eval:n { \l_tmpb_tl - 1 } } \tl_clear:N \l_tmpc_tl } } } \tl_if_empty:NF \l_tmpc_tl { \__nicematrix_hline_ii:nnnn { #1 } { #2 } \l_tmpc_tl { \int_use:N \c@jCol } \tl_clear:N \l_tmpc_tl } } \cs_new_protected:Npn \__nicematrix_test_in_corner_h: { \int_compare:nNnTF \l_tmpa_tl = { \__nicematrix_succ:n \c@iRow } { \seq_if_in:NxT \l__nicematrix_empty_corner_cells_seq { \__nicematrix_pred:n \l_tmpa_tl - \l_tmpb_tl } { \bool_set_false:N \g_tmpa_bool } } { \seq_if_in:NxT \l__nicematrix_empty_corner_cells_seq { \l_tmpa_tl - \l_tmpb_tl } { \int_compare:nNnTF \l_tmpa_tl = 1 { \bool_set_false:N \g_tmpa_bool } { \seq_if_in:NxT \l__nicematrix_empty_corner_cells_seq { \__nicematrix_pred:n \l_tmpa_tl - \l_tmpb_tl } { \bool_set_false:N \g_tmpa_bool } } } } } \cs_new_protected:Npn \__nicematrix_hline_ii:nnnn #1 #2 #3 #4 { \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_qpoint:n { col - #3 } \dim_set_eq:NN \l_tmpa_dim \pgf@x \__nicematrix_qpoint:n { row - #1 } \dim_set_eq:NN \l_tmpb_dim \pgf@y \__nicematrix_qpoint:n { col - \__nicematrix_succ:n { #4 } } \dim_set_eq:NN \l_tmpc_dim \pgf@x \bool_lazy_and:nnT { \int_compare_p:nNn { #2 } > 1 } { ! \tl_if_blank_p:V \CT@drsc@ } { \group_begin: \CT@drsc@ \dim_set:Nn \l_tmpd_dim { \l_tmpb_dim - ( \doublerulesep + \arrayrulewidth ) * ( #2 - 1 ) } \pgfpathrectanglecorners { \pgfpoint \l_tmpa_dim \l_tmpb_dim } { \pgfpoint \l_tmpc_dim \l_tmpd_dim } \pgfusepathqfill \group_end: } \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim } \pgfpathlineto { \pgfpoint \l_tmpc_dim \l_tmpb_dim } \prg_replicate:nn { #2 - 1 } { \dim_sub:Nn \l_tmpb_dim \arrayrulewidth \dim_sub:Nn \l_tmpb_dim \doublerulesep \pgfpathmoveto { \pgfpoint \l_tmpa_dim \l_tmpb_dim } \pgfpathlineto { \pgfpoint \l_tmpc_dim \l_tmpb_dim } } \CT@arc@ \pgfsetlinewidth { 1.1 \arrayrulewidth } \pgfsetrectcap \pgfusepathqstroke } \cs_new_protected:Npn \__nicematrix_hline_i_complete:nn #1 #2 { \__nicematrix_hline_ii:nnnn { #1 } { #2 } 1 { \int_use:N \c@jCol } } \cs_new_protected:Npn \__nicematrix_draw_hlines: { \int_step_inline:nnn { \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 } } { \__nicematrix_hline:nn { ##1 } 1 } } } \cs_set:Npn \__nicematrix_Hline: { \noalign { \ifnum 0 = `} \fi \__nicematrix_Hline_i:n { 1 } } \cs_set:Npn \__nicematrix_Hline_i:n #1 { \peek_meaning_ignore_spaces:NTF \Hline { \__nicematrix_Hline_ii:nn { #1 + 1 } } { \__nicematrix_Hline_iii:n { #1 } } } \cs_set:Npn \__nicematrix_Hline_ii:nn #1 #2 { \__nicematrix_Hline_i:n { #1 } } \cs_set:Npn \__nicematrix_Hline_iii:n #1 { \skip_vertical:n { \arrayrulewidth * ( #1 ) + \doublerulesep * ( \int_max:nn 0 { #1 - 1 } ) } \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_hline:nn { \__nicematrix_succ:n { \c@iRow } } { #1 } } \ifnum 0 = `{ \fi } } \cs_new_protected:Npn \__nicematrix_test_hline_in_block:nnnn #1 #2 #3 #4 { \bool_lazy_all:nT { { \int_compare_p:nNn \l_tmpa_tl > { #1 } } { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } } { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } } { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } } } { \bool_gset_false:N \g_tmpa_bool } } \cs_new_protected:Npn \__nicematrix_test_vline_in_block:nnnn #1 #2 #3 #4 { \bool_lazy_all:nT { { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } } { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } } { \int_compare_p:nNn \l_tmpb_tl > { #2 } } { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } } } { \bool_gset_false:N \g_tmpa_bool } } \cs_new_protected:Npn \__nicematrix_test_hline_in_stroken_block:nnnn #1 #2 #3 #4 { \bool_lazy_all:nT { { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } } { \int_compare_p:nNn \l_tmpa_tl < { #3 + 2 } } { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } } { \int_compare_p:nNn \l_tmpb_tl < { #4 + 1 } } } { \bool_gset_false:N \g_tmpa_bool } } \cs_new_protected:Npn \__nicematrix_test_vline_in_stroken_block:nnnn #1 #2 #3 #4 { \bool_lazy_all:nT { { \int_compare_p:nNn \l_tmpa_tl > { #1 - 1 } } { \int_compare_p:nNn \l_tmpa_tl < { #3 + 1 } } { \int_compare_p:nNn \l_tmpb_tl > { #2 - 1 } } { \int_compare_p:nNn \l_tmpb_tl < { #4 + 2 } } } { \bool_gset_false:N \g_tmpa_bool } } \cs_new_protected:Npn \__nicematrix_compute_corners: { \seq_clear_new:N \l__nicematrix_empty_corner_cells_seq \clist_map_inline:Nn \l__nicematrix_except_corners_clist { \str_case:nnF { ##1 } { { NW } { \__nicematrix_compute_a_corner:nnnnnn 1 1 1 1 \c@iRow \c@jCol } { NE } { \__nicematrix_compute_a_corner:nnnnnn 1 \c@jCol 1 { -1 } \c@iRow 1 } { SW } { \__nicematrix_compute_a_corner:nnnnnn \c@iRow 1 { -1 } 1 1 \c@jCol } { SE } { \__nicematrix_compute_a_corner:nnnnnn \c@iRow \c@jCol { -1 } { -1 } 1 1 } } { \__nicematrix_error:nn { bad~corner } { ##1 } } } } \cs_new_protected:Npn \__nicematrix_compute_a_corner:nnnnnn #1 #2 #3 #4 #5 #6 { \bool_set_false:N \l_tmpa_bool \int_zero_new:N \l__nicematrix_last_empty_row_int \int_set:Nn \l__nicematrix_last_empty_row_int { #1 } \int_step_inline:nnnn { #1 } { #3 } { #5 } { \__nicematrix_test_if_cell_in_a_block:nn { ##1 } { \int_eval:n { #2 } } \bool_lazy_or:nnTF { \cs_if_exist_p:c { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - \int_eval:n { #2 } } } \l_tmpb_bool { \bool_set_true:N \l_tmpa_bool } { \bool_if:NF \l_tmpa_bool { \int_set:Nn \l__nicematrix_last_empty_row_int { ##1 } } } } \bool_set_false:N \l_tmpa_bool \int_zero_new:N \l__nicematrix_last_empty_column_int \int_set:Nn \l__nicematrix_last_empty_column_int { #2 } \int_step_inline:nnnn { #2 } { #4 } { #6 } { \__nicematrix_test_if_cell_in_a_block:nn { \int_eval:n { #1 } } { ##1 } \bool_lazy_or:nnTF \l_tmpb_bool { \cs_if_exist_p:c { pgf @ sh @ ns @ \__nicematrix_env: - \int_eval:n { #1 } - ##1 } } { \bool_set_true:N \l_tmpa_bool } { \bool_if:NF \l_tmpa_bool { \int_set:Nn \l__nicematrix_last_empty_column_int { ##1 } } } } \int_step_inline:nnnn { #1 } { #3 } \l__nicematrix_last_empty_row_int { \bool_set_false:N \l_tmpa_bool \int_step_inline:nnnn { #2 } { #4 } \l__nicematrix_last_empty_column_int { \__nicematrix_test_if_cell_in_a_block:nn { ##1 } { ####1 } \bool_lazy_or:nnTF \l_tmpb_bool { \cs_if_exist_p:c { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - ####1 } } { \bool_set_true:N \l_tmpa_bool } { \bool_if:NF \l_tmpa_bool { \int_set:Nn \l__nicematrix_last_empty_column_int { ####1 } \seq_put_right:Nn \l__nicematrix_empty_corner_cells_seq { ##1 - ####1 } } } } } } \cs_new_protected:Npn \__nicematrix_test_if_cell_in_a_block:nn #1 #2 { \int_set:Nn \l_tmpa_int { #1 } \int_set:Nn \l_tmpb_int { #2 } \bool_set_false:N \l_tmpb_bool \seq_map_inline:Nn \g__nicematrix_pos_of_blocks_seq { \__nicematrix_test_if_cell_in_block:nnnnnnn \l_tmpa_int \l_tmpb_int ##1 } } \cs_new_protected:Npn \__nicematrix_test_if_cell_in_block:nnnnnnn #1 #2 #3 #4 #5 #6 { \int_compare:nNnT { #3 } < { \__nicematrix_succ:n { #1 } } { \int_compare:nNnT { #1 } < { \__nicematrix_succ:n { #5 } } { \int_compare:nNnT { #4 } < { \__nicematrix_succ:n { #2 } } { \int_compare:nNnT { #2 } < { \__nicematrix_succ:n { #6 } } { \bool_set_true:N \l_tmpb_bool } } } } } \cs_new:Npn \__nicematrix_hdottedline: { \noalign { \skip_vertical:N 2\l__nicematrix_radius_dim } \__nicematrix_hdottedline_i: } \cs_new_protected:Npn \__nicematrix_hdottedline_i: { \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_hdottedline:n { \int_use:N \c@iRow } } } \AtBeginDocument { \cs_new_protected:Npx \__nicematrix_hdottedline:n #1 { \bool_set_true:N \exp_not:N \l__nicematrix_initial_open_bool \bool_set_true:N \exp_not:N \l__nicematrix_final_open_bool \c__nicematrix_pgfortikzpicture_tl \__nicematrix_hdottedline_i:n { #1 } \c__nicematrix_endpgfortikzpicture_tl } } \cs_new_protected:Npn \__nicematrix_hdottedline_i:n #1 { \pgfrememberpicturepositiononpagetrue \__nicematrix_qpoint:n { row - #1 } \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf@y \dim_sub:Nn \l__nicematrix_y_initial_dim \l__nicematrix_radius_dim \dim_set_eq:NN \l__nicematrix_y_final_dim \l__nicematrix_y_initial_dim \__nicematrix_qpoint:n { col - 1 } \dim_set:Nn \l__nicematrix_x_initial_dim { \pgf@x + \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 \l__nicematrix_NiceArray_bool \c_zero_dim \arraycolsep + \l__nicematrix_right_margin_dim } \tl_if_eq:NnF \l__nicematrix_left_delim_tl ( { \dim_gadd:Nn \l__nicematrix_x_initial_dim { 0.5 \l__nicematrix_inter_dots_dim } } \tl_if_eq:NnF \l__nicematrix_right_delim_tl ) { \dim_gsub:Nn \l__nicematrix_x_final_dim { 0.5 \l__nicematrix_inter_dots_dim } } \tl_set_eq:NN \l__nicematrix_xdots_line_style_tl \c__nicematrix_standard_tl \__nicematrix_draw_line: } \cs_new_protected:Npn \__nicematrix_vdottedline:n #1 { \bool_set_true:N \l__nicematrix_initial_open_bool \bool_set_true:N \l__nicematrix_final_open_bool \bool_if:NTF \c__nicematrix_tikz_loaded_bool { \tikzpicture \__nicematrix_vdottedline_i:n { #1 } \endtikzpicture } { \pgfpicture \__nicematrix_vdottedline_i:n { #1 } \endpgfpicture } } \cs_new_protected:Npn \__nicematrix_vdottedline_i:n #1 { \CT@arc@ \pgfrememberpicturepositiononpagetrue \__nicematrix_qpoint:n { col - \int_eval:n { #1 + 1 } } \dim_set:Nn \l__nicematrix_x_initial_dim { \pgf@x - \l__nicematrix_radius_dim } \dim_set:Nn \l__nicematrix_x_final_dim { \pgf@x - \l__nicematrix_radius_dim } \__nicematrix_qpoint:n { row - 1 } \dim_set:Nn \l__nicematrix_y_initial_dim { \pgf@y - 0.5 \l__nicematrix_inter_dots_dim } \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \c@iRow } \dim_set:Nn \l__nicematrix_y_final_dim { \pgf@y + 0.5 \l__nicematrix_inter_dots_dim } \tl_set_eq:NN \l__nicematrix_xdots_line_style_tl \c__nicematrix_standard_tl \__nicematrix_draw_line: } \bool_new:N \l__nicematrix_block_auto_columns_width_bool \keys_define:nn { NiceMatrix / NiceMatrixBlock } { auto-columns-width .code:n = { \bool_set_true:N \l__nicematrix_block_auto_columns_width_bool \dim_gzero_new:N \g__nicematrix_max_cell_width_dim \bool_set_true:N \l__nicematrix_auto_columns_width_bool } } \NewDocumentEnvironment { NiceMatrixBlock } { ! O { } } { \int_gincr:N \g__nicematrix_NiceMatrixBlock_int \dim_zero:N \l__nicematrix_columns_width_dim \keys_set:nn { NiceMatrix / NiceMatrixBlock } { #1 } \bool_if:NT \l__nicematrix_block_auto_columns_width_bool { \cs_if_exist:cT { __nicematrix_max_cell_width_ \int_use:N \g__nicematrix_NiceMatrixBlock_int } { \exp_args:NNc \dim_set:Nn \l__nicematrix_columns_width_dim { __nicematrix_max_cell_width _ \int_use:N \g__nicematrix_NiceMatrixBlock_int } } } } { \bool_if:NT \l__nicematrix_block_auto_columns_width_bool { \iow_shipout:Nn \@mainaux \ExplSyntaxOn \iow_shipout:Nx \@mainaux { \cs_gset:cpn { __nicematrix _ max _ cell _ width _ \int_use:N \g__nicematrix_NiceMatrixBlock_int } { \dim_eval:n { \g__nicematrix_max_cell_width_dim + \arrayrulewidth } } } \iow_shipout:Nn \@mainaux \ExplSyntaxOff } } \cs_generate_variant:Nn \dim_min:nn { v n } \cs_generate_variant:Nn \dim_max:nn { v n } \cs_new_protected:Npn \__nicematrix_create_extra_nodes: { \bool_if:nTF \l__nicematrix_medium_nodes_bool { \bool_if:NTF \l__nicematrix_large_nodes_bool \__nicematrix_create_medium_and_large_nodes: \__nicematrix_create_medium_nodes: } { \bool_if:NT \l__nicematrix_large_nodes_bool \__nicematrix_create_large_nodes: } } \cs_new_protected:Npn \__nicematrix_computations_for_medium_nodes: { \int_step_variable:nnNn \l__nicematrix_first_row_int \g__nicematrix_row_total_int \__nicematrix_i: { \dim_zero_new:c { l__nicematrix_row_\__nicematrix_i: _min_dim } \dim_set_eq:cN { l__nicematrix_row_\__nicematrix_i: _min_dim } \c_max_dim \dim_zero_new:c { l__nicematrix_row_\__nicematrix_i: _max_dim } \dim_set:cn { l__nicematrix_row_\__nicematrix_i: _max_dim } { - \c_max_dim } } \int_step_variable:nnNn \l__nicematrix_first_col_int \g__nicematrix_col_total_int \__nicematrix_j: { \dim_zero_new:c { l__nicematrix_column_\__nicematrix_j: _min_dim } \dim_set_eq:cN { l__nicematrix_column_\__nicematrix_j: _min_dim } \c_max_dim \dim_zero_new:c { l__nicematrix_column_\__nicematrix_j: _max_dim } \dim_set:cn { l__nicematrix_column_\__nicematrix_j: _max_dim } { - \c_max_dim } } \int_step_variable:nnNn \l__nicematrix_first_row_int \g__nicematrix_row_total_int \__nicematrix_i: { \int_step_variable:nnNn \l__nicematrix_first_col_int \g__nicematrix_col_total_int \__nicematrix_j: { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - \__nicematrix_i: - \__nicematrix_j: } { \pgfpointanchor { \__nicematrix_env: - \__nicematrix_i: - \__nicematrix_j: } { south~west } \dim_set:cn { l__nicematrix_row_\__nicematrix_i: _min_dim} { \dim_min:vn { l__nicematrix_row _ \__nicematrix_i: _min_dim } \pgf@y } \seq_if_in:NxF \g__nicematrix_multicolumn_cells_seq { \__nicematrix_i: - \__nicematrix_j: } { \dim_set:cn { l__nicematrix_column _ \__nicematrix_j: _min_dim} { \dim_min:vn { l__nicematrix_column _ \__nicematrix_j: _min_dim } \pgf@x } } \pgfpointanchor { \__nicematrix_env: - \__nicematrix_i: - \__nicematrix_j: } { north~east } \dim_set:cn { l__nicematrix_row _ \__nicematrix_i: _ max_dim } { \dim_max:vn { l__nicematrix_row _ \__nicematrix_i: _ max_dim } \pgf@y } \seq_if_in:NxF \g__nicematrix_multicolumn_cells_seq { \__nicematrix_i: - \__nicematrix_j: } { \dim_set:cn { l__nicematrix_column _ \__nicematrix_j: _ max_dim } { \dim_max:vn { l__nicematrix_column _ \__nicematrix_j: _max_dim } \pgf@x } } } } } \int_step_variable:nnNn \l__nicematrix_first_row_int \g__nicematrix_row_total_int \__nicematrix_i: { \dim_compare:nNnT { \dim_use:c { l__nicematrix_row _ \__nicematrix_i: _ min _ dim } } = \c_max_dim { \__nicematrix_qpoint:n { row - \__nicematrix_i: - base } \dim_set:cn { l__nicematrix_row _ \__nicematrix_i: _ max _ dim } \pgf@y \dim_set:cn { l__nicematrix_row _ \__nicematrix_i: _ min _ dim } \pgf@y } } \int_step_variable:nnNn \l__nicematrix_first_col_int \g__nicematrix_col_total_int \__nicematrix_j: { \dim_compare:nNnT { \dim_use:c { l__nicematrix_column _ \__nicematrix_j: _ min _ dim } } = \c_max_dim { \__nicematrix_qpoint:n { col - \__nicematrix_j: } \dim_set:cn { l__nicematrix_column _ \__nicematrix_j: _ max _ dim } \pgf@y \dim_set:cn { l__nicematrix_column _ \__nicematrix_j: _ min _ dim } \pgf@y } } } \cs_new_protected:Npn \__nicematrix_create_medium_nodes: { \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_computations_for_medium_nodes: \tl_set:Nn \l__nicematrix_suffix_tl { -medium } \__nicematrix_create_nodes: \endpgfpicture } \cs_new_protected:Npn \__nicematrix_create_large_nodes: { \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_computations_for_medium_nodes: \__nicematrix_computations_for_large_nodes: \tl_set:Nn \l__nicematrix_suffix_tl { - large } \__nicematrix_create_nodes: \endpgfpicture } \cs_new_protected:Npn \__nicematrix_create_medium_and_large_nodes: { \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_computations_for_medium_nodes: \tl_set:Nn \l__nicematrix_suffix_tl { - medium } \__nicematrix_create_nodes: \__nicematrix_computations_for_large_nodes: \tl_set:Nn \l__nicematrix_suffix_tl { - large } \__nicematrix_create_nodes: \endpgfpicture } \cs_new_protected:Npn \__nicematrix_computations_for_large_nodes: { \int_set:Nn \l__nicematrix_first_row_int 1 \int_set:Nn \l__nicematrix_first_col_int 1 \int_step_variable:nNn { \c@iRow - 1 } \__nicematrix_i: { \dim_set:cn { l__nicematrix_row _ \__nicematrix_i: _ min _ dim } { ( \dim_use:c { l__nicematrix_row _ \__nicematrix_i: _ min _ dim } + \dim_use:c { l__nicematrix_row _ \__nicematrix_succ:n \__nicematrix_i: _ max _ dim } ) / 2 } \dim_set_eq:cc { l__nicematrix_row _ \__nicematrix_succ:n \__nicematrix_i: _ max _ dim } { l__nicematrix_row_\__nicematrix_i: _min_dim } } \int_step_variable:nNn { \c@jCol - 1 } \__nicematrix_j: { \dim_set:cn { l__nicematrix_column _ \__nicematrix_j: _ max _ dim } { ( \dim_use:c { l__nicematrix_column _ \__nicematrix_j: _ max _ dim } + \dim_use:c { l__nicematrix_column _ \__nicematrix_succ:n \__nicematrix_j: _ min _ dim } ) / 2 } \dim_set_eq:cc { l__nicematrix_column _ \__nicematrix_succ:n \__nicematrix_j: _ min _ dim } { l__nicematrix_column _ \__nicematrix_j: _ max _ dim } } \dim_sub:cn { l__nicematrix_column _ 1 _ min _ dim } \l__nicematrix_left_margin_dim \dim_add:cn { l__nicematrix_column _ \int_use:N \c@jCol _ max _ dim } \l__nicematrix_right_margin_dim } \cs_new_protected:Npn \__nicematrix_create_nodes: { \int_step_variable:nnNn \l__nicematrix_first_row_int \g__nicematrix_row_total_int \__nicematrix_i: { \int_step_variable:nnNn \l__nicematrix_first_col_int \g__nicematrix_col_total_int \__nicematrix_j: { \__nicematrix_pgf_rect_node:nnnnn { \__nicematrix_env: - \__nicematrix_i: - \__nicematrix_j: \l__nicematrix_suffix_tl } { \dim_use:c { l__nicematrix_column_ \__nicematrix_j: _min_dim } } { \dim_use:c { l__nicematrix_row_ \__nicematrix_i: _min_dim } } { \dim_use:c { l__nicematrix_column_ \__nicematrix_j: _max_dim } } { \dim_use:c { l__nicematrix_row_ \__nicematrix_i: _max_dim } } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - \__nicematrix_i: - \__nicematrix_j: \l__nicematrix_suffix_tl } { \__nicematrix_env: - \__nicematrix_i: - \__nicematrix_j: \l__nicematrix_suffix_tl } } } } \seq_mapthread_function:NNN \g__nicematrix_multicolumn_cells_seq \g__nicematrix_multicolumn_sizes_seq \__nicematrix_node_for_multicolumn:nn } \cs_new_protected:Npn \__nicematrix_extract_coords_values: #1 - #2 \q_stop { \cs_set_nopar:Npn \__nicematrix_i: { #1 } \cs_set_nopar:Npn \__nicematrix_j: { #2 } } \cs_new_protected:Npn \__nicematrix_node_for_multicolumn:nn #1 #2 { \__nicematrix_extract_coords_values: #1 \q_stop \__nicematrix_pgf_rect_node:nnnnn { \__nicematrix_env: - \__nicematrix_i: - \__nicematrix_j: \l__nicematrix_suffix_tl } { \dim_use:c { l__nicematrix_column _ \__nicematrix_j: _ min _ dim } } { \dim_use:c { l__nicematrix_row _ \__nicematrix_i: _ min _ dim } } { \dim_use:c { l__nicematrix_column _ \int_eval:n { \__nicematrix_j: +#2-1 } _ max _ dim } } { \dim_use:c { l__nicematrix_row _ \__nicematrix_i: _ max _ dim } } \str_if_empty:NF \l__nicematrix_name_str { \pgfnodealias { \l__nicematrix_name_str - \__nicematrix_i: - \__nicematrix_j: \l__nicematrix_suffix_tl } { \int_use:N \g__nicematrix_env_int - \__nicematrix_i: - \__nicematrix_j: \l__nicematrix_suffix_tl} } } \keys_define:nn { NiceMatrix / Block / FirstPass } { l .code:n = \tl_set:Nn \l__nicematrix_pos_of_block_tl l , l .value_forbidden:n = true , r .code:n = \tl_set:Nn \l__nicematrix_pos_of_block_tl r , r .value_forbidden:n = true , c .code:n = \tl_set:Nn \l__nicematrix_pos_of_block_tl c , c .value_forbidden:n = true , color .tl_set:N = \l__nicematrix_color_tl , color .value_required:n = true , } \NewExpandableDocumentCommand \__nicematrix_Block: { O { } m D < > { } m } { \tl_if_blank:nTF { #2 } { \__nicematrix_Block_i 1-1 \q_stop } { \__nicematrix_Block_i #2 \q_stop } { #1 } { #3 } { #4 } } \cs_new:Npn \__nicematrix_Block_i #1-#2 \q_stop { \__nicematrix_Block_ii:nnnnn { #1 } { #2 } } \cs_new_protected:Npn \__nicematrix_Block_ii:nnnnn #1 #2 #3 #4 #5 { \bool_lazy_or:nnTF { \tl_if_blank_p:n { #1 } } { \str_if_eq_p:nn { #1 } { * } } { \int_set:Nn \l_tmpa_int { 100 } } { \int_set:Nn \l_tmpa_int { #1 } } \bool_lazy_or:nnTF { \tl_if_blank_p:n { #2 } } { \str_if_eq_p:nn { #2 } { * } } { \int_set:Nn \l_tmpb_int { 100 } } { \int_set:Nn \l_tmpb_int { #2 } } \int_compare:nNnTF \l_tmpb_int = 1 { \tl_if_empty:NTF \l__nicematrix_cell_type_tl { \tl_set:Nn \l__nicematrix_pos_of_block_tl c } { \tl_set_eq:NN \l__nicematrix_pos_of_block_tl \l__nicematrix_cell_type_tl } } { \tl_set:Nn \l__nicematrix_pos_of_block_tl c } \keys_set_known:nn { NiceMatrix / Block / FirstPass } { #3 } \tl_set:Nx \l_tmpa_tl { { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \int_eval:n { \c@iRow + \l_tmpa_int - 1 } } { \int_eval:n { \c@jCol + \l_tmpb_int - 1 } } } \bool_lazy_or:nnTF { \int_compare_p:nNn { \l_tmpa_int } = 1 } { \int_compare_p:nNn { \l_tmpb_int } = 1 } { \exp_args:Nxx \__nicematrix_Block_iv:nnnnn } { \exp_args:Nxx \__nicematrix_Block_v:nnnnn } { \l_tmpa_int } { \l_tmpb_int } { #3 } { #4 } { #5 } } \cs_new_protected:Npn \__nicematrix_Block_iv:nnnnn #1 #2 #3 #4 #5 { \int_gincr:N \g__nicematrix_block_box_int \cs_set_protected_nopar:Npn \diagbox ##1 ##2 { \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_actually_diagbox:nnnnnn { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \int_eval:n { \c@iRow + #1 - 1 } } { \int_eval:n { \c@jCol + #2 - 1 } } { \exp_not:n { ##1 } } { \exp_not:n { ##2 } } } } \box_gclear_new:c { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } \hbox_gset:cn { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } { \tl_if_empty:NTF \l__nicematrix_color_tl { \int_compare:nNnT { #2 } = 1 \set@color } { \color { \l__nicematrix_color_tl } } \group_begin: \cs_set:Npn \arraystretch { 1 } \dim_set_eq:NN \extrarowheight \c_zero_dim #4 \bool_if:NT \g__nicematrix_rotate_bool { \tl_set:Nn \l__nicematrix_pos_of_block_tl c } \bool_if:NTF \l__nicematrix_NiceTabular_bool { \exp_args:Nnx \begin { tabular } { @ { } \l__nicematrix_pos_of_block_tl @ { } } #5 \end { tabular } } { \c_math_toggle_token \exp_args:Nnx \begin { array } { @ { } \l__nicematrix_pos_of_block_tl @ { } } #5 \end { array } \c_math_toggle_token } \group_end: } \bool_if:NT \g__nicematrix_rotate_bool { \box_grotate:cn { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } { 90 } \bool_gset_false:N \g__nicematrix_rotate_bool } \int_compare:nNnT { #2 } = 1 { \dim_gset:Nn \g__nicematrix_blocks_wd_dim { \dim_max:nn \g__nicematrix_blocks_wd_dim { \box_wd:c { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } } } } \int_compare:nNnT { #1 } = 1 { \dim_gset:Nn \g__nicematrix_blocks_ht_dim { \dim_max:nn \g__nicematrix_blocks_ht_dim { \box_ht:c { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } } } \dim_gset:Nn \g__nicematrix_blocks_dp_dim { \dim_max:nn \g__nicematrix_blocks_dp_dim { \box_dp:c { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } } } } \seq_gput_right:Nx \g__nicematrix_blocks_seq { \l_tmpa_tl { \exp_not:n { #3 } , \l__nicematrix_pos_of_block_tl } { \box_use_drop:c { g__nicematrix_ block _ box _ \int_use:N \g__nicematrix_block_box_int _ box } } } } \cs_new_protected:Npn \__nicematrix_Block_v:nnnnn #1 #2 #3 #4 #5 { \seq_gput_right:Nx \g__nicematrix_blocks_seq { \l_tmpa_tl { \exp_not:n { #3 } } \exp_not:n { { \bool_if:NTF \l__nicematrix_NiceTabular_bool { \group_begin: \cs_set:Npn \arraystretch { 1 } \dim_set_eq:NN \extrarowheight \c_zero_dim #4 \bool_if:NT \g__nicematrix_rotate_bool { \tl_set:Nn \l__nicematrix_pos_of_block_tl c } \exp_args:Nnx \begin { tabular } { @ { } \l__nicematrix_pos_of_block_tl @ { } } #5 \end { tabular } \group_end: } { \group_begin: \cs_set:Npn \arraystretch { 1 } \dim_set_eq:NN \extrarowheight \c_zero_dim #4 \bool_if:NT \g__nicematrix_rotate_bool { \tl_set:Nn \l__nicematrix_pos_of_block_tl c } \c_math_toggle_token \exp_args:Nnx \begin { array } { @ { } \l__nicematrix_pos_of_block_tl @ { } } #5 \end { array } \c_math_toggle_token \group_end: } } } } } \keys_define:nn { NiceMatrix / Block / SecondPass } { fill .tl_set:N = \l__nicematrix_fill_tl , fill .value_required:n = true , draw .tl_set:N = \l__nicematrix_draw_tl , draw .default:n = default , rounded-corners .dim_set:N = \l__nicematrix_rounded_corners_dim , rounded-corners .default:n = 4 pt , color .code:n = \color { #1 } \tl_set:Nn \l__nicematrix_draw_tl { #1 } , color .value_required:n = true , line-width .dim_set:N = \l__nicematrix_line_width_dim , line-width .value_required:n = true , l .code:n = \tl_set:Nn \l__nicematrix_pos_of_block_tl l , l .value_forbidden:n = true , r .code:n = \tl_set:Nn \l__nicematrix_pos_of_block_tl r , r .value_forbidden:n = true , c .code:n = \tl_set:Nn \l__nicematrix_pos_of_block_tl c , c .value_forbidden:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~Block } } \cs_new_protected:Npn \__nicematrix_draw_blocks: { \cs_set_eq:NN \ialign \__nicematrix_old_ialign: \seq_map_inline:Nn \g__nicematrix_blocks_seq { \__nicematrix_Block_iv:nnnnnn ##1 } } \cs_new_protected:Npn \__nicematrix_Block_iv:nnnnnn #1 #2 #3 #4 #5 #6 { \int_zero_new:N \l__nicematrix_last_row_int \int_zero_new:N \l__nicematrix_last_col_int \int_compare:nNnTF { #3 } > { 99 } { \int_set_eq:NN \l__nicematrix_last_row_int \c@iRow } { \int_set:Nn \l__nicematrix_last_row_int { #3 } } \int_compare:nNnTF { #4 } > { 99 } { \int_set_eq:NN \l__nicematrix_last_col_int \c@jCol } { \int_set:Nn \l__nicematrix_last_col_int { #4 } } \int_compare:nNnTF \l__nicematrix_last_col_int > \g__nicematrix_col_total_int { \int_compare:nTF { \l__nicematrix_last_col_int <= \g__nicematrix_static_num_of_col_int } { \msg_error:nnnn { nicematrix } { Block~too~large~2 } { #1 } { #2 } \__nicematrix_msg_redirect_name:nn { Block~too~large~2 } { none } \group_begin: \globaldefs = 1 \__nicematrix_msg_redirect_name:nn { columns~not~used } { none } \group_end: } { \msg_error:nnnn { nicematrix } { Block~too~large~1 } { #1 } { #2 } } } { \int_compare:nNnTF \l__nicematrix_last_row_int > \g__nicematrix_row_total_int { \msg_error:nnnn { nicematrix } { Block~too~large~1 } { #1 } { #2 } } { \__nicematrix_Block_v:nnnnnn { #1 } { #2 } { #3 } { #4 } { #5 } { #6 } } } } \cs_new_protected:Npn \__nicematrix_Block_v:nnnnnn #1 #2 #3 #4 #5 #6 { \seq_gput_left:Nn \g__nicematrix_pos_of_blocks_seq { { #1 } { #2 } { #3 } { #4 } } \group_begin: \keys_set:nn { NiceMatrix / Block / SecondPass } { #5 } \bool_lazy_or:nnT { ! \tl_if_empty_p:N \l__nicematrix_draw_tl } { \dim_compare_p:nNn \l__nicematrix_line_width_dim > \c_zero_dim } { \tl_gput_right:Nx \g_nicematrix_code_after_tl { \__nicematrix_stroke_block:nnn { \exp_not:n { #5 } } { #1 - #2 } { \int_use:N \l__nicematrix_last_row_int - \int_use:N \l__nicematrix_last_col_int } } \seq_gput_right:Nn \g__nicematrix_pos_of_stroken_blocks_seq { { #1 } { #2 } { #3 } { #4 } } } \tl_if_empty:NF \l__nicematrix_fill_tl { \tl_gput_right:Nx \g_nicematrix_code_before_tl { \exp_not:N \roundedrectanglecolor { \exp_not:V \l__nicematrix_fill_tl } { #1 - #2 } { \int_use:N \l__nicematrix_last_row_int - \int_use:N \l__nicematrix_last_col_int } { \dim_use:N \l__nicematrix_rounded_corners_dim } } } \cs_set_protected_nopar:Npn \diagbox ##1 ##2 { \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_actually_diagbox:nnnnnn { #1 } { #2 } { \int_use:N \l__nicematrix_last_row_int } { \int_use:N \l__nicematrix_last_col_int } { \exp_not:n { ##1 } } { \exp_not:n { ##2 } } } } \hbox_set:Nn \l__nicematrix_cell_box { \set@color #6 } \bool_if:NT \g__nicematrix_rotate_bool \__nicematrix_rotate_cell_box: \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_qpoint:n { row - #1 } \dim_set_eq:NN \l_tmpa_dim \pgf@y \__nicematrix_qpoint:n { col - #2 } \dim_set_eq:NN \l_tmpb_dim \pgf@x \__nicematrix_qpoint:n { row - \__nicematrix_succ:n { \l__nicematrix_last_row_int } } \dim_set_eq:NN \l_tmpc_dim \pgf@y \__nicematrix_qpoint:n { col - \__nicematrix_succ:n { \l__nicematrix_last_col_int } } \dim_set_eq:NN \l_tmpd_dim \pgf@x \begin { pgfscope } \__nicematrix_pgf_rect_node:nnnnn { \__nicematrix_env: - #1 - #2 - block } \l_tmpb_dim \l_tmpa_dim \l_tmpd_dim \l_tmpc_dim \end { pgfscope } \dim_set_eq:NN \l_tmpb_dim \c_max_dim \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - #2 } { \seq_if_in:NnF \g__nicematrix_multicolumn_cells_seq { ##1 - #2 } { \pgfpointanchor { \__nicematrix_env: - ##1 - #2 } { west } \dim_set:Nn \l_tmpb_dim { \dim_min:nn \l_tmpb_dim \pgf@x } } } } \dim_compare:nNnT \l_tmpb_dim = \c_max_dim { \__nicematrix_qpoint:n { col - #2 } \dim_set_eq:NN \l_tmpb_dim \pgf@x } \dim_set:Nn \l_tmpd_dim { - \c_max_dim } \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - \int_use:N \l__nicematrix_last_col_int } { \seq_if_in:NnF \g__nicematrix_multicolumn_cells_seq { ##1 - #2 } { \pgfpointanchor { \__nicematrix_env: - ##1 - \int_use:N \l__nicematrix_last_col_int } { east } \dim_set:Nn \l_tmpd_dim { \dim_max:nn \l_tmpd_dim \pgf@x } } } } \dim_compare:nNnT \l_tmpd_dim = { - \c_max_dim } { \__nicematrix_qpoint:n { col - \__nicematrix_succ:n { \l__nicematrix_last_col_int } } \dim_set_eq:NN \l_tmpd_dim \pgf@x } \__nicematrix_pgf_rect_node:nnnnn { \__nicematrix_env: - #1 - #2 - block - short } \l_tmpb_dim \l_tmpa_dim \l_tmpd_dim \l_tmpc_dim \bool_if:NT \l__nicematrix_medium_nodes_bool { \__nicematrix_pgf_rect_node:nnn { \__nicematrix_env: - #1 - #2 - block - medium } { \pgfpointanchor { \__nicematrix_env: - #1 - #2 - medium } { north~west } } { \pgfpointanchor { \__nicematrix_env: - \int_use:N \l__nicematrix_last_row_int - \int_use:N \l__nicematrix_last_col_int - medium } { south~east } } } \int_compare:nNnTF { #1 } = { #3 } { \int_compare:nNnTF { #1 } = 0 { \l__nicematrix_code_for_first_row_tl } { \int_compare:nNnT { #1 } = \l__nicematrix_last_row_int \l__nicematrix_code_for_last_row_tl } \pgfextracty \l_tmpa_dim { \__nicematrix_qpoint:n { row - #1 - base } } \pgfpointanchor { \__nicematrix_env: - #1 - #2 - block - short } { \str_case:Vn \l__nicematrix_pos_of_block_tl { c { center } l { west } r { east } } } \pgftransformshift { \pgfpoint \pgf@x \l_tmpa_dim } \pgfset { inner~sep = \c_zero_dim } \pgfnode { rectangle } { \str_case:Vn \l__nicematrix_pos_of_block_tl { c { base } l { base~west } r { base~east } } } { \box_use_drop:N \l__nicematrix_cell_box } { } { } } { \int_compare:nNnT { #2 } = 0 { \tl_set:Nn \l__nicematrix_pos_of_block_tl r } \bool_if:nT \g__nicematrix_last_col_found_bool { \int_compare:nNnT { #2 } = \g__nicematrix_col_total_int { \tl_set:Nn \l__nicematrix_pos_of_block_tl l } } \pgftransformshift { \pgfpointanchor { \__nicematrix_env: - #1 - #2 - block - short } { \str_case:Vn \l__nicematrix_pos_of_block_tl { c { center } l { west } r { east } } } } \pgfset { inner~sep = \c_zero_dim } \pgfnode { rectangle } { \str_case:Vn \l__nicematrix_pos_of_block_tl { c { center } l { west } r { east } } } { \box_use_drop:N \l__nicematrix_cell_box } { } { } } \endpgfpicture \group_end: } \cs_new_protected:Npn \__nicematrix_stroke_block:nnn #1 #2 #3 { \group_begin: \tl_clear:N \l__nicematrix_draw_tl \dim_set_eq:NN \l__nicematrix_line_width_dim \arrayrulewidth \keys_set_known:nn { NiceMatrix / BlockStroke } { #1 } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \tl_if_empty:NF \l__nicematrix_draw_tl { \str_if_eq:VnTF \l__nicematrix_draw_tl { default } { \CT@arc@ } { \exp_args:NV \pgfsetstrokecolor \l__nicematrix_draw_tl } } \pgfsetcornersarced { \pgfpoint { \dim_use:N \l__nicematrix_rounded_corners_dim } { \dim_use:N \l__nicematrix_rounded_corners_dim } } \__nicematrix_cut_on_hyphen:w #2 \q_stop \bool_lazy_and:nnT { \int_compare_p:n { \l_tmpa_tl <= \c@iRow } } { \int_compare_p:n { \l_tmpb_tl <= \c@jCol } } { \__nicematrix_qpoint:n { row - \l_tmpa_tl } \dim_set:Nn \l_tmpb_dim { \pgf@y } \__nicematrix_qpoint:n { col - \l_tmpb_tl } \dim_set:Nn \l_tmpc_dim { \pgf@x } \__nicematrix_cut_on_hyphen:w #3 \q_stop \int_compare:nNnT \l_tmpa_tl > \c@iRow { \tl_set:Nx \l_tmpa_tl { \int_use:N \c@iRow } } \int_compare:nNnT \l_tmpb_tl > \c@jCol { \tl_set:Nx \l_tmpb_tl { \int_use:N \c@jCol } } \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \l_tmpa_tl } \dim_set:Nn \l_tmpa_dim { \pgf@y } \__nicematrix_qpoint:n { col - \__nicematrix_succ:n \l_tmpb_tl } \dim_set:Nn \l_tmpd_dim { \pgf@x } \pgfpathrectanglecorners { \pgfpoint \l_tmpc_dim \l_tmpb_dim } { \pgfpoint \l_tmpd_dim \l_tmpa_dim } \pgfsetlinewidth { 1.1 \l__nicematrix_line_width_dim } \pgfusepath { stroke } } \endpgfpicture \group_end: } \keys_define:nn { NiceMatrix / BlockStroke } { color .tl_set:N = \l__nicematrix_draw_tl , draw .tl_set:N = \l__nicematrix_draw_tl , draw .default:n = default , line-width .dim_set:N = \l__nicematrix_line_width_dim , rounded-corners .dim_set:N = \l__nicematrix_rounded_corners_dim , rounded-corners .default:n = 4 pt } \cs_set_protected:Npn \__nicematrix_renew_matrix: { \RenewDocumentEnvironment { pmatrix } { } { \pNiceMatrix } { \endpNiceMatrix } \RenewDocumentEnvironment { vmatrix } { } { \vNiceMatrix } { \endvNiceMatrix } \RenewDocumentEnvironment { Vmatrix } { } { \VNiceMatrix } { \endVNiceMatrix } \RenewDocumentEnvironment { bmatrix } { } { \bNiceMatrix } { \endbNiceMatrix } \RenewDocumentEnvironment { Bmatrix } { } { \BNiceMatrix } { \endBNiceMatrix } } \cs_new_protected:Npn \__nicematrix_set_size:n #1-#2 \q_stop { \int_set:Nn \l__nicematrix_nb_rows_int { #1 } \int_set:Nn \l__nicematrix_nb_cols_int { #2 } } \NewDocumentCommand \AutoNiceMatrixWithDelims { m m O { } m O { } m ! O { } } { \int_zero_new:N \l__nicematrix_nb_rows_int \int_zero_new:N \l__nicematrix_nb_cols_int \__nicematrix_set_size:n #4 \q_stop \begin { NiceArrayWithDelims } { #1 } { #2 } { * { \l__nicematrix_nb_cols_int } { c } } [ #3 , #5 , #7 ] \int_compare:nNnT \l__nicematrix_first_row_int = 0 { \int_compare:nNnT \l__nicematrix_first_col_int = 0 { & } \prg_replicate:nn { \l__nicematrix_nb_cols_int - 1 } { & } \int_compare:nNnT \l__nicematrix_last_col_int > { -1 } { & } \\ } \prg_replicate:nn \l__nicematrix_nb_rows_int { \int_compare:nNnT \l__nicematrix_first_col_int = 0 { & } \prg_replicate:nn { \l__nicematrix_nb_cols_int - 1 } { { } #6 & } #6 \int_compare:nNnT \l__nicematrix_last_col_int > { -1 } { & } \\ } \int_compare:nNnT \l__nicematrix_last_row_int > { -2 } { \int_compare:nNnT \l__nicematrix_first_col_int = 0 { & } \prg_replicate:nn { \l__nicematrix_nb_cols_int - 1 } { & } \int_compare:nNnT \l__nicematrix_last_col_int > { -1 } { & } \\ } \end { NiceArrayWithDelims } } \cs_set_protected:Npn \__nicematrix_define_com:nnn #1 #2 #3 { \cs_set_protected:cpn { #1 AutoNiceMatrix } { \str_gset:Nx \g__nicematrix_name_env_str { #1 AutoNiceMatrix } \AutoNiceMatrixWithDelims { #2 } { #3 } } } \__nicematrix_define_com:nnn p ( ) \__nicematrix_define_com:nnn b [ ] \__nicematrix_define_com:nnn v | | \__nicematrix_define_com:nnn V \| \| \__nicematrix_define_com:nnn B \{ \} \NewDocumentCommand \AutoNiceMatrix { O { } m O { } m ! O { } } { \group_begin: \bool_set_true:N \l__nicematrix_NiceArray_bool \AutoNiceMatrixWithDelims . . { #2 } { #4 } [ #1 , #3 , #5 ] \group_end: } \cs_set_eq:NN \__nicematrix_old_dotfill \dotfill \cs_new_protected:Npn \__nicematrix_dotfill: { \__nicematrix_old_dotfill \bool_if:NT \l__nicematrix_NiceTabular_bool { \group_insert_after:N \__nicematrix_dotfill_ii: } { \group_insert_after:N \__nicematrix_dotfill_i: } } \cs_new_protected:Npn \__nicematrix_dotfill_i: { \group_insert_after:N \__nicematrix_dotfill_ii: } \cs_new_protected:Npn \__nicematrix_dotfill_ii: { \group_insert_after:N \__nicematrix_dotfill_iii: } \cs_new_protected:Npn \__nicematrix_dotfill_iii: { \dim_compare:nNnT { \box_wd:N \l__nicematrix_cell_box } = \c_zero_dim \__nicematrix_old_dotfill } \cs_new_protected:Npn \__nicematrix_diagbox:nn #1 #2 { \tl_gput_right:Nx \g__nicematrix_internal_code_after_tl { \__nicematrix_actually_diagbox:nnnnnn { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \exp_not:n { #1 } } { \exp_not:n { #2 } } } \seq_gput_right:Nx \g__nicematrix_pos_of_blocks_seq { { \int_use:N \c@iRow } { \int_use:N \c@jCol } { \int_use:N \c@iRow } { \int_use:N \c@jCol } } } \cs_new_protected:Npn \__nicematrix_actually_diagbox:nnnnnn #1 #2 #3 #4 #5 #6 { \pgfpicture \pgf@relevantforpicturesizefalse \pgfrememberpicturepositiononpagetrue \__nicematrix_qpoint:n { row - #1 } \dim_set_eq:NN \l_tmpa_dim \pgf@y \__nicematrix_qpoint:n { col - #2 } \dim_set_eq:NN \l_tmpb_dim \pgf@x \pgfpathmoveto { \pgfpoint \l_tmpb_dim \l_tmpa_dim } \__nicematrix_qpoint:n { row - \__nicematrix_succ:n { #3 } } \dim_set_eq:NN \l_tmpc_dim \pgf@y \__nicematrix_qpoint:n { col - \__nicematrix_succ:n { #4 } } \dim_set_eq:NN \l_tmpd_dim \pgf@x \pgfpathlineto { \pgfpoint \l_tmpd_dim \l_tmpc_dim } { \CT@arc@ \pgfsetroundcap \pgfusepathqstroke } \pgfset { inner~sep = 1 pt } \pgfscope \pgftransformshift { \pgfpoint \l_tmpb_dim \l_tmpc_dim } \pgfnode { rectangle } { south~west } { \__nicematrix_math_toggle_token: #5 \__nicematrix_math_toggle_token: } { } { } \endpgfscope \pgftransformshift { \pgfpoint \l_tmpd_dim \l_tmpa_dim } \pgfnode { rectangle } { north~east } { \__nicematrix_math_toggle_token: #6 \__nicematrix_math_toggle_token: } { } { } \endpgfpicture } \keys_define:nn { NiceMatrix } { CodeAfter / rules .inherit:n = NiceMatrix / rules } \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__nicematrix_delimiters_color_tl , delimiters / color .value_required:n = true , rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , rules .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~CodeAfter } } \cs_new:Npn \__nicematrix_CodeAfter: { \omit \__nicematrix_CodeAfter_i:n } \cs_new_protected:Npn \__nicematrix_CodeAfter_i:n #1 \end { \tl_gput_right:Nn \g_nicematrix_code_after_tl { #1 } \__nicematrix_CodeAfter_ii:n } \cs_new_protected:Npn \__nicematrix_CodeAfter_ii:n #1 { \str_if_eq:eeTF \@currenvir { #1 } { \end { #1 } } { \tl_gput_right:Nn \g_nicematrix_code_after_tl { \end { #1 } } \__nicematrix_CodeAfter_i:n } } \cs_new_protected:Npn \__nicematrix_delimiter:nnn #1 #2 #3 { \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \__nicematrix_qpoint:n { row - 1 } \dim_set_eq:NN \l__nicematrix_y_initial_dim \pgf@y \__nicematrix_qpoint:n { row - \__nicematrix_succ:n \c@iRow } \dim_set_eq:NN \l__nicematrix_y_final_dim \pgf@y \bool_if:nTF { #3 } { \dim_set_eq:NN \l_tmpa_dim \c_max_dim } { \dim_set:Nn \l_tmpa_dim { - \c_max_dim } } \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - #2 } { \pgfpointanchor { \__nicematrix_env: - ##1 - #2 } { \bool_if:nTF { #3 } { west } { east } } \dim_set:Nn \l_tmpa_dim { \bool_if:nTF { #3 } \dim_min:nn \dim_max:nn \l_tmpa_dim \pgf@x } } } \pgfset { inner~sep = \c_zero_dim } \dim_zero:N \nulldelimiterspace \pgftransformshift { \pgfpoint { \l_tmpa_dim } { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim + \arrayrulewidth ) / 2 } } \pgfnode { rectangle } { \bool_if:nTF { #3 } { east } { west } } { \nullfont \c_math_toggle_token \tl_if_empty:NF \l__nicematrix_delimiters_color_tl { \color { \l__nicematrix_delimiters_color_tl } } \bool_if:nTF { #3 } { \left #1 } { \left . } \vcenter { \nullfont \hrule \@height \dim_eval:n { \l__nicematrix_y_initial_dim - \l__nicematrix_y_final_dim } \@depth \c_zero_dim \@width \c_zero_dim } \bool_if:nTF { #3 } { \right . } { \right #1 } \c_math_toggle_token } { } { } \endpgfpicture } \keys_define:nn { NiceMatrix / sub-matrix } { extra-height .dim_set:N = \l__nicematrix_submatrix_extra_height_dim , extra-height .value_required:n = true , left-xshift .dim_set:N = \l__nicematrix_submatrix_left_xshift_dim , left-xshift .value_required:n = true , right-xshift .dim_set:N = \l__nicematrix_submatrix_right_xshift_dim , right-xshift .value_required:n = true , xshift .meta:n = { left-xshift = #1, right-xshift = #1 } , xshift .value_required:n = true , delimiters / color .tl_set:N = \l__nicematrix_delimiters_color_tl , delimiters / color .value_required:n = true , slim .bool_set:N = \l__nicematrix_submatrix_slim_bool , slim .default:n = true , } \keys_define:nn { NiceMatrix } { SubMatrix .inherit:n = NiceMatrix / sub-matrix , CodeAfter / sub-matrix .inherit:n = NiceMatrix / sub-matrix , } \keys_define:nn { NiceMatrix / SubMatrix } { hlines .clist_set:N = \l__nicematrix_hlines_clist , hlines .default:n = all , vlines .clist_set:N = \l__nicematrix_vlines_clist , vlines .default:n = all , hvlines .meta:n = { hlines, vlines } , hvlines .value_forbidden:n = true , name .code:n = \tl_if_empty:nTF { #1 } { \__nicematrix_error:n { Invalid~name~format } } { \regex_match:nnTF { \A[A-Za-z][A-Za-z0-9]*\Z } { #1 } { \seq_if_in:NnTF \g__nicematrix_submatrix_names_seq { #1 } { \__nicematrix_error:nn { Duplicate~name~for~SubMatrix } { #1 } } { \str_set:Nn \l__nicematrix_submatrix_name_str { #1 } \seq_gput_right:Nn \g__nicematrix_submatrix_names_seq { #1 } } } { \__nicematrix_error:n { Invalid~name~format } } } , rules .code:n = \keys_set:nn { NiceMatrix / rules } { #1 } , rules .value_required:n = true , code .tl_set:N = \l__nicematrix_code_tl , code .value_required:n = true , name .value_required:n = true , unknown .code:n = \__nicematrix_error:n { Unknown~key~for~SubMatrix } } \NewDocumentCommand \__nicematrix_SubMatrix_in_code_before { m m m m ! O { } } { \__nicematrix_cut_on_hyphen:w #3 \q_stop \tl_clear_new:N \l_tmpc_tl \tl_clear_new:N \l_tmpd_tl \tl_set_eq:NN \l_tmpc_tl \l_tmpa_tl \tl_set_eq:NN \l_tmpd_tl \l_tmpb_tl \__nicematrix_cut_on_hyphen:w #2 \q_stop \seq_gput_right:Nx \g__nicematrix_submatrix_seq { { \l_tmpa_tl } { \l_tmpb_tl } { \l_tmpc_tl } { \l_tmpd_tl } } \tl_gput_right:Nn \g__nicematrix_internal_code_after_tl { \SubMatrix { #1 } { #2 } { #3 } { #4 } [ #5 ] } } \NewDocumentCommand \__nicematrix_SubMatrix { m m m m O { } } { \group_begin: \tl_clear_new:N \l__nicematrix_first_i_tl \tl_clear_new:N \l__nicematrix_first_j_tl \tl_clear_new:N \l__nicematrix_last_i_tl \tl_clear_new:N \l__nicematrix_last_j_tl \__nicematrix_cut_on_hyphen:w #2 \q_stop \tl_set_eq:NN \l__nicematrix_first_i_tl \l_tmpa_tl \tl_set_eq:NN \l__nicematrix_first_j_tl \l_tmpb_tl \__nicematrix_cut_on_hyphen:w #3 \q_stop \tl_set_eq:NN \l__nicematrix_last_i_tl \l_tmpa_tl \tl_set_eq:NN \l__nicematrix_last_j_tl \l_tmpb_tl \bool_lazy_or:nnTF { \int_compare_p:nNn \l__nicematrix_last_i_tl > \g__nicematrix_row_total_int } { \int_compare_p:nNn \l__nicematrix_last_j_tl > \g__nicematrix_col_total_int } { \__nicematrix_error:n { SubMatrix~too~large } } { \str_clear_new:N \l__nicematrix_submatrix_name_str \clist_clear:N \l__nicematrix_hlines_clist \clist_clear:N \l__nicematrix_vlines_clist \keys_set:nn { NiceMatrix / SubMatrix } { #5 } \pgfpicture \pgfrememberpicturepositiononpagetrue \pgf@relevantforpicturesizefalse \pgfset { inner~sep = \c_zero_dim } \dim_set_eq:NN \l__nicematrix_x_initial_dim \c_max_dim \dim_set:Nn \l__nicematrix_x_final_dim { - \c_max_dim } \bool_if:NTF \l__nicematrix_submatrix_slim_bool { \int_step_inline:nnn \l__nicematrix_first_i_tl \l__nicematrix_last_i_tl } { \int_step_inline:nnn \l__nicematrix_first_row_int \g__nicematrix_row_total_int } { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - \l__nicematrix_first_j_tl } { \pgfpointanchor { \__nicematrix_env: - ##1 - \l__nicematrix_first_j_tl } { west } \dim_set:Nn \l__nicematrix_x_initial_dim { \dim_min:nn \l__nicematrix_x_initial_dim \pgf@x } } \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - ##1 - \l__nicematrix_last_j_tl } { \pgfpointanchor { \__nicematrix_env: - ##1 - \l__nicematrix_last_j_tl } { east } \dim_set:Nn \l__nicematrix_x_final_dim { \dim_max:nn \l__nicematrix_x_final_dim \pgf@x } } } \__nicematrix_qpoint:n { row - \l__nicematrix_first_i_tl - base } \dim_set:Nn \l__nicematrix_y_initial_dim { \pgf@y + ( \box_ht:N \strutbox + \extrarowheight ) * \arraystretch } \__nicematrix_qpoint:n { row - \l__nicematrix_last_i_tl - base } \dim_set:Nn \l__nicematrix_y_final_dim { \pgf@y - ( \box_dp:N \strutbox ) * \arraystretch } \int_step_inline:nnn \l__nicematrix_first_col_int \g__nicematrix_col_total_int { \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - \l__nicematrix_first_i_tl - ##1 } { \pgfpointanchor { \__nicematrix_env: - \l__nicematrix_first_i_tl - ##1 } { north } \dim_set:Nn \l__nicematrix_y_initial_dim { \dim_max:nn \l__nicematrix_y_initial_dim \pgf@y } } \cs_if_exist:cT { pgf @ sh @ ns @ \__nicematrix_env: - \l__nicematrix_last_i_tl - ##1 } { \pgfpointanchor { \__nicematrix_env: - \l__nicematrix_last_i_tl - ##1 } { south } \dim_set:Nn \l__nicematrix_y_final_dim { \dim_min:nn \l__nicematrix_y_final_dim \pgf@y } } } \dim_set:Nn \l_tmpa_dim { \l__nicematrix_y_initial_dim - \l__nicematrix_y_final_dim + \l__nicematrix_submatrix_extra_height_dim - \arrayrulewidth } \dim_set_eq:NN \nulldelimiterspace \c_zero_dim \group_begin: \pgfsetlinewidth { 1.1 \arrayrulewidth } \tl_if_empty:NF \l__nicematrix_rules_color_tl { \exp_after:wN \__nicematrix_set_CT@arc@: \l__nicematrix_rules_color_tl \q_stop } \CT@arc@ \seq_map_inline:Nn \g__nicematrix_cols_vlism_seq { \int_compare:nNnT \l__nicematrix_first_j_tl < { ##1 } { \int_compare:nNnT { ##1 } < { \int_eval:n { \l__nicematrix_last_j_tl + 1 } } { \__nicematrix_qpoint:n { col - ##1 } \pgfpathmoveto { \pgfpoint \pgf@x \l__nicematrix_y_initial_dim } \pgfpathlineto { \pgfpoint \pgf@x \l__nicematrix_y_final_dim } \pgfusepathqstroke } } } \tl_if_eq:NnTF \l__nicematrix_vlines_clist { all } { \int_step_inline:nn { \l__nicematrix_last_j_tl - \l__nicematrix_first_j_tl } } { \clist_map_inline:Nn \l__nicematrix_vlines_clist } { \bool_lazy_and:nnTF { \int_compare_p:nNn { ##1 } > 0 } { \int_compare_p:nNn { ##1 } < { \l__nicematrix_last_j_tl - \l__nicematrix_first_j_tl + 1 } } { \__nicematrix_qpoint:n { col - \int_eval:n { ##1 + \l__nicematrix_first_j_tl } } \pgfpathmoveto { \pgfpoint \pgf@x \l__nicematrix_y_initial_dim } \pgfpathlineto { \pgfpoint \pgf@x \l__nicematrix_y_final_dim } \pgfusepathqstroke } { \__nicematrix_error:nnn { Wrong~line~in~SubMatrix } { vertical } { ##1 } } } \tl_if_eq:NnTF \l__nicematrix_hlines_clist { all } { \int_step_inline:nn { \l__nicematrix_last_i_tl - \l__nicematrix_first_i_tl } } { \clist_map_inline:Nn \l__nicematrix_hlines_clist } { \bool_lazy_and:nnTF { \int_compare_p:nNn { ##1 } > 0 } { \int_compare_p:nNn { ##1 } < { \l__nicematrix_last_i_tl - \l__nicematrix_first_i_tl + 1 } } { \__nicematrix_qpoint:n { row - \int_eval:n { ##1 + \l__nicematrix_first_i_tl } } \group_begin: \dim_set:Nn \l_tmpa_dim { \l__nicematrix_x_initial_dim - \l__nicematrix_submatrix_left_xshift_dim } \str_case:nn { #1 } { ( { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } } [ { \dim_sub:Nn \l_tmpa_dim { 0.2 mm } } \{ { \dim_sub:Nn \l_tmpa_dim { 0.9 mm } } } \pgfpathmoveto { \pgfpoint \l_tmpa_dim \pgf@y } \dim_set:Nn \l_tmpb_dim { \l__nicematrix_x_final_dim + \l__nicematrix_submatrix_right_xshift_dim } \str_case:nn { #4 } { ) { \dim_add:Nn \l_tmpb_dim { 0.9 mm } } ] { \dim_add:Nn \l_tmpb_dim { 0.2 mm } } \} { \dim_add:Nn \l_tmpb_dim { 0.9 mm } } } \pgfpathlineto { \pgfpoint \l_tmpb_dim \pgf@y } \pgfusepathqstroke \group_end: } { \__nicematrix_error:nnn { Wrong~line~in~SubMatrix } { horizontal } { ##1 } } } \str_if_empty:NF \l__nicematrix_submatrix_name_str { \__nicematrix_pgf_rect_node:nnnnn \l__nicematrix_submatrix_name_str \l__nicematrix_x_initial_dim \l__nicematrix_y_initial_dim \l__nicematrix_x_final_dim \l__nicematrix_y_final_dim } \group_end: \begin { pgfscope } \pgftransformshift { \pgfpoint { \l__nicematrix_x_initial_dim - \l__nicematrix_submatrix_left_xshift_dim } { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim ) / 2 } } \str_if_empty:NTF \l__nicematrix_submatrix_name_str { \__nicematrix_node_left:nn #1 { } } { \__nicematrix_node_left:nn #1 { \__nicematrix_env: - \l__nicematrix_submatrix_name_str - left } } \end { pgfscope } \pgftransformshift { \pgfpoint { \l__nicematrix_x_final_dim + \l__nicematrix_submatrix_right_xshift_dim } { ( \l__nicematrix_y_initial_dim + \l__nicematrix_y_final_dim ) / 2 } } \str_if_empty:NTF \l__nicematrix_submatrix_name_str { \__nicematrix_node_right:nn #4 { } } { \__nicematrix_node_right:nn #4 { \__nicematrix_env: - \l__nicematrix_submatrix_name_str - right } } \endpgfpicture \cs_set_eq:NN \pgfpointanchor \__nicematrix_pgfpointanchor:n \flag_clear_new:n { nicematrix } \l__nicematrix_code_tl } \group_end: } \cs_set_eq:NN \__nicematrix_old_pgfpointanchor \pgfpointanchor \cs_new_protected:Npn \__nicematrix_pgfpointanchor:n #1 { \use:e { \exp_not:N \__nicematrix_old_pgfpointanchor { \__nicematrix_pgfpointanchor_i:nn #1 } } } \cs_new:Npn \__nicematrix_pgfpointanchor_i:nn #1 #2 { #1 { \__nicematrix_pgfpointanchor_ii:w #2 - \q_stop } } \tl_const:Nn \c__nicematrix_integers_alist_tl { { 1 } { } { 2 } { } { 3 } { } { 4 } { } { 5 } { } { 6 } { } { 7 } { } { 8 } { } { 9 } { } { 10 } { } { 11 } { } { 12 } { } { 13 } { } { 14 } { } { 15 } { } { 16 } { } { 17 } { } { 18 } { } { 19 } { } { 20 } { } } \cs_new:Npn \__nicematrix_pgfpointanchor_ii:w #1-#2\q_stop { \tl_if_empty:nTF { #2 } { \str_case:nVTF { #1 } \c__nicematrix_integers_alist_tl { \flag_raise:n { nicematrix } \int_if_even:nTF { \flag_height:n { nicematrix } } { \int_eval:n { #1 + \l__nicematrix_first_i_tl - 1 } } { \int_eval:n { #1 + \l__nicematrix_first_j_tl - 1 } } } { #1 } } { \__nicematrix_pgfpointanchor_iii:w { #1 } #2 } } \cs_new:Npn \__nicematrix_pgfpointanchor_iii:w #1 #2 - { \str_case:nnF { #1 } { { row } { row - \int_eval:n { #2 + \l__nicematrix_first_i_tl - 1 } } { col } { col - \int_eval:n { #2 + \l__nicematrix_first_j_tl - 1 } } } { \int_eval:n { #1 + \l__nicematrix_first_i_tl - 1 } - \int_eval:n { #2 + \l__nicematrix_first_j_tl - 1 } } } \cs_new_protected:Npn \__nicematrix_node_left:nn #1 #2 { \pgfnode { rectangle } { east } { \nullfont \c_math_toggle_token \tl_if_empty:NF \l__nicematrix_delimiters_color_tl { \color { \l__nicematrix_delimiters_color_tl } } \left #1 \vcenter { \nullfont \hrule \@height \l_tmpa_dim \@depth \c_zero_dim \@width \c_zero_dim } \right . \c_math_toggle_token } { #2 } { } } \cs_new_protected:Npn \__nicematrix_node_right:nn #1 #2 { \pgfnode { rectangle } { west } { \nullfont \c_math_toggle_token \tl_if_empty:NF \l__nicematrix_delimiters_color_tl { \color { \l__nicematrix_delimiters_color_tl } } \left . \vcenter { \nullfont \hrule \@height \l_tmpa_dim \@depth \c_zero_dim \@width \c_zero_dim } \right #1 \c_math_toggle_token } { #2 } { } } \bool_new:N \c__nicematrix_footnotehyper_bool \bool_new:N \c__nicematrix_footnote_bool \__nicematrix_msg_new:nnn { Unknown~option~for~package } { The~key~'\l_keys_key_str'~is~unknown. \\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ define-L-C-R,~ footnote,~ footnotehyper,~ renew-dots,~and renew-matrix. } \__nicematrix_msg_new:nn { Key~transparent } { The~key~'transparent'~is~now~obsolete~(because~it's~name~ is~not~clear).~You~should~use~the~conjonction~of~'renew-dots'~ and~'renew-matrix'.~However,~you~can~go~on. } \keys_define:nn { NiceMatrix / Package } { define-L-C-R .bool_set:N = \c__nicematrix_define_L_C_R_bool , define-L-C-R .default:n = true , renew-dots .bool_set:N = \l__nicematrix_renew_dots_bool , renew-dots .value_forbidden:n = true , renew-matrix .code:n = \__nicematrix_renew_matrix: , renew-matrix .value_forbidden:n = true , transparent .code:n = { \__nicematrix_renew_matrix: \bool_set_true:N \l__nicematrix_renew_dots_bool \__nicematrix_error:n { Key~transparent } } , transparent .value_forbidden:n = true, footnote .bool_set:N = \c__nicematrix_footnote_bool , footnotehyper .bool_set:N = \c__nicematrix_footnotehyper_bool , unknown .code:n = \__nicematrix_error:n { Unknown~option~for~package } } \ProcessKeysOptions { NiceMatrix / Package } \__nicematrix_msg_new:nn { footnote~with~footnotehyper~package } { You~can't~use~the~option~'footnote'~because~the~package~ footnotehyper~has~already~been~loaded.~ If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~ within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~ of~the~package~footnotehyper.\\ If~you~go~on,~the~package~footnote~won't~be~loaded. } \__nicematrix_msg_new:nn { footnotehyper~with~footnote~package } { You~can't~use~the~option~'footnotehyper'~because~the~package~ footnote~has~already~been~loaded.~ If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~ within~the~environments~of~nicematrix~will~be~extracted~with~the~tools~ of~the~package~footnote.\\ If~you~go~on,~the~package~footnotehyper~won't~be~loaded. } \bool_if:NT \c__nicematrix_footnote_bool { \@ifclassloaded { beamer } { \bool_set_false:N \c__nicematrix_footnote_bool } { \@ifpackageloaded { footnotehyper } { \__nicematrix_error:n { footnote~with~footnotehyper~package } } { \usepackage { footnote } } } } \bool_if:NT \c__nicematrix_footnotehyper_bool { \@ifclassloaded { beamer } { \bool_set_false:N \c__nicematrix_footnote_bool } { \@ifpackageloaded { footnote } { \__nicematrix_error:n { footnotehyper~with~footnote~package } } { \usepackage { footnotehyper } } } \bool_set_true:N \c__nicematrix_footnote_bool } \seq_new:N \c__nicematrix_types_of_matrix_seq \seq_set_from_clist:Nn \c__nicematrix_types_of_matrix_seq { NiceMatrix , pNiceMatrix , bNiceMatrix , vNiceMatrix, BNiceMatrix, VNiceMatrix } \seq_set_map_x:NNn \c__nicematrix_types_of_matrix_seq \c__nicematrix_types_of_matrix_seq { \tl_to_str:n { #1 } } \cs_new_protected:Npn \__nicematrix_error_too_much_cols: { \seq_if_in:NVTF \c__nicematrix_types_of_matrix_seq \g__nicematrix_name_env_str { \int_compare:nNnTF \l__nicematrix_last_col_int = { -2 } { \__nicematrix_fatal:n { too~much~cols~for~matrix } } { \bool_if:NF \l__nicematrix_last_col_without_value_bool { \__nicematrix_fatal:n { too~much~cols~for~matrix~with~last~col } } } } { \__nicematrix_fatal:n { too~much~cols~for~array } } } \cs_new:Npn \__nicematrix_message_hdotsfor: { \tl_if_empty:VF \g__nicematrix_HVdotsfor_lines_tl { ~Maybe~your~use~of~\token_to_str:N \Hdotsfor\ is~incorrect.} } \__nicematrix_msg_new:nn { too~much~cols~for~matrix~with~last~col } { You~try~to~use~more~columns~than~allowed~by~your~ \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ The~maximal~number~of~ columns~is~\int_eval:n { \l__nicematrix_last_col_int - 1 }~(plus~the~ exterior~columns).~This~error~is~fatal. } \__nicematrix_msg_new:nn { too~much~cols~for~matrix } { You~try~to~use~more~columns~than~allowed~by~your~ \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ Recall~that~the~maximal~ number~of~columns~for~a~matrix~is~fixed~by~the~LaTeX~counter~ 'MaxMatrixCols'.~Its~actual~value~is~\int_use:N \c@MaxMatrixCols.~ This~error~is~fatal. } \__nicematrix_msg_new:nn { too~much~cols~for~array } { You~try~to~use~more~columns~than~allowed~by~your~ \__nicematrix_full_name_env:.\__nicematrix_message_hdotsfor:\ The~maximal~number~of~columns~is~ \int_use:N \g__nicematrix_static_num_of_col_int\ ~(plus~the~potential~exterior~ones).~ This~error~is~fatal. } \__nicematrix_msg_new:nn { last~col~not~used } { The~key~'last-col'~is~in~force~but~you~have~not~used~that~last~column~ in~your~\__nicematrix_full_name_env:.~However,~you~can~go~on. } \__nicematrix_msg_new:nn { columns~not~used } { The~preamble~of~your~\__nicematrix_full_name_env:\ announces~\int_use:N \g__nicematrix_static_num_of_col_int\ columns~but~you~use~only~\int_use:N \c@jCol.\\ You~can~go~on~but~the~columns~you~did~not~used~won't~be~created. } \__nicematrix_msg_new:nn { in~first~col } { You~can't~use~the~command~#1 in~the~first~column~(number~0)~of~the~array.\\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { in~last~col } { You~can't~use~the~command~#1 in~the~last~column~(exterior)~of~the~array.\\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { in~first~row } { You~can't~use~the~command~#1 in~the~first~row~(number~0)~of~the~array.\\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { in~last~row } { You~can't~use~the~command~#1 in~the~last~row~(exterior)~of~the~array.\\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { bad~option~for~line-style } { Since~you~haven't~loaded~Tikz,~the~only~value~you~can~give~to~'line-style'~ is~'standard'.~If~you~go~on,~this~key~will~be~ignored. } \__nicematrix_msg_new:nn { Unknown~key~for~xdots } { As~for~now,~there~is~only~three~key~available~here:~'color',~'line-style'~ and~'shorten'~(and~you~try~to~use~'\l_keys_key_str').~If~you~go~on,~ this~key~will~be~ignored. } \__nicematrix_msg_new:nn { Unknown~key~for~rowcolors } { As~for~now,~there~is~only~two~keys~available~here:~'cols'~and~'respect-blocks'~ (and~you~try~to~use~'\l_keys_key_str').~If~you~go~on,~ this~key~will~be~ignored. } \__nicematrix_msg_new:nn { ampersand~in~light-syntax } { You~can't~use~an~ampersand~(\token_to_str:N &)~to~separate~columns~because~ ~you~have~used~the~key~'light-syntax'.~This~error~is~fatal. } \__nicematrix_msg_new:nn { SubMatrix~too~large } { Your~command~\token_to_str:N \SubMatrix\ can't~be~drawn~because~your~matrix~is~too~small.\\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { double-backslash~in~light-syntax } { You~can't~use~\token_to_str:N \\~to~separate~rows~because~you~have~used~ the~key~'light-syntax'.~You~must~use~the~character~'\l__nicematrix_end_of_row_tl'~ (set~by~the~key~'end-of-row').~This~error~is~fatal. } \__nicematrix_msg_new:nn { standard-cline~in~document } { The~key~'standard-cline'~is~available~only~in~the~preamble.\\ If~you~go~on~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { old~column~type } { The~column~type~'#1'~is~no~longer~defined~in~'nicematrix'.~ Since~version~5.0,~you~have~to~use~'l',~'c'~and~'r'~instead~of~'L',~ 'C'~and~'R'.~You~can~also~use~the~key~'define-L-C-R'.\\ This~error~is~fatal. } \__nicematrix_msg_new:nn { bad~value~for~baseline } { The~value~given~to~'baseline'~(\int_use:N \l_tmpa_int)~is~not~ valid.~The~value~must~be~between~\int_use:N \l__nicematrix_first_row_int\ and~ \int_use:N \g__nicematrix_row_total_int\ or~equal~to~'t',~'c'~or~'b'.\\ If~you~go~on,~a~value~of~1~will~be~used. } \__nicematrix_msg_new:nn { Invalid~name~format } { You~can't~give~the~name~'\l_keys_value_tl'~to~a~\token_to_str:N \SubMatrix.\\ A~name~must~be~accepted~by~the~regular~expression~[A-Za-z][A-Za-z0-9]*.\\ If~you~go~on,~this~key~will~be~ignored. } \__nicematrix_msg_new:nn { Wrong~line~in~SubMatrix } { You~try~to~draw~a~#1~line~of~number~'#2'~in~a~ \token_to_str:N \SubMatrix\ of~your~\__nicematrix_full_name_env:\ but~that~ number~is~not~valid.~If~you~go~on,~it~will~be~ignored. } \__nicematrix_msg_new:nn { empty~environment } { Your~\__nicematrix_full_name_env:\ is~empty.~This~error~is~fatal. } \__nicematrix_msg_new:nn { Delimiter~with~small } { You~can't~put~a~delimiter~in~the~preamble~of~your~\__nicematrix_full_name_env:\ because~the~key~'small'~is~in~force.\\ This~error~is~fatal. } \__nicematrix_msg_new:nn { unknown~cell~for~line~in~CodeAfter } { Your~command~\token_to_str:N\line\{#1\}\{#2\}~in~the~'code-after'~ can't~be~executed~because~a~cell~doesn't~exist.\\ If~you~go~on~this~command~will~be~ignored. } \__nicematrix_msg_new:nnn { Duplicate~name~for~SubMatrix } { The~name~'#1'~is~already~used~for~a~\token_to_str:N \SubMatrix\ in~this~\__nicematrix_full_name_env:.\\ If~you~go~on,~this~key~will~be~ignored.\\ For~a~list~of~the~names~already~used,~type~H~. } { The~names~already~defined~in~this~\__nicematrix_full_name_env:\ are:~ \seq_use:Nnnn \g__nicematrix_submatrix_names_seq { ~and~ } { ,~ } { ~and~ }. } \__nicematrix_msg_new:nn { r~or~l~with~preamble } { You~can't~use~the~key~'\l_keys_key_str'~in~your~\__nicematrix_full_name_env:.~ You~must~specify~the~alignment~of~your~columns~with~the~preamble~of~ your~\__nicematrix_full_name_env:.\\ If~you~go~on,~this~key~will~be~ignored. } \__nicematrix_msg_new:nn { Hdotsfor~in~col~0 } { You~can't~use~\token_to_str:N \Hdotsfor\ in~an~exterior~column~of~ the~array.~This~error~is~fatal. } \__nicematrix_msg_new:nn { bad~corner } { #1~is~an~incorrect~specification~for~a~corner~(in~the~keys~ 'except-corners'~and~'hvlines-except-corners').~The~available~ values~are:~NW,~SW,~NE~and~SE.\\ If~you~go~on,~this~specification~of~corner~will~be~ignored. } \__nicematrix_msg_new:nn { last-col~non~empty~for~NiceArray } { In~the~\__nicematrix_full_name_env:,~you~must~use~the~key~ 'last-col'~without~value.\\ However,~you~can~go~on~for~this~time~ (the~value~'\l_keys_value_tl'~will~be~ignored). } \__nicematrix_msg_new:nn { last-col~non~empty~for~NiceMatrixOptions } { In~\NiceMatrixoptions,~you~must~use~the~key~ 'last-col'~without~value.\\ However,~you~can~go~on~for~this~time~ (the~value~'\l_keys_value_tl'~will~be~ignored). } \__nicematrix_msg_new:nn { Block~too~large~1 } { You~try~to~draw~a~block~in~the~cell~#1-#2~of~your~matrix~but~the~matrix~is~ too~small~for~that~block. \\ } \__nicematrix_msg_new:nn { Block~too~large~2 } { The~preamble~of~your~\__nicematrix_full_name_env:\ announces~\int_use:N \g__nicematrix_static_num_of_col_int\ columns~but~you~use~only~\int_use:N \c@jCol\ and~that's~why~a~block~ specified~in~the~cell~#1-#2~can't~be~drawn.~You~should~add~some~ampersands~ (&)~at~the~end~of~the~first~row~of~your~ \__nicematrix_full_name_env:.\\ If~you~go~on,this~block~and~maybe~others~will~be~ignored. } \__nicematrix_msg_new:nn { unknown~column~type } { The~column~type~'#1'~in~your~\__nicematrix_full_name_env:\ is~unknown. \\ This~error~is~fatal. } \__nicematrix_msg_new:nn { tabularnote~forbidden } { You~can't~use~the~command~\token_to_str:N\tabularnote\ ~in~a~\__nicematrix_full_name_env:.~This~command~is~available~only~in~ \{NiceTabular\},~\{NiceArray\}~and~\{NiceMatrix\}. \\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { bottomrule~without~booktabs } { You~can't~use~the~key~'tabular/bottomrule'~because~you~haven't~ loaded~'booktabs'.\\ If~you~go~on,~this~key~will~be~ignored. } \__nicematrix_msg_new:nn { enumitem~not~loaded } { You~can't~use~the~command~\token_to_str:N\tabularnote\ ~because~you~haven't~loaded~'enumitem'.\\ If~you~go~on,~this~command~will~be~ignored. } \__nicematrix_msg_new:nn { Wrong~last~row } { You~have~used~'last-row=\int_use:N \l__nicematrix_last_row_int'~but~your~ \__nicematrix_full_name_env:\ seems~to~have~\int_use:N \c@iRow \ rows.~ If~you~go~on,~the~value~of~\int_use:N \c@iRow \ will~be~used~for~ last~row.~You~can~avoid~this~problem~by~using~'last-row'~ without~value~(more~compilations~might~be~necessary). } \__nicematrix_msg_new:nn { Yet~in~env } { Environments~of~nicematrix~can't~be~nested.\\ This~error~is~fatal. } \__nicematrix_msg_new:nn { Outside~math~mode } { The~\__nicematrix_full_name_env:\ can~be~used~only~in~math~mode~ (and~not~in~\token_to_str:N \vcenter).\\ This~error~is~fatal. } \__nicematrix_msg_new:nn { One~letter~allowed } { The~value~of~key~'\l_keys_key_str'~must~be~of~length~1.\\ If~you~go~on,~it~will~be~ignored. } \__nicematrix_msg_new:nnn { Unknown~key~for~Block } { The~key~'\l_keys_key_str'~is~unknown~for~the~command~\token_to_str:N \Block.\\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~c,~draw,~fill,~l,~ line-width,~rounded-corners~and~r. } \__nicematrix_msg_new:nnn { Unknown~key~for~CodeAfter } { The~key~'\l_keys_key_str'~is~unknown.\\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~available~keys~in~\token_to_str:N \CodeAfter,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ delimiters/color,~ rules~(with~the~subkeys~'color'~and~'width'),~ sub-matrix~(several~subkeys)~ and~xdots~(several~subkeys).~ The~latter~is~for~the~command~\token_to_str:N \line. } \__nicematrix_msg_new:nnn { Unknown~key~for~SubMatrix } { The~key~'\l_keys_key_str'~is~unknown.\\ If~you~go~on,~this~key~will~be~ignored. \\ For~a~list~of~the~available~keys~in~\token_to_str:N \SubMatrix,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ 'delimiters/color',~ 'extra-height',~ 'hlines',~ 'hvlines',~ 'left-xshift',~ 'name',~ 'right-xshift',~ 'rules'~(with~the~subkeys~'color'~and~'width'),~ 'slim',~ 'vlines'~and~'xshift'~(which~sets~both~'left-xshift'~ and~'right-xshift').\\ } \__nicematrix_msg_new:nnn { Unknown~key~for~notes } { The~key~'\l_keys_key_str'~is~unknown.\\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~available~keys~about~notes,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ bottomrule,~ code-after,~ code-before,~ enumitem-keys,~ enumitem-keys-para,~ para,~ label-in-list,~ label-in-tabular~and~ style. } \__nicematrix_msg_new:nnn { Unknown~key~for~NiceMatrixOptions } { The~key~'\l_keys_key_str'~is~unknown~for~the~command~ \token_to_str:N \NiceMatrixOptions. \\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~*principal*~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ allow-duplicate-names,~ cell-space-bottom-limit,~ cell-space-limits,~ cell-space-top-limit,~ code-for-first-col,~ code-for-first-row,~ code-for-last-col,~ code-for-last-row,~ create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ delimiters/color,~ end-of-row,~ first-col,~ first-row,~ hlines,~ hvlines,~ hvlines-except-corners,~ last-col,~ last-row,~ left-margin,~ letter-for-dotted-lines,~ light-syntax,~ notes~(several~subkeys),~ nullify-dots,~ renew-dots,~ renew-matrix,~ right-margin,~ rules~(with~the~subkeys~'color'~and~'width'),~ small,~ sub-matrix~(several~subkeys), vlines,~ xdots~(several~subkeys). } \__nicematrix_msg_new:nnn { Unknown~option~for~NiceArray } { The~key~'\l_keys_key_str'~is~unknown~for~the~environment~ \{NiceArray\}. \\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~*principal*~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ b,~ baseline,~ c,~ cell-space-bottom-limit,~ cell-space-limits,~ cell-space-top-limit,~ code-after,~ code-for-first-col,~ code-for-first-row,~ code-for-last-col,~ code-for-last-row,~ colortbl-like,~ columns-width,~ create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ delimiters/color,~ extra-left-margin,~ extra-right-margin,~ first-col,~ first-row,~ hlines,~ hvlines,~ hvlines-except-corners,~ last-col,~ last-row,~ left-margin,~ light-syntax,~ name,~ notes/bottomrule,~ notes/para,~ nullify-dots,~ renew-dots,~ right-margin,~ rules~(with~the~subkeys~'color'~and~'width'),~ small,~ t,~ vlines,~ xdots/color,~ xdots/shorten~and~ xdots/line-style. } \__nicematrix_msg_new:nnn { Unknown~option~for~NiceMatrix } { The~key~'\l_keys_key_str'~is~unknown~for~the~ \__nicematrix_full_name_env:. \\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~*principal*~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ b,~ baseline,~ c,~ cell-space-bottom-limit,~ cell-space-limits,~ cell-space-top-limit,~ code-after,~ code-for-first-col,~ code-for-first-row,~ code-for-last-col,~ code-for-last-row,~ colortbl-like,~ columns-width,~ create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ delimiters/color,~ extra-left-margin,~ extra-right-margin,~ first-col,~ first-row,~ hlines,~ hvlines,~ hvlines-except-corners,~ l,~ last-col,~ last-row,~ left-margin,~ light-syntax,~ name,~ nullify-dots,~ r,~ renew-dots,~ right-margin,~ rules~(with~the~subkeys~'color'~and~'width'),~ small,~ t,~ vlines,~ xdots/color,~ xdots/shorten~and~ xdots/line-style. } \__nicematrix_msg_new:nnn { Unknown~option~for~NiceTabular } { The~key~'\l_keys_key_str'~is~unknown~for~the~environment~ \{NiceTabular\}. \\ If~you~go~on,~it~will~be~ignored. \\ For~a~list~of~the~*principal*~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ b,~ baseline,~ c,~ cell-space-bottom-limit,~ cell-space-limits,~ cell-space-top-limit,~ code-after,~ code-for-first-col,~ code-for-first-row,~ code-for-last-col,~ code-for-last-row,~ colortbl-like,~ columns-width,~ create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ extra-left-margin,~ extra-right-margin,~ first-col,~ first-row,~ hlines,~ hvlines,~ hvlines-except-corners,~ last-col,~ last-row,~ left-margin,~ light-syntax,~ name,~ notes/bottomrule,~ notes/para,~ nullify-dots,~ renew-dots,~ right-margin,~ rules~(with~the~subkeys~'color'~and~'width'),~ t,~ vlines,~ xdots/color,~ xdots/shorten~and~ xdots/line-style. } \__nicematrix_msg_new:nnn { Duplicate~name } { The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~ the~same~environment~name~twice.~You~can~go~on,~but,~ maybe,~you~will~have~incorrect~results~especially~ if~you~use~'columns-width=auto'.~If~you~don't~want~to~see~this~ message~again,~use~the~key~'allow-duplicate-names'~in~ '\token_to_str:N \NiceMatrixOptions'.\\ For~a~list~of~the~names~already~used,~type~H~. \\ } { The~names~already~defined~in~this~document~are:~ \seq_use:Nnnn \g__nicematrix_names_seq { ~and~ } { ,~ } { ~and~ }. } \__nicematrix_msg_new:nn { Option~auto~for~columns-width } { You~can't~give~the~value~'auto'~to~the~key~'columns-width'~here.~ If~you~go~on,~the~key~will~be~ignored. } \endinput %% %% End of file `nicematrix.sty'.