diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/physics2/phy-xmat.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/physics2/phy-xmat.sty | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/physics2/phy-xmat.sty b/Master/texmf-dist/tex/latex/physics2/phy-xmat.sty new file mode 100644 index 00000000000..9e7058b0620 --- /dev/null +++ b/Master/texmf-dist/tex/latex/physics2/phy-xmat.sty @@ -0,0 +1,148 @@ +%% +%% This is file `phy-xmat.sty', +%% the `xmat' module of `physics2' package. +%% +%% ****************************************************** +%% * This work may be distributed and/or modified under * +%% * the conditions of the LaTeX Project Public License * +%% * * +%% * http://www.latex-project.org/lppl.txt * +%% * * +%% * either version 1.3c of this license or any later * +%% * version. * +%% ****************************************************** +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% The Current Maintainer of this work is Zhang Tingxuan. +%% +\ProvidesExplFile{phy-xmat.sty}{2023/01/25}{} + {`xmat' module of `physics2.sty'} +\phy@requiremodule { explsetup } +\RequirePackage { amsmath } +\phy@define@key { xmat } { showtop } + { \int_gset:Nn \l__phy_xmat_showtop_int { #1 } } +\phy@define@key { xmat } { showleft } + { \int_gset:Nn \l__phy_xmat_showleft_int { #1 } } +% New variables +\bool_new:N \l__phy_xmat_extra_vdots_bool +\bool_new:N \l__phy_xmat_extra_cdots_bool +\int_new:N \l__phy_xmat_showtop_int +\int_new:N \l__phy_xmat_showleft_int +\tl_new:N \l__phy_xmat_tl +\int_gset:Nn \l__phy_xmat_showtop_int { \value { MaxMatrixCols } - 2 } +\int_gset:Nn \l__phy_xmat_showleft_int { \value { MaxMatrixCols } - 2 } +\cs_new:Npn \__phy_xmat_entry_format:nnn #1#2#3 + { + #1 \c_math_subscript_token { #2 #3 } + } +\phy@processkeyopt { xmat } +\DeclareDocumentCommand \xmat { O{} m m m } + { \__phy_xmat_type:nnnnn { } { #1 } { #2 } { #3 } { #4 } } +\DeclareDocumentCommand \pxmat { O{} m m m } + { \__phy_xmat_type:nnnnn { p } { #1 } { #2 } { #3 } { #4 } } +\DeclareDocumentCommand \bxmat { O{} m m m } + { \__phy_xmat_type:nnnnn { b } { #1 } { #2 } { #3 } { #4 } } +\DeclareDocumentCommand \Bxmat { O{} m m m } + { \__phy_xmat_type:nnnnn { B } { #1 } { #2 } { #3 } { #4 } } +\DeclareDocumentCommand \vxmat { O{} m m m } + { \__phy_xmat_type:nnnnn { v } { #1 } { #2 } { #3 } { #4 } } +\DeclareDocumentCommand \Vxmat { O{} m m m } + { \__phy_xmat_type:nnnnn { V } { #1 } { #2 } { #3 } { #4 } } + +\keys_define:nn { phy/xmat } + { + format .cs_set:Np = \__phy_xmat_entry_format:nnn #1#2#3 , + showtop .int_set:N = \l__phy_xmat_showtop_int , + showleft.int_set:N = \l__phy_xmat_showleft_int , + } +% Use regex to judge if the total row/column number contains digits **only**. +\prg_new_conditional:Npnn \__phy_if_digits_only:n #1 { TF } + { + \regex_match:nnTF { \A [[:digit:]]* \Z } { #1 } + { \prg_return_true: } { \prg_return_false: } + } +% #1: p,b,B; #2: options; #2: common entry; #3: total rows; #4: total cols. +\cs_new:Npn \__phy_xmat_type:nnnnn #1#2#3#4#5 + { + \group_begin: + \tl_gclear:N \l__phy_xmat_tl + \keys_set:nn { phy/xmat } { #2 } % + \__phy_if_digits_only:nTF { #4 } + { + \int_compare:nNnTF { #4 } < { \l__phy_xmat_showtop_int + 1 } + { + \int_set:Nn \l__phy_xmat_showtop_int { #4 } + \bool_set_false:N \l__phy_xmat_extra_vdots_bool + } + { + \bool_set_true:N \l__phy_xmat_extra_vdots_bool + } + } + { + \bool_set_true:N \l__phy_xmat_extra_vdots_bool + } + \__phy_if_digits_only:nTF { #5 } + { + \int_compare:nNnTF { #5 } < { \l__phy_xmat_showleft_int + 1 } + { + \int_set:Nn \l__phy_xmat_showleft_int { #5 } + \bool_set_false:N \l__phy_xmat_extra_cdots_bool + } + { + \bool_set_true:N \l__phy_xmat_extra_cdots_bool + } + } + { + \bool_set_true:N \l__phy_xmat_extra_cdots_bool + } + \int_step_inline:nn { \l__phy_xmat_showtop_int } + { + \tl_put_right:Nn \l__phy_xmat_tl + { \__phy_xmat_entry_format:nnn { #3 } { ##1 } { 1 } } + \int_step_inline:nnn { 2 } { \l__phy_xmat_showleft_int } + { + \tl_put_right:Nn \l__phy_xmat_tl + { & \__phy_xmat_entry_format:nnn { #3 } { ##1 } { ####1 } } + } + \bool_if:NT \l__phy_xmat_extra_cdots_bool + { + \tl_put_right:Nn \l__phy_xmat_tl + { & \cdots & \__phy_xmat_entry_format:nnn { #3 } { ##1 } { #5 } } + } + \tl_put_right:Nn \l__phy_xmat_tl { \\ } + } + \bool_if:NT \l__phy_xmat_extra_vdots_bool + { + \tl_put_right:Nn \l__phy_xmat_tl { \vdots } + \prg_replicate:nn { \l__phy_xmat_showleft_int - 1 } + { + \tl_put_right:Nn \l__phy_xmat_tl { & \vdots } + } + % Add \ddots if vdots_bool and cdots_bool be true simultaneously. + \bool_if:NT \l__phy_xmat_extra_cdots_bool + { + \tl_put_right:Nn \l__phy_xmat_tl { & \ddots & \vdots } + } % else relax + \tl_put_right:Nn \l__phy_xmat_tl { \\ } + % The last row. + \tl_put_right:Nn \l__phy_xmat_tl + { \__phy_xmat_entry_format:nnn { #3 } { #4 } { 1 } } + \int_step_inline:nnn { 2 } { \l__phy_xmat_showleft_int } + { + \tl_put_right:Nn \l__phy_xmat_tl + { & \__phy_xmat_entry_format:nnn { #3 } { #4 } { ##1 } } + } + \bool_if:NT \l__phy_xmat_extra_cdots_bool + { + \tl_put_right:Nn \l__phy_xmat_tl + { & \cdots & \__phy_xmat_entry_format:nnn { #3 } { #4 } { #5 } } + } + } % else relax + \begin { #1 matrix } + \tl_use:N \l__phy_xmat_tl + \end { #1 matrix } + \group_end: + } +\endinput +%% End of file `phy-xmat.sty'. |