summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/nicematrix/nicematrix.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/nicematrix/nicematrix.dtx')
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix.dtx694
1 files changed, 425 insertions, 269 deletions
diff --git a/macros/latex/contrib/nicematrix/nicematrix.dtx b/macros/latex/contrib/nicematrix/nicematrix.dtx
index 9ccfc120b5..bbbc805d70 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.dtx
+++ b/macros/latex/contrib/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: