diff options
Diffstat (limited to 'macros/latex/contrib/spbmark/spbmark.sty')
-rw-r--r-- | macros/latex/contrib/spbmark/spbmark.sty | 159 |
1 files changed, 109 insertions, 50 deletions
diff --git a/macros/latex/contrib/spbmark/spbmark.sty b/macros/latex/contrib/spbmark/spbmark.sty index c1ce4837a5..eb6b248a82 100644 --- a/macros/latex/contrib/spbmark/spbmark.sty +++ b/macros/latex/contrib/spbmark/spbmark.sty @@ -1,15 +1,15 @@ % % ***************** THE SPBMARK PACKAGE ***************** % -% Copyright (C) 2021-2024 by Qu Yi <toquyi@163.com> +% Copyright (C) 2021-2025 by Qu Yi <toquyi@163.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}{2024/05/19}{1.46j} +\RequirePackage{xparse} +\ProvidesExplPackage{spbmark}{2025/02/08}{1.46x} {Customize superscripts and subscripts} \cs_generate_variant:Nn \box_set_ht:Nn { cv } @@ -32,6 +32,16 @@ \cs_new_protected:Npn \spb_define:n { \keys_define:nn { ctex/tools } } \cs_new_protected:Npn \spb_set:n { \keys_set:nn { ctex/tools } } \cs_set_eq:NN \spbset \spb_set:n +\cs_new_protected:Npn \spb_mark_core_set_trad:n #1 + { + \cs_set_eq:cc { spb@text#1script@core } { spb@text#1script@save } + \cs_set_eq:cc { spb@math@#1@core } { spb@math@#1@save } + } +\cs_new_protected:Npn \spb_mark_core_set_none:n #1 + { + \cs_set_eq:cN { spb@text#1script@core } \use:n + \cs_set_eq:cN { spb@math@#1@core } \use:n + } \keys_define:nn { spbmark/option } { @@ -43,8 +53,8 @@ }, text/false .code:n = { - \cs_set:Npn \textsuperscript { \spb@textsuperscript@save } - \cs_set:Npn \textsubscript { \spb@textsubscript@save } + \cs_set:Npn \textsuperscript { \spb@textsuperscript@core } + \cs_set:Npn \textsubscript { \spb@textsubscript@core } }, text .default:n = true, math .choice:, @@ -55,8 +65,8 @@ }, math/false .code:n = { - \cs_set:Npn \sp { \spb@math@super@save } - \cs_set:Npn \sb { \spb@math@sub@save } + \cs_set:Npn \sp { \spb@math@super@core } + \cs_set:Npn \sb { \spb@math@sub@core } }, math .default:n = true, foot .choice:, @@ -71,7 +81,17 @@ both .meta:n = { text = #1,math = #1 }, both .default:n = true, all .meta:n = { text = #1,math = #1,foot = #1 }, - all .default:n = true + all .default:n = true, + spcore .choice:, + spcore .value_required:n = true, + spcore/trad .code:n = \spb_mark_core_set_trad:n { super }, + spcore/none .code:n = \spb_mark_core_set_none:n { super }, + spcore .initial:n = trad, + sbcore .choice:, + sbcore .value_required:n = true, + sbcore/trad .code:n = \spb_mark_core_set_trad:n { sub }, + sbcore/none .code:n = \spb_mark_core_set_none:n { sub }, + sbcore .initial:n = trad } \char_set_catcode_active:N \~ \keys_define:nn { spbmark/option } @@ -108,17 +128,27 @@ { \tl_set_eq:NN \fnmarkfont \ftntm@font } { \tl_set_eq:NN \fnmarkfont \normalfont } -\ProcessKeysOptions{spbmark/option} +\cs_if_exist:NTF \ProcessKeyOptions + { \ProcessKeyOptions[spbmark/option] } + { + \RequirePackage{l3keys2e} + \ProcessKeysOptions{spbmark/option} + } \tl_new:N \g__spb_mark_case_init_tl +\bool_new:N \l__spb_mark_at_local_bool \cs_new_protected:Npn \spb_local_case_init:nnn #1#2#3 { - \str_case:Vn \g__spb_mark_case_init_tl + \bool_if:NTF \l__spb_mark_at_local_bool { - { super } {#1} - { sub } {#2} - { supersub } {#3} + \str_case:Vn \g__spb_mark_case_init_tl + { + { super } {#1} + { sub } {#2} + { supersub } {#3} + } } + { #1#2#3 } } \NewDocumentCommand{\spb@both@vsep@assign} {>{\SplitArgument{1}{,}}m} @@ -197,7 +227,7 @@ { \box_move_up:nn {#1} { \box_use:N \g__super_ii_box } } \cs_new:Npn \spb_box_sub_move_down_ii:n #1 { \box_move_down:nn {#1} { \box_use:N \g__sub_ii_box } } -\cs_new:Npn \spb_box_vmove_i:nn #1 +\cs_new:Npn \spb_inner_box_vmove_i:nn #1 { \str_case:nn {#1} { @@ -208,7 +238,7 @@ \cs_generate_variant:Nn \spb_box_super_move_up_ii:n { V } \cs_generate_variant:Nn \spb_box_sub_move_down_ii:n { V } \providecommand{\hbox_overlap_center:n}[1] - { \hbox_to_zero:n { \hss #1\hss } } + {\hbox_to_zero:n { \hss #1\hss }} \cs_new:Npn \spb_hbox_overlap_vmove_ii:n #1 { \use:c { hbox_overlap_#1:n } @@ -308,40 +338,70 @@ \tl_set:Nn \maxwd { \dim_max:VV \superwd \subwd } \tl_set:Nn \l__spb_box_super_wd_i_tl { \box_wd:N \g__super_i_inner_box } \tl_set:Nn \l__spb_box_sub_wd_i_tl { \box_wd:N \g__sub_i_inner_box } -\cs_new:Npn \spb_math_print_store_i:nn #1#2 +\providecommand{\NewHookWithArguments}[2]{} +\providecommand{\UseHookWithArguments}[4]{} +\NewHookWithArguments{spb/super/before}{2} +\NewHookWithArguments{spb/super/after}{2} +\NewHookWithArguments{spb/sub/before}{2} +\NewHookWithArguments{spb/sub/after}{2} +\NewHookWithArguments{spb/super*/before}{2} +\NewHookWithArguments{spb/super*/after}{2} +\NewHookWithArguments{spb/sub*/before}{2} +\NewHookWithArguments{spb/sub*/after}{2} +\NewHookWithArguments{cmd+/super/after}{2} +\NewHookWithArguments{cmd+/sub/after}{2} +\cs_new:Npn \spb_math_print_store_i:nnnn #1#2#3#4 { - \hbox_gset:cn { g__#1_i_inner_box } - { - \ensuremath - { - \use:c { spb@math@#1@save } - { \tl_use:c { l__spb_#1_cmd_i_tl }{#2} } + \bool_if:NTF \l__spb_nobox_mark_bool + { \tl_gset:cn { g__#1_i_nobox_mark_tl } } + { \hbox_gset:cn { g__#1_i_inner_box } } + { + #3{ + \UseHookWithArguments{spb/#1/before}{2}{#1}{#2} + \use:c {#4} { \tl_use:c { l__spb_#1_cmd_i_tl }{#2} } + \UseHookWithArguments{spb/#1/after}{2}{#1}{#2} } } \dim_gset:Nv \rlastwd { l__spb_box_#1_wd_i_tl } } +\cs_new:Npn \spb_math_print_store_i:nn #1#2 + { + \spb_math_print_store_i:nnnn + {#1} {#2} { \ensuremath } { spb@math@#1@core } + } \cs_new:Npn \spb_text_print_store_i:nn #1#2 { - \hbox_gset:cn { g__#1_i_inner_box } + \spb_math_print_store_i:nnnn + {#1} {#2} { \use:n } { spb@text#1script@core } + } +\cs_new:Npn \spb_math_print_store_ii:nnnnn #1#2#3#4#5 + { + \hbox_gset:Nn \g__super_ii_box { - \use:c { spb@text#1script@save } - { \tl_use:c { l__spb_#1_cmd_i_tl }{#2} } + #3{ + \UseHookWithArguments{spb/super*/before}{2}{super}{#1} + #4{\l__spb_super_cmd_ii_tl{#1}} + \UseHookWithArguments{spb/super*/after}{2}{super}{#1} + } + } + \hbox_gset:Nn \g__sub_ii_box + { + #3{ + \UseHookWithArguments{spb/sub*/before}{2}{sub}{#2} + #5{\l__spb_sub_cmd_ii_tl{#2}} + \UseHookWithArguments{spb/sub*/after}{2}{sub}{#2} + } } - \dim_gset:Nv \rlastwd { l__spb_box_#1_wd_i_tl } } \cs_new:Npn \spb_math_print_store_ii:nn #1#2 { - \hbox_gset:Nn \g__super_ii_box - { \ensuremath{\spb@math@super@save{\l__spb_super_cmd_ii_tl{#1}}} } - \hbox_gset:Nn \g__sub_ii_box - { \ensuremath{\spb@math@sub@save{\l__spb_sub_cmd_ii_tl{#2}}} } + \spb_math_print_store_ii:nnnnn {#1} {#2} + { \ensuremath } { \spb@math@super@core } { \spb@math@sub@core } } \cs_new:Npn \spb_text_print_store_ii:nn #1#2 { - \hbox_gset:Nn \g__super_ii_box - { \spb@textsuperscript@save{\l__spb_super_cmd_ii_tl{#1}} } - \hbox_gset:Nn \g__sub_ii_box - { \spb@textsubscript@save{\l__spb_sub_cmd_ii_tl{#2}} } + \spb_math_print_store_ii:nnnnn {#1} {#2} + { \use:n } { \spb@textsuperscript@core } { \spb@textsubscript@core } } \cs_set_eq:NN \spbifmath \use_ii:nn \cs_new:Npn \spb@ifmathtrue { \cs_set_eq:NN \spbifmath \use_i:nn } @@ -395,7 +455,8 @@ spregex .tl_set:N = \l__spb_super_regex_next_tl, spregex .initial:n = \c{sub}|\c{textsubscript}|\c{sb}|\_, sbregex .tl_set:N = \l__spb_sub_regex_next_tl, - sbregex .initial:n = \c{super}|\c{textsuperscript}|\c{sp}|\^ + sbregex .initial:n = \c{super}|\c{textsuperscript}|\c{sp}|\^, + nobox .bool_set:N = \l__spb_nobox_mark_bool } \cs_new:Npn \spb_clear_thiswd:n #1 { @@ -435,23 +496,29 @@ \exp_args:Nc \NewDocumentCommand {#1}{sO{}O{}mO{}} { \group_begin: + \bool_set_true:N \l__spb_mark_at_local_bool \mode_leave_vertical: \tl_gset:Nn \g__spb_mark_case_init_tl {#1} \spb_set:n { ##2,##3,##5 } \spb_mode_switch:nnn {#1} {##4} { i } - \spb_content_hbox_set:nn {#1} {##1} - \spb_ht_dp_assign:nnnn {#1} {#1} { i } { _outer } - \box_use:c { g__#1_i_outer_box } + \bool_if:NTF \l__spb_nobox_mark_bool + { \tl_use:c { g__#1_i_nobox_mark_tl } } + { + \spb_mark_box_set:nn {#1} {##1} + \spb_ht_dp_assign:nnnn {#1} {#1} { i } { _outer } + \box_use:c { g__#1_i_outer_box } + } \exp_last_unbraced:Nx \group_end: { + \UseHookWithArguments{cmd+/#1/after}{2}{#1}{##4} \exp_args:Nv \str_if_eq:nnT { l__spb_#1_thiswd_mode_tl } { auto } { \spb_clear_thiswd:n {#1} } } } } -\cs_new_protected:Npn \spb_content_hbox_set:nn #1#2 +\cs_new_protected:Npn \spb_mark_box_set:nn #1#2 { \dim_gset:Nn \clastwd { (\llastwd + \rlastwd)/2 } \tl_set:Nn \abs@hmove@i { \dim_abs:v { l__spb_#1_hmove_tl } } @@ -462,7 +529,7 @@ \hbox_overlap_left:n { \hbox_overlap_right:n - { \spb_box_vmove_i:nn {#1} { \tl_use:c { l__spb_#1_vmove_tl } } } + { \spb_inner_box_vmove_i:nn {#1} { \tl_use:c { l__spb_#1_vmove_tl } } } \skip_horizontal:n { \abs@hmove@i } } \IfBooleanT{#2} @@ -474,7 +541,7 @@ { \hbox_to_wd:nn { \tl_use:c { l__spb_box_#1_wd_i_tl } + \tl_use:c { l__spb_#1_hmove_tl } } - { \hss\spb_box_vmove_i:nn {#1} { \tl_use:c { l__spb_#1_vmove_tl } } } + { \hss\spb_inner_box_vmove_i:nn {#1} { \tl_use:c { l__spb_#1_vmove_tl } } } } } \dim_gset:Nv \llastwd { l__spb_box_#1_wd_i_tl } @@ -495,6 +562,7 @@ \NewDocumentCommand{\supersub}{sO{}mmO{}} { \group_begin: + \bool_set_true:N \l__spb_mark_at_local_bool \mode_leave_vertical: \tl_gset:Nn \g__spb_mark_case_init_tl { supersub } \spb_set:n {#2,#5} @@ -579,15 +647,6 @@ {\AddToHook{package/easybase/after}} {\use:n} { \keys_define:nn { } { ctex/tools .inherit:n = spbmark/option } } -\IfFormatAtLeastTF{2021/11/15} - { - \AddToHook{package/altsubsup/after} - { - \ifaltsbsp@spbmark - \SetAltSubSupCommands{\relax} - \else\fi - } - }{} \cs_set_eq:NN \spb \supersub \endinput % |