diff options
Diffstat (limited to 'macros/latex/contrib/spbmark/spbmark.sty')
-rw-r--r-- | macros/latex/contrib/spbmark/spbmark.sty | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/macros/latex/contrib/spbmark/spbmark.sty b/macros/latex/contrib/spbmark/spbmark.sty new file mode 100644 index 0000000000..f5e40f2b7f --- /dev/null +++ b/macros/latex/contrib/spbmark/spbmark.sty @@ -0,0 +1,219 @@ +% +% ***************** THE SPBMARK PACKAGE ***************** +% +% Copyright (C) 2021 by Qu Yi <quee123@foxmail.com> +% +% This work may be distributed and/or modified under the +% conditions of the CC-BY 4.0 License. +% The latest version of this license is in +% https://creativecommons.org/licenses/by/4.0/legalcode +\NeedsTeXFormat{LaTeX2e}[2018/12/31] +\RequirePackage{xparse,l3keys2e} +\ProvidesExplPackage{spbmark}{2021/07/26}{1.05} + {Customize superscripts and subscripts} + +\cs_new_protected:Npn \spb_define:n { \keys_define:nn { spbmark } } +\cs_new_protected:Npn \spbset { \keys_set:nn { spbmark } } +\keys_define:nn { spbmark/option } + { + ctex .code:n = + { + \cs_set:Npn \spb_define:n { \keys_define:nn { ctex/style } } + \cs_set:Npn \spbset { \keys_set:nn { ctex/style } } + }, + newsupb .bool_set:N = \l__spb_new_supersub_bool, + newsupb .default:n = true, + newsupb .initial:n = true + } + +\ProcessKeysOptions{spbmark/option} + +\tl_new:N \l__spb_super_script_formatii_tl +\tl_new:N \l__spb_sub_script_formatii_tl +\spb_define:n + { + super-vshift .dim_set:N = \l__spb_super_script_vshift_dim, + super-vshift .initial:n = 0pt, + super-hshift .dim_set:N = \l__spb_super_script_hshift_dim, + super-hshift .initial:n = 0pt, + sub-vshift .dim_set:N = \l__spb_sub_script_vshift_dim, + sub-vshift .initial:n = 0pt, + sub-hshift .dim_set:N = \l__spb_sub_script_hshift_dim, + sub-hshift .initial:n = 0pt, + supersub-hshift .dim_set:N = \l__spb_supersub_script_hshift_dim, + supersub-hshift .initial:n = 0pt, + super-format .tl_set:N = \l__spb_super_script_formati_tl, + sub-format .tl_set:N = \l__spb_sub_script_formati_tl, + supersub-format .code:n = \spb_both_format_assign:n {#1}, + supersubsep .dim_set:N = \l__spb_supersub_script_sep_dim, + supersubsep .initial:n = 0.3ex, + supersubalign .tl_set:N = \l__spb_supersub_script_align_tl, + supersubalign .initial:n = l + } + +\tl_set:Nn \l__spb_boxa_wd_tl { \box_wd:N \l_tmpa_box } +\tl_set:Nn \l__spb_boxb_wd_tl { \box_wd:N \l_tmpb_box } +\cs_new:Npn \spb_tmp_boxa_use: { \box_use:N \l_tmpa_box } +\cs_new:Npn \spb_tmp_boxb_use: { \box_use:N \l_tmpb_box } +\cs_new:Npn \spb_box_max_dim_horizontal: + { + \skip_horizontal:n + { \dim_max:nn { \l__spb_boxa_wd_tl } { \l__spb_boxb_wd_tl } } + } +\cs_new:Npn \spb_boxwd_subtract:nnnn #1#2#3#4 + { + \skip_horizontal:n + { #1\tl_use:c { l__spb_#3_wd_tl } - #2\tl_use:c { l__spb_#4_wd_tl } } + } +\cs_new:Npn \spb_boxwd_script_align:nn #1#2 + { + \spb_boxwd_subtract:nnnn { 0.5 } { 0.5 } {#1} {#2} + \use:c { spb_tmp_#2_use: } + \spb_boxwd_subtract:nnnn { -0.5 } { 0.5 } {#1} {#2} + \use:c { spb_tmp_#1_use: } + } +\cs_new:Npn \spb_math_print_store:nnn #1#2#3 + { + \hbox_set:Nn \l_tmpa_box + { \ensuremath{#1{\spb_math:nn {#2} {#3}}} } + } +\cs_new:Npn \spb_text_print_store:nnn #1#2#3 + { + \hbox_set:Nn \l_tmpa_box + { #1{\use:c { spb@text#2script@save }{#3}} } + } +\cs_new:Npn \spb_math_print_store:nnnn #1#2#3#4 + { + \hbox_set:Nn \l_tmpa_box { \ensuremath{#1{\spb@sp@save{#2}}} } + \hbox_set:Nn \l_tmpb_box { \ensuremath{#3{\spb@sb@save{#4}}} } + } +\cs_new:Npn \spb_text_print_store:nnnn #1#2#3#4 + { + \hbox_set:Nn \l_tmpa_box { #1{\spb@textsuperscript@save{#2}} } + \hbox_set:Nn \l_tmpb_box { #3{\spb@textsubscript@save{#4}} } + } +\cs_set_eq:NN \spb@textsuperscript@save \textsuperscript +\cs_set_eq:NN \spb@textsubscript@save \textsubscript +\cs_set_eq:NN \spb@sp@save \sp +\cs_set_eq:NN \spb@sb@save \sb +\cs_new:Npn \spb_math:nn #1 + { + \str_case:nn {#1} + { + { super } { \spb@sp@save } + { sub } { \spb@sb@save } + } + } +\cs_new_protected:Npn \spb_box_ht_dp_assign:nn #1#2 + { + \tl_if_empty:nF {#1} { \box_set_ht:Nn \l_tmpb_box {#1} } + \tl_if_novalue:nF {#2} { \box_set_dp:Nn \l_tmpb_box {#2} } + } +\NewDocumentCommand{\spb_both_format_assign:n} + {>{\SplitArgument{1}{,}}m} + {\spb_supersub_script_both_format:nn #1} +\cs_new_protected:Npn \spb_supersub_script_both_format:nn #1#2 + { + \tl_set:Nn \l__spb_super_script_formatii_tl {#1} + \tl_if_novalue:nTF {#2} + { \tl_clear:N \l__spb_sub_script_formatii_tl } + { \tl_set:Nn \l__spb_sub_script_formatii_tl {#2} } + } + +\clist_map_inline:nn + { super,sub } + { + \exp_args:Nc \NewDocumentCommand {#1} + { + sO{\dim_use:c { l__spb_#1_script_vshift_dim }} + >{\SplitArgument{1}{,}}O{} + D(){\tl_use:c { l__spb_#1_script_formati_tl }} + mO{\dim_use:c { l__spb_#1_script_hshift_dim }} + } + { + \IfBooleanTF{##1} + {\spb_math_print_store:nnn {##4} {#1} {##5}} + { + \mode_if_math:TF + { \spb_math_print_store:nnn {##4} {#1} {##5} } + { \spb_text_print_store:nnn {##4} {#1} {##5} } + } + \hbox_set_to_wd:Nnn \l_tmpb_box { \l__spb_boxa_wd_tl + ##6 } + { \hss\box_move_up:nn {##2} { \spb_tmp_boxa_use: } } + \spb_box_ht_dp_assign:nn ##3 + \spb_tmp_boxb_use: + } + } +\NewDocumentCommand{\supersub} + { + sO{\l__spb_supersub_script_sep_dim} + O{\l__spb_supersub_script_align_tl} + D(){\l__spb_super_script_formatii_tl}mm + O{\l__spb_supersub_script_hshift_dim} + D(){\l__spb_sub_script_formatii_tl} + } + { + \IfBooleanTF{#1} + {\spb_math_print_store:nnnn {#4} {#5} {#8} {#6}} + { + \mode_if_math:TF + { \spb_math_print_store:nnnn {#4} {#5} {#8} {#6} } + { \spb_text_print_store:nnnn {#4} {#5} {#8} {#6} } + } + \hbox_set_to_wd:Nnn \l_tmpa_box { \l__spb_boxa_wd_tl + #7 } + { \hss\box_move_up:nn {#2} { \spb_tmp_boxa_use: } } + \hbox_set_to_wd:Nnn \l_tmpb_box { \l__spb_boxb_wd_tl + #7 } + { \hss\box_move_down:nn {#2} { \spb_tmp_boxb_use: } } + \str_case:onF {#3} + { + { l } { \use_i:nnn } + { c } { \use_ii:nnn } + { r } { \use_iii:nnn } + } + { + \msg_warning:nn { spbmark } { unsupported-align } + \use_i:nnn + } + { + \hbox_overlap_right:n { \spb_tmp_boxa_use: } + \hbox_overlap_right:n { \spb_tmp_boxb_use: } + \spb_box_max_dim_horizontal: + } + { + \dim_compare:nNnTF { \l__spb_boxa_wd_tl } > { \l__spb_boxb_wd_tl } + { \spb_boxwd_script_align:nn { boxa } { boxb } } + { \spb_boxwd_script_align:nn { boxb } { boxa } } + } + { + \spb_box_max_dim_horizontal: + \hbox_overlap_left:n { \spb_tmp_boxa_use: } + \hbox_overlap_left:n { \spb_tmp_boxb_use: } + } + } +\msg_new:nnn { spbmark } { unsupported-align } + { + Alignment~only~supports~l,~c,~and~r. \\ + The~l~parameter~will~be~used~by~default. + } + +\bool_if:NT \l__spb_new_supersub_bool + { + \clist_map_inline:nn + { + { sp,sb }, + { textsuperscript,textsubscript } + } + { + \cs_set_eq:cN { \clist_item:nn {#1} { 1 } } \super + \cs_set_eq:cN { \clist_item:nn {#1} { 2 } } \sub + } + } +\cs_set_eq:NN \spb \supersub +\cs_set:Npn \@makefnmark + { \hbox:n { \fnmarkfont\super{\@thefnmark}[0pt] } } +\cs_if_exist:NTF \ftntm@font + { \cs_new:Npn \fnmarkfont { \ftntm@font } } + { \cs_new:Npn \fnmarkfont { \normalfont } } +\endinput +%% +%% End of file `spbmark.sty'. |