diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/expl3/l3keys.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/expl3/l3keys.dtx | 268 |
1 files changed, 154 insertions, 114 deletions
diff --git a/Master/texmf-dist/source/latex/expl3/l3keys.dtx b/Master/texmf-dist/source/latex/expl3/l3keys.dtx index e11a6907042..dc5b77f5c9b 100644 --- a/Master/texmf-dist/source/latex/expl3/l3keys.dtx +++ b/Master/texmf-dist/source/latex/expl3/l3keys.dtx @@ -35,7 +35,7 @@ \RequirePackage{l3names} %</driver|package> %\fi -\GetIdInfo$Id: l3keys.dtx 1542 2009-09-17 07:38:53Z joseph $ +\GetIdInfo$Id: l3keys.dtx 1716 2009-11-06 08:56:23Z joseph $ {L3 Experimental key-value support} %\iffalse %<*driver> @@ -364,14 +364,18 @@ % \keys_define:nn { module } { % key .choice_code:n = { % You~gave~choice~``\l_keys_choice_tl'',~ -% which~is~in~position~\l_keys_choice_int -% \~in~the~list. +% which~is~in~position~ +% \int_use:N\l_keys_choice_int\space +% in~the~list. % }, % key .generate_choices:n = { % choice-a, choice-b, choice-c % } % } %\end{verbatim} +% Following common computing practice, \cs{l_keys_choice_int} starts +% from $0$ for the first choice. This means that it can be used +% directly with \cs{if_case:w} and so on. % %\begin{variable}{ % \l_keys_choice_tl| @@ -389,7 +393,7 @@ % defining sub-keys. %\begin{verbatim} % \keys_define:nn { module } { -% key choices:n, +% key .choice:n, % key / choice-a .code:n = code-a, % key / choice-b .code:n = code-b, % key / choice-c .code:n = code-c, @@ -567,11 +571,15 @@ % Separates <key> from <property>. %\end{function} % -%\begin{function}{\keys_property_new:nn} +%\begin{function}{ +% \keys_property_new:nn | +% \keys_property_new_arg:nn +%} % \begin{syntax} % "\keys_property_new:nn" \Arg{property} \Arg{code} % \end{syntax} -% Makes a new <property> expanding to <code> +% Makes a new <property> expanding to <code>. The \texttt{arg} +% version makes properties with one argument. %\end{function} % %\begin{function}{\keys_property_undefine:n} @@ -768,7 +776,7 @@ %\begin{macro}{\keys_bool_set:NN} % Boolean keys are really just choices, but all done by hand. % \begin{macrocode} -\cs_new_nopar:Nn \keys_bool_set:NN { +\cs_new_nopar:Npn \keys_bool_set:NN #1#2 { \keys_cmd_set:nx { \l_keys_path_tl / true } { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 @@ -791,7 +799,7 @@ % The code for making multiple choices is stored in a token list as there should % not be any |#| tokens. % \begin{macrocode} -\cs_new:Nn \keys_choice_code_store:x { +\cs_new:Npn \keys_choice_code_store:x #1 { \tl_set:cx { \c_keys_root_tl \l_keys_path_tl .choice_code_tl } {#1} } % \end{macrocode} @@ -802,7 +810,7 @@ % if that fails call the unknown key. That will exist, as it is created % when a choice is first made. So there is no need for any escape code. % \begin{macrocode} -\cs_new_nopar:Nn \keys_choice_find:n { +\cs_new_nopar:Npn \keys_choice_find:n #1 { \keys_execute_aux:nn { \l_keys_path_tl / #1 } { \keys_execute_aux:nn { \l_keys_path_tl / unknown } { } } @@ -814,13 +822,13 @@ % To make a choice from a key, two steps: set the code, and set the % unknown key. % \begin{macrocode} -\cs_new_nopar:Nn \keys_choice_make: { +\cs_new_nopar:Npn \keys_choice_make: { \keys_cmd_set:nn { \l_keys_path_tl } { \keys_choice_find:n {##1} } \keys_cmd_set:nn { \l_keys_path_tl / unknown } { - \msg_kernel_error:nxx { key-choice-unknown } { \l_keys_path_tl } - {##1} + \msg_kernel_error:nnxx { keys } { choice-unknown } + { \l_keys_path_tl } {##1} } } % \end{macrocode} @@ -831,7 +839,7 @@ % Creating multiple-choices means setting up the ``indicator'' code, % then applying whatever the user wanted. % \begin{macrocode} -\cs_new:Nn \keys_choices_generate:n { +\cs_new:Npn \keys_choices_generate:n #1 { \keys_choice_make: \int_zero:N \l_keys_choice_int \cs_if_exist:cTF { @@ -841,18 +849,19 @@ \c_keys_root_tl \l_keys_path_tl .choice_code_tl } }{ - \tl_clear:N \l_keys_choice_code_tl + \msg_kernel_error:nnx { keys } { generate-choices-before-code } + { \l_keys_path_tl } } \clist_map_function:nN {#1} \keys_choices_generate_aux:n } -\cs_new_nopar:Nn \keys_choices_generate_aux:n { - \int_incr:N \l_keys_choice_int +\cs_new_nopar:Npn \keys_choices_generate_aux:n #1 { \keys_cmd_set:nx { \l_keys_path_tl / #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 } \exp_not:V \l_keys_choice_code_tl } + \int_incr:N \l_keys_choice_int } % \end{macrocode} %\end{macro} @@ -864,17 +873,17 @@ % Creating a new command means setting properties and then creating % a function with the correct number of arguments. % \begin{macrocode} -\cs_new:Nn \keys_cmd_set:nn { +\cs_new:Npn \keys_cmd_set:nn #1#2 { \keys_cmd_set_aux:n {#1} \cs_generate_from_arg_count:cNnn { \c_keys_root_tl #1 .cmd:n } \cs_set:Npn 1 {#2} } -\cs_new:Nn \keys_cmd_set:nx { +\cs_new:Npn \keys_cmd_set:nx #1#2 { \keys_cmd_set_aux:n {#1} \cs_generate_from_arg_count:cNnn { \c_keys_root_tl #1 .cmd:n } \cs_set:Npx 1 {#2} } -\cs_new_nopar:Nn \keys_cmd_set_aux:n { +\cs_new_nopar:Npn \keys_cmd_set_aux:n #1 { \keys_property_undefine:n { #1 .default_tl } \tl_set:cn { \c_keys_root_tl #1 .req_tl } { } } @@ -887,7 +896,7 @@ %\begin{macro}{\keys_default_set:V} % Setting a default value is easy. % \begin{macrocode} -\cs_new:Nn \keys_default_set:n { +\cs_new:Npn \keys_default_set:n #1 { \tl_set:cn { \c_keys_root_tl \l_keys_path_tl .default_tl } {#1} } \cs_generate_variant:Nn \keys_default_set:n { V } @@ -899,7 +908,7 @@ % The main key-defining function mainly sets up things for \pkg{l3keyval} % to use. % \begin{macrocode} -\cs_new:Nn \keys_define:nn { +\cs_new:Npn \keys_define:nn #1#2 { \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 @@ -919,11 +928,11 @@ %\begin{macro}{\keys_define_elt:nn} % The element processors for defining keys. % \begin{macrocode} -\cs_new_nopar:Nn \keys_define_elt:n { +\cs_new_nopar:Npn \keys_define_elt:n #1 { \bool_set_true:N \l_keys_no_value_bool \keys_define_elt_aux:nn {#1} { } } -\cs_new:Nn \keys_define_elt:nn { +\cs_new:Npn \keys_define_elt:nn #1#2 { \bool_set_false:N \l_keys_no_value_bool \keys_define_elt_aux:nn {#1} {#2} } @@ -933,15 +942,15 @@ %\begin{macro}[aux]{\keys_define_elt_aux:nn} % The auxiliary function does most of the work. % \begin{macrocode} -\cs_new:Nn \keys_define_elt_aux:nn { +\cs_new:Npn \keys_define_elt_aux:nn #1#2 { \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 } + \msg_kernel_error:nnxx { keys } { property-unknown } + { \l_keys_property_tl } { \l_keys_path_tl } } } % \end{macrocode} @@ -953,7 +962,7 @@ % can be made for required values without needing anything set % explicitly. % \begin{macrocode} -\cs_new:Nn \keys_define_key:n { +\cs_new:Npn \keys_define_key:n #1 { \bool_if:NTF \l_keys_no_value_bool { \intexpr_compare:nTF { \exp_args:Nc \cs_get_arg_count_from_signature:N @@ -961,8 +970,8 @@ } { \keys_tmp:w }{ - \msg_kernel_error:nx { key-property-value-required } - { \l_keys_property_tl } + \msg_kernel_error:nnxx { key } { property-requires-value } + { \l_keys_property_tl } { \l_keys_path_tl } } }{ \keys_tmp:w {#1} @@ -978,14 +987,15 @@ % key itself, then look for the \texttt{unknown} key with the same % path. If both of these fail, complain! % \begin{macrocode} -\cs_new_nopar:Nn \keys_execute: { +\cs_new_nopar:Npn \keys_execute: { \keys_execute_aux:nn { \l_keys_path_tl } { \keys_execute_unknown: } } -\cs_new_nopar:Nn \keys_execute_unknown: { +\cs_new_nopar:Npn \keys_execute_unknown: { \keys_execute_aux:nn { \l_keys_module_tl / unknown } { - \msg_kernel_error:nx { key-unknown } { \l_keys_path_tl } + \msg_kernel_error:nnxx { keys } { key-unknown } { \l_keys_path_tl } + { \l_keys_module_tl } } } % \end{macrocode} @@ -996,7 +1006,7 @@ % do not run away (hence the nine empty groups), but that the module % can clean up the spare groups at the end of executing the key. % \begin{macrocode} -\cs_new_nopar:Nn \keys_execute_aux:nn { +\cs_new_nopar:Npn \keys_execute_aux:nn #1#2 { \cs_set_eq:Nc \keys_tmp:w { \c_keys_root_tl #1 .cmd:n } \cs_if_exist:NTF \keys_tmp:w { \exp_args:NV \keys_tmp:w \l_keys_value_toks @@ -1039,7 +1049,7 @@ %\begin{macro}{\keys_meta_make:x} % To create a met-key, simply set up to pass data through. % \begin{macrocode} -\cs_new_nopar:Nn \keys_meta_make:n { +\cs_new_nopar:Npn \keys_meta_make:n #1 { \keys_cmd_set:nx { \l_keys_path_tl } { \exp_not:N \keys_set:nn { \l_keys_module_tl } {#1} } @@ -1055,19 +1065,19 @@ % Searching for a property means finding the last ``\texttt{.}'' in % the input, and storing the text before and after it. % \begin{macrocode} -\cs_new_nopar:Nn \keys_property_find:n { +\cs_new_nopar:Npn \keys_property_find:n #1 { \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 } + \msg_kernel_error:nnx { keys } { key-no-property } {#1} } } -\cs_new_nopar:Nn \keys_property_find_aux:n { +\cs_new_nopar:Npn \keys_property_find_aux:n #1 { \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_if_in:nnTF {#2} { . } { \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl \tl_to_str:n {#1} . } @@ -1083,19 +1093,24 @@ %\end{macro} % %\begin{macro}{\keys_property_new:nn} +%\begin{macro}{\keys_property_new_arg:nn} % Creating a new property is simply a case of making the correctly-named % function. % \begin{macrocode} -\cs_new_nopar:Nn \keys_property_new:nn { - \cs_new:cn { \c_keys_properties_root_tl #1 } {#2} +\cs_new_nopar:Npn \keys_property_new:nn #1#2 { + \cs_new:cpn { \c_keys_properties_root_tl #1 } {#2} +} +\cs_new_nopar:Npn \keys_property_new_arg:nn #1#2 { + \cs_new:cpn { \c_keys_properties_root_tl #1 } ##1 {#2} } % \end{macrocode} %\end{macro} +%\end{macro} % %\begin{macro}{\keys_property_undefine:n} % Removing a property means undefining it. % \begin{macrocode} -\cs_new_nopar:Nn \keys_property_undefine:n { +\cs_new_nopar:Npn \keys_property_undefine:n #1 { \cs_set_eq:cN { \c_keys_root_tl #1 } \c_undefined } % \end{macrocode} @@ -1107,7 +1122,7 @@ % The main setting function just does the set up to get \pkg{l3keyval} % to do the hard work. % \begin{macrocode} -\cs_new:Nn \keys_set:nn { +\cs_new:Npn \keys_set:nn #1#2 { \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 @@ -1131,11 +1146,11 @@ % The two element processors are almost identical, and pass the data % through to the underlying auxiliary, which does the work. % \begin{macrocode} -\cs_new_nopar:Nn \keys_set_elt:n { +\cs_new_nopar:Npn \keys_set_elt:n #1 { \bool_set_true:N \l_keys_no_value_bool \keys_set_elt_aux:nn {#1} { } } -\cs_new:Nn \keys_set_elt:nn { +\cs_new:Npn \keys_set_elt:nn #1#2 { \bool_set_false:N \l_keys_no_value_bool \keys_set_elt_aux:nn {#1} {#2} } @@ -1148,13 +1163,14 @@ % then checks to see if the a value is required or forbidden. If % everything passes, move on to execute the code. % \begin{macrocode} -\cs_new:Nn \keys_set_elt_aux:nn { +\cs_new:Npn \keys_set_elt_aux:nn #1#2 { \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 } + \msg_kernel_error:nnx { keys } { value-required } + { \l_keys_path_tl } }{ \keys_set_elt_aux: } @@ -1162,13 +1178,13 @@ \keys_set_elt_aux: } } -\cs_new_nopar:Nn \keys_set_elt_aux: { +\cs_new_nopar:Npn \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 } + \msg_kernel_error:nnxx { keys } { value-forbidden } + { \l_keys_path_tl } { \toks_use:N \l_keys_value_toks } } }{ \keys_execute: @@ -1181,7 +1197,7 @@ %\begin{macro}{\keys_show:nn} % Showing a key is just a question of using the correct name. % \begin{macrocode} -\cs_new_nopar:Nn \keys_show:nn { +\cs_new_nopar:Npn \keys_show:nn #1#2 { \cs_show:c { \c_keys_root_tl #1 / \tl_to_str:n {#2} .cmd:n } } % \end{macrocode} @@ -1198,7 +1214,7 @@ % If a value is given, return it as |#1|, otherwise send a default if % available. % \begin{macrocode} -\cs_new:Nn \keys_value_or_default:n { +\cs_new:Npn \keys_value_or_default:n #1 { \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 } { @@ -1215,7 +1231,7 @@ % Values can be required or forbidden by having the appropriate marker % set. % \begin{macrocode} -\cs_new_nopar:Nn \keys_value_requirement:n { +\cs_new_nopar:Npn \keys_value_requirement:n #1 { \tl_set_eq:cc { \c_keys_root_tl \l_keys_path_tl .req_tl } { c_keys_value_ #1 _tl } } @@ -1226,7 +1242,7 @@ % Setting a variable takes the type and scope separately so that % it is easy to make a new variable if needed. % \begin{macrocode} -\cs_new_nopar:Nn \keys_variable_set:NnNN { +\cs_new_nopar:Npn \keys_variable_set:NnNN #1#2#3#4 { \cs_if_exist:NF #1 { \use:c { #2 _new:N } #1 } @@ -1243,10 +1259,10 @@ %\begin{macro}{.bool_gset:N} % One function for this. % \begin{macrocode} -\keys_property_new:nn { .bool_set:N } { +\keys_property_new_arg:nn { .bool_set:N } { \keys_bool_set:NN #1 { } } -\keys_property_new:nn { .bool_gset:N } { +\keys_property_new_arg:nn { .bool_gset:N } { \keys_bool_set:NN #1 n } % \end{macrocode} @@ -1268,10 +1284,10 @@ % Storing the code for choices, using \cs{exp_not:n} to avoid needing % two internal functions. % \begin{macrocode} -\keys_property_new:nn { .choice_code:n } { +\keys_property_new_arg:nn { .choice_code:n } { \keys_choice_code_store:x { \exp_not:n {#1} } } -\keys_property_new:nn { .choice_code:x } { +\keys_property_new_arg:nn { .choice_code:x } { \keys_choice_code_store:x {#1} } % \end{macrocode} @@ -1283,10 +1299,10 @@ % Creating code is simply a case of passing through to the underlying % \texttt{set} function. % \begin{macrocode} -\keys_property_new:nn { .code:n } { +\keys_property_new_arg:nn { .code:n } { \keys_cmd_set:nn { \l_keys_path_tl } {#1} } -\keys_property_new:nn { .code:x } { +\keys_property_new_arg:nn { .code:x } { \keys_cmd_set:nx { \l_keys_path_tl } {#1} } % \end{macrocode} @@ -1297,10 +1313,10 @@ %\begin{macro}{.default:V} % Expansion is left to the internal functions. % \begin{macrocode} -\keys_property_new:nn { .default:n } { +\keys_property_new_arg:nn { .default:n } { \keys_default_set:n {#1} } -\keys_property_new:nn { .default:V } { +\keys_property_new_arg:nn { .default:V } { \keys_default_set:V #1 } % \end{macrocode} @@ -1311,10 +1327,10 @@ %\begin{macro}{.dim_gset:N} % Setting a variable is very easy: just pass the data along. % \begin{macrocode} -\keys_property_new:nn { .dim_set:N } { +\keys_property_new_arg:nn { .dim_set:N } { \keys_variable_set:NnNN #1 { dim } { } n } -\keys_property_new:nn { .dim_gset:N } { +\keys_property_new_arg:nn { .dim_gset:N } { \keys_variable_set:NnNN #1 { dim } g n } % \end{macrocode} @@ -1324,7 +1340,7 @@ %\begin{macro}{.generate_choices:n} % Making choices is easy. % \begin{macrocode} -\keys_property_new:nn { .generate_choices:n } { +\keys_property_new_arg:nn { .generate_choices:n } { \keys_choices_generate:n {#1} } % \end{macrocode} @@ -1334,10 +1350,10 @@ %\begin{macro}{.int_gset:N} % Setting a variable is very easy: just pass the data along. % \begin{macrocode} -\keys_property_new:nn { .int_set:N } { +\keys_property_new_arg:nn { .int_set:N } { \keys_variable_set:NnNN #1 { int } { } n } -\keys_property_new:nn { .int_gset:N } { +\keys_property_new_arg:nn { .int_gset:N } { \keys_variable_set:NnNN #1 { int } g n } % \end{macrocode} @@ -1348,10 +1364,10 @@ %\begin{macro}{.meta:x} % Making a meta is handled internally. % \begin{macrocode} -\keys_property_new:nn { .meta:n } { +\keys_property_new_arg:nn { .meta:n } { \keys_meta_make:n {#1} } -\keys_property_new:nn { .meta:x } { +\keys_property_new_arg:nn { .meta:x } { \keys_meta_make:x {#1} } % \end{macrocode} @@ -1362,10 +1378,10 @@ %\begin{macro}{.skip_gset:N} % Setting a variable is very easy: just pass the data along. % \begin{macrocode} -\keys_property_new:nn { .skip_set:N } { +\keys_property_new_arg:nn { .skip_set:N } { \keys_variable_set:NnNN #1 { skip } { } n } -\keys_property_new:nn { .skip_gset:N } { +\keys_property_new_arg:nn { .skip_gset:N } { \keys_variable_set:NnNN #1 { skip } g n } % \end{macrocode} @@ -1378,16 +1394,16 @@ %\begin{macro}{.tl_gset_x:N} % Setting a variable is very easy: just pass the data along. % \begin{macrocode} -\keys_property_new:nn { .tl_set:N } { +\keys_property_new_arg:nn { .tl_set:N } { \keys_variable_set:NnNN #1 { tl } { } n } -\keys_property_new:nn { .tl_set_x:N } { +\keys_property_new_arg:nn { .tl_set_x:N } { \keys_variable_set:NnNN #1 { tl } { } x } -\keys_property_new:nn { .tl_gset:N } { +\keys_property_new_arg:nn { .tl_gset:N } { \keys_variable_set:NnNN #1 { tl } g n } -\keys_property_new:nn { .tl_gset_x:N } { +\keys_property_new_arg:nn { .tl_gset_x:N } { \keys_variable_set:NnNN #1 { tl } g x } % \end{macrocode} @@ -1414,49 +1430,73 @@ % % For when there is a need to complain. % \begin{macrocode} -\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.% -} +\msg_kernel_new:nnnn { keys } { choice-unknown } + {% + Choice `#2' unknown for key `#1':\\% + the key is being ignored.% + } + {% + The key `#1' takes a limited number of values.\\% + The input you gave, `#2', was not on the list accepted.\\% + Perhaps this is a typing error?% + } +\msg_kernel_new:nnnn { keys } { generate-choices-before-code } + {% + Cannot create choices for key `#1':\\% + no code has been defined.% + } + {% + Code for use by .generate_choices:n should first be defined\\% + using .choice_code:n or .choice_code:x.% + } +\msg_kernel_new:nnnn { keys } { key-no-property } + {No property given in definition of key `#1'.} + {% + Inside \token_to_str:N \keys_define:nn \msg_space: each key name + needs a property:\\% + \msg_two_spaces: #1 .<property>:\\% + I did not find a ``.'' to indicate the start of a property.% + } +\msg_kernel_new:nnnn { keys } { key-unknown } + {The key `#1' is unknown and is being ignored.} + {% + The module `#2' does not seem to implement a key called `#1'.\\% + I also checked for code to handle a unknown key, and did not + find any.% + Check that you have spelled the key name correctly.% + } +\msg_kernel_new:nnnn { keys } { property-unknown } + {The key property `#1' is unknown.} + {% + You have asked for key `#2' to have the property `#1'.\\% + However, I don't know the property `#1': this line will be ignored.% + } +\msg_kernel_new:nnnn { keys } { property-requires-value } + {The property `#1' requires a value.} + {% + You have tried to set the property `#2' for key `#1'.\\% + However, you did not give a value for this property, and one is + needed.\\% + The entire line will be ignored.% + } +\msg_kernel_new:nnnn { keys } { value-forbidden } + {The key `#1' does not taken a value.} + {% + The key `#1' should be given without a value.\\% + You gave `#1 = #2'; I will ignore `#2' and carry out whatever\\% + key `#1' is supposed to do.% + } +\msg_kernel_new:nnnn { keys } { value-required } + {The key `#1' requires a value.} + {% + The key `#1' should be given with a value.\\% + You gave `#1', but should have given `#1 = <value>'.\\% + I will ignore the key entirely.\\% + } % \end{macrocode} % % \begin{macrocode} %</initex|package> % \end{macrocode} % -%\end{implementation}
\ No newline at end of file +%\end{implementation} |