diff options
author | Karl Berry <karl@freefriends.org> | 2018-05-01 17:57:18 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-05-01 17:57:18 +0000 |
commit | 08ba64265f0add4eebf9496610c9e49d0470734f (patch) | |
tree | 92b9355bf2e6cf89f8ed82269a42290cb986d9cc | |
parent | 0f529fdea1a21b9f20b3f03d2919d8f07dfcdb4e (diff) |
nicematrix (16apr18)
git-svn-id: svn://tug.org/texlive/trunk@47545 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Master/texmf-dist/doc/latex/nicematrix/README.md | 6 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf | bin | 241359 -> 252875 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx | 380 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty | 197 |
4 files changed, 470 insertions, 113 deletions
diff --git a/Master/texmf-dist/doc/latex/nicematrix/README.md b/Master/texmf-dist/doc/latex/nicematrix/README.md index bf01c561311..30055711b03 100644 --- a/Master/texmf-dist/doc/latex/nicematrix/README.md +++ b/Master/texmf-dist/doc/latex/nicematrix/README.md @@ -4,5 +4,7 @@ This extension has been written by F. Pantigny (fpantigny@wanadoo.fr). This extension is entirely contained in a single file : nicematrix.sty -The LaTeX package nicematrix gives an environment NiceMatrix which is similar to environment -matrix but gives the possibility to draw ellipis dots between the cells of the matrix.
\ No newline at end of file +The LaTeX package nicematrix provides new environments similar to the classical environments +array and matrix but with some additional features. Among these features are the +possibilities to fix the width of the columns and to draw continuous ellipsis dots between the cells +of the array.
\ No newline at end of file diff --git a/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf b/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf Binary files differindex f3ec61447c7..4acb39a6d0c 100644 --- a/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf +++ b/Master/texmf-dist/doc/latex/nicematrix/nicematrix.pdf diff --git a/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx b/Master/texmf-dist/source/latex/nicematrix/nicematrix.dtx index c6f81ecfd46..5093c59642a 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{1.3} -\def\myfiledate{2018/03/31} +\def\myfileversion{1.4} +\def\myfiledate{2018/04/16} % % %<*batchfile> @@ -70,8 +70,8 @@ version 2005/12/01 or later. % % \begin{abstract} % The LaTeX package \pkg{nicematrix} provides new environments similar to the classical environments |{array}| and -% |{matrix}| but with some additional features. Among these features is the possibility to draw continuous ellipsis -% dots between the cells of the array. +% |{matrix}| but with some additional features. Among these features are the possibilities to fix the width of the +% columns and to draw continuous ellipsis dots between the cells of the array. % \end{abstract} % % \vspace{1cm} @@ -79,8 +79,8 @@ version 2005/12/01 or later. % % % This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by the classical workflow -% |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). Two compilations may be necessary. This package requires the -% packages \pkg{expl3}, \pkg{l3keys2e}, \pkg{xparse}, \pkg{array}, \pkg{mathtools} and \pkg{tikz}. +% |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). Two or three compilations may be necessary. This package requires +% the packages \pkg{expl3}, \pkg{l3keys2e}, \pkg{xparse}, \pkg{array}, \pkg{mathtools} and \pkg{tikz}. % % \medskip % The package \pkg{nicematrix} aims to draw beautiful matrices in a way almost transparent for the user. @@ -247,7 +247,10 @@ version 2005/12/01 or later. % % \bigskip % There are also other means to change the size of the matrix. Someone might want to use the optional argument of -% the command~|\\| for the vertical dimension and a command~|\hspace*| in a cell for the horizontal dimension. +% the command~|\\| for the vertical dimension and a command~|\hspace*| in a cell for the horizontal +% dimension.\footnote{Nevertheless, the best way to fix the width of a column is to use the environment +% |{NiceArray}| with a column of type~|w| (or |W|).} +% % However, a command~|\hspace*| might interfer with the construction of the dotted lines. That's why the package % \pkg{nicematrix} provides a command~|\Hspace| which is a variant of |\hspace| transparent for the dotted lines of % \pkg{nicematrix}.\par\nobreak @@ -362,6 +365,9 @@ version 2005/12/01 or later. % \medskip % The option |nullify-dots| smashes the instructions |\Ldots| (and the variants) vertically but also horizontally. % +% +% +% \vskip1cm % \section{How to use nicematrix for existing code} % % The package \pkg{nicematrix} provides an option called |transparent| for using existing code transparently in the @@ -426,12 +432,13 @@ version 2005/12/01 or later. % \item The commands |\Cdots| and its variants are available in the environment |{NiceArray}|. % \item The environment |{NiceArray}| accepts (between brackets) the options |t|, |c| and |b| as the classical % |{array}| but also the following options defined by \pkg{nicematrix}: |renew-dots|, |nullify-dots|, -% |exterior-arraycolsep| and |parallelize-diags| (these last two options are technical options described further). -% \item For technical reasons, in the preamble of |{NiceArray}|, the user -% must use the letters |L|, |C| and |R|\footnote{The column types |L|, |C| and |R| are defined locally inside +% |columns-width| (explained below), |exterior-arraycolsep| and |parallelize-diags| (these last two options are +% technical options described further). +% \item For technical reasons, in the preamble of the environment |{NiceArray}|, the user +% must use the letters |L|, |C| and~|R|\footnote{The column types |L|, |C| and |R| are defined locally inside % |{NiceArray}| with |\newcolumntype| of \pkg{array}. This definition overrides an eventual previous definition.} -% instead of |l|, |c| and |r|. It's possible to use the constructions \verb+|+, |>{...}|, |<{...}|, |@{...}|, -% |!{...}| and |*{n}{...}| but the letters |p|, |m| and |b| should not be used. +% instead of |l|, |c| and |r|. It's possible to use the constructions \verb|w{...}{...}|, \verb|W{...}{...}|, +% \verb+|+, |>{...}|, |<{...}|, |@{...}|, |!{...}| and |*{n}{...}| but the letters |p|, |m| and |b| should not be used. % \end{itemize} % % @@ -475,6 +482,61 @@ version 2005/12/01 or later. % a_{n-1,1} & \Cdots & a_{n-1,n} \\ % \end{NiceArray}\right)$ % +% \vskip1cm +% As in the environment |{array}| of the extension \pkg{array}, it's possible to fix the width of a column by using +% the letter |w| or the letter |W| in the preamble. In the following example, the width of the third column is +% fixed to 1~cm.\par\nobreak +% \medskip +% \begin{BVerbatim}[baseline=c,boxwidth=10cm] +% $\left(\begin{NiceArray}{CC~emphase#w{c}{1cm}@} +% 1 & 2 & 3 \\ +% 4 & 5 & 6 \\ +% 7 & 8 & 9 +% \end{NiceArray}\right)$ +% \end{BVerbatim} +% $\left(\begin{NiceArray}{CCw{c}{1cm}} +% 1 & 2 & 3 \\ +% 4 & 5 & 6 \\ +% 7 & 8 & 9 +% \end{NiceArray}\right)$ +% +% \bigskip +% However, the environment |{NiceArray}| and the other environments defined in this extension have an option called +% |columns-width| which fixes the width of all columns of the matrix.\par\nobreak +% \medskip +% \begin{BVerbatim}[baseline=c,boxwidth=10cm] +% $\begin{pNiceMatrix}[~emphase#columns-width = 1cm@] +% 1 & 12 & -123 \\ +% 12 & 0 & 0 \\ +% 4 & 1 & 2 +% \end{pNiceMatrix}$ +% \end{BVerbatim} +% $\begin{pNiceMatrix}[columns-width = 1cm] +% 1 & 12 & -123 \\ +% 12 & 0 & 0 \\ +% 4 & 1 & 2 +% \end{pNiceMatrix}$ +% +% \medskip +% Note that the space inserted between two columns (equal to 2 |\arraycolsep|) is not suppressed. +% +% \bigskip +% It's also possible to give the value |auto| to the option |columns-width|: all the columns of the array will +% have a width equal to the widest cell of the array. \emph{Two or three compilations may be necessary}.\par\nobreak +% \medskip +% \begin{BVerbatim}[baseline=c,boxwidth=10cm] +% $\begin{pNiceMatrix}[~emphase#columns-width = auto@] +% 1 & 12 & -123 \\ +% 12 & 0 & 0 \\ +% 4 & 1 & 2 +% \end{pNiceMatrix}$ +% \end{BVerbatim} +% $\left(\begin{NiceArray}[columns-width = auto]{CCC} +% 1 & 12 & -123 \\ +% 12 & 0 & 0 \\ +% 4 & 1 & 2 +% \end{NiceArray}\right)$ +% % % \section{The environment \{pNiceArrayC\} and its variants} % @@ -492,15 +554,17 @@ version 2005/12/01 or later. % \item The environment |{pNiceArrayC}| takes a mandatory argument which is the preamble of the array. The types % of columns available are the same as for the environment |{NiceArray}|. \emph{However, no specification must be % given for the last column:} it will automatically (and necessarily) be a column~|L|. -% \item The options available are |renew-dots|, |nullify-dots|, |parallelize-diags| (this technical option is -% described further) and |code-for-last-col|. This last option specifies tokens that will be inserted before each +% \item The options available are |columns-width| (doesn't apply to the exterior column), |renew-dots|, +% |nullify-dots|, |parallelize-diags| (this technical option is described further) and an option specific to these +% environments, called |code-for-last-col|. This last option specifies tokens that will be inserted before each % cell of the last column, \emph{before} the symbol |$| of the math mode. % \end{itemize} % % % \bigskip % \begin{BVerbatim}[baseline=c] -% \begin{pNiceArrayC}{RRRR|R}[~emphase#code-for-last-col={\small\color{blue}}@] +% \begin{pNiceArrayC}{RRRR|R}[~emphase#code-for-last-col={\small\color{blue}}@, +% columns-width=auto] % 1& 2& 2& 3& -2 \\ % 0& 0& -1& 5& -5 & L_2 \gets 2L_1-L_2 \\ % 0& -1& -3& 3& -7 & L_3 \gets L_1-L_3 @@ -508,7 +572,8 @@ version 2005/12/01 or later. % \end{BVerbatim} % % \smallskip -% \[\begin{pNiceArrayC}{RRRR|R}[code-for-last-col={\small\color{blue}}] +% \[\begin{pNiceArrayC}{RRRR|R}[code-for-last-col={\small\color{blue}}, +% columns-width=auto] % 1& 2& 2& 3& -2 \\ % 0& 0& -1& 5& -5 & L_2 \gets 2L_1-L_2 \\ % 0& -1& -3& 3& -7 & L_3 \gets L_1-L_3 @@ -795,6 +860,7 @@ version 2005/12/01 or later. % \bigskip % \subsection{Technical definitions} % +% % First, we define a command |\iddots| similar to |\ddots| ($\ddots$) but with dots going forward ($\iddots$). We % use |\ProvideDocumentCommand| of \pkg{xparse}, and so, if the command |\iddots| has already been defined (for % example by the package \pkg{mathdots}), we don't define it again. @@ -833,6 +899,12 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip +% The dimension |\l_@@_columns_width_dim| will be used when the options specify that all the columns must have the +% same width. +% \begin{macrocode} +\dim_new:N \l_@@_columns_width_dim +% \end{macrocode} +% \bigskip % \subsection{The options} % % The token list |\l_@@_pos_env_tl| will contains one of the three values |t|, |c| or |b| and will indicate to @@ -874,6 +946,14 @@ version 2005/12/01 or later. % \end{macrocode} % % \bigskip +% The following flag will be used when the current options specify that all the columns of the array must have the +% same width equal to the largest width of a cell of the array (except the cell of the ``exterior column'' of an +% environment of the kind of |{pNiceArrayC}|). +% \begin{macrocode} +\bool_new:N \l_@@_auto_columns_width_bool +% \end{macrocode} +% +% \bigskip % The token list |\l_@@_code_for_last_col_tl| will contains code inserted at the beginning of each cell\footnote{At % the beginning of each cell but before the character |$| of the mathematical mode.} of the last % column in the environment |{pNiceArrayC}| (and its variants). It corresponds to the option |code-for-last-col|. @@ -925,6 +1005,7 @@ version 2005/12/01 or later. NullifyDots .meta:n = nullify-dots, % \end{macrocode} % +% % \bigskip % With the option |silent|, no error is generated for the impossible instructions. This option can be useful when % adapting an existing code. @@ -951,7 +1032,24 @@ version 2005/12/01 or later. % \begin{macrocode} exterior-arraycolsep .bool_set:N = \l_@@_exterior_arraycolsep_bool , exterior-arraycolsep .default:n = true, - unknown .code:n = \msg_error:nn {nicematrix} {Option~unknown}} + unknown .code:n = \msg_error:nn {nicematrix} {Unknown~key~for~NiceMatrixOptions}} +% \end{macrocode} +% +% \begin{macrocode} +\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} % \end{macrocode} % % \bigskip @@ -966,13 +1064,35 @@ version 2005/12/01 or later. % \bigskip % \begin{macrocode} \keys_define:nn {NiceMatrix/NiceMatrix} - {parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool, - parallelize-diags .default:n = true, - renew-dots .bool_set:N = \l_@@_renew_dots_bool, - renew-dots .default:n = true, - nullify-dots .bool_set:N = \l_@@_nullify_dots_bool , - nullify-dots .default:n = true, - unknown .code:n = \msg_error:nn {nicematrix} {Option~unknown}} + {parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool, + parallelize-diags .default:n = true, + renew-dots .bool_set:N = \l_@@_renew_dots_bool, + renew-dots .default:n = true, + nullify-dots .bool_set:N = \l_@@_nullify_dots_bool , + nullify-dots .default:n = true, +% \end{macrocode} +% The option |columns-width| is the width of the columns it we want the same width for all the columns of the +% array. A value of 0~pt means that the width of the column will be the natural width of the column. +% \begin{macrocode} + columns-width .code:n = \str_if_eq:nnTF {#1} {auto} + {\bool_set_true:N + \l_@@_auto_columns_width_bool} + {\dim_set:Nn \l_@@_columns_width_dim {#1}}, + unknown .code:n = \msg_error:nn {nicematrix} {Unknown~option~for~NiceMatrix}} +% \end{macrocode} +% +% \begin{macrocode} +\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.} % \end{macrocode} % % \bigskip @@ -986,6 +1106,10 @@ version 2005/12/01 or later. nullify-dots .default:n = true, exterior-arraycolsep .bool_set:N = \l_@@_exterior_arraycolsep_bool , exterior-arraycolsep .default:n = true, + columns-width .code:n = \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, % \end{macrocode} % % \bigskip @@ -995,9 +1119,26 @@ version 2005/12/01 or later. c .code:n = \tl_set:Nn \l_@@_pos_env_tl c, t .code:n = \tl_set:Nn \l_@@_pos_env_tl t, b .code:n = \tl_set:Nn \l_@@_pos_env_tl b, - unknown .code:n = \msg_error:nn {nicematrix} {Option~unknown}} + unknown .code:n = \msg_error:nn {nicematrix} {Unknown~option~for~NiceArray}} % \end{macrocode} % +% \begin{macrocode} +\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.} +% \end{macrocode} % % \bigskip % \subsection{The environments \{NiceArray\} and \{NiceMatrix\}} @@ -1011,27 +1152,34 @@ version 2005/12/01 or later. % explanations). % \begin{macrocode} \cs_new_protected:Nn \@@_Cell:n - { \tl_gput_right:Nn \g_@@_preamble_aux_tl {#1} + {\tl_gput_right:Nn \g_@@_preamble_aux_tl {#1} % \end{macrocode} % We increment |\g_@@_column_int|, which is the counter of the columns. % \begin{macrocode} \int_gincr:N \g_@@_column_int + \hbox_set:Nw \l_tmpa_box $} % $ % \end{macrocode} % -% We create a Tikz node for the current cell of the array. % \begin{macrocode} +\cs_new_protected:Nn \@@_end_Cell: + {$ % $ + \hbox_set_end: +% \end{macrocode} +% We want to compute in |\l_@@_max_cell_width_dim| the width of the widest cell of the array (except the cells of +% the last column of an environment of the kind of |{pNiceArrayC}|). +% \begin{macrocode} + \dim_gset:Nn \g_@@_max_cell_width_dim + {\dim_max:nn \g_@@_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_@@_env_int- \int_use:N \g_@@_row_int- \int_use:N \g_@@_column_int) - \bgroup $} % $ -% \end{macrocode} -% -% \begin{macrocode} -\cs_new_protected:Nn \@@_end_Cell: - {$\egroup ;} % $ + \bgroup + \box_use:N \l_tmpa_box + \egroup ;} % \end{macrocode} % +% % \interitem % The environment |{NiceArray}| is the main environment of the extension \pkg{nicematrix}. % @@ -1055,7 +1203,8 @@ version 2005/12/01 or later. {\keys_set:nn {NiceMatrix/NiceMatrix} {#1} \tl_set:Nn \l_@@_pos_env_tl c \bool_set_false:N \l_@@_exterior_arraycolsep_bool - \NiceArray{*\c@MaxMatrixCols{C}}} + \NiceArray{*\c@MaxMatrixCols{C}} + } {\endarray \skip_horizontal:n {-\arraycolsep}} % \end{macrocode} @@ -1069,10 +1218,29 @@ version 2005/12/01 or later. % \end{itemize} % % \begin{macrocode} +\cs_generate_variant:Nn \dim_set:Nn {Nx} \NewDocumentEnvironment {NiceArray} {O{} m O{}} - {\aftergroup \@@_draw_lines: + {\aftergroup \@@_write_max_cell_width: + \aftergroup \@@_draw_lines: +% \end{macrocode} +% +% We increment the counter |\g_@@_env_int| which counts the environments |{NiceArray}|. +% \begin{macrocode} + \int_gincr:N \g_@@_env_int + \dim_gzero_new:N \g_@@_max_cell_width_dim \keys_set:nn {NiceMatrix/NiceArray} {#1,#3} % \end{macrocode} +% +% If the user requires all the columns to have a width equal to the widest cell of the array, we read this length in +% the file |.aux| (of, course, this is possible only on the second run of LaTeX : on the first run, the dimension +% |\l_@@_columns_width_dim| will be set to zero --- and the columns will have their natural width). +% \begin{macrocode} + \bool_if:NT \l_@@_auto_columns_width_bool + {\cs_if_free:cTF {_@@_max_cell_width_\int_use:N \g_@@_env_int} + {\dim_set:Nn \l_@@_columns_width_dim \c_zero_dim} + {\dim_set:Nx \l_@@_columns_width_dim + {\use:c {_@@_max_cell_width_\int_use:N \g_@@_env_int}}}} +% \end{macrocode} % The environment |{array}| uses internally the command |\ialign| and, in particular, this command |\ialign| sets % |\everycr| to |{}|. However, we want to use |\everycr| in our array (in particular to increment |\g_@@_row_int|). % The solution is to give to |\ialign| a new definition (giving to |\everycr| the value we want) @@ -1085,28 +1253,64 @@ version 2005/12/01 or later. \int_gzero:N \g_@@_column_int % \end{macrocode} % We want to have the preamble of the array in |\g_@@_preamble_tl| at the end of the array. However, some rows of the array -% may be shorter (that is to say without all the ampersands) and it's not possible to known which row will be the +% may be shorter (that is to say without all the ampersands) and it's not possible to know which row will be the % longest. That's why, during the construction of a row, we retrieve the corresponding preamble in % |\g_@@_preamble_aux_tl|. At the end of the array, we are sure that the longest value will be the real preamble of % the array (stored in |\g_@@_preamble_tl|). % \begin{macrocode} - \int_compare:nNnT {\tl_count:N \g_@@_preamble_aux_tl} - > {\tl_count:N \g_@@_preamble_tl} - {\tl_gset_eq:NN \g_@@_preamble_tl \g_@@_preamble_aux_tl} - \tl_gclear:N \g_@@_preamble_aux_tl}} + \int_compare:nNnT {\tl_count:N \g_@@_preamble_aux_tl} + > {\tl_count:N \g_@@_preamble_tl} + {\tl_gset_eq:NN \g_@@_preamble_tl \g_@@_preamble_aux_tl} + \tl_gclear:N \g_@@_preamble_aux_tl}} \skip_zero:N \tabskip \cs_set:Npn \ialign {\everycr{} \skip_zero:N \tabskip \halign} \halign} % \end{macrocode} +% % We define the new column types |L|, |C| and |R| that must be used instead of |l|, |c| and |r| in the preamble of % |{NiceArray}|. % \begin{macrocode} - \newcolumntype{L}{>{\@@_Cell:n l}l<{\@@_end_Cell:}} - \newcolumntype{C}{>{\@@_Cell:n c}c<{\@@_end_Cell:}} - \newcolumntype{R}{>{\@@_Cell:n r}r<{\@@_end_Cell:}} + \dim_compare:nNnTF \l_@@_columns_width_dim = \c_zero_dim + {\newcolumntype{L}{>{\@@_Cell:n l}l<{\@@_end_Cell:}} + \newcolumntype{C}{>{\@@_Cell:n c}c<{\@@_end_Cell:}} + \newcolumntype{R}{>{\@@_Cell:n r}r<{\@@_end_Cell:}}} +% \end{macrocode} +% If there is an option that specify that all the columns must have the same width, the column types~|L|, |C| +% and~|R| are in fact defined upon the column type~|w| of array which is, in fact, redefined below. +% \begin{macrocode} + {\newcolumntype{L}{wl{\dim_use:N \l_@@_columns_width_dim}} + \newcolumntype{C}{wc{\dim_use:N \l_@@_columns_width_dim}} + \newcolumntype{R}{wr{\dim_use:N \l_@@_columns_width_dim}}} +% \end{macrocode} +% +% We nullify the definitions of the column types |w| and |W| because we want to avoid a warning in the log file +% for a redefinition of a column type. +% \begin{macrocode} + \cs_set_eq:NN \NC@find@w \relax + \cs_set_eq:NN \NC@find@W \relax % \end{macrocode} +% +% We redefine the column types |w| and |W| of the package \pkg{array}. +% \begin{macrocode} + \newcolumntype{w}[2] + {>{\hbox_set:Nw \l_tmpa_box + \@@_Cell:n ##1} + c + <{\@@_end_Cell: + \hbox_set_end: + \makebox[##2][##1]{\box_use:N \l_tmpa_box}}} + \newcolumntype{W}[2] + {>{\hbox_set:Nw \l_tmpa_box + \@@_Cell:n ##1} + c + <{\@@_end_Cell: + \hbox_set_end: + \cs_set_eq:NN \hss \hfil + \makebox[##2][##1]{\box_use:N \l_tmpa_box}}} +% \end{macrocode} +% % The commands |\Ldots|, |\Cdots|, etc. will be defined only in the environment |{NiceArray}|. % \begin{macrocode} \cs_set_eq:NN \Ldots \@@_Ldots @@ -1126,10 +1330,6 @@ version 2005/12/01 or later. {\cs_set_eq:NN \multicolumn \@@_multicolumn:nn} % \end{macrocode} % -% We increment the counter |\g_@@_env_int| which counts the environments |{NiceArray}|. -% \begin{macrocode} - \int_gincr:N \g_@@_env_int -% \end{macrocode} % % We have to remind the types of the columns (|l|, |c| or |r|) because we will use this information when we will % draw the vertical dotted lines. That's why we store the types of the columns in |\g_@@_preamble_tl| (for example, @@ -1222,6 +1422,20 @@ version 2005/12/01 or later. % \end{macrocode} % % \interitem +% For the option \verb|columns-width=auto|, we want to known the maximal width of the cells of the array (except +% the cells of the ``exterior'' column of an environment of the kind of |{pNiceAccayC}|). This length can be known +% only after the end of the construction of the array: that's why we store this value in the main |.aux| file and +% it will be available in the next run. +% \begin{macrocode} +\cs_new:Nn \@@_write_max_cell_width: + {\iow_now:Nx \@mainaux + {\ExplSyntaxOn + \cs_gset:cpn {_@@_max_cell_width_\int_use:N \g_@@_env_int} + {\dim_use:N \g_@@_max_cell_width_dim} + \ExplSyntaxOff}} +% \end{macrocode} +% +% \interitem % The conditionnal |\@@_if_not_empty_cell:nnT| test wether a cell is empty. The first two arguments must be LaTeX3 % counters for the row and the column of the considered cell. % \begin{macrocode} @@ -1849,13 +2063,6 @@ version 2005/12/01 or later. \token_to_str:N \multicolumn.~You~can~go~on~but~your~line~will~ probably~be~wrong.} % \end{macrocode} -% -% \begin{macrocode} -\msg_new:nnn {nicematrix} - {Option~unknown} - {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~ - meaningless~in~the~context.~If~you~go~on,~it~will~be~ignored.} -% \end{macrocode} % % \bigskip % \subsection{The environment \{pNiceArrayC\} and its variants} @@ -1868,15 +2075,35 @@ version 2005/12/01 or later. % % \begin{macrocode} \keys_define:nn {NiceMatrix/NiceArrayC} - {parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool, - parallelize-diags .default:n = true, - renew-dots .bool_set:N = \l_@@_renew_dots_bool, - renew-dots .default:n = true, - nullify-dots .bool_set:N = \l_@@_nullify_dots_bool , - nullify-dots .default:n = true, - code-for-last-col .tl_set:N = \l_@@_code_for_last_col_tl, - code-for-last-col .value_required:n = true, - unknown .code:n = \msg_error:nn {nicematrix} {Option~unknown}} + {parallelize-diags .bool_set:N = \l_@@_parallelize_diags_bool, + parallelize-diags .default:n = true, + renew-dots .bool_set:N = \l_@@_renew_dots_bool, + renew-dots .default:n = true, + nullify-dots .bool_set:N = \l_@@_nullify_dots_bool , + nullify-dots .default:n = true, + code-for-last-col .tl_set:N = \l_@@_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_@@_auto_columns_width_bool} + {\dim_set:Nn \l_@@_columns_width_dim {#1}}, + columns-width .value_required:n = true, + unknown .code:n = \msg_error:nn {nicematrix} {Unknown~option~for~pNiceArrayC}} +% \end{macrocode} +% +% \begin{macrocode} +\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.} % \end{macrocode} % % \bigskip @@ -1904,20 +2131,28 @@ version 2005/12/01 or later. % to store the content of the cell in the box |\l_tmpa_box|. This is allowed in \pkg{expl3} with the construction % |\hbox_set:Nw \l_tmpa_box| ... |\hbox_set_end:|. % \begin{macrocode} - >{\hbox_set:Nw \l_tmpa_box + >{\int_gincr:N \g__nm_column_int + \hbox_set:Nw \l_tmpa_box \l_@@_code_for_last_col_tl - \@@_Cell:n l} - l - <{\@@_end_Cell: - \hbox_set_end: + \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 % \end{macrocode} % % We actualize the value of |\g_@@with_last_col_dim| which, at the end of the array, will contains the maximal width % of the cells of the last column (thus, it will be equal to the width of the last column). % \begin{macrocode} + <{ $ % $ + \egroup ; + \hbox_set_end: \dim_gset:Nn \g_@@_width_last_col_dim {\dim_max:nn \g_@@_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} % \end{macrocode} % The content of the cell is inserted in a overlapping position. @@ -1976,7 +2211,7 @@ version 2005/12/01 or later. \@@_after_last_col:} % \end{macrocode} % -% +% % % \section{History} % @@ -2007,6 +2242,13 @@ version 2005/12/01 or later. % hyphens (but backward compatibility is kept). % % +% \subsection{Changes between version 1.3 and 1.4} +% +% The column types |w| and |W| can now be used in the environments |{NiceArray}|, |{pNiceArrayC}| and its variants +% with the same meaning as in the package \pkg{array}. +% +% New option |columns-width| to fix the same width for all the columns of the array. +% % \endinput % Local Variables: % TeX-fold-mode: nil diff --git a/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty b/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty index fa0c20dbd66..ca85ddf7d2b 100644 --- a/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty +++ b/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty @@ -18,8 +18,8 @@ %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% -\def\myfileversion{1.3} -\def\myfiledate{2018/03/31} +\def\myfileversion{1.4} +\def\myfiledate{2018/04/16} \RequirePackage{l3keys2e} \ProvidesExplPackage {nicematrix} @@ -42,6 +42,7 @@ \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 @@ -49,6 +50,7 @@ \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, @@ -76,17 +78,46 @@ 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} {Option~unknown}} + 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, - unknown .code:n = \msg_error:nn {nicematrix} {Option~unknown}} + {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, @@ -96,45 +127,101 @@ 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} {Option~unknown}} + 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} + {\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 $} % $ -\cs_new_protected:Nn \__nm_end_Cell: - {$\egroup ;} % $ + \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}}} + \NiceArray{*\c@MaxMatrixCols{C}} + } {\endarray \skip_horizontal:n {-\arraycolsep}} +\cs_generate_variant:Nn \dim_set:Nn {Nx} \NewDocumentEnvironment {NiceArray} {O{} m O{}} - {\aftergroup \__nm_draw_lines: + {\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}} + \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} - \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:}} + \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 @@ -150,7 +237,6 @@ \cs_set_eq:NN \iddots \__nm_Iddots} \bool_if:NF \l__nm_renew_matrix_bool {\cs_set_eq:NN \multicolumn \__nm_multicolumn:nn} - \int_gincr:N \g__nm_env_int \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 @@ -179,6 +265,12 @@ \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- @@ -465,20 +557,33 @@ of~amsmath~is~also~forbidden~since~it~uses~ \token_to_str:N \multicolumn.~You~can~go~on~but~your~line~will~ probably~be~wrong.} -\msg_new:nnn {nicematrix} - {Option~unknown} - {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~ - meaningless~in~the~context.~If~you~go~on,~it~will~be~ignored.} \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, - unknown .code:n = \msg_error:nn {nicematrix} {Option~unknown}} + {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} @@ -486,15 +591,23 @@ \tl_set:Nn \l__nm_pos_env_tl c \begin{NiceArray} {#2 - >{\hbox_set:Nw \l_tmpa_box + >{\int_gincr:N \g__nm_column_int + \hbox_set:Nw \l_tmpa_box \l__nm_code_for_last_col_tl - \__nm_Cell:n l} - l - <{\__nm_end_Cell: + \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} |