From 3008882136867f329953e388258ebed0b683647e Mon Sep 17 00:00:00 2001 From: Joseph Wright Date: Tue, 29 Jan 2019 20:54:55 +0000 Subject: [PATCH] Enable key inheritance for defaults (fixes #504) --- l3kernel/CHANGELOG.md | 1 + l3kernel/l3keys.dtx | 29 +++++++++++++++++++++++-- l3kernel/testfiles/m3expl001.luatex.tlg | 1 + l3kernel/testfiles/m3expl001.ptex.tlg | 1 + l3kernel/testfiles/m3expl001.tlg | 1 + l3kernel/testfiles/m3expl001.uptex.tlg | 1 + l3kernel/testfiles/m3expl001.xetex.tlg | 1 + l3kernel/testfiles/m3expl003.luatex.tlg | 1 + l3kernel/testfiles/m3expl003.ptex.tlg | 1 + l3kernel/testfiles/m3expl003.tlg | 1 + l3kernel/testfiles/m3expl003.uptex.tlg | 1 + l3kernel/testfiles/m3expl003.xetex.tlg | 1 + l3kernel/testfiles/m3keys003.lvt | 4 +++- l3kernel/testfiles/m3keys003.tlg | 3 +++ 14 files changed, 44 insertions(+), 3 deletions(-) diff --git a/l3kernel/CHANGELOG.md b/l3kernel/CHANGELOG.md index dc40b45a1f..b6e4ba5c10 100644 --- a/l3kernel/CHANGELOG.md +++ b/l3kernel/CHANGELOG.md @@ -15,6 +15,7 @@ this project uses date-based 'snapshot' version identifiers. ### Fixed - Handling of nested key setting when filtering, _etc._ (see #526) +- Inheritance of default values (see #504) ## [2019-01-28] diff --git a/l3kernel/l3keys.dtx b/l3kernel/l3keys.dtx index c4311e02c5..0259c89652 100644 --- a/l3kernel/l3keys.dtx +++ b/l3kernel/l3keys.dtx @@ -2364,6 +2364,7 @@ % \end{macro} % % \begin{macro}{\@@_value_or_default:n} +% \begin{macro}{\@@_default_inherit:} % If a value is given, return it as |#1|, otherwise send a default if % available. % \begin{macrocode} @@ -2377,12 +2378,33 @@ \l_keys_value_tl { \c_@@_default_root_tl \l_keys_path_tl } } - { \tl_clear:N \l_keys_value_tl } + { + \tl_clear:N \l_keys_value_tl + \cs_if_exist:cT + { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl } + { \@@_default_inherit: } + } } { \tl_set:Nn \l_keys_value_tl {#1} } } +\cs_new_protected:Npn \@@_default_inherit: + { + \clist_map_inline:cn + { \c_@@_inherit_root_tl \@@_parent:o \l_keys_path_tl } + { + \cs_if_exist:cT + { \c_@@_default_root_tl ##1 / \l_keys_key_tl } + { + \tl_set_eq:Nc + \l_keys_value_tl + { \c_@@_default_root_tl ##1 / \l_keys_key_tl } + \clist_map_break: + } + } + } % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}{\@@_execute:, \@@_execute_inherit:, \@@_execute_unknown:} % \begin{macro}[EXP]{\@@_execute:nn} @@ -2567,7 +2589,10 @@ \cs_new:Npn \@@_parent:w #1 / #2 / #3 \q_stop #4 { \tl_if_blank:nTF {#2} - { \use_none:n #4 } + { + \tl_if_blank:nF {#4} + { \use_none:n #4 } + } { \@@_parent:w #2 / #3 \q_stop { #4 / #1 } } diff --git a/l3kernel/testfiles/m3expl001.luatex.tlg b/l3kernel/testfiles/m3expl001.luatex.tlg index 96948904b6..fb048cb756 100644 --- a/l3kernel/testfiles/m3expl001.luatex.tlg +++ b/l3kernel/testfiles/m3expl001.luatex.tlg @@ -3382,6 +3382,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl001.ptex.tlg b/l3kernel/testfiles/m3expl001.ptex.tlg index af6e85f18b..b4c2ef5948 100644 --- a/l3kernel/testfiles/m3expl001.ptex.tlg +++ b/l3kernel/testfiles/m3expl001.ptex.tlg @@ -3675,6 +3675,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl001.tlg b/l3kernel/testfiles/m3expl001.tlg index 94c2a946fe..0213ad0784 100644 --- a/l3kernel/testfiles/m3expl001.tlg +++ b/l3kernel/testfiles/m3expl001.tlg @@ -3675,6 +3675,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl001.uptex.tlg b/l3kernel/testfiles/m3expl001.uptex.tlg index be1eb5589e..36d106dd1a 100644 --- a/l3kernel/testfiles/m3expl001.uptex.tlg +++ b/l3kernel/testfiles/m3expl001.uptex.tlg @@ -3675,6 +3675,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl001.xetex.tlg b/l3kernel/testfiles/m3expl001.xetex.tlg index 97fe952e46..f05ee0037f 100644 --- a/l3kernel/testfiles/m3expl001.xetex.tlg +++ b/l3kernel/testfiles/m3expl001.xetex.tlg @@ -3420,6 +3420,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl003.luatex.tlg b/l3kernel/testfiles/m3expl003.luatex.tlg index 96948904b6..fb048cb756 100644 --- a/l3kernel/testfiles/m3expl003.luatex.tlg +++ b/l3kernel/testfiles/m3expl003.luatex.tlg @@ -3382,6 +3382,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl003.ptex.tlg b/l3kernel/testfiles/m3expl003.ptex.tlg index af6e85f18b..b4c2ef5948 100644 --- a/l3kernel/testfiles/m3expl003.ptex.tlg +++ b/l3kernel/testfiles/m3expl003.ptex.tlg @@ -3675,6 +3675,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl003.tlg b/l3kernel/testfiles/m3expl003.tlg index 94c2a946fe..0213ad0784 100644 --- a/l3kernel/testfiles/m3expl003.tlg +++ b/l3kernel/testfiles/m3expl003.tlg @@ -3675,6 +3675,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl003.uptex.tlg b/l3kernel/testfiles/m3expl003.uptex.tlg index be1eb5589e..36d106dd1a 100644 --- a/l3kernel/testfiles/m3expl003.uptex.tlg +++ b/l3kernel/testfiles/m3expl003.uptex.tlg @@ -3675,6 +3675,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3expl003.xetex.tlg b/l3kernel/testfiles/m3expl003.xetex.tlg index 97fe952e46..f05ee0037f 100644 --- a/l3kernel/testfiles/m3expl003.xetex.tlg +++ b/l3kernel/testfiles/m3expl003.xetex.tlg @@ -3420,6 +3420,7 @@ Defining \__keys_find_key_module:w on line ... Defining \__keys_set_selective: on line ... Defining \__keys_check_groups: on line ... Defining \__keys_value_or_default:n on line ... +Defining \__keys_default_inherit: on line ... Defining \__keys_execute: on line ... Defining \__keys_execute_inherit: on line ... Defining \__keys_execute_unknown: on line ... diff --git a/l3kernel/testfiles/m3keys003.lvt b/l3kernel/testfiles/m3keys003.lvt index 3708f824e9..0a8b5418ed 100644 --- a/l3kernel/testfiles/m3keys003.lvt +++ b/l3kernel/testfiles/m3keys003.lvt @@ -160,6 +160,7 @@ \keys_define:nn { module } { key-one .code:n = \tl_show:n {#1} , + key-one .default:n = foo , key-two .choices:nn = { a , b } { \tl_show:n {#1} } } \keys_define:nn { module-two } @@ -169,7 +170,8 @@ \keys_set:nn { module-two / path } { key-one = a , - key-two = b + key-two = b , + key-one } \keys_set:nn { module-two / path } { diff --git a/l3kernel/testfiles/m3keys003.tlg b/l3kernel/testfiles/m3keys003.tlg index 8f37e9dc48..f745697476 100644 --- a/l3kernel/testfiles/m3keys003.tlg +++ b/l3kernel/testfiles/m3keys003.tlg @@ -136,6 +136,9 @@ l. ... } > b. } l. ... } +> foo. + } +l. ... } ! LaTeX3 Error: The key 'module-two/path/key-not-defined' is unknown and is (LaTeX3) being ignored. For immediate help type H .