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