%%
%% This is file `nicematrix.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% nicematrix.dtx  (with options: `package')
%% 
%% Copyright (C) 2017 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{1.4}
\def\myfiledate{2018/04/16}
\RequirePackage{l3keys2e}
\ProvidesExplPackage
  {nicematrix}
  {\myfiledate}
  {\myfileversion}
  {Draws nice dotted lines in matrix environments}
\RequirePackage{array}
\RequirePackage{mathtools}
\RequirePackage{tikz}
\RequirePackage{xparse}
\ProvideDocumentCommand \iddots {}
      {\mathinner{\mkern 1mu
                  \raise \p@ \hbox{.}
                  \mkern 2mu
                  \raise 4\p@ \hbox{.}
                  \mkern 2mu
                  \raise 7\p@ \vbox{\kern 7pt
                                    \hbox{.}}
                  \mkern 1mu}}
\cs_new_protected:Nn \__nm_multicolumn:nn
       {\msg_error:nn {nicematrix} {Multicolumn~forbidden}}
\int_new:N \g__nm_env_int
\dim_new:N \l__nm_columns_width_dim
\tl_new:N \l__nm_pos_env_tl
\tl_set:Nn \l__nm_pos_env_tl c
\bool_new:N \l__nm_exterior_arraycolsep_bool
\bool_new:N \l__nm_parallelize_diags_bool
\bool_set_true:N \l__nm_parallelize_diags_bool
\bool_new:N \l__nm_nullify_dots_bool
\bool_new:N \l__nm_renew_matrix_bool
\bool_new:N \l__nm_auto_columns_width_bool
\tl_new:N \l__nm_code_for_last_col_tl
\keys_define:nn {NiceMatrix/NiceMatrixOptions}
     {parallelize-diags    .bool_set:N = \l__nm_parallelize_diags_bool,
      parallelize-diags    .default:n  = true,
      ParallelizeDiagonals .meta:n = parallelize-diags,
      renew-dots        .bool_set:N = \l__nm_renew_dots_bool,
      renew-dots        .default:n  = true,
      RenewDots         .meta:n = renew-dots,
      renew-matrix      .code:n     = {\cs_set_eq:NN \env@matrix \NiceMatrix
                                      \bool_set_true:N \l__nm_renew_matrix_bool},
      renew-matrix      .value_forbidden:n = true,
      RenewMatrix       .meta:n     = renew-matrix,
      transparent       .meta:n     = {renew-dots,renew-matrix},
      transparent       .value_forbidden:n = true,
      Transparent       .meta:n     = transparent,
      nullify-dots      .bool_set:N = \l__nm_nullify_dots_bool ,
      nullify-dots      .default:n  = true,
      NullifyDots       .meta:n     = nullify-dots,
      silent            .code:n  = {\msg_redirect_name:nnn {nicematrix}
                                                           {Impossible~instruction}
                                                           {none}} ,
      silent            .value_forbidden:n = true,
      Silent            .meta:n            = silent,
      code-for-last-col  .tl_set:N         = \l__nm_code_for_last_col_tl,
      code-for-last-col  .value_required:n = true,
      exterior-arraycolsep .bool_set:N = \l__nm_exterior_arraycolsep_bool ,
      exterior-arraycolsep .default:n  = true,
      unknown .code:n  = \msg_error:nn {nicematrix} {Unknown~key~for~NiceMatrixOptions}}
\msg_new:nnnn {nicematrix}
              {Unknown~key~for~NiceMatrixOptions}
              {The~key~"\tl_use:N\l_keys_key_tl"~is~unknown~for~the~command
               \token_to_str:N \NiceMatrixOptions.\\
               If~you~go~on,~it~will~be~ignored.\\
               For~a~list~of~the~available~keys,~type~H~<return>.}
              {The~available~keys~are~(in~alphabetic~order):~
               code-for-last-col,~
               exterior-arraycolsep,~
               nullify-dots,~
               parallelize-diags,~
               renew-dots,~
               renew-matrix~
               and~transparent}
\NewDocumentCommand \NiceMatrixOptions {m}
    {\keys_set:nn {NiceMatrix/NiceMatrixOptions} {#1}}
\keys_define:nn {NiceMatrix/NiceMatrix}
     {parallelize-diags .bool_set:N  = \l__nm_parallelize_diags_bool,
      parallelize-diags .default:n   = true,
      renew-dots        .bool_set:N  = \l__nm_renew_dots_bool,
      renew-dots        .default:n   = true,
      nullify-dots      .bool_set:N  = \l__nm_nullify_dots_bool ,
      nullify-dots      .default:n   = true,
      columns-width     .code:n      = \str_if_eq:nnTF {#1} {auto}
                                           {\bool_set_true:N
                                                \l__nm_auto_columns_width_bool}
                                           {\dim_set:Nn \l__nm_columns_width_dim {#1}},
      unknown .code:n  = \msg_error:nn {nicematrix} {Unknown~option~for~NiceMatrix}}
\msg_new:nnnn {nicematrix}
              {Unknown~option~for~NiceMatrix}
              {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~for~the~environment~
               \{NiceMatrix\}~and~its~variants.\\
               If~you~go~on,~it~will~be~ignored.\\
               For~a~list~of~the~available~options,~type~H~<return>.}
              {The~available~options~are~(in~alphabetic~order):~
               columns-width,~
               nullify-dots,~
               parallelize-diags~
               and~renew-dots.}
\keys_define:nn {NiceMatrix/NiceArray}
     {parallelize-diags    .bool_set:N = \l__nm_parallelize_diags_bool,
      parallelize-diags    .default:n  = true,
      renew-dots           .bool_set:N = \l__nm_renew_dots_bool,
      renew-dots           .default:n  = true,
      nullify-dots         .bool_set:N = \l__nm_nullify_dots_bool ,
      nullify-dots         .default:n  = true,
      exterior-arraycolsep .bool_set:N = \l__nm_exterior_arraycolsep_bool ,
      exterior-arraycolsep .default:n  = true,
      columns-width        .code:n     = \str_if_eq:nnTF {#1} {auto}
                                           {\bool_set_true:N \l__nm_auto_columns_width_bool}
                                           {\dim_set:Nn \l__nm_columns_width_dim {#1}},
      columns-width        .value_required:n = true,
      c .code:n = \tl_set:Nn \l__nm_pos_env_tl c,
      t .code:n = \tl_set:Nn \l__nm_pos_env_tl t,
      b .code:n = \tl_set:Nn \l__nm_pos_env_tl b,
      unknown .code:n  = \msg_error:nn {nicematrix} {Unknown~option~for~NiceArray}}
\msg_new:nnnn {nicematrix}
              {Unknown~option~for~NiceArray}
              {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~for~the~environment~
               \{NiceArray\}.\\
               If~you~go~on,~it~will~be~ignored.\\
               For~a~list~of~the~available~options,~type~H~<return>.}
              {The~available~options~are~(in~alphabetic~order):~
               b,~
               c,~
               columns-width,~
               exterior-arraycolsep,~
               nullify-dots,~
               parallelize-diags,~
               renew-dots~
               and~t.}
\cs_new_protected:Nn \__nm_Cell:n
   {\tl_gput_right:Nn \g__nm_preamble_aux_tl {#1}
    \int_gincr:N \g__nm_column_int
    \hbox_set:Nw \l_tmpa_box $} % $
\cs_new_protected:Nn \__nm_end_Cell:
   {$ % $
    \hbox_set_end:
    \dim_gset:Nn \g__nm_max_cell_width_dim
          {\dim_max:nn \g__nm_max_cell_width_dim {\box_wd:N \l_tmpa_box}}
    \tikz[remember~picture, inner~sep = 0pt, minimum~width = 0pt, baseline]
       \node [anchor=base] (nm-\int_use:N \g__nm_env_int-
                               \int_use:N \g__nm_row_int-
                               \int_use:N \g__nm_column_int)
       \bgroup
       \box_use:N \l_tmpa_box
       \egroup ;}
\NewDocumentEnvironment {NiceMatrix} {O{}}
    {\keys_set:nn {NiceMatrix/NiceMatrix} {#1}
     \tl_set:Nn \l__nm_pos_env_tl c
     \bool_set_false:N \l__nm_exterior_arraycolsep_bool
         \NiceArray{*\c@MaxMatrixCols{C}}
      }
    {\endarray
     \skip_horizontal:n {-\arraycolsep}}
\cs_generate_variant:Nn \dim_set:Nn {Nx}
\NewDocumentEnvironment {NiceArray} {O{} m O{}}
    {\aftergroup \__nm_write_max_cell_width:
     \aftergroup \__nm_draw_lines:
     \int_gincr:N \g__nm_env_int
     \dim_gzero_new:N \g__nm_max_cell_width_dim
     \keys_set:nn {NiceMatrix/NiceArray} {#1,#3}
     \bool_if:NT \l__nm_auto_columns_width_bool
         {\cs_if_free:cTF {__nm_max_cell_width_\int_use:N \g__nm_env_int}
             {\dim_set:Nn \l__nm_columns_width_dim \c_zero_dim}
             {\dim_set:Nx \l__nm_columns_width_dim
                  {\use:c {__nm_max_cell_width_\int_use:N \g__nm_env_int}}}}
     \cs_set:Npn \ialign
          {\everycr{\noalign{\int_gincr:N \g__nm_row_int
                             \int_gzero:N \g__nm_column_int
                             \int_compare:nNnT {\tl_count:N \g__nm_preamble_aux_tl}
                                             > {\tl_count:N \g__nm_preamble_tl}
                                {\tl_gset_eq:NN \g__nm_preamble_tl \g__nm_preamble_aux_tl}
                             \tl_gclear:N \g__nm_preamble_aux_tl}}
          \skip_zero:N \tabskip
          \cs_set:Npn \ialign {\everycr{}
                               \skip_zero:N \tabskip
                               \halign}
          \halign}
     \dim_compare:nNnTF \l__nm_columns_width_dim = \c_zero_dim
        {\newcolumntype{L}{>{\__nm_Cell:n l}l<{\__nm_end_Cell:}}
         \newcolumntype{C}{>{\__nm_Cell:n c}c<{\__nm_end_Cell:}}
         \newcolumntype{R}{>{\__nm_Cell:n r}r<{\__nm_end_Cell:}}}
        {\newcolumntype{L}{wl{\dim_use:N \l__nm_columns_width_dim}}
         \newcolumntype{C}{wc{\dim_use:N \l__nm_columns_width_dim}}
         \newcolumntype{R}{wr{\dim_use:N \l__nm_columns_width_dim}}}
     \cs_set_eq:NN \NC@find@w \relax
     \cs_set_eq:NN \NC@find@W \relax
     \newcolumntype{w}[2]
       {>{\hbox_set:Nw \l_tmpa_box
          \__nm_Cell:n ##1}
        c
        <{\__nm_end_Cell:
          \hbox_set_end:
          \makebox[##2][##1]{\box_use:N \l_tmpa_box}}}
     \newcolumntype{W}[2]
       {>{\hbox_set:Nw \l_tmpa_box
          \__nm_Cell:n ##1}
        c
        <{\__nm_end_Cell:
          \hbox_set_end:
          \cs_set_eq:NN \hss \hfil
          \makebox[##2][##1]{\box_use:N \l_tmpa_box}}}
     \cs_set_eq:NN \Ldots \__nm_Ldots
     \cs_set_eq:NN \Cdots \__nm_Cdots
     \cs_set_eq:NN \Vdots \__nm_Vdots
     \cs_set_eq:NN \Ddots \__nm_Ddots
     \cs_set_eq:NN \Iddots \__nm_Iddots
     \cs_set_eq:NN \Hspace \__nm_Hspace:
     \cs_set_eq:NN \NiceMatrixEndPoint \__nm_NiceMatrixEndPoint:
     \bool_if:NT \l__nm_renew_dots_bool
        {\cs_set_eq:NN \ldots \__nm_Ldots
         \cs_set_eq:NN \cdots \__nm_Cdots
         \cs_set_eq:NN \vdots \__nm_Vdots
         \cs_set_eq:NN \ddots \__nm_Ddots
         \cs_set_eq:NN \iddots \__nm_Iddots}
     \bool_if:NF \l__nm_renew_matrix_bool
       {\cs_set_eq:NN \multicolumn \__nm_multicolumn:nn}
     \tl_clear_new:N \g__nm_preamble_tl
     \tl_clear_new:N \g__nm_preamble_aux_tl
     \seq_gclear_new:N  \g__nm_empty_cells_seq
     \int_gzero_new:N \g__nm_instruction_int
     \int_gzero_new:N \g__nm_row_int
     \int_gzero_new:N \g__nm_column_int
     \cs_set_eq:NN \@ifnextchar \new@ifnextchar
     \bool_if:NF \l__nm_exterior_arraycolsep_bool
         {\skip_horizontal:n {-\arraycolsep}}
     \array[\l__nm_pos_env_tl]{#2}}
    {\endarray
     \bool_if:NF \l__nm_exterior_arraycolsep_bool
         {\skip_horizontal:n {-\arraycolsep}}}
\NewDocumentEnvironment {pNiceMatrix} {}
   {\left(\begin{NiceMatrix}}
   {\end{NiceMatrix}\right)}
\NewDocumentEnvironment {bNiceMatrix} {}
   {\left[\begin{NiceMatrix}}
   {\end{NiceMatrix}\right]}
\NewDocumentEnvironment {BNiceMatrix} {}
   {\left\{\begin{NiceMatrix}}
   {\end{NiceMatrix}\right\}}
\NewDocumentEnvironment {vNiceMatrix} {}
   {\left\lvert\begin{NiceMatrix}}
   {\end{NiceMatrix}\right\rvert}
\NewDocumentEnvironment {VNiceMatrix} {}
   {\left\lVert\begin{NiceMatrix}}
   {\end{NiceMatrix}\right\rVert}
\cs_new:Nn \__nm_write_max_cell_width:
      {\iow_now:Nx \@mainaux
        {\ExplSyntaxOn
           \cs_gset:cpn {__nm_max_cell_width_\int_use:N \g__nm_env_int}
                        {\dim_use:N \g__nm_max_cell_width_dim}
         \ExplSyntaxOff}}
\prg_set_conditional:Npnn \__nm_if_not_empty_cell:nn #1#2 {T}
       {\cs_if_exist:cTF {pgf@sh@ns@nm-\int_use:N \g__nm_env_int-
                                       \int_use:N #1-
                                       \int_use:N #2}
          {\seq_if_in:NxTF \g__nm_empty_cells_seq
                           {\int_use:N #1-\int_use:N #2}
             {\prg_return_false:}
             {\begin{pgfpicture}
                \tl_set:Nx \l_tmpa_tl {nm-\int_use:N \g__nm_env_int-
                                          \int_use:N #1-
                                          \int_use:N #2}
                \pgfpointanchor \l_tmpa_tl {east}
                \dim_gset:Nn \g_tmpa_dim \pgf@x
                \pgfpointanchor \l_tmpa_tl {west}
                \dim_gset:Nn \g_tmpb_dim \pgf@x
              \end{pgfpicture}
              \dim_compare:nNnTF {\dim_abs:n {\g_tmpb_dim-\g_tmpa_dim}} < {0.5 pt}
                    {\prg_return_false:}
                    {\prg_return_true:}
             }}
          {\prg_return_false:}
       }
\cs_new_protected:Nn \__nm_instruction_of_type:n
     {\int_gincr:N \g__nm_instruction_int
      \prop_put:Nnn \l_tmpa_prop {type} {#1}
      \prop_put:NnV \l_tmpa_prop {row} \g__nm_row_int
      \prop_put:NnV \l_tmpa_prop {column} \g__nm_column_int
      \prop_gclear_new:c
         {g__nm_instruction_\int_use:N\g__nm_instruction_int _prop}
      \prop_gset_eq:cN
         {g__nm_instruction_\int_use:N\g__nm_instruction_int _prop}
         \l_tmpa_prop
      }

\cs_new_protected:Nn \__nm_draw_lines:
    {
     \int_decr:N \g__nm_row_int
     \int_set:Nn \g__nm_column_int {\tl_count:N \g__nm_preamble_tl}
     \seq_clear_new:N \l__nm_yet_drawn_seq
     \int_zero_new:N \l__nm_type_int
     \int_zero_new:N \l__nm_row_int
     \int_zero_new:N \l__nm_column_int
     \int_zero_new:N \l__nm_di_int
     \int_zero_new:N \l__nm_dj_int
     \bool_if:NT \l__nm_parallelize_diags_bool
          {\int_zero_new:N \l__nm_ddots_int
           \int_zero_new:N \l__nm_iddots_int
           \dim_zero_new:N \l__nm_delta_x_one_dim
           \dim_zero_new:N \l__nm_delta_y_one_dim
           \dim_zero_new:N \l__nm_delta_x_two_dim
           \dim_zero_new:N \l__nm_delta_y_two_dim}
     \int_zero_new:N \l__nm_instruction_int
     \int_incr:N \l__nm_instruction_int
     \int_until_do:nNnn \l__nm_instruction_int > \g__nm_instruction_int
        {
         \prop_get:cnN {g__nm_instruction_\int_use:N \l__nm_instruction_int _prop}
                        {type} \l_tmpa_tl
         \int_set:Nn \l__nm_type_int {\l_tmpa_tl}
         \prop_get:cnN {g__nm_instruction_\int_use:N \l__nm_instruction_int _prop}
                        {row} \l_tmpa_tl
         \int_set:Nn \l__nm_row_int {\l_tmpa_tl}
         \prop_get:cnN {g__nm_instruction_\int_use:N \l__nm_instruction_int _prop}
                        {column} \l_tmpa_tl
         \int_set:Nn \l__nm_column_int {\l_tmpa_tl}
           \int_case:nn \l__nm_type_int
             { 0 {\int_set:Nn \l__nm_di_int 0
                  \int_set:Nn \l__nm_dj_int 1}
               1 {\int_set:Nn \l__nm_di_int 0
                  \int_set:Nn \l__nm_dj_int 1}
               2 {\int_set:Nn \l__nm_di_int 1
                  \int_set:Nn \l__nm_dj_int 0}
               3 {\int_set:Nn \l__nm_di_int 1
                  \int_set:Nn \l__nm_dj_int 1}
               4 {\int_set:Nn \l__nm_di_int 1
                  \int_set:Nn \l__nm_dj_int {-1}}}
           \bool_if_exist:NTF \l__nm_impossible_instruction_bool
               {\bool_set_false:N \l__nm_impossible_instruction_bool}
               {\bool_new:N \l__nm_impossible_instruction_bool}
           \int_zero_new:N  \l__nm_final_i_int
           \int_zero_new:N  \l__nm_final_j_int
           \int_set:Nn \l__nm_final_i_int \l__nm_row_int
           \int_set:Nn \l__nm_final_j_int \l__nm_column_int
           \bool_if_exist:NTF \l__nm_stop_loop_bool
                  {\bool_set_false:N \l__nm_stop_loop_bool}
                  {\bool_new:N \l__nm_stop_loop_bool}
           \bool_do_until:Nn \l__nm_stop_loop_bool
              {\int_add:Nn \l__nm_final_i_int \l__nm_di_int
               \int_add:Nn \l__nm_final_j_int \l__nm_dj_int
               \bool_if:nTF { \int_compare_p:nNn \l__nm_final_i_int < 1
                           || \int_compare_p:nNn \l__nm_final_i_int > \g__nm_row_int
                           || \int_compare_p:nNn \l__nm_final_j_int < 1
                           || \int_compare_p:nNn \l__nm_final_j_int > \g__nm_column_int}
                       {\bool_set_true:N \l__nm_impossible_instruction_bool
                        \bool_set_true:N \l__nm_stop_loop_bool}
                       {\__nm_if_not_empty_cell:nnT \l__nm_final_i_int \l__nm_final_j_int
                              {\bool_set_true:N \l__nm_stop_loop_bool}}
               }
           \int_zero_new:N  \l__nm_initial_i_int
           \int_zero_new:N  \l__nm_initial_j_int
           \int_set:Nn \l__nm_initial_i_int \l__nm_row_int
           \int_set:Nn \l__nm_initial_j_int \l__nm_column_int
           \bool_set_eq:NN \l__nm_stop_loop_bool \l__nm_impossible_instruction_bool
           \bool_do_until:Nn \l__nm_stop_loop_bool
              {\int_sub:Nn \l__nm_initial_i_int \l__nm_di_int
               \int_sub:Nn \l__nm_initial_j_int \l__nm_dj_int
               \bool_if:nTF
                       {   \int_compare_p:nNn \l__nm_initial_i_int < 1
                        || \int_compare_p:nNn \l__nm_initial_i_int > \g__nm_row_int
                        || \int_compare_p:nNn \l__nm_initial_j_int < 1
                        || \int_compare_p:nNn \l__nm_initial_j_int > \g__nm_column_int}
                       {\bool_set_true:N \l__nm_impossible_instruction_bool
                        \bool_set_true:N \l__nm_stop_loop_bool}
                       {\__nm_if_not_empty_cell:nnT \l__nm_initial_i_int \l__nm_initial_j_int
                              {\bool_set_true:N \l__nm_stop_loop_bool}}
               }
          \bool_if:NTF \l__nm_impossible_instruction_bool
            {\msg_error:nn {nicematrix} {Impossible~instruction}}
            {\tl_set:Nx \l_tmpa_tl {\int_use:N \l__nm_initial_i_int-
                                    \int_use:N \l__nm_initial_j_int-
                                    \int_use:N \l__nm_final_i_int-
                                    \int_use:N \l__nm_final_j_int}
             \seq_if_in:NVF \l__nm_yet_drawn_seq \l_tmpa_tl
              {\seq_put_left:NV \l__nm_yet_drawn_seq \l_tmpa_tl
               \dim_zero_new:N \g__nm_x_initial_dim
               \dim_zero_new:N \g__nm_y_initial_dim
               \dim_zero_new:N \g__nm_x_final_dim
               \dim_zero_new:N \g__nm_y_final_dim
               \int_case:nn \l__nm_type_int
                {0  \__nm_draw_ldots_line:
                 1  \__nm_draw_cdots_line:
                 2  \__nm_draw_vdots_line:
                 3  \__nm_draw_ddots_line:
                 4  \__nm_draw_iddots_line:}}}
            \int_incr:N \l__nm_instruction_int
         }
}
\cs_new_protected:Nn \__nm_retrieve_coords:nn
     {\begin{tikzpicture}[remember~picture]
      \tikz@parse@node\pgfutil@firstofone
             (nm-\int_use:N \g__nm_env_int-
                 \int_use:N \l__nm_initial_i_int-
                 \int_use:N \l__nm_initial_j_int.#1)
      \dim_gset:Nn \g__nm_x_initial_dim \pgf@x
      \dim_gset:Nn \g__nm_y_initial_dim \pgf@y
      \tikz@parse@node\pgfutil@firstofone
             (nm-\int_use:N \g__nm_env_int-
                 \int_use:N \l__nm_final_i_int-
                 \int_use:N \l__nm_final_j_int.#2)
      \dim_gset:Nn \g__nm_x_final_dim \pgf@x
      \dim_gset:Nn \g__nm_y_final_dim \pgf@y
      \end{tikzpicture} }
\cs_new_protected:Nn \__nm_draw_ldots_line:
      {\__nm_retrieve_coords:nn {south~east} {south~west}
       \__nm_draw_tikz_line:}
\cs_new_protected:Nn \__nm_draw_cdots_line:
      {\__nm_retrieve_coords:nn {mid~east} {mid~west}
       \__nm_draw_tikz_line:}
\cs_new_protected:Nn \__nm_draw_vdots_line:
      {\__nm_retrieve_coords:nn {south} {north}
       \tl_set:Nx \l_tmpa_tl {\tl_item:Nn \g__nm_preamble_tl \l__nm_initial_j_int}
       \tl_set:Nn \l_tmpb_tl {l}
       \tl_if_eq:NNT \l_tmpa_tl \l_tmpb_tl
            {\dim_set:Nn \l_tmpa_dim {\dim_min:nn \g__nm_x_initial_dim \g__nm_x_final_dim}
             \dim_set_eq:NN \g__nm_x_initial_dim \l_tmpa_dim
             \dim_set_eq:NN \g__nm_x_final_dim \l_tmpa_dim}
       \tl_set:Nn \l_tmpb_tl {r}
       \tl_if_eq:NNT \l_tmpa_tl \l_tmpb_tl
            {\dim_set:Nn \l_tmpa_dim {\dim_max:nn \g__nm_x_initial_dim \g__nm_x_final_dim}
             \dim_set_eq:NN \g__nm_x_initial_dim \l_tmpa_dim
             \dim_set_eq:NN \g__nm_x_final_dim \l_tmpa_dim}
       \__nm_draw_tikz_line:}
\cs_new_protected:Nn \__nm_draw_ddots_line:
   {\__nm_retrieve_coords:nn {south~east} {north~west}
    \bool_if:NT \l__nm_parallelize_diags_bool
       {\int_incr:N \l__nm_ddots_int
        \int_compare:nNnTF \l__nm_ddots_int = 1
          {\dim_set:Nn \l__nm_delta_x_one_dim {\g__nm_x_final_dim - \g__nm_x_initial_dim }
           \dim_set:Nn \l__nm_delta_y_one_dim {\g__nm_y_final_dim - \g__nm_y_initial_dim }}
          {\dim_gset:Nn \g__nm_y_final_dim
                  {\g__nm_y_initial_dim +
                      (\g__nm_x_final_dim - \g__nm_x_initial_dim)
                      * \dim_ratio:nn \l__nm_delta_y_one_dim \l__nm_delta_x_one_dim }}}
    \__nm_draw_tikz_line:}
\cs_new_protected:Nn \__nm_draw_iddots_line:
   {\__nm_retrieve_coords:nn {south~west} {north~east}
    \bool_if:NT \l__nm_parallelize_diags_bool
       {\int_incr:N \l__nm_iddots_int
        \int_compare:nNnTF \l__nm_iddots_int = 1
          {\dim_set:Nn \l__nm_delta_x_two_dim {\g__nm_x_final_dim - \g__nm_x_initial_dim }
           \dim_set:Nn \l__nm_delta_y_two_dim {\g__nm_y_final_dim - \g__nm_y_initial_dim }}
          {\dim_gset:Nn \g__nm_y_final_dim
                  {\g__nm_y_initial_dim +
                      (\g__nm_x_final_dim - \g__nm_x_initial_dim)
                      * \dim_ratio:nn \l__nm_delta_y_two_dim \l__nm_delta_x_two_dim }}}
    \__nm_draw_tikz_line:}
\cs_new_protected:Nn \__nm_draw_tikz_line:
                     {
                       \dim_zero_new:N \l__nm_l_dim
                       \dim_set:Nn \l__nm_l_dim
                                  { \fp_to_dim:n
                                      { sqrt( (  \dim_use:N \g__nm_x_final_dim
                                                -\dim_use:N \g__nm_x_initial_dim) ^2
                                             +(  \dim_use:N \g__nm_y_final_dim
                                                -\dim_use:N \g__nm_y_initial_dim) ^2 )}
                                  }
                       \int_set:Nn \l_tmpa_int {\dim_ratio:nn {\l__nm_l_dim - 0.54em}
                                                              {0.45em}}
                       \dim_set:Nn \l_tmpa_dim { (\g__nm_x_final_dim - \g__nm_x_initial_dim)
                                                  * \dim_ratio:nn {0.45em} \l__nm_l_dim}
                       \dim_set:Nn \l_tmpb_dim { (\g__nm_y_final_dim - \g__nm_y_initial_dim)
                                                  * \dim_ratio:nn {0.45em} \l__nm_l_dim}
                       \dim_gadd:Nn \g__nm_x_initial_dim
                           { (\g__nm_x_final_dim - \g__nm_x_initial_dim)
                               * \dim_ratio:nn {\l__nm_l_dim - 0.45 em * \l_tmpa_int}
                                               {\l__nm_l_dim * 2}}
                       \dim_gadd:Nn \g__nm_y_initial_dim
                           { (\g__nm_y_final_dim - \g__nm_y_initial_dim)
                              * \dim_ratio:nn {\l__nm_l_dim - 0.45 em * \l_tmpa_int}
                                              {\l__nm_l_dim * 2}}
                       \begin{tikzpicture}[overlay]
                       \int_step_inline:nnnn 0 1 \l_tmpa_int
                          { \pgfpathcircle{\pgfpoint{\g__nm_x_initial_dim}
                                                    {\g__nm_y_initial_dim}}
                                          {0.53pt}
                            \pgfusepath{fill}
                            \dim_gadd:Nn \g__nm_x_initial_dim \l_tmpa_dim
                            \dim_gadd:Nn \g__nm_y_initial_dim \l_tmpb_dim }
                       \end{tikzpicture}
}
\cs_set_eq:NN \__nm_ldots \ldots
\cs_set_eq:NN \__nm_cdots \cdots
\cs_set_eq:NN \__nm_vdots \vdots
\cs_set_eq:NN \__nm_ddots \ddots
\cs_set_eq:NN \__nm_iddots \iddots
\cs_new_protected:Nn \__nm_add_to_empty_cells:
    {\seq_gput_right:Nx \g__nm_empty_cells_seq
          {\int_use:N \g__nm_row_int-
           \int_use:N \g__nm_column_int}}
\NewDocumentCommand \__nm_Ldots {s}
    {\IfBooleanF {#1} {\__nm_instruction_of_type:n 0}
     \bool_if:NF \l__nm_nullify_dots_bool {\phantom \__nm_ldots}
     \__nm_add_to_empty_cells:}
\NewDocumentCommand \__nm_Cdots {s}
    {\IfBooleanF {#1} {\__nm_instruction_of_type:n 1}
     \bool_if:NF \l__nm_nullify_dots_bool {\phantom \__nm_cdots}
     \__nm_add_to_empty_cells:}
\NewDocumentCommand \__nm_Vdots {s}
    {\IfBooleanF {#1} {\__nm_instruction_of_type:n 2}
     \bool_if:NF \l__nm_nullify_dots_bool {\phantom \__nm_vdots}
     \__nm_add_to_empty_cells:}
\NewDocumentCommand \__nm_Ddots {s}
    {\IfBooleanF {#1} {\__nm_instruction_of_type:n 3}
     \bool_if:NF \l__nm_nullify_dots_bool {\phantom \__nm_ddots}
     \__nm_add_to_empty_cells:}
\NewDocumentCommand \__nm_Iddots {s}
    {\IfBooleanF {#1} {\__nm_instruction_of_type:n 4}
     \bool_if:NF \l__nm_nullify_dots_bool {\phantom \__nm_iddots}
     \__nm_add_to_empty_cells:}
\cs_new_protected:Nn \__nm_Hspace:
  {\__nm_add_to_empty_cells:
   \hspace}
\cs_new_protected:Nn \__nm_NiceMatrixEndPoint:
     {\kern 0.5pt}
\ProcessKeysOptions {NiceMatrix}
\msg_new:nnnn {nicematrix}
              {Impossible~instruction}
              {It's~not~possible~to~execute~the~instruction~
               \int_case:nn \l__nm_type_int
                 {0 {\token_to_str:N \Ldots}
                  1 {\token_to_str:N \Cdots}
                  2 {\token_to_str:N \Vdots}
                  3 {\token_to_str:N \Ddots}}~in~the~row~\int_use:N\l__nm_row_int\
               ~and~the~column~\int_use:N\l__nm_column_int\space of~the~matrix~
               because~it's~impossible~to~find~one~of~its~extremities~
               (both~extremities~must~be~non~empty~cells~of~the~matrix).~
               If~you~go~on,~the~instruction~will~be~ignored.}
              {You~can~specify~an~end~of~line~on~a~empty~cell~
               with~\token_to_str:N \NiceMatrixEndPoint.}
\msg_new:nnn {nicematrix}
             {Multicolumn~forbidden}
             {The~command~\token_to_str:N \multicolumn\
              is~forbidden~in~the~environment~\{NiceMatrix\}~
              and~its~variants.~The~command~\token_to_str:N \hdotsfor\
              of~amsmath~is~also~forbidden~since~it~uses~
              \token_to_str:N \multicolumn.~You~can~go~on~but~your~line~will~
              probably~be~wrong.}
\keys_define:nn {NiceMatrix/NiceArrayC}
     {parallelize-diags .bool_set:N       = \l__nm_parallelize_diags_bool,
      parallelize-diags .default:n        = true,
      renew-dots        .bool_set:N       = \l__nm_renew_dots_bool,
      renew-dots        .default:n        = true,
      nullify-dots      .bool_set:N       = \l__nm_nullify_dots_bool ,
      nullify-dots      .default:n        = true,
      code-for-last-col .tl_set:N         = \l__nm_code_for_last_col_tl,
      code-for-last-col .value_required:n = true,
      columns-width     .code:n           = \str_if_eq:nnTF {#1} {auto}
                                            {\bool_set_true:N
                                                   \l__nm_auto_columns_width_bool}
                                            {\dim_set:Nn \l__nm_columns_width_dim {#1}},
      columns-width     .value_required:n = true,
      unknown .code:n  = \msg_error:nn {nicematrix} {Unknown~option~for~pNiceArrayC}}
\msg_new:nnnn {nicematrix}
              {Unknown~option~for~pNiceArrayC}
              {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~for~the~environment~
               \{\@currenvir\}.\\
               If~you~go~on,~it~will~be~ignored.\\
               For~a~list~of~the~available~options,~type~H~<return>.}
              {The~available~options~are~(in~alphabetic~order):~
               code-for-last-col,~
               columns-width,~
               nullify-dots,~
               parallelize-diags~
               and~renew-dots.}
\cs_new_protected:Nn \__nm_NiceArrayC:nn
    {\dim_gzero_new:N \g__nm_width_last_col_dim
     \keys_set:nn {NiceMatrix/NiceArrayC} {#1}
     \bool_set_false:N \l__nm_exterior_arraycolsep_bool
     \tl_set:Nn \l__nm_pos_env_tl c
     \begin{NiceArray}
             {#2
                >{\int_gincr:N \g__nm_column_int
                  \hbox_set:Nw \l_tmpa_box
                  \l__nm_code_for_last_col_tl
                  \tikz[remember~picture, inner~sep = 0pt, minimum~width = 0pt, baseline]
                     \node [anchor=base] (nm-\int_use:N \g__nm_env_int-
                                             \int_use:N \g__nm_row_int-
                                             \int_use:N \g__nm_column_int)
                     \bgroup $ % $
                 }
                l
                <{   $ % $
                     \egroup ;
                  \hbox_set_end:
                  \dim_gset:Nn \g__nm_width_last_col_dim
                     {\dim_max:nn \g__nm_width_last_col_dim
                                  {\box_wd:N \l_tmpa_box}}
                  \tl_gput_right:Nn \g__nm_preamble_aux_tl {#1}
                  \skip_horizontal:n {-2\arraycolsep}
                  \hbox_overlap_right:n
                       {\skip_horizontal:n {2\arraycolsep}
                        \box_use:N \l_tmpa_box}}}}
\cs_new:Nn \__nm_after_last_col:
    {\dim_compare:nNnF \g__nm_width_last_col_dim = \c_zero_dim
        {\skip_horizontal:n {\g__nm_width_last_col_dim}{}}}
\NewDocumentEnvironment {pNiceArrayC} {O{} m O{}}
    {\left(
     \__nm_NiceArrayC:nn {#1,#3} {#2}}
    {\end{NiceArray}
     \right)
     \__nm_after_last_col:}

\NewDocumentEnvironment {vNiceArrayC} {O{} m O{}}
    {\left|
     \__nm_NiceArrayC:nn {#1,#3} {#2}}
    {\end{NiceArray}
     \right|
     \__nm_after_last_col:}

\NewDocumentEnvironment {VNiceArrayC} {O{} m O{}}
    {\left\|
     \__nm_NiceArrayC:nn {#1,#3} {#2}}
    {\end{NiceArray}
     \right\|
     \__nm_after_last_col:}

\NewDocumentEnvironment {bNiceArrayC} {O{} m O{}}
    {\left[
     \__nm_NiceArrayC:nn {#1,#3} {#2}}
    {\end{NiceArray}
     \right]
     \__nm_after_last_col:}

\NewDocumentEnvironment {BNiceArrayC} {O{} m O{}}
    {\left\{
     \__nm_NiceArrayC:nn {#1,#3} {#2}}
    {\end{NiceArray}
     \right\}
     \__nm_after_last_col:}
\endinput
%%
%% End of file `nicematrix.sty'.
