diff options
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/semantex/semantex.sty | 5107 |
1 files changed, 3597 insertions, 1510 deletions
diff --git a/Master/texmf-dist/tex/latex/semantex/semantex.sty b/Master/texmf-dist/tex/latex/semantex/semantex.sty index 8e8361c8dc7..3ed17fb64ae 100644 --- a/Master/texmf-dist/tex/latex/semantex/semantex.sty +++ b/Master/texmf-dist/tex/latex/semantex/semantex.sty @@ -1,98 +1,118 @@ \RequirePackage{expl3,xparse} -\ProvidesExplPackage{semantex}{2020/05/30}{0.1alpha}{} -% IMPORTANT: +\ProvidesExplPackage{semantex}{2020/07/06}{0.2alpha}{} -% Because of the definition of \semantexnormalscaling, the package now requires amsmath +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% ERROR MESSAGES +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Think about changing “upper” etc. into “supper”, whereas what is now -% “upper” could be called “uppernosep” or something similar. -% Fix left sub- and superscripts, e.g. the right spacing +\msg_new:nnnn { semantex } { valuekey_not_found } { Unknown~key~#2~passed~to~#1~on~line~\msg_line_number: } {} -% Allow “.” (nothing) as delimiter, even in the case of normal or \big etc +\msg_new:nnnn { semantex } { arg_valuekey_not_found } { Unknown~argument~key~#2~passed~to~#1~on~line~\msg_line_number: } {} -% Instead of checking if you are equal to semantexvarible when doing -% inheritance, check if you are your own parent. This allows multiple -% “primitive” classes. -% Also remove commands like \newsemantexvariable etc. -% in order to force people to create their own classes +\msg_new:nnnn { semantex } { data_tl_not_found } { Unknown~data~#2~requested~from~#1~on~line~\msg_line_number: } {} -% Create 2valuekeys, 3valuekeys etc. +\msg_new:nnnn { semantex } { data_int_not_found } { Unknown~integer~#2~requested~from~#1~on~line~\msg_line_number: } {} -% Test if \exp_not:n can be removed in #1 (=\keyvalue) if -% another \exp_not:n is added in the data manipulation commands. +\msg_new:nnnn { semantex } { data_bool_not_found } { Unknown~boolean~#2~requested~from~#1~on~line~\msg_line_number: } {} -% Build groups and \ext_args:NV around the definition of -% \l_semantex_key_value_temp in order to only -% define this command locally. +\msg_new:nnnn { semantex } { data_cs_not_found } { Unknown~command~sequence~#2~requested~from~#1~on~line~\msg_line_number: } {} -% Allow two keys, nopar and absolutelynopar. The difference is that -% nopar becomes par if there is more than one argument +\msg_new:nnnn { semantex } { data_prop_not_found } { Unknown~property~list~#2~requested~from~#1~on~line~\msg_line_number: } {} -% Allow left arguments! +\msg_new:nnnn { semantex } { key_value_not_found } { Unknown~value~#3~passed~to~key~#2~in~#1~on~line~\msg_line_number: } {} +\msg_new:nnnn { semantex } { class_already_defined } { Class~#1~already~defined;~you~tried~defining~it~again~on~line~\msg_line_number: } {} -% LIST OF BUGS: +\msg_new:nnnn { semantex } { object_already_defined } { Object~#1~already~defined;~you~tried~defining~it~again~on~line~\msg_line_number: } {} -%IM A change has been made in catlimits. It shows the existence of a -%IM kind of bug in semantex +\msg_new:nnnn { semantex } { class_not_found } { Unknown~class~#3~declared~as~#2~of~#1~on~line~\msg_line_number: } {} -%IM Removed \!\!\!\! in catlimits +\msg_new:nnnn { semantex } { object_not_found } { You~set~#1~as~#2~of~unknown~object~#3~on~line~\msg_line_number: } {} +\msg_new:nnnn { semantex } { created_object_of_unknown_class } { Unknown~class~#1~declared~as~class~of~object~#2~on~line~\msg_line_number: } {} -\msg_new:nnnn { semantex } { keyval_not_found } { Unknown~key~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {} +\msg_new:nnnn { semantex } { created_a_SemantexVariable } { Never~create~objects~of~class~\SemantexVariable;~create~a~new~class~yourself~instead.~You~created~the~object~#1~on~line~\msg_line_number: } {} -\msg_new:nnnn { semantex } { arg_valuekey_not_found } { Unknown~argument~key~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {} +\cs_generate_variant:Nn \msg_error:nnnn { nnnx } -\msg_new:nnnn { semantex } { tl_not_found } { Unknown~data~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {} -%IM should be changed so that this is passed to the actual object, not -%IM the parent object, e.g., by having a third argument containing the -%IM actual object in \g_semantex_data_tl_get:nn +\tl_new:N\l__semantex_error_output_format_temp +\cs_new:Npn\semantex_error_output_format:nN#1#2 +{ + \tl_set:Nn \l__semantex_error_output_format_temp { #1 } + \tl_replace_all:Nnn \l__semantex_error_output_format_temp { object_ } { object~\cs:w } + \tl_replace_all:Nnn \l__semantex_error_output_format_temp { class_ } { class~\cs:w } + \tl_put_right:Nn \l__semantex_error_output_format_temp { \cs_end: } + \tl_trim_spaces:N \l__semantex_error_output_format_temp + \tl_set_eq:NN #2 \l__semantex_error_output_format_temp +} -\msg_new:nnnn { semantex } { parent_not_found } { Unknown~class~#1~set~as~parent~of~object~#2~on~input~line~\msg_line_number: } {} +\cs_generate_variant:Nn \msg_error:nnnnn { nnxnn } -\msg_new:nnnn { semantex } { data_tl_not_found } { Unknown~data~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {} +\cs_generate_variant:Nn \msg_error:nnnn { nnxn } -% Extra cs variants we need: +\cs_generate_variant:Nn \msg_error:nnn { nnx } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% COMMANDS FOR BULLETS AND SLOTS +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\cs_generate_variant:Nn \keyval_parse:NNn { cco } -\cs_generate_variant:Nn \tl_if_blank:nTF { vTF } -\tl_set:Nn \semantexbullet {\raisebox{-0.25ex}{\scalebox{1.2}{$\cdot$}}} -\tl_set:Nn \semantexdoublebullet {\semantexbullet\semantexbullet} +\box_new:N \l__semantex_bullet_box +\hbox_set:Nn \l__semantex_bullet_box { $\cdot$ } +\box_scale:Nnn \l__semantex_bullet_box {1.2} {1.2} +\tl_set:Nn\g_semantex_bullet +{ + \box_move_up:nn{-0.25ex}{\box_use:N \l__semantex_bullet_box} +} -\tl_set:Nn \semantexslot { \mathord{-} } +\tl_set:Nn\g_semantex_double_bullet{\g_semantex_bullet \g_semantex_bullet} +\tl_set_eq:NN\SemantexBullet \g_semantex_bullet +\tl_set_eq:NN \SemantexDoubleBullet \g_semantex_double_bullet +\tl_set:Nn \g_semantex_slot { \mathord{-} } +\tl_set_eq:NN \SemantexSlot \g_semantex_slot -\DeclareDocumentCommand\newbinaryclass{mO{}} % new binary-type class +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% USER COMMANDS FOR CREATING NEW CLASSES +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +\DeclareDocumentCommand\semantex_new_simple_class:Nw{mO{}} % new simple-type class { % #1 = class name % #2 = options - \semantexnewclass { #1 } { #2 } - \exp_args:Nc\DeclareDocumentCommand{#1}{mo}{ + \semantex_new_class:Nn { #1 } { #2 } + \DeclareDocumentCommand{#1}{mo}{ % the actual \#1 command \IfValueTF{##2} { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, ##2 } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2 } } { - \semantexrenderclass { #1 } { symbol = { ##1 } } + \semantex_render_class:Nn #1 { symbol = { ##1 } } } } - \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmo}{ + \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmo}{ \IfValueTF{##3} { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, ##3 } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3 } } { - \semantexrenderclass { #1 } { symbol = { ##2 }, ##1 } + \semantex_render_class:Nn #1 { symbol = { ##2 }, ##1 } } } - \exp_args:Nc\DeclareDocumentCommand{new#1}{mgO{}} + \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}} { % the command for creating a new object of class #1 % ##1 = command name, with backslash @@ -100,75 +120,77 @@ % ##3 = options \IfValueTF{##2} { - \semantexnewobject { #1 } ##1 { parent = #1, symbol = { ##2 }, ##3 } + \semantex_new_object:NNn { #1 } ##1 { symbol = { ##2 }, ##3 } } { - \semantexnewobject { #1 } ##1 { parent = #1, ##3 } + \semantex_new_object:NNn { #1 } ##1 { ##3 } } % create the object with name ##1 \DeclareDocumentCommand{##1}{o}{ % the actual \##1 command \IfValueTF { ####1 } { - \semantexrenderobject { ##1 } { ifoutput=true,####1 } + \semantex_render_object:Nn ##1 { ifoutput=true,####1 } } { - \semantexrenderobject { ##1 } { } + \semantex_render_object:Nn ##1 { } } } } } +\tl_set_eq:NN\NewSimpleClass\semantex_new_simple_class:Nw + %IM Consider using \semantexIfNoValueOrDotTF on the argument -\DeclareDocumentCommand\newvariableclass{mO{}} % new variable-type class +\DeclareDocumentCommand\semantex_new_variable_class:Nw{mO{}} % new variable-type class { % #1 = class name % #2 = options - \semantexnewclass { #1 } { #2 } - \exp_args:Nc\DeclareDocumentCommand{#1}{mog}{ + \semantex_new_class:Nn { #1 } { #2 } + \DeclareDocumentCommand{#1}{mog}{ % the actual \#1 command \IfValueTF { ##2 } { \IfValueTF { ##3 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1},##2,arg={##3} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},##2,arg={##3} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1},##2} + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},##2} } } { \IfValueTF { ##3 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1},arg={##3} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},arg={##3} } } { - \semantexrenderclass { #1 } { symbol={##1} } + \semantex_render_class:Nn #1 { symbol={##1} } } } } - \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmog}{ + \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmog}{ \IfValueTF { ##3 } { \IfValueTF { ##4 }{ - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3,arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3,arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3 } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3 } } } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1,arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,arg={##4} } } { - \semantexrenderclass { #1 } { symbol={##2}, ##1 } + \semantex_render_class:Nn #1 { symbol={##2}, ##1 } } } } - \exp_args:Nc\DeclareDocumentCommand{new#1}{mgO{}} + \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}} { % the command for creating a new object of class #1 % ##1 = command name, with backslash @@ -176,10 +198,10 @@ % ##3 = options \IfValueTF{##2} { - \semantexnewobject { #1 } ##1 { parent = #1, symbol = { ##2 }, ##3 } + \semantex_new_object:NNn { #1 } ##1 { symbol = { ##2 }, ##3 } } { - \semantexnewobject { #1 } ##1 { parent = #1, ##3 } + \semantex_new_object:NNn { #1 } ##1 { ##3 } } % creates the object with name ##1 \DeclareDocumentCommand{##1}{og}{ @@ -187,66 +209,66 @@ \IfValueTF{####1}{ \IfValueTF{####2} { - \semantexrenderobject { ##1 } { ifoutput=true,####1, arg={####2} } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg={####2} } } { - \semantexrenderobject { ##1 } { ifoutput=true,####1} + \semantex_render_object:Nn ##1 { ifoutput=true,####1} } } { \IfValueTF{####2} { - \semantexrenderobject { ##1 } { ifoutput=true,arg={####2} } + \semantex_render_object:Nn ##1 { ifoutput=true,arg={####2} } } { - \semantexrenderobject { ##1 } {} + \semantex_render_object:Nn ##1 {} } } } } } -\DeclareDocumentCommand\newcohomologyclass{mO{}} % new cohomology-type class -% The intention is to phase this out; use variable type instead, -%for the sake of consistency in notation. +\cs_set_eq:NN\NewVariableClass\semantex_new_variable_class:Nw + +\DeclareDocumentCommand\semantex_new_cohomology_class:Nw{mO{}} % new cohomology-type class { % #1 = class name % #2 = options - \semantexnewclass { #1 } { #2 } - \exp_args:Nc\DeclareDocumentCommand{#1}{mogg}{ + \semantex_new_class:Nn { #1 } { #2 } + \DeclareDocumentCommand{#1}{mogg}{ % the actual \#1 command \IfValueTF{##2} { \IfValueTF { ##3 } { - \semantexifeqTF { ##3 }{ * } + \tl_if_eq:nnTF { ##3 }{ * } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, *, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, *, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, * } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, * } } } { - \semantexifeqTF { ##3 }{ ** } + \tl_if_eq:nnTF { ##3 }{ ** } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, **, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, **, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, ** } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, ** } } } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, degreedefault={##3}, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, degreedefault={##3}, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, degreedefault={##3} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, degreedefault={##3} } } } } @@ -254,44 +276,44 @@ { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ##2 } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2 } } } } { \IfValueTF { ##3 } { - \semantexifeqTF { ##3 }{ * } + \tl_if_eq:nnTF { ##3 }{ * } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##1}, *, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##1}, *, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##1}, *} + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##1}, *} } } { - \semantexifeqTF { ##3 }{ ** } + \tl_if_eq:nnTF { ##3 }{ ** } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, **, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, **, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, ** } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ** } } } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, degreedefault={##3}, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, degreedefault={##3}, arg={##4} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, degreedefault={##3} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, degreedefault={##3} } } } } @@ -299,47 +321,47 @@ { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##1}, arg={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, arg={##4} } } { - \semantexrenderclass { #1 } { symbol={##1}, arg={##4} } + \semantex_render_class:Nn #1 { symbol={##1}, arg={##4} } } } } } - \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmogg}{ + \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmogg}{ \IfValueTF{##3} { \IfValueTF { ##4 } { - \semantexifeqTF { ##4 }{ * } + \tl_if_eq:nnTF { ##4 }{ * } { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3, *, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, *, arg={##5} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3, * } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, * } } } { - \semantexifeqTF { ##4 }{ ** } + \tl_if_eq:nnTF { ##4 }{ ** } { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } {ifoutput=true, symbol={##2}, ##1, ##3, **, arg={##5} } + \semantex_render_class:Nn #1 {ifoutput=true, symbol={##2}, ##1, ##3, **, arg={##5} } } { - \semantexrenderclass { #1 } {ifoutput=true, symbol={##2}, ##1, ##3, ** } + \semantex_render_class:Nn #1 {ifoutput=true, symbol={##2}, ##1, ##3, ** } } } { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4}, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4}, arg={##5} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4} } } } } @@ -347,44 +369,44 @@ { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, arg={##5} } } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, ##3 } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3 } } } } { \IfValueTF { ##4 } { - \semantexifeqTF { ##4 }{ * } + \tl_if_eq:nnTF { ##4 }{ * } { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} ,##1, *, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} ,##1, *, arg={##5} } } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} ,##1, *} + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} ,##1, *} } } { - \semantexifeqTF { ##4 }{ ** } + \tl_if_eq:nnTF { ##4 }{ ** } { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} , ##1, **, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} , ##1, **, arg={##5} } } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##2} , ##1, ** } + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} , ##1, ** } } } { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##2}, ##1, degreedefault={##4}, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2}, ##1, degreedefault={##4}, arg={##5} } } { - \semantexrenderclass { #1 } { ifoutput=true, symbol={##2}, ##1, degreedefault={##4} } + \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2}, ##1, degreedefault={##4} } } } } @@ -392,15 +414,15 @@ { \IfValueTF { ##5 } { - \semantexrenderclass { #1 } { ifoutput=true,symbol={##2}, ##1, arg={##5} } + \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, arg={##5} } } { - \semantexrenderclass { #1 } { symbol={##2}, ##1 } + \semantex_render_class:Nn #1 { symbol={##2}, ##1 } } } } } - \exp_args:Nc\DeclareDocumentCommand{new#1}{mgO{}} + \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}} { % the command for creating a new object of class #1 % ##1 = command name, with backslash @@ -408,10 +430,10 @@ % ##3 = options \IfValueTF{##2} { - \semantexnewobject { #1 } { ##1 }{ parent = #1, symbol = { ##2 }, ##3 } + \semantex_new_object:NNn { #1 } { ##1 }{ symbol = { ##2 }, ##3 } } { - \semantexnewobject { #1 } { ##1 }{ parent = #1, ##3 } + \semantex_new_object:NNn { #1 } { ##1 }{ ##3 } } % creates the object with name ##1 \DeclareDocumentCommand{##1}{ogg}{ @@ -420,34 +442,34 @@ { \IfValueTF{####2} { - \semantexifeqTF { ####2 } { * } + \tl_if_eq:nnTF { ####2 } { * } { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true,####1, *, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, *, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true,####1, * } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, * } } } { - \semantexifeqTF { ####2 } { ** } + \tl_if_eq:nnTF { ####2 } { ** } { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true, ####1, **, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true, ####1, **, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true, ####1, ** } + \semantex_render_object:Nn ##1 { ifoutput=true, ####1, ** } } } { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true,####1, degreedefault={ ####2 }, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, degreedefault={ ####2 }, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true,####1, degreedefault={ ####2 } } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, degreedefault={ ####2 } } } } } @@ -455,44 +477,44 @@ { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true,####1, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true,####1 } + \semantex_render_object:Nn ##1 { ifoutput=true,####1 } } } } { \IfValueTF{####2} { - \semantexifeqTF { ####2 } { * } + \tl_if_eq:nnTF { ####2 } { * } { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true, *, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true, *, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true, * } + \semantex_render_object:Nn ##1 { ifoutput=true, * } } } { - \semantexifeqTF { ####2 } { ** } + \tl_if_eq:nnTF { ####2 } { ** } { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true,**, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true,**, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true,** } + \semantex_render_object:Nn ##1 { ifoutput=true,** } } } { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true,degreedefault={ ####2 }, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true,degreedefault={ ####2 }, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { ifoutput=true,degreedefault={ ####2 } } + \semantex_render_object:Nn ##1 { ifoutput=true,degreedefault={ ####2 } } } } } @@ -500,10 +522,10 @@ { \IfValueTF{####3} { - \semantexrenderobject { ##1 } { ifoutput=true, arg={ ####3 } } + \semantex_render_object:Nn ##1 { ifoutput=true, arg={ ####3 } } } { - \semantexrenderobject { ##1 } { } + \semantex_render_object:Nn ##1 { } } } } @@ -511,153 +533,67 @@ } } +\cs_set_eq:NN\NewCohomologyClass\semantex_new_cohomology_class:Nw -%\DeclareDocumentCommand\newtupleclass{mO{}} % new tuple-type class -%{ -% % #1 = class name -% % #2 = options -% \semantexnewclass { #1 } { #2 } -% \exp_args:Nc\DeclareDocumentCommand{#1}{mog}{ -% % the actual \#1 command -% % (maybe this does not even make sense for tuples) -% \IfValueTF { ##2 } -% { -% \IfValueTF { ##3 } -% { -% \semantexrenderclass { #1 }{ ifoutput=true,symbol = { ##1 },##2, arg = { ##3 } } -% } -% { -% \semantexrenderclass { #1 }{ ifoutput=true,symbol = { ##1 },##2 } -% } -% } -% { -% \IfValueTF { ##3 } -% { -% \semantexrenderclass { #1 }{ ifoutput=true,symbol = { ##1 }, arg = { ##3 } } -% } -% { -% \semantexrenderclass { #1 }{ symbol = { ##1 } } -% } -% } -% } -% \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmog}{ -% \IfValueTF { ##3 } -% { -% \IfValueTF { ##4 } -% { -% \semantexrenderclass { #1 }{ ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } } -% } -% { -% \semantexrenderclass { #1 }{ ifoutput=true, symbol = { ##2 }, ##1, ##3 } -% } -% } -% { -% \IfValueTF { ##4 } -% { -% \semantexrenderclass { #1 }{ ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } } -% } -% { -% \semantexrenderclass { #1 }{ symbol = { ##2 }, ##1 } -% } -% } -% } -% \exp_args:Nc\DeclareDocumentCommand{new#1}{mmmmmO{}} -% { -% % the command for creating a new object of class #1 -% % ##1 = command name, with backslash -% % ##2 = symbol -% % ##3 = options -% \semantexnewobject { #1 } { ##1 } % creates the object with name ##1 -% { parent = #1, leftpar = { ##2 }, argsep = { ##3 }, rightpar = { ##4 }, argdots = { ##5 }, ##6 } -% \DeclareDocumentCommand{##1}{og}{ -% % the actual \##1 command -% \IfValueTF{####1} -% { -% \IfValueTF { ####2 } -% { -% \semantexrenderobject { ##1 } { ifoutput=true,####1, arg = { ####2 } } -% } -% { -% \semantexrenderobject { ##1 } { ifoutput=true,####1 } -% } -% } -% { -% \IfValueTF { ####2 } -% { -% \semantexrenderobject { ##1 } { ifoutput=true, arg = { ####2 } } -% } -% { -% \semantexrenderobject { ##1 } { } -% } -% } -% } -% } -%} - -\DeclareDocumentCommand\newdelimiterclass{mO{}} % new delimiter-type class +\DeclareDocumentCommand\semantex_new_delimiter_class:Nw{mO{}} % new delimiter-type class { % #1 = class name % #2 = options - \semantexnewclass { #1 } { -% valuekeys={ -% {arg}{argwithoutkeyval={\l_semantex_key_value_temp}}, -% %Currently, using no braces around \l_semantex_key_value_temp is necessary for \semantexdelimsize to work -% % with par=auto -% }, + \semantex_new_class:Nn { #1 } { #2 } - \exp_args:Nc\DeclareDocumentCommand{#1}{mog} % maybe this does not even make sense for delimiters + \DeclareDocumentCommand{#1}{mog} % maybe this does not even make sense for delimiters { \IfValueTF { ##2 } { \IfValueTF { ##3 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, ##2, arg = { ##3 } } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2, arg = { ##3 } } } { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, ##2 } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2 } } } { \IfValueTF { ##3 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##1 }, arg = { ##3 } } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, arg = { ##3 } } } { - \semantexrenderclass { #1 } { symbol = { ##1 } } + \semantex_render_class:Nn #1 { symbol = { ##1 } } } } } % the actual \#1 command - \exp_args:Nc\DeclareDocumentCommand{#1withoptions}{mmog} + \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmog} { \IfValueTF { ##3 } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } } } { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, ##3 } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3 } } } { \IfValueTF { ##4 } { - \semantexrenderclass { #1 } { ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } } + \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } } } { - \semantexrenderclass { #1 } { symbol = { ##2 }, ##1 } + \semantex_render_class:Nn #1 { symbol = { ##2 }, ##1 } } } } - \exp_args:Nc\DeclareDocumentCommand{new#1}{mmmO{}} + \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mmmO{}} { % the command for creating a new object of class #1 % ##1 = command name, with backslash % ##2 = symbol % ##3 = options - \semantexnewobject { #1 } { ##1 }{ parent = #1, leftpar = { ##2 }, rightpar = { ##3 }, ##4 } + \semantex_new_object:NNn { #1 } { ##1 }{ leftpar = { ##2 }, rightpar = { ##3 }, ##4 } % creates the object with name ##1 \DeclareDocumentCommand{##1}{og}{ % the actual \##1 command @@ -665,192 +601,196 @@ { \IfValueTF { ####2 } { - \semantexrenderobject { ##1 } { ifoutput=true,####1, arg = { ####2 } } + \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg = { ####2 } } } { - \semantexrenderobject { ##1 } { ifoutput=true,####1 } + \semantex_render_object:Nn ##1 { ifoutput=true,####1 } } } { \IfValueTF { ####2 } { - \semantexrenderobject { ##1 } { ifoutput=true, arg = { ####2 } } + \semantex_render_object:Nn ##1 { ifoutput=true, arg = { ####2 } } } { - \semantexrenderobject { ##1 } { } + \semantex_render_object:Nn ##1 { } } } } } } -\cs_generate_variant:Nn \tl_if_eq:nnTF { xnTF } - -\cs_generate_variant:Nn \tl_if_eq:nnF { xnF } - -\cs_generate_variant:Nn \tl_if_eq:nnT { xnT } +\cs_set_eq:NN\NewDelimiterClass\semantex_new_delimiter_class:Nw -\DeclareDocumentCommand{\semantexifblankordotTF}{mmm} -{ - \tl_if_blank:nTF { #1 } - { #2 } - { - \tl_if_eq:xnTF { \tl_trim_spaces:n { #1 } } { . } { #2 } { #3 } - } -} - -\DeclareDocumentCommand{\semantexifblankordotT}{mm} -{ - \tl_if_blank:nTF { #1 } - { #2 } - { - \tl_if_eq:xnT { \tl_trim_spaces:n { #1 } } { . } { #2 } - } -} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% COMMANDS FOR CREATING AND HANDLING CLASSES AND OJBECTS +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\DeclareDocumentCommand{\semantexifblankordotF}{mm} +\cs_new:Npn\NewObject#1 { - \tl_if_blank:nF { #1 } + \cs_if_exist_use:cF { __semantex_new_object_of_class_\cs_to_str:N#1:Nw } { - \tl_if_eq:xnF { \tl_trim_spaces:n { #1 } } { . } { #2 } - } -} - -\cs_set_eq:NN\semantexifeqTF\tl_if_eq:nnTF - -\cs_set_eq:NN\semantexifeqT\tl_if_eq:nnT - -\cs_set_eq:NN\semantexifeqF\tl_if_eq:nnF - - - -\cs_new:Npn \g_semantex_new_class:nn#1#2{ - % create a new class - % #1 = name of class - % #2 = standard keyval setup; the parent class by default is semantexvariable - \g_semantex_new_object:nnn { semantexvariable } { #1 } { #2 } + \msg_error:nnnn { semantex } { created_object_of_unknown_class } { #1 } + } } -\cs_set_eq:NN\semantexnewclass\g_semantex_new_class:nn - -\seq_new:N \semantex_all_objects_seq -\seq_put_right:Nn \semantex_all_objects_seq { semantexvariable } +%\cs_new:Npn\MakeObject#1{ \use:c { __semantex_make_object_of_class_#1:nw } } - -\cs_new:Npn \g_semantex_new_object:nnn#1#2#3{ +\cs_new:Npn \__semantex_new_class_or_object:nn#1#2{ % create new object - % #1 = class of command - % #2 = name of command, without backslash - % #3 = standard keyval setup + % #1 = name of command, without backslash + % #2 = standard keyval setup - \g_semantex_data_tl_provide:nn { #2 } { parent } + \semantex_data_tl_provide:nn { #1 } { parent } - \g_semantex_data_tl_set:nnn {#2 } { parent } { semantexvariable } + \semantex_data_tl_set:nnn { #1 } { parent } { class_SemantexVariable } - \cs_set:cpn { g_semantex_data_cs_#2_valuekey:nn } ##1##2 % command controlling valuekeys - { \g_semantex_valuekey:nnn { ##2 } { ##1 } { #2 } } + \cs_set:cpn { __semantex_data_cs_#1_valuekey:nn } ##1##2 % command controlling valuekeys + { \semantex_valuekey:nnn { ##2 } { ##1 } { #1 } } - \cs_set:cpn { g_semantex_data_cs_#2_novaluekey:n } ##1 % command controlling novaluekeys - { \g_semantex_novaluekey:nn { ##1 } { #2 } } + \cs_set:cpn { __semantex_data_cs_#1_singlekey:n } ##1 % command controlling singlekeys + { \semantex_singlekey:nn { ##1 } { #1 } } % Now a similar collection of keyval commands for the *argument* - \cs_set:cpn { g_semantex_data_cs_#2_arg_valuekey:nn } ##1##2 - { \g_semantex_arg_valuekey:nnn { ##2 } { ##1 }{ #2 } } + \cs_set:cpn { __semantex_data_cs_#1_arg_valuekey:nn } ##1##2 + { \semantex_arg_valuekey:nnn { ##2 } { ##1 }{ #1 } } - \cs_set:cpn { g_semantex_data_cs_#2_arg_novaluekey:n } ##1 - { \g_semantex_arg_novaluekey:nn { ##1 } { #2 } } - + \cs_set:cpn { __semantex_data_cs_#1_arg_singlekey:n } ##1 + { \semantex_arg_singlekey:nn { ##1 } { #1 } } % initially sets up the keyval interface of the object - \g_semantex_keys_set:nn { #2 } { parent=#1, #3 } + \semantex_keys_set:nn { #1 } { #2 } - \seq_put_right:Nx \semantex_all_objects_seq { #2 } +% \seq_put_right:Nx \g__semantex_all_objects_seq { #1 } } +\cs_generate_variant:Nn \__semantex_new_class_or_object:nn { xn } + +\cs_new:Npn \semantex_new_class:Nn#1#2{ + % create a new class + % #1 = name of class + % #2 = standard keyval setup; the parent class by default is SemantexVariable + \semantex_class_if_exist:NTF { #1 } + { + \msg_error:nnn { semantex } { class_already_defined } { #1 } + } + { + \semantex_class_register:N { #1 } + \__semantex_new_class_or_object:xn { class_\cs_to_str:N #1 } { #2 } + } +} + +\cs_set:Npn \semantex_new_object:NNn#1#2#3 +{ + \semantex_object_if_exist:NTF { #2 } + { + \msg_error:nnn { semantex } { object_already_defined } { #2 } + } + { + \semantex_object_register:N { #2 } + \__semantex_new_class_or_object:xn { object_\cs_to_str:N #2 } { class=#1, #3 } + } +} -\cs_generate_variant:Nn \g_semantex_new_object:nnn { nxn } +\seq_new:N \g__semantex_all_classes_seq % a register for all objects created -\cs_set:Npn \semantexnewobject#1#2#3 -{ \g_semantex_new_object:nxn { #1 }{ \cs_to_str:N #2 } { #3 } } +\cs_new:Npn\semantex_class_register:N#1 +{ + \seq_put_right:Nx\g__semantex_all_classes_seq { class_\cs_to_str:N #1 } +} +\cs_new:Npn\semantex_class_if_exist:NTF#1#2#3 +{ + \seq_if_in:NxTF\g__semantex_all_classes_seq { class_\cs_to_str:N#1 } { #2 } { #3 } +} +\seq_new:N \g__semantex_all_objects_seq % a register for all objects created +\cs_new:Npn\semantex_object_register:N#1 +{ + \seq_put_right:Nx\g__semantex_all_objects_seq { object_\cs_to_str:N #1 } +} -%------------------------------- +\cs_new:Npn\semantex_object_if_exist:NTF#1#2#3 +{ + \seq_if_in:NxTF\g__semantex_all_objects_seq { object_\cs_to_str:N#1 } { #2 } { #3 } +} -% Commands for rendering: +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% COMMANDS FOR RENDERING OBJECTS AND CLASSES +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\tl_new:N\l__semantex_symbol_temp +\cs_generate_variant:Nn\tl_if_blank:nTF { xTF } -\cs_new_protected:Npn \g_semantex_render:nn#1#2 +\cs_new_protected:Npn \__semantex_render:nn#1#2 { - % the main command for rendering an object + % the main command for rendering a class/object % #1 = name of object % #2 = options \group_begin: - \g_semantex_data_tl_inherit:nn { #1 } { symbol } - \g_semantex_keys_set:nn { #1 } { #2 } - \g_semantex_primitive_valuekey_parse:nn { #1 } { } % not the right place to run this? - \g_semantex_data_bool_get:nnTF { #1 } { output } + \semantex_data_tl_inherit:nn { #1 } { symbol } % Inherit the symbol from parent if not done already + \semantex_keys_set:nn { #1 } { #2 } % Setup the keys + \semantex_primitive_valuekey_parse:nn { #1 } { } % Run the "parse" routine, i.e. the collection of code that the user has added to the parse register + \semantex_data_bool_get:nnTF { #1 } { output } % Checks if the object/class is supposed to output { - \g_semantex_primitive_valuekey_innerreturn:nn { #1 }{} - \g_semantex_data_bool_get:nnTF { #1 } { rightreturnbeforerender } + \semantex_primitive_valuekey_innerreturn:nn { #1 }{} + \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments } % Checks if more than one argument has been received, i.e. whether we want to render any argument { - \g_semantex_primitive_valuekey_rightreturn:nn { #1 }{} + \semantex_data_bool_get:nnTF { #1 } { leftargument } % Checks if left or right argument + { + \semantex_primitive_valuekey_leftreturn:nn { #1 }{} + } + { + \semantex_primitive_valuekey_rightreturn:nn { #1 }{} + } } { % do nothing } - \tl_set:Nx\l__semantex_render_symbol_temp { \g_semantex_data_tl_get:nn { #1 } { symbol } } %IM chang to "store" solution - \g_semantex_data_tl_get_store:nnN { #1 } { upper_index } \l__semantex_render_upper_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { lower_index } \l__semantex_render_lower_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { upper_left_index } \l__semantex_render_upper_left_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { lower_left_index } \l__semantex_render_lower_left_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { preupper } \l__semantex_render_preupper_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postupper } \l__semantex_render_postupper_temp - \g_semantex_data_tl_get_store:nnN { #1 } { prelower } \l__semantex_render_prelower_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postlower } \l__semantex_render_postlower_temp - \g_semantex_data_tl_get_store:nnN { #1 } { preupperleft } \l__semantex_render_preupperleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postupperleft } \l__semantex_render_postupperleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { prelowerleft } \l__semantex_render_prelowerleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postlowerleft } \l__semantex_render_postlowerleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { texclass } \l__semantex_render_texclass_temp + \tl_set:Nx\l__semantex_render_symbol_temp { \semantex_data_tl_get:nn { #1 } { symbol } } % Stores the symbol in a temporary command \tl_set:Nx \l__semantex_render_temp { \exp_not:c { - \g_semantex_data_tl_get:nn { #1 } { output }withoptions - } + __semantex_make_object_of_\semantex_data_tl_get:nn { #1 } { output }_with_options:nnw + } % This is for outputting -- the command \__semantex_make_object_of_class_???_with_options:nnw makes a one-time object of class ??? and allows us to immediately parse options to it { - upperaddleft={\exp_not:V\l__semantex_render_upper_index_temp}, - loweraddleft={\exp_not:V\l__semantex_render_lower_index_temp}, - upperleftaddright={\exp_not:V\l__semantex_render_upper_left_index_temp}, - lowerleftaddright={\exp_not:V\l__semantex_render_lower_left_index_temp}, - preupper={\exp_not:V\l__semantex_render_preupper_temp}, - postupper={\exp_not:V\l__semantex_render_postupper_temp}, - prelower={\exp_not:V\l__semantex_render_prelower_temp}, - postlower={\exp_not:V\l__semantex_render_postlower_temp}, - preupperleft={\exp_not:V\l__semantex_render_preupperleft_temp}, - postupperleft={\exp_not:V\l__semantex_render_postupperleft_temp}, - prelowerleft={\exp_not:V\l__semantex_render_prelowerleft_temp}, - postlowerleft={\exp_not:V\l__semantex_render_postlowerleft_temp}, - texclass={\l__semantex_render_texclass_temp}, - \g_semantex_data_tl_get_exp_not:nn { #1 } { output_options }, + upperputleft={\semantex_data_tl_get_exp_not:nn { #1 } { upper }}, + lowerputleft={\semantex_data_tl_get_exp_not:nn { #1 } { lower }}, + upperleftputright={\semantex_data_tl_get_exp_not:nn { #1 } { upperleft }}, + lowerleftputright={\semantex_data_tl_get_exp_not:nn { #1 } { lowerleft }}, + preupper={\semantex_data_tl_get_exp_not:nn { #1 } { preupper }}, + postupper={\semantex_data_tl_get_exp_not:nn { #1 } { postupper }}, + prelower={\semantex_data_tl_get_exp_not:nn { #1 } { prelower }}, + postlower={\semantex_data_tl_get_exp_not:nn { #1 } { postlower }}, + preupperleft={\semantex_data_tl_get_exp_not:nn { #1 } { preupperleft }}, + postupperleft={\semantex_data_tl_get_exp_not:nn { #1 } { postupperleft }}, + prelowerleft={\semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft }}, + postlowerleft={\semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft }}, + texclass={\semantex_data_tl_get:nn { #1 } { texclass }}, + \semantex_data_tl_get_exp_not:nn { #1 } { outputoptions }, + % These are the options we parse to our object -- this is all + % information that we pass on to the output class so that it + % can eventually render it } { \exp_not:V \l__semantex_render_symbol_temp } } } { - \g_semantex_primitive_valuekey_return:nn { #1 }{} -% \tl_set:Nx \l__semantex_render_temp { \exp_not:V \l__semantex_symbol_temp } -% \tl_set:Nx\l__semantex_render_temp { \g_semantex_data_tl_get:nn { #1 } { symbol } } % this is the ordinary solution that generally just works - %\tl_set:Nx\l__semantex_render_temp { \exp_not:n{\exp_not:v { semantex_data_tl_#1_symbol } }} -% \g_semantex_data_tl_get_store:nnN { #1 } { symbol } \l__semantex_render_symbol_temp - \tl_if_blank:xTF { \g_semantex_data_tl_get:nn { #1 } { texclass } }{ - \tl_set:Nx\l__semantex_render_symbol_temp { \g_semantex_data_tl_get:nn { #1 } { symbol } } + \semantex_primitive_valuekey_return:nn { #1 }{} % Returns the object/class, i.e. adds all remaining indices and arguments to it + \tl_if_blank:xTF { \semantex_data_tl_get:nn { #1 } { texclass } } + % Checks whether the texclass register has been declared -- this is + % where you store \mathord, \mathbin, \mathrel, etc., if you want + % the object to be eventually wrapped in this. + { + \tl_set:Nx\l__semantex_render_symbol_temp { \semantex_data_tl_get:nn { #1 } { symbol } } } { - \tl_set:Nx\l__semantex_render_symbol_temp { \g_semantex_data_tl_get:nn { #1 } { texclass } { \g_semantex_data_tl_get:nn { #1 } { symbol } } } + \tl_set:Nx\l__semantex_render_symbol_temp { \semantex_data_tl_get:nn { #1 } { texclass } { \semantex_data_tl_get:nn { #1 } { symbol } } } } \tl_set:Nx\l__semantex_render_temp { \exp_not:V \l__semantex_render_symbol_temp @@ -858,234 +798,423 @@ } \exp_last_unbraced:NV \group_end: - \l__semantex_render_temp + \l__semantex_render_temp % This neat trick allows outputting to different classes to work as expected } -\cs_set_eq:NN\semantexrenderclass\g_semantex_render:nn % a front-end command +\cs_generate_variant:Nn \__semantex_render:nn { xn } -\cs_set:Npn\semantexrenderobject#1#2 +\cs_set:Npn\semantex_render_class:Nn#1#2 % a front-end command { - \g_semantex_render:nn { \cs_to_str:N #1 } { #2 } + \__semantex_render:xn { class_\cs_to_str:N #1 } { #2 } } +\cs_set:Npn\semantex_render_object:Nn#1#2 +{ + \__semantex_render:xn { object_\cs_to_str:N #1 } { #2 } % Actually, it seems to all still work out fine with n-type instead of x-type, but better be sure +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% COMMANDS FOR HANDLING PARENTHESES +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\cs_generate_variant:Nn\tl_if_blank:nTF { xTF } -\cs_new:Npn \g_semantex_right_indices:nnnnnn#1#2#3#4#5#6 +\tl_new:N\SemantexDelimiterSize + +%%So far, this is experimental: +%%\makeatletter %this part requires amsmath +%\tl_set:Nn\semantexnormalscaling{\bBigg@{0.8}} +%\tl_set:Nn\semantexnormalscalingl{\mathopen\semantexnormalscaling} +%\tl_set:Nn\semantexnormalscalingr{\mathclose\semantexnormalscaling} +%\tl_set:Nn\semantexnormalscalingm{\mathrel\semantexnormalscaling} +%%\makeatother + +\cs_new:Npn \__semantex_parentheses_normal:nnn#1#2#3 { - \tl_if_blank:nF { #2 } { \sp{#1 #2 #3} } - \tl_if_blank:nF { #5 } { \sb{#4 #5 #6} } - % Using x here was the source of a very long - % debugging; inputting underbrace in the index - % caused problems + \group_begin: + %\semantexnormalscalingl#2 #4 #5 #6 \semantexnormalscalingr#3 + \mathopen#1 #3 \mathclose#2 + \group_end: } -\cs_new:Npn \g_semantex_left_indices:nnnnnn#1#2#3#4#5#6 +\cs_new:Npn \__semantex_parentheses_auto:nnn#1#2#3 { - \tl_if_blank:nTF { #2 } { - \tl_if_blank:nF { #5 } { {}\sb{#4 #5 #6} } - } - { - {} \sp{#1 #2 #3} - \tl_if_blank:nF { #5 } { \sb{#4 #5 #6} } - } + \group_begin: + \tl_set:Nn\SemantexDelimiterSize{\middle} + %\tl_set_eq:NN\SemantexDelimiterSize\middle + \mathopen{}\mathclose\bgroup\left#1 + #3 + \aftergroup\egroup\right#2 + \group_end: } +\cs_new:Npn \__semantex_parentheses_other:nnnn#1#2#3#4 +{ + \group_begin: + \tl_set_eq:NN\SemantexDelimiterSize#4 + %\tl_set:Nx\SemantexDelimiterSize{\exp_not:N#1} + \mathopen#4#1 #3 \mathclose#4#2 + \group_end: +} -\tl_new:N\semantexdelimsize - -%So far, this is experimental: -%\makeatletter %this part requires amsmath -\newcommand{\semantexnormalscaling}{\bBigg@{0.8}} -\newcommand{\semantexnormalscalingl}{\mathopen\semantexnormalscaling} -\newcommand{\semantexnormalscalingr}{\mathclose\semantexnormalscaling} -\newcommand{\semantexnormalscalingm}{\mathrel\semantexnormalscaling} -%\makeatother +\cs_generate_variant:Nn \str_case:nnF { xnF } -\cs_new:Npn \g_semantex_parentheses:nnnnnn#1#2#3#4#5#6 +\cs_new:Npn \__semantex_parentheses_store:nnnnN#1#2#3#4#5 +% The central command handling the rendering of argument parentheses { - \tl_if_blank:nF { #5 } + \tl_set:Nx#5 { - \str_case:nnF { #1 } - { - { normal } { - \group_begin: - %\semantexnormalscalingl#2 #4 #5 #6 \semantexnormalscalingr#3 - \mathopen#2 #4 #5 #6 \mathclose#3 - \group_end: + { #2 } + { #3 } + { #4 } + } + \str_case:xnF { #1 } % This is where \big,\Big, etc. go. To my surprise, an x-type expansion did not cause any issues with this + { + { normal } { + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_parentheses_normal:nnn } - { auto } { - \group_begin: - \tl_set:Nn\semantexdelimsize{\middle} - %\tl_set_eq:NN\semantexdelimsize\middle - \mathopen{}\mathclose\bgroup\left#2 - #4 #5 #6 - \aftergroup\egroup\right#3 - \group_end: + } + { auto } { + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_parentheses_auto:nnn } - { * } { - \group_begin: - \tl_set:Nn\semantexdelimsize{\middle} - %\tl_set_eq:NN\semantexdelimsize\middle - \mathopen{}\mathclose\bgroup\left#2 - #4 #5 #6 - \aftergroup\egroup\right#3 - \group_end: + } + { * } { + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_parentheses_auto:nnn } -% { \big } { -% \group_begin: -% \tl_set_eq:NN\semantexdelimsize\big -% \mathopen\big#2 #4 \mathclose\big#3 -% \group_end: -% } -% { \Big } { -% \group_begin: -% \tl_set_eq:NN\semantexdelimsize\Big -% \mathopen\Big#2 #4 \mathclose\Big#3 -% \group_end: -% } -% { \bigg } { -% \group_begin: -% \tl_set_eq:NN\semantexdelimsize\bigg -% \mathopen\bigg#2 #4 \mathclose\bigg#3 -% \group_end: -% } -% { \Bigg } { -% \group_begin: -% \tl_set_eq:NN\semantexdelimsize\Bigg -% \mathopen\Bigg#2 #4 \mathclose\Bigg#3 -% \group_end: -% } } + } + { + \tl_put_right:Nx#5 + { + { \exp_not:V #1 } + } + \tl_put_left:Nn#5 { - \group_begin: - \tl_set_eq:NN\semantexdelimsize#1 - %\tl_set:Nx\semantexdelimsize{\exp_not:N#1} - \mathopen#1#2 #4 #5 #6 \mathclose#1#3 - \group_end: + \exp_not:N + \__semantex_parentheses_other:nnnn } } } -\cs_new:Npn \g_semantex_no_parentheses:nnn#1#2#3 +\cs_new:Npn \__semantex_no_parentheses:n#1 { - \tl_if_blank:nF { #2 } - { \group_begin: - \tl_clear:N\semantexdelimsize - #1 #2 #3 + \tl_clear:N\SemantexDelimiterSize + #1 \group_end: +} + +\cs_new:Npn \__semantex_no_parentheses_store:nN#1#2 +% The central command for handling the rendering of arguments with no parentheses around +{ + \tl_set:Nx#2 + { + { #1 } } + \tl_put_left:Nn#2 + { + \exp_not:N + \__semantex_no_parentheses:n + } +} + +\cs_new:Npn \__semantex_symbol_parentheses_normal:nnn#1#2#3 +{ + \mathopen#1 #3 \mathclose#2 } -\cs_new:Npn \g_semantex_symbol_parentheses:nnnn#1#2#3#4 +\cs_new:Npn \__semantex_symbol_parentheses_auto:nnn#1#2#3 { - \tl_if_blank:nF { #4 } + \mathopen{}\mathclose\bgroup\left#1 + #3 + \aftergroup\egroup\right#2 +} + + +\cs_new:Npn \__semantex_symbol_parentheses_other:nnnn#1#2#3#4 +{ + \mathopen#4#1 #3 \mathclose#4#2 +} + + +\cs_new:Npn \__semantex_symbol_parentheses_store:nnnnN#1#2#3#4#5 +% The central command handling the rendering of symbol parentheses +{ + \tl_set:Nx#5 + { + { #2 } + { #3 } + { #4 } + } + \str_case:xnF { #1 } % This is where \big,\Big, etc. go. To my surprise, an x-type expansion did not cause any issues with this { - \str_case:nnF { #1 } + { normal } { + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_symbol_parentheses_normal:nnn + } + } + { auto } { + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_symbol_parentheses_auto:nnn + } + } + { * } { + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_symbol_parentheses_auto:nnn + } + } + } + { + \tl_put_right:Nx#5 { - { normal } { \mathopen#2 #4 \mathclose#3 } - { auto } { \mathopen{}\mathclose\bgroup\left#2 #4 \aftergroup\egroup\right#3 } - { * } { \mathopen{}\mathclose\bgroup\left#2 #4 \aftergroup\egroup\right#3 } + { \exp_not:V #1 } + } + \tl_put_left:Nn#5 + { + \exp_not:N + \__semantex_symbol_parentheses_other:nnnn } - { \mathopen#1#2 #4 \mathclose#1#3 } } } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% COMMANDS FOR MODIFYING AND OBTAINING DATA +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %-------------------------------------------- % Commands to modify and obtain data -\cs_generate_variant:Nn \str_if_eq:nnTF { fnTF , onTF } - -%\cs_new:Npn \g_semantex_data_tl_get_proto:nnn#1#2#3 +%\cs_new:Npn \semantex_data_tl_get_proto:nnn#1#2#3 %{ % % #1 = name of object % % #2 = the data to get % % #3 = also the name of object, but being stored % % when passing to the parent, in order to make % % error messages meaningful -% \tl_if_exist:cTF { semantex_data_tl_#1_#2 } +% \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 } % { -% \use:c { semantex_data_tl_#1_#2 } +% \use:c { g__semantex_data_tl_#1_#2 } % } % { -% \tl_if_eq:nnTF { #1 } { semantexvariable } +% \tl_if_eq:nnTF { #1 } { SemantexVariable } % { % \msg_error:nnnn { semantex } { data_tl_not_found } { #2 } { #3 } % } % { -% \g_semantex_data_tl_get_proto:nnn { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #1 } +% \semantex_data_tl_get_proto:nnn { \semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #1 } % } % } %} % -%\cs_new:Npn \g_semantex_data_tl_get:nn#1#2 +%\cs_new:Npn \semantex_data_tl_get:nn#1#2 %{ -% \g_semantex_data_tl_get_proto:nnn { #1 } { #2 } { #1 } +% \semantex_data_tl_get_proto:nnn { #1 } { #2 } { #1 } %} -\cs_new:Npn \g_semantex_data_tl_get:nn#1#2 + + +% COMMANDS FOR HANDLING THE PARENT OF A CLASS/OBJECT: + +\cs_new:Npn \semantex_data_parent_get:n#1 +{ + % #1 = object + % A command to get the parent of an object + \use:c { g__semantex_data_tl_#1_parent } +} + +\cs_new:Npn \semantex_data_parent_set:nn#1#2 +{ + \semantex_class_if_exist:NTF { #2 } + { + \tl_set:cx { g__semantex_data_tl_#1_parent } { class_\cs_to_str:N#2 } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_data_parent_set_temp + \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_parent_set_temp } { parent } { #2 } + } +} + +\cs_new:Npn \semantex_data_class_set:nn#1#2 +{ + \semantex_class_if_exist:NTF { #2 } + { + \tl_set:cx { g__semantex_data_tl_#1_parent } { class_\cs_to_str:N#2 } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_data_class_set_temp + \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_class_set_temp } { class } { #2 } + } +} + +\cs_new:Npn \semantex_data_copy_object:nn#1#2 +{ + \semantex_object_if_exist:NTF { #2 } + { + \tl_set:cx { g__semantex_data_tl_#1_parent } { object_\cs_to_str:N#2 } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_data_copy_object_temp + \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_copy_object_temp } { copy } { #2 } + } +} + +\cs_new:Npn \semantex_data_clone_object:nn#1#2 +{ + \semantex_object_if_exist:NTF { #2 } + { + \tl_set:cx { g__semantex_data_tl_#1_parent } { object_\cs_to_str:N#2 } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_data_clone_object_temp + \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_clone_object_temp } { clone } { #2 } + } +} + +% COMMANDS FOR HANDLING DATA CONSISTING OF TOKEN LISTS + +\cs_new:Npn \semantex_data_tl_get:nn#1#2 { % #1 = name of object % #2 = the data to get - % #3 = also the name of object, but being stored - % when passing to the parent, in order to make - % error messages meaningful - \tl_if_exist:cTF { semantex_data_tl_#1_#2 } + \__semantex_data_tl_get_auxiliary:nnn { #1 } { #2 } { #1 } +} + +\cs_generate_variant:Nn \str_if_eq:nnTF { fnTF } + +\cs_generate_variant:Nn \tl_if_eq:nnTF { fnTF } + +\cs_new:Npn \__semantex_data_tl_get_auxiliary:nnn#1#2#3 +{ + % #1 = name of class/object + % #2 = the data to get + % #3 = the original class/object, used for error messaging + \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 } { - \use:c { semantex_data_tl_#1_#2 } + \use:c { g__semantex_data_tl_#1_#2 } } { - \g_semantex_data_tl_get:nn { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } % Apparently, f-type expansion seemed to work here for once + { + \semantex_error_output_format:nN { #3 } \__semantex_data_tl_get_auxiliary_temp + \msg_error:nnxn { semantex } { data_tl_not_found } { \__semantex_data_tl_get_auxiliary_temp } { #2 } + } + { + \__semantex_data_tl_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } + } } } -\cs_new:Npn \g_semantex_data_tl_get_exp_not:nn#1#2 +\cs_generate_variant:Nn \__semantex_data_tl_get_auxiliary:nnn { fnn } + +%\cs_new:Npn \semantex_data_tl_get_exp_not:nn#1#2 +%{ +% % #1 = name of object +% % #2 = the data to get +% \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 } +% { +% \exp_not:v { g__semantex_data_tl_#1_#2 } +% } +% { +% \semantex_data_tl_get:nn { \semantex_data_parent_get:n { #1 } } { #2 } +% } +%} + +\cs_new:Npn \semantex_data_tl_get_exp_not:nn#1#2 { % #1 = name of object % #2 = the data to get - \tl_if_exist:cTF { semantex_data_tl_#1_#2 } + \__semantex_data_tl_get_exp_not_auxiliary:nnn { #1 } { #2 } { #1 } +} + +\cs_new:Npn \__semantex_data_tl_get_exp_not_auxiliary:nnn#1#2#3 +{ + % #1 = name of class/object + % #2 = the data to get + % #3 = the original class/object, used for error messaging + \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 } { - \exp_not:v { semantex_data_tl_#1_#2 } + \exp_not:v { g__semantex_data_tl_#1_#2 } } { - \g_semantex_data_tl_get:nn { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } % Apparently, f-type expansion seemed to work here for once + { + \semantex_error_output_format:nN { #3 } \l__semantex_data_tl_get_exp_not_auxiliary_temp + \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_exp_not_auxiliary_temp } { #2 } + } + { + \__semantex_data_tl_get_exp_not_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } + } } } -%\cs_generate_variant:Nn \g_semantex_data_tl_get:nn { cn } +\cs_generate_variant:Nn \__semantex_data_tl_get_exp_not_auxiliary:nnn { fnn } + + +\cs_new:Npn \semantex_data_tl_get_store:nnN#1#2#3% maybe should be PROTECTED?? +{ + % #1 = name of object + % #2 = the data to get + % #3 = where to store it + \__semantex_data_tl_get_store_auxiliary:nnNn { #1 } { #2 } #3 { #1 } +} -\cs_new:Npn \g_semantex_data_tl_get_store:nnN#1#2#3% maybe should be PROTECTED?? +\cs_new:Npn \__semantex_data_tl_get_store_auxiliary:nnNn#1#2#3#4% maybe should be PROTECTED?? { % #1 = name of object % #2 = the data to get % #3 = where to store it - \tl_if_exist:cTF { semantex_data_tl_#1_#2 } + \tl_if_exist:cTF { g__semantex_data_tl_#1_#2 } { - \tl_set_eq:Nc #3 { semantex_data_tl_#1_#2 } + \tl_set_eq:Nc #3 { g__semantex_data_tl_#1_#2 } } { - \g_semantex_data_tl_get_store:nnN { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + \semantex_error_output_format:nN { #4 } \l__semantex_data_tl_get_store_auxiliary_temp + \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_store_auxiliary_temp } { #2 } + } + { + \__semantex_data_tl_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } + } } } -\cs_generate_variant:Nn \g_semantex_data_tl_get_store:nnN { nnc } +\cs_generate_variant:Nn \__semantex_data_tl_get_store_auxiliary:nnNn { fnNn } -\cs_new:Npn\g_semantex_data_tl_provide:nn#1#2 +\cs_generate_variant:Nn \semantex_data_tl_get_store:nnN { nnc } + +\cs_new:Npn\semantex_data_tl_provide:nn#1#2 { - \tl_if_exist:cF { semantex_data_tl_#1_#2 } + \tl_if_exist:cF { g__semantex_data_tl_#1_#2 } { - \tl_set:cn { semantex_data_tl_#1_#2 } {} + \tl_set:cn { g__semantex_data_tl_#1_#2 } {} } } -\cs_new:Npn\g_semantex_data_tl_inherit:nn#1#2 +\cs_new:Npn\semantex_data_tl_inherit:nn#1#2 { % #1 = object % #2 = piece of token list data @@ -1093,1756 +1222,3531 @@ % to the object #1. After this, no more inheritance is taking place % from the parent, and the data can be changed locally on the level % of #1. - \tl_if_exist:cF { semantex_data_tl_#1_#2 } - { - \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 } - } + \tl_if_exist:cF { g__semantex_data_tl_#1_#2 } { - \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 } - %IM could be replaced by simply { #1 } { #2 } once the check is made - %IM based on "if_provided" + \semantex_data_tl_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_tl_#1_#2 } } } -\cs_new:Npn\g_semantex_data_tl_inherit_x:nn#1#2 -{ +\cs_set_eq:NN\semantex_data_tl_inherit_x:nn\semantex_data_tl_inherit:nn % The same as inherit; historically, this one did an x type % expansion first, but after changes in other places, this % no longer appeard to be necessary. I decided to keep up the % separation of the two, just in case. - \tl_if_exist:cF { semantex_data_tl_#1_#2 } + + +\cs_new:Npn \semantex_data_tl_set:nnn#1#2#3 +{ + \tl_set:cn { g__semantex_data_tl_#1_#2 } { #3 } +} + +\cs_generate_variant:Nn \semantex_data_tl_set:nnn { nnx } + +\cs_new:Npn \semantex_data_tl_put_right:nnn#1#2#3 +{ + \semantex_data_tl_inherit:nn { #1 } { #2 } + \tl_put_right:cn { g__semantex_data_tl_#1_#2 } { #3 } +} + +\cs_generate_variant:Nn \semantex_data_tl_put_right:nnn { nnx } + +\cs_new:Npn \semantex_data_tl_put_left:nnn#1#2#3 +{ + \semantex_data_tl_inherit:nn { #1 } { #2 } + \tl_put_left:cn { g__semantex_data_tl_#1_#2 } { #3 } +} + +\cs_generate_variant:Nn \semantex_data_tl_put_left:nnn { nnx } + +\cs_new:Npn \semantex_data_tl_clear:nn#1#2 +{ + \semantex_data_tl_provide:nn { #1 } { #2 } + \tl_clear:c { g__semantex_data_tl_#1_#2 } +} + +% DATA OF TYPE INTEGER: + +\cs_new:Npn\semantex_data_int_provide:nn#1#2 +{ + \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided } { - \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 } + \bool_if:cF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided } + } } { - \g_semantex_data_tl_get_store:nnc { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { semantex_data_tl_#1_#2 } - %IM could be replaced by simply { #1 } { #2 } once the check is made - %IM based on "if_provided" + \bool_new:c { g__semantex_data_int_#1_#2_bool_if_provided } + \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided } + \int_new:c { g__semantex_data_int_#1_#2 } } } -\cs_new:Npn \g_semantex_data_tl_set:nnn#1#2#3 +\cs_new:Npn\semantex_data_int_inherit:nn#1#2 { - %\g_semantex_data_tl_provide:nn { #1 } { #2 } - \tl_set:cn { semantex_data_tl_#1_#2 } { #3 } + \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \bool_if:cF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \semantex_data_int_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_int_#1_#2 } + \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided } + } + } + { + \bool_new:c { g__semantex_data_int_#1_#2_bool_if_provided } + \bool_set_true:c { g__semantex_data_int_#1_#2_bool_if_provided } + \int_new:c { g__semantex_data_int_#1_#2 } + \semantex_data_int_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_int_#1_#2 } + } } -\cs_generate_variant:Nn \g_semantex_data_tl_set:nnn { nnx } +\cs_new:Npn \semantex_data_int_get:nn#1#2{% maybe should be PROTECTED?? + % #1 = name of object + % #2 = the intuence to get + % #3 = the command to store it in + \__semantex_data_int_get_auxiliary:nnn { #1 } { #2 } { #1 } +} -\cs_new:Npn \g_semantex_data_tl_put_right:nnn#1#2#3 +\cs_new:Npn \__semantex_data_int_get_auxiliary:nnn#1#2#3{% maybe should be PROTECTED?? + % #1 = name of object + % #2 = the intuence to get + % #3 = the command to store it in + \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \bool_if:cTF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \int_use:c { g__semantex_data_int_#1_#2 } + } + { + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp + \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp } { #2 } + } + { + \__semantex_data_int_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } + } + } + } + { + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp + \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp } { #2 } + } + { + \__semantex_data_int_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } + } + } +} + +\cs_generate_variant:Nn \__semantex_data_int_get_auxiliary:nnn { fnn } + + +\cs_new:Npn \semantex_data_int_get_store:nnN#1#2#3{% maybe should be PROTECTED?? + % #1 = name of object + % #2 = the intuence to get + % #3 = the command to store it in + \__semantex_data_int_get_store_auxiliary:nnNn { #1 } { #2 } #3 { #1 } +} + +\cs_new:Npn\__semantex_data_int_get_store_auxiliary:nnNn#1#2#3#4{% maybe should be PROTECTED?? + % #1 = name of object + % #2 = the intuence to get + % #3 = the command to store it in + \bool_if_exist:cTF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \bool_if:cTF { g__semantex_data_int_#1_#2_bool_if_provided } + { + \int_set_eq:Nc#3 { g__semantex_data_int_#1_#2 } + } + { + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp + \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp } { #2 } + } + { + \__semantex_data_int_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } + } + } + } + { + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp + \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp } { #2 } + } + { + \__semantex_data_int_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } + } + } +} + +\cs_generate_variant:Nn \__semantex_data_int_get_store_auxiliary:nnNn { fnNn } + +\cs_generate_variant:Nn \semantex_data_int_get_store:nnN { nnc } + +\cs_new:Npn\semantex_data_int_incr:nn#1#2 { - \g_semantex_data_tl_inherit:nn { #1 } { #2 } - \tl_put_right:cn { semantex_data_tl_#1_#2 } { #3 } + \semantex_data_int_inherit:nn { #1 } { #2 } + \int_incr:c { g__semantex_data_int_#1_#2 } } -\cs_generate_variant:Nn \g_semantex_data_tl_put_right:nnn { nnx } +\cs_new:Npn\semantex_data_int_set:nnn#1#2#3 +{ + \semantex_data_int_provide:nn { #1 } { #2 } + \int_set:cn { g__semantex_data_int_#1_#2 } { #3 } +} -\cs_new:Npn \g_semantex_data_tl_put_left:nnn#1#2#3 +\cs_new:Npn\semantex_data_int_if_positive:nnTF#1#2#3#4 { - \g_semantex_data_tl_inherit:nn { #1 } { #2 } - \tl_put_left:cn { semantex_data_tl_#1_#2 } { #3 } +% \semantex_data_int_inherit:nn { #1 } { #2 } % This should not be necessary, ubt is, for unkonwn reasons + \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } > { 0 } { #3 } { #4 } } -\cs_generate_variant:Nn \g_semantex_data_tl_put_left:nnn { nnx } +\cs_generate_variant:Nn\semantex_data_int_if_positive:nnTF { nnT } -\cs_new:Npn \g_semantex_data_tl_clear:nn#1#2 +\cs_new:Npn\semantex_data_int_if_positive:nnF#1#2#3 { - \g_semantex_data_tl_provide:nn { #1 } { #2 } - \tl_clear:c { semantex_data_tl_#1_#2 } + \semantex_data_int_if_positive:nnTF { #1 } { #2 } { } { #3 } } -\cs_new:Npn \g_semantex_data_seq_get_store:nnN#1#2#3{% maybe should be PROTECTED?? +\cs_new:Npn\semantex_data_int_if_greater_than_one:nnTF#1#2#3#4 +{ + \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } > { 1 } { #3 } { #4 } +} + +\cs_generate_variant:Nn\semantex_data_int_if_greater_than_one:nnTF { nnT } + +\cs_new:Npn\semantex_data_int_if_greater_than_one:nnF#1#2#3 +{ + \semantex_data_int_if_greater_than_one:nnTF { #1 } { #2 } { } { #3 } +} + +\cs_new:Npn\semantex_data_int_clear:nn#1#2 +{ + \semantex_data_int_provide:nn { #1 } { #2 } + \int_zero:c { g__semantex_data_int_#1_#2 } +} + +% COMMANDS FOR HANDLING DATA OF SEQUENCE TYPE + +\cs_new:Npn \semantex_data_seq_get_store:nnN#1#2#3{% maybe should be PROTECTED?? % #1 = name of object % #2 = the sequence to get % #3 = the command to store it in - \bool_if_exist:cTF { semantex_data_seq_#1_#2_bool_if_provided } + \bool_if_exist:cTF { g__semantex_data_seq_#1_#2_bool_if_provided } { - \bool_if:cTF { semantex_data_seq_#1_#2_bool_if_provided } - { \seq_set_eq:Nc#3 { semantex_data_seq_#1_#2 } } - { \g_semantex_data_seq_get_store:vnN{ semantex_data_tl_#1_parent }{#2}#3 } + \bool_if:cTF { g__semantex_data_seq_#1_#2_bool_if_provided } + { + \seq_set_eq:Nc#3 { g__semantex_data_seq_#1_#2 } + } + { + \semantex_data_seq_get_store:nnN{ \semantex_data_parent_get:n { #1 } }{#2}#3 + } } { - \g_semantex_data_seq_get_store:nnN{ \g_semantex_data_tl_get:nn { #1 } { parent } }{#2}#3% + \semantex_data_seq_get_store:nnN{ \semantex_data_parent_get:n { #1 } }{#2}#3% } } -\cs_generate_variant:Nn \g_semantex_data_seq_get_store:nnN { vnN, nnc, vnc } +\cs_generate_variant:Nn \semantex_data_seq_get_store:nnN { vnN, nnc, vnc } % Remove these later -\cs_new:Npn\g_semantex_data_seq_provide:nn#1#2 +\cs_new:Npn\semantex_data_seq_provide:nn#1#2 { - \bool_if_exist:cTF { semantex_data_seq_#1_#2_bool_if_provided } + \bool_if_exist:cTF { g__semantex_data_seq_#1_#2_bool_if_provided } { - \bool_if:cF { semantex_data_seq_#1_#2_bool_if_provided } + \bool_if:cF { g__semantex_data_seq_#1_#2_bool_if_provided } { - \seq_new:c { semantex_data_seq_#1_#2 } - \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided } + \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided } } } { - \bool_new:c { semantex_data_seq_#1_#2_bool_if_provided } - \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided } - \seq_if_exist:cF { semantex_data_seq_#1_#2 } { - \seq_new:c { semantex_data_seq_#1_#2 } - } + \seq_new:c { g__semantex_data_seq_#1_#2 } + \bool_new:c { g__semantex_data_seq_#1_#2_bool_if_provided } + \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided } } } -\cs_new:Npn\g_semantex_data_seq_inherit:nn#1#2 +\cs_new:Npn\semantex_data_seq_inherit:nn#1#2 { - \bool_if_exist:cTF { semantex_data_seq_#1_#2_bool_if_provided } + \bool_if_exist:cTF { g__semantex_data_seq_#1_#2_bool_if_provided } { - \bool_if:cF { semantex_data_seq_#1_#2_bool_if_provided } + \bool_if:cF { g__semantex_data_seq_#1_#2_bool_if_provided } { - \g_semantex_data_seq_get_store:vnc { semantex_data_tl_#1_parent } { #2 } { semantex_data_seq_#1_#2 } - \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided } + \semantex_data_seq_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_seq_#1_#2 } + \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided } } } { - \bool_new:c { semantex_data_seq_#1_#2_bool_if_provided } - \bool_set_true:c { semantex_data_seq_#1_#2_bool_if_provided } - \seq_if_exist:cF { semantex_data_seq_#1_#2 } { \seq_new:c { semantex_data_seq_#1_#2 } } - \g_semantex_data_seq_get_store:vnc { semantex_data_tl_#1_parent } { #2 } { semantex_data_seq_#1_#2 } + \semantex_data_seq_get_store:nnc { \semantex_data_parent_get:n { #1 } } { #2 } { g__semantex_data_seq_#1_#2 } + \bool_new:c { g__semantex_data_seq_#1_#2_bool_if_provided } + \bool_set_true:c { g__semantex_data_seq_#1_#2_bool_if_provided } + \seq_if_exist:cF { g__semantex_data_seq_#1_#2 } { \seq_new:c { g__semantex_data_seq_#1_#2 } } } } -\cs_new:Npn\g_semantex_data_seq_put_right:nnn#1#2#3 +\cs_new:Npn\semantex_data_seq_put_right:nnn#1#2#3 +{ + \semantex_data_seq_inherit:nn { #1 } { #2 } + \seq_put_right:cn { g__semantex_data_seq_#1_#2 } { #3 } +} + +\cs_new:Npn\semantex_data_seq_clear:nn#1#2 { - \g_semantex_data_seq_inherit:nn { #1 } { #2 } - \seq_put_right:cn { semantex_data_seq_#1_#2 } { #3 } + \semantex_data_seq_provide:nn { #1 } { #2 } + \seq_clear:c { g__semantex_data_seq_#1_#2 } } -\cs_new:Npn \g_semantex_data_prop_provide:nn#1#2 +% COMMANDS FOR HANDLING DATA OF TYPE PROPERTY LIST: + +\cs_new:Npn \semantex_data_prop_provide:nn#1#2 { % #1 = name of the object % #2 = name of the prop - \prop_if_exist:cF { semantex_data_prop_#1_#2 } { \prop_new:c { semantex_data_prop_#1_#2 } } + \prop_if_exist:cF { g__semantex_data_prop_#1_#2 } { \prop_new:c { g__semantex_data_prop_#1_#2 } } } -\cs_new:Npn \g_semantex_data_prop_put:nnnn#1#2#3#4 +\cs_new:Npn \semantex_data_prop_put:nnnn#1#2#3#4 { - \prop_put:cnn { semantex_data_prop_#1_#2 } { #3 } { #4 } + \semantex_data_prop_provide:nn { #1 } { #2 } % important that we do not inherit! This is crucial for getting the right inheritance for key interfaces + \prop_put:cnn { g__semantex_data_prop_#1_#2 } { #3 } { #4 } +} + +\cs_new:Npn\semantex_data_prop_remove:nnn#1#2#3 +{ + \prop_if_exist:cT { g__semantex_data_prop_#1_#2 } + { + \prop_remove:cn { g__semantex_data_prop_#1_#2 } { #3 } + } } -\cs_new:Npn \g_semantex_valuekey_get:nnNTF#1#2#3#4#5{% +\cs_new:Npn \semantex_valuekey_get:nnNTF#1#2#3#4#5{% % #1 = name of the object % #2 = keyval data to get % #3 = command to store possible data in % #4 = if true (not to be used) % #5 = if false - \prop_get:cnNTF { semantex_data_prop_#1_custom_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp - { #4 } + \prop_get:cnNTF { g__semantex_data_prop_#1_custom_valuekeys } { #2 } #3 { - \tl_if_eq:nnTF { #1 } { semantexvariable } - { #5 } + #4 + } + { + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + #5 + } { - \g_semantex_valuekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 } + \semantex_valuekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 } } } } -\cs_generate_variant:Nn \g_semantex_valuekey_get:nnNTF { vnNTF, xnNTF } +\cs_new:Npn\semantex_valuekey_remove:nn#1#2 +{ + \semantex_data_prop_remove:nnn { #1 } { custom_valuekeys } { #2 } +} -\cs_new:Npn \g_semantex_novaluekey_get:nnNTF#1#2#3#4#5{% +\cs_generate_variant:Nn \semantex_valuekey_get:nnNTF { fnNTF, vnNTF, xnNTF } + +\cs_new:Npn \semantex_singlekey_get:nnNTF#1#2#3#4#5{% % #1 = name of the object % #2 = singlekey data to get % #3 = command to store possible data in % #4 = if true (not to be used) % #5 = if false - \prop_get:cnNTF { semantex_data_prop_#1_custom_novaluekeys } { #2 } #3 - { #4 } + \prop_get:cnNTF { g__semantex_data_prop_#1_custom_singlekeys } { #2 } #3 + { + #4 + } { - \tl_if_eq:nnTF { #1 } { semantexvariable } - { #5 } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + #5 + } { - \g_semantex_novaluekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 } + \semantex_singlekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 } } } } -\cs_generate_variant:Nn \g_semantex_novaluekey_get:nnNTF { vnNTF, xnNTF } +\cs_new:Npn\semantex_singlekey_remove:nn#1#2 +{ + \semantex_data_prop_remove:nnn { #1 } { custom_singlekeys } { #2 } +} -%\cs_new:N\l_semantex_arg_valuekey_get_parent_temp +\cs_generate_variant:Nn \semantex_singlekey_get:nnNTF { fnNTF, vnNTF, xnNTF } -\cs_new:Npn \g_semantex_arg_valuekey_get:nnNTF#1#2#3#4#5{% +\cs_new:Npn \semantex_arg_valuekey_get:nnNTF#1#2#3#4#5{% % #1 = name of the object % #2 = keyval data to get % #3 = command to store possible data in % #4 = if true (not to be used) % #5 = if false - \prop_get:cnNTF { semantex_data_prop_#1_custom_arg_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp - { #4 } + \prop_get:cnNTF { g__semantex_data_prop_#1_custom_arg_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp + { + #4 + } { - \tl_if_eq:nnTF { #1 } { semantexvariable } - { #5 } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + #5 + } { - \g_semantex_arg_valuekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 } + \semantex_arg_valuekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 } } } } -\cs_generate_variant:Nn \g_semantex_arg_valuekey_get:nnNTF { vnNTF, xnNTF } +\cs_generate_variant:Nn \semantex_arg_valuekey_get:nnNTF { fnNTF, vnNTF, xnNTF } + +\cs_new:Npn\semantex_arg_valuekey_remove:nn#1#2 +{ + \semantex_data_prop_remove:nnn { #1 } { custom_arg_valuekeys } { #2 } +} -\prop_new:N\l_semantex_arg_valuekey_get_temp -\cs_new:Npn \g_semantex_arg_novaluekey_get:nnNTF#1#2#3#4#5{% +\cs_new:Npn \semantex_arg_singlekey_get:nnNTF#1#2#3#4#5{% % #1 = name of the object % #2 = singlekey data to get % #3 = command to store possible data in % #4 = if true (not to be used) % #5 = if false - \prop_get:cnNTF { semantex_data_prop_#1_custom_arg_novaluekeys } { #2 } #3 - { #4 } + \prop_get:cnNTF { g__semantex_data_prop_#1_custom_arg_singlekeys } { #2 } #3 { - \tl_if_eq:nnTF { #1 } { semantexvariable } - { #5 } { \g_semantex_arg_novaluekey_get:xnNTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } #3 { #4 } { #5 } } + #4 } + { + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + #5 + } + { + \semantex_arg_singlekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 } + } + } +} + +\cs_generate_variant:Nn \semantex_arg_singlekey_get:nnNTF { fnNTF, vnNTF, xnNTF } + +\cs_new:Npn\semantex_arg_singlekey_remove:nn#1#2 +{ + \semantex_data_prop_remove:nnn { #1 } { custom_arg_singlekeys } { #2 } } -\cs_generate_variant:Nn \g_semantex_arg_novaluekey_get:nnNTF { vnNTF, xnNTF } +% COMMANDS FOR HANDLING DATA OF TYPE BOOLEAN: -\cs_new:Npn\g_semantex_data_bool_get:nnTF#1#2#3#4 +\cs_new:Npn\semantex_data_bool_get:nnTF#1#2#3#4 { % #1 = name of the object % #2 = boolean to get % #3 = if true % #4 = if false - \bool_if_exist:cTF { semantex_data_bool_#1_if_#2_bool_if_provided } + \bool_if_exist:cTF { g__semantex_data_bool_#1_if_#2_bool_if_provided } { - \bool_if:cTF { semantex_data_bool_#1_if_#2_bool_if_provided } + \bool_if:cTF { g__semantex_data_bool_#1_if_#2_bool_if_provided } { - \bool_if:cTF { semantex_data_bool_#1_if_#2 } { #3 } { #4 } + \bool_if:cTF { g__semantex_data_bool_#1_if_#2 } { #3 } { #4 } } { - \tl_if_eq:nnTF { #1 } { semantexvariable } - { #4 } { \g_semantex_data_bool_get:xnTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #3 } { #4 } } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + #4 + } + { + \semantex_data_bool_get:fnTF { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } { #4 } + } } } { - \tl_if_eq:nnTF { #1 } { semantexvariable } - { #4 } { \g_semantex_data_bool_get:xnTF { \g_semantex_data_tl_get:nn { #1 } { parent } } { #2 } { #3 } { #4 } } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } + { + #4 + } + { + \semantex_data_bool_get:fnTF { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } { #4 } + } } } -\cs_generate_variant:Nn \g_semantex_data_bool_get:nnTF { xnTF, vnTF } +\cs_generate_variant:Nn \semantex_data_bool_get:nnTF { onTF, fnTF, xnTF, vnTF, nnT } -\cs_new:Npn\g_semantex_data_bool_provide:nn#1#2 +\cs_new:Npn\semantex_data_bool_get:nnF#1#2#3 +{ + \semantex_data_bool_get:nnTF { #1 } { #2 } { } { #3 } +} + +\cs_new:Npn\semantex_data_bool_provide:nn#1#2 { % #1 = name of the object % #2 = boolean to provide - \bool_if_exist:cTF { semantex_data_bool_#1_if_#2_bool_if_provided } + \bool_if_exist:cTF { g__semantex_data_bool_#1_if_#2_bool_if_provided } { - \bool_if:cF { semantex_data_bool_#1_if_#2_bool_if_provided } - { \bool_set_true:c { semantex_data_bool_#1_if_#2_bool_if_provided } } + \bool_if:cF { g__semantex_data_bool_#1_if_#2_bool_if_provided } + { + \bool_set_true:c { g__semantex_data_bool_#1_if_#2_bool_if_provided } + } } { - \bool_new:c { semantex_data_bool_#1_if_#2 } - \bool_new:c { semantex_data_bool_#1_if_#2_bool_if_provided } - \bool_set_true:c { semantex_data_bool_#1_if_#2_bool_if_provided } + \bool_new:c { g__semantex_data_bool_#1_if_#2 } + \bool_new:c { g__semantex_data_bool_#1_if_#2_bool_if_provided } + \bool_set_true:c { g__semantex_data_bool_#1_if_#2_bool_if_provided } } } -\cs_new:Npn\g_semantex_data_bool_set_true:nn#1#2 +\cs_new:Npn\semantex_data_bool_set_true:nn#1#2 { % #1 = name of the object % #2 = boolean to provide - \g_semantex_data_bool_provide:nn { #1 } { #2 } - \bool_set_true:c { semantex_data_bool_#1_if_#2 } + \semantex_data_bool_provide:nn { #1 } { #2 } + \bool_set_true:c { g__semantex_data_bool_#1_if_#2 } } -\cs_new:Npn\g_semantex_data_bool_set_false:nn#1#2 +\cs_new:Npn\semantex_data_bool_set_false:nn#1#2 { % #1 = name of the object % #2 = boolean to provide - \g_semantex_data_bool_provide:nn { #1 } { #2 } - \bool_set_false:c { semantex_data_bool_#1_if_#2 } + \semantex_data_bool_provide:nn { #1 } { #2 } + \bool_set_false:c { g__semantex_data_bool_#1_if_#2 } } -\cs_new:Npn\g_semantex_data_cs_get:nnn#1#2#3 +% COMMANDS FOR HANDLING COMMAND SEQUENCE DATA AND KEYVAL SYNTAX: + +\cs_new:Npn\semantex_data_cs_get:nnn#1#2#3 { % #1 = name of the object % #2 = command sequence to get % #3 = what to apply said command sequence to - \cs_if_exist:cTF { g_semantex_data_cs_#1_#2:n } - { \use:c { g_semantex_data_cs_#1_#2:n } { #3 } } + \cs_if_exist:cTF { __semantex_data_cs_#1_#2:n } + { + \use:c { __semantex_data_cs_#1_#2:n } { #3 } + } { - \tl_if_eq:nnTF { #1 } { semantexvariable } + \str_if_eq:nnTF { #1 } { class_SemantexVariable } { % should probably throw an error by now, but later! } { - \g_semantex_data_cs_get:xnn { \g_semantex_data_tl_get:nn{#1}{parent} } { #2 } { #3 } + \semantex_data_cs_get:xnn { \semantex_data_parent_get:n {#1} } { #2 } { #3 } } } } -\cs_generate_variant:Nn \g_semantex_data_cs_get:nnn { xnn } +\cs_generate_variant:Nn \semantex_data_cs_get:nnn { xnn } + +\cs_generate_variant:Nn \keyval_parse:NNn { cco } -\cs_new:Npn \g_semantex_keys_set:nn#1#2 +\cs_new:Npn \semantex_keys_set:nn#1#2 { + % The central command for doing keyval setup % #1 = object % #2 = keys - \keyval_parse:cco %IM think about wthether o-type is really necessary. - { g_semantex_data_cs_#1_novaluekey:n } - { g_semantex_data_cs_#1_valuekey:nn } + \keyval_parse:cco % Could be nice to get rid of o-type expansion, but so far has not been possible + { __semantex_data_cs_#1_singlekey:n } + { __semantex_data_cs_#1_valuekey:nn } { #2 } } -\cs_new:Npn \g_semantex_arg_keys_set:nn#1#2 +\cs_new:Npn \semantex_arg_keys_set:nn#1#2 { + % The central command for doing keyval setup for the argument % #1 = object % #2 = keys - \keyval_parse:cco %IM -||- - { g_semantex_data_cs_#1_arg_novaluekey:n } - { g_semantex_data_cs_#1_arg_valuekey:nn } + \keyval_parse:cco % See last command + { __semantex_data_cs_#1_arg_singlekey:n } + { __semantex_data_cs_#1_arg_valuekey:nn } { #2 } } \cs_generate_variant:Nn \clist_map_function:nN { nc } -\cs_new:Npn \g_semantex_arg_novaluekeys_set:nn#1#2 +\cs_new:Npn \semantex_arg_singlekeys_set:nn#1#2 { - \clist_map_function:nc {#2} { g_semantex_data_cs_#1_arg_novaluekey:n } + % This command is necessary because you sometimes want to only allow singlekeys + % and not valuekeys in arguments (for instance, if you allow valuekeys, anything + % containing an equality sign will die horribly in the argument of any object + \clist_map_function:nc {#2} { __semantex_data_cs_#1_arg_singlekey:n } } -\DeclareDocumentCommand\setupclass{mm}{ % a user-level command for setting up the object +\cs_generate_variant:Nn \semantex_keys_set:nn { xn } + +\DeclareDocumentCommand\SetupClass{mm}{ % a user-level command for setting up the object % #1 = class % #2 = setup - %\exp_args:Nx - \g_semantex_keys_set:nn { #1 }{ #2 } + \semantex_keys_set:xn { class_\cs_to_str:N #1 }{ #2 } } -\DeclareDocumentCommand\setupobject{mm}{% +\DeclareDocumentCommand\SetupObject{mm}{% % #1 = object % #2 = setup - \g_semantex_keys_set:nn { \cs_to_str:N #1 } { #2 } + \semantex_keys_set:xn { object_\cs_to_str:N #1 } { #2 } } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% THE PRIMITIVE VALUEKEYS +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% Now for the commands that are the basis of the keyval interface. +% This basis consists of a collection of so-called "primitive" +% valuekeys, which all use the syntax +% \semantex_primitive_<nameOfValuekey>:nn +% These are like primitive TeX commands -- they are not defined in +% terms of other keys, and all other keys have to defined in terms +% of these, one way or another. + +% For all of them, #1 = name of the class/object, and #2 = value of +% the key. To keep the system as simple as possible, I chose only to +% make primitive valuekeys, so there is no such thing as a primitive +% singlekey. Therefore, for instance, the singlekey "return" is +% defined as "return=", where return is a primitive valuekey that +% does not use the value of the key for anything. + +% First, some very simple keys that we shall need over and over again: + +\cs_new:Npn\semantex_grab_first_argument_of_two:nn#1#2{#1} +\cs_new:Npn\semantex_grab_second_argument_of_two:nn#1#2{#2} + +\cs_new:Npn\semantex_grab_first_argument_of_three:nnn#1#2#3{#1} +\cs_new:Npn\semantex_grab_second_argument_of_three:nnn#1#2#3{#2} +\cs_new:Npn\semantex_grab_third_argument_of_three:nnn#1#2#3{#3} + +\cs_new:Npn\semantex_grab_first_argument_of_four:nnnn#1#2#3#4{#1} +\cs_new:Npn\semantex_grab_second_argument_of_four:nnnn#1#2#3#4{#2} +\cs_new:Npn\semantex_grab_third_argument_of_four:nnnn#1#2#3#4{#3} +\cs_new:Npn\semantex_grab_fourth_argument_of_four:nnnn#1#2#3#4{#4} + +\cs_new:Npn\semantex_grab_first_argument_of_five:nnnnn#1#2#3#4#5{#1} +\cs_new:Npn\semantex_grab_second_argument_of_five:nnnnn#1#2#3#4#5{#2} +\cs_new:Npn\semantex_grab_third_argument_of_five:nnnnn#1#2#3#4#5{#3} +\cs_new:Npn\semantex_grab_fourth_argument_of_five:nnnnn#1#2#3#4#5{#4} +\cs_new:Npn\semantex_grab_fifth_argument_of_five:nnnnn#1#2#3#4#5{#5} + +\cs_new:Npn\semantex_grab_first_argument_of_six:nnnnnn#1#2#3#4#5#6{#1} +\cs_new:Npn\semantex_grab_second_argument_of_six:nnnnnn#1#2#3#4#5#6{#2} +\cs_new:Npn\semantex_grab_third_argument_of_six:nnnnnn#1#2#3#4#5#6{#3} +\cs_new:Npn\semantex_grab_fourth_argument_of_six:nnnnnn#1#2#3#4#5#6{#4} +\cs_new:Npn\semantex_grab_fifth_argument_of_six:nnnnnn#1#2#3#4#5#6{#5} +\cs_new:Npn\semantex_grab_sixth_argument_of_six:nnnnnn#1#2#3#4#5#6{#6} + +\cs_new:Npn\semantex_grab_first_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#1} +\cs_new:Npn\semantex_grab_second_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#2} +\cs_new:Npn\semantex_grab_third_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#3} +\cs_new:Npn\semantex_grab_fourth_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#4} +\cs_new:Npn\semantex_grab_fifth_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#5} +\cs_new:Npn\semantex_grab_sixth_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#6} +\cs_new:Npn\semantex_grab_seventh_argument_of_seven:nnnnnnn#1#2#3#4#5#6#7{#7} + +\cs_new:Npn\semantex_grab_first_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#1} +\cs_new:Npn\semantex_grab_second_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#2} +\cs_new:Npn\semantex_grab_third_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#3} +\cs_new:Npn\semantex_grab_fourth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#4} +\cs_new:Npn\semantex_grab_fifth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#5} +\cs_new:Npn\semantex_grab_sixth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#6} +\cs_new:Npn\semantex_grab_seventh_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#7} +\cs_new:Npn\semantex_grab_eighth_argument_of_eight:nnnnnnnn#1#2#3#4#5#6#7#8{#8} + +\cs_new:Npn\semantex_grab_first_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#1} +\cs_new:Npn\semantex_grab_second_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#2} +\cs_new:Npn\semantex_grab_third_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#3} +\cs_new:Npn\semantex_grab_fourth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#4} +\cs_new:Npn\semantex_grab_fifth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#5} +\cs_new:Npn\semantex_grab_sixth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#6} +\cs_new:Npn\semantex_grab_seventh_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#7} +\cs_new:Npn\semantex_grab_eighth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#8} +\cs_new:Npn\semantex_grab_ninth_argument_of_nine:nnnnnnnnn#1#2#3#4#5#6#7#8#9{#9} +\cs_generate_variant:Nn\str_if_eq:nnTF {xxTF,ooTF} +\cs_generate_variant:Nn\str_if_eq:nnT {xxT, ooT} -% Now for the commands that implement the keyval interface. -% These commands are used by the command \g_semantex_data_cs_#1_keys_set, see -% above. -% There is a fixed collection of primitive commands. -% Furthermore, the user has the option to create a collection -% of new commands, which are all stored in the property list -% called \semantex_data_prop_#1_custom_valuekeys -% These valuekeys contain code that must be executable by other keys -% (e.g., primitive ones) -% The key value is accessible to the user via the temporary command -% \l_semantex_key_value_temp - -\providecommand\semantexdataprovide{} -\providecommand\semantexdataset{} -\providecommand\semantexdatasetx{} -\providecommand\semantexdataputright{} -\providecommand\semantexdataputrightx{} -\providecommand\semantexdataputleft{} -\providecommand\semantexdataputleftx{} -\providecommand\semantexdataget{} -\providecommand\semantexdatagetexpnot{} -\providecommand\semantexdataclear{} -\providecommand\semantexsetkeys{} -\providecommand\semantexsetkeysx{} -\providecommand\semantexstrifeq{} -\providecommand\semantexboolprovide{} -\providecommand\semantexboolsettrue{} -\providecommand\semantexboolsetfalse{} -\providecommand\semantexboolif{} - -% CHANGE TO CAMEL CASE! +\cs_generate_variant:Nn\str_if_eq:nnF {xxF, ooF} +\cs_generate_variant:Nn\tl_if_blank:nTF { xTF, xT } -\cs_generate_variant:Nn\str_if_eq:nnTF {xxTF,ooTF} +\cs_generate_variant:Nn \tl_if_blank:nF { xF } -\cs_new:Npn\g_semantex_primitive_valuekey_execute:nn#1#2 -{ - \renewcommand\semantexdataprovide[1]{\g_semantex_data_tl_provide:nn{#1}{##1}} - \renewcommand\semantexdataset[2]{\g_semantex_data_tl_set:nnn{#1}{##1}{##2}} - \renewcommand\semantexdatasetx[2]{\g_semantex_data_tl_set:nnx{#1}{##1}{##2}} - \renewcommand\semantexdataputright[2]{\g_semantex_data_tl_put_right:nnn{#1}{##1}{##2}} - \renewcommand\semantexdataputrightx[2]{\g_semantex_data_tl_put_right:nnx{#1}{##1}{##2}} - \renewcommand\semantexdataputleft[2]{\g_semantex_data_tl_put_left:nnn{#1}{##1}{##2}} - \renewcommand\semantexdataputleftx[2]{\g_semantex_data_tl_put_left:nnx{#1}{##1}{##2}} - \renewcommand\semantexdataget[1]{\g_semantex_data_tl_get:nn{#1}{##1}} - \renewcommand\semantexdatagetexpnot[1]{\g_semantex_data_tl_get_exp_not:nn{#1}{##1}} - \renewcommand\semantexdataclear[1]{\g_semantex_data_tl_clear:nn{#1}{##1}} - \renewcommand\semantexsetkeys[1]{\g_semantex_keys_set:nn{#1}{##1}} - \renewcommand\semantexsetkeysx[1]{\g_semantex_keys_set:nx{#1}{##1}} - \renewcommand\semantexstrifeq[4]{\str_if_eq:xxTF{##1}{##2}{##3}{##4}} - \renewcommand\semantexboolprovide[1]{\g_semantex_data_bool_provide:nn{#1}{##1}} - \renewcommand\semantexboolsettrue[1]{\g_semantex_data_bool_set_true:nn{#1}{##1}} - \renewcommand\semantexboolsetfalse[1]{\g_semantex_data_bool_set_false:nn{#1}{##1}} - \renewcommand\semantexboolif[3]{\g_semantex_data_bool_get:nnTF{#1}{##1}{##2}{##3}} +\cs_new:Npn\semantex_primitive_valuekey_execute:nn#1#2 +{ + % This keys just executes whatever data you plug into it. + % Possibly, going forward, it might make more sense to define all + % of these commands in the keyval handling command + % so that the get commands are accessible from all keys. + \cs_set:Npn\SemantexDataProvide##1{\semantex_data_tl_provide:nn{#1}{##1}} + \cs_set:Npn\SemantexDataSet##1##2{\semantex_data_tl_set:nnn{#1}{##1}{##2}} + \cs_set:Npn\SemantexDataSetx##1##2{\semantex_data_tl_set:nnx{#1}{##1}{##2}} + \cs_set:Npn\SemantexDataPutRight##1##2{\semantex_data_tl_put_right:nnn{#1}{##1}{##2}} + \cs_set:Npn\SemantexDataPutRightx##1##2{\semantex_data_tl_put_right:nnx{#1}{##1}{##2}} + \cs_set:Npn\SemantexDataPutLeft##1##2{\semantex_data_tl_put_left:nnn{#1}{##1}{##2}} + \cs_set:Npn\SemantexDataPutLeftx##1##2{\semantex_data_tl_put_left:nnx{#1}{##1}{##2}} + \cs_set:Npn\SemantexDataGet##1{\semantex_data_tl_get:nn{#1}{##1}} + \cs_set:Npn\SemantexDataGetExpNot##1{\semantex_data_tl_get_exp_not:nn{#1}{##1}} + \cs_set:Npn\SemantexDataClear##1{\semantex_data_tl_clear:nn{#1}{##1}} + \cs_set:Npn\SemantexKeysSet##1{\semantex_keys_set:nn{#1}{##1}} + \cs_set:Npn\SemantexKeysSetx##1{\semantex_keys_set:nx{#1}{##1}} + \cs_set:Npn\SemantexStrIfEqTF##1##2##3##4{\str_if_eq:xxTF{##1}{##2}{##3}{##4}} + \cs_set:Npn\SemantexStrIfEqT##1##2##3{\str_if_eq:xxT{##1}{##2}{##3}} + \cs_set:Npn\SemantexStrIfEqF##1##2##3{\str_if_eq:xxF{##1}{##2}{##3}} + \cs_set:Npn\SemantexIfBlankTF##1##2##3{\tl_if_blank:xTF{##1}{##2}{##3}} + \cs_set:Npn\SemantexIfBlankT##1##2{\tl_if_blank:xT{##1}{##2}} + \cs_set:Npn\SemantexIfBlankF##1##2{\tl_if_blank:xF{##1}{##2}} + \cs_set:Npn\SemantexBoolProvide##1{\semantex_data_bool_provide:nn{#1}{##1}} + \cs_set:Npn\SemantexBoolSetTrue##1{\semantex_data_bool_set_true:nn{#1}{##1}} + \cs_set:Npn\SemantexBoolSetFalse##1{\semantex_data_bool_set_false:nn{#1}{##1}} + \cs_set:Npn\SemantexBoolIfTF##1##2##3{\semantex_data_bool_get:nnTF{#1}{##1}{##2}{##3}} + \cs_set:Npn\SemantexBoolIfT##1##2{\semantex_data_bool_get:nnTF{#1}{##1}{##2}{}} + \cs_set:Npn\SemantexBoolIfF##1##2{\semantex_data_bool_get:nnTF{#1}{##1}{}{##2}} + \cs_set:Npn\SemantexIntProvide##1{\semantex_data_int_provide:nn{#1}{##1}} + \cs_set:Npn\SemantexIntGet##1{\semantex_data_int_get:nn{#1}{##1}} + \cs_set:Npn\SemantexIntClear##1{\semantex_data_int_clear:nn{#1}{##1}} + \cs_set:Npn\SemantexIntIncr##1{\semantex_data_int_incr:nn{#1}{##1}} + \cs_set:Npn\SemantexIntSet##1##2{\semantex_data_int_set:nnn{#1}{##1}{##2}} + \cs_set:Npn\SemantexIntIfPositiveTF##1##2##3{\semantex_data_int_if_positive:nnTF{#1}{##1}{##2}{##3}} + \cs_set:Npn\SemantexIntIfPositiveT##1##2{\semantex_data_int_if_positive:nnT{#1}{##1}{##2}} + \cs_set:Npn\SemantexIntIfPositiveF##1##2{\semantex_data_int_if_positive:nnF{#1}{##1}{##2}} + \cs_set:Npn\SemantexIntIfGreaterThanOneTF##1##2##3{\semantex_data_int_if_greater_than_one:nnTF{#1}{##1}{##2}{##3}} + \cs_set:Npn\SemantexIntIfGreaterThanOneT##1##2{\semantex_data_int_if_greater_than_one:nnT{#1}{##1}{##2}} + \cs_set:Npn\SemantexIntIfGreaterThanOneF##1##2{\semantex_data_int_if_greater_than_one:nnF{#1}{##1}{##2}} + \cs_set:Npn\SemantexExpNot##1{\exp_not:n{##1}} %\exp_not:n{#2} - % how about erase and forget? + % how about forget? #2 } -\cs_new:Npn\g_semantex_primitive_valuekey_parse:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_parse:nn#1#2 { - \g_semantex_data_tl_inherit:nn { #1 } { parseoptions } - % But we need to also reset this, plus all data variables that - % it used; nope, not necessary - \g_semantex_keys_set:nx { #1 } { - \g_semantex_data_tl_get_exp_not:nn { #1 } { parseoptions } + % This command runs all the keys that the user may have + % stored via the parseoptions key + %\semantex_data_tl_inherit:nn { #1 } { parseoptions } + \semantex_keys_set:nx { #1 } { + \semantex_data_tl_get_exp_not:nn { #1 } { parseoptions } } + \semantex_data_tl_clear:nn { #1 } { parseoptions } % this is probably necessary } -\cs_new:Npn\g_semantex_primitive_valuekey_parseoptions:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_parseoptions:nn#1#2 { - \g_semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 } + % This adds keys to the parseoptions token list + \semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 } } -\cs_new:Npn\g_semantex_primitive_valuekey_return:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_return:nn#1#2 { - \g_semantex_primitive_valuekey_innerreturn:nn { #1 }{} - \g_semantex_primitive_valuekey_rightreturn:nn { #1 }{} - \g_semantex_primitive_valuekey_leftreturn:nn { #1 }{} + % This is an umbrella key that runs all of the three + % return routines, innerreturn, rightreturn, and leftreturn + \semantex_primitive_valuekey_innerreturn:nn { #1 }{} + \semantex_primitive_valuekey_rightreturn:nn { #1 }{} + \semantex_primitive_valuekey_leftreturn:nn { #1 }{} } -\cs_new:Npn\g_semantex_primitive_valuekey_innerreturn:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_innerreturn:nn#1#2 { - \g_semantex_data_tl_inherit:nn { #1 } { symbol } - \g_semantex_data_seq_inherit:nn { #1 } { commands_sequence } - \g_semantex_data_seq_get_store:nnN { #1 } { commands_sequence } \l__semantex_data_seq_commands_sequence_temp - %\seq_map_inline:cn { semantex_data_seq_#1_commands_sequence } + % This adds all of the commands added via the command key + % to the symbol + \semantex_data_tl_inherit:nn { #1 } { symbol } + \semantex_data_seq_inherit:nn { #1 } { commands_sequence } + \semantex_data_seq_get_store:nnN { #1 } { commands_sequence } \l__semantex_data_seq_commands_sequence_temp \seq_map_inline:Nn \l__semantex_data_seq_commands_sequence_temp { - \g_semantex_data_tl_set:nnx { #1 } { symbol } + \semantex_data_tl_set:nnx { #1 } { symbol } { \exp_not:n {\exp_not:N ##1} { - \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } + \semantex_data_tl_get_exp_not:nn { #1 } { symbol } } % This was the solution that happened to solve % the expansion issues best } } - \seq_clear:c { semantex_data_seq_#1_commands_sequence } -} - -\tl_new:N\l__semantex_rightreturn_par_temp - -\tl_new:N\l__semantex_rightreturn_nopar_temp - -\cs_generate_variant:Nn \g_semantex_keys_set:nn { nx , no } - -\cs_new:Npn\g_semantex_primitive_valuekey_rightreturn:nn#1#2 -{ - \g_semantex_data_tl_inherit_x:nn { #1 } { upper_index } - \g_semantex_data_tl_inherit_x:nn { #1 } { lower_index } - \g_semantex_data_tl_inherit_x:nn { #1 } { preupper } - \g_semantex_data_tl_inherit_x:nn { #1 } { postupper } - \g_semantex_data_tl_inherit_x:nn { #1 } { prelower } - \g_semantex_data_tl_inherit_x:nn { #1 } { postlower } - \g_semantex_data_tl_inherit_x:nn { #1 } { arg } - \g_semantex_data_tl_get_store:nnN { #1 } { upper_index } \l__semantex_rightreturn_upper_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { lower_index } \l__semantex_rightreturn_lower_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { symbol } \l__semantex_rightreturn_symbol_temp - \g_semantex_data_tl_get_store:nnN { #1 } { preupper } - \l__semantex_rightreturn_preupper_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postupper } - \l__semantex_rightreturn_postupper_temp - \g_semantex_data_tl_get_store:nnN { #1 } { prelower } - \l__semantex_rightreturn_prelower_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postlower } - \l__semantex_rightreturn_postlower_temp - \g_semantex_data_tl_set:nnx { #1 } { symbol } - { - \exp_not:V \l__semantex_rightreturn_symbol_temp - % Setup indices: - \exp_not:N\g_semantex_right_indices:nnnnnn - { \exp_not:V \l__semantex_rightreturn_preupper_temp } - { \exp_not:V \l__semantex_rightreturn_upper_index_temp } - { \exp_not:V \l__semantex_rightreturn_postupper_temp } - { \exp_not:V \l__semantex_rightreturn_prelower_temp } - { \exp_not:V \l__semantex_rightreturn_lower_index_temp } - { \exp_not:V \l__semantex_rightreturn_postlower_temp } - } - \g_semantex_data_bool_get:nnTF { #1 } { par } - { - \g_semantex_data_tl_get_store:nnN { #1 } { par_size } - \l__semantex_rightreturn_par_size_temp - \g_semantex_data_tl_get_store:nnN { #1 } { par_open } \l__semantex_rightreturn_par_open_temp - \g_semantex_data_tl_get_store:nnN { #1 } { par_close } \l__semantex_rightreturn_par_close_temp - \g_semantex_data_tl_get_store:nnN { #1 } { arg } \l__semantex_rightreturn_arg_temp - \g_semantex_data_tl_get_store:nnN { #1 } { prearg } \l_semantex_rightreturn_prearg_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postarg } \l_semantex_rightreturn_postarg_temp - \tl_set:Nx\l__semantex_rightreturn_par_temp - { - { \exp_not:V \l__semantex_rightreturn_par_size_temp } - { \exp_not:V \l__semantex_rightreturn_par_open_temp } - { \exp_not:V \l__semantex_rightreturn_par_close_temp } - { \exp_not:V \l_semantex_rightreturn_prearg_temp } - { \exp_not:V \l__semantex_rightreturn_arg_temp } - { \exp_not:V \l_semantex_rightreturn_postarg_temp } - } - \tl_put_left:Nn\l__semantex_rightreturn_par_temp + \semantex_data_seq_clear:nn { #1 } { commands_sequence } +} + +\cs_generate_variant:Nn \semantex_keys_set:nn { nx , no } + +\cs_new:Npn\semantex_primitive_valuekey_rightreturn:nn#1#2 +{ + \semantex_right_indices_return_store:nN { #1 } \l_semantex_rightreturn_right_indices_temp + \semantex_data_tl_put_right:nnx { #1 } { symbol } + { + \exp_not:V\l_semantex_rightreturn_right_indices_temp + } + \semantex_data_bool_get:nnTF { #1 } { leftargument } + { + % do nothing + } + { + \semantex_arg_return_store:nN { #1 } \l_semantex_rightreturn_arg_temp + \semantex_data_tl_put_right:nnx { #1 } { symbol } { - \exp_not:N - \g_semantex_parentheses:nnnnnn + \exp_not:V\l_semantex_rightreturn_arg_temp } - \g_semantex_data_tl_put_right:nnx { #1 } { symbol } + } +} + + +\cs_new:Npn\semantex_primitive_valuekey_leftreturn:nn#1#2 +{ + \semantex_left_indices_return_store:nN { #1 } \l_semantex_leftreturn_left_indices_temp + \semantex_data_tl_put_left:nnx { #1 } { symbol } + { + \exp_not:V\l_semantex_leftreturn_left_indices_temp + } + \semantex_data_bool_get:nnTF { #1 } { leftargument } + { + \semantex_arg_return_store:nN { #1 } \l_semantex_leftreturn_arg_temp + \semantex_data_tl_put_left:nnx { #1 } { symbol } { - \exp_not:V\l__semantex_rightreturn_par_temp + \exp_not:V\l_semantex_leftreturn_arg_temp } } { - \tl_set:Nx\l__semantex_rightreturn_nopar_temp + % do nothing + } +} + +\cs_new:Npn \semantex_left_indices_return_store:nN#1#2 +{ + \semantex_data_tl_inherit_x:nn { #1 } { upperleft } + \semantex_data_tl_inherit_x:nn { #1 } { lowerleft } + \semantex_data_tl_inherit_x:nn { #1 } { preupperleft } + \semantex_data_tl_inherit_x:nn { #1 } { postupperleft } + \semantex_data_tl_inherit_x:nn { #1 } { prelowerleft } + \semantex_data_tl_inherit_x:nn { #1 } { postlowerleft } + \tl_set:Nn#2{} + \semantex_data_int_if_positive:nnTF { #1 } { numberofupperleftindices } + { + \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerleftindices } { - { \g_semantex_data_tl_get_exp_not:nn { #1 } { prearg } } - { \g_semantex_data_tl_get_exp_not:nn { #1 } { arg } } - { \g_semantex_data_tl_get_exp_not:nn { #1 } { postarg } } + \tl_put_right:Nx#2 + { + {}\sp{ + \semantex_data_tl_get_exp_not:nn { #1 } { preupperleft } + \semantex_data_tl_get_exp_not:nn { #1 } { upperleft } + \semantex_data_tl_get_exp_not:nn { #1 } { postupperleft } + } + \sb{ + \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft } + \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft } + \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft } + } + } } - \tl_put_left:Nn\l__semantex_rightreturn_nopar_temp { - \exp_not:N - \g_semantex_no_parentheses:nnn + \tl_put_right:Nx#2 + { + {}\sp{ + \semantex_data_tl_get_exp_not:nn { #1 } { preupperleft } + \semantex_data_tl_get_exp_not:nn { #1 } { upperleft } + \semantex_data_tl_get_exp_not:nn { #1 } { postupperleft } + } + } + } + } + { + \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerleftindices } + { + \tl_put_right:Nx#2 + { + {}\sb{ + \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft } + \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft } + \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft } + } + } } - \g_semantex_data_tl_put_right:nnx { #1 } { symbol } { - \exp_not:V\l__semantex_rightreturn_nopar_temp + % do nothing } } - \g_semantex_data_tl_clear:nn { #1 } { upper_index } - \g_semantex_data_bool_provide:nn { #1 } { first_upper } - \g_semantex_data_bool_set_true:nn { #1 } { first_upper } - \g_semantex_data_tl_clear:nn { #1 } { lower_index } - \g_semantex_data_bool_provide:nn { #1 } { first_lower } - \g_semantex_data_bool_set_true:nn { #1 } { first_lower } - \g_semantex_data_tl_clear:nn { #1 } { arg } - \g_semantex_data_bool_provide:nn { #1 } { first_arg } - \g_semantex_data_bool_set_true:nn { #1 } { first_arg } - \g_semantex_data_tl_clear:nn { #1 } { preupper } - \g_semantex_data_tl_clear:nn { #1 } { postupper } - \g_semantex_data_tl_clear:nn { #1 } { prelower } - \g_semantex_data_tl_clear:nn { #1 } { postlower } - %IM maybe one should enclose the new symbol in another group - %IM Maybe should also reset stuff like par size - %IM reset leftpar, rightpar, parsize etc. also + \semantex_data_tl_clear:nn { #1 } { upperleft } + \semantex_data_bool_provide:nn { #1 } { nextupperleftwithsep } % is it necessary to provide it before declaring it false? + \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep } + \semantex_data_tl_clear:nn { #1 } { lowerleft } + \semantex_data_bool_provide:nn { #1 } { nextlowerleftwithsep } % is it necessary to provide it before declaring it false? + \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep } + \semantex_data_tl_clear:nn { #1 } { preupperleft } + \semantex_data_tl_clear:nn { #1 } { postupperleft } + \semantex_data_tl_clear:nn { #1 } { prelowerleft } + \semantex_data_tl_clear:nn { #1 } { postlowerleft } + \semantex_data_int_clear:nn { #1 } { numberofupperleftindices } + \semantex_data_int_clear:nn { #1 } { numberoflowerleftindices } } -\cs_new:Npn\g_semantex_primitive_valuekey_leftreturn:nn#1#2 +\cs_new:Npn \semantex_arg_return_store:nN#1#2 { - \g_semantex_data_tl_inherit_x:nn { #1 } { upper_left_index } - \g_semantex_data_tl_inherit_x:nn { #1 } { lower_left_index } - \g_semantex_data_tl_inherit_x:nn { #1 } { preupperleft } - \g_semantex_data_tl_inherit_x:nn { #1 } { postupperleft } - \g_semantex_data_tl_inherit_x:nn { #1 } { prelowerleft } - \g_semantex_data_tl_inherit_x:nn { #1 } { postlowerleft } - %IMPLEMENT THIS!!! - % Clean up the following names - \g_semantex_data_tl_get_store:nnN { #1 } { upper_left_index } \l__semantex_leftreturn_upper_left_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { lower_left_index } \l__semantex_leftreturn_lower_left_index_temp - \g_semantex_data_tl_get_store:nnN { #1 } { symbol } \l__semantex_leftreturn_symbol_temp - \g_semantex_data_tl_get_store:nnN { #1 } { preupperleft } \l__semantex_leftreturn_preupperleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postupperleft } \l__semantex_leftreturn_postupperleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { prelowerleft } \l__semantex_leftreturn_prelowerleft_temp - \g_semantex_data_tl_get_store:nnN { #1 } { postlowerleft } \l__semantex_leftreturn_postlowerleft_temp - \g_semantex_data_tl_set:nnx { #1 } { symbol } + \semantex_data_tl_inherit_x:nn { #1 } { arg } + \semantex_data_int_inherit:nn { #1 } { numberofarguments } + %\semantex_data_tl_inherit:nn { #1 } { parsize } % This was necessary for unkonwn reasons -- otherwise it will fail when doing inheritance + \semantex_data_tl_get_store:nnN { #1 } { parsize } \l__semantex_primitive_valuekey_rightreturn_parsize_temp + \semantex_data_bool_get:nnTF { #1 } { par } { - % Setup indices: - \exp_not:N\g_semantex_left_indices:nnnnnn + \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments } { - \exp_not:V \l__semantex_leftreturn_preupperleft_temp + \__semantex_parentheses_store:nnnnN + { \l__semantex_primitive_valuekey_rightreturn_parsize_temp } + { \semantex_data_tl_get_exp_not:nn { #1 } { leftpar } } + { \semantex_data_tl_get_exp_not:nn { #1 } { rightpar } } + { + \semantex_data_tl_get_exp_not:nn { #1 } { prearg } + \semantex_data_tl_get_exp_not:nn { #1 } { arg } + \semantex_data_tl_get_exp_not:nn { #1 } { postarg } + } + #2 } { - \exp_not:V \l__semantex_leftreturn_upper_left_index_temp + \tl_set:Nn#2{} } + } + { + \semantex_data_bool_get:nnTF { #1 } { flexpar } { - \exp_not:V \l__semantex_leftreturn_postupperleft_temp + \semantex_data_int_if_greater_than_one:nnTF { #1 } { numberofarguments } + { + \__semantex_parentheses_store:nnnnN + { \l__semantex_primitive_valuekey_rightreturn_parsize_temp } + { \semantex_data_tl_get_exp_not:nn { #1 } { leftpar } } + { \semantex_data_tl_get_exp_not:nn { #1 } { rightpar } } + { + \semantex_data_tl_get_exp_not:nn { #1 } { prearg } + \semantex_data_tl_get_exp_not:nn { #1 } { arg } + \semantex_data_tl_get_exp_not:nn { #1 } { postarg } + } + #2 + } + { + \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments } + { + \__semantex_no_parentheses_store:nN + { + \semantex_data_tl_get_exp_not:nn { #1 } { prearg } + \semantex_data_tl_get_exp_not:nn { #1 } { arg } + \semantex_data_tl_get_exp_not:nn { #1 } { postarg } + } + #2 + } + { + \tl_set:Nn#2{} + } + } } { - \exp_not:V \l__semantex_leftreturn_prelowerleft_temp + \semantex_data_int_if_positive:nnTF { #1 } { numberofarguments } + { + \__semantex_no_parentheses_store:nN + { + \semantex_data_tl_get_exp_not:nn { #1 } { prearg } + \semantex_data_tl_get_exp_not:nn { #1 } { arg } + \semantex_data_tl_get_exp_not:nn { #1 } { postarg } + } + #2 + } + { + \tl_set:Nn#2{} + } } + } + \semantex_data_tl_clear:nn { #1 } { arg } + \semantex_data_tl_clear:nn { #1 } { prearg } % Is it right to clear these? + \semantex_data_tl_clear:nn { #1 } { postarg } + \semantex_data_int_clear:nn { #1 } { numberofarguments } + \semantex_data_bool_provide:nn { #1 } { nextargwithsep } % is it necessary to provide it before declaring it false? + \semantex_data_bool_set_false:nn { #1 } { nextargwithsep } +} + +\cs_new:Npn \semantex_right_indices_return_store:nN#1#2 +{ + \semantex_data_tl_inherit_x:nn { #1 } { upper } + \semantex_data_tl_inherit_x:nn { #1 } { lower } + \semantex_data_tl_inherit_x:nn { #1 } { preupper } + \semantex_data_tl_inherit_x:nn { #1 } { postupper } + \semantex_data_tl_inherit_x:nn { #1 } { prelower } + \semantex_data_tl_inherit_x:nn { #1 } { postlower } + \tl_set:Nn#2{} + \semantex_data_int_if_positive:nnTF { #1 } { numberofupperindices } + { + \tl_put_right:Nx#2 { - \exp_not:V \l__semantex_leftreturn_lower_left_index_temp + \sp{ + \semantex_data_tl_get_exp_not:nn { #1 } { preupper } + \semantex_data_tl_get_exp_not:nn { #1 } { upper } + \semantex_data_tl_get_exp_not:nn { #1 } { postupper } + } } + } + { + % do nothing + } + \semantex_data_int_if_positive:nnTF { #1 } { numberoflowerindices } + { + \tl_put_right:Nx#2 { - \exp_not:V \l__semantex_leftreturn_postlowerleft_temp + \sb{ + \semantex_data_tl_get_exp_not:nn { #1 } { prelower } + \semantex_data_tl_get_exp_not:nn { #1 } { lower } + \semantex_data_tl_get_exp_not:nn { #1 } { postlower } + } } - \exp_not:V \l__semantex_leftreturn_symbol_temp } - \g_semantex_data_tl_clear:nn { #1 } { upper_left_index } - \g_semantex_data_bool_provide:nn { #1 } { first_upper_left } - \g_semantex_data_bool_set_true:nn { #1 } { first_upper_left } - \g_semantex_data_tl_clear:nn { #1 } { lower_left_index } - \g_semantex_data_bool_provide:nn { #1 } { first_lower_left } - \g_semantex_data_bool_set_true:nn { #1 } { first_lower_left } - \g_semantex_data_tl_clear:nn { #1 } { preupperleft } - \g_semantex_data_tl_clear:nn { #1 } { postupperleft } - \g_semantex_data_tl_clear:nn { #1 } { prelowerleft } - \g_semantex_data_tl_clear:nn { #1 } { postlowerleft } + { + % do nothing + } + \semantex_data_tl_clear:nn { #1 } { upper } + \semantex_data_bool_provide:nn { #1 } { nextupperwithsep } % is it necessary to provide it before declaring it false? + \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep } + \semantex_data_tl_clear:nn { #1 } { lower } + \semantex_data_bool_provide:nn { #1 } { nextlowerwithsep } % is it necessary to provide it before declaring it false? + \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep } + \semantex_data_tl_clear:nn { #1 } { preupper } + \semantex_data_tl_clear:nn { #1 } { postupper } + \semantex_data_tl_clear:nn { #1 } { prelower } + \semantex_data_tl_clear:nn { #1 } { postlower } + \semantex_data_int_clear:nn { #1 } { numberofupperindices } + \semantex_data_int_clear:nn { #1 } { numberoflowerindices } } -\cs_new:Npn\g_semantex_primitive_valuekey_parent:nn#1#2{ + +\cs_new:Npn\semantex_primitive_valuekey_parent:nn#1#2{ % Must inherit everything from the parent class - %\tl_clear_new:c { semantex_data_tl_#1_parent } - %\g_semantex_data_tl_provide:nn { #1 } { parent } - %IM This should always be declared, so no need for if_provided checks - %IM This does not work, for unknown reasons: -% \seq_if_in:NxTF \semantex_all_objects_seq { #2 } -% { \tl_set:cn { semantex_data_tl_#1_parent } { #2 } } -% { \msg_error:nnnn { semantex } { parent_not_found } { #2 } { #1 } } - %IM control if exists! - %\tl_set:cn { semantex_data_tl_#1_parent } { #2 } - \g_semantex_data_tl_set:nnn { #1 } { parent } { #2 } + \semantex_data_parent_set:nn { #1 } { #2 } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_class:nn\g_semantex_primitive_valuekey_parent:nn +\cs_new:Npn\semantex_primitive_valuekey_class:nn#1#2{ + % Must inherit everything from the parent class + \semantex_data_class_set:nn { #1 } { #2 } +} +\cs_new:Npn\semantex_primitive_valuekey_copy:nn#1#2{ + % Similarly to parent and class, but inherits from other objects rather than classes + \semantex_data_copy_object:nn { #1 } { #2 } +} +\cs_new:Npn\semantex_primitive_valuekey_clone:nn#1#2{ + % Similarly to parent and class, but inherits from other objects rather than classes + \semantex_data_clone_object:nn { #1 } { #2 } +} -\cs_new:Npn\g_semantex_primitive_valuekey_copy:nn#1#2{ - % Must inherit everything from the parent class - \g_semantex_primitive_valuekey_parent:nn{#1}{ \cs_to_str:N #2 } +\cs_new:Npn\semantex_primitive_valuekey_valuekeys:nn#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_valuekey_equality_format_auxiliary:nnn{#1}##1 + } } -\cs_new:Npn\g_semantex_primitive_valuekey_valuekeys:nn#1#2{ - % Add new valuekeys via the interface - % valuekeys={ - % {key1}{do something with \l_semantex_key_value_temp}, - % {key2}{g=\l_semantex_key_value_temp,i=\l_semantex_key_value_temp}, - % } - \g_semantex_data_prop_provide:nn { #1 } { custom_valuekeys } +\cs_generate_variant:Nn\semantex_data_prop_put:nnnn {nnno} + +\cs_new:Npn\__semantex_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_valuekey_equality_format_auxiliary_temp:n##1{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_valuekey_equality_format_auxiliary_temp:n + { + \l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:Npn\semantex_primitive_valuekey_removevaluekey:nn#1#2 +{ + \semantex_valuekey_remove:nn { #1 } { #2 } +} + +\cs_set_eq:cN { semantex_primitive_valuekey_1valuekeys:nn } \semantex_primitive_valuekey_valuekeys:nn + +\cs_new:cpn { semantex_primitive_valuekey_2valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } \clist_map_inline:nn { #2 }{ - \g_semantex_valuekey_equality_format:nnn{#1}##1 + \__semantex_two_valuekey_equality_format_auxiliary:nnn{#1}##1 } } -\cs_generate_variant:Nn\g_semantex_data_prop_put:nnnn {nnno} +\cs_new:Npn\__semantex_two_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_two_valuekey_equality_format_auxiliary_temp:nn##1##2{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_two_valuekey_equality_format_auxiliary_temp:nn + { + \exp_not:N\semantex_grab_first_argument_of_two:nn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_two:nn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 +} -\cs_new:Npn \g_semantex_valuekey_equality_format:nnn#1#2#3 +\cs_new:cpn { semantex_primitive_valuekey_3valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_three_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_three_valuekey_equality_format_auxiliary:nnn#1#2#3 { - \cs_set:Npn\l__semantex_valuekey_equality_format_temp:n##1{#3} - \g_semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} {\l__semantex_valuekey_equality_format_temp:n{\l_semantex_key_value_temp}} + \cs_set:Npn\l__semantex_three_valuekey_equality_format_auxiliary_temp:nnn##1##2##3{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_three_valuekey_equality_format_auxiliary_temp:nnn + { + \exp_not:N\semantex_grab_first_argument_of_three:nnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_three:nnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_three:nnn\l__semantex_key_value_temp + } + } %IM Remove spaces in #2 } -\cs_new:Npn\g_semantex_primitive_valuekey_novaluekeys:nn#1#2{ - % Add sinple keys, taking no values, via the - % interface - % novaluekeys={ - % {key1}{print something}, - % {key2}{d=42,i=42}, - % } - \g_semantex_data_prop_provide:nn { #1 } { custom_novaluekeys } +\cs_new:cpn { semantex_primitive_valuekey_4valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } \clist_map_inline:nn { #2 }{ - \g_semantex_valuekey_noequality_format:nnn{#1}##1 + \__semantex_four_valuekey_equality_format_auxiliary:nnn{#1}##1 } } -\cs_new:Npn \g_semantex_valuekey_noequality_format:nnn#1#2#3{ - %\prop_put:cnn { semantex_data_prop_#1_custom_novaluekeys }{#2}{#3} - \g_semantex_data_prop_put:nnnn {#1} {custom_novaluekeys} {#2} {#3} +\cs_new:Npn\__semantex_four_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_four_valuekey_equality_format_auxiliary_temp:nnnn##1##2##3##4{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_four_valuekey_equality_format_auxiliary_temp:nnnn + { + \exp_not:N\semantex_grab_first_argument_of_four:nnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_four:nnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_four:nnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_four:nnnn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 } -\cs_new:Npn\g_semantex_primitive_valuekey_argvaluekeys:nn#1#2{ - % Add new valuekeys via the interface - % valuekeys={ - % {key1}{do something with \l_semantex_key_value_temp}, - % {key2}{g=\l_semantex_key_value_temp,i=\l_semantex_key_value_temp}, - % } - \g_semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } +\cs_new:cpn { semantex_primitive_valuekey_5valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } \clist_map_inline:nn { #2 }{ - \g_semantex_arg_valuekey_equality_format:nnn{#1}##1 + \__semantex_five_valuekey_equality_format_auxiliary:nnn{#1}##1 } } -\cs_new:Npn \g_semantex_arg_valuekey_equality_format:nnn#1#2#3{ - %\prop_put:cnn { semantex_data_prop_#1_custom_arg_valuekeys }{#2}{#3} - \cs_set:Npn\l__semantex_arg_valuekey_equality_format_temp:n##1{#3} - \g_semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} {\l__semantex_arg_valuekey_equality_format_temp:n{\l_semantex_arg_key_value_temp}} +\cs_new:Npn\__semantex_five_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_five_valuekey_equality_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_five_valuekey_equality_format_auxiliary_temp:nnnnn + { + \exp_not:N\semantex_grab_first_argument_of_five:nnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_five:nnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_five:nnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_five:nnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_five:nnnnn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 } -\cs_new:Npn\g_semantex_primitive_valuekey_argnovaluekeys:nn#1#2{ - % Add sinple keys, taking no values, via the - % interface - % novaluekeys={ - % {key1}{print something}, - % {key2}{g=42,i=42}, - % } - \g_semantex_data_prop_provide:nn { #1 } { custom_arg_novaluekeys } +\cs_new:cpn { semantex_primitive_valuekey_6valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } \clist_map_inline:nn { #2 }{ - \g_semantex_arg_valuekey_noequality_format:nnn{#1}##1 + \__semantex_six_valuekey_equality_format_auxiliary:nnn{#1}##1 } } -\cs_new:Npn \g_semantex_arg_valuekey_noequality_format:nnn#1#2#3{ - \g_semantex_data_prop_put:nnnn {#1} {custom_arg_novaluekeys} {#2} {#3} +\cs_new:Npn\__semantex_six_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_six_valuekey_equality_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_six_valuekey_equality_format_auxiliary_temp:nnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_six:nnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_six:nnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_six:nnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_six:nnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_six:nnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_six:nnnnnn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 } -\cs_new:Npn\g_semantex_primitive_valuekey_symbol:nn#1#2{ - % Sets the value of the symbol - \g_semantex_data_tl_set:nnn { #1 } { symbol } { \exp_not:n { #2 } } +\cs_new:cpn { semantex_primitive_valuekey_7valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_seven_valuekey_equality_format_auxiliary:nnn{#1}##1 + } } -\cs_new:Npn\g_semantex_primitive_valuekey_texclass:nn#1#2{ - % Sets the value of the symbol - \g_semantex_data_tl_set:nnn { #1 } { texclass } { \exp_not:n { #2 } } +\cs_new:Npn\__semantex_seven_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_seven_valuekey_equality_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_seven_valuekey_equality_format_auxiliary_temp:nnnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_seventh_argument_of_seven:nnnnnnn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_8valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_eight_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_eight_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_eight_valuekey_equality_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_eight_valuekey_equality_format_auxiliary_temp:nnnnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_seventh_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_eighth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_9valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_nine_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_nine_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_nine_valuekey_equality_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3} + \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2} + { + \l__semantex_nine_valuekey_equality_format_auxiliary_temp:nnnnnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_seventh_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_eighth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + { + \exp_not:N\semantex_grab_ninth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:Npn\semantex_primitive_valuekey_singlekeys:nn#1#2{ + % Add keys taking no values + \semantex_data_prop_provide:nn { #1 } { custom_singlekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_singlekeys_noequality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn \__semantex_singlekeys_noequality_format_auxiliary:nnn#1#2#3{ + \semantex_data_prop_put:nnnn {#1} {custom_singlekeys} {#2} {#3} +} + +\cs_set_eq:NN\semantex_primitive_valuekey_novaluekeys:nn\semantex_primitive_valuekey_singlekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility + +\cs_set_eq:cN { semantex_primitive_valuekey_0valuekeys:nn } \semantex_primitive_valuekey_singlekeys:nn + +\cs_new:Npn\semantex_primitive_valuekey_removesinglekey:nn#1#2 +{ + \semantex_singlekey_remove:nn { #1 } { #2 } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_removenovaluekey:nn\semantex_primitive_valuekey_removesinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility + +\cs_set_eq:cN { semantex_primitive_valuekey_remove0valuekey:nn } \semantex_primitive_valuekey_removesinglekey:nn + +% KEYS FOR SETTING UP THE ARGUMENT KEYVAL INTERFACE: + +\cs_new:Npn\semantex_primitive_valuekey_argvaluekeys:nn#1#2{ + % Add argument valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn \__semantex_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_arg_valuekey_equality_format_auxiliary_temp:n##1{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_arg_valuekey_equality_format_auxiliary_temp:n{ + \l__semantex_arg_key_value_temp + } + } +} + +\cs_new:Npn\semantex_primitive_valuekey_removeargvaluekey:nn#1#2 +{ + \semantex_arg_valuekey_remove:nn { #1 } { #2 } +} + +\cs_set_eq:cN { semantex_primitive_valuekey_arg1valuekeys:nn } \semantex_primitive_arg_valuekey_arg_valuekeys:nn + +\cs_new:cpn { semantex_primitive_valuekey_arg2valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_two_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_two_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_two_arg_valuekey_equality_format_auxiliary_temp:nn##1##2{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_two_arg_valuekey_equality_format_auxiliary_temp:nn + { + \exp_not:N\semantex_grab_first_argument_of_two:nn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_two:nn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg3valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_three_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_three_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_three_arg_valuekey_equality_format_auxiliary_temp:nnn##1##2##3{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_three_arg_valuekey_equality_format_auxiliary_temp:nnn + { + \exp_not:N\semantex_grab_first_argument_of_three:nnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_three:nnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_three:nnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg4valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_four_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_four_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_four_arg_valuekey_equality_format_auxiliary_temp:nnnn##1##2##3##4{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_four_arg_valuekey_equality_format_auxiliary_temp:nnnn + { + \exp_not:N\semantex_grab_first_argument_of_four:nnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_four:nnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_four:nnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_four:nnnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg5valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_five_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_five_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_five_arg_valuekey_equality_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_five_arg_valuekey_equality_format_auxiliary_temp:nnnnn + { + \exp_not:N\semantex_grab_first_argument_of_five:nnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_five:nnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_five:nnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_five:nnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_five:nnnnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg6valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_six_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_six_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_six_arg_valuekey_equality_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_six_arg_valuekey_equality_format_auxiliary_temp:nnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg7valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_seven_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_seven_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_seven_arg_valuekey_equality_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_seven_arg_valuekey_equality_format_auxiliary_temp:nnnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_seventh_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg8valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_eight_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn\__semantex_eight_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_eight_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_eight_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_seventh_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_eighth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:cpn { semantex_primitive_valuekey_arg9valuekeys:nn }#1#2{ + % Add new valuekeys + \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_nine_arg_valuekey_equality_format_auxiliary:nnn{#1}##1 + } } -\cs_new:Npn\g_semantex_primitive_valuekey_slot:nn#1#2{ +\cs_new:Npn\__semantex_nine_arg_valuekey_equality_format_auxiliary:nnn#1#2#3 +{ + \cs_set:Npn\l__semantex_nine_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3} + \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2} + { + \l__semantex_nine_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnnn + { + \exp_not:N\semantex_grab_first_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_second_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_third_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fourth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_fifth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_sixth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_seventh_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_eighth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + { + \exp_not:N\semantex_grab_ninth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp + } + } + %IM Remove spaces in #2 +} + +\cs_new:Npn\semantex_primitive_valuekey_argsinglekeys:nn#1#2{ + % Add argument keys taking no values + \semantex_data_prop_provide:nn { #1 } { custom_arg_singlekeys } + \clist_map_inline:nn { #2 }{ + \__semantex_arg_singlekeys_noequality_format_auxiliary:nnn{#1}##1 + } +} + +\cs_new:Npn \__semantex_arg_singlekeys_noequality_format_auxiliary:nnn#1#2#3{ + \semantex_data_prop_put:nnnn {#1} {custom_arg_singlekeys} {#2} {#3} +} + +\cs_set_eq:NN\semantex_primitive_valuekey_argnovaluekeys:nn\semantex_primitive_valuekey_argsinglekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility + +\cs_new:Npn\semantex_primitive_valuekey_removeargsinglekey:nn#1#2 +{ + \semantex_arg_singlekey_remove:nn { #1 } { #2 } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_removeargnovaluekey:nn\semantex_primitive_valuekey_removeargsinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility + +\cs_set_eq:cN { semantex_primitive_valuekey_removearg0valuekey:nn } \semantex_primitive_valuekey_removeargsinglekey:nn + +% THESE ARE REALLY THE COMMANDS MANIPULATING DATA: + +\cs_new:Npn\semantex_primitive_valuekey_symbol:nn#1#2{ % Sets the value of the symbol - \g_semantex_data_tl_set:nnn { #1 } { slot } { \exp_not:n { #2 } } + \semantex_data_tl_set:nnn { #1 } { symbol } { \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_texclass:nn#1#2{ + % Sets the TeX class of the output, e.g. \mathord, \mathbin, \mathop etc. + \semantex_data_tl_set:nnn { #1 } { texclass } { \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_setslot:nn#1#2{ + % Sets the argument slot, i.e. the - in f(-,x) + \semantex_data_tl_set:nnn { #1 } { argslot } { \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_symbolputright:nn#1#2{ - \g_semantex_data_tl_put_right:nnn { #1 } { symbol } { \exp_not:n { #2 } } +\cs_new:Npn\semantex_primitive_valuekey_symbolputright:nn#1#2{ + % Add something to the right of the symbol + \semantex_data_tl_put_right:nnn { #1 } { symbol } { \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_symbolputleft:nn#1#2{ - \g_semantex_data_tl_put_left:nnn { #1 } { symbol } { \exp_not:n { #2 } } +\cs_new:Npn\semantex_primitive_valuekey_symbolputleft:nn#1#2{ + % Add something to the left of the symbol + \semantex_data_tl_put_left:nnn { #1 } { symbol } { \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_command:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_command:nn#1#2{ % Adds one entry on the left of the command % sequence to be applied to the symbol - \g_semantex_data_seq_put_right:nnn { #1 } { commands_sequence } { #2 } %IM maybe \exp_not:n { #2 }? + \semantex_data_seq_put_right:nnn { #1 } { commands_sequence } { #2 } %IM maybe \exp_not:n { #2 }? } -\cs_new:Npn\g_semantex_primitive_valuekey_argwithkeyval:nn#1#2{ - % Sets the argument (printed in parentheses - % after the symbol) - \g_semantex_arg_keys_set:nn { #1 } {{{ #2 }}} - %IM for unknown reasons, one needs these extra braces. - %IM This should be moved to the arg valuekeys themselves - %IM where ifoutput=true is also declared +\cs_new:Npn\semantex_primitive_valuekey_clearcommand:nn#1#2{ + % Adds one entry on the left of the command + % sequence to be applied to the symbol + \semantex_data_seq_clear:nn { #1 } { commands_sequence } } -\cs_new:Npn\g_semantex_primitive_valuekey_argwithnovaluekeys:nn#1#2{ - % Sets the argument (printed in parentheses - % after the symbol) - \g_semantex_arg_novaluekeys_set:nn { #1 } { #2 } +\cs_new:Npn\semantex_primitive_valuekey_argwithkeyval:nn#1#2{ + % Sets the argument (allows keyval interface) + \semantex_arg_keys_set:nn { #1 } { #2 } + %IMPORTANT: Previously, we needed three braces around #2, but suddenly + % this changed, even though I did not really change anything related + % to this (except I added _auxiliary_ in the command names related + % to arg keyvals) } -\cs_new:Npn\g_semantex_primitive_valuekey_argwithonenovaluekey:nn#1#2{ - % Sets the argument (printed in parentheses - % after the symbol) - \use:c { g_semantex_data_cs_#1_arg_novaluekey:n } {{{{ #2 }}}} +\cs_new:Npn\semantex_primitive_valuekey_argwithsinglekeys:nn#1#2{ + % Sets the argument (only allows singlekeys) + \semantex_arg_singlekeys_set:nn { #1 } { #2 } } -\cs_new:Npn\g_semantex_primitive_valuekey_argwithoutkeyval:nn#1#2{ - \g_semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } } - \g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn{#1}{true} +\cs_new:Npn\semantex_primitive_valuekey_argwithonesinglekey:nn#1#2{ + % Sets the argument (only allows one singlekey) + \use:c { __semantex_data_cs_#1_arg_singlekey:n } {{{{ #2 }}}} } +\cs_new:Npn\semantex_primitive_valuekey_argwithoutkeyval:nn#1#2{ + % Sets the argument (no keyval interface allowed) + \semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } } + \semantex_data_int_incr:nn { #1 } { numberofarguments } % Check if this has been added elsewhere + \semantex_data_bool_set_true:nn { #1 } { nextargwithsep } +} -%\cs_new:Npn\g_semantex_primitive_valuekey_useargwithkeyval:nn#1#2 -%{ -%% \g_semantex_primitive_valuekey_valuekeys:nn { #1 } -%% { -%% {arg} { argwithkeyval={ \l_semantex_key_value_temp } }, -%% } -% \g_semantex_keys_set:nn { #1 }{ -% \exp_not:n{valuekeys={ -% {arg}{ argwithkeyval={\l_semantex_key_value_temp} }, -% },} -% } -%} +\cs_new:Npn\semantex_primitive_valuekey_setargsep:nn#1#2 +{ + % Sets the argument separator + \semantex_data_tl_set:nnn { #1 } { argsep } { \exp_not:n { #2 } } +} -\cs_new:Npn\g_semantex_primitive_valuekey_argsep:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_setargdots:nn#1#2 { - %\g_semantex_data_tl_provide:nn { #1 } { argsep } - \g_semantex_data_tl_set:nnn { #1 } { argsep } { \exp_not:n { #2 } } + % Sets the argument dot command + \semantex_data_tl_set:nnn { #1 } { argdots } { \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_argdots:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_setargslot:nn#1#2 { -% \g_semantex_data_tl_provide:nn { #1 } { argdots } - \g_semantex_data_tl_set:nnn { #1 } { argdots } { \exp_not:n { #2 } } + % Sets the argument dot command + \semantex_data_tl_set:nnn { #1 } { argslot } { \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_prearg:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_prearg:nn#1#2{ + % Sets something to write before the argument \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:nnn { #1 } { prearg } { \exp_not:n { #2 } } + \semantex_data_tl_put_left:nnn { #1 } { prearg } { \exp_not:n { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_postarg:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_clearprearg:nn#1#2 +{ + \semantex_data_tl_clear:nn { #1 } { prearg } +} + +\cs_new:Npn\semantex_primitive_valuekey_postarg:nn#1#2{ + % Sets something to write after the argument \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_right:nnn { #1 } { postarg } { \exp_not:n{ #2 } } + \semantex_data_tl_put_right:nnn { #1 } { postarg } { \exp_not:n{ #2 } } } } +\cs_new:Npn\semantex_primitive_valuekey_clearpostarg:nn#1#2 +{ + \semantex_data_tl_clear:nn { #1 } { postarg } +} -\cs_new:Npn\g_semantex_primitive_valuekey_output:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_output:nn#1#2 { - \g_semantex_data_tl_set:nnn { #1 } { output } { #2 } + % Tells what class the object is supposed to output + \semantex_class_if_exist:NTF { #2 } + { + \semantex_data_tl_set:nnx { #1 } { output } { class_\cs_to_str:N #2 } + } + { + \semantex_error_output_format:nN { #1 } \__semantex_primitive_valuekey_output_temp + \msg_error:nnxnn { semantex } { class_not_found } { \__semantex_primitive_valuekey_output_temp } { output } { #2 } + } % Maybe allow output=self } -\cs_new:Npn\g_semantex_primitive_valuekey_outputoptions:nn#1#2{ - \g_semantex_data_tl_put_right:nnn { #1 } { output_options } { #2, } +\cs_new:Npn\semantex_primitive_valuekey_outputoptions:nn#1#2{ + % Sets possible options to pass to the output class + \semantex_data_tl_put_right:nnn { #1 } { outputoptions } { ,#2, } } -\cs_new:Npn\g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn#1#2{ - % tells whether to use the output class or not +\cs_new:Npn\semantex_primitive_valuekey_ifleftargument:nn#1#2{ + % Tells whether to rightreturn before rendering the output. \str_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_true:nn { #1 } { rightreturnbeforerender } + \semantex_data_bool_set_true:nn { #1 } { leftargument } } { \str_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_false:nn { #1 } { rightreturnbeforerender } + \semantex_data_bool_set_false:nn { #1 } { leftargument } } { - %IM do nothing right now, but should - %IM probably throw an error + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifleftargumen_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifleftargumen_temp } { ifleftargument } { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_ifoutput:nn#1#2{ %IMPLEMENT THIS - % tells whether to output or not +\cs_new:Npn\semantex_primitive_valuekey_ifoutput:nn#1#2{ %IMPLEMENT THIS + % Tells whether to output or not \str_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_true:nn { #1 } { output } + \semantex_data_bool_set_true:nn { #1 } { output } } { \str_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_false:nn { #1 } { output } + \semantex_data_bool_set_false:nn { #1 } { output } } { - %IM do nothing right now, but should - %IM probably throw an error + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifoutput_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifoutput_temp } { ifoutput } { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_gradingpos:nn#1#2{ - % tells whether to use upper or lower indices - \g_semantex_data_bool_provide:nn { #1 } { upper_grading } - \str_case:nnTF { #2 } +\cs_new:Npn\semantex_primitive_valuekey_gradingposition:nn#1#2{ + % Tells whether to use upper or lower indices + \semantex_data_bool_provide:nn { #1 } { uppergrading } + \str_if_eq:nnTF { #2 } { upper } { - { upper } + \semantex_data_bool_set_true:nn { #1 } { uppergrading } + } + { + \str_if_eq:nnTF { #2 } { lower } { - \g_semantex_data_bool_set_true:nn { #1 } { upper_grading } + \semantex_data_bool_set_false:nn { #1 } { uppergrading } } - { lower } { - \g_semantex_data_bool_set_false:nn { #1 } { upper_grading } + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_gradingposition_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_gradingposition_temp } { gradingposition } { #2 } } } - { - % do nohting - } - { - % do nothing at the moment, but should probably throw an error - } } -\cs_set_eq:NN \g_semantex_primitive_valuekey_gradingposition:nn \g_semantex_primitive_valuekey_gradingpos:nn +\cs_set_eq:NN \semantex_primitive_valuekey_gradingpos:nn \semantex_primitive_valuekey_gradingposition:nn % Upper and lower right indices: -\cs_new:Npn\g_semantex_primitive_valuekey_upper:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_upper:nn#1#2{ % adds to the upper index \tl_if_blank:nF{#2}{ - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n{ #2 } } - % For a long time, when using x type expansions when checking - % if indices were empty, two \exp_not:n's were necessary here. - % Thankfully, I can now happily remove them again, it seems. - %\g_semantex_data_bool_provide:nn { #1 } { first_upper } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper } + \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n{ #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_supper:nn#1#2{ - % adds to the upper index, with a separator +\cs_new:Npn\semantex_primitive_valuekey_supper:nn#1#2{ + % Adds to the upper index, with a separator \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_upper } + \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnx { #1 } { upper } + { \exp_not:n { \semantex_data_tl_get:nn { #1 } { uppersep } } } + \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { #2 } } } { - \g_semantex_data_tl_put_right:nnx { #1 } { upper_index } - { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { uppersep } } } - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper } + \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_upperaddleft:nn#1#2{ - % adds to the upper index +\cs_new:Npn\semantex_primitive_valuekey_upperputleft:nn#1#2{ + % Adds to the left of the upper index \tl_if_blank:nF{#2}{ - \g_semantex_data_tl_put_left:nnn { #1 } { upper_index } { \exp_not:n{ #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper } + \semantex_data_tl_put_left:nnn { #1 } { upper } { \exp_not:n{ #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_preupper:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_preupper:nn#1#2{ + % Sets what to write before upper \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:cn { #1 } { preupper } { \exp_not:n{ #2 } } + \semantex_data_tl_put_left:cn { #1 } { preupper } { \exp_not:n{ #2 } } } } - -\cs_new:Npn\g_semantex_primitive_valuekey_postupper:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_postupper:nn#1#2{ + % Sets what to write after upper \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_right:nnn { #1 } { postupper } { \exp_not:n{ #2 } } + \semantex_data_tl_put_right:nnn { #1 } { postupper } { \exp_not:n{ #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_lower:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_clearupper:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { upper } + \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep } + \semantex_data_int_clear:nn { #1 } { numberofupperindices } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearpreupper:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { preupper } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearpostupper:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { postupper } +} + +\cs_new:Npn\semantex_primitive_valuekey_setupperdots:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n { #2 } } +} + +\cs_generate_variant:Nn\semantex_primitive_valuekey_upper:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_upperdots:nn#1#2 +{ + \semantex_primitive_valuekey_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_setupperslot:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { upperslot } { \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_upperslot:nn#1#2 +{ + \semantex_primitive_valuekey_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_supper:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_supperdots:nn#1#2 +{ + \semantex_primitive_valuekey_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_supperslot:nn#1#2 +{ + \semantex_primitive_valuekey_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_cupper:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_cupperdots:nn#1#2 +{ + \semantex_primitive_valuekey_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_cupperslot:nn#1#2 +{ + \semantex_primitive_valuekey_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_upperwithothersep:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_upperdotswithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperdots } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_upperslotwithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperslot } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_lower:nn#1#2{ + % Adds to the lower index \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower } + \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_slower:nn#1#2{ - % adds to the lower index, with a separator +\cs_new:Npn\semantex_primitive_valuekey_slower:nn#1#2{ + % Adds to the lower index, with a separator \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_lower } + \semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnx { #1 } { lower } + { \exp_not:n { \semantex_data_tl_get:nn { #1 } { lowersep } } } + \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } } } { - \g_semantex_data_tl_put_right:nnx { #1 } { lower_index } - { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { lowersep } } } - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower } + \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_loweraddleft:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_lowerputleft:nn#1#2{ + % Adds to the lower index \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_index } { \exp_not:n { #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower } + \semantex_data_tl_put_left:nnn { #1 } { lower } { \exp_not:n { #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_prelower:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_prelower:nn#1#2{ + % Sets what to write before the lower index \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:nnn { #1 } { prelower } { \exp_not:n { #2 } } + \semantex_data_tl_put_left:nnn { #1 } { prelower } { \exp_not:n { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_postlower:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_postlower:nn#1#2{ + % Sets what to write after the lower index \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_right:nnn { #1 } { postlower } { \exp_not:n{ #2 } } + \semantex_data_tl_put_right:nnn { #1 } { postlower } { \exp_not:n{ #2 } } } } -\cs_generate_variant:Nn \tl_if_blank:nTF { vTF } +\cs_new:Npn\semantex_primitive_valuekey_clearlower:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { lower } + \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep } + \semantex_data_int_clear:nn { #1 } { numberoflowerindices } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearprelower:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { prelower } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearpostlower:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { postlower } +} + +\cs_new:Npn\semantex_primitive_valuekey_setlowerdots:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_lower:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_lowerdots:nn#1#2 +{ + \semantex_primitive_valuekey_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_setlowerslot:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { lowerslot } { \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_lowerslot:nn#1#2 +{ + \semantex_primitive_valuekey_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_slower:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_slowerdots:nn#1#2 +{ + \semantex_primitive_valuekey_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_slowerslot:nn#1#2 +{ + \semantex_primitive_valuekey_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_clower:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_clowerdots:nn#1#2 +{ + \semantex_primitive_valuekey_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } } +} -\cs_new:Npn \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn#1#2 { #1 } +\cs_new:Npn\semantex_primitive_valuekey_clowerslot:nn#1#2 +{ + \semantex_primitive_valuekey_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } } +} -\cs_new:Npn \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn#1#2 { #2 } +\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerwithothersep:nn { nx } -\cs_new:Npn\g_semantex_primitive_valuekey_uppersep:nn#1#2{ - % uppersep={separator}{contents} adds contents to the upper index +\cs_new:Npn\semantex_primitive_valuekey_lowerdotswithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerdots } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_lowerslotwithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerslot } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_upperwithothersep:nn#1#2{ + % upperwithsep={separator}{contents} adds contents to the upper index % with the appropriate index separator - \g_semantex_data_bool_inherit:nn { #1 } { first_upper } - \g_semantex_data_bool_get:nnTF { #1 } { first_upper } + \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { + \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { - \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 + \semantex_grab_first_argument_of_two:nn #2 + \semantex_grab_second_argument_of_two:nn #2 } } } { - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { + \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { - \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 - \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 + \semantex_grab_second_argument_of_two:nn #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper } + \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperindices } } -\cs_new:Npn\g_semantex_primitive_valuekey_lowersep:nn#1#2{ - % lowersep={separator}{contents} adds contents to the lower index +\cs_new:Npn\semantex_primitive_valuekey_lowerwithothersep:nn#1#2{ + % lowerwithsep={separator}{contents} adds contents to the lower index % with the appropriate index separator - \g_semantex_data_bool_get:nnTF { #1 } { first_lower } + \semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { + \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { - \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 + \semantex_grab_first_argument_of_two:nn #2 + \semantex_grab_second_argument_of_two:nn #2 } } } { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { - \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 + \semantex_data_tl_put_right:nnn { #1 } { lower } { + \exp_not:n { + \semantex_grab_second_argument_of_two:nn #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower } + \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperindices } } -\cs_new:Npn\g_semantex_primitive_valuekey_cupper:nn#1#2{ - % adds to the upper index, with a comma as separator +\cs_new:Npn\semantex_primitive_valuekey_cupper:nn#1#2{ + % Adds to the upper index, with a comma as separator \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_upper } + \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnn { #1 } { upper } { , \exp_not:n { #2 } } } { - \g_semantex_data_tl_put_right:nnn { #1 } { upper_index } { , \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper } + \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_clower:nn#1#2{ - % adds to the lower index, with a comma as separator +\cs_new:Npn\semantex_primitive_valuekey_clower:nn#1#2{ + % Adds to the lower index, with a comma as separator \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_lower } + \semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnn { #1 } { lower } { , \exp_not:n { #2 } } } { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_index } { , \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnn { #1 } { lower } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower } + \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_iffirstupper:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_ifnextupperwithsep:nn#1#2 { - \tl_if_eq:nnTF { #2 } { true } + % Tells whether the upper index is the first one + \tl_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_true:nn { #1 } { first_upper } + \semantex_data_bool_set_false:nn { #1 } { nextupperwithsep } } { - \tl_if_eq:nnTF { #2 } { false } + \tl_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_false:nn { #1 } { first_upper } + \semantex_data_bool_set_true:nn { #1 } { nextupperwithsep } } { - %IM Throw error later + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextupperwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextupperwithsep_temp } { ifnextupperwithsep } { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_iffirstlower:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_ifnextlowerwithsep:nn#1#2 % should be removed later { - \tl_if_eq:nnTF { #2 } { true } + % Tells whether the lower index is the first one + \tl_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_true:nn { #1 } { first_lower } + \semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep } } { - \tl_if_eq:nnTF { #2 } { false } + \tl_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_false:nn { #1 } { first_lower } + \semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep } } { - %IM Throw error later + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextlowerwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextlowerwithsep_temp } { ifnextlowerwithsep } { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_setuppersep:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_setuppersep:nn#1#2 { - \g_semantex_data_tl_set:nnn { #1 } { uppersep } { \exp_not:n { #2 }} + % Sets the separator for the upper index + \semantex_data_tl_set:nnn { #1 } { uppersep } { \exp_not:n { #2 }} } -\cs_new:Npn\g_semantex_primitive_valuekey_setlowersep:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_setlowersep:nn#1#2 { - \g_semantex_data_tl_set:nnn { #1 } { lowersep } { \exp_not:n { #2 }} + % Sets the separator for the lower index + \semantex_data_tl_set:nnn { #1 } { lowersep } { \exp_not:n { #2 }} } -%--------------- Left indices: +%--------------- Left indices: (I don't repeat all of the documentation) -\cs_new:Npn\g_semantex_primitive_valuekey_upperleft:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_upperleft:nn#1#2{ % adds to the upper left index \tl_if_blank:nF{#2}{ - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n{ #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n{ #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperleftindices } } } - - -\cs_new:Npn\g_semantex_primitive_valuekey_supperleft:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_supperleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_upper_left } + \semantex_data_bool_get:nnTF { #1 } { nextupperwithsep } { - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_left:nnx { #1 } { upperleft } + { \exp_not:n { \semantex_data_tl_get:nn { #1 } { uppersep } } } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } } } { - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } } - \g_semantex_data_tl_put_left:nnx { #1 } { upper_left_index } - { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { uppersep } } } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left } + \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperleftindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_upperleftaddright:nn#1#2{ - % adds to the upper index +\cs_new:Npn\semantex_primitive_valuekey_upperleftputright:nn#1#2{ \tl_if_blank:nF{#2}{ - \g_semantex_data_tl_put_right:nnn { #1 } { upper_left_index } { \exp_not:n{ #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left } + \semantex_data_tl_put_right:nnn { #1 } { upperleft } { \exp_not:n{ #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperleftindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_preupperleft:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_preupperleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:nnn { #1 } { preupperleft } { \exp_not:n{ #2 } } + \semantex_data_tl_put_left:nnn { #1 } { preupperleft } { \exp_not:n{ #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_postupperleft:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_postupperleft:nn#1#2{ % adds to the lower index \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_right:nnn { #1 } { postupperleft } { \exp_not:n{ #2 } } + \semantex_data_tl_put_right:nnn { #1 } { postupperleft } { \exp_not:n{ #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_lowerleft:nn#1#2{ - % adds to the lower left index +\cs_new:Npn\semantex_primitive_valuekey_clearupperleft:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { upperleft } + \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep } + \semantex_data_int_clear:nn { #1 } { numberofupperleftindices } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearpreupperleft:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { preupperleft } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearpostupperleft:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { preupperleft } +} + +\cs_new:Npn\semantex_primitive_valuekey_setupperleftdots:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { upperleftdots } { \exp_not:n { #2 } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_upperleft:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_upperleftdots:nn#1#2 +{ + \semantex_primitive_valuekey_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_setupperleftslot:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { upperleftslot } { \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_upperleftslot:nn#1#2 +{ + \semantex_primitive_valuekey_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_supperleft:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_supperleftdots:nn#1#2 +{ + \semantex_primitive_valuekey_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_supperleftslot:nn#1#2 +{ + \semantex_primitive_valuekey_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_cupperleft:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_cupperleftdots:nn#1#2 +{ + \semantex_primitive_valuekey_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_cupperleftslot:nn#1#2 +{ + \semantex_primitive_valuekey_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_upperleftwithothersep:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_upperleftdotswithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_upperleftslotwithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_lowerleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n{ #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n{ #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_slowerleft:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_slowerleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_lower_left } + \semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep } { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_left:nnx { #1 } { lowerleft } + { \exp_not:n { \semantex_data_tl_get:nn { #1 } { lowerleftsep } } } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } } } { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } } - \g_semantex_data_tl_put_left:nnx { #1 } { lower_left_index } - { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { lowerleftsep } } } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left } + \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_lowerleftaddright:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_lowerleftputright:nn#1#2{ \tl_if_blank:nF{#2} %This test really shouldn’t be made. { - \g_semantex_data_tl_put_right:nnn { #1 } { lower_left_index } { \exp_not:n{ #2 } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left } + \semantex_data_tl_put_right:nnn { #1 } { lowerleft } { \exp_not:n{ #2 } } + \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_prelowerleft:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_prelowerleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_left:nnn { #1 } { prelowerleft } { \exp_not:n{ #2 } } + \semantex_data_tl_put_left:nnn { #1 } { prelowerleft } { \exp_not:n{ #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_postlowerleft:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_postlowerleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_tl_put_right:nnn { #1 } { postlowerleft } { \exp_not:n{ #2 } } + \semantex_data_tl_put_right:nnn { #1 } { postlowerleft } { \exp_not:n{ #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_upperleftsep:nn#1#2{ - % adds to the upper index - \g_semantex_data_bool_get:nnTF { #1 } { first_left_upper } +\cs_new:Npn\semantex_primitive_valuekey_upperleftwithothersep:nn#1#2{ + \semantex_data_bool_get:nnTF { #1 } { nextupperleftwithsep } { - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { - \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { + \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 \semantex_grab_first_argument_of_two:nn #2 } } } { - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { - \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { + \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_left_upper } + \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperleftindices } } -\cs_new:Npn\g_semantex_primitive_valuekey_lowerleftsep:nn#1#2{ - % adds to the lower index - \g_semantex_data_bool_get:nnTF { #1 } { first_lower_left } +\cs_new:Npn\semantex_primitive_valuekey_lowerleftwithothersep:nn#1#2{ + \semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep } { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { - \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { + \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 \semantex_grab_first_argument_of_two:nn #2 } } } { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { - \exp_not:n { \g_semantex_primitive_upper_lower_auxiliary_second_arg:nn #2 \g_semantex_primitive_upper_lower_auxiliary_first_arg:nn #2 } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { + \exp_not:n { \semantex_grab_second_argument_of_two:nn #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left } + \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices } } -\cs_new:Npn\g_semantex_primitive_valuekey_cupperleft:nn#1#2{ - % adds to the upper index +\cs_new:Npn\semantex_primitive_valuekey_clearlowerleft:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { lowerleft } + \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep } + \semantex_data_int_clear:nn { #1 } { numberoflowerleftindices } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearprelowerleft:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { prelowerleft } +} + +\cs_new:Npn\semantex_primitive_valuekey_clearpostlowerleft:nn#1#2{ + \semantex_data_tl_clear:nn { #1 } { prelowerleft } +} + +\cs_new:Npn\semantex_primitive_valuekey_setlowerleftdots:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { lowerleftdots } { \exp_not:n { #2 } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerleft:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_lowerleftdots:nn#1#2 +{ + \semantex_primitive_valuekey_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_setlowerleftslot:nn#1#2 +{ + \semantex_data_tl_set:nnn { #1 } { lowerleftslot } { \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_lowerleftslot:nn#1#2 +{ + \semantex_primitive_valuekey_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_slowerleft:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_slowerleftdots:nn#1#2 +{ + \semantex_primitive_valuekey_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_slowerleftslot:nn#1#2 +{ + \semantex_primitive_valuekey_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_clowerleft:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_clowerleftdots:nn#1#2 +{ + \semantex_primitive_valuekey_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } +} + +\cs_new:Npn\semantex_primitive_valuekey_clowerleftslot:nn#1#2 +{ + \semantex_primitive_valuekey_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } +} + +\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerleftwithothersep:nn { nx } + +\cs_new:Npn\semantex_primitive_valuekey_lowerleftdotswithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_lowerleftslotwithothersep:nn#1#2 +{ + \semantex_primitive_valuekey_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } } +} + +\cs_new:Npn\semantex_primitive_valuekey_cupperleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_upper_left } + \semantex_data_bool_get:nnTF { #1 } { nextupperleftwithsep } { - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } , } } { - \g_semantex_data_tl_put_left:nnn { #1 } { upper_left_index } { \exp_not:n { #2 } , } + \semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left } + \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberofupperleftindices } } } -\cs_new:Npn\g_semantex_primitive_valuekey_clowerleft:nn#1#2{ - % adds to the lower index +\cs_new:Npn\semantex_primitive_valuekey_clowerleft:nn#1#2{ \tl_if_blank:nF{#2} { - \g_semantex_data_bool_get:nnTF { #1 } { first_lower_left } + \semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep } { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } , } } { - \g_semantex_data_tl_put_left:nnn { #1 } { lower_left_index } { \exp_not:n { #2 } , } + \semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n { #2 } } } - \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left } + \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep } + \semantex_data_int_incr:nn { #1 } { numberoflowerleftindices } } } - -\cs_new:Npn\g_semantex_primitive_valuekey_iffirstupperleft:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_ifnextupperleftwithsep:nn#1#2 { - \tl_if_eq:nnTF { #2 } { true } + \tl_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_true:nn { #1 } { first_upper_left } + \semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep } } { - \tl_if_eq:nnTF { #2 } { false } + \tl_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_false:nn { #1 } { first_upper_left } + \semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep } } { - %IM Throw error later + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextupperleftwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextupperleftwithsep_temp } { ifnextupperleftwithsep } { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_iffirstlowerleft:nn#1#2 + +\cs_new:Npn\semantex_primitive_valuekey_ifnextlowerleftwithsep:nn#1#2 { - \tl_if_eq:nnTF { #2 } { true } + \tl_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_true:nn { #1 } { first_lower_left } + \semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep } } { - \tl_if_eq:nnTF { #2 } { false } + \tl_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_false:nn { #1 } { first_lower_left } + \semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep } } { - %IM Throw error later + semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextlowerleftwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextlowerleftwithsep_temp } { ifnextlowerleftwithsep } { #2 } } } } -\cs_new:Npn\g_semantex_primitive_valuekey_setupperleftsep:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_setupperleftsep:nn#1#2 { - \g_semantex_data_tl_set:nnn { #1 } { upperleftsep } { \exp_not:n { #2 } } + \semantex_data_tl_set:nnn { #1 } { upperleftsep } { \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_setlowerleftsep:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_setlowerleftsep:nn#1#2 { - \g_semantex_data_tl_set:nnn { #1 } { lowerleftsep } { \exp_not:n { #2 } } + \semantex_data_tl_set:nnn { #1 } { lowerleftsep } { \exp_not:n { #2 } } } -%--------------- - % Contrary to what you might think, the following commands ARE % sometimes needed. -\cs_new:Npn\g_semantex_primitive_valuekey_iffirstd:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_ifnextdwithsep:nn#1#2 % should be removed later { - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } - { \g_semantex_primitive_valuekey_iffirstupper:nn { #1 } { #2 } } - { \g_semantex_primitive_valuekey_iffirstlower:nn { #1 } { #2 } } + % Tells whether the d (degree) is empty or not + \str_if_eq:nnTF { #2 } { true } + { + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } } + { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } } + } + { + \str_if_eq:nnTF { #2 } { false } + { + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } } + { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextdwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextdwithsep_temp } { ifnextdwithsep } { #2 } + } + } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_iffirstdeg:nn\g_semantex_primitive_valuekey_iffirstd:nn +\cs_set_eq:NN\semantex_primitive_valuekey_ifnextdegwithsep:nn\semantex_primitive_valuekey_ifnextdwithsep -\cs_set_eq:NN\g_semantex_primitive_valuekey_iffirstdegree:nn\g_semantex_primitive_valuekey_iffirstd:nn +\cs_set_eq:NN\semantex_primitive_valuekey_ifnextdegreewithsep:nn\semantex_primitive_valuekey_ifnextdwithsep -\cs_new:Npn\g_semantex_primitive_valuekey_iffirsti:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_ifnextiwithsep:nn#1#2 { - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } - { \g_semantex_primitive_valuekey_iffirstlower:nn { #1 } { #2 } } - { \g_semantex_primitive_valuekey_iffirstupper:nn { #1 } { #2 } } + % Tells whether the i (index) is empty or not + \str_if_eq:nnTF { #2 } { true } + { + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } } + { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } } + } + { + \str_if_eq:nnTF { #2 } { false } + { + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } } + { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextiwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextiwithsep_temp } { ifnextiwithsep } { #2 } + } + } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_iffirstindex:nn\g_semantex_primitive_valuekey_iffirsti:nn +\cs_set_eq:NN\semantex_primitive_valuekey_ifnextindexwithsep:nn\semantex_primitive_valuekey_ifnextiwithsep:nn -\cs_new:Npn\g_semantex_primitive_valuekey_d:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_d:nn#1#2 { % adds to the d-index (upper by default) - % I added an \exp_not:n here and in similar commands to - % take care of \underbrace expansion issues. However, - % I am puzzled as to why it was necessary. - %\bool_if:cTF { semantex_data_bool_#1_if_upper_grading } - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } + \semantex_data_bool_get:nnTF { #1 } { uppergrading } { - \g_semantex_primitive_valuekey_upper:nn { #1 } { #2 } + \semantex_primitive_valuekey_upper:nn { #1 } { #2 } } { - \g_semantex_primitive_valuekey_lower:nn { #1 } { #2 } + \semantex_primitive_valuekey_lower:nn { #1 } { #2 } } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_deg:nn\g_semantex_primitive_valuekey_d:nn +\cs_set_eq:NN\semantex_primitive_valuekey_deg:nn\semantex_primitive_valuekey_d:nn -\cs_set_eq:NN\g_semantex_primitive_valuekey_degree:nn\g_semantex_primitive_valuekey_d:nn +\cs_set_eq:NN\semantex_primitive_valuekey_degree:nn\semantex_primitive_valuekey_d:nn -\cs_new:Npn\g_semantex_primitive_valuekey_sd:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_sd:nn#1#2 { % adds to the d-index (upper by default) - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } + \semantex_data_bool_get:nnTF { #1 } { uppergrading } { - \g_semantex_primitive_valuekey_supper:nn { #1 } { #2 } + \semantex_primitive_valuekey_supper:nn { #1 } { #2 } } { - \g_semantex_primitive_valuekey_slower:nn { #1 } { #2 } + \semantex_primitive_valuekey_slower:nn { #1 } { #2 } } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_sdeg:nn\g_semantex_primitive_valuekey_sd:nn +\cs_set_eq:NN\semantex_primitive_valuekey_sdeg:nn\semantex_primitive_valuekey_sd:nn -\cs_set_eq:NN\g_semantex_primitive_valuekey_sdegree:nn\g_semantex_primitive_valuekey_sd:nn +\cs_set_eq:NN\semantex_primitive_valuekey_sdegree:nn\semantex_primitive_valuekey_sd:nn -\cs_new:Npn\g_semantex_primitive_valuekey_cd:nn#1#2{ %IM Maybe remove this. +\cs_new:Npn\semantex_primitive_valuekey_cd:nn#1#2{ %IM Maybe remove this. % adds to the d-index (upper by default) - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } - { - \g_semantex_primitive_valuekey_cupper:nn { #1 } { #2 } + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_cupper:nn { #1 } { #2 } } { - \g_semantex_primitive_valuekey_clower:nn { #1 } { #2 } + \semantex_primitive_valuekey_clower:nn { #1 } { #2 } } } +\cs_set_eq:NN\semantex_primitive_valuekey_sdeg:nn\semantex_primitive_valuekey_cd:nn +\cs_set_eq:NN\semantex_primitive_valuekey_sdegree:nn\semantex_primitive_valuekey_cd:nn -\cs_set_eq:NN\g_semantex_primitive_valuekey_cdeg:nn\g_semantex_primitive_valuekey_cd:nn - -\cs_set_eq:NN\g_semantex_primitive_valuekey_cdegree:nn\g_semantex_primitive_valuekey_cd:nn +\cs_new:Npn\semantex_primitive_valuekey_i:nn#1#2{ + % adds to the i-index (lower by default) + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_lower:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_upper:nn { #1 } { #2 } + } +} +\cs_set_eq:NN\semantex_primitive_valuekey_index:nn\semantex_primitive_valuekey_i:nn -\cs_new:Npn\g_semantex_primitive_valuekey_i:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_si:nn#1#2{ % adds to the i-index (lower by default) - %\bool_if:cTF { semantex_data_bool_#1_if_upper_grading } - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } - { - \g_semantex_primitive_valuekey_lower:nn { #1 } { #2 } + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_slower:nn { #1 } { #2 } } { - \g_semantex_primitive_valuekey_upper:nn { #1 } { #2 } + \semantex_primitive_valuekey_supper:nn { #1 } { #2 } } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_index:nn\g_semantex_primitive_valuekey_i:nn +\cs_set_eq:NN\semantex_primitive_valuekey_sindex:nn\semantex_primitive_valuekey_si:nn -\cs_new:Npn\g_semantex_primitive_valuekey_si:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_ci:nn#1#2{ % adds to the i-index (lower by default) - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } + \semantex_data_bool_get:nnTF { #1 } { uppergrading } { - \g_semantex_primitive_valuekey_slower:nn { #1 } { #2 } + \semantex_primitive_valuekey_clower:nn { #1 } { #2 } } { - \g_semantex_primitive_valuekey_supper:nn { #1 } { #2 } + \semantex_primitive_valuekey_cupper:nn { #1 } { #2 } } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_sindex:nn\g_semantex_primitive_valuekey_si:nn +\cs_set_eq:NN\semantex_primitive_valuekey_cindex:nn\semantex_primitive_valuekey_ci:nn + -\cs_new:Npn\g_semantex_primitive_valuekey_ci:nn#1#2{ + +\cs_new:Npn\semantex_primitive_valuekey_dwithothersep:nn#1#2 +{ + % adds to the d-index (upper by default) + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_upperwithothersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_lowerwithothersep:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_degwithothersep:nn\semantex_primitive_valuekey_dwithothersep:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreewithothersep:nn\semantex_primitive_valuekey_dwithothersep:nn + + +\cs_new:Npn\semantex_primitive_valuekey_iwithothersep:nn#1#2{ % adds to the i-index (lower by default) - %\bool_if:cTF { semantex_data_bool_#1_if_upper_grading } - \g_semantex_data_bool_get:nnTF { #1 } { upper_grading } + \semantex_data_bool_get:nnTF { #1 } { uppergrading } { - \g_semantex_primitive_valuekey_clower:nn { #1 } { #2 } + \semantex_primitive_valuekey_lowerwithothersep:nn { #1 } { #2 } } { - \g_semantex_primitive_valuekey_cupper:nn { #1 } { #2 } + \semantex_primitive_valuekey_upperwithothersep:nn { #1 } { #2 } } } -\cs_set_eq:NN\g_semantex_primitive_valuekey_cindex:nn\g_semantex_primitive_valuekey_ci:nn +\cs_set_eq:NN\semantex_primitive_valuekey_indexwithothersep:nn\semantex_primitive_valuekey_iwithothersep:nn + +\cs_new:Npn\semantex_primitive_valuekey_setdsep:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_setuppersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_setlowersep:nn { #1 } { #2 } + } +} +\cs_set_eq:NN\semantex_primitive_valuekey_setdegsep:nn\semantex_primitive_valuekey_setdsep:nn -\cs_new:Npn\g_semantex_primitive_valuekey_par:nn#1#2{ - % sets the size of the parentheses - \g_semantex_data_tl_set:nnn { #1 } { par_size }{ \exp_not:n { #2 } } - \g_semantex_primitive_valuekey_ifpar:nn { #1 } { true } +\cs_set_eq:NN\semantex_primitive_valuekey_setdegreesep:nn\semantex_primitive_valuekey_setdsep:nn + +\cs_new:Npn\semantex_primitive_valuekey_setisep:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_setlowersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_setuppersep:nn { #1 } { #2 } + } } +\cs_set_eq:NN\semantex_primitive_valuekey_setindexsep:nn\semantex_primitive_valuekey_setisep:nn -\cs_new:Npn\g_semantex_primitive_valuekey_parsize:nn#1#2{ - % sets the size of the parentheses - \g_semantex_data_tl_set:nnn { #1 } { par_size }{ \exp_not:n { #2 } } +\cs_new:Npn\semantex_primitive_valuekey_pred:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_preupper:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_prelower:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_predeg:nn\semantex_primitive_valuekey_pred:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_predegree:nn\semantex_primitive_valuekey_pred:nn + +\cs_new:Npn\semantex_primitive_valuekey_postd:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_postupper:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_postlower:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_postdeg:nn\semantex_primitive_valuekey_postd:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_postdegree:nn\semantex_primitive_valuekey_postd:nn + + +\cs_set:Npn\semantex_primitive_valuekey_cleard:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clearupper:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clearlower:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_cleardeg:nn\semantex_primitive_valuekey_cleard:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_cleardegree:nn\semantex_primitive_valuekey_cleard:nn + + +\cs_set:Npn\semantex_primitive_valuekey_clearpred:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clearpreupper:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clearprelower:nn { #1 } { #2 } + } } +\cs_set_eq:NN\semantex_primitive_valuekey_clearpredeg:nn\semantex_primitive_valuekey_clearpred:nn +\cs_set_eq:NN\semantex_primitive_valuekey_clearpredegree:nn\semantex_primitive_valuekey_clearpred:nn -\cs_new:Npn\g_semantex_primitive_valuekey_leftpar:nn#1#2{ -% \g_semantex_data_tl_set:nnn { #1 } { par_open }{ \exp_not:n { #2 } } - \tl_set:cn { semantex_data_tl_#1_par_open }{ \exp_not:n { #2 } } +\cs_set:Npn\semantex_primitive_valuekey_clearpostd:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clearpostupper:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clearpostlower:nn { #1 } { #2 } + } } +\cs_set_eq:NN\semantex_primitive_valuekey_clearpostdeg:nn\semantex_primitive_valuekey_clearpostd:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_clearpostdegree:nn\semantex_primitive_valuekey_clearpostd:nn + + +\cs_new:Npn\semantex_primitive_valuekey_prei:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_prelower:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_preupper:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_preindex:nn\semantex_primitive_valuekey_prei:nn + +\cs_new:Npn\semantex_primitive_valuekey_posti:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_postlower:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_postupper:nn { #1 } { #2 } + } +} +\cs_set_eq:NN\semantex_primitive_valuekey_postindex:nn\semantex_primitive_valuekey_posti:nn +\cs_set:Npn\semantex_primitive_valuekey_cleari:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clearlower:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clearupper:nn { #1 } { #2 } + } +} +\cs_set_eq:NN\semantex_primitive_valuekey_clearindex:nn\semantex_primitive_valuekey_cleari:nn -\cs_new:Npn\g_semantex_primitive_valuekey_rightpar:nn#1#2{ - \g_semantex_data_tl_set:nnn { #1 } { par_close }{ \exp_not:n { #2 } } +\cs_set:Npn\semantex_primitive_valuekey_clearprei:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clearprelower:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clearpreupper:nn { #1 } { #2 } + } } +\cs_set_eq:NN\semantex_primitive_valuekey_clearpreindex:nn\semantex_primitive_valuekey_clearprei:nn -\cs_new:Npn\g_semantex_primitive_valuekey_ifpar:nn#1#2{ %IMPLEMENT THIS +\cs_set:Npn\semantex_primitive_valuekey_clearposti:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clearpostlower:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clearpostupper:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_clearpostindex:nn\semantex_primitive_valuekey_clearposti:nn + + +\cs_new:Npn\semantex_primitive_valuekey_setddots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n s{ #2 } } + } + { + \semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_setdegdots:nn\semantex_primitive_valuekey_setddots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_setdegreedots:nn\semantex_primitive_valuekey_setddots:nn + +\cs_new:Npn\semantex_primitive_valuekey_ddots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_upperdots:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_lowerdots:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_degdots:nn\semantex_primitive_valuekey_ddots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreedots:nn\semantex_primitive_valuekey_ddots:nn + +\cs_new:Npn\semantex_primitive_valuekey_setdslot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_setupperslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_setlowerslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_setdegslot:nn\semantex_primitive_valuekey_setdslot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_setdegreeslot:nn\semantex_primitive_valuekey_setdslot:nn + +\cs_new:Npn\semantex_primitive_valuekey_dslot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_upperslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_lowerslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_degslot:nn\semantex_primitive_valuekey_dslot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreeslot:nn\semantex_primitive_valuekey_dslot:nn + +\cs_new:Npn\semantex_primitive_valuekey_sddots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_supperdots:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_slowerdots:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_sdegdots:nn\semantex_primitive_valuekey_sddots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_sdegreedots:nn\semantex_primitive_valuekey_sddots:nn + + +\cs_new:Npn\semantex_primitive_valuekey_sdslot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_supperslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_slowerslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_sdegslot:nn\semantex_primitive_valuekey_sdslot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_sdegreeslot:nn\semantex_primitive_valuekey_sdslot:nn + +\cs_new:Npn\semantex_primitive_valuekey_cddots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_cupperdots:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clowerdots:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_cdegdots:nn\semantex_primitive_valuekey_cddots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_cdegreedots:nn\semantex_primitive_valuekey_cddots:nn + +\cs_new:Npn\semantex_primitive_valuekey_cdslot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_cupperslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_clowerslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_cdegslot:nn\semantex_primitive_valuekey_cdslot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_cdegreeslot:nn\semantex_primitive_valuekey_cdslot:nn + +\cs_new:Npn\semantex_primitive_valuekey_ddotswithothersep:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_upperdotswithothersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_lowerdotswithothersep:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_degdotswithothersep:nn\semantex_primitive_valuekey_ddotswithothersep:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreedotswithothersep:nn\semantex_primitive_valuekey_ddotswithothersep:nn + +\cs_new:Npn\semantex_primitive_valuekey_dslotwithothersep:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_upperslotwithothersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_lowerslotwithothersep:nn { #1 } { #2 } + } +} + + + +%---------------------------------------------------------- + +\cs_new:Npn\semantex_primitive_valuekey_setidots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } } + } + { + \semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n { #2 } } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_setindexdots:nn\semantex_primitive_valuekey_setidots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_setdegreedots:nn\semantex_primitive_valuekey_setidots:nn + +\cs_new:Npn\semantex_primitive_valuekey_idots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_lowerdots:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_upperdots:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_indexdots:nn\semantex_primitive_valuekey_idots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreedots:nn\semantex_primitive_valuekey_idots:nn + +\cs_new:Npn\semantex_primitive_valuekey_setislot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_setlowerslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_setupperslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_setindexslot:nn\semantex_primitive_valuekey_setislot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_setdegreeslot:nn\semantex_primitive_valuekey_setislot:nn + +\cs_new:Npn\semantex_primitive_valuekey_islot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_lowerslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_upperslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_indexslot:nn\semantex_primitive_valuekey_islot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreeslot:nn\semantex_primitive_valuekey_islot:nn + +\cs_new:Npn\semantex_primitive_valuekey_sidots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_slowerdots:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_supperdots:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_sindexdots:nn\semantex_primitive_valuekey_sidots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_sdegreedots:nn\semantex_primitive_valuekey_sidots:nn + + +\cs_new:Npn\semantex_primitive_valuekey_sislot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_slowerslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_supperslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_sindexslot:nn\semantex_primitive_valuekey_sislot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_sdegreeslot:nn\semantex_primitive_valuekey_sislot:nn + +\cs_new:Npn\semantex_primitive_valuekey_cidots:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clowerdots:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_cupperdots:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_cindexdots:nn\semantex_primitive_valuekey_cidots:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_cdegreedots:nn\semantex_primitive_valuekey_cidots:nn + +\cs_new:Npn\semantex_primitive_valuekey_cislot:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_clowerslot:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_cupperslot:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_cindexslot:nn\semantex_primitive_valuekey_cislot:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_cdegreeslot:nn\semantex_primitive_valuekey_cislot:nn + +\cs_new:Npn\semantex_primitive_valuekey_idotswithothersep:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_lowerdotswithothersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_upperdotswithothersep:nn { #1 } { #2 } + } +} + +\cs_set_eq:NN\semantex_primitive_valuekey_indexdotswithothersep:nn\semantex_primitive_valuekey_idotswithothersep:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreedotswithothersep:nn\semantex_primitive_valuekey_idotswithothersep:nn + +\cs_new:Npn\semantex_primitive_valuekey_islotwithothersep:nn#1#2 +{ + \semantex_data_bool_get:nnTF { #1 } { uppergrading } + { + \semantex_primitive_valuekey_lowerslotwithothersep:nn { #1 } { #2 } + } + { + \semantex_primitive_valuekey_upperslotwithothersep:nn { #1 } { #2 } + } +} + +%---------------------------------------------------------- + +\cs_set_eq:NN\semantex_primitive_valuekey_degslotwithothersep:nn\semantex_primitive_valuekey_dslotwithothersep:nn + +\cs_set_eq:NN\semantex_primitive_valuekey_degreeslotwithothersep:nn\semantex_primitive_valuekey_dslotwithothersep:nn + +\cs_new:Npn\semantex_primitive_valuekey_par:nn#1#2{ + % Turns parentheses on, and sets their size + \semantex_data_tl_set:nnn { #1 } { parsize }{ \exp_not:n { #2 } } + \semantex_primitive_valuekey_ifpar:nn { #1 } { true } +} + +\cs_new:Npn\semantex_primitive_valuekey_parsize:nn#1#2{ + % Sets the size of the parentheses + \semantex_data_tl_set:nnn { #1 } { parsize }{ \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_leftpar:nn#1#2{ + \semantex_data_tl_set:nnn { #1 } { leftpar }{ \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_rightpar:nn#1#2{ + \semantex_data_tl_set:nnn { #1 } { rightpar }{ \exp_not:n { #2 } } +} + +\cs_new:Npn\semantex_primitive_valuekey_ifpar:nn#1#2{ %IMPLEMENT THIS % tells whether to use the output class or not - \g_semantex_data_bool_provide:nn { #1 } { par } + \semantex_data_bool_provide:nn { #1 } { par } \str_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_true:nn { #1 } { par } + \semantex_data_bool_set_true:nn { #1 } { par } + \semantex_data_bool_set_false:nn { #1 } { flexpar } } { - \str_if_eq:nnTF { #2 } { false } + \str_if_eq:nnTF { #2 } { never } { - \g_semantex_data_bool_set_false:nn { #1 } { par } + \semantex_data_bool_set_false:nn { #1 } { par } + \semantex_data_bool_set_false:nn { #1 } { flexpar } } { - %IM do nothing right now, but should - %IM probably throw an error + \str_if_eq:nnTF { #2 } { false } + { + \semantex_data_bool_set_false:nn { #1 } { par } + \semantex_data_bool_set_true:nn { #1 } { flexpar } + } + { + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifpar_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifpar_temp } { ifpar } { #2 } + } } } } - - -\cs_new:Npn\g_semantex_primitive_valuekey_spar:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_spar:nn#1#2 { + % Abbreviation for "symbol parentheses" + % Adds parentheses around the current symbol + \semantex_primitive_valuekey_return:nn { #1 }{} + \semantex_data_tl_inherit:nn { #1 } { symbol } % Check if really necessary \tl_if_blank:nTF { #2 } { - \g_semantex_primitive_valuekey_return:nn { #1 }{} - \g_semantex_data_tl_set:nnx { #1 } { symbol } + \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_primitive_valuekey_spar_sparsize_temp + \__semantex_symbol_parentheses_store:nnnnN + { \l__semantex_primitive_valuekey_spar_sparsize_temp } + { \semantex_data_tl_get:nn { #1 } { leftspar } } + { \semantex_data_tl_get:nn { #1 } { rightspar } } + { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } } + \l__semantex_primitive_valuekey_spar_temp + \semantex_data_tl_set:nnx { #1 } { symbol } { - { \g_semantex_data_tl_get_exp_not:nn { #1 } { spar_size } } - %IM like in _return - { \g_semantex_data_tl_get:nn { #1 } { spar_open } } - { \g_semantex_data_tl_get:nn { #1 } { spar_close } } - { \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } } -% { \l__semantex_spar_symbol_temp } - } - \g_semantex_data_tl_put_left:nnn { #1 } { symbol } - { - \exp_not:N - \g_semantex_symbol_parentheses:nnnn + \exp_not:V\l__semantex_primitive_valuekey_spar_temp } } { - \g_semantex_data_tl_inherit:nn { #1 } { symbol } - \g_semantex_primitive_valuekey_return:nn { #1 }{} - \g_semantex_data_tl_set:nnx { #1 } { symbol } + \tl_set:Nn \l__semantex_primitive_valuekey_spar_sparsize_temp { \exp_not:n { #2 } } + \__semantex_symbol_parentheses_store:nnnnN + { \l__semantex_primitive_valuekey_spar_sparsize_temp } + { \semantex_data_tl_get:nn { #1 } { leftspar } } + { \semantex_data_tl_get:nn { #1 } { rightspar } } + { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } } + \l__semantex_primitive_valuekey_spar_temp + \semantex_data_tl_set:nnx { #1 } { symbol } { - { \exp_not:n { \exp_not:n { #2 } } } - { \g_semantex_data_tl_get:nn { #1 } { spar_open } } - { \g_semantex_data_tl_get:nn { #1 } { spar_close } } - { \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } } - } - \g_semantex_data_tl_put_left:nnn { #1 } { symbol } - { - \exp_not:N - \g_semantex_symbol_parentheses:nnnn + \exp_not:V\l__semantex_primitive_valuekey_spar_temp } } } -\cs_new:Npn\g_semantex_primitive_valuekey_iffirstarg:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_ifnextargwithsep:nn#1#2 { + % Tells whether it is the first argument or not \tl_if_eq:nnTF { #2 } { true } { - \g_semantex_data_bool_set_true:nn { #1 } { first_arg } + \semantex_data_bool_set_true:nn { #1 } { nextargwithsep } } { \tl_if_eq:nnTF { #2 } { false } { - \g_semantex_data_bool_set_false:nn { #1 } { first_arg } + \semantex_data_bool_set_false:nn { #1 } { nextargwithsep } } { - %IM Throw error later + \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextargwithsep_temp + \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextargwithsep_temp } { ifnextargwithsep } { #2 } } } } -\cs_new:Npn\g_semantex_auxiliary_first_arg:nn#1#2 { #1 } -\cs_new:Npn\g_semantex_auxiliary_second_arg:nn#1#2 { #2 } - -%\cs_new:Npn\g_semantex_primitive_valuekey_otherspar:nn#1#2 -%{ -% \g_semantex_data_tl_inherit:nn { #1 } { spar_size } -% \g_semantex_data_tl_inherit:nn { #1 } { symbol } -% \g_semantex_primitive_novaluekey_return:n { #1 } -%% \tl_set:Nn\l__semantex_spar_temp -%% { -%% \exp_not:N -%% \g_semantex_symbol_parentheses:nnnn -%% } -%% \tl_put_right:Nx\l__semantex_spar_temp -%% { -%% { \exp_not:v { semantex_data_tl_#1_spar_size } } -%% { \g_semantex_auxiliary_first_arg:nn#2 } -%% { \g_semantex_auxiliary_second_arg:nn#2 } -%% { \exp_not:v { semantex_data_tl_#1_symbol } } -%% } -%% \tl_set:cx { semantex_data_tl_#1_symbol } { \exp_not:V\l__semantex_spar_temp } -% \tl_set:cx { semantex_data_tl_#1_symbol } -% { -% %{ \exp_not:c { semantex_data_tl_#1_spar_size } } -% { \exp_not:n { \use:c { semantex_data_tl_#1_spar_size } } } -% { \g_semantex_auxiliary_first_arg:nn #2 } -% { \g_semantex_auxiliary_second_arg:nn #2 } -% { \exp_not:v { semantex_data_tl_#1_symbol } } -% } -% \tl_put_left:cn { semantex_data_tl_#1_symbol } -% { -% \exp_not:N -% \g_semantex_symbol_parentheses:nnnn -% } -%} - -\cs_new:Npn\g_semantex_primitive_valuekey_otherspar:nn#1#2 +\cs_new:Npn\semantex_primitive_valuekey_otherspar:nn#1#2 { - \g_semantex_primitive_valuekey_otherspar_auxiliary:nnn { #1 } #2 + % Uses the syntax otherspar={leftpar}{rightpar} + % Adds a new spar, but with these as parentheses + \__semantex_primitive_valuekey_otherspar_auxiliary:nnn { #1 } #2 } -\cs_new:Npn\g_semantex_primitive_valuekey_otherspar_auxiliary:nnn#1#2#3 +\cs_new:Npn\__semantex_primitive_valuekey_otherspar_auxiliary:nnn#1#2#3 { - %IM DOES NOT WORK!!!!! - \g_semantex_data_tl_inherit:nn { #1 } { spar_size } - \g_semantex_data_tl_get_store:nnN { #1 } { spar_size } \l__semantex_otherspar_spar_size_temp - \g_semantex_data_tl_inherit:nn { #1 } { symbol } - \g_semantex_primitive_valuekey_return:nn { #1 }{} -% \tl_set:Nn\l__semantex_spar_temp -% { -% \exp_not:N -% \g_semantex_symbol_parentheses:nnnn -% } -% \tl_put_right:Nx\l__semantex_spar_temp -% { -% { \exp_not:v { semantex_data_tl_#1_spar_size } } -% { \g_semantex_auxiliary_first_arg:nn#2 } -% { \g_semantex_auxiliary_second_arg:nn#2 } -% { \exp_not:v { semantex_data_tl_#1_symbol } } -% } -% \tl_set:cx { semantex_data_tl_#1_symbol } { \exp_not:V\l__semantex_spar_temp } - \g_semantex_data_tl_set:nnx { #1 } { symbol } + \semantex_data_tl_inherit:nn { #1 } { sparsize } % This is necessary for unknown reasons -- otherwise, it will crash when inheriting sparsize + \semantex_data_tl_inherit:nn { #1 } { symbol } + \semantex_primitive_valuekey_return:nn { #1 }{} + \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_primitive_valuekey_otherspar_sparsize_temp + \__semantex_symbol_parentheses_store:nnnnN + { \l__semantex_primitive_valuekey_otherspar_sparsize_temp } + { \exp_not:n { \exp_not:n { #2 } } } + { \exp_not:n { \exp_not:n { #3 } } } + { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } } + \l__semantex_primitive_valuekey_otherspar_temp + \semantex_data_tl_set:nnx { #1 } { symbol } { - %{ \exp_not:c { semantex_data_tl_#1_spar_size } } - %{ \exp_not:n { \use:c { semantex_data_tl_#1_spar_size } } } - %{ normal } - %{ \exp_not:n { \exp_not:v { semantex_data_tl_#1_spar_size } } } - { \exp_not:V \l__semantex_otherspar_spar_size_temp } - { \exp_not:n { \exp_not:n { #2 } } } - { \exp_not:n { \exp_not:n { #3 } } } - { \g_semantex_data_tl_get_exp_not:nn { #1 } { symbol } } + \exp_not:V\l__semantex_primitive_valuekey_otherspar_temp } - \g_semantex_data_tl_put_left:nnn { #1 } { symbol } +} + +\cs_new:Npn\semantex_primitive_valuekey_Otherspar:nn#1#2 +{ + % Uses the syntax otherspar={leftpar}{rightpar}{size} + % Adds a new spar, but with these as parentheses and size + \__semantex_primitive_valuekey_Otherspar_auxiliary:nnnn { #1 } #2 +} + +\cs_new:Npn\__semantex_primitive_valuekey_Otherspar_auxiliary:nnnn#1#2#3#4 +{ + \tl_set:Nn\l__semantex_primitive_valuekey_Otherspar_sparsize_temp + { \exp_not:n { #4 } } + \__semantex_symbol_parentheses_store:nnnnN + { \l__semantex_primitive_valuekey_Otherspar_sparsize_temp } + { \exp_not:n { \exp_not:n { #2 } } } + { \exp_not:n { \exp_not:n { #3 } } } + { \semantex_data_tl_get_exp_not:nn { #1 } { symbol } } + \l__semantex_primitive_valuekey_Otherspar_temp + \semantex_data_tl_set:nnx { #1 } { symbol } { - \exp_not:N - \g_semantex_symbol_parentheses:nnnn + \exp_not:V\l__semantex_primitive_valuekey_Otherspar_temp } -% \tl_put_left:cx { g_auomath_#1_symbol } -% { -% \exp_not:N -% \g_semantex_symbol_parentheses:nnnn -% } - %\tl_put_left:cn { semantex_data_tl_#1_symbol } - %{ - % \exp_not:N - % \g_semantex_symbol_parentheses:nnnn - %} } -\cs_new:Npn\g_semantex_primitive_valuekey_sparsize:nn#1#2{ +\cs_new:Npn\semantex_primitive_valuekey_sparsize:nn#1#2{ % sets the size of the parentheses - \g_semantex_data_tl_set:nnn { #1 } { spar_size }{ \exp_not:n { #2 } } + \semantex_data_tl_set:nnn { #1 } { sparsize }{ \exp_not:n { #2 } } } -\cs_new:Npn\g_semantex_primitive_valuekey_leftspar:nn#1#2{ - \g_semantex_data_tl_set:nnn { #1 } { spar_open }{ \exp_not:n { \exp_not:n { #2 } } } +\cs_new:Npn\semantex_primitive_valuekey_leftspar:nn#1#2{ + \semantex_data_tl_set:nnn { #1 } { leftspar }{ \exp_not:n { \exp_not:n { #2 } } } %IM Two \exp_not necessary for unknown reasons %IM Doing the same at leftpar yields an error. } -\cs_new:Npn\g_semantex_primitive_valuekey_rightspar:nn#1#2{ - \g_semantex_data_tl_set:nnn { #1 } { spar_close }{ \exp_not:n { \exp_not:n { #2 } } } +\cs_new:Npn\semantex_primitive_valuekey_rightspar:nn#1#2{ + \semantex_data_tl_set:nnn { #1 } { rightspar }{ \exp_not:n { \exp_not:n { #2 } } } %IM Two \exp_not necessary for unknown reasons %IM Doing the same at leftpar yields an error. } +\cs_generate_variant:Nn \semantex_keys_set:nn { nx, no, nV } % Only the first one is currently being used - - - - -%\msg_new:nnnn { semantex } { singlekey_not_found } { Unknown~key~#1~passed~to~object~#2~on~input~line~\msg_line_number: } {} - -\cs_generate_variant:Nn \g_semantex_keys_set:nn { nx, no, nV } - -\cs_generate_variant:Nn \exp_args:Nnx { cnx } - -\cs_new:Npn \g_semantex_valuekey:nnn#1#2#3{ - % Takes care of valuekeys, keys with a value +\cs_new:Npn \semantex_valuekey:nnn#1#2#3{ + % Takes care of valuekeys, keys taking a value % For the sake of implementation, the arguments % come in a strange order % #1 = value of key % #2 = name of the key % #3 = object - %\tl_set:Nn\l_semantex_key_value_temp{#1} - \tl_set:Nn\l_semantex_key_value_temp{\exp_not:n{#1}} - %\tl_set:Nx\l_semantex_key_value_temp{\exp_not:n{\exp_not:n{#1}}} % stores the content of the key in the temporary command \l_semantex_key_value_temp - %\tl_set:Nn\l_semantex_key_value_temp{#1} - %\tl_set:No\l_semantex_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l_semantex_key_value_temp + \tl_set:Nn\l__semantex_key_value_temp{\exp_not:n{#1}} %IM think about using extra {...} to avoid interference with keyval str - \g_semantex_valuekey_get:nnNTF { #3 } { #2 } \l_semantex_custom_valuekey_temp + \semantex_valuekey_get:nnNTF { #3 } { #2 } \l__semantex_custom_valuekey_temp { - \g_semantex_keys_set:nx { #3 } - { \l_semantex_custom_valuekey_temp } + \semantex_keys_set:nx { #3 } + { \l__semantex_custom_valuekey_temp } } { - \cs_if_exist:cTF { g_semantex_primitive_valuekey_#2:nn } + \cs_if_exist:cTF { semantex_primitive_valuekey_#2:nn } { - \use:c { g_semantex_primitive_valuekey_#2:nn }{ #3 }{ #1 } + \use:c { semantex_primitive_valuekey_#2:nn }{ #3 }{ #1 } } { - \msg_error:nnnn { semantex } { keyval_not_found } { #2 } { #3 } + \semantex_error_output_format:nN { #3 } \__semantex_valuekey_unknown_key_temp + \msg_error:nnxn { semantex } { valuekey_not_found } { \__semantex_valuekey_unknown_key_temp } { #2 } } } } -\cs_generate_variant:Nn \g_semantex_keys_set:nn { nx } - -\cs_new:Npn \g_semantex_novaluekey:nn#1#2 +\cs_new:Npn \semantex_singlekey:nn#1#2 { % #1 = name of the key % #2 = object -% % takes care of single keys, keys without a value - \g_semantex_novaluekey_get:nnNTF { #2 } { #1 } \l_semantex_custom_novaluekey_temp +% Takes care of single keys, keys without a value + \semantex_singlekey_get:nnNTF { #2 } { #1 } \l__semantex_custom_singlekey_temp { - \g_semantex_keys_set:nx { #2 } + \semantex_keys_set:nx { #2 } { - \l_semantex_custom_novaluekey_temp + \l__semantex_custom_singlekey_temp } } { - \g_semantex_keys_set:nn { #2 } { default = { #1 } } + \semantex_keys_set:nn { #2 } { default = { #1 } } } } -%IMplement the same thing for upper, lower?? Probably not. - -\cs_new:Npn \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withsep:nn#1#2 -{ - #1#2 -} - -\cs_new:Npn \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withoutsep:nn#1#2 -{ - #2 -} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% COMMANDS CONTROLLING THE ARGUMENT KEYVAL INTERFACE +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\cs_new:Npn \g_semantex_primitive_arg_valuekey_sep:nn#1#2 +\cs_new:Npn \semantex_primitive_arg_valuekey_othersep:nn#1#2 { - \g_semantex_data_bool_get:nnTF { #1 } { first_arg } + % Uses syntax sep={separator}{argument}; adds an argument + % with the specified separator + \semantex_data_bool_get:nnTF { #1 } { nextargwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { arg } { - \exp_not:n { \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withoutsep:nn #2 } + \semantex_data_tl_put_right:nnn { #1 } { arg } { + \exp_not:n { + \semantex_grab_first_argument_of_two:nn #2 + \semantex_grab_second_argument_of_two:nn #2 + } } - %IM These do not use :x, unlike the ones below } { - \g_semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { \g_semantex_arg_primitive_valuekey_sep_auxiliary_function_withsep:nn #2 } } + \semantex_data_tl_put_right:nnn { #1 } { arg } { + \exp_not:n { + \semantex_grab_second_argument_of_two:nn #2 + } + } + %IM These do not use :x, unlike the ones below } - \g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn{#1}{true} - \g_semantex_data_bool_set_false:nn { #1 } { first_arg } + \semantex_data_int_incr:nn { #1 } { numberofarguments } + \semantex_data_bool_set_true:nn { #1 } { nextargwithsep } } -\cs_new:Npn \g_semantex_primitive_arg_valuekey_standardsep:nn#1#2 +\cs_new:Npn \semantex_primitive_arg_valuekey_s:nn#1#2 { - \g_semantex_data_bool_get:nnTF { #1 } { first_arg } + % Adds to the argument, with the standard separator + \semantex_data_bool_get:nnTF { #1 } { nextargwithsep } { - \g_semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } } + \semantex_data_tl_put_right:nnx { #1 } { arg } { \exp_not:n { \semantex_data_tl_get:nn { #1 } { argsep } } } + \semantex_data_tl_put_right:nnn { #1 } { arg } {\exp_not:n { #2 } } + % As an experiment, I tried changing cx to cn, and it failed + % when changing the separator on the fly. + } + { + \semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } } %IM Recently corrected % Previously, this was cx, but I didn’t see any point of this; % this was mostly to create symmetry with the below case where % cx is strictly necessary. } - { - \g_semantex_data_tl_put_right:nnx { #1 } { arg } { \exp_not:n { \g_semantex_data_tl_get:nn { #1 } { argsep } } } - \g_semantex_data_tl_put_right:nnn { #1 } { arg } {\exp_not:n { #2 } } - % As an experiment, I tried changing cx to cn, and it failed - % when changing the separator on the fly. - } -% \g_semantex_primitive_valuekey_ifoutput:nn { #1 } { true } - \g_semantex_primitive_valuekey_ifrightreturnbeforerender:nn{#1}{true} - \g_semantex_data_bool_set_false:nn { #1 } { first_arg } +% \semantex_primitive_valuekey_ifoutput:nn { #1 } { true } + \semantex_data_int_incr:nn { #1 } { numberofarguments } + \semantex_data_bool_set_true:nn { #1 } { nextargwithsep } } -\cs_new:Npn \g_semantex_primitive_arg_valuekey_dots:nn#1#2 +\cs_generate_variant:Nn \semantex_primitive_arg_valuekey_s:nn { nx } + +\cs_new:Npn \semantex_primitive_arg_valuekey_dots:nn#1#2 { - \g_semantex_primitive_arg_valuekey_standardsep:nn { #1 } { \g_semantex_data_tl_get:nn { #1 } { argdots } } + % Writes dots in the argument + \semantex_primitive_arg_valuekey_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argdots } } } -\cs_new:Npn \g_semantex_primitive_arg_valuekey_slot:nn#1#2 +\cs_new:Npn \semantex_primitive_arg_valuekey_slot:nn#1#2 { - \g_semantex_primitive_arg_valuekey_standardsep:nn { #1 } { \g_semantex_data_tl_get:nn { #1 } { slot } } + % Writes the slot in teh argument + \semantex_primitive_arg_valuekey_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argslot } } } -\cs_generate_variant:Nn \g_semantex_arg_keys_set:nn { nx } +\cs_generate_variant:Nn \semantex_arg_keys_set:nn { nx } -\cs_new:Npn \g_semantex_arg_valuekey:nnn#1#2#3 +\cs_new:Npn \semantex_arg_valuekey:nnn#1#2#3 { % Takes care of valuekeys, keys with a value % For the sake of implementation, the arguments @@ -2850,164 +4754,181 @@ % #1 = value of key % #2 = name of the key % #3 = object - \tl_set:Nn\l_semantex_arg_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l_semantex_key_value_temp - \g_semantex_arg_valuekey_get:nnNTF { #3 } { #2 } \l_semantex_custom_arg_valuekey_temp + \tl_set:Nn\l__semantex_arg_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l__semantex_key_value_temp + \semantex_arg_valuekey_get:nnNTF { #3 } { #2 } \l__semantex_custom_arg_valuekey_temp { - \g_semantex_arg_keys_set:nx { #3 } { \l_semantex_custom_arg_valuekey_temp } + \semantex_arg_keys_set:nx { #3 } { \l__semantex_custom_arg_valuekey_temp } } { - \cs_if_exist:cTF { g_semantex_primitive_arg_valuekey_#2:nn } + \cs_if_exist:cTF { semantex_primitive_arg_valuekey_#2:nn } { - \use:c { g_semantex_primitive_arg_valuekey_#2:nn }{ #3 }{ #1 }% + \use:c { semantex_primitive_arg_valuekey_#2:nn }{ #3 }{ #1 } } { - \msg_error:nnnn { semantex } { arg_valuekey_not_found } { #2 } { #3 } +% \msg_error:nnnn { semantex } { arg_valuekey_not_found } { #2 } { #3 } + \semantex_error_output_format:nN { #3 } \__semantex_arg_valuekey_unknown_key_temp + \msg_error:nnxn { semantex } { arg_valuekey_not_found } { \__semantex_arg_valuekey_unknown_key_temp } { #2 } } } } -\cs_new:Npn \g_semantex_arg_novaluekey:nn#1#2 +\cs_new:Npn \semantex_arg_singlekey:nn#1#2 { % #1 = name of the key % #2 = object % % takes care of single keys, keys without a value % the class key is not actually necessary - \g_semantex_arg_novaluekey_get:nnNTF { #2 } { #1 } \l_semantex_custom_arg_novaluekey_temp + \semantex_arg_singlekey_get:nnNTF { #2 } { #1 } \l__semantex_custom_arg_singlekey_temp { %\exp_args:NNno %\exp_args:Nno - %\use:c { g_semantex_data_cs_#3_arg:n } - \g_semantex_arg_keys_set:nx { #2 } + \semantex_arg_keys_set:nx { #2 } { - \l_semantex_custom_arg_novaluekey_temp + \l__semantex_custom_arg_singlekey_temp } } { - \g_semantex_data_tl_inherit_x:nn { #2 } { arg } - \g_semantex_arg_keys_set:nn { #2 } { default={\exp_not:n { #1 } }} - %\g_semantex_arg_keys_set:nn { #3 } { default={#1}} + \semantex_data_tl_inherit_x:nn { #2 } { arg } + \semantex_arg_keys_set:nn { #2 } { default={\exp_not:n { #1 } }} %IM THis \exp_not:n was added late, might be needed elsewhere, too. } } +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% SETTING UP THE BASE CLASS SemantexVariable +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + -\g_semantex_data_tl_provide:nn { semantexvariable } { output } +\semantex_data_tl_provide:nn { class_SemantexVariable } { output } -\g_semantex_data_tl_set:nnn { semantexvariable } { output } { semantexvariable } +\semantex_data_tl_set:nnn { class_SemantexVariable } { output } { class_SemantexVariable } -\g_semantex_data_tl_provide:nn { semantexvariable } { upper_index } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upper } -\g_semantex_data_tl_provide:nn { semantexvariable } { uppersep } +\semantex_data_tl_provide:nn { class_SemantexVariable } { uppersep } -\g_semantex_data_tl_set:nnn { semantexvariable } { uppersep } { , } +\semantex_data_tl_set:nnn { class_SemantexVariable } { uppersep } { , } %IM Also, need commands like forgetupperindex, reverting to the class standard -\g_semantex_data_tl_provide:nn { semantexvariable } { lower_index } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lower } -\g_semantex_data_tl_provide:nn { semantexvariable } { lowersep } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowersep } -\g_semantex_data_tl_set:nnn { semantexvariable } { lowersep } { , } +\semantex_data_tl_set:nnn { class_SemantexVariable } { lowersep } { , } -\g_semantex_data_tl_provide:nn { semantexvariable } { preupper } +\semantex_data_tl_provide:nn { class_SemantexVariable } { preupper } -\g_semantex_data_tl_provide:nn { semantexvariable } { postupper } +\semantex_data_tl_provide:nn { class_SemantexVariable } { postupper } -\g_semantex_data_tl_provide:nn { semantexvariable } { prelower } +\semantex_data_tl_provide:nn { class_SemantexVariable } { prelower } -\g_semantex_data_tl_provide:nn { semantexvariable } { postlower } +\semantex_data_tl_provide:nn { class_SemantexVariable } { postlower } -\g_semantex_data_tl_provide:nn { semantexvariable } { upper_left_index } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleft } -\g_semantex_data_tl_provide:nn { semantexvariable } { upperleftsep } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftsep } -\g_semantex_data_tl_set:nnn { semantexvariable } { upperleftsep } { , } +\semantex_data_tl_set:nnn { class_SemantexVariable } { upperleftsep } { , } -%IM do the same with all the others, INCLUDING if_upper_grading and symbol +%IM do the same with all the others, INCLUDING if_uppergrading and symbol %IM Also, need commands like forgetupperindex, reverting to the class standard -\g_semantex_data_tl_provide:nn { semantexvariable } { lower_left_index } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleft } + +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftsep } -\g_semantex_data_tl_provide:nn { semantexvariable } { lowerleftsep } +\semantex_data_tl_set:nnn { class_SemantexVariable } { lowerleftsep } { , } -\g_semantex_data_tl_set:nnn { semantexvariable } { lowerleftsep } { , } +\semantex_data_tl_provide:nn { class_SemantexVariable } { preupperleft } -\g_semantex_data_tl_provide:nn { semantexvariable } { preupperleft } +\semantex_data_tl_provide:nn { class_SemantexVariable } { postupperleft } -\g_semantex_data_tl_provide:nn { semantexvariable } { postupperleft } +\semantex_data_tl_provide:nn { class_SemantexVariable } { prelowerleft } -\g_semantex_data_tl_provide:nn { semantexvariable } { prelowerleft } +\semantex_data_tl_provide:nn { class_SemantexVariable } { postlowerleft } -\g_semantex_data_tl_provide:nn { semantexvariable } { postlowerleft } +\semantex_data_int_provide:nn { class_SemantexVariable } { numberofarguments } +\semantex_data_bool_provide:nn { class_SemantexVariable } { nextargwithsep } -\g_semantex_data_bool_provide:nn { semantexvariable } { first_upper_left } -\g_semantex_data_bool_set_true:nn { semantexvariable } { first_upper_left } +\semantex_data_bool_provide:nn { class_SemantexVariable } { nextupperleftwithsep } +\semantex_data_bool_provide:nn { class_SemantexVariable } { nextlowerleftwithsep } -\g_semantex_data_bool_provide:nn { semantexvariable } { first_lower_left } -\g_semantex_data_bool_set_true:nn { semantexvariable } { first_lower_left } +\semantex_data_int_provide:nn { class_SemantexVariable } { numberofupperleftindices } +\semantex_data_int_provide:nn { class_SemantexVariable } { numberoflowerleftindices } +\semantex_data_tl_provide:nn { class_SemantexVariable } { prearg } +\semantex_data_tl_provide:nn { class_SemantexVariable } { postarg } -\g_semantex_data_tl_provide:nn { semantexvariable } { prearg } +\semantex_data_tl_provide:nn { class_SemantexVariable } { arg } -\g_semantex_data_tl_provide:nn { semantexvariable } { postarg } -%IMplement these later +\semantex_data_tl_provide:nn { class_SemantexVariable } { argsep } +\semantex_data_tl_set:nnn { class_SemantexVariable } { argsep } {,} -\g_semantex_data_tl_provide:nn { semantexvariable } { arg } +\semantex_data_tl_provide:nn { class_SemantexVariable } { argslot } +\semantex_data_tl_set:nnn { class_SemantexVariable } { argslot } { \SemantexSlot } -\g_semantex_data_tl_provide:nn { semantexvariable } { argsep } -\g_semantex_data_tl_set:nnn { semantexvariable } { argsep } {,} +\semantex_data_tl_provide:nn { class_SemantexVariable } { argdots } +\semantex_data_tl_set:nnn { class_SemantexVariable } { argdots } {\dots} -\g_semantex_data_tl_provide:nn { semantexvariable } { slot } -\g_semantex_data_tl_set:nnn { semantexvariable } { slot } { \semantexslot } +\semantex_data_tl_provide:nn { class_SemantexVariable } { symbol } -\g_semantex_data_tl_provide:nn { semantexvariable } { argdots } -\g_semantex_data_tl_set:nnn { semantexvariable } { argdots } {\dots} +\semantex_data_seq_provide:nn { class_SemantexVariable } { commands_sequence } -\g_semantex_data_tl_provide:nn { semantexvariable } { symbol } +\semantex_data_bool_provide:nn { class_SemantexVariable } { uppergrading } +\semantex_data_bool_set_true:nn { class_SemantexVariable } { uppergrading } -\g_semantex_data_seq_provide:nn { semantexvariable } { commands_sequence } +\semantex_data_bool_provide:nn { class_SemantexVariable } { output } +\semantex_data_tl_provide:nn { class_SemantexVariable } { outputoptions } -\g_semantex_data_bool_provide:nn { semantexvariable } { upper_grading } -\g_semantex_data_bool_set_true:nn { semantexvariable } { upper_grading } +\semantex_data_bool_provide:nn { class_SemantexVariable } { nextupperwithsep } +\semantex_data_bool_provide:nn { class_SemantexVariable } { nextlowerwithsep } -\g_semantex_data_bool_provide:nn { semantexvariable } { output } +\semantex_data_int_provide:nn { class_SemantexVariable } { numberofupperindices } +\semantex_data_int_provide:nn { class_SemantexVariable } { numberoflowerindices } -\g_semantex_data_tl_provide:nn { semantexvariable } { output_options } +\semantex_data_bool_provide:nn { class_SemantexVariable } { par } +\semantex_data_bool_set_true:nn { class_SemantexVariable } { par } -\g_semantex_data_bool_provide:nn { semantexvariable } { first_arg } -\g_semantex_data_bool_set_true:nn { semantexvariable } { first_arg } +\semantex_data_bool_provide:nn { class_SemantexVariable } { flexpar } -\g_semantex_data_bool_provide:nn { semantexvariable } { first_upper } -\g_semantex_data_bool_set_true:nn { semantexvariable } { first_upper } +\semantex_data_tl_provide:nn { class_SemantexVariable } { parseoptions } -\g_semantex_data_bool_provide:nn { semantexvariable } { first_lower } -\g_semantex_data_bool_set_true:nn { semantexvariable } { first_lower } +\semantex_data_tl_provide:nn { class_SemantexVariable } { texclass } -\g_semantex_data_bool_provide:nn { semantexvariable } { par } -\g_semantex_data_bool_set_true:nn { semantexvariable } { par } +\semantex_data_bool_provide:nn { class_SemantexVariable } { leftargument } -\g_semantex_data_bool_provide:nn { semantexvariable } { rightreturnbeforerender } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upperdots } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upperslot } -\g_semantex_data_tl_provide:nn { semantexvariable } { parseoptions } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerdots } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerslot } -\g_semantex_data_tl_provide:nn { semantexvariable } { texclass } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftdots } +\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftslot } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftdots } +\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftslot } -%\tl_set:Nn\g_objectmath_semantexvariable_upper_index { hej } -%\tl_set:Nn \g_semantexvariable_output { semantexvariable } -%\bool_new:N \g_semantexvariable_output_if_provided -%\bool_set_true:N \g_semantexvariable_output_if_provided +%\tl_set:Nn\g_objectmath_SemantexVariable_upper { hej } +%\tl_set:Nn \SemantexVariable_output { class_SemantexVariable } +%\bool_new:N \SemantexVariable_output_if_provided +%\bool_set_true:N \SemantexVariable_output_if_provided -\newvariableclass{semantexvariable}[ - %parent=semantexvariable, +\semantex_new_variable_class:Nw \SemantexVariable [ + %parent=SemantexVariable, + output=\SemantexVariable, + ifoutput=false, symbol=, - gradingpos=upper, + gradingposition=upper, %upper=, %lower=, leftpar=(, @@ -3017,21 +4938,51 @@ rightspar=), sparsize=normal, %arg=, - ifoutput=false, - output=semantexvariable, - novaluekeys={ - {bullet}{d={\noexpand\semantexbullet}}, - {doublebullet}{d={\noexpand\semantexdoublebullet}}, + setupperdots=\dots, + setlowerdots=\dots, + setupperslot=\g_semantex_bullet, + setlowerslot=\g_semantex_bullet, + setupperleftdots=\dots, + setlowerleftdots=\dots, + setupperleftslot=\g_semantex_bullet, + setlowerleftslot=\g_semantex_bullet, + singlekeys={ {prime}{upper={\prime}}, {'}{prime}, {''}{prime,prime}, {'''}{prime,prime,prime}, - {ibullet}{i={\noexpand\semantexbullet}}, - {idoublebullet}{i={\noexpand\semantexdoublebullet}}, - {*}{bullet}, - {**}{doublebullet}, - {i*}{ibullet}, - {i**}{idoublebullet}, + {*}{sdegree=\g_semantex_bullet}, + {**}{sdegree=\g_semantex_double_bullet}, + {degree*}{degree=\g_semantex_bullet}, + {degree**}{degree=\g_semantex_double_bullet}, + {sdegree*}{sdegree=\g_semantex_bullet}, + {sdegree**}{sdegree=\g_semantex_double_bullet}, + {cdegree*}{cdegree=\g_semantex_bullet}, + {cdegree**}{cdegree=\g_semantex_double_bullet}, + {deg*}{deg=\g_semantex_bullet}, + {deg**}{deg=\g_semantex_double_bullet}, + {sdeg*}{sdeg=\g_semantex_bullet}, + {sdeg**}{sdeg=\g_semantex_double_bullet}, + {cdeg*}{cdeg=\g_semantex_bullet}, + {cdeg**}{cdeg=\g_semantex_double_bullet}, + {d*}{d=\g_semantex_bullet}, + {d**}{d=\g_semantex_double_bullet}, + {sd*}{sd=\g_semantex_bullet}, + {sd**}{sd=\g_semantex_double_bullet}, + {cd*}{cd=\g_semantex_bullet}, + {cd**}{cd=\g_semantex_double_bullet}, + {index*}{index=\g_semantex_bullet}, + {index**}{index=\g_semantex_double_bullet}, + {sindex*}{sindex=\g_semantex_bullet}, + {sindex**}{sindex=\g_semantex_double_bullet}, + {cindex*}{cindex=\g_semantex_bullet}, + {cindex**}{cindex=\g_semantex_double_bullet}, + {i*}{i=\g_semantex_bullet}, + {i**}{i=\g_semantex_double_bullet}, + {si*}{si=\g_semantex_bullet}, + {si**}{si=\g_semantex_double_bullet}, + {ci*}{ci=\g_semantex_bullet}, + {ci**}{ci=\g_semantex_double_bullet}, {smash}{command=\noexpand\smash}, % (widebar}{command=\noexpand\widebar},%For unknown reasons, this only seems to work when run as a primitive {tilde}{command=\noexpand\tilde}, @@ -3051,51 +5002,187 @@ {spar}{spar=}, {parse}{parse=}, {par}{ifpar=true}, + {neverpar}{ifpar=never}, {nopar}{ifpar=false}, + {clearupper}{clearupper=}, + {clearlower}{clearlower=}, + {clearupperleft}{clearupperleft=}, + {clearlowerleft}{clearlowerleft=}, + {clearcommand}{clearcommand=}, + {cleard}{cleard=}, + {cleardeg}{cleardeg=}, + {cleardegree}{cleardegree=}, + {cleari}{cleari=}, + {clearindex}{clearindex=}, + {upperdots}{upperdots=}, + {upper...}{upperdots=}, + {upperslot}{upperslot=}, + {upper-}{upperslot=}, + {lowerdots}{lowerdots=}, + {lower...}{lowerdots=}, + {lowerslot}{lowerslot=}, + {lower-}{lowerslot=}, + {upperleftdots}{upperleftdots=}, + {upperleft...}{upperleftdots=}, + {upperleftslot}{upperleftslot=}, + {upperleft-}{upperleftslot=}, + {lowerleftdots}{lowerleftdots=}, + {lowerleft...}{lowerleftdots=}, + {lowerleftslot}{lowerleftslot=}, + {lowerleft-}{lowerleftslot=}, + {idots}{idots=}, + {indexdots}{indexdots=}, + {islot}{islot=}, + {indexslot}{indexslot=}, + {i...}{idots=}, + {index...}{indexdots=}, + {i-}{islot=}, + {index-}{indexslot=}, + {ddots}{ddots=}, + {degdots}{degdots=}, + {degreedots}{degreedots=}, + {dslot}{dslot=}, + {degslot}{degslot=}, + {degreeslot}{degreeslot=}, + {d...}{ddots=}, + {deg...}{degdots=}, + {degree...}{degreedots=}, + {d-}{dslot=}, + {deg-}{degslot=}, + {degree-}{degreeslot=}, + {cupperdots}{cupperdots=}, + {cupper...}{cupperdots=}, + {cupperslot}{cupperslot=}, + {cupper-}{cupperslot=}, + {clowerdots}{clowerdots=}, + {clower...}{clowerdots=}, + {clowerslot}{clowerslot=}, + {clower-}{clowerslot=}, + {cupperleftdots}{cupperleftdots=}, + {cupperleft...}{cupperleftdots=}, + {cupperleftslot}{cupperleftslot=}, + {cupperleft-}{cupperleftslot=}, + {clowerleftdots}{clowerleftdots=}, + {clowerleft...}{clowerleftdots=}, + {clowerleftslot}{clowerleftslot=}, + {clowerleft-}{clowerleftslot=}, + {cidots}{cidots=}, + {cindexdots}{cindexdots=}, + {cislot}{cislot=}, + {cindexslot}{cindexslot=}, + {ci...}{cidots=}, + {cindex...}{cindexdots=}, + {ci-}{cislot=}, + {cindex-}{cindexslot=}, + {cddots}{cddots=}, + {cdegdots}{cdegdots=}, + {cdegreedots}{cdegreedots=}, + {cdslot}{cdslot=}, + {cdegslot}{cdegslot=}, + {cdegreeslot}{cdegreeslot=}, + {cd...}{cddots=}, + {cdeg...}{cdegdots=}, + {cdegree...}{cdegreedots=}, + {cd-}{cdslot=}, + {cdeg-}{cdegslot=}, + {cdegree-}{cdegreeslot=}, + {supperdots}{supperdots=}, + {supper...}{supperdots=}, + {supperslot}{supperslot=}, + {supper-}{supperslot=}, + {slowerdots}{slowerdots=}, + {slower...}{slowerdots=}, + {slowerslot}{slowerslot=}, + {slower-}{slowerslot=}, + {supperleftdots}{supperleftdots=}, + {supperleft...}{supperleftdots=}, + {supperleftslot}{supperleftslot=}, + {supperleft-}{supperleftslot=}, + {slowerleftdots}{slowerleftdots=}, + {slowerleft...}{slowerleftdots=}, + {slowerleftslot}{slowerleftslot=}, + {slowerleft-}{slowerleftslot=}, + {sidots}{sidots=}, + {sindexdots}{sindexdots=}, + {sislot}{sislot=}, + {sindexslot}{sindexslot=}, + {si...}{sidots=}, + {sindex...}{sindexdots=}, + {si-}{sislot=}, + {sindex-}{sindexslot=}, + {sddots}{sddots=}, + {sdegdots}{sdegdots=}, + {sdegreedots}{sdegreedots=}, + {sdslot}{sdslot=}, + {sdegslot}{sdegslot=}, + {sdegreeslot}{sdegreeslot=}, + {sd...}{sddots=}, + {sdeg...}{sdegdots=}, + {sdegree...}{sdegreedots=}, + {sd-}{sdslot=}, + {sdeg-}{sdegslot=}, + {sdegree-}{sdegreeslot=}, + {...}{sidots=}, + {-}{sislot=}, % The following four commands do not work due to expansion issues: % {useargwithkeyval}{useargwithkeyval=}, % {argwithkeyval}{ % valuekeys={ -% {arg}{argwithkeyval={\noexpand\l_semantex_key_value_temp}}, +% {arg}{argwithkeyval={\noexpand\l__semantex_key_value_temp}}, % }, % }, -% {argwithnovaluekeys}{ +% {argwithsinglekeys}{ % valuekeys={ -% {arg}{argwithnovaluekeys={\noexpand\l_semantex_key_value_temp}}, +% {arg}{argwithsinglekeys={\noexpand\l__semantex_key_value_temp}}, % }, % }, % {argwithoutkeyval}{ % valuekeys={ -% {arg}{argwithoutkeyval={\noexpand\l_semantex_key_value_temp}}, +% {arg}{argwithoutkeyval={\noexpand\l__semantex_key_value_temp}}, % }, % }, -% {argwithonenovaluekey}{ +% {argwithonesinglekey}{ % valuekeys={ -% {arg}{argwithonenovaluekey={\noexpand\l_semantex_key_value_temp}}, +% {arg}{argwithonesinglekey={\noexpand\l__semantex_key_value_temp}}, % }, % }, }, valuekeys={ - {default}{si={#1}}, + {default}{sindex={#1}}, % {arg}{argwithkeyval={#1}}, - {arg}{argwithnovaluekeys={#1}}, - {degreedefault}{sd={#1}}, - {parseoptions}{ - execute={ - \semantexdataputright{parseoptions}{#1} - }, - }, + {arg}{argwithsinglekeys={#1}}, + {degreedefault}{sdegree={#1}}, + {*withothersep}{degreewithothersep={#1}{\g_semantex_bullet}}, + {**withothersep}{degreewithothersep={#1}{\g_semantex_double_bullet}}, + {degree*withothersep}{degreewithothersep={#1}{\g_semantex_bullet}}, + {degree**withothersep}{degreewithothersep={#1}{\g_semantex_double_bullet}}, + {deg*withothersep}{degwithothersep={#1}{\g_semantex_bullet}}, + {deg**withothersep}{degwithothersep={#1}{\g_semantex_double_bullet}}, + {d*withothersep}{dwithothersep={#1}{\g_semantex_bullet}}, + {d**withothersep}{dwithothersep={#1}{\g_semantex_double_bullet}}, + {index*withothersep}{indexwithothersep={#1}{\g_semantex_bullet}}, + {index**withothersep}{indexwithothersep={#1}{\g_semantex_double_bullet}}, + {i*withothersep}{iwithothersep={#1}{\g_semantex_bullet}}, + {i**withothersep}{iwithothersep={#1}{\g_semantex_double_bullet}}, }, -% argwithnovaluekeys, +% argwithsinglekeys, argvaluekeys={ - {default}{standardsep={#1}}, + {default}{s={#1}}, }, - argnovaluekeys={ + argsinglekeys={ {slot}{slot=}, {-}{slot=}, - {*}{slot=}, +% {*}{slot=}, % would be confusing since * does not correspond to slot in the indices {...}{dots=}, }, %command=, % useargwithkeyval, -]
\ No newline at end of file +] + +\cs_set_eq:NN\__semantex_old_version_of_semantex_new_object_of_class_SemantexVariable:Nw \__semantex_new_object_of_class_SemantexVariable:Nw + +\cs_set:Npn \__semantex_new_object_of_class_SemantexVariable:Nw#1 +{ + \msg_error:nnn { semantex } { created_a_SemantexVariable } { #1 } + \__semantex_old_version_of_semantex_new_object_of_class_SemantexVariable:Nw #1 +}
\ No newline at end of file |