summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/physics2/phy-xmat.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/physics2/phy-xmat.sty')
-rw-r--r--Master/texmf-dist/tex/latex/physics2/phy-xmat.sty148
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'.