% % ***************** THE SPBMARK PACKAGE ***************** % % Copyright (C) 2021 by Qu Yi % % 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/12/22}{1.2H} {Customize superscripts and subscripts} \cs_generate_variant:Nn \dim_max:nn { VV } \cs_generate_variant:Nn \dim_compare:nNnTF { V } \cs_generate_variant:Nn \msg_warning:nnn { nnV } \cs_generate_variant:Nn \str_case:nn { x } \cs_generate_variant:Nn \tl_if_novalue:nF { V } \cs_new_protected:Npn \spb_define:n { \keys_define:nn { ctex/style } } \cs_new_protected:Npn \spbset { \keys_set:nn { ctex/style } } \keys_define:nn { spbmark/option } { text .bool_set:N = \l_spb_newsupb_text_bool, text .default:n = true, math .bool_set:N = \l_spb_newsupb_math_bool, math .default:n = true, foot .bool_set:N = \l_spb_newsupb_foot_bool, foot .default:n = true, both .meta:n = { text,math }, both .value_forbidden:n = true, all .meta:n = { text,math,foot }, all .value_forbidden:n = true, ctex .code:n = { }, newsupb .code:n = { } } \ProcessKeysOptions{spbmark/option} \tl_new:N \l__spb_super_cmd_ii_tl \tl_new:N \l__spb_sub_cmd_ii_tl \tl_new:N \g__spb_hmove_init_tl \tl_new:N \g__spb_vmove_init_tl \tl_new:N \g__spb_cmd_init_tl \cs_new_protected:Npn \spb_local_case_init:nnnn #1#2#3#4 { \str_case:xn { \tl_use:c { g__spb_#1_init_tl } } { { super } {#2} { sub } {#3} { supersub } {#4} } } \cs_new_protected:Npn \defspbstyle #1#2 { \spb_define:n { style/#1 .undefine:, style/#1 .code:n = \keys_set:nn { ctex/style } {#2} } } \spb_define:n { spvmove .tl_set:N = \l__spb_super_vmove_tl, spvmove .initial:n = 0pt, sphmove .tl_set:N = \l__spb_super_hmove_tl, sphmove .initial:n = 0pt, sbvmove .tl_set:N = \l__spb_sub_vmove_tl, sbvmove .initial:n = 0pt, sbhmove .tl_set:N = \l__spb_sub_hmove_tl, sbhmove .initial:n = 0pt, spbhmove .tl_set:N = \l__spb_supersub_hmove_tl, spbhmove .initial:n = 0pt, vmove .code:n = { \spb_local_case_init:nnnn { vmove } { \tl_set:Nn \l__spb_super_vmove_tl {#1} } { \tl_set:Nn \l__spb_sub_vmove_tl {#1} } { \tl_set:Nn \l__spb_supersub_vsep_tl {#1} } }, hmove .code:n = { \spb_local_case_init:nnnn { hmove } { \tl_set:Nn \l__spb_super_hmove_tl {#1} } { \tl_set:Nn \l__spb_sub_hmove_tl {#1} } { \tl_set:Nn \l__spb_supersub_hmove_tl {#1} } }, nohmove .meta:n = { sphmove = 0pt,sbhmove = 0pt }, novmove .meta:n = { spvmove = 0pt,sbvmove = 0pt }, spcmd .tl_set:N = \l__spb_super_cmd_i_tl, sbcmd .tl_set:N = \l__spb_sub_cmd_i_tl, spbcmd .code:n = \spb@both@cmd@assign{#1}, cmd .code:n = { \spb_local_case_init:nnnn { cmd } { \tl_set:Nn \l__spb_super_cmd_i_tl {#1} } { \tl_set:Nn \l__spb_sub_cmd_i_tl {#1} } { \spb@both@cmd@assign{#1} } }, spcmd+ .code:n = \tl_put_right:Nn \l__spb_super_cmd_i_tl {#1}, sbcmd+ .code:n = \tl_put_right:Nn \l__spb_sub_cmd_i_tl {#1}, spbcmd+ .code:n = \spb@both@cmd@assign+{#1}, cmd+ .code:n = { \spb_local_case_init:nnnn { cmd } { \tl_put_right:Nn \l__spb_super_cmd_i_tl {#1} } { \tl_put_right:Nn \l__spb_sub_cmd_i_tl {#1} } { \spb@both@cmd@assign+{#1} } }, vsep .tl_set:N = \l__spb_supersub_vsep_tl, vsep .initial:n = 0.6ex, halign .tl_set:N = \l__spb_supersub_halign_tl, halign .initial:n = l, style .choice:, style .value_required:n = true, mode .tl_set:N = \l__spb_mode_value_tl, mode .initial:n = match } \cs_set_eq:NN \spb@textsuperscript@save \textsuperscript \cs_set_eq:NN \spb@textsubscript@save \textsubscript \cs_set_eq:NN \spb@math@super@save \sp \cs_set_eq:NN \spb@math@sub@save \sb \cs_new:Npn \spb_math_print_store_i:nn #1#2 { \hbox_set:Nn \l_tmpa_box { \ensuremath { \use:c { spb@math@#1@save } { \tl_use:c { l__spb_#1_cmd_i_tl }{#2} } } } } \cs_new:Npn \spb_text_print_store_i:nn #1#2 { \hbox_set:Nn \l_tmpa_box { \use:c { spb@text#1script@save } { \tl_use:c { l__spb_#1_cmd_i_tl }{#2} } } } \cs_new:Npn \spb_math_print_store_ii:nn #1#2 { \hbox_set:Nn \l_tmpa_box { \ensuremath{\spb@math@super@save{\l__spb_super_cmd_ii_tl{#1}}} } \hbox_set:Nn \l_tmpb_box { \ensuremath{\spb@math@sub@save{\l__spb_sub_cmd_ii_tl{#2}}} } } \cs_new:Npn \spb_text_print_store_ii:nn #1#2 { \hbox_set:Nn \l_tmpa_box { \spb@textsuperscript@save{\l__spb_super_cmd_ii_tl{#1}} } \hbox_set:Nn \l_tmpb_box { \spb@textsubscript@save{\l__spb_sub_cmd_ii_tl{#2}} } } \cs_set_eq:NN \spbifmath \use_ii:nn \cs_new:Npn \spb@ifmathtrue { \cs_set_eq:NN \spbifmath \use_i:nn } \cs_new:Npn \spb@ifmathfalse { \cs_set_eq:NN \spbifmath \use_ii:nn } \cs_new_protected:Npn \spb_mode_switch:nnn #1#2#3 { \str_case:Vn \l__spb_mode_value_tl { { math } { \spb@ifmathtrue \use:c { spb_math_print_store_#3:nn } {#1} {#2} } { text } { \spb@ifmathfalse \use:c { spb_text_print_store_#3:nn } {#1} {#2} } { match } { \mode_if_math:TF { \spb@ifmathtrue \use:c { spb_math_print_store_#3:nn } {#1} {#2} } { \spb@ifmathfalse \use:c { spb_text_print_store_#3:nn } {#1} {#2} } } } } \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 } \tl_set:Nn \l__spb_box_max_wd_tl { \dim_max:VV \l__spb_boxa_wd_tl \l__spb_boxb_wd_tl } \providecommand{\hbox_overlap_center:n}[1] { \hbox_to_zero:n { \hss #1\hss } } \cs_new:Npn \spb_boxa_move_up:n #1 { \box_move_up:nn {#1} { \box_use:N \l_tmpa_box } } \cs_new:Npn \spb_boxa_move_down:n #1 { \box_move_down:nn {#1} { \box_use:N \l_tmpa_box } } \cs_new:Npn \spb_boxb_move_down:n #1 { \box_move_down:nn {#1} { \box_use:N \l_tmpb_box } } \cs_new:Npn \spb_boxa_vmove:nn #1 { \str_case:nn {#1} { { super } { \spb_boxa_move_up:n } { sub } { \spb_boxa_move_down:n } } } \cs_generate_variant:Nn \spb_boxa_move_up:n { V } \cs_generate_variant:Nn \spb_boxb_move_down:n { V } \dim_new:N \l__spb_supersub_half_vsep_tl \cs_new:Npn \spb_hbox_overlap_vmove:n #1 { \tl_set:Nn \l__spb_supersub_half_vsep_tl { \l__spb_supersub_vsep_tl/2 } \use:c { hbox_overlap_#1:n } { \spb_boxa_move_up:V \l__spb_supersub_half_vsep_tl } \use:c { hbox_overlap_#1:n } { \spb_boxb_move_down:V \l__spb_supersub_half_vsep_tl } } \cs_new_protected:Npn \spb_box_ht_dp_assign:nn #1#2 { \tl_if_empty:nF {#1} { \box_set_ht:Nn \l_tmpa_box {#1} } \tl_if_novalue:nF {#2} { \box_set_dp:Nn \l_tmpa_box {#2} } } \NewDocumentCommand{\spb@both@cmd@assign} {t+>{\SplitArgument{1}{,}}m} { \IfBooleanTF{#1} {\spb_supersub_both_addto_cmd:nn #2} {\spb_supersub_both_cmd:nn #2} } \cs_new_protected:Npn \spb_supersub_both_cmd:nn #1#2 { \tl_set:Nn \l__spb_super_cmd_ii_tl {#1} \tl_if_novalue:nTF {#2} { \tl_clear:N \l__spb_sub_cmd_ii_tl } { \tl_set:Nn \l__spb_sub_cmd_ii_tl {#2} } } \cs_new_protected:Npn \spb_supersub_both_addto_cmd:nn #1#2 { \tl_put_right:Nn \l__spb_super_cmd_ii_tl {#1} \tl_if_novalue:nF {#2} { \tl_put_right:Nn \l__spb_sub_cmd_ii_tl {#2} } } \cs_new_protected:Npn \spb_global_value_init:n #1 { \tl_gset:Nn \g__spb_hmove_init_tl {#1} \tl_gset:Nn \g__spb_vmove_init_tl {#1} \tl_gset:Nn \g__spb_cmd_init_tl {#1} } \cs_new_protected:Npn \spb_both_newcmd_map:n #1 { \exp_args:Nc \NewDocumentCommand {#1} {O{}>{\SplitArgument{1}{,}}O{}mO{}} { \group_begin: \spb_global_value_init:n {#1} \keys_set:nn { ctex/style } {##1,##4} \spb_mode_switch:nnn {#1} {##3} { i } \spb_content_hbox_set:n {#1} \spb_box_ht_dp_assign:nn ##2 \box_use:N \l_tmpa_box \group_end: } } \cs_new_protected:Npn \spb_content_hbox_set:n #1 { \hbox_set:Nn \l_tmpa_box { \dim_compare:nNnTF { \tl_use:c { l__spb_#1_hmove_tl } } < { 0pt } { \hbox_overlap_left:n { \hbox_overlap_right:n { \spb_boxa_vmove:nn {#1} { \tl_use:c { l__spb_#1_vmove_tl } } } \skip_horizontal:n { -\tl_use:c { l__spb_#1_hmove_tl } } } } { \hbox_to_wd:nn { \l__spb_boxa_wd_tl + \tl_use:c { l__spb_#1_hmove_tl } } { \hss\spb_boxa_vmove:nn {#1} { \tl_use:c { l__spb_#1_vmove_tl } } } } } } \clist_map_inline:nn { super,sub } { \spb_both_newcmd_map:n {#1} } \cs_new:Npn \spb_supersub_hmove_if_negative:TF #1#2 { \dim_compare:VNnTF \l__spb_supersub_hmove_tl < { 0pt } {#1} {#2} } \NewDocumentCommand{\supersub}{O{}mmO{}} { \group_begin: \spb_global_value_init:n { supersub } \keys_set:nn { ctex/style } {#1,#4} \spb_mode_switch:nnn {#2} {#3} { ii } \str_case:VnF \l__spb_supersub_halign_tl { { l } { \use_i:nnn } { c } { \use_ii:nnn } { r } { \use_iii:nnn } } { \msg_warning:nn { spbmark } { unsupported-align } \use_i:nnn } { \spb_supersub_hmove_if_negative:TF { \hbox_overlap_left:n { \spb_hbox_overlap_vmove:n { right } \skip_horizontal:n { -\l__spb_supersub_hmove_tl } } } { \hbox:n { \skip_horizontal:n { \l__spb_supersub_hmove_tl } \spb_hbox_overlap_vmove:n { right } \skip_horizontal:n { \l__spb_box_max_wd_tl } } } } { \spb_supersub_hmove_if_negative:TF { \hbox_overlap_left:n { \spb_hbox_overlap_vmove:n { center } \skip_horizontal:n { -\l__spb_supersub_hmove_tl - \l__spb_box_max_wd_tl/2 } } } { \hbox:n { \skip_horizontal:n { \l__spb_box_max_wd_tl/2 + \l__spb_supersub_hmove_tl } \spb_hbox_overlap_vmove:n { center } \skip_horizontal:n { \l__spb_box_max_wd_tl/2 } } } } { \spb_supersub_hmove_if_negative:TF { \hbox_overlap_left:n { \spb_hbox_overlap_vmove:n { left } \skip_horizontal:n { -\l__spb_supersub_hmove_tl - \l__spb_box_max_wd_tl } } } { \hbox:n { \skip_horizontal:n { \l__spb_box_max_wd_tl + \l__spb_supersub_hmove_tl } \spb_hbox_overlap_vmove:n { left } } } } \group_end: } \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_newsupb_text_bool { \cs_set_eq:NN \textsuperscript \super \cs_set_eq:NN \textsubscript \sub } \bool_if:NT \l_spb_newsupb_math_bool { \cs_set_eq:NN \sp \super \cs_set_eq:NN \sb \sub } \bool_if:NT \l_spb_newsupb_foot_bool { \cs_set:Npn \@makefnmark { \hbox:n { \fnmarkfont{\super{\@thefnmark}} } } } \cs_set_eq:NN \spb \supersub \tl_if_exist:NTF \ftntm@font { \tl_set_eq:NN \fnmarkfont \ftntm@font } { \tl_set_eq:NN \fnmarkfont \normalfont } \endinput % % End of file `spbmark.sty'.