diff options
author | Karl Berry <karl@freefriends.org> | 2020-01-23 17:53:50 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-01-23 17:53:50 +0000 |
commit | 1611b583581d3f0327a05cd9c5633bcf4a9df9ed (patch) | |
tree | 687231459b386ee4b6ad90eb4575c52e1f4326ed /Master/texmf-dist/source/latex/nicematrix | |
parent | 300a47794120fb8337724ab100edb9ce9f793088 (diff) |
nicematrix (22jan20)
git-svn-id: svn://tug.org/texlive/trunk@53502 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/nicematrix')
-rw-r--r-- | Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx | 694 |
1 files changed, 425 insertions, 269 deletions
diff --git a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx index 9ccfc120b5d..bbbc805d70e 100644 --- a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx +++ b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx @@ -15,8 +15,8 @@ % % \fi % \iffalse -\def\myfileversion{3.9} -\def\myfiledate{2020/01/10} +\def\myfileversion{3.10} +\def\myfiledate{2020/01/22} % % %<*batchfile> @@ -77,6 +77,7 @@ c & c & b & a & e \usepackage{arydshln} \setlength{\columnseprule}{0.4pt} \usepackage{footnotehyper} +\usepackage{unicode-math} \parindent 0pt \EnableCrossrefs @@ -540,7 +541,7 @@ c & c & b & a & e % option is an alias for the conjonction of two options: % |renew-dots| and |renew-matrix|.\footnote{The options |renew-dots|, % |renew-matrix| and |transparent| can be fixed with the command -% |\NiceMatrixOptiosn| like the other options. However, they can also be fixed +% |\NiceMatrixOptions| like the other options. However, they can also be fixed % as options of the command |\usepackage| (it's an exception for these three % specific options.)} % @@ -585,7 +586,12 @@ c & c & b & a & e % \end{pmatrix}$ % \end{scope} % -% +% \subsection{Fine tuning of the dotted lines} +% +% The distance between a node and the end of a dotted line is set by +% |dotted-lines-margin|. The initial value of this key is $0.3$~em (it's +% recommended to use a unit dependant of the current font). For an example, +% cf.~p.~\pageref{permutation}. % % % \section{The Tikz nodes created by nicematrix} @@ -1326,8 +1332,9 @@ c & c & b & a & e % write |\Block{|$i$|-|$j$|}<>{<}| with the expected result. % % +% \section{Advanced features} % -% \section{The option small} +% \subsection{The option small} % % With the option |small|, the environments of the extension \pkg{nicematrix} % are composed in a way similar to the environment |{smallmatrix}| of the @@ -1372,7 +1379,7 @@ c & c & b & a & e % \item the characteristics of the dotted lines are also modified. % \end{itemize} % -% \section{The counters iRow and jCol} +% \subsection{The counters iRow and jCol} % % In the cells of the array, it's possible to use the LaTeX counters |iRow| and % |jCol| which represent the number of the current row and the number of the @@ -1429,7 +1436,7 @@ c & c & b & a & e % % $C = \pAutoNiceMatrix{3-3}{C_{\arabic{iRow},\arabic{jCol}}}$ % -% \section{The option hlines} +% \subsection{The option hlines} % % You can add horizontal rules between rows in the environments of % \pkg{nicematrix} with the usual command |\hline|. But, by convenience, the @@ -1450,7 +1457,44 @@ c & c & b & a & e % \end{BVerbatim} % \raise-5mm\box\ExampleOne % -% \section{Utilisation of the column type S of siunitx} +% \subsection{The option light-syntax} +% +% The option |light-syntax|\footnote{This option is inspired by the extension +% \pkg{spalign} of Joseph Rabinoff.} allow the user to compose the arrays with a +% lighter syntax, which gives a more readable TeX source. +% +% When this option is used, one should use the semicolon for the end of a row +% and a space to separate the columns. However, as usual in the TeX world, the +% spaces after a control sequence are discarded and the elements between curly +% braces are considered as a whole. +% +% \bigskip +% The following example has been composed with XeLaTeX with \pkg{unicode-math}, +% which allows the use of greek letters directly in the TeX source. +% +% \medskip +% \begin{scope} +% \def\alpha{$α$} +% \def\beta{$β$} +% \begin{BVerbatim}[baseline=c,boxwidth=10cm] +% $\begin{bNiceMatrix}[~emphase#light-syntax@,first-row,first-col] +% {} ~alpha ~beta ; +% ~alpha 2\cos ~alpha {\cos ~alpha + \cos ~beta} ; +% ~beta \cos ~alpha+\cos ~beta { 2 \cos ~beta } +% \end{bNiceMatrix}$ +% \end{BVerbatim} +% \end{scope} +% $\begin{bNiceMatrix}[light-syntax,first-row,first-col] +% {} α β ; +% α 2\cos α {\cos α + \cos β} ; +% β \cos α+\cos β { 2 \cos β } +% \end{bNiceMatrix}$ +% +% \medskip +% It's possible to change the character used to mark the end of rows with the +% option |end-of-row|. As said before, the initial value is a semicolon. +% +% \subsection{Utilisation of the column type S of siunitx} % % If the package \pkg{siunitx} is loaded (before or after \pkg{nicematrix}), % it's possible to use the |S| column type of \pkg{siunitx} in the environments @@ -1480,6 +1524,8 @@ c & c & b & a & e % On the other hand, the |d| columns of the package \pkg{dcolumn} are not % supported by \pkg{nicematrix}. % +% +% % \section{Technical remarks} % % \subsection{Definition of new column types} @@ -1571,7 +1617,7 @@ c & c & b & a & e % % The environments created by \pkg{nicematrix} are numbered by an internal % global counter. The command |\NiceMatrixLastEnv| provides the number of the -% last environment of \pkg{nicematrix} (for LaTeX, it's a —fully expandable— +% last environment of \pkg{nicematrix} (for LaTeX, it's a ``fully expandable'' % command and not a counter). % % For the environment of number~$n$, the node in row~$i$ and column~$j$ has the @@ -1850,11 +1896,13 @@ c & c & b & a & e % % \vspace{2cm} % -% A permutation matrix: +% A permutation matrix (as an example, we have raised the value of +% |dotted-lines-margin|). % +% \label{permutation} % \bigskip % \begin{BVerbatim}[baseline=c] -% $\begin{pNiceMatrix} +% $\begin{pNiceMatrix}[~emphase#dotted-lines-margin=0.6em@] % 0 & 1 & 0 & & \Cdots & 0 \\ % \Vdots & & & \Ddots & & \Vdots \\ % & & & \Ddots & & \\ @@ -1864,7 +1912,7 @@ c & c & b & a & e % \end{pNiceMatrix}$ % \end{BVerbatim} % \hspace{2.5cm} -% $\begin{pNiceMatrix} +% $\begin{pNiceMatrix}[dotted-lines-margin=0.6em] % 0 & 1 & 0 & & \Cdots & 0 \\ % \Vdots & & & \Ddots & & \Vdots \\ % & & & \Ddots & & \\ @@ -2147,14 +2195,14 @@ c & c & b & a & e % nodes of the second row with the Tikz library \pkg{fit}. This Tikz node is % filled after the construction of the matrix. In order to see the text % \emph{under} this node, we have to use transparency with the |blend mode| -% equal to |multiply|. Warning: some \textsc{pdf} readers are not able to render -% transparency correctly. +% equal to |multiply|. % % \tikzset{highlight/.style={rectangle, % fill=red!15, % blend mode = multiply, % rounded corners = 0.5 mm, -% inner sep=1pt}} +% inner sep=1pt, +% fit = #1}} % % \medskip % \begin{Verbatim} @@ -2162,16 +2210,17 @@ c & c & b & a & e % fill=red!15, % ~emphase#blend mode = multiply@, % rounded corners = 0.5 mm, -% inner sep=1pt}} +% inner sep=1pt, +% fit = ~#1}} % -% $\begin{bNiceMatrix}[~emphase#code-after = {\tikz \node[highlight, fit = (2-1) (2-3)] {} ;}@] +% $\begin{bNiceMatrix}[~emphase#code-after = {\tikz \node [highlight = (2-1) (2-3)] {} ;}@] % 0 & \Cdots & 0 \\ % 1 & \Cdots & 1 \\ % 0 & \Cdots & 0 % \end{bNiceMatrix}$ % \end{Verbatim} % -% \[\begin{bNiceMatrix}[code-after = {\tikz \node[highlight, fit = (2-1) (2-3)] {} ;}] +% \[\begin{bNiceMatrix}[code-after = {\tikz \node [highlight = (2-1) (2-3)] {} ;}] % 0 & \Cdots & 0 \\ % 1 & \Cdots & 1 \\ % 0 & \Cdots & 0 @@ -2223,30 +2272,33 @@ c & c & b & a & e % technique three times. % % \begin{Verbatim} -% \tikzset{myoptions/.style={remember picture, -% overlay, -% name prefix = example-, -% every node/.style = {fill = red!15, -% blend mode = multiply, -% inner sep = 0pt}}} +% \tikzset{mes-options/.style={remember picture, +% overlay, +% name prefix = exemple-, +% highlight/.style = {fill = red!15, +% blend mode = multiply, +% inner sep = 0pt, +% fit = ~#1}}} % \end{Verbatim} % % -% \tikzset{myoptions/.style={remember picture, -% overlay, -% name prefix = example-, -% every node/.style = {fill = red!15, -% blend mode = multiply, -% inner sep = 0pt}}} +% \tikzset{mes-options/.style={remember picture, +% overlay, +% name prefix = exemple-, +% highlight/.style = {fill = red!15, +% blend mode = multiply, +% inner sep = 0pt, +% fit = #1}}} % % \begin{Verbatim} -% \begin{tikzpicture}[myoptions] -% \node [fit = (1-1) (1-3)] {} ; -% \node [fit = (2-1) (2-3)] {} ; -% \node [fit = (3-1) (3-3)] {} ; +% \begin{tikzpicture}[mes-options] +% \node [highlight = (1-1) (1-3)] {} ; +% \node [highlight = (2-1) (2-3)] {} ; +% \node [highlight = (3-1) (3-3)] {} ; % \end{tikzpicture} % \end{Verbatim} % +% % \medskip % We obtain the following matrix. % @@ -2269,10 +2321,10 @@ c & c & b & a & e % nodes'' instead of the ``normal nodes''. % % \begin{Verbatim} -% \begin{tikzpicture}[myoptions, ~emphase#name suffix = -medium@] -% \node [fit = (1-1) (1-3)] {} ; -% \node [fit = (2-1) (2-3)] {} ; -% \node [fit = (3-1) (3-3)] {} ; +% \begin{tikzpicture}[mes-options, ~emphase#name suffix = -medium@] +% \node [highlight = (1-1) (1-3)] {} ; +% \node [highlight = (2-1) (2-3)] {} ; +% \node [highlight = (3-1) (3-3)] {} ; % \end{tikzpicture} % \end{Verbatim} % @@ -2282,19 +2334,21 @@ c & c & b & a & e % \[\begin{pNiceArray}{CCC}[ % last-col, % create-medium-nodes, -% code-after = {\begin{tikzpicture}[every node/.style = {fill = red!15, -% blend mode = multiply, -% inner sep = 0pt}, +% code-after = {\begin{tikzpicture}[highlight/.style = {fill = red!15, +% blend mode = multiply, +% inner sep = 0pt, +% fit = #1}, % name suffix = -medium] -% \node [fit = (1-1) (1-3)] {} ; -% \node [fit = (2-1) (2-3)] {} ; -% \node [fit = (3-1) (3-3)] {} ; +% \node [highlight = (1-1) (1-3)] {} ; +% \node [highlight = (2-1) (2-3)] {} ; +% \node [highlight = (3-1) (3-3)] {} ; % \end{tikzpicture}}] -% a & a + b & a + b + c & L_1\\ +% a & a + b & a + b + c & L_1 \\ % a & a & a + b & L_2 \\ % a & a & a & L_3 % \end{pNiceArray}\] % +% % % \vspace{1cm} % @@ -2403,8 +2457,8 @@ c & c & b & a & e % % \begin{Verbatim} % \begin{tikzpicture}[remember picture, overlay] -% \node [highlight, fit = (A-3-1) (A-3-5) ] {} ; -% \node [highlight, fit = (B-1-3) (B-5-3) ] {} ; +% \node [highlight = (A-3-1) (A-3-5) ] {} ; +% \node [highlight = (B-1-3) (B-5-3) ] {} ; % \draw [color = gray] (A-3-3) to [bend left] (B-3-3) ; % \end{tikzpicture} % \end{Verbatim} @@ -2442,8 +2496,8 @@ c & c & b & a & e % \end{NiceMatrixBlock} % % \begin{tikzpicture}[remember picture, overlay] -% \node [highlight, fit = (A-3-1) (A-3-5) ] {} ; -% \node [highlight, fit = (B-1-3) (B-5-3) ] {} ; +% \node [highlight = (A-3-1) (A-3-5) ] {} ; +% \node [highlight = (B-1-3) (B-5-3) ] {} ; % \draw [color = gray] (A-3-3) to [bend left] (B-3-3) ; % \end{tikzpicture} % @@ -2473,13 +2527,14 @@ c & c & b & a & e % % \subsection{Declaration of the package and extensions loaded} % +%<@@=nicematrix> +% +% \bigskip % First, \pkg{tikz} and the Tikz library |fit| are loaded before the % |\ProvidesExplPackage|. They are loaded this way because |\usetikzlibrary| in % |expl3| code fails.\footnote{cf. % |tex.stackexchange.com/questions/57424/using-of-usetikzlibrary-in-an-expl3-package-fails|} % -%<@@=nicematrix> -% % \begin{macrocode} \RequirePackage{tikz} \usetikzlibrary{fit} @@ -2692,6 +2747,7 @@ c & c & b & a & e { } } % \end{macrocode} +% % % \bigskip % The length |\l_@@_inter_dots_dim| is the distance between two dots for the @@ -2701,6 +2757,18 @@ c & c & b & a & e \dim_new:N \l_@@_inter_dots_dim \dim_set:Nn \l_@@_inter_dots_dim { 0.45 em } % \end{macrocode} +% +% \bigskip +% The length |\l_@@_dotted_lines_margin_dim| is the minimal distance between a +% node (in fact an anchor of that node) and a dotted line (we say ``minimal'' +% because, by definition, a dotted line is not a continuous line and, therefore, +% this distance may vary a little). +% \begin{macrocode} +\dim_new:N \l_@@_dotted_lines_margin_dim +\dim_set:Nn \l_@@_dotted_lines_margin_dim { 0.3 em } +% \end{macrocode} +% +% \bigskip % The length |\l_@@_radius_dim| is the radius of the dots for the dotted lines. % The default value is 0.34~pt but it will be changed if the option |small| is % used. @@ -2940,13 +3008,17 @@ c & c & b & a & e } } % \end{macrocode} -% -% +% +% % \bigskip % \subsection{The options} % -% -% +% The boolean |\l_@@_light_syntax_bool| corresponds to the option |light-syntax|. +% \begin{macrocode} +\bool_new:N \l_@@_light_syntax_bool +% \end{macrocode} +% +% \bigskip % The token list |\l_@@_pos_env_str| will contain one of the three values |t|, % |c| or |b| and will indicate the position of the environment as in the option % of the environment |{array}|. For the environment |{pNiceMatrix}|, @@ -3038,18 +3110,36 @@ c & c & b & a & e \dim_new:N \l_@@_extra_right_margin_dim % \end{macrocode} % +% \medskip +% The token list |\l_@@_end_of_row_tl| corresponds to the option |end-of-row|. +% It specifies the symbol used to mark the ends of rows when the light syntax is +% used. +% \begin{macrocode} +\tl_new:N \l_@@_end_of_row_tl +\tl_set:Nn \l_@@_end_of_row_tl { ; } +% \end{macrocode} % -% +% % \bigskip % First, we define a set of keys ``|NiceMatrix / Global|'' which will be used % (with the mechanism of |.inherit:n|) by other sets of keys. % \begin{macrocode} \keys_define:nn { NiceMatrix / Global } { + dotted-lines-margin .dim_set:N = \l_@@_dotted_lines_margin_dim , + dotted-lines-margin .value_required:n = true , + light-syntax .bool_set:N = \l_@@_light_syntax_bool , + light-syntax .default:n = true , + end-of-row .tl_set:N = \l_@@_end_of_row_tl , + end-of-row .value_required:n = true , code-for-first-col .tl_set:N = \l_@@_code_for_first_col_tl , + code-for-first-col .value_required:n = true , code-for-last-col .tl_set:N = \l_@@_code_for_last_col_tl , + code-for-last-col .value_required:n = true , code-for-first-row .tl_set:N = \l_@@_code_for_first_row_tl , + code-for-first-row .value_required:n = true , code-for-last-row .tl_set:N = \l_@@_code_for_last_row_tl , + code-for-last-row .value_required:n = true , small .bool_set:N = \l_@@_small_bool , hlines .bool_set:N = \l_@@_hlines_bool , parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool , @@ -3061,6 +3151,7 @@ c & c & b & a & e % |\Vdots| and |\Ddots|. % \begin{macrocode} renew-dots .bool_set:N = \l_@@_renew_dots_bool , + renew-dots .value_forbidden:n = true , nullify-dots .bool_set:N = \l_@@_nullify_dots_bool , % \end{macrocode} % @@ -3081,21 +3172,7 @@ c & c & b & a & e extra-left-margin .dim_set:N = \l_@@_extra_left_margin_dim , extra-right-margin .dim_set:N = \l_@@_extra_right_margin_dim , extra-margin .meta:n = - { extra-left-margin = #1 , extra-right-margin = #1 } , -% \end{macrocode} -% The following lines are the properties |.value_required:n| and -% |.value_forbidden:n| or the keys. These properties have no effect because they -% are not transmitted by inheritance (unfortunately). We maintain these lines in -% the \textsc{dtx} only for the case of a modification of |l3keys|. -% -% \begin{macrocode} -%<*comment> - code-for-first-col .value_required:n = true , - code-for-last-col .value_required:n = true , - code-for-first-row .value_required:n = true , - code-for-last-row .value_required:n = true , - renew-dots .value_forbidden:n = true , -%</comment> + { extra-left-margin = #1 , extra-right-margin = #1 } } % \end{macrocode} % @@ -3109,6 +3186,7 @@ c & c & b & a & e \str_if_eq:nnTF { #1 } { auto } { \bool_set_true:N \l_@@_auto_columns_width_bool } { \dim_set:Nn \l_@@_columns_width_dim { #1 } } , + columns-width .value_required:n = true , name .code:n = \unless \ifmeasuring@ \str_set:Nn \l_tmpa_str { #1 } @@ -3117,26 +3195,17 @@ c & c & b & a & e { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str } \str_set_eq:NN \l_@@_name_str \l_tmpa_str \fi , + name .value_required:n = true , code-after .tl_gset:N = \g_@@_code_after_tl , + code-after .value_required:n = true , first-col .code:n = \int_zero:N \l_@@_first_col_int , first-row .code:n = \int_zero:N \l_@@_first_row_int , last-row .int_set:N = \l_@@_last_row_int , last-row .default:n = -1 , -% \end{macrocode} -% The following lines are the properties |.value_required:n| and -% |.value_forbidden:n| or the keys. These properties have no effect because they -% are not transmitted by inheritance (unfortunately). We maintain these lines in -% the \textsc{dtx} only for the case of a modification of |l3keys|. -% -% \begin{macrocode} -%<*comment> - columns-width .value_required:n = true , - name .value_required:n = true , - code-after .value_required:n = true , -%</comment> } % \end{macrocode} -% +% +% % \bigskip % We begin the construction of the major sets of keys (used by the different % user commands and environments). @@ -3181,13 +3250,10 @@ c & c & b & a & e % \begin{macrocode} renew-matrix .code:n = \@@_renew_matrix: , renew-matrix .value_forbidden:n = true , - RenewMatrix .code:n = \@@_error:n { Option~RenewMatrix~suppressed } - \@@_renew_matrix: , + RenewMatrix .code:n = \@@_error:n { Option~RenewMatrix~suppressed } , transparent .meta:n = { renew-dots , renew-matrix } , transparent .value_forbidden:n = true, - Transparent .code:n = \@@_error:n { Option~Transparent~suppressed } - \@@_renew_matrix: - \bool_set_true:N \l_@@_renew_dots_bool , + Transparent .code:n = \@@_error:n { Option~Transparent~suppressed } , % \end{macrocode} % % @@ -3296,7 +3362,7 @@ c & c & b & a & e % be used without value because the number of columns of the array can be read % in the preamble of the array. % \begin{macrocode} - last-col .code:n = \tl_if_empty:nF {#1} + last-col .code:n = \tl_if_empty:nF { #1 } { \@@_error:n { last-col~non~empty~for~NiceArray } } \int_zero:N \l_@@_last_col_int , unknown .code:n = \@@_error:n { Unknown~option~for~NiceArray } @@ -3359,12 +3425,9 @@ c & c & b & a & e % % We will call \emph{corners} of the matrix the cases which are at the % intersection of the exterior rows and exterior columns (of course, the four -% corners doesn't always exist simultaneously). In a corner of the matrix, it -% would be logical to use none of the codes |\l_@@_code_for_first_row_tl| and -% \emph{al}. As for now, this result is acheived only for the north-west corner -% (this allows an automatic numerotation of the rows ans the columns with |iRow| -% and |jCol| with the first col and the first row --- probably the preferential -% choice for such a numerotation). +% corners doesn't always exist simultaneously). The codes +% |\l_@@_code_for_first_row_tl| and \emph{al} don't apply in the corners of the +% matrix. % \begin{macrocode} \int_compare:nNnTF \c@iRow = \c_zero_int { \int_compare:nNnT \c@jCol > \c_zero_int \l_@@_code_for_first_row_tl } @@ -3483,63 +3546,34 @@ c & c & b & a & e \cs_new_protected:Nn \@@_renewcolumntype:nn { \newcolumntype #1 [ 2 ] - { - > { + { + > { \hbox_set:Nw \l_tmpa_box - \@@_Cell: + \_@@_Cell: } c - < { - \@@_end_Cell: + < { + \_@@_end_Cell: \hbox_set_end: - #2 - \hbox_set:Nn \l_tmpb_box - { \makebox [ ##2 ] [ ##1 ] { \box_use:N \l_tmpa_box } } - \dim_set:Nn \l_tmpa_dim { \box_dp:N \l_tmpb_box } - \box_move_down:nn \l_tmpa_dim - { - \vbox:n - { - \hbox_to_wd:nn { \box_wd:N \l_tmpb_box } - { - \hfil - \tikz [ remember~picture , overlay ] - \coordinate (@@~north~east) ; - } - \hbox:n - { - \tikz [ remember~picture , overlay ] - \coordinate (@@~south~west) ; - \box_move_up:nn \l_tmpa_dim { \box_use:N \l_tmpb_box } - } - } - } -% \end{macrocode} -% The |w|-node is created using the Tikz library |fit| after construction of the -% nodes |(@@~south~west)| and |(@@~north~east)|. It's not possible to construct -% by a standard |node| instruction because such a construction give an erroneous -% result with some engines (|XeTeX|, |LuaTeX|) although the result is good with -% |pdflatex| (why?). -% \begin{macrocode} - \tikz [ remember~picture , overlay ] - \node + #2 + \tikz [ remember~picture ] + \node [ - node~contents = { } , name = nm - \int_use:N \g_@@_env_int - \int_use:N \c@iRow - \int_use:N \c@jCol - w, - alias = + alias = \str_if_empty:NF \l_@@_name_str - { + { \l_@@_name_str - \int_use:N \c@iRow - - \int_use:N \c@jCol - w + \int_use:N \c@jCol - w } , inner~sep = \c_zero_dim , - fit = (@@~south~west) (@@~north~east) - ] + ] + { \makebox [ ##2 ] [ ##1 ] { \box_use:N \l_tmpa_box } } ; - } + } } } % \end{macrocode} @@ -4012,8 +4046,8 @@ c & c & b & a & e } % \end{macrocode} % -% The code in |\@@_pre_array:| is common to |{NiceArrayWithDelims}| and -% |{NiceMatrix}|. +% The code in |\@@_pre_array:| is used only by |{NiceArrayWithDelims}|. It +% exists only for historical reasons. We should change that. % \begin{macrocode} \@@_pre_array: % \end{macrocode} @@ -4036,7 +4070,6 @@ c & c & b & a & e \c_math_toggle_token \left #1 \vcenter to 3 cm { } \right. \c_math_toggle_token - } \dim_gset:Nn \g_@@_left_delim_dim { \box_wd:N \l_tmpa_box } \hbox_set:Nn \l_tmpa_box @@ -4089,119 +4122,28 @@ c & c & b & a & e \skip_horizontal:n \l_@@_left_margin_dim \skip_horizontal:n \l_@@_extra_left_margin_dim \c_math_toggle_token -% \end{macrocode} -% Here is the call to |\array| (we have a dedicated macro |\@@_array:| because -% of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}). -% \begin{macrocode} - \exp_args:NV \@@_array: \l_tmpa_tl + \bool_if:NTF \l_@@_light_syntax_bool + { \begin { @@-light-syntax } } + { \begin { @@-normal-syntax } } } % \end{macrocode} % -% \bigskip -% We begin the second part of the environment |{NiceArrayWithDelims}|. If all -% the columns must have the same width (if the user has used the option -% |columns-width| or the option |auto-column-width| of the environment -% |{NiceMatrixBlock}|), we add a row in the array to fix the width of the -% columns and construct the ``|col|'' nodes |nm-|\textsl{a}|-col-|\textsl{j} -% (these nodes will be used by the horizontal open dotted lines and by the -% commands |\@@_vdottedline:n|). % % \begin{macrocode} - { - \bool_if:nT - { - \l_@@_auto_columns_width_bool - || \dim_compare_p:nNn \l_@@_columns_width_dim > \c_zero_dim - } - { - \crcr - \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & } - \omit -% \end{macrocode} -% First, we put a ``|col|'' node on the left of the first column (of course, we -% have to do that \emph{after} the |\omit|). -% \begin{macrocode} - \skip_horizontal:N \arraycolsep - \tikz [ remember~picture , overlay ] - \coordinate [ name = nm - \int_use:N \g_@@_env_int - col - 0 ] ; - \skip_horizontal:n { - \arraycolsep } -% \end{macrocode} -% We compute in |\g_tmpa_dim| the common width of the columns. We use a global -% variable because we are in a cell of an |\halign| and because we have to use this -% variable in other cells (of the same row). The affectation of |\g_tmpa_dim|, -% like all the affectations, must be done after the |\omit| of the cell. -% \begin{macrocode} - \bool_if:nTF - { - \l_@@_auto_columns_width_bool - && ! \l_@@_block_auto_columns_width_bool - } - { - \dim_gset:Nn \g_tmpa_dim - { \g_@@_max_cell_width_dim + 2 \arraycolsep } - } - { - \dim_gset:Nn \g_tmpa_dim - { \l_@@_columns_width_dim + 2 \arraycolsep } - } - \skip_horizontal:N \g_tmpa_dim - \tikz [ remember~picture , overlay ] - \coordinate [ name = nm - \int_use:N \g_@@_env_int - col - 1 ] ; -% \end{macrocode} -% We begin a loop over the columns. The integer |\g_tmpa_int| will be the -% number of the current column. This integer is not used to fix the -% width of the column (since all the columns have the same width equal to -% |\g_@@_tmpa_dim|) but for the Tikz nodes. -% \begin{macrocode} - \int_gset:Nn \g_tmpa_int 1 - \bool_if:nTF \g_@@_last_col_found_bool - { \prg_replicate:nn { \g_@@_col_total_int - 3 } } - { \prg_replicate:nn { \g_@@_col_total_int - 2 } } - { - & - \omit -% \end{macrocode} -% The incrementation of the counter |\g_tmpa_int| must be done after the |\omit| -% of the cell. -% \begin{macrocode} - \int_gincr:N \g_tmpa_int - \skip_horizontal:N \g_tmpa_dim -% \end{macrocode} -% We create a ``|col|'' node on the right of the current column. -% \begin{macrocode} - \tikz [ remember~picture , overlay ] - \coordinate - [ - name = nm - \int_use:N \g_@@_env_int - - col - \int_use:N \g_tmpa_int - ] ; - } -% \end{macrocode} -% For the last column, we want a special treatment because of the final -% |\arraycolsep|. -% \begin{macrocode} - & - \omit - \int_gincr:N \g_tmpa_int - \skip_horizontal:N \g_tmpa_dim - \skip_horizontal:n { - \arraycolsep } - \tikz [ remember~picture , overlay ] - \coordinate - [ - name = nm - \int_use:N \g_@@_env_int - - col - \int_use:N \g_tmpa_int - ] ; - \skip_horizontal:N \arraycolsep - } - \endarray + { + \bool_if:NTF \l_@@_light_syntax_bool + { \end { @@-light-syntax } } + { \end { @@-normal-syntax } } \c_math_toggle_token \skip_horizontal:n \l_@@_right_margin_dim \skip_horizontal:n \l_@@_extra_right_margin_dim \hbox_set_end: % \end{macrocode} -% +% Now, the box containing the array is constructed (in |\l_@@_the_array_box|). +% However, we have some computations to do before inserting that box in the TeX +% flow (mainly because the exterior columns are in overlapping positions). +% % \bigskip -% % \begin{macrocode} \int_compare:nNnT \l_@@_last_row_int > { -2 } { @@ -4216,7 +4158,6 @@ c & c & b & a & e } % \end{macrocode} % -% % Now, we compute |\l_tmpa_dim| which is the vertical dimension of the ``first % row'' above the array (when the key |first-row| is used). % \begin{macrocode} @@ -4338,6 +4279,195 @@ c & c & b & a & e % % % \interitem +% The construction of the array in the environment |{NiceArrayWithDelims}| is, +% in fact, done by the environment |{@@-light-syntax}| or by the environment +% |{@@-normal-syntax}| (whether the option |light-syntax| is used or not). When +% the key |light-syntax| is not used, the construction is a standard +% environment (and, thus, it's possible to use verbatim in the arrray). +% \begin{macrocode} +\NewDocumentEnvironment { @@-normal-syntax } { } +% \end{macrocode} +% Here is the call to |\array| (we have a dedicated macro |\@@_array:| because +% of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}). +% \begin{macrocode} + { \exp_args:NV \@@_array: \l_tmpa_tl } + { +% \end{macrocode} +% +% If all the columns must have the same width (if the user has used the option +% |columns-width| or the option |auto-column-width| of the environment +% |{NiceMatrixBlock}|), we will add a row in the array to fix the width of the +% columns and construct the ``|col|'' nodes |nm-|\textsl{a}|-col-|\textsl{j} +% (these nodes will be used by the horizontal open dotted lines and by the +% commands |\@@_vdottedline:n|). We have written a dedicated function for that job. +% \begin{macrocode} + \@@_create_row_of_col_nodes: + \endarray + } +% \end{macrocode} +% +% +% \bigskip +% When the key |light-syntax| is used, we use an environment which takes its whole +% body as an argument (with the specifier |b| of \pkg{xparse}). +% \begin{macrocode} +\NewDocumentEnvironment { @@-light-syntax } { b } + { +% \end{macrocode} +% Here is the call to |\array| (we have a dedicated macro |\@@_array:| because +% of compatibility with the classes \cls{revtex4-1} and \cls{revtex4-2}). +% \begin{macrocode} + \exp_args:NV \@@_array: \l_tmpa_tl +% \end{macrocode} +% The body of the environment, which is stored in the argument |#1|, is now +% splitted into items (and \emph{not} tokens) +% \begin{macrocode} + \seq_gclear_new:N \g_@@_rows_seq + \tl_set_rescan:Nno \l_@@_end_of_row_tl { } \l_@@_end_of_row_tl + \exp_args:NNV \seq_gset_split:Nnn \g_@@_rows_seq \l_@@_end_of_row_tl { #1 } +% \end{macrocode} +% We need a global affectation because, when executing |\l_tmpa_tl|, we will +% exit the first cell of the array. +% \begin{macrocode} + \seq_gpop_left:NN \g_@@_rows_seq \l_tmpa_tl + \exp_args:NV \@@_line_with_light_syntax_i:n \l_tmpa_tl + \seq_map_function:NN \g_@@_rows_seq \@@_line_with_light_syntax:n + \@@_create_row_of_col_nodes: + \endarray + } +% \end{macrocode} +% Now, the second part of the environment. It is empty. That's not surprising +% because we have caught the whole body of the environment with the specifier +% |b| provided by \pkg{xparse}. +% \begin{macrocode} + { } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_line_with_light_syntax_i:n #1 + { + \seq_gclear_new:N \g_@@_cells_seq + \seq_gset_split:Nnn \g_@@_cells_seq { ~ } { #1 } + \seq_gpop_left:NN \g_@@_cells_seq \l_tmpa_tl + \l_tmpa_tl + \seq_map_function:NN \g_@@_cells_seq \@@_cell_with_light_syntax:n + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_line_with_light_syntax:n #1 + { + \tl_if_empty:nF { #1 } + { \\ \@@_line_with_light_syntax_i:n { #1 } } + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new_protected:Npn \@@_cell_with_light_syntax:n #1 { & #1 } +% \end{macrocode} +% +% \bigskip +% The command |\@@_create_row_of_col_nodes:| will construct the potential last +% row. That last row (when it is created) is a false row used to fix the width +% of the columns (when the array is constructed with an option whhich specify +% the width of the columns) and create the |col|-nodes (that nodes will be used +% by |\vdottedline| for instance). +% \begin{macrocode} +\cs_new:Npn \@@_create_row_of_col_nodes: + { + \bool_if:nT + { + \l_@@_auto_columns_width_bool + || \dim_compare_p:nNn \l_@@_columns_width_dim > \c_zero_dim + } + { + \crcr + \int_compare:nNnT \l_@@_first_col_int = 0 { \omit & } + \omit +% \end{macrocode} +% First, we put a ``|col|'' node on the left of the first column (of course, we +% have to do that \emph{after} the |\omit|). +% \begin{macrocode} + \skip_horizontal:N \arraycolsep + \tikz [ remember~picture , overlay ] + \coordinate [ name = nm - \int_use:N \g_@@_env_int - col - 0 ] ; + \skip_horizontal:n { - \arraycolsep } +% \end{macrocode} +% We compute in |\g_tmpa_dim| the common width of the columns. We use a global +% variable because we are in a cell of an |\halign| and because we have to use this +% variable in other cells (of the same row). The affectation of |\g_tmpa_dim|, +% like all the affectations, must be done after the |\omit| of the cell. +% \begin{macrocode} + \bool_if:nTF + { + \l_@@_auto_columns_width_bool + && ! \l_@@_block_auto_columns_width_bool + } + { + \dim_gset:Nn \g_tmpa_dim + { \g_@@_max_cell_width_dim + 2 \arraycolsep } + } + { + \dim_gset:Nn \g_tmpa_dim + { \l_@@_columns_width_dim + 2 \arraycolsep } + } + \skip_horizontal:N \g_tmpa_dim + \tikz [ remember~picture , overlay ] + \coordinate [ name = nm - \int_use:N \g_@@_env_int - col - 1 ] ; +% \end{macrocode} +% We begin a loop over the columns. The integer |\g_tmpa_int| will be the +% number of the current column. This integer is not used to fix the +% width of the column (since all the columns have the same width equal to +% |\g_@@_tmpa_dim|) but for the Tikz nodes. +% \begin{macrocode} + \int_gset:Nn \g_tmpa_int 1 + \bool_if:nTF \g_@@_last_col_found_bool + { \prg_replicate:nn { \g_@@_col_total_int - 3 } } + { \prg_replicate:nn { \g_@@_col_total_int - 2 } } + { + & + \omit +% \end{macrocode} +% The incrementation of the counter |\g_tmpa_int| must be done after the |\omit| +% of the cell. +% \begin{macrocode} + \int_gincr:N \g_tmpa_int + \skip_horizontal:N \g_tmpa_dim +% \end{macrocode} +% We create a ``|col|'' node on the right of the current column. +% \begin{macrocode} + \@@_create_col_node: + } +% \end{macrocode} +% For the last column, we want a special treatment because of the final +% |\arraycolsep|. +% \begin{macrocode} + & + \omit + \int_gincr:N \g_tmpa_int + \skip_horizontal:N \g_tmpa_dim + \skip_horizontal:n { - \arraycolsep } + \@@_create_col_node: + \skip_horizontal:N \arraycolsep + } + } +% \end{macrocode} +% +% \bigskip +% \begin{macrocode} +\cs_new_protected:Npn \@@_create_col_node: + { + \tikz [ remember~picture , overlay ] + \coordinate + [ + name = nm - \int_use:N \g_@@_env_int - + col - \int_use:N \g_tmpa_int + ] ; + } +% \end{macrocode} +% +% +% \interitem % Here is the preamble for the ``first column'' (if the user uses the key % |first-col|) % \begin{macrocode} @@ -4853,8 +4983,8 @@ c & c & b & a & e \bool_if:nTF \g_@@_medium_nodes_bool { \bool_if:NTF \g_@@_large_nodes_bool - \@@_create_medium_and_large_nodes: - \@@_create_medium_nodes: + \@@_create_medium_and_large_nodes: + \@@_create_medium_nodes: } { \bool_if:NT \g_@@_large_nodes_bool \@@_create_large_nodes: } \int_zero_new:N \l_@@_initial_i_int @@ -4926,11 +5056,11 @@ c & c & b & a & e % a & a+b & a+b+c % \end{pNiceMatrix}\] % For a closed extremity, we use the normal node and for a open one, we use the -% ``medium node'' or, if it exists, the |w|~node. +% ``medium node'' or, if it exists, the |w|-node. % \[ \begin{pNiceMatrix}[create-medium-nodes, % code-after = {\begin{tikzpicture} -% \node [highlight, fit={(2-1)}] {} ; -% \node [highlight, fit={(2-3-medium)}] {}; +% \node [highlight = (2-1)] {} ; +% \node [highlight = (2-3-medium) ] {}; % \end{tikzpicture} % }] % a+b+c & a+b & a\\ @@ -5149,7 +5279,7 @@ c & c & b & a & e % \end{macrocode} % If we have at least one open extremity, we create the ``medium nodes'' in the % matrix\footnote{We should change this. Indeed, for an open extremity of an -% \emph{horizontal} dotted line, we use the |w|~node, if, it exists, and not the +% \emph{horizontal} dotted line, we use the |w|-node, if, it exists, and not the % ``medium node''.}. We remind that, when used once, the command % |\@@_create_medium_nodes:| becomes no-op in the current TeX group. % \begin{macrocode} @@ -5264,7 +5394,7 @@ c & c & b & a & e \bool_if:NTF \l_@@_initial_open_bool { % \end{macrocode} -% If a |w| node exists we use the |w| node for the extremity. +% If a |w|-node exists we use the |w|-node for the extremity. % \begin{macrocode} \cs_if_exist:cTF { @@ -5606,18 +5736,30 @@ c & c & b & a & e } { \int_set:Nn \l_tmpa_int - { \dim_ratio:nn { \l_@@_l_dim - 0.3 em } \l_@@_inter_dots_dim } + { + \dim_ratio:nn + { \l_@@_l_dim - \l_@@_dotted_lines_margin_dim } + \l_@@_inter_dots_dim + } } } { \bool_if:NTF \l_@@_final_open_bool { \int_set:Nn \l_tmpa_int - { \dim_ratio:nn { \l_@@_l_dim - 0.3 em } \l_@@_inter_dots_dim } + { + \dim_ratio:nn + { \l_@@_l_dim - \l_@@_dotted_lines_margin_dim } + \l_@@_inter_dots_dim + } } { \int_set:Nn \l_tmpa_int - { \dim_ratio:nn { \l_@@_l_dim - 0.6 em } \l_@@_inter_dots_dim} + { + \dim_ratio:nn + { \l_@@_l_dim - ( \l_@@_dotted_lines_margin_dim * 2 ) } + \l_@@_inter_dots_dim + } } } % \end{macrocode} @@ -6217,7 +6359,7 @@ c & c & b & a & e \int_compare:nNnF \c@iRow = \c_zero_int { \int_compare:nNnF \c@iRow = \l_@@_last_row_int - \@@_vline_i: + \@@_vline_i: } } } @@ -6440,12 +6582,12 @@ c & c & b & a & e { \begin { tikzpicture } [ remember~picture , overlay ] \@@_computations_for_medium_nodes: + \tikzset { name~suffix = -medium } % \end{macrocode} % Now, we can create the ``medium nodes''. We use a command |\@@_create_nodes:| % because this command will also be used for the creation of the ``large nodes'' % (after changing the value of |name-suffix|). % \begin{macrocode} - \tikzset { name~suffix = -medium } \@@_create_nodes: \end { tikzpicture } \cs_set_protected:Npn \@@_create_medium_nodes: { } @@ -6484,6 +6626,7 @@ c & c & b & a & e { \begin { tikzpicture } [ remember~picture , overlay ] \@@_computations_for_medium_nodes: +% \end{macrocode} % Now, we can create the ``medium nodes''. We use a command |\@@_create_nodes:| % because this command will also be used for the creation of the ``large nodes'' % (after changing the value of |name-suffix|). @@ -6944,6 +7087,7 @@ c & c & b & a & e % \subsection{Error messages of the package} % % +% % \begin{macrocode} \@@_msg_new:nn { unknown~cell~for~line~in~code-after } { @@ -7025,7 +7169,7 @@ c & c & b & a & e \@@_msg_new:nn { Option~Transparent~suppressed } { The~option~'Transparent'~has~been~renamed~'transparent'.\\ - However,~you~can~go~on~for~this~time. + If~you~go~on~this~command~will~be~ignored. } % \end{macrocode} % @@ -7033,7 +7177,7 @@ c & c & b & a & e \@@_msg_new:nn { Option~RenewMatrix~suppressed } { The~option~'RenewMatrix'~has~been~renamed~'renew-matrix'.\\ - However,~you~can~go~on~for~this~time. + If~you~go~on~this~command~will~be~ignored. } % \end{macrocode} % @@ -7064,16 +7208,19 @@ c & c & b & a & e create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ + dotted-lines-margin,~ + end-of-row,~ exterior-arraycolsep,~ hlines,~ left-margin,~ letter-for-dotted-lines,~ + light-syntax,~ nullify-dots,~ parallelize-diags,~ renew-dots,~ renew-matrix,~ right-margin,~ - small~ + small,~ and~transparent } % \end{macrocode} @@ -7099,6 +7246,8 @@ c & c & b & a & e create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ + dotted-lines-margin,~ + end-of-row,~ extra-left-margin,~ extra-right-margin,~ first-col,~ @@ -7107,12 +7256,13 @@ c & c & b & a & e last-col,~ last-row,~ left-margin,~ + light-syntax,~ name,~ nullify-dots,~ parallelize-diags,~ renew-dots,~ right-margin,~ - small~ + small,~ and~t. } % \end{macrocode} @@ -7140,6 +7290,8 @@ c & c & b & a & e create-extra-nodes,~ create-medium-nodes,~ create-large-nodes,~ + dotted-lines-margin,~ + end-of-row,~ extra-left-margin,~ extra-right-margin,~ first-col,~ @@ -7148,26 +7300,25 @@ c & c & b & a & e last-col,~ last-row,~ left-margin,~ + light-syntax,~ name,~ nullify-dots,~ parallelize-diags,~ renew-dots,~ - right-margin~ + right-margin,~ and~small. } % \end{macrocode} % -% The following message should be changed because, normally, there can be any -% longer artefact in the environments of \pkg{amsmath}. +% % \begin{macrocode} \@@_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~use~nicematrix~inside~some~ - environments~of~amsmath,~this~error~may~be~an~artefact.~In~this~case,~ - use~the~option~'allow-duplicate-names'.\\ + if~you~use~'columns-width=auto'.~If~you~don't~want~to~see~this~ + message~again,~use~the~option~'allow-duplicate-names'.\\ For~a~list~of~the~names~already~used,~type~H~<return>. \\ } { @@ -7582,15 +7733,20 @@ c & c & b & a & e % % New options |create-medium-nodes| and |create-large-nodes|. % +% \subsection*{Changes between version 3.9 and 3.10} +% +% New option |light-syntax| (and |end-of-row|). +% +% New option |dotted-lines-margin| for fine tuning of the dotted lines. +% % \PrintIndex % % \tableofcontents -% \endinput % +% \endinput % Local Variables: % TeX-fold-mode: t % TeX-fold-preserve-comments: nil -% ispell-local-dictionary: english % fill-column: 80 % End: |