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