summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/rbt-mathnotes/rbt-mathnotes-util.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/rbt-mathnotes/rbt-mathnotes-util.sty')
-rw-r--r--macros/latex/contrib/rbt-mathnotes/rbt-mathnotes-util.sty180
1 files changed, 180 insertions, 0 deletions
diff --git a/macros/latex/contrib/rbt-mathnotes/rbt-mathnotes-util.sty b/macros/latex/contrib/rbt-mathnotes/rbt-mathnotes-util.sty
new file mode 100644
index 0000000000..b95c73da01
--- /dev/null
+++ b/macros/latex/contrib/rbt-mathnotes/rbt-mathnotes-util.sty
@@ -0,0 +1,180 @@
+%% rbt-mathnotes-util.sty
+%% Copyright 2021 Rebecca B. Turner.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Rebecca B. Turner.
+%
+% This work consists of the files:
+% README.md
+% rbt-mathnotes.tex
+% rbt-mathnotes.sty
+% rbt-mathnotes.cls
+% rbt-mathnotes-util.sty
+% rbt-mathnotes-messages.sty
+% rbt-mathnotes-hw.cls
+% rbt-mathnotes-formula-sheet.cls
+% examples/cheat-sheet.tex
+% examples/multivar.tex
+% examples/topology-hw-1.tex
+% and the derived files:
+% rbt-mathnotes.pdf
+% examples/cheat-sheet.pdf
+% examples/multivar.pdf
+% examples/topology-hw-1.pdf
+
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\ProvidesExplPackage{rbt-mathnotes-util}{2021/11/29}{1.0.2}{Utility commands
+ for rbt-mathnotes.}
+
+\cs_set:Npn \mn__legacy_bool_option:n #1
+ {
+ \bool_new:c { g__mn_#1_bool }
+ \csname if\@currname @#1 \endcsname
+ \bool_gset_true:c { g__mn_#1_bool }
+ \else
+ \bool_gset_false:c { g__mn_#1_bool }
+ \fi
+ }
+
+\keys_define:nn { mn_options }
+ {
+ init .tl_set:N = \l__mn_options_init_tl ,
+ init .default:n = true ,
+ init .initial:x = \tl_use:N \c_novalue_tl ,
+
+ default .tl_set:N = \l__mn_options_default_tl ,
+ default .value_required:n = true ,
+ default .initial:x = \tl_use:N \c_novalue_tl ,
+
+ type .choice: ,
+ type .choices:nn = { bool, str }
+ { \tl_set_eq:NN \l__mn_options_type_tl \l_keys_choice_tl } ,
+ type .value_required:n = true ,
+ type .initial:n = bool ,
+ }
+
+% A hook which executes after \ProcessKeyvalOptions and is used to convert
+% TeX booleans and so on to LaTeX3 booleans and strings.
+\tl_new:N \g__mn_after_options_hook_tl
+% A hook used to define a particular option, allowing keys to be set only in
+% a group.
+\tl_new:N \g__mn_define_option_tl
+% Initializes complementary #1 and no#1 package options.
+\NewDocumentCommand \mn__option_new { o m }
+ {
+ \tl_gclear:N \g__mn_define_option_tl
+ \group_begin:
+ \tl_if_novalue:nF { #1 }
+ { \keys_set:nn { mn_options } { #1 } }
+
+ \tl_set:Nn \l_tmpa_tl { bool }
+ \tl_if_eq:NNT \l__mn_options_type_tl \l_tmpa_tl
+ {
+ % If no default was given, use `false` for bools.
+ \tl_if_eq:NNT \l__mn_options_init_tl \c_novalue_tl
+ { \tl_set:Nn \l__mn_options_init_tl { false } }
+
+ \tl_gput_right:Nx \g__mn_define_option_tl
+ {
+ \exp_not:N \DeclareBoolOption [\l__mn_options_init_tl]{#2}
+ \exp_not:N \DeclareComplementaryOption {no#2}{#2}
+ }
+
+ % After we process options, convert to an expl3 bool.
+ \tl_gput_right:Nn \g__mn_after_options_hook_tl
+ {
+ % Adapt the legacy bool into an expl3 bool.
+ \mn__legacy_bool_option:n { #2 }
+ % Then, delete the legacy bool.
+ \mn__legacy_bool_undefine:n { \@currname @#2 }
+ }
+ }
+
+ % For a string option:
+ \tl_set:Nn \l_tmpa_tl { str }
+ \tl_if_eq:NNT \l__mn_options_type_tl \l_tmpa_tl
+ {
+ \tl_gput_right:No \g__mn_define_option_tl
+ {
+ \exp_not:N \DeclareStringOption
+ \tl_if_eq:NNF \l__mn_options_init_tl \c_novalue_tl
+ { [\l__mn_options_init_tl] }
+ { #2 }
+ \tl_if_eq:NNF \l__mn_options_default_tl \c_novalue_tl
+ { [\l__mn_options_default_tl] }
+ }
+
+ \tl_gput_right:Nn \g__mn_after_options_hook_tl
+ {
+ % Create the new tl for this option.
+ \tl_new:c { g__mn_#2_tl }
+ % Set it to the command kvoptions created.
+ \tl_set:co { g__mn_#2_tl } { \cs:w \@currname @#2 \cs_end: }
+ % Delete the old command.
+ \cs_undefine:c { \@currname @#2 }
+ }
+ }
+ \group_end:
+ \tl_use:N \g__mn_define_option_tl
+ }
+
+\cs_set:Npn \mn__process_options:n #1
+ {
+ \ProcessKeyvalOptions { #1 }
+ \tl_use:N \g__mn_after_options_hook_tl
+ }
+
+\cs_set:Npn \mn__legacy_bool_undefine:n #1
+ {
+ \cs_undefine:c { if#1 }
+ \cs_undefine:c { #1true }
+ \cs_undefine:c { #1false }
+ }
+
+% Package configuration string values.
+% {< module >}{< family >}{< key name >}
+\cs_set:Npn \mn__key_new:nnn #1#2#3
+ {
+ \tl_set_eq:cN { l__#1_#3_tl } \c_novalue_tl
+ \keys_define:nn { #2 }
+ {
+ #1 .value_required:n = true,
+ #1 .tl_set:c = l__#1_#3_tl,
+ }
+ }
+
+\cs_set:Npn \mn__mathnotes_key_new:n #1
+ {
+ \mn__key_new:nnn { mn } { mathnotes } { #1 }
+ }
+
+\cs_set:Npn \mn__keys_new:n #1 { \clist_map_function:nN { #1 } \mn__mathnotes_key_new:n }
+
+\prg_new_conditional:Npnn \mn__if_package_loaded:n #1
+ { p, T, F, TF }
+ {
+ \@ifpackageloaded { #1 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \mn__if_novalue:N #1
+ { p, T, F, TF }
+ {
+ \tl_if_eq:NNTF \c_novalue_tl #1
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\prg_generate_conditional_variant:Nnn \mn__if_novalue:N
+ { c }
+ { p, T, F, TF }