[latex3-commits] [git/LaTeX3-latex3-latex3] master: Use str data consistently in l3keys (fixes #668) (28d14cd53)

Joseph Wright joseph.wright at morningstar2.co.uk
Sat Feb 8 08:26:55 CET 2020


Repository : https://github.com/latex3/latex3
On branch  : master
Link       : https://github.com/latex3/latex3/commit/28d14cd53250dc3a932fd041b5d82e20912464d9

>---------------------------------------------------------------

commit 28d14cd53250dc3a932fd041b5d82e20912464d9
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Sat Feb 8 07:26:22 2020 +0000

    Use str data consistently in l3keys (fixes #668)
    
    This deprecates two long-standing tl: they
    are defined manually but will need to be removed.


>---------------------------------------------------------------

28d14cd53250dc3a932fd041b5d82e20912464d9
 l3kernel/CHANGELOG.md            |   7 +
 l3kernel/doc/l3obsolete.txt      |   2 +
 l3kernel/l3debug.dtx             |   2 +-
 l3kernel/l3keys.dtx              | 431 ++++++++++++++++++++-------------------
 l3kernel/testfiles/m3keys001.lvt |   4 +-
 l3kernel/testfiles/m3keys001.tlg |   2 +-
 l3kernel/testfiles/m3keys005.lvt |  12 +-
 l3kernel/testfiles/m3keys005.tlg |   8 +-
 8 files changed, 241 insertions(+), 227 deletions(-)

diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md
index 2993075c0..f8cafd105 100644
--- a/l3kernel/CHANGELOG.md
+++ b/l3kernel/CHANGELOG.md
@@ -7,6 +7,13 @@ this project uses date-based 'snapshot' version identifiers.
 
 ## [Unreleased]
 
+### Added
+- `\l_keys_key_str` and `\l_keys_path_str`
+
+### Deprecated
+- `\l_keys_key_tl` and `\l_keys_path_tl`, replaced by `\l_keys_key_str` and
+  `\l_keys_path_str`, respectively
+
 ## [2020-02-03]
 
 ### Changed
diff --git a/l3kernel/doc/l3obsolete.txt b/l3kernel/doc/l3obsolete.txt
index bef029d54..3ca1989e7 100644
--- a/l3kernel/doc/l3obsolete.txt
+++ b/l3kernel/doc/l3obsolete.txt
@@ -58,6 +58,8 @@ Function                   Expires end
 \etex_....:D                      2019
 \hbox_unpack_clear:c              2020
 \hbox_unpack_clear:N              2020
+\l_keys_key_tl                    2022
+\l_keys_path_tl                   2022
 \lua_escape_x:n                   2019
 \luatex_...:D                     2019
 \msg_interrupt:nn                 2019
diff --git a/l3kernel/l3debug.dtx b/l3kernel/l3debug.dtx
index c1eda3e36..409194e6a 100644
--- a/l3kernel/l3debug.dtx
+++ b/l3kernel/l3debug.dtx
@@ -969,7 +969,7 @@
 %<@@=keys>
   \__kernel_patch:nnn
     {
-      \cs_if_exist:cF { \c_@@_code_root_tl #1 }
+      \cs_if_exist:cF { \c_@@_code_root_str #1 }
         { \__kernel_debug_log:x { Defining~key~#1~\msg_line_context: } }
     }
     { }
diff --git a/l3kernel/l3keys.dtx b/l3kernel/l3keys.dtx
index 7f2b4ad39..0c15aae67 100644
--- a/l3kernel/l3keys.dtx
+++ b/l3kernel/l3keys.dtx
@@ -639,8 +639,8 @@
 %   later.
 % \end{function}
 %
-% \begin{variable}[updated = 2015-07-14]
-%   {\l_keys_key_tl, \l_keys_path_tl, \l_keys_value_tl}
+% \begin{variable}[updated = 2020-02-08]
+%   {\l_keys_key_str, \l_keys_path_str, \l_keys_value_tl}
 %   For each key processed, information of the full \emph{path} of the
 %   key, the \emph{name} of the key and the \emph{value} of the key is
 %   available within three token list variables. These may be used within
@@ -661,13 +661,12 @@
 %     \keys_set:nn { mymodule } { subset  / key-a = some-value }
 %   \end{verbatim}
 %   has path \texttt{mymodule/subset/key-a}. This information is stored in
-%   \cs{l_keys_path_tl}, and will have been processed by \cs{tl_to_str:n}.
+%   \cs{l_keys_path_str}.
 %
 %   The \emph{name} of the key is the part of the path after the last
 %   \texttt{/}, and thus is not unique. In the preceding examples, both keys
 %   have name \texttt{key-a} despite having different paths.  This information
-%   is stored in \cs{l_keys_key_tl}, and will have been processed by
-%   \cs{tl_to_str:n}.
+%   is stored in \cs{l_keys_key_str}.
 % \end{variable}
 %
 % \section{Handling of unknown keys}
@@ -681,7 +680,7 @@
 %   \keys_define:nn { mymodule }
 %     {
 %       unknown .code:n =
-%         You~tried~to~set~key~'\l_keys_key_tl'~to~'#1'.
+%         You~tried~to~set~key~'\l_keys_key_str'~to~'#1'.
 %     }
 % \end{verbatim}
 %
@@ -1169,28 +1168,28 @@
 %
 % \begin{variable}
 %   {
-%     \c_@@_code_root_tl    ,
-%     \c_@@_default_root_tl ,
-%     \c_@@_groups_root_tl  ,
-%     \c_@@_inherit_root_tl  ,
-%     \c_@@_type_root_tl    ,
-%     \c_@@_validate_root_tl
+%     \c_@@_code_root_str    ,
+%     \c_@@_default_root_str ,
+%     \c_@@_groups_root_str  ,
+%     \c_@@_inherit_root_str  ,
+%     \c_@@_type_root_str    ,
+%     \c_@@_validate_root_str
 %   }
 %   Various storage areas for the different data which make up keys.
 %    \begin{macrocode}
-\tl_const:Nn \c_@@_code_root_tl     { key~code~>~ }
-\tl_const:Nn \c_@@_default_root_tl  { key~default~>~ }
-\tl_const:Nn \c_@@_groups_root_tl   { key~groups~>~ }
-\tl_const:Nn \c_@@_inherit_root_tl  { key~inherit~>~ }
-\tl_const:Nn \c_@@_type_root_tl     { key~type~>~ }
-\tl_const:Nn \c_@@_validate_root_tl { key~validate~>~ }
+\str_const:Nn \c_@@_code_root_str     { key~code~>~ }
+\str_const:Nn \c_@@_default_root_str  { key~default~>~ }
+\str_const:Nn \c_@@_groups_root_str   { key~groups~>~ }
+\str_const:Nn \c_@@_inherit_root_str  { key~inherit~>~ }
+\str_const:Nn \c_@@_type_root_str     { key~type~>~ }
+\str_const:Nn \c_@@_validate_root_str { key~validate~>~ }
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\c_@@_props_root_tl}
+% \begin{variable}{\c_@@_props_root_str}
 %   The prefix for storing properties.
 %    \begin{macrocode}
-\tl_const:Nn \c_@@_props_root_tl { key~prop~>~ }
+\str_const:Nn \c_@@_props_root_str { key~prop~>~ }
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1212,17 +1211,19 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_keys_key_tl}
-%   The name of a key itself: needed when setting keys.
+% \begin{variable}{\l_keys_key_str, \l_keys_key_tl}
+%   The name of a key itself: needed when setting keys. The |tl| version
+%   is deprecated but has to be handled manually.
 %    \begin{macrocode}
+\str_new:N \l_keys_key_str
 \tl_new:N \l_keys_key_tl
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_module_tl}
+% \begin{variable}{\l_@@_module_str}
 %   The module for an entire set of keys.
 %    \begin{macrocode}
-\tl_new:N \l_@@_module_tl
+\str_new:N \l_@@_module_str
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1241,33 +1242,36 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_keys_path_tl}
+% \begin{variable}{\l_keys_path_str, \l_keys_path_tl}
 %   The \enquote{path} of the current key is stored here: this is
-%   available to the programmer and so is public.
+%   available to the programmer and so is public. The older version is
+%   deprecated but has to be handled manually.
 %    \begin{macrocode}
+\str_new:N \l_keys_path_str
 \tl_new:N \l_keys_path_tl
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_inherit_tl}
+% \begin{variable}{\l_@@_inherit_str}
 %    \begin{macrocode}
-\tl_new:N \l_@@_inherit_tl
+\str_new:N \l_@@_inherit_str
 %    \end{macrocode}
 % \end{variable}
 %
 % \begin{variable}{\l_@@_relative_tl}
-%   The relative path for passing keys back to the user.
+%   The relative path for passing keys back to the user. As this can
+%   be explicitly no-value, it must be a token list.
 %    \begin{macrocode}
 \tl_new:N \l_@@_relative_tl
 \tl_set:Nn \l_@@_relative_tl { \q_no_value }
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{variable}{\l_@@_property_tl}
+% \begin{variable}{\l_@@_property_str}
 %   The \enquote{property} begin set for a key at definition time is
 %   stored here.
 %    \begin{macrocode}
-\tl_new:N \l_@@_property_tl
+\str_new:N \l_@@_property_str
 %    \end{macrocode}
 % \end{variable}
 %
@@ -1321,12 +1325,12 @@
 %   removing any leading |/| (which is not needed here).
 %    \begin{macrocode}
 \cs_new_protected:Npn \keys_define:nn
-  { \@@_define:onn \l_@@_module_tl }
+  { \@@_define:onn \l_@@_module_str }
 \cs_new_protected:Npn \@@_define:nnn #1#2#3
   {
-    \tl_set:Nx \l_@@_module_tl { \@@_trim_spaces:n {#2} }
+    \str_set:Nx \l_@@_module_str { \@@_trim_spaces:n {#2} }
     \keyval_parse:NNn \@@_define:n \@@_define:nn {#3}
-    \tl_set:Nn \l_@@_module_tl {#1}
+    \str_set:Nn \l_@@_module_str {#1}
   }
 \cs_generate_variant:Nn \@@_define:nnn { o }
 %    \end{macrocode}
@@ -1354,14 +1358,13 @@
 \cs_new_protected:Npn \@@_define_aux:nn #1#2
   {
     \@@_property_find:n {#1}
-    \cs_if_exist:cTF { \c_@@_props_root_tl \l_@@_property_tl }
-      { \@@_define_code:n {#2}
-      }
+    \cs_if_exist:cTF { \c_@@_props_root_str \l_@@_property_str }
+      { \@@_define_code:n {#2} }
       {
-         \tl_if_empty:NF \l_@@_property_tl
+         \str_if_empty:NF \l_@@_property_str
            {
              \__kernel_msg_error:nnxx { kernel } { key-property-unknown }
-              { \l_@@_property_tl } { \l_keys_path_tl }
+              { \l_@@_property_str } { \l_keys_path_str }
            }
       }
   }
@@ -1378,43 +1381,44 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_property_find:n #1
   {
-    \tl_set:Nx \l_@@_property_tl { \@@_trim_spaces:n {#1} }
-    \exp_after:wN \@@_property_find:w \l_@@_property_tl . .
+    \str_set:Nx \l_@@_property_str { \@@_trim_spaces:n {#1} }
+    \exp_after:wN \@@_property_find:w \l_@@_property_str . .
       \q_stop {#1}
   }
 \cs_new_protected:Npn \@@_property_find:w #1 . #2 . #3 \q_stop #4
   {
     \tl_if_blank:nTF {#3}
       {
-        \tl_clear:N \l_@@_property_tl
+        \str_clear:N \l_@@_property_str
         \__kernel_msg_error:nnn { kernel } { key-no-property } {#4}
       }
       {
         \str_if_eq:nnTF {#3} { . }
           {
-            \tl_set:Nx \l_keys_path_tl
+            \str_set:Nx \l_keys_path_str
               {
-                \tl_if_empty:NF \l_@@_module_tl
-                  { \l_@@_module_tl  / }
+                \str_if_empty:NF \l_@@_module_str
+                  { \l_@@_module_str  / }
                \tl_trim_spaces:n {#1}
               }
-            \tl_set:Nn \l_@@_property_tl { . #2 }
+            \str_set:Nn \l_@@_property_str { . #2 }
           }
           {
-            \tl_set:Nx \l_keys_path_tl { \l_@@_module_tl / #1 . #2 }
+            \str_set:Nx \l_keys_path_str { \l_@@_module_str / #1 . #2 }
             \@@_property_search:w #3 \q_stop
           }
+        \tl_set_eq:NN \l_keys_path_tl \l_keys_path_str
       }
   }
 \cs_new_protected:Npn \@@_property_search:w #1 . #2 \q_stop
   {
     \str_if_eq:nnTF {#2} { . }
       {
-        \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl }
-        \tl_set:Nn \l_@@_property_tl { . #1 }
+        \str_set:Nx \l_keys_path_str { \l_keys_path_str }
+        \str_set:Nn \l_@@_property_str { . #1 }
       }
       {
-        \tl_set:Nx \l_keys_path_tl { \l_keys_path_tl . #1 }
+        \str_set:Nx \l_keys_path_str { \l_keys_path_str . #1 }
         \@@_property_search:w #2 \q_stop
       }
   }
@@ -1435,15 +1439,15 @@
     \bool_if:NTF \l_@@_no_value_bool
       {
         \exp_after:wN \@@_define_code:w
-          \l_@@_property_tl \q_stop
-          { \use:c { \c_@@_props_root_tl \l_@@_property_tl } }
+          \l_@@_property_str \q_stop
+          { \use:c { \c_@@_props_root_str \l_@@_property_str } }
           {
             \__kernel_msg_error:nnxx { kernel }
-              { key-property-requires-value } { \l_@@_property_tl }
-              { \l_keys_path_tl }
+              { key-property-requires-value } { \l_@@_property_str }
+              { \l_keys_path_str }
             }
       }
-      { \use:c { \c_@@_props_root_tl \l_@@_property_tl } {#1} }
+      { \use:c { \c_@@_props_root_str \l_@@_property_str } {#1} }
   }
 \exp_last_unbraced:NNNNo
   \cs_new:Npn \@@_define_code:w #1 \c_colon_str #2 \q_stop
@@ -1463,14 +1467,14 @@
   {
     \bool_if_exist:NF #1 { \bool_new:N #1 }
     \@@_choice_make:
-    \@@_cmd_set:nx { \l_keys_path_tl / true }
+    \@@_cmd_set:nx { \l_keys_path_str / true }
       { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 }
-    \@@_cmd_set:nx { \l_keys_path_tl / false }
+    \@@_cmd_set:nx { \l_keys_path_str / false }
       { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 }
-    \@@_cmd_set:nn { \l_keys_path_tl / unknown }
+    \@@_cmd_set:nn { \l_keys_path_str / unknown }
       {
         \__kernel_msg_error:nnx { kernel } { boolean-values-only }
-          { \l_keys_key_tl }
+          { \l_keys_key_str }
       }
     \@@_default_set:n { true }
   }
@@ -1485,14 +1489,14 @@
   {
     \bool_if_exist:NF #1 { \bool_new:N #1 }
     \@@_choice_make:
-    \@@_cmd_set:nx { \l_keys_path_tl / true }
+    \@@_cmd_set:nx { \l_keys_path_str / true }
       { \exp_not:c { bool_ #2 set_false:N } \exp_not:N #1 }
-    \@@_cmd_set:nx { \l_keys_path_tl / false }
+    \@@_cmd_set:nx { \l_keys_path_str / false }
       { \exp_not:c { bool_ #2 set_true:N } \exp_not:N #1 }
-    \@@_cmd_set:nn { \l_keys_path_tl / unknown }
+    \@@_cmd_set:nn { \l_keys_path_str / unknown }
       {
         \__kernel_msg_error:nnx { kernel } { boolean-values-only }
-          { \l_keys_key_tl }
+          { \l_keys_key_str }
       }
     \@@_default_set:n { true }
   }
@@ -1514,14 +1518,14 @@
 \cs_new_protected:Npn \@@_choice_make:N #1
   {
     \cs_if_exist:cTF
-      { \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl }
+      { \c_@@_type_root_str \@@_parent:o \l_keys_path_str }
       {
         \str_if_eq:vnTF
-          { \c_@@_type_root_tl \@@_parent:o \l_keys_path_tl }
+          { \c_@@_type_root_str \@@_parent:o \l_keys_path_str }
           { choice }
           {
             \__kernel_msg_error:nnxx { kernel } { nested-choice-key }
-              { \l_keys_path_tl } { \@@_parent:o \l_keys_path_tl }
+              { \l_keys_path_tl } { \@@_parent:o \l_keys_path_str }
           }
           { \@@_choice_make_aux:N #1 }
       }
@@ -1529,13 +1533,13 @@
   }
 \cs_new_protected:Npn \@@_choice_make_aux:N #1
   {
-    \cs_set_nopar:cpn { \c_@@_type_root_tl \l_keys_path_tl }
+    \cs_set_nopar:cpn { \c_@@_type_root_str \l_keys_path_str }
       { choice }
-    \@@_cmd_set:nn { \l_keys_path_tl } { #1 {##1} }
-    \@@_cmd_set:nn { \l_keys_path_tl / unknown }
+    \@@_cmd_set:nn { \l_keys_path_str } { #1 {##1} }
+    \@@_cmd_set:nn { \l_keys_path_str / unknown }
       {
         \__kernel_msg_error:nnxx { kernel } { key-choice-unknown }
-          { \l_keys_path_tl } {##1}
+          { \l_keys_path_str } {##1}
       }
   }
 %    \end{macrocode}
@@ -1560,7 +1564,7 @@
       {
         \int_incr:N \l_keys_choice_int
         \@@_cmd_set:nx
-          { \l_keys_path_tl / \@@_trim_spaces:n {##1} }
+          { \l_keys_path_str / \@@_trim_spaces:n {##1} }
           {
             \tl_set:Nn \exp_not:N \l_keys_choice_tl {##1}
             \int_set:Nn \exp_not:N \l_keys_choice_int
@@ -1579,7 +1583,7 @@
 %   defining a new key, then saves the code.
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_cmd_set:nn #1#2
-  { \cs_set_protected:cpn { \c_@@_code_root_tl #1 } ##1 {#2} }
+  { \cs_set_protected:cpn { \c_@@_code_root_str #1 } ##1 {#2} }
 \cs_generate_variant:Nn \@@_cmd_set:nn { nx , Vn , Vo }
 %    \end{macrocode}
 % \end{macro}
@@ -1593,12 +1597,12 @@
     \tl_if_empty:nTF {#1}
       {
         \cs_set_eq:cN
-          { \c_@@_default_root_tl \l_keys_path_tl }
+          { \c_@@_default_root_str \l_keys_path_str }
           \tex_undefined:D
       }
       {
         \cs_set_nopar:cpx
-          { \c_@@_default_root_tl \l_keys_path_tl }
+          { \c_@@_default_root_str \l_keys_path_str }
           { \exp_not:n {#1} }
         \@@_value_requirement:nn { required } { false }
       }
@@ -1618,11 +1622,11 @@
     \clist_set:Nn \l_@@_groups_clist {#1}
     \clist_if_empty:NTF \l_@@_groups_clist
       {
-        \cs_set_eq:cN { \c_@@_groups_root_tl \l_keys_path_tl }
+        \cs_set_eq:cN { \c_@@_groups_root_str \l_keys_path_str }
           \tex_undefined:D
       }
       {
-        \cs_set_eq:cN { \c_@@_groups_root_tl \l_keys_path_tl }
+        \cs_set_eq:cN { \c_@@_groups_root_str \l_keys_path_str }
           \l_@@_groups_clist
       }
   }
@@ -1636,7 +1640,7 @@
 \cs_new_protected:Npn \@@_inherit:n #1
   {
     \@@_undefine:
-    \cs_set_nopar:cpn { \c_@@_inherit_root_tl \l_keys_path_tl } {#1}
+    \cs_set_nopar:cpn { \c_@@_inherit_root_str \l_keys_path_str } {#1}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1647,11 +1651,11 @@
 \cs_new_protected:Npn \@@_initialise:n #1
   {
     \cs_if_exist:cTF
-      { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+      { \c_@@_inherit_root_str \@@_parent:o \l_keys_path_str }
       { \@@_execute_inherit: }
       {
-        \tl_clear:N \l_@@_inherit_tl
-        \cs_if_exist_use:cT { \c_@@_code_root_tl \l_keys_path_tl } { {#1} }
+        \str_clear:N \l_@@_inherit_str
+        \cs_if_exist_use:cT { \c_@@_code_root_str \l_keys_path_str } { {#1} }
       }
   }
 %    \end{macrocode}
@@ -1663,14 +1667,14 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_meta_make:n #1
   {
-    \@@_cmd_set:Vo \l_keys_path_tl
+    \@@_cmd_set:Vo \l_keys_path_str
       {
         \exp_after:wN \keys_set:nn
-        \exp_after:wN { \l_@@_module_tl } {#1}
+        \exp_after:wN { \l_@@_module_str } {#1}
       }
   }
 \cs_new_protected:Npn \@@_meta_make:nn #1#2
-  { \@@_cmd_set:Vn \l_keys_path_tl { \keys_set:nn {#1} {#2} } }
+  { \@@_cmd_set:Vn \l_keys_path_str { \keys_set:nn {#1} {#2} } }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1684,8 +1688,8 @@
     \exp_after:wN \@@_find_key_module:NNw
       \exp_after:wN \l_@@_tmpa_tl
       \exp_after:wN \l_@@_tmpb_tl
-      \l_keys_path_tl / \q_stop
-    \@@_cmd_set:nx { \l_keys_path_tl }
+      \l_keys_path_str / \q_stop
+    \@@_cmd_set:nx { \l_keys_path_str }
       {
         \exp_not:c { prop_ #2 put:Nnn }
         \exp_not:N #1
@@ -1707,7 +1711,7 @@
       { code , default , groups , inherit , type , validate }
       {
         \cs_set_eq:cN
-          { \tl_use:c { c_@@_ ##1 _root_tl } \l_keys_path_tl }
+          { \tl_use:c { c_@@_ ##1 _root_str } \l_keys_path_str }
           \tex_undefined:D
       }
   }
@@ -1730,17 +1734,17 @@
         { true }
           {
             \cs_set_eq:cc
-              { \c_@@_validate_root_tl \l_keys_path_tl }
+              { \c_@@_validate_root_str \l_keys_path_str }
               { @@_validate_ #1 : }
           }
         { false }
           {
             \cs_if_eq:ccT
-              { \c_@@_validate_root_tl \l_keys_path_tl }
+              { \c_@@_validate_root_str \l_keys_path_str }
               { @@_validate_ #1 : }
               {
                 \cs_set_eq:cN
-                  { \c_@@_validate_root_tl \l_keys_path_tl }
+                  { \c_@@_validate_root_str \l_keys_path_str }
                   \tex_undefined:D
               }
           }
@@ -1756,7 +1760,7 @@
     \bool_if:NF \l_@@_no_value_bool
       {
         \__kernel_msg_error:nnxx { kernel } { value-forbidden }
-          { \l_keys_path_tl } { \l_keys_value_tl }
+          { \l_keys_path_str } { \l_keys_value_tl }
         \@@_validate_cleanup:w
       }
   }
@@ -1765,7 +1769,7 @@
     \bool_if:NT \l_@@_no_value_bool
       {
         \__kernel_msg_error:nnx { kernel } { value-required }
-          { \l_keys_path_tl }
+          { \l_keys_path_str }
         \@@_validate_cleanup:w
       }
   }
@@ -1783,7 +1787,7 @@
 \cs_new_protected:Npn \@@_variable_set:NnnN #1#2#3#4
   {
     \use:c { #2_if_exist:NF } #1 { \use:c { #2 _new:N } #1 }
-    \@@_cmd_set:nx { \l_keys_path_tl }
+    \@@_cmd_set:nx { \l_keys_path_str }
       {
         \exp_not:c { #2 _ #3 set:N #4 }
         \exp_not:N #1
@@ -1816,13 +1820,13 @@
 % \begin{macro}{.bool_gset:N, .bool_gset:c}
 %   One function for this.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_set:N } #1
   { \@@_bool_set:Nn #1 { } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_set:c } #1
   { \@@_bool_set:cn {#1} { } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_gset:N } #1
   { \@@_bool_set:Nn #1 { g } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_gset:c } #1
   { \@@_bool_set:cn {#1} { g } }
 %    \end{macrocode}
 % \end{macro}
@@ -1832,13 +1836,13 @@
 % \begin{macro}{.bool_gset_inverse:N, .bool_gset_inverse:c}
 %   One function for this.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_set_inverse:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_set_inverse:N } #1
   { \@@_bool_set_inverse:Nn #1 { } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_set_inverse:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_set_inverse:c } #1
   { \@@_bool_set_inverse:cn {#1} { } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_gset_inverse:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_gset_inverse:N } #1
   { \@@_bool_set_inverse:Nn #1 { g } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .bool_gset_inverse:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .bool_gset_inverse:c } #1
   { \@@_bool_set_inverse:cn {#1} { g } }
 %    \end{macrocode}
 % \end{macro}
@@ -1848,7 +1852,7 @@
 %   Making a choice is handled internally, as it is also needed by
 %   \texttt{.generate_choices:n}.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .choice: }
+\cs_new_protected:cpn { \c_@@_props_root_str .choice: }
   { \@@_choice_make: }
 %    \end{macrocode}
 % \end{macro}
@@ -1859,13 +1863,13 @@
 %   Here, |#1| consists of two separate
 %   arguments, hence the slightly odd-looking implementation.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .choices:nn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .choices:nn } #1
   { \@@_choices_make:nn #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .choices:Vn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .choices:Vn } #1
   { \exp_args:NV \@@_choices_make:nn #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .choices:on } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .choices:on } #1
   { \exp_args:No \@@_choices_make:nn #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .choices:xn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .choices:xn } #1
   { \exp_args:Nx \@@_choices_make:nn #1 }
 %    \end{macrocode}
 % \end{macro}
@@ -1874,21 +1878,21 @@
 %   Creating code is simply a case of passing through to the underlying
 %   \texttt{set} function.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .code:n } #1
-  { \@@_cmd_set:nn { \l_keys_path_tl } {#1} }
+\cs_new_protected:cpn { \c_@@_props_root_str .code:n } #1
+  { \@@_cmd_set:nn { \l_keys_path_str } {#1} }
 %    \end{macrocode}
 % \end{macro}
 %
 % \begin{macro}{.clist_set:N, .clist_set:c}
 % \begin{macro}{.clist_gset:N, .clist_gset:c}
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .clist_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .clist_set:N } #1
   { \@@_variable_set:NnnN #1 { clist } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .clist_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .clist_set:c } #1
   { \@@_variable_set:cnnN {#1} { clist } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .clist_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .clist_gset:N } #1
   { \@@_variable_set:NnnN #1 { clist } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .clist_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .clist_gset:c } #1
   { \@@_variable_set:cnnN {#1} { clist } { g } n }
 %    \end{macrocode}
 % \end{macro}
@@ -1897,13 +1901,13 @@
 % \begin{macro}{.default:n, .default:V, .default:o, .default:x}
 %   Expansion is left to the internal functions.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .default:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .default:n } #1
   { \@@_default_set:n {#1} }
-\cs_new_protected:cpn { \c_@@_props_root_tl .default:V } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .default:V } #1
   { \exp_args:NV \@@_default_set:n #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .default:o } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .default:o } #1
   { \exp_args:No \@@_default_set:n {#1} }
-\cs_new_protected:cpn { \c_@@_props_root_tl .default:x } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .default:x } #1
   { \exp_args:Nx \@@_default_set:n {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -1912,13 +1916,13 @@
 % \begin{macro}{.dim_gset:N, .dim_gset:c}
 % Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .dim_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .dim_set:N } #1
   { \@@_variable_set_required:NnnN #1 { dim } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .dim_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .dim_set:c } #1
   { \@@_variable_set_required:cnnN {#1} { dim } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .dim_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .dim_gset:N } #1
   { \@@_variable_set_required:NnnN #1 { dim } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .dim_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .dim_gset:c } #1
   { \@@_variable_set_required:cnnN {#1} { dim } { g } n }
 %    \end{macrocode}
 % \end{macro}
@@ -1928,13 +1932,13 @@
 % \begin{macro}{.fp_gset:N, .fp_gset:c}
 %   Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .fp_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .fp_set:N } #1
   { \@@_variable_set_required:NnnN #1 { fp } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .fp_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .fp_set:c } #1
   { \@@_variable_set_required:cnnN {#1} { fp } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .fp_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .fp_gset:N } #1
   { \@@_variable_set_required:NnnN #1 { fp } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .fp_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .fp_gset:c } #1
   { \@@_variable_set_required:cnnN {#1} { fp } { g } n }
 %    \end{macrocode}
 % \end{macro}
@@ -1943,7 +1947,7 @@
 % \begin{macro}{.groups:n}
 %   A single property to create groups of keys.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .groups:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .groups:n } #1
   { \@@_groups_set:n {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -1951,7 +1955,7 @@
 % \begin{macro}{.inherit:n}
 %   Nothing complex: only one variant at the moment!
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .inherit:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .inherit:n } #1
   { \@@_inherit:n {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -1959,13 +1963,13 @@
 % \begin{macro}{.initial:n, .initial:V, .initial:o, .initial:x}
 %   The standard hand-off approach.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .initial:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .initial:n } #1
   { \@@_initialise:n {#1} }
-\cs_new_protected:cpn { \c_@@_props_root_tl .initial:V } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .initial:V } #1
   { \exp_args:NV \@@_initialise:n #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .initial:o } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .initial:o } #1
   { \exp_args:No \@@_initialise:n {#1} }
-\cs_new_protected:cpn { \c_@@_props_root_tl .initial:x } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .initial:x } #1
   { \exp_args:Nx \@@_initialise:n {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -1974,13 +1978,13 @@
 % \begin{macro}{.int_gset:N, .int_gset:c}
 %   Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .int_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .int_set:N } #1
   { \@@_variable_set_required:NnnN #1 { int } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .int_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .int_set:c } #1
   { \@@_variable_set_required:cnnN {#1} { int } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .int_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .int_gset:N } #1
   { \@@_variable_set_required:NnnN #1 { int } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .int_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .int_gset:c } #1
   { \@@_variable_set_required:cnnN {#1} { int } { g } n }
 %    \end{macrocode}
 % \end{macro}
@@ -1989,7 +1993,7 @@
 % \begin{macro}{.meta:n}
 %   Making a meta is handled internally.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .meta:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .meta:n } #1
   { \@@_meta_make:n {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -1998,7 +2002,7 @@
 %   Meta with path: potentially lots of variants, but for the moment
 %   no so many defined.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .meta:nn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .meta:nn } #1
   { \@@_meta_make:nn #1 }
 %    \end{macrocode}
 % \end{macro}
@@ -2012,15 +2016,15 @@
 %   The same idea as \texttt{.choice:} and \texttt{.choices:nn}, but
 %   where more than one choice is allowed.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .multichoice: }
+\cs_new_protected:cpn { \c_@@_props_root_str .multichoice: }
   { \@@_multichoice_make: }
-\cs_new_protected:cpn { \c_@@_props_root_tl .multichoices:nn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .multichoices:nn } #1
   { \@@_multichoices_make:nn #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .multichoices:Vn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .multichoices:Vn } #1
   { \exp_args:NV \@@_multichoices_make:nn #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .multichoices:on } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .multichoices:on } #1
   { \exp_args:No \@@_multichoices_make:nn #1 }
-\cs_new_protected:cpn { \c_@@_props_root_tl .multichoices:xn } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .multichoices:xn } #1
   { \exp_args:Nx \@@_multichoices_make:nn #1 }
 %    \end{macrocode}
 % \end{macro}
@@ -2029,13 +2033,13 @@
 % \begin{macro}{.muskip_set:N, .muskip_set:c, .muskip_gset:N, .muskip_gset:c}
 %   Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .muskip_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .muskip_set:N } #1
   { \@@_variable_set_required:NnnN #1 { muskip } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .muskip_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .muskip_set:c } #1
   { \@@_variable_set_required:cnnN {#1} { muskip } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .muskip_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .muskip_gset:N } #1
   { \@@_variable_set_required:NnnN #1 { muskip } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .muskip_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .muskip_gset:c } #1
   { \@@_variable_set_required:cnnN {#1} { muskip } { g } n }
 %    \end{macrocode}
 % \end{macro}
@@ -2043,13 +2047,13 @@
 % \begin{macro}{.prop_put:N, .prop_put:c, .prop_gput:N, .prop_gput:c}
 %   Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .prop_put:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .prop_put:N } #1
   { \@@_prop_put:Nn #1 { } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .prop_put:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .prop_put:c } #1
   { \@@_prop_put:cn {#1} { } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .prop_gput:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .prop_gput:N } #1
   { \@@_prop_put:Nn #1 { g } }
-\cs_new_protected:cpn { \c_@@_props_root_tl .prop_gput:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .prop_gput:c } #1
   { \@@_prop_put:cn {#1} { g } }
 %    \end{macrocode}
 % \end{macro}
@@ -2058,13 +2062,13 @@
 % \begin{macro}{.skip_gset:N, .skip_gset:c}
 %   Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .skip_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .skip_set:N } #1
   { \@@_variable_set_required:NnnN #1 { skip } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .skip_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .skip_set:c } #1
   { \@@_variable_set_required:cnnN {#1} { skip } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .skip_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .skip_gset:N } #1
   { \@@_variable_set_required:NnnN #1 { skip } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .skip_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .skip_gset:c } #1
   { \@@_variable_set_required:cnnN {#1} { skip } { g } n }
 %    \end{macrocode}
 % \end{macro}
@@ -2076,21 +2080,21 @@
 % \begin{macro}{.tl_gset_x:N, .tl_gset_x:c}
 %   Setting a variable is very easy: just pass the data along.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_set:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set:N } #1
   { \@@_variable_set:NnnN #1 { tl } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_set:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set:c } #1
   { \@@_variable_set:cnnN {#1} { tl } { } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_set_x:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:N } #1
   { \@@_variable_set:NnnN #1 { tl } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_set_x:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_set_x:c } #1
   { \@@_variable_set:cnnN {#1} { tl } { } x }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_gset:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset:N } #1
   { \@@_variable_set:NnnN #1 { tl } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_gset:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset:c } #1
   { \@@_variable_set:cnnN {#1} { tl } { g } n }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_gset_x:N } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:N } #1
   { \@@_variable_set:NnnN #1 { tl } { g } x }
-\cs_new_protected:cpn { \c_@@_props_root_tl .tl_gset_x:c } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .tl_gset_x:c } #1
   { \@@_variable_set:cnnN {#1} { tl } { g } x }
 %    \end{macrocode}
 % \end{macro}
@@ -2101,7 +2105,7 @@
 % \begin{macro}{.undefine:}
 %   Another simple wrapper.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .undefine: }
+\cs_new_protected:cpn { \c_@@_props_root_str .undefine: }
   { \@@_undefine: }
 %    \end{macrocode}
 % \end{macro}
@@ -2110,9 +2114,9 @@
 % \begin{macro}{.value_required:n}
 %   These are very similar, so both call the same function.
 %    \begin{macrocode}
-\cs_new_protected:cpn { \c_@@_props_root_tl .value_forbidden:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .value_forbidden:n } #1
   { \@@_value_requirement:nn { forbidden } {#1} }
-\cs_new_protected:cpn { \c_@@_props_root_tl .value_required:n } #1
+\cs_new_protected:cpn { \c_@@_props_root_str .value_required:n } #1
   { \@@_value_requirement:nn { required } {#1} }
 %    \end{macrocode}
 % \end{macro}
@@ -2150,12 +2154,12 @@
   }
 \cs_generate_variant:Nn \keys_set:nn { nV , nv , no }
 \cs_new_protected:Npn \@@_set:nn #1#2
-  { \exp_args:No \@@_set:nnn \l_@@_module_tl {#1} {#2} }
+  { \exp_args:No \@@_set:nnn \l_@@_module_str {#1} {#2} }
 \cs_new_protected:Npn \@@_set:nnn #1#2#3
   {
-    \tl_set:Nx \l_@@_module_tl { \@@_trim_spaces:n {#2} }
+    \str_set:Nx \l_@@_module_str { \@@_trim_spaces:n {#2} }
     \keyval_parse:NNn \@@_set_keyval:n \@@_set_keyval:nn {#3}
-    \tl_set:Nn \l_@@_module_tl {#1}
+    \str_set:Nn \l_@@_module_str {#1}
   }
 %    \end{macrocode}
 % \end{macro}
@@ -2354,12 +2358,12 @@
 \cs_new_protected:Npn \@@_set_keyval:n #1
   {
     \bool_set_true:N \l_@@_no_value_bool
-    \@@_set_keyval:onn \l_@@_module_tl {#1} { }
+    \@@_set_keyval:onn \l_@@_module_str {#1} { }
   }
 \cs_new_protected:Npn \@@_set_keyval:nn #1#2
   {
     \bool_set_false:N \l_@@_no_value_bool
-    \@@_set_keyval:onn \l_@@_module_tl {#1} {#2}
+    \@@_set_keyval:onn \l_@@_module_str {#1} {#2}
   }
 %    \end{macrocode}
 %   The key path here can be fully defined, after which there is a search
@@ -2370,33 +2374,34 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_set_keyval:nnn #1#2#3
   {
-    \tl_set:Nx \l_keys_path_tl
+    \tl_set:Nx \l_keys_path_str
       {
         \tl_if_blank:nF {#1}
           { #1 / }
         \@@_trim_spaces:n {#2}
       }
-    \tl_clear:N \l_@@_module_tl
-    \tl_clear:N \l_@@_inherit_tl
+    \str_clear:N \l_@@_module_str
+    \str_clear:N \l_@@_inherit_str
     \exp_after:wN \@@_find_key_module:NNw
-      \exp_after:wN \l_@@_module_tl
-      \exp_after:wN \l_keys_key_tl
-      \l_keys_path_tl / \q_stop
+      \exp_after:wN \l_@@_module_str
+      \exp_after:wN \l_keys_key_str
+      \l_keys_path_str / \q_stop
+    \tl_set_eq:NN \l_keys_key_tl \l_keys_key_str
     \@@_value_or_default:n {#3}
     \bool_if:NTF \l_@@_selective_bool
       { \@@_set_selective: }
       { \@@_execute: }
-    \tl_set:Nn \l_@@_module_tl {#1}
+    \str_set:Nn \l_@@_module_str {#1}
   }
 \cs_generate_variant:Nn \@@_set_keyval:nnn { o }
 \cs_new_protected:Npn \@@_find_key_module:NNw #1#2#3 / #4 \q_stop
   {
     \tl_if_blank:nTF {#4}
-      { \tl_set:Nn #2 {#3} }
+      { \str_set:Nn #2 {#3} }
       {
-        \tl_put_right:Nx #1
+        \str_put_right:Nx #1
           {
-            \tl_if_empty:NF #1 { / }
+            \str_if_empty:NF #1 { / }
             #3
           }
         \@@_find_key_module:NNw #1#2 #4 \q_stop
@@ -2410,10 +2415,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_set_selective:
   {
-    \cs_if_exist:cTF { \c_@@_groups_root_tl \l_keys_path_tl }
+    \cs_if_exist:cTF { \c_@@_groups_root_str \l_keys_path_str }
       {
         \clist_set_eq:Nc \l_@@_groups_clist
-          { \c_@@_groups_root_tl \l_keys_path_tl }
+          { \c_@@_groups_root_str \l_keys_path_str }
         \@@_check_groups:
       }
       {
@@ -2469,16 +2474,16 @@
   {
     \bool_if:NTF \l_@@_no_value_bool
       {
-        \cs_if_exist:cTF { \c_@@_default_root_tl \l_keys_path_tl }
+        \cs_if_exist:cTF { \c_@@_default_root_str \l_keys_path_str }
           {
             \tl_set_eq:Nc
               \l_keys_value_tl
-              { \c_@@_default_root_tl \l_keys_path_tl }
+              { \c_@@_default_root_str \l_keys_path_str }
           }
           {
             \tl_clear:N \l_keys_value_tl
             \cs_if_exist:cT
-              { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+              { \c_@@_inherit_root_str \@@_parent:o \l_keys_path_str }
               { \@@_default_inherit: }
           }
       }
@@ -2487,14 +2492,14 @@
 \cs_new_protected:Npn \@@_default_inherit:
   {
     \clist_map_inline:cn
-      { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+      { \c_@@_inherit_root_str \@@_parent:o \l_keys_path_str }
       {
         \cs_if_exist:cT
-          { \c_@@_default_root_tl ##1 / \l_keys_key_tl }
+          { \c_@@_default_root_str ##1 / \l_keys_key_str }
           {
             \tl_set_eq:Nc
               \l_keys_value_tl
-              { \c_@@_default_root_tl ##1 / \l_keys_key_tl }
+              { \c_@@_default_root_str ##1 / \l_keys_key_str }
             \clist_map_break:
           }
       }
@@ -2514,15 +2519,15 @@
 %    \begin{macrocode}
 \cs_new_protected:Npn \@@_execute:
   {
-    \cs_if_exist:cTF { \c_@@_code_root_tl \l_keys_path_tl }
+    \cs_if_exist:cTF { \c_@@_code_root_str \l_keys_path_str }
       {
-        \cs_if_exist_use:c { \c_@@_validate_root_tl \l_keys_path_tl }
-        \cs:w \c_@@_code_root_tl \l_keys_path_tl \exp_after:wN \cs_end:
+        \cs_if_exist_use:c { \c_@@_validate_root_str \l_keys_path_str }
+        \cs:w \c_@@_code_root_str \l_keys_path_str \exp_after:wN \cs_end:
           \exp_after:wN { \l_keys_value_tl }
       }
       {
         \cs_if_exist:cTF
-          { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+          { \c_@@_inherit_root_str \@@_parent:o \l_keys_path_str }
           { \@@_execute_inherit: }
           { \@@_execute_unknown: }
       }
@@ -2535,14 +2540,14 @@
 \cs_new_protected:Npn \@@_execute_inherit:
   {
     \clist_map_inline:cn
-      { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl }
+      { \c_@@_inherit_root_str \@@_parent:o \l_keys_path_str }
       {
         \cs_if_exist:cT
-          { \c_@@_code_root_tl ##1 / \l_keys_key_tl }
+          { \c_@@_code_root_str ##1 / \l_keys_key_str }
           {
-            \tl_set:Nn \l_@@_inherit_tl {##1}
-            \cs_if_exist_use:c { \c_@@_validate_root_tl ##1 / \l_keys_key_tl }
-            \cs:w \c_@@_code_root_tl ##1 / \l_keys_key_tl
+            \str_set:Nn \l_@@_inherit_str {##1}
+            \cs_if_exist_use:c { \c_@@_validate_root_str ##1 / \l_keys_key_str }
+            \cs:w \c_@@_code_root_str ##1 / \l_keys_key_str
               \exp_after:wN \cs_end: \exp_after:wN
               { \l_keys_value_tl }
             \clist_map_break:n { \use_none:n }
@@ -2556,22 +2561,22 @@
       { \@@_store_unused: }
       {
         \cs_if_exist:cTF
-          { \c_@@_code_root_tl \l_@@_module_tl / unknown }
+          { \c_@@_code_root_str \l_@@_module_str / unknown }
           {
-            \cs:w \c_@@_code_root_tl \l_@@_module_tl / unknown
+            \cs:w \c_@@_code_root_str \l_@@_module_str / unknown
               \exp_after:wN \cs_end: \exp_after:wN { \l_keys_value_tl }
           }
           {
             \__kernel_msg_error:nnxx { kernel } { key-unknown }
-             { \l_keys_path_tl } { \l_@@_module_tl }
+             { \l_keys_path_str } { \l_@@_module_str }
           }
       }
   }
 \cs_new:Npn \@@_execute:nn #1#2
   {
-    \cs_if_exist:cTF { \c_@@_code_root_tl #1 }
+    \cs_if_exist:cTF { \c_@@_code_root_str #1 }
       {
-        \cs:w \c_@@_code_root_tl #1 \exp_after:wN \cs_end:
+        \cs:w \c_@@_code_root_str #1 \exp_after:wN \cs_end:
           \exp_after:wN { \l_keys_value_tl }
       }
       {#2}
@@ -2589,7 +2594,7 @@
       {
         \clist_put_right:Nx \l_@@_unused_clist
           {
-            \exp_not:o \l_keys_key_tl
+            \exp_not:o \l_keys_key_str
             \bool_if:NF \l_@@_no_value_bool
               { = { \exp_not:o \l_keys_value_tl } }
           }
@@ -2599,7 +2604,7 @@
           {
             \clist_put_right:Nx \l_@@_unused_clist
               {
-                \exp_not:o \l_keys_path_tl
+                \exp_not:o \l_keys_path_str
                 \bool_if:NF \l_@@_no_value_bool
                   { = { \exp_not:o \l_keys_value_tl } }
               }
@@ -2622,7 +2627,7 @@
           \tl_if_blank:nF {##1}
             {
               \__kernel_msg_error:nnxx { kernel } { bad-relative-key-path }
-                \l_keys_path_tl
+                \l_keys_path_str
                 \l_@@_relative_tl
             }
           \clist_put_right:Nx \l_@@_unused_clist
@@ -2634,7 +2639,7 @@
         }
     \use:x
       {
-        \@@_store_unused:w \l_keys_path_tl
+        \@@_store_unused:w \l_keys_path_str
           \l_@@_relative_tl / \l_@@_relative_tl /
           \exp_not:N \q_stop
       }
@@ -2655,18 +2660,18 @@
 %    \begin{macrocode}
 \cs_new:Npn \@@_choice_find:n #1
   {
-    \tl_if_empty:NTF \l_@@_inherit_tl
-      { \@@_choice_find:nn { \l_keys_path_tl } {#1} }
+    \str_if_empty:NTF \l_@@_inherit_str
+      { \@@_choice_find:nn { \l_keys_path_str } {#1} }
       {
         \@@_choice_find:nn
-          { \l_@@_inherit_tl / \l_keys_key_tl } {#1}
+          { \l_@@_inherit_str / \l_keys_key_str } {#1}
       }
   }
 \cs_new:Npn \@@_choice_find:nn #1#2
   {
-    \cs_if_exist:cTF { \c_@@_code_root_tl #1 / \@@_trim_spaces:n {#2} }
-      { \use:c { \c_@@_code_root_tl #1 / \@@_trim_spaces:n {#2} } {#2} }
-      { \use:c { \c_@@_code_root_tl #1 / unknown } {#2} }
+    \cs_if_exist:cTF { \c_@@_code_root_str #1 / \@@_trim_spaces:n {#2} }
+      { \use:c { \c_@@_code_root_str #1 / \@@_trim_spaces:n {#2} } {#2} }
+      { \use:c { \c_@@_code_root_str #1 / unknown } {#2} }
   }
 \cs_new:Npn \@@_multichoice_find:n #1
   { \clist_map_function:nN {#1} \@@_choice_find:n }
@@ -2742,7 +2747,7 @@
 \prg_new_conditional:Npnn \keys_if_exist:nn #1#2 { p , T , F , TF }
   {
     \cs_if_exist:cTF
-      { \c_@@_code_root_tl \@@_trim_spaces:n { #1 / #2 } }
+      { \c_@@_code_root_str \@@_trim_spaces:n { #1 / #2 } }
       { \prg_return_true: }
       { \prg_return_false: }
   }
@@ -2756,7 +2761,7 @@
   { p , T , F , TF }
   {
     \cs_if_exist:cTF
-      { \c_@@_code_root_tl \@@_trim_spaces:n { #1 / #2 / #3 } }
+      { \c_@@_code_root_str \@@_trim_spaces:n { #1 / #2 / #3 } }
       { \prg_return_true: }
       { \prg_return_false: }
   }
@@ -2781,7 +2786,7 @@
               {
                 \exp_args:Nc \cs_replacement_spec:N
                   {
-                    \c_@@_code_root_tl
+                    \c_@@_code_root_str
                     \@@_trim_spaces:n { #2 / #3 }
                   }
               }
diff --git a/l3kernel/testfiles/m3keys001.lvt b/l3kernel/testfiles/m3keys001.lvt
index 3984ee19f..0677c5769 100644
--- a/l3kernel/testfiles/m3keys001.lvt
+++ b/l3kernel/testfiles/m3keys001.lvt
@@ -1,4 +1,4 @@
-% Copyright (C) 2013,2015,2018,2019 The LaTeX3 Project
+% Copyright (C) 2013,2015,2018-2020 The LaTeX3 Project
 
 
 \documentclass{minimal}
@@ -294,7 +294,7 @@
   {
     \keys_define:nn { }
       {
-        key .code:n = \tl_show:N \l_keys_path_tl
+        key .code:n = \tl_show:N \l_keys_path_str
       }
     \keys_set:nn { } { key }
   }
diff --git a/l3kernel/testfiles/m3keys001.tlg b/l3kernel/testfiles/m3keys001.tlg
index 9287ebb20..9dca3f86b 100644
--- a/l3kernel/testfiles/m3keys001.tlg
+++ b/l3kernel/testfiles/m3keys001.tlg
@@ -150,7 +150,7 @@ LaTeX did not find a '.' to indicate the start of a property.
 TEST 11: Empty module
 ============================================================
 Defining key key on line ...
-> \l_keys_path_tl=key.
+> \l_keys_path_str=key.
 <recently read> }
 l. ...  }
 ============================================================
diff --git a/l3kernel/testfiles/m3keys005.lvt b/l3kernel/testfiles/m3keys005.lvt
index 6938afa85..cb3e26091 100644
--- a/l3kernel/testfiles/m3keys005.lvt
+++ b/l3kernel/testfiles/m3keys005.lvt
@@ -1,4 +1,4 @@
-% Copyright (C) 2015,2018 The LaTeX3 Project
+% Copyright (C) 2015,2018,2020 The LaTeX3 Project
 
 
 \documentclass{minimal}
@@ -23,8 +23,8 @@
       {
         bar / baz .code:n =
           {
-            \tl_log:N \l_keys_key_tl
-            \tl_log:N \l_keys_path_tl
+            \tl_log:N \l_keys_key_str
+            \tl_log:N \l_keys_path_str
           }
       }
     \keys_set:nn { foo } { bar / baz }
@@ -32,8 +32,8 @@
       {
         bar .code:n =
           {
-            \tl_log:N \l_keys_key_tl
-            \tl_log:N \l_keys_path_tl
+            \tl_log:N \l_keys_key_str
+            \tl_log:N \l_keys_path_str
           }
       }
     \keys_set:nn { foo / baz } { bar }
@@ -45,7 +45,7 @@
       {
         foobar .choice: ,
         foobar / unknown .code:n =
-          \keys_set:no { moduleB } { \l_keys_key_tl = #1 }
+          \keys_set:no { moduleB } { \l_keys_key_str = #1 }
       }
     \keys_define:nn { moduleB } { test .code:n = \tl_log:n {#1} }
     \keys_set:nn { moduleA / foobar } { test = xxx }
diff --git a/l3kernel/testfiles/m3keys005.tlg b/l3kernel/testfiles/m3keys005.tlg
index c180c3e90..e025ee119 100644
--- a/l3kernel/testfiles/m3keys005.tlg
+++ b/l3kernel/testfiles/m3keys005.tlg
@@ -5,11 +5,11 @@ Author: Joseph Wright
 TEST 1: Key names and paths
 ============================================================
 Defining key foo/bar/baz on line ...
-> \l_keys_key_tl=baz.
-> \l_keys_path_tl=foo/bar/baz.
+> \l_keys_key_str=baz.
+> \l_keys_path_str=foo/bar/baz.
 Defining key foo/baz/bar on line ...
-> \l_keys_key_tl=bar.
-> \l_keys_path_tl=foo/baz/bar.
+> \l_keys_key_str=bar.
+> \l_keys_path_str=foo/baz/bar.
 ============================================================
 ============================================================
 TEST 2: Modules hidden in key part





More information about the latex3-commits mailing list.