summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/l3kernel/l3keys.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/l3kernel/l3keys.sty')
-rw-r--r--Master/texmf-dist/tex/latex/l3kernel/l3keys.sty202
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 }