diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/expl3/l3keys.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/expl3/l3keys.sty | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/expl3/l3keys.sty b/Master/texmf-dist/tex/latex/expl3/l3keys.sty new file mode 100644 index 00000000000..7af3a864b83 --- /dev/null +++ b/Master/texmf-dist/tex/latex/expl3/l3keys.sty @@ -0,0 +1,494 @@ +%% +%% This is file `l3keys.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% l3keys.dtx (with options: `package') +%% +%% +%% EXPERIMENTAL CODE +%% +%% Do not distribute this file without also distributing the +%% source files specified above. +%% +%% Do not distribute a modified version of this file. +%% +%% +%% File: l3keys.dtx Copyright (C) 2009 LaTeX3 project +%% +%% It may be distributed and/or modified under the conditions of the +%% LaTeX Project Public License (LPPL), either version 1.3c of this +%% license or (at your option) any later version. The latest version +%% of this license is in the file +%% +%% http://www.latex-project.org/lppl.txt +%% +%% This file is part of the ``expl3 bundle'' (The Work in LPPL) +%% and all files in that bundle must be distributed together. +%% +%% The released version of this bundle is available from CTAN. +%% +%% ----------------------------------------------------------------------- +%% +%% The development version of the bundle can be found at +%% +%% http://www.latex-project.org/svnroot/experimental/trunk/ +%% +%% for those people who are interested. +%% +%%%%%%%%%%% +%% NOTE: %% +%%%%%%%%%%% +%% +%% Snapshots taken from the repository represent work in progress and may +%% not work or may contain conflicting material! We therefore ask +%% people _not_ to put them into distributions, archives, etc. without +%% prior consultation with the LaTeX Project Team. +%% +%% ----------------------------------------------------------------------- +\RequirePackage{l3names} +\GetIdInfo$Id: l3keys.dtx 1441 2009-08-05 19:23:23Z joseph $ + {L3 Experimental key-value support} +\ProvidesExplPackage + {\filename}{\filedate}{\fileversion}{\filedescription} +\package_check_loaded_expl: +\tl_new:Nn \c_keys_root_tl { keys~>~ } +\tl_new:Nn \c_keys_properties_root_tl { keys_properties } +\tl_new:Nn \c_keys_value_forbidden_tl { forbidden } +\tl_new:Nn \c_keys_value_required_tl { required } +\int_new:N \l_keys_choice_int +\tl_new:N \l_keys_choice_tl +\tl_new:N \l_keys_key_tl +\tl_new:N \l_keys_path_tl +\tl_new:N \l_keys_property_tl +\tl_new:N \l_keys_module_tl +\seq_new:N \l_keys_nesting_seq +\tl_new:Nn \l_keys_nesting_tl { none } +\bool_new:N \l_keys_no_value_bool +\toks_new:N \l_keys_value_toks +\quark_new:N \q_keys_stop +\cs_new:Npn \keys_arguments_tidy:w #1 \q_keys_stop { } +\cs_new_nopar:Nn \keys_bool_set:N { + \keys_cmd_set:nNx { \l_keys_path_tl / true } 1 { + \exp_not:c { bool_ \keys_variable_get_scope:N #1 set_true:N } + \exp_not:N #1 + } + \keys_cmd_set:nNx { \l_keys_path_tl / false } 1 { + \exp_not:N \use:c + { bool_ \keys_variable_get_scope:N #1 set_false:N } + \exp_not:N #1 + } + \keys_bool_set_aux:N #1 +} +\cs_new_nopar:Nn \keys_bool_set_inverse:N { + \keys_cmd_set:nNx { \l_keys_path_tl / true } 1 { + \exp_not:c { bool_ \keys_variable_get_scope:N #1 set_false:N } + \exp_not:N #1 + } + \keys_cmd_set:nNx { \l_keys_path_tl / false } 1 { + \exp_not:c { bool_ \keys_variable_get_scope:N #1 set_true:N } + \exp_not:N #1 + } + \keys_bool_set_aux:N #1 +} +\cs_new_nopar:Nn \keys_bool_set_aux:N { + \keys_choice_make: + \cs_if_exist:NF #1 { + \bool_new:N #1 + } + \keys_default_set:n { true } +} +\cs_new_nopar:Nn \keys_choice_find:n { + \keys_execute_aux:nn { \l_keys_path_tl / #1 } { + \keys_execute_aux:nn { \l_keys_path_tl / unknown } { } + } +} +\cs_new_nopar:Nn \keys_choice_make: { + \keys_cmd_set:nNn { \l_keys_path_tl } 1 { + \keys_choice_find:n {##1} + } + \keys_cmd_set:nNn { \l_keys_path_tl / unknown } 1 { + \msg_kernel_error:nxx { key-choice-unknown } { \l_keys_path_tl } + {##1} + } +} +\cs_new:Nn \keys_choices_generate:nx { + \keys_choice_make: + \int_zero:N \l_keys_choice_int + \cs_set_nopar:Nn \keys_choices_generate_aux:n { + \int_incr:N \l_keys_choice_int + \keys_cmd_set:nNx { \l_keys_path_tl / ##1 } 1 { + \exp_not:n { \tl_set:Nn \l_keys_choice_tl } {##1} + \exp_not:n { \int_set:Nn \l_keys_choice_int } + { \int_use:N \l_keys_choice_int } + #2 + } + } + \clist_map_function:nN {#1} \keys_choices_generate_aux:n +} +\cs_new_nopar:Nn \keys_choices_generate_aux:n { } +\cs_new:Nn \keys_cmd_set:nNn { + \keys_cmd_set_aux:nN {#1} #2 + \cs_generate_from_arg_count:cNnn { \c_keys_root_tl #1 .cmd:w } + \cs_set:Npn #2 { #3 \keys_arguments_tidy:w } +} +\cs_new:Nn \keys_cmd_set:nNx { + \keys_cmd_set_aux:nN {#1} #2 + \cs_generate_from_arg_count:cNnn { \c_keys_root_tl #1 .cmd:w } + \cs_set:Npx #2 { #3 \exp_not:N \keys_arguments_tidy:w } +} +\cs_new_nopar:Nn \keys_cmd_set_aux:nN { + \keys_property_undefine:n { #1 .default_tl } + \num_set:cn { \c_keys_root_tl #1 .args_num } {#2} + \tl_set:cn { \c_keys_root_tl #1 .req_tl } { } +} +\cs_new:Nn \keys_default_set:n { + \tl_set:cn { \c_keys_root_tl \l_keys_path_tl .default_tl } {#1} +} +\cs_generate_variant:Nn \keys_default_set:n { V } +\cs_new:Nn \keys_define:nn { + \tl_set:Nn \l_keys_module_tl {#1} + \cs_set_eq:NN \KV_key_no_value_elt:n \keys_define_elt:n + \cs_set_eq:NN \KV_key_value_elt:nn \keys_define_elt:nn + \seq_push:NV \l_keys_nesting_seq \l_keys_nesting_tl + \tl_set:Nn \l_keys_nesting_tl { define } + \KV_parse_no_space_removal_no_sanitize:n {#2} + \seq_pop:NN \l_keys_nesting_seq \l_keys_nesting_tl + \cs_set_eq:Nc \KV_key_no_value_elt:n + { keys_ \l_keys_nesting_tl _elt:n } + \cs_set_eq:Nc \KV_key_value_elt:nn + { keys_ \l_keys_nesting_tl _elt:nn } +} +\cs_new_nopar:Nn \keys_define_elt:n { + \bool_set_true:N \l_keys_no_value_bool + \keys_define_elt_aux:nn {#1} { } +} +\cs_new:Nn \keys_define_elt:nn { + \bool_set_false:N \l_keys_no_value_bool + \keys_define_elt_aux:nn {#1} {#2} +} +\cs_new:Nn \keys_define_elt_aux:nn { + \keys_property_find:n {#1} + \cs_set_eq:Nc \keys_tmp:w + { \c_keys_properties_root_tl \l_keys_property_tl } + \cs_if_exist:NTF \keys_tmp:w { + \keys_define_key:n {#2} + }{ + \msg_kernel_error:nx { key-property-unknown } + { \l_keys_property_tl } + } +} +\cs_new:Nn \keys_define_key:n { + \bool_if:NTF \l_keys_no_value_bool { + \intexpr_compare:nTF { + \exp_args:Nc \cs_get_arg_count_from_signature:N + { \l_keys_property_tl } = \c_zero + } { + \keys_tmp:w \q_keys_stop + }{ + \msg_kernel_error:nx { key-property-value-required } + { \l_keys_property_tl } + } + }{ + \intexpr_compare:nTF { + \exp_args:Nc \cs_get_arg_count_from_signature:N + { \l_keys_property_tl } = \c_one + } { + \keys_tmp:w {#1} \q_keys_stop + }{ + \keys_tmp:w #1 { } { } { } { } { } { } { } { } { } \q_keys_stop + } + } +} +\cs_new_nopar:Nn \keys_execute: { + \keys_execute_aux:nn { \l_keys_path_tl } { + \keys_execute_unknown: + } +} +\cs_new_nopar:Nn \keys_execute_unknown: { + \keys_execute_aux:nn { \l_keys_module_tl / unknown } { + \msg_kernel_error:nx { key-unknown } { \l_keys_path_tl } + } +} +\cs_new_nopar:Nn \keys_execute_aux:nn { + \cs_set_eq:Nc \keys_tmp:w { \c_keys_root_tl #1 .cmd:w } + \cs_if_exist:NTF \keys_tmp:w { + \intexpr_compare:nTF { + \num_use:c { \c_keys_root_tl #1 .args_num } = \c_one + } { + \exp_args:NV \keys_tmp:w \l_keys_value_toks \q_keys_stop + }{ + \exp_after:wN \keys_tmp:w \toks_use:N \l_keys_value_toks + { } { } { } { } { } { } { } { } { } \q_keys_stop + } + }{ + #2 + } +} +\cs_new_nopar:Npn \keys_if_value_requirement:nTF #1 { + \tl_if_eq:ccTF { c_keys_value_ #1 _tl } { + \c_keys_root_tl \l_keys_path_tl .req_tl + } +} +\cs_new:Nn \keys_initial_value:n { + \toks_set:Nn \l_keys_value_toks {#1} + \keys_execute_aux:nn { \l_keys_path_tl } { + \msg_kernel_error:nx { key-initial-without-code } + { \l_keys_path_tl } + } +} +\cs_generate_variant:Nn \keys_initial_value:n { V } +\cs_new_nopar:Nn \keys_meta_make:n { + \keys_cmd_set:nNx { \l_keys_path_tl } 1 { + \exp_not:N \keys_set:nn { \l_keys_module_tl } {#1} + } +} +\cs_new_nopar:Nn \keys_property_find:n { + \tl_set:Nx \l_keys_path_tl { \l_keys_module_tl / } + \tl_if_in:nnTF {#1} {.} { + \keys_property_find_aux:n {#1} + }{ + \msg_kernel_error:nx { key-no-property } { #1 } + } +} +\cs_new_nopar:Nn \keys_property_find_aux:n { + \keys_property_find_aux:w #1 \q_stop +} +\cs_new_nopar:Npn \keys_property_find_aux:w #1 . #2 \q_stop { + \tl_if_in:nnTF {#2} {.} { + \tl_set:Nx \l_keys_path_tl { + \l_keys_path_tl \tl_to_str:n {#1} . + } + \keys_property_find_aux:w #2 \q_stop + }{ + \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl \tl_to_str:n {#1} } + \tl_set:Nn \l_keys_property_tl { . #2 } + } +} +\cs_new_nopar:Nn \keys_property_new:nn { + \cs_new:cn { \c_keys_properties_root_tl #1 } + { #2 \keys_arguments_tidy:w } +} +\cs_new_nopar:Nn \keys_property_undefine:n { + \cs_set_eq:cN { \c_keys_root_tl #1 } \c_undefined +} +\cs_new:Nn \keys_set:nn { + \tl_set:Nn \l_keys_module_tl {#1} + \cs_set_eq:NN \KV_key_no_value_elt:n \keys_set_elt:n + \cs_set_eq:NN \KV_key_value_elt:nn \keys_set_elt:nn + \seq_push:NV \l_keys_nesting_seq \l_keys_nesting_tl + \tl_set:Nn \l_keys_nesting_tl { set } + \KV_parse_space_removal_sanitize:n {#2} + \seq_pop:NN \l_keys_nesting_seq \l_keys_nesting_tl + \cs_set_eq:Nc \KV_key_no_value_elt:n + { keys_ \l_keys_nesting_tl _elt:n } + \cs_set_eq:Nc \KV_key_value_elt:nn + { keys_ \l_keys_nesting_tl _elt:nn } +} +\cs_generate_variant:Nn \keys_set:nn { nV, nv } +\cs_new_nopar:Nn \keys_set_elt:n { + \bool_set_true:N \l_keys_no_value_bool + \keys_set_elt_aux:nn {#1} { } +} +\cs_new:Nn \keys_set_elt:nn { + \bool_set_false:N \l_keys_no_value_bool + \keys_set_elt_aux:nn {#1} {#2} +} +\cs_new:Nn \keys_set_elt_aux:nn { + \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} + \keys_if_value_requirement:nTF { required } { + \bool_if:NTF \l_keys_no_value_bool { + \msg_kernel_error:nx { key~value~required } { \l_keys_path_tl } + }{ + \keys_set_elt_aux: + } + }{ + \keys_set_elt_aux: + } +} +\cs_new_nopar:Nn \keys_set_elt_aux: { + \keys_if_value_requirement:nTF { forbidden } { + \bool_if:NTF \l_keys_no_value_bool { + \keys_execute: + }{ + \msg_kernel_error:nxx { key-value-forbidden } { \l_keys_path_tl } + { \toks_use:N \l_keys_value_toks } + } + }{ + \keys_execute: + } +} +\cs_new_nopar:Nn \keys_show:nn { + \cs_show:c { \c_keys_root_tl #1 / \tl_to_str:n {#2} .cmd:w } +} +\cs_new:Npn \keys_tmp:w {} +\cs_new:Nn \keys_value_or_default:n { + \toks_set:Nn \l_keys_value_toks {#1} + \bool_if:NT \l_keys_no_value_bool { + \cs_if_exist:cT { \c_keys_root_tl \l_keys_path_tl .default_tl } { + \toks_set:Nv \l_keys_value_toks { + \c_keys_root_tl \l_keys_path_tl .default_tl + } + } + } +} +\cs_new_nopar:Nn \keys_value_requirement:n { + \tl_set_eq:cc { \c_keys_root_tl \l_keys_path_tl .req_tl } + { c_keys_value_ #1 _tl } +} +\group_begin: + \char_set_lccode:nn {`\&} {`\g} + \char_make_other:N \& +\tl_to_lowercase:n { + \group_end: + \cs_new_nopar:Nn \keys_variable_get_scope:N { + \exp_last_unbraced:Nf \keys_variable_get_scope_aux:w + { \cs_to_str:N #1 \exp_stop_f: \q_nil } + } + \cs_new_nopar:Npn \keys_variable_get_scope_aux:w #1#2 \q_nil { + \token_if_eq_meaning:NNT & #1 {g} + } +} +\group_begin: + \char_set_lccode:nn {`\&} {`\_} + \char_make_other:N \& +\tl_to_lowercase:n { + \group_end: + \cs_new_nopar:Nn \keys_variable_get_type:N { + \exp_after:wN \keys_variable_get_type_aux:w + \token_to_str:N #1 & a \q_nil + } + \cs_new_nopar:Npn \keys_variable_get_type_aux:w #1 & #2#3 \q_nil { + \token_if_eq_meaning:NNTF a #2 { + #1 + }{ + \keys_variable_get_type_aux:w #2#3 \q_nil + } + } +} +\cs_new_nopar:Nn \keys_variable_set:NN { + \cs_if_exist:cF { + \keys_variable_get_type:N #2 _ + \keys_variable_get_scope:N #2 set:N #1 + } { + \msg_kernel_error:nxx { key-no-set-function } { + \exp_not:c { + \keys_variable_get_type:N #2 _ + \keys_variable_get_scope:N #2 set:N #1 + } + } {#2} + } + \cs_if_exist:NF #2 { + \use:c { \keys_variable_get_type:N #2 _new:N } #2 + } + \keys_cmd_set:nNx { \l_keys_path_tl } 1 { + \exp_not:c { + \keys_variable_get_type:N #2 _ + \keys_variable_get_scope:N #2 set:N #1 + } \exp_not:N #2 {##1} + } +} +\keys_property_new:nn { .bool:N } { + \keys_bool_set:N #1 +} +\keys_property_new:nn { .choice: } { + \keys_choice_make: +} +\keys_property_new:nn { .code:n } { + \keys_cmd_set:nNn { \l_keys_path_tl } 1 {#1} +} +\keys_property_new:nn { .code:Nn } { + \keys_cmd_set:nNn { \l_keys_path_tl } #1 {#2} +} +\keys_property_new:nn { .code:x } { + \keys_cmd_set:nNx { \l_keys_path_tl } 1 {#1} +} +\keys_property_new:nn { .code:Nx } { + \keys_cmd_set:nNx { \l_keys_path_tl } #1 {#2} +} +\keys_property_new:nn { .default:n } { + \keys_default_set:n {#1} +} +\keys_property_new:nn { .default:V } { + \keys_default_set:V #1 +} +\keys_property_new:nn { .function:N } { + \keys_cmd_set:nNn { \l_keys_path_tl } 1 { + \cs_set:Nn #1 {##1} + } + \cs_if_free:NT #1 { + \cs_set:Nn #1 { } + } +} +\keys_property_new:nn { .generate_choices:nn } { + \keys_choices_generate:nx {#1} { \exp_not:n {#2} } +} +\keys_property_new:nn { .generate_choices:nx } { + \keys_choices_generate:nx {#1} {#2} +} +\keys_property_new:nn { .initial:n } { + \keys_initial_value:n {#1} +} +\keys_property_new:nn { .initial:V } { + \keys_initial_value:V #1 +} +\keys_property_new:nn { .meta:n } { + \keys_meta_make:n {#1} +} +\keys_property_new:nn { .set:N } { + \keys_variable_set:NN n #1 +} +\keys_property_new:nn { .set_x:N } { + \keys_variable_set:NN x #1 +} +\keys_property_new:nn { .value_forbidden: } { + \keys_value_requirement:n { forbidden } +} +\keys_property_new:nn { .value_required: } { + \keys_value_requirement:n { required } +} +\msg_kernel_new:nn { key-choice-unknown } {% + Choice `#2' unknown for key `#1':\\% + the key is being ignored.% +} +\msg_kernel_new:nn { key-initial-without-code } {% + An initial value cannot be set for key `#1': + the key has not yet been created.% +} +\msg_kernel_new:nn { key-unknown } {% + The key `#1' is unknown and is being ignored.% +} +\msg_kernel_new:nn { key-value-forbidden }{% + The key `#1' cannot taken a value:\\% + the given input `#2' is being ignored.% +} +\msg_kernel_new:nn { key~value~required } {% + The key `#1' requires a value\\% + and is being ignored.% +} +\msg_kernel_new:nn { key-no-property } {% + No property given in definition of key `#1'.% +} +\msg_kernel_new:nnn { key-no-set-function } {% + There is no function #1\\% + for setting variable \exp_not:N #2.% +}{% + LaTeX can only `set' variables which have a function\\% + \exp_not:N \<var>_(g)set:Nn, or in some cases + \exp_not:N \<var>_(g)set:Nx.\\% + You have asked to `set' some other kind of variable.% + +} +\msg_kernel_new:nn { key-property-unknown } {% + The key property `#1' is unknown.% +} +\msg_kernel_new:nn { key-property-value-required } {% + The property `#1' requires a value\\% + and is being ignored.% +} +%% +%% +%% End of file `l3keys.sty'. |