diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3kernel/l3keys.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/l3kernel/l3keys.sty | 202 |
1 files changed, 147 insertions, 55 deletions
diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty b/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty index ab3bf0dcd66..a7a262f3020 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty @@ -46,7 +46,7 @@ %% %% ----------------------------------------------------------------------- \RequirePackage{l3bootstrap} -\GetIdInfo$Id: l3keys.dtx 4544 2013-07-12 07:14:52Z joseph $ +\GetIdInfo$Id: l3keys.dtx 4581 2013-07-28 08:38:50Z joseph $ {L3 Experimental key-value interfaces} \ProvidesExplPackage {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription} @@ -160,19 +160,23 @@ two~equals~signs~not~separated~by~a~comma. } \tl_const:Nn \c__keys_code_root_tl { key~code~>~ } -\tl_const:Nn \c__keys_vars_root_tl { key~var~>~ } +\tl_const:Nn \c__keys_info_root_tl { key~info~>~ } \tl_const:Nn \c__keys_props_root_tl { key~prop~>~ } -\tl_const:Nn \c__keys_value_forbidden_tl { forbidden } -\tl_const:Nn \c__keys_value_required_tl { required } \int_new:N \l_keys_choice_int \tl_new:N \l_keys_choice_tl +\clist_new:N \l__keys_groups_clist \tl_new:N \l_keys_key_tl \tl_new:N \l__keys_module_tl \bool_new:N \l__keys_no_value_bool +\bool_new:N \l__keys_only_known_bool \tl_new:N \l_keys_path_tl \tl_new:N \l__keys_property_tl -\tl_new:N \l__keys_unknown_clist +\bool_new:N \l__keys_selective_bool +\bool_new:N \l__keys_filtered_bool +\seq_new:N \l__keys_selective_seq +\tl_new:N \l__keys_unused_clist \tl_new:N \l_keys_value_tl +\bool_new:N \l__keys_tmp_bool \cs_new_protected:Npn \keys_define:nn { \__keys_define:onn \l__keys_module_tl } \cs_new_protected:Npn \__keys_define:nnn #1#2#3 @@ -302,18 +306,24 @@ } \cs_new_protected:Npn \__keys_cmd_set:nn #1#2 { - \__keys_cmd_set:n {#1} + \prop_clear_new:c { \c__keys_info_root_tl #1 } \cs_set:cpn { \c__keys_code_root_tl #1 } ##1 {#2} } \cs_generate_variant:Nn \__keys_cmd_set:nn { nx , Vn , Vo } -\cs_new_protected:Npn \__keys_cmd_set:n #1 +\cs_new_protected:Npn \__keys_default_set:n #1 { - \tl_clear_new:c { \c__keys_vars_root_tl #1 .default } - \tl_set:cn { \c__keys_vars_root_tl #1 .default } { \q_no_value } - \tl_clear_new:c { \c__keys_vars_root_tl #1 .req } + \prop_if_exist:cT { \c__keys_info_root_tl \l_keys_path_tl } + { \prop_put:cnn { \c__keys_info_root_tl \l_keys_path_tl } { default } {#1} } + } +\cs_new_protected:Npn \__keys_groups_set:n #1 + { + \prop_if_exist:cT { \c__keys_info_root_tl \l_keys_path_tl } + { + \clist_set:Nn \l__keys_groups_clist {#1} + \prop_put:cnV { \c__keys_info_root_tl \l_keys_path_tl } + { groups } \l__keys_groups_clist + } } -\cs_new_protected:Npn \__keys_default_set:n #1 - { \tl_set:cn { \c__keys_vars_root_tl \l_keys_path_tl .default } {#1} } \cs_new_protected:Npn \__keys_initialise:n #1 { \exp_after:wN \__keys_initialise:wn \l_keys_path_tl \q_stop {#1} } \cs_new_protected:Npn \__keys_initialise:wn #1 / #2 \q_stop #3 @@ -355,9 +365,12 @@ } \cs_new_protected:Npn \__keys_value_requirement:n #1 { - \tl_set_eq:cc - { \c__keys_vars_root_tl \l_keys_path_tl .req } - { c__keys_value_ #1 _tl } + \prop_if_exist:cT { \c__keys_info_root_tl \l_keys_path_tl } + { + \prop_remove:cn { \c__keys_info_root_tl \l_keys_path_tl } { required } + \prop_remove:cn { \c__keys_info_root_tl \l_keys_path_tl } { forbidden } + \prop_put:cnn { \c__keys_info_root_tl \l_keys_path_tl } {#1} { true } + } } \cs_new_protected:Npn \__keys_variable_set:NnnN #1#2#3#4 { @@ -426,6 +439,8 @@ { \__keys_variable_set:NnnN #1 { fp } { g } n } \cs_new_protected:cpn { \c__keys_props_root_tl .fp_gset:c } #1 { \__keys_variable_set:cnnN {#1} { fp } { g } n } +\cs_new_protected:cpn { \c__keys_props_root_tl .groups:n } #1 + { \__keys_groups_set:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .initial:n } #1 { \__keys_initialise:n {#1} } \cs_new_protected:cpn { \c__keys_props_root_tl .initial:V } #1 @@ -484,7 +499,7 @@ { \__keys_value_requirement:n { forbidden } } \cs_new_protected_nopar:cpn { \c__keys_props_root_tl .value_required: } { \__keys_value_requirement:n { required } } -\cs_new_protected:Npn \keys_set:nn +\cs_new_protected_nopar:Npn \keys_set:nn { \__keys_set:onn { \l__keys_module_tl } } \cs_new_protected:Npn \__keys_set:nnn #1#2#3 { @@ -494,20 +509,45 @@ } \cs_generate_variant:Nn \keys_set:nn { nV , nv , no } \cs_generate_variant:Nn \__keys_set:nnn { o } -\cs_new_protected:Npn \keys_set_known:nnN - { \__keys_set_known:onnN { \l__keys_module_tl } } -\cs_new_protected:Npn \__keys_set_known:nnnN #1#2#3#4 +\cs_new_protected:Npn \keys_set_known:nnN #1#2#3 { - \tl_set:Nx \l__keys_module_tl { \tl_to_str:n {#2} } - \clist_clear:N \l__keys_unknown_clist - \cs_set_eq:NN \__keys_execute_unknown: \__keys_execute_unknown_alt: - \keyval_parse:NNn \__keys_set_elt:n \__keys_set_elt:nn {#3} - \cs_set_eq:NN \__keys_execute_unknown: \__keys_execute_unknown_std: - \tl_set:Nn \l__keys_module_tl {#1} - \cs_set_eq:NN #4 \l__keys_unknown_clist + \clist_clear:N \l__keys_unused_clist + \keys_set_known:nn {#1} {#2} + \tl_set:Nx #3 { \exp_not:o { \l__keys_unused_clist } } } \cs_generate_variant:Nn \keys_set_known:nnN { nV , nv , no } -\cs_generate_variant:Nn \__keys_set_known:nnnN { o } +\cs_new_protected:Npn \keys_set_known:nn #1#2 + { + \bool_set_true:N \l__keys_only_known_bool + \keys_set:nn {#1} {#2} + \bool_set_false:N \l__keys_only_known_bool + } +\cs_generate_variant:Nn \keys_set_known:nn { nV , nv , no } +\cs_new_protected:Npn \keys_set_filter:nnnN #1#2#3#4 + { + \clist_clear:N \l__keys_unused_clist + \keys_set_filter:nnn {#1} {#2} {#3} + \tl_set:Nx #4 { \exp_not:o { \l__keys_unused_clist } } + } +\cs_generate_variant:Nn \keys_set_filter:nnnN { nnV , nnv , nno } +\cs_new_protected:Npn \keys_set_filter:nnn #1#2#3 + { + \bool_set_true:N \l__keys_selective_bool + \bool_set_true:N \l__keys_filtered_bool + \seq_set_from_clist:Nn \l__keys_selective_seq {#2} + \keys_set:nn {#1} {#3} + \bool_set_false:N \l__keys_selective_bool + } +\cs_generate_variant:Nn \keys_set_filter:nnn { nnV , nnv , nno } +\cs_new_protected:Npn \keys_set_groups:nnn #1#2#3 + { + \bool_set_true:N \l__keys_selective_bool + \bool_set_false:N \l__keys_filtered_bool + \seq_set_from_clist:Nn \l__keys_selective_seq {#2} + \keys_set:nn {#1} {#3} + \bool_set_false:N \l__keys_selective_bool + } +\cs_generate_variant:Nn \keys_set_groups:nnn { nnV , nnv , nno } \cs_new_protected:Npn \__keys_set_elt:n #1 { \bool_set_true:N \l__keys_no_value_bool @@ -523,6 +563,12 @@ \tl_set:Nx \l_keys_key_tl { \tl_to_str:n {#1} } \tl_set:Nx \l_keys_path_tl { \l__keys_module_tl / \l_keys_key_tl } \__keys_value_or_default:n {#2} + \bool_if:NTF \l__keys_selective_bool + { \__keys_set_elt_selective: } + { \__keys_set_elt_aux: } + } +\cs_new_protected_nopar:Npn \__keys_set_elt_aux: + { \bool_if:nTF { \__keys_if_value_p:n { required } && @@ -545,46 +591,83 @@ { \__keys_execute: } } } -\cs_new_protected:Npn \__keys_value_or_default:n #1 +\cs_new_protected_nopar:Npn \__keys_set_elt_selective: + { + \prop_if_exist:cTF { \c__keys_info_root_tl \l_keys_path_tl } + { + \prop_get:cnNTF { \c__keys_info_root_tl \l_keys_path_tl } + { groups } \l__keys_groups_clist + { \__keys_check_groups: } + { + \bool_if:NTF \l__keys_filtered_bool + { \__keys_set_elt_aux: } + { \__keys_store_unused: } + } + } + { + \bool_if:NTF \l__keys_filtered_bool + { \__keys_set_elt_aux: } + { \__keys_store_unused: } + } + } +\cs_new_protected_nopar:Npn \__keys_check_groups: { - \tl_set:Nn \l_keys_value_tl {#1} - \bool_if:NT \l__keys_no_value_bool + \bool_set_false:N \l__keys_tmp_bool + \seq_map_inline:Nn \l__keys_selective_seq { - \quark_if_no_value:cF { \c__keys_vars_root_tl \l_keys_path_tl .default } + \clist_map_inline:Nn \l__keys_groups_clist { - \cs_if_exist:cT { \c__keys_vars_root_tl \l_keys_path_tl .default } + \str_if_eq:nnT {##1} {####1} { - \tl_set_eq:Nc \l_keys_value_tl - { \c__keys_vars_root_tl \l_keys_path_tl .default } + \bool_set_true:N \l__keys_tmp_bool + \clist_map_break:n { \seq_map_break: } } } } + \bool_if:NTF \l__keys_tmp_bool + { + \bool_if:NTF \l__keys_filtered_bool + { \__keys_store_unused: } + { \__keys_set_elt_aux: } + } + { + \bool_if:NTF \l__keys_filtered_bool + { \__keys_set_elt_aux: } + { \__keys_store_unused: } + } + } +\cs_new_protected:Npn \__keys_value_or_default:n #1 + { + \bool_if:NTF \l__keys_no_value_bool + { + \prop_get:cnNF { \c__keys_info_root_tl \l_keys_path_tl } + { default } \l_keys_value_tl + { \tl_clear:N \l_keys_value_tl } + } + { \tl_set:Nn \l_keys_value_tl {#1} } } \prg_new_conditional:Npnn \__keys_if_value:n #1 { p } { - \tl_if_eq:ccTF { c__keys_value_ #1 _tl } - { \c__keys_vars_root_tl \l_keys_path_tl .req } - { \prg_return_true: } + \prop_if_exist:cTF { \c__keys_info_root_tl \l_keys_path_tl } + { + \prop_if_in:cnTF { \c__keys_info_root_tl \l_keys_path_tl } {#1} + { \prg_return_true: } + { \prg_return_false: } + } { \prg_return_false: } } \cs_new_protected_nopar:Npn \__keys_execute: { \__keys_execute:nn { \l_keys_path_tl } { \__keys_execute_unknown: } } \cs_new_protected_nopar:Npn \__keys_execute_unknown: { - \__keys_execute:nn { \l__keys_module_tl / unknown } + \bool_if:NTF \l__keys_only_known_bool + { \__keys_store_unused: } { - \__msg_kernel_error:nnxx { kernel } { key-unknown } - { \l_keys_path_tl } { \l__keys_module_tl } - } - } -\cs_new_eq:NN \__keys_execute_unknown_std: \__keys_execute_unknown: -\cs_new_protected_nopar:Npn \__keys_execute_unknown_alt: - { - \clist_put_right:Nx \l__keys_unknown_clist - { - \exp_not:o \l_keys_key_tl - \bool_if:NF \l__keys_no_value_bool - { = { \exp_not:o \l_keys_value_tl } } + \__keys_execute:nn { \l__keys_module_tl / unknown } + { + \__msg_kernel_error:nnxx { kernel } { key-unknown } + { \l_keys_path_tl } { \l__keys_module_tl } + } } } \cs_new:Npn \__keys_execute:nn #1#2 @@ -596,6 +679,15 @@ } {#2} } +\cs_new_protected_nopar:Npn \__keys_store_unused: + { + \clist_put_right:Nx \l__keys_unused_clist + { + \exp_not:o \l_keys_key_tl + \bool_if:NF \l__keys_no_value_bool + { = { \exp_not:o \l_keys_value_tl } } + } + } \cs_new:Npn \__keys_choice_find:n #1 { \__keys_execute:nn { \l_keys_path_tl / \tl_to_str:n {#1} } @@ -673,12 +765,12 @@ \cs_new_protected:Npn \__keys_choice_code_store:n #1 { \cs_if_exist:cF - { \c__keys_vars_root_tl \l_keys_path_tl .choice~code } + { \c__keys_info_root_tl \l_keys_path_tl .choice~code } { \tl_new:c - { \c__keys_vars_root_tl \l_keys_path_tl .choice~code } + { \c__keys_info_root_tl \l_keys_path_tl .choice~code } } - \tl_set:cn { \c__keys_vars_root_tl \l_keys_path_tl .choice~code } + \tl_set:cn { \c__keys_info_root_tl \l_keys_path_tl .choice~code } {#1} } \cs_generate_variant:Nn \__keys_choice_code_store:n { x } @@ -689,7 +781,7 @@ \cs_new_protected:Npn \__keys_choices_generate:n #1 { \cs_if_exist:cTF - { \c__keys_vars_root_tl \l_keys_path_tl .choice~code } + { \c__keys_info_root_tl \l_keys_path_tl .choice~code } { \__keys_choice_make: \int_zero:N \l_keys_choice_int @@ -709,7 +801,7 @@ \int_set:Nn \exp_not:N \l_keys_choice_int { \int_use:N \l_keys_choice_int } \exp_not:v - { \c__keys_vars_root_tl \l_keys_path_tl .choice~code } + { \c__keys_info_root_tl \l_keys_path_tl .choice~code } } } \__msg_kernel_new:nnnn { kernel } { generate-choices-before-code } |