From f270817f7a891c4821e1ef63e715c9f2c44ce626 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 28 Jan 2022 22:24:51 +0000 Subject: zref-clever (28jan22) git-svn-id: svn://tug.org/texlive/trunk@61778 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/zref-clever/zref-clever-dutch.lang | 6 +- .../tex/latex/zref-clever/zref-clever-english.lang | 4 +- .../tex/latex/zref-clever/zref-clever-french.lang | 4 +- .../tex/latex/zref-clever/zref-clever-german.lang | 4 +- .../latex/zref-clever/zref-clever-portuguese.lang | 4 +- .../tex/latex/zref-clever/zref-clever-spanish.lang | 4 +- .../tex/latex/zref-clever/zref-clever.sty | 2616 +++++++++++++------- 7 files changed, 1731 insertions(+), 911 deletions(-) (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-dutch.lang b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-dutch.lang index 26d2d0cb821..41c8c90a50c 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-dutch.lang +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-dutch.lang @@ -161,8 +161,8 @@ type = equation , name-sg-ab = vgl. , Name-pl-ab = Vgl.'s , name-pl-ab = vgl.'s , - preref = {(} , - postref = {)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , type = theorem , gender = f , @@ -170,6 +170,7 @@ type = theorem , name-sg = stelling , Name-pl = Stellingen , name-pl = stellingen , + type = lemma , gender = n , Name-sg = Lemma , @@ -232,6 +233,7 @@ type = algorithm , name-sg = algoritme , Name-pl = Algoritmes , name-pl = algoritmes , + type = listing , gender = m , Name-sg = Listing , diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-english.lang b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-english.lang index bc51e268916..63d7fb66f01 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-english.lang +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-english.lang @@ -154,8 +154,8 @@ type = equation , name-sg-ab = eq. , Name-pl-ab = Eqs. , name-pl-ab = eqs. , - preref = {(} , - postref = {)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , type = theorem , Name-sg = Theorem , diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-french.lang b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-french.lang index 81f4f69c206..0518b3af6ad 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-french.lang +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-french.lang @@ -157,8 +157,8 @@ type = equation , name-sg = équation , Name-pl = Équations , name-pl = équations , - preref = {(} , - postref = {)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , type = theorem , gender = m , diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-german.lang b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-german.lang index 610818f09fd..c1e39cc917c 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-german.lang +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-german.lang @@ -285,8 +285,8 @@ type = equation , case = G , Name-sg = Gleichung , Name-pl = Gleichungen , - preref = {(} , - postref = {)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , type = theorem , gender = n , diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-portuguese.lang b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-portuguese.lang index 6e02ea9dd0b..c0750f8aede 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-portuguese.lang +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-portuguese.lang @@ -169,8 +169,8 @@ type = equation , name-sg-ab = eq. , Name-pl-ab = Eqs. , name-pl-ab = eqs. , - preref = {(} , - postref = {)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , type = theorem , gender = m , diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-spanish.lang b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-spanish.lang index e96c8d6c712..90f33105676 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever-spanish.lang +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever-spanish.lang @@ -157,8 +157,8 @@ type = equation , name-sg = ecuación , Name-pl = Ecuaciones , name-pl = ecuaciones , - preref = {(} , - postref = {)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , type = theorem , gender = m , diff --git a/Master/texmf-dist/tex/latex/zref-clever/zref-clever.sty b/Master/texmf-dist/tex/latex/zref-clever/zref-clever.sty index 61f5127c2e5..6877d2d5ce5 100644 --- a/Master/texmf-dist/tex/latex/zref-clever/zref-clever.sty +++ b/Master/texmf-dist/tex/latex/zref-clever/zref-clever.sty @@ -53,7 +53,7 @@ }% \endinput }% -\ProvidesExplPackage {zref-clever} {2022-01-10} {0.1.2-alpha} +\ProvidesExplPackage {zref-clever} {2022-01-28} {0.2.0-alpha} {Clever LaTeX cross-references based on zref} \RequirePackage { zref-base } \RequirePackage { zref-user } @@ -109,7 +109,7 @@ { \bool_if:nTF { \prop_if_in_p:Nn \l__zrefclever_counter_resetby_prop {#1} } - { \prop_item:Nn \l__zrefclever_counter_resetby_prop {#1} } + { \prop_item:Nn \l__zrefclever_counter_resetby_prop {#1} } { \seq_map_tokens:Nn \l__zrefclever_counter_resetters_seq { \__zrefclever_counter_reset_by_aux:nn {#1} } @@ -165,11 +165,6 @@ } \msg_new:nnn { zref-clever } { key-requires-value } { The~'#1'~key~'#2'~requires~a~value~\msg_line_context:. } -\msg_new:nnn { zref-clever } { key-boolean-or-empty } - { - The~key~'#1'~only~accepts~the~values~'true',~'false'~ - or~an~empty~value~\msg_line_context:. - } \msg_new:nnn { zref-clever } { language-declared } { Language~'#1'~is~already~declared~\msg_line_context:.~Nothing~to~do. } \msg_new:nnn { zref-clever } { unknown-language-alias } @@ -186,7 +181,7 @@ } \msg_new:nnn { zref-clever } { unknown-language-opt } { - Language~'#1'~is~unknown~\msg_line_context:.~Using~default.~ + Language~'#1'~is~unknown~\msg_line_context:.~ See~documentation~for~'\iow_char:N\\zcDeclareLanguage'~and~ '\iow_char:N\\zcDeclareLanguageAlias'. } @@ -249,15 +244,6 @@ { Option~'#1'~is~only~available~after~\iow_char:N\\begin\{document\}. } \msg_new:nnn { zref-clever } { langfile-loaded } { Loaded~'#1'~language~file. } -\msg_new:nnn { zref-clever } { langfile-not-available } - { Language~file~for~'#1'~not~available~\msg_line_context:. } -\msg_new:nnn { zref-clever } { unknown-language-load } - { - Language~'#1'~is~unknown~\msg_line_context:.~ - Unable~to~load~language~file.~See~documentation~for~ - '\iow_char:N\\zcDeclareLanguage'~and~ - '\iow_char:N\\zcDeclareLanguageAlias'. - } \msg_new:nnn { zref-clever } { zref-property-undefined } { Option~'ref=#1'~requested~\msg_line_context:.~ @@ -283,6 +269,12 @@ Unknown~compatibility~module~'#1'~given~to~option~'nocompat'.~ Nothing~to~do. } +\msg_new:nnn { zref-clever } { refbounds-must-be-four } + { + The~value~of~option~'#1'~must~be~a~comma~sepatared~list~ + of~four~items.~We~received~'#2'~items~\msg_line_context:.~ + Option~not~set. + } \msg_new:nnn { zref-clever } { missing-zref-check } { Option~'check'~requested~\msg_line_context:.~ @@ -294,11 +286,6 @@ { Reference~property~'#1'~undefined~for~label~'#2'~\msg_line_context:. } \msg_new:nnn { zref-clever } { missing-name } { Reference~format~option~'#1'~undefined~for~type~'#2'~\msg_line_context:. } -\msg_new:nnn { zref-clever } { missing-string } - { - We~couldn't~find~a~value~for~reference~option~'#1'~\msg_line_context:.~ - But~we~should~have:~throw~a~rock~at~the~maintainer. - } \msg_new:nnn { zref-clever } { single-element-range } { Range~for~type~'#1'~resulted~in~single~element~\msg_line_context:. } \msg_new:nnn { zref-clever } { compat-package } @@ -324,13 +311,139 @@ \cs_generate_variant:Nn \__zrefclever_extract_unexp:nnn { Vnn , nvn , Vvn } \cs_new:Npn \__zrefclever_extract:nnn #1#2#3 { \zref@extractdefault {#1} {#2} {#3} } +\cs_new:Npn \__zrefclever_opt_varname_general:nn #1#2 + { l__zrefclever_opt_general_ #1 _ #2 } +\cs_new:Npn \__zrefclever_opt_varname_type:nnn #1#2#3 + { l__zrefclever_opt_type_ #1 _ #2 _ #3 } +\cs_generate_variant:Nn \__zrefclever_opt_varname_type:nnn { enn , een } +\cs_new:Npn \__zrefclever_opt_varname_language:nnn #1#2#3 + { + \__zrefclever_language_if_declared:nTF {#1} + { + g__zrefclever_opt_language_ + \tl_use:c { \__zrefclever_language_varname:n {#1} } + _ #2 _ #3 + } + { g__zrefclever_opt_lang_unknown_ \int_rand:n { 1000000 } _ #3 } + } +\cs_generate_variant:Nn \__zrefclever_opt_varname_language:nnn { enn } +\cs_new:Npn \__zrefclever_opt_varname_lang_default:nnn #1#2#3 + { + \__zrefclever_language_if_declared:nTF {#1} + { + g__zrefclever_opt_lang_ + \tl_use:c { \__zrefclever_language_varname:n {#1} } + _default_ #2 _ #3 + } + { g__zrefclever_opt_lang_unknown_ \int_rand:n { 1000000 } _ #3 } + } +\cs_generate_variant:Nn \__zrefclever_opt_varname_lang_default:nnn { enn } +\cs_new:Npn \__zrefclever_opt_varname_lang_type:nnnn #1#2#3#4 + { + \__zrefclever_language_if_declared:nTF {#1} + { + g__zrefclever_opt_lang_ + \tl_use:c { \__zrefclever_language_varname:n {#1} } + _type_ #2 _ #3 _ #4 + } + { g__zrefclever_opt_lang_unknown_ \int_rand:n { 1000000 } _ #4 } + } +\cs_generate_variant:Nn + \__zrefclever_opt_varname_lang_type:nnnn { eenn , eeen } +\cs_new:Npn \__zrefclever_opt_varname_fallback:nn #1#2 + { c__zrefclever_opt_fallback_ #1 _ #2 } +\cs_new_protected:Npn \__zrefclever_opt_tl_unset:N #1 + { \tl_set_eq:NN #1 \c_novalue_tl } +\cs_new_protected:Npn \__zrefclever_opt_tl_gunset:N #1 + { \tl_gset_eq:NN #1 \c_novalue_tl } +\cs_generate_variant:Nn \__zrefclever_opt_tl_unset:N { c } +\cs_generate_variant:Nn \__zrefclever_opt_tl_gunset:N { c } +\prg_new_conditional:Npnn \__zrefclever_opt_tl_if_set:N #1 { F , TF } + { + \bool_lazy_and:nnTF + { \tl_if_exist_p:N #1 } + { ! \tl_if_novalue_p:n {#1} } + { \prg_return_true: } + { \prg_return_false: } + } +\cs_new_protected:Npn \__zrefclever_opt_tl_gset_if_new:Nn #1#2 + { + \__zrefclever_opt_tl_if_set:NF #1 + { \tl_gset:Nn #1 {#2} } + } +\cs_generate_variant:Nn \__zrefclever_opt_tl_gset_if_new:Nn { cn } +\prg_new_protected_conditional:Npnn \__zrefclever_opt_tl_get:NN #1#2 { F } + { + \__zrefclever_opt_tl_if_set:NTF #1 + { + \tl_set_eq:NN #2 #1 + \prg_return_true: + } + { \prg_return_false: } + } +\prg_generate_conditional_variant:Nnn + \__zrefclever_opt_tl_get:NN { cN } { F } +\cs_new_protected:Npn \__zrefclever_opt_seq_set_clist_split:Nn #1#2 + { \seq_set_split:Nnn #1 { , } {#2} } +\cs_new_protected:Npn \__zrefclever_opt_seq_gset_clist_split:Nn #1#2 + { \seq_gset_split:Nnn #1 { , } {#2} } +\cs_new_protected:Npn \__zrefclever_opt_seq_unset:N #1 + { \cs_set_eq:NN #1 \scan_stop: } +\cs_new_protected:Npn \__zrefclever_opt_seq_gunset:N #1 + { \cs_gset_eq:NN #1 \scan_stop: } +\cs_generate_variant:Nn \__zrefclever_opt_seq_unset:N { c } +\cs_generate_variant:Nn \__zrefclever_opt_seq_gunset:N { c } +\prg_new_conditional:Npnn \__zrefclever_opt_seq_if_set:N #1 { F , TF } + { \seq_if_exist:NTF #1 { \prg_return_true: } { \prg_return_false: } } +\prg_generate_conditional_variant:Nnn + \__zrefclever_opt_seq_if_set:N { c } { F , TF } +\prg_new_protected_conditional:Npnn \__zrefclever_opt_seq_get:NN #1#2 { F } + { + \__zrefclever_opt_seq_if_set:NTF #1 + { + \seq_set_eq:NN #2 #1 + \prg_return_true: + } + { \prg_return_false: } + } +\prg_generate_conditional_variant:Nnn + \__zrefclever_opt_seq_get:NN { cN } { F } +\cs_new_protected:Npn \__zrefclever_opt_bool_unset:N #1 + { \cs_set_eq:NN #1 \scan_stop: } +\cs_new_protected:Npn \__zrefclever_opt_bool_gunset:N #1 + { \cs_gset_eq:NN #1 \scan_stop: } +\cs_generate_variant:Nn \__zrefclever_opt_bool_unset:N { c } +\cs_generate_variant:Nn \__zrefclever_opt_bool_gunset:N { c } +\prg_new_conditional:Npnn \__zrefclever_opt_bool_if_set:N #1 { F , TF } + { \bool_if_exist:NTF #1 { \prg_return_true: } { \prg_return_false: } } +\prg_generate_conditional_variant:Nnn + \__zrefclever_opt_bool_if_set:N { c } { F , TF } +\prg_new_protected_conditional:Npnn \__zrefclever_opt_bool_get:NN #1#2 { F } + { + \__zrefclever_opt_bool_if_set:NTF #1 + { + \bool_set_eq:NN #2 #1 + \prg_return_true: + } + { \prg_return_false: } + } +\prg_generate_conditional_variant:Nnn + \__zrefclever_opt_bool_get:NN { cN } { F } +\prg_new_conditional:Npnn \__zrefclever_opt_bool_if:N #1 { T , F , TF } + { + \__zrefclever_opt_bool_if_set:NTF #1 + { \bool_if:NTF #1 { \prg_return_true: } { \prg_return_false: } } + { \prg_return_false: } + } +\prg_generate_conditional_variant:Nnn + \__zrefclever_opt_bool_if:N { c } { T , F , TF } \tl_new:N \l__zrefclever_setup_type_tl -\tl_new:N \l__zrefclever_base_language_tl +\tl_new:N \l__zrefclever_setup_language_tl \tl_new:N \l__zrefclever_lang_decl_case_tl \seq_new:N \l__zrefclever_lang_declension_seq \seq_new:N \l__zrefclever_lang_gender_seq \seq_const_from_clist:Nn - \c__zrefclever_ref_options_necessarily_not_type_specific_seq + \c__zrefclever_rf_opts_tl_not_type_specific_seq { tpairsep , tlistsep , @@ -338,18 +451,38 @@ notesep , } \seq_const_from_clist:Nn - \c__zrefclever_ref_options_possibly_type_specific_seq + \c__zrefclever_rf_opts_tl_maybe_type_specific_seq { namesep , pairsep , listsep , lastsep , rangesep , - preref , - postref , + namefont , + reffont , + } +\seq_const_from_clist:Nn + \c__zrefclever_rf_opts_seq_refbounds_seq + { + refbounds-first , + refbounds-first-sg , + refbounds-first-pb , + refbounds-first-rb , + refbounds-mid , + refbounds-mid-rb , + refbounds-mid-re , + refbounds-last , + refbounds-last-pe , + refbounds-last-re , } \seq_const_from_clist:Nn - \c__zrefclever_ref_options_type_names_seq + \c__zrefclever_rf_opts_bool_maybe_type_specific_seq + { + cap , + abbrev , + } +\seq_const_from_clist:Nn + \c__zrefclever_rf_opts_tl_type_names_seq { Name-sg , name-sg , @@ -360,39 +493,95 @@ Name-pl-ab , name-pl-ab , } -\seq_const_from_clist:Nn - \c__zrefclever_ref_options_font_seq +\seq_new:N \c__zrefclever_rf_opts_tl_typesetup_seq +\seq_gconcat:NNN \c__zrefclever_rf_opts_tl_typesetup_seq + \c__zrefclever_rf_opts_tl_maybe_type_specific_seq + \c__zrefclever_rf_opts_tl_type_names_seq +\seq_new:N \c__zrefclever_rf_opts_tl_reference_seq +\seq_gconcat:NNN \c__zrefclever_rf_opts_tl_reference_seq + \c__zrefclever_rf_opts_tl_not_type_specific_seq + \c__zrefclever_rf_opts_tl_maybe_type_specific_seq +\clist_map_inline:nn { - namefont , - reffont , + reference , + typesetup , + langsetup , + langfile , + } + { + \keys_define:nn { zref-clever/ #1 } + { + +refbounds-first .meta:n = + { + refbounds-first = {##1} , + refbounds-first-sg = {##1} , + refbounds-first-pb = {##1} , + refbounds-first-rb = {##1} , + } , + +refbounds-first .default:x = \c_novalue_tl , + +refbounds-mid .meta:n = + { + refbounds-mid = {##1} , + refbounds-mid-rb = {##1} , + refbounds-mid-re = {##1} , + } , + +refbounds-mid .default:x = \c_novalue_tl , + +refbounds-last .meta:n = + { + refbounds-last = {##1} , + refbounds-last-pe = {##1} , + refbounds-last-re = {##1} , + } , + +refbounds-last .default:x = \c_novalue_tl , + +refbounds-rb .meta:n = + { + refbounds-first-rb = {##1} , + refbounds-mid-rb = {##1} , + } , + +refbounds-rb .default:x = \c_novalue_tl , + +refbounds-re .meta:n = + { + refbounds-mid-re = {##1} , + refbounds-last-re = {##1} , + } , + +refbounds-re .default:x = \c_novalue_tl , + +refbounds .meta:n = + { + +refbounds-first = {##1} , + +refbounds-mid = {##1} , + +refbounds-last = {##1} , + } , + +refbounds .default:x = \c_novalue_tl , + refbounds .meta:n = { +refbounds = {##1} } , + refbounds .default:x = \c_novalue_tl , + } + } +\cs_new:Npn \__zrefclever_language_varname:n #1 + { g__zrefclever_declared_language_ #1 _tl } +\cs_set_eq:NN \zrefclever_language_varname:n + \__zrefclever_language_varname:n +\prg_new_conditional:Npnn \__zrefclever_language_if_declared:n #1 { T , F , TF } + { + \tl_if_exist:cTF { \__zrefclever_language_varname:n {#1} } + { \prg_return_true: } + { \prg_return_false: } } -\seq_new:N \c__zrefclever_ref_options_typesetup_seq -\seq_gconcat:NNN \c__zrefclever_ref_options_typesetup_seq - \c__zrefclever_ref_options_possibly_type_specific_seq - \c__zrefclever_ref_options_type_names_seq -\seq_gconcat:NNN \c__zrefclever_ref_options_typesetup_seq - \c__zrefclever_ref_options_typesetup_seq - \c__zrefclever_ref_options_font_seq -\seq_new:N \c__zrefclever_ref_options_reference_seq -\seq_gconcat:NNN \c__zrefclever_ref_options_reference_seq - \c__zrefclever_ref_options_necessarily_not_type_specific_seq - \c__zrefclever_ref_options_possibly_type_specific_seq -\seq_gconcat:NNN \c__zrefclever_ref_options_reference_seq - \c__zrefclever_ref_options_reference_seq - \c__zrefclever_ref_options_font_seq -\prop_new:N \g__zrefclever_languages_prop +\prg_generate_conditional_variant:Nnn + \__zrefclever_language_if_declared:n { x } { T , F , TF } +\prg_set_eq_conditional:NNn \zrefclever_language_if_declared:n + \__zrefclever_language_if_declared:n { TF } \NewDocumentCommand \zcDeclareLanguage { O { } m } { \group_begin: \tl_if_empty:nF {#2} { - \prop_if_in:NnTF \g__zrefclever_languages_prop {#2} + \__zrefclever_language_if_declared:nTF {#2} { \msg_warning:nnn { zref-clever } { language-declared } {#2} } { - \prop_gput:Nnn \g__zrefclever_languages_prop {#2} {#2} - \prop_new:c { g__zrefclever_lang_ #2 _prop } - \tl_set:Nn \l__zrefclever_base_language_tl {#2} - \keys_set:nn { zref-clever / declarelang } {#1} + \tl_new:c { \__zrefclever_language_varname:n {#2} } + \tl_gset:cn { \__zrefclever_language_varname:n {#2} } {#2} + \tl_set:Nn \l__zrefclever_setup_language_tl {#2} + \keys_set:nn { zref-clever/declarelang } {#1} } } \group_end: @@ -402,56 +591,60 @@ { \tl_if_empty:nF {#1} { - \prop_if_in:NnTF \g__zrefclever_languages_prop {#2} + \__zrefclever_language_if_declared:nTF {#2} { - \exp_args:NNnx - \prop_gput:Nnn \g__zrefclever_languages_prop {#1} - { \prop_item:Nn \g__zrefclever_languages_prop {#2} } + \tl_gset:cx { \__zrefclever_language_varname:n {#1} } + { \tl_use:c { \__zrefclever_language_varname:n {#2} } } } { \msg_warning:nnn { zref-clever } { unknown-language-alias } {#2} } } } \@onlypreamble \zcDeclareLanguageAlias -\keys_define:nn { zref-clever / declarelang } +\keys_define:nn { zref-clever/declarelang } { declension .code:n = { - \prop_gput:cnn - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { declension } {#1} + \seq_gset_from_clist:cn + { + \__zrefclever_opt_varname_language:enn + { \l__zrefclever_setup_language_tl } { declension } { seq } + } + {#1} } , declension .value_required:n = true , gender .code:n = { - \prop_gput:cnn - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { gender } {#1} + \seq_gset_from_clist:cn + { + \__zrefclever_opt_varname_language:enn + { \l__zrefclever_setup_language_tl } { gender } { seq } + } + {#1} } , gender .value_required:n = true , - allcaps .code:n = + allcaps .choices:nn = + { true , false } { - \prop_gput:cnn - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { allcaps } { true } + \use:c { bool_gset_ \l_keys_choice_tl :c } + { + \__zrefclever_opt_varname_language:enn + { \l__zrefclever_setup_language_tl } { allcaps } { bool } + } } , - allcaps .value_forbidden:n = true , + allcaps .default:n = true , } -\cs_new_protected:Npn \__zrefclever_process_language_options: +\cs_new_protected:Npn \__zrefclever_process_language_settings: { - \exp_args:NNx \prop_get:NnNTF \g__zrefclever_languages_prop + \__zrefclever_language_if_declared:xTF { \l__zrefclever_ref_language_tl } - \l__zrefclever_base_language_tl { - \exp_args:NNx \seq_set_from_clist:Nn - \l__zrefclever_lang_declension_seq + \__zrefclever_opt_seq_get:cNF { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { declension } + \__zrefclever_opt_varname_language:enn + { \l__zrefclever_ref_language_tl } { declension } { seq } } + \l__zrefclever_lang_declension_seq + { \seq_clear:N \l__zrefclever_lang_declension_seq } \seq_if_empty:NTF \l__zrefclever_lang_declension_seq { \tl_if_empty:NF \l__zrefclever_ref_decl_case_tl @@ -482,16 +675,13 @@ } } } - \exp_args:NNx \seq_set_from_clist:Nn - \l__zrefclever_lang_gender_seq + \__zrefclever_opt_seq_get:cNF { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { gender } + \__zrefclever_opt_varname_language:enn + { \l__zrefclever_ref_language_tl } { gender } { seq } } + \l__zrefclever_lang_gender_seq + { \seq_clear:N \l__zrefclever_lang_gender_seq } \seq_if_empty:NTF \l__zrefclever_lang_gender_seq { \tl_if_empty:NF \l__zrefclever_ref_gender_tl @@ -518,17 +708,12 @@ } } } - \str_if_eq:eeT + \__zrefclever_opt_bool_if:cT { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { allcaps } + \__zrefclever_opt_varname_language:enn + { \l__zrefclever_ref_language_tl } { allcaps } { bool } } - { true } - { \prop_put:Nnn \l__zrefclever_ref_options_prop { cap } { true } } + { \keys_set:nn { zref-clever/reference } { cap = true } } } { \tl_if_empty:NF \l__zrefclever_ref_decl_case_tl @@ -550,98 +735,64 @@ } } \seq_new:N \g__zrefclever_loaded_langfiles_seq -\bool_new:N \l__zrefclever_load_langfile_verbose_bool \cs_new_protected:Npn \__zrefclever_provide_langfile:n #1 { \group_begin: \@bsphack - \prop_get:NnNTF \g__zrefclever_languages_prop {#1} - \l__zrefclever_base_language_tl + \__zrefclever_language_if_declared:nT {#1} { - \seq_if_in:NVF + \seq_if_in:NxF \g__zrefclever_loaded_langfiles_seq - \l__zrefclever_base_language_tl + { \tl_use:c { \__zrefclever_language_varname:n {#1} } } { \exp_args:Nx \file_get:nnNTF - { zref-clever- \l__zrefclever_base_language_tl .lang } + { + zref-clever- + \tl_use:c { \__zrefclever_language_varname:n {#1} } + .lang + } { \ExplSyntaxOn } \l_tmpa_tl { + \tl_set:Nn \l__zrefclever_setup_language_tl {#1} \tl_clear:N \l__zrefclever_setup_type_tl - \exp_args:NNx \seq_set_from_clist:Nn - \l__zrefclever_lang_declension_seq + \__zrefclever_opt_seq_get:cNF { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { declension } + \__zrefclever_opt_varname_language:nnn + {#1} { declension } { seq } } + \l__zrefclever_lang_declension_seq + { \seq_clear:N \l__zrefclever_lang_declension_seq } \seq_if_empty:NTF \l__zrefclever_lang_declension_seq { \tl_clear:N \l__zrefclever_lang_decl_case_tl } { \seq_get_left:NN \l__zrefclever_lang_declension_seq \l__zrefclever_lang_decl_case_tl } - \exp_args:NNx \seq_set_from_clist:Nn - \l__zrefclever_lang_gender_seq + \__zrefclever_opt_seq_get:cNF { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { gender } + \__zrefclever_opt_varname_language:nnn + {#1} { gender } { seq } } - \keys_set:nV { zref-clever / langfile } \l_tmpa_tl - \seq_gput_right:NV \g__zrefclever_loaded_langfiles_seq - \l__zrefclever_base_language_tl - \msg_note:nnx { zref-clever } { langfile-loaded } - { \l__zrefclever_base_language_tl } + \l__zrefclever_lang_gender_seq + { \seq_clear:N \l__zrefclever_lang_gender_seq } + \keys_set:nV { zref-clever/langfile } \l_tmpa_tl + \seq_gput_right:Nx \g__zrefclever_loaded_langfiles_seq + { \tl_use:c { \__zrefclever_language_varname:n {#1} } } + \msg_info:nnx { zref-clever } { langfile-loaded } + { \tl_use:c { \__zrefclever_language_varname:n {#1} } } } { - \bool_if:NT \l__zrefclever_load_langfile_verbose_bool - { - \msg_warning:nnx { zref-clever } { langfile-not-available } - { \l__zrefclever_base_language_tl } - } - \seq_gput_right:NV \g__zrefclever_loaded_langfiles_seq - \l__zrefclever_base_language_tl + \seq_gput_right:Nx \g__zrefclever_loaded_langfiles_seq + { \tl_use:c { \__zrefclever_language_varname:n {#1} } } } } } - { - \bool_if:NT \l__zrefclever_load_langfile_verbose_bool - { \msg_warning:nnn { zref-clever } { unknown-language-load } {#1} } - } \@esphack \group_end: } \cs_generate_variant:Nn \__zrefclever_provide_langfile:n { x } -\cs_new_protected:Npn \__zrefclever_provide_langfile_verbose:n #1 - { - \group_begin: - \bool_set_true:N \l__zrefclever_load_langfile_verbose_bool - \__zrefclever_provide_langfile:n {#1} - \group_end: - } -\cs_generate_variant:Nn \__zrefclever_provide_langfile_verbose:n { x } -\cs_new_protected:Npn \__zrefclever_provide_lang_opt_type:nn #1#2 - { - \exp_args:Nnx \prop_gput_if_new:cnn - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { type- \l__zrefclever_setup_type_tl - #1 } {#2} - } -\cs_generate_variant:Nn \__zrefclever_provide_lang_opt_type:nn { nV } -\cs_new_protected:Npn \__zrefclever_provide_lang_opt_default:nn #1#2 - { - \prop_gput_if_new:cnn - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { default- #1 } {#2} - } -\cs_generate_variant:Nn \__zrefclever_provide_lang_opt_default:nn { nV } -\keys_define:nn { zref-clever / langfile } +\keys_define:nn { zref-clever/langfile } { type .code:n = { @@ -655,14 +806,14 @@ \seq_if_empty:NTF \l__zrefclever_lang_declension_seq { \msg_info:nnxx { zref-clever } { language-no-decl-setup } - { \l__zrefclever_base_language_tl } {#1} + { \l__zrefclever_setup_language_tl } {#1} } { \seq_if_in:NnTF \l__zrefclever_lang_declension_seq {#1} { \tl_set:Nn \l__zrefclever_lang_decl_case_tl {#1} } { \msg_info:nnxx { zref-clever } { unknown-decl-case } - {#1} { \l__zrefclever_base_language_tl } + {#1} { \l__zrefclever_setup_language_tl } \seq_get_left:NN \l__zrefclever_lang_declension_seq \l__zrefclever_lang_decl_case_tl } @@ -670,12 +821,13 @@ } , case .value_required:n = true , + gender .default:x = \c_novalue_tl , gender .code:n = { \seq_if_empty:NTF \l__zrefclever_lang_gender_seq { \msg_info:nnxxx { zref-clever } { language-no-gender } - { \l__zrefclever_base_language_tl } { gender } {#1} + { \l__zrefclever_setup_language_tl } { gender } {#1} } { \tl_if_empty:NTF \l__zrefclever_setup_type_tl @@ -684,71 +836,64 @@ { option-only-type-specific } { gender } } { - \clist_clear:N \l_tmpa_clist - \clist_map_inline:nn {#1} + \tl_if_novalue:nF {#1} { - \seq_if_in:NnTF \l__zrefclever_lang_gender_seq {##1} - { \clist_put_right:Nn \l_tmpa_clist {##1} } + \seq_clear:N \l_tmpa_seq + \clist_map_inline:nn {#1} + { + \seq_if_in:NnTF \l__zrefclever_lang_gender_seq {##1} + { \seq_put_right:Nn \l_tmpa_seq {##1} } + { + \msg_info:nnxx { zref-clever } + { gender-not-declared } + { \l__zrefclever_setup_language_tl } {##1} + } + } + \__zrefclever_opt_seq_if_set:cF { - \msg_info:nnxx { zref-clever } - { gender-not-declared } - { \l__zrefclever_base_language_tl } {##1} + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + { gender } + { seq } + } + { + \seq_gset_eq:cN + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + { gender } + { seq } + } + \l_tmpa_seq } - } - \clist_if_empty:NF \l_tmpa_clist - { - \exp_args:Nnx \__zrefclever_provide_lang_opt_type:nn - { gender } { \clist_use:Nn \l_tmpa_clist { , } } } } } } , - gender .value_required:n = true , - - cap .choices:nn = - { true , false } - { - \tl_if_empty:NTF \l__zrefclever_setup_type_tl - { - \__zrefclever_provide_lang_opt_default:nV - { cap } \l_keys_choice_tl - } - { - \__zrefclever_provide_lang_opt_type:nV - { cap } \l_keys_choice_tl - } - } , - cap .default:n = true , - nocap .meta:n = { cap = false } , - nocap .value_forbidden:n = true , - - abbrev .choices:nn = - { true , false } - { - \tl_if_empty:NTF \l__zrefclever_setup_type_tl - { - \__zrefclever_provide_lang_opt_default:nV - { abbrev } \l_keys_choice_tl - } - { - \__zrefclever_provide_lang_opt_type:nV - { abbrev } \l_keys_choice_tl - } - } , - abbrev .default:n = true , - noabbrev .meta:n = { abbrev = false }, - noabbrev .value_forbidden:n = true , } \seq_map_inline:Nn - \c__zrefclever_ref_options_necessarily_not_type_specific_seq + \c__zrefclever_rf_opts_tl_not_type_specific_seq { - \keys_define:nn { zref-clever / langfile } + \keys_define:nn { zref-clever/langfile } { - #1 .value_required:n = true , + #1 .default:x = \c_novalue_tl , #1 .code:n = { \tl_if_empty:NTF \l__zrefclever_setup_type_tl - { \__zrefclever_provide_lang_opt_default:nn {#1} {##1} } + { + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_tl_gset_if_new:cn + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { tl } + } + {##1} + } + } { \msg_info:nnn { zref-clever } { option-not-type-specific } {#1} @@ -757,25 +902,48 @@ } } \seq_map_inline:Nn - \c__zrefclever_ref_options_possibly_type_specific_seq + \c__zrefclever_rf_opts_tl_maybe_type_specific_seq { - \keys_define:nn { zref-clever / langfile } + \keys_define:nn { zref-clever/langfile } { - #1 .value_required:n = true , + #1 .default:x = \c_novalue_tl , #1 .code:n = { \tl_if_empty:NTF \l__zrefclever_setup_type_tl - { \__zrefclever_provide_lang_opt_default:nn {#1} {##1} } - { \__zrefclever_provide_lang_opt_type:nn {#1} {##1} } + { + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_tl_gset_if_new:cn + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { tl } + } + {##1} + } + } + { + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_tl_gset_if_new:cn + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { tl } + } + {##1} + } + } } , } } \seq_map_inline:Nn - \c__zrefclever_ref_options_type_names_seq + \c__zrefclever_rf_opts_tl_type_names_seq { - \keys_define:nn { zref-clever / langfile } + \keys_define:nn { zref-clever/langfile } { - #1 .value_required:n = true , + #1 .default:x = \c_novalue_tl , #1 .code:n = { \tl_if_empty:NTF \l__zrefclever_setup_type_tl @@ -785,96 +953,253 @@ } { \tl_if_empty:NTF \l__zrefclever_lang_decl_case_tl - { \__zrefclever_provide_lang_opt_type:nn {#1} {##1} } { - \__zrefclever_provide_lang_opt_type:nn - { \l__zrefclever_lang_decl_case_tl - #1 } {##1} + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_tl_gset_if_new:cn + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { tl } + } + {##1} + } + } + { + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_tl_gset_if_new:cn + { + \__zrefclever_opt_varname_lang_type:eeen + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + { \l__zrefclever_lang_decl_case_tl - #1 } { tl } + } + {##1} + } } } } , } } -\prop_new:N \g__zrefclever_fallback_unknown_lang_prop -\prop_gset_from_keyval:Nn \g__zrefclever_fallback_unknown_lang_prop - { - tpairsep = {,~} , - tlistsep = {,~} , - tlastsep = {,~} , - notesep = {~} , - namesep = {\nobreakspace} , - pairsep = {,~} , - listsep = {,~} , - lastsep = {,~} , - rangesep = {\textendash} , - preref = {} , - postref = {} , - } -\prg_new_protected_conditional:Npnn - \__zrefclever_get_lang_opt_type:nnnN #1#2#3#4 { F } - { - \prop_get:NnNTF \g__zrefclever_languages_prop {#1} - \l__zrefclever_base_language_tl - { - \prop_get:cnNTF - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { type- #2 - #3 } #4 - { \prg_return_true: } - { \prg_return_false: } - } - { \prg_return_false: } - } -\prg_generate_conditional_variant:Nnn - \__zrefclever_get_lang_opt_type:nnnN { xxxN , xxnN } { F } -\prg_new_protected_conditional:Npnn - \__zrefclever_get_lang_opt_default:nnN #1#2#3 { F } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_seq_refbounds_seq { - \prop_get:NnNTF \g__zrefclever_languages_prop {#1} - \l__zrefclever_base_language_tl + \keys_define:nn { zref-clever/langfile } { - \prop_get:cnNTF - { g__zrefclever_lang_ \l__zrefclever_base_language_tl _prop } - { default- #2 } #3 - { \prg_return_true: } - { \prg_return_false: } + #1 .default:x = \c_novalue_tl , + #1 .code:n = + { + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_seq_if_set:cF + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } {#1} { seq } + } + { + \seq_gclear:N \g_tmpa_seq + \__zrefclever_opt_seq_gset_clist_split:Nn + \g_tmpa_seq {##1} + \bool_lazy_or:nnTF + { \tl_if_empty_p:n {##1} } + { + \int_compare_p:nNn + { \seq_count:N \g_tmpa_seq } = { 4 } + } + { + \seq_gset_eq:cN + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { seq } + } + \g_tmpa_seq + } + { + \msg_info:nnxx { zref-clever } + { refbounds-must-be-four } + {#1} { \seq_count:N \g_tmpa_seq } + } + } + } + } + { + \tl_if_novalue:nF {##1} + { + \__zrefclever_opt_seq_if_set:cF + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } {#1} { seq } + } + { + \seq_gclear:N \g_tmpa_seq + \__zrefclever_opt_seq_gset_clist_split:Nn + \g_tmpa_seq {##1} + \bool_lazy_or:nnTF + { \tl_if_empty_p:n {##1} } + { + \int_compare_p:nNn + { \seq_count:N \g_tmpa_seq } = { 4 } + } + { + \seq_gset_eq:cN + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { seq } + } + \g_tmpa_seq + } + { + \msg_info:nnxx { zref-clever } + { refbounds-must-be-four } + {#1} { \seq_count:N \g_tmpa_seq } + } + } + } + } + } , } - { \prg_return_false: } - } -\prg_generate_conditional_variant:Nnn - \__zrefclever_get_lang_opt_default:nnN { xnN } { F } -\prg_new_protected_conditional:Npnn - \__zrefclever_get_fallback_unknown_lang_opt:nN #1#2 { F } - { - \prop_get:NnNTF \g__zrefclever_fallback_unknown_lang_prop - { #1 } #2 - { \prg_return_true: } - { \prg_return_false: } } -\cs_new_protected:Npn \__zrefclever_prop_put_non_empty:Nnn #1#2#3 - { - \tl_if_empty:nTF {#3} - { \prop_remove:Nn #1 {#2} } - { \prop_put:Nnn #1 {#2} {#3} } - } -\tl_new:N \l__zrefclever_ref_property_tl -\keys_define:nn { zref-clever / reference } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_bool_maybe_type_specific_seq { - ref .code:n = + \keys_define:nn { zref-clever/langfile } { - \zref@ifpropundefined {#1} + #1 .choice: , + #1 / true .code:n = { - \msg_warning:nnn { zref-clever } { zref-property-undefined } {#1} - \tl_set:Nn \l__zrefclever_ref_property_tl { default } - } - { \tl_set:Nn \l__zrefclever_ref_property_tl {#1} } - } , - ref .initial:n = default , + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \__zrefclever_opt_bool_if_set:cF + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } + } + { + \bool_gset_true:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } + } + } + } + { + \__zrefclever_opt_bool_if_set:cF + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + { + \bool_gset_true:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } + } + } , + #1 / false .code:n = + { + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \__zrefclever_opt_bool_if_set:cF + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } + } + { + \bool_gset_false:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } + } + } + } + { + \__zrefclever_opt_bool_if_set:cF + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + { + \bool_gset_false:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } + } + } , + #1 / unset .code:n = { } , + #1 .default:n = true , + no #1 .meta:n = { #1 = false } , + no #1 .value_forbidden:n = true , + } + } +\cs_new_protected:Npn \__zrefclever_opt_tl_cset_fallback:nn #1#2 + { + \tl_const:cn + { \__zrefclever_opt_varname_fallback:nn {#1} { tl } } {#2} + } +\keyval_parse:nnn + { } + { \__zrefclever_opt_tl_cset_fallback:nn } + { + tpairsep = {,~} , + tlistsep = {,~} , + tlastsep = {,~} , + notesep = {~} , + namesep = {\nobreakspace} , + pairsep = {,~} , + listsep = {,~} , + lastsep = {,~} , + rangesep = {\textendash} , + } +\cs_new_protected:Npn \__zrefclever_prop_put_non_empty:Nnn #1#2#3 + { + \tl_if_empty:nTF {#3} + { \prop_remove:Nn #1 {#2} } + { \prop_put:Nnn #1 {#2} {#3} } + } +\tl_new:N \l__zrefclever_ref_property_tl +\keys_define:nn { zref-clever/reference } + { + ref .code:n = + { + \zref@ifpropundefined {#1} + { + \msg_warning:nnn { zref-clever } { zref-property-undefined } {#1} + \tl_set:Nn \l__zrefclever_ref_property_tl { default } + } + { \tl_set:Nn \l__zrefclever_ref_property_tl {#1} } + } , + ref .initial:n = default , ref .value_required:n = true , page .meta:n = { ref = page }, page .value_forbidden:n = true , } \bool_new:N \l__zrefclever_typeset_ref_bool \bool_new:N \l__zrefclever_typeset_name_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { typeset .choice: , typeset / both .code:n = @@ -901,7 +1226,7 @@ noref .value_forbidden:n = true , } \bool_new:N \l__zrefclever_typeset_sort_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { sort .bool_set:N = \l__zrefclever_typeset_sort_bool , sort .initial:n = true , @@ -910,7 +1235,7 @@ nosort .value_forbidden:n = true , } \seq_new:N \l__zrefclever_typesort_seq -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { typesort .code:n = { @@ -925,7 +1250,7 @@ notypesort .value_forbidden:n = true , } \bool_new:N \l__zrefclever_typeset_compress_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { comp .bool_set:N = \l__zrefclever_typeset_compress_bool , comp .initial:n = true , @@ -934,113 +1259,79 @@ nocomp .value_forbidden:n = true , } \bool_new:N \l__zrefclever_typeset_range_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { range .bool_set:N = \l__zrefclever_typeset_range_bool , range .initial:n = false , range .default:n = true , } -\bool_new:N \l__zrefclever_capitalize_first_bool -\keys_define:nn { zref-clever / reference } +\bool_new:N \l__zrefclever_capfirst_bool +\keys_define:nn { zref-clever/reference } { - cap .code:n = - { - \tl_if_empty:nTF {#1} - { \prop_remove:Nn \l__zrefclever_ref_options_prop { cap } } - { - \bool_lazy_or:nnTF - { \str_if_eq_p:nn {#1} { true } } - { \str_if_eq_p:nn {#1} { false } } - { \prop_put:Nnn \l__zrefclever_ref_options_prop { cap } {#1} } - { - \msg_warning:nnn { zref-clever } - { key-boolean-or-empty } {#1} - } - } - } , - cap .default:n = true , - nocap .meta:n = { cap = false } , - nocap .value_forbidden:n = true , - - capfirst .bool_set:N = \l__zrefclever_capitalize_first_bool , + capfirst .bool_set:N = \l__zrefclever_capfirst_bool , capfirst .initial:n = false , capfirst .default:n = true , } \bool_new:N \l__zrefclever_noabbrev_first_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { - abbrev .code:n = - { - \tl_if_empty:nTF {#1} - { \prop_remove:Nn \l__zrefclever_ref_options_prop { abbrev } } - { - \bool_lazy_or:nnTF - { \str_if_eq_p:nn {#1} { true } } - { \str_if_eq_p:nn {#1} { false } } - { \prop_put:Nnn \l__zrefclever_ref_options_prop { abbrev } {#1} } - { - \msg_warning:nnn { zref-clever } - { key-boolean-or-empty } {#1} - } - } - } , - abbrev .default:n = true , - noabbrev .meta:n = { abbrev = false }, - noabbrev .value_forbidden:n = true , - noabbrevfirst .bool_set:N = \l__zrefclever_noabbrev_first_bool , noabbrevfirst .initial:n = false , noabbrevfirst .default:n = true , } -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { S .meta:n = - { capfirst = true , noabbrevfirst = true }, - S .value_forbidden:n = true , + { capfirst = {#1} , noabbrevfirst = {#1} }, + S .default:n = true , } -\bool_new:N \l__zrefclever_use_hyperref_bool -\bool_new:N \l__zrefclever_warn_hyperref_bool -\keys_define:nn { zref-clever / reference } +\bool_new:N \l__zrefclever_hyperlink_bool +\bool_new:N \l__zrefclever_hyperref_warn_bool +\keys_define:nn { zref-clever/reference } { hyperref .choice: , hyperref / auto .code:n = { - \bool_set_true:N \l__zrefclever_use_hyperref_bool - \bool_set_false:N \l__zrefclever_warn_hyperref_bool + \bool_set_true:N \l__zrefclever_hyperlink_bool + \bool_set_false:N \l__zrefclever_hyperref_warn_bool } , hyperref / true .code:n = { - \bool_set_true:N \l__zrefclever_use_hyperref_bool - \bool_set_true:N \l__zrefclever_warn_hyperref_bool + \bool_set_true:N \l__zrefclever_hyperlink_bool + \bool_set_true:N \l__zrefclever_hyperref_warn_bool } , hyperref / false .code:n = { - \bool_set_false:N \l__zrefclever_use_hyperref_bool - \bool_set_false:N \l__zrefclever_warn_hyperref_bool + \bool_set_false:N \l__zrefclever_hyperlink_bool + \bool_set_false:N \l__zrefclever_hyperref_warn_bool } , hyperref .initial:n = auto , - hyperref .default:n = auto + hyperref .default:n = true , + nohyperref .meta:n = { hyperref = false } , + nohyperref .value_forbidden:n = true , } \AddToHook { begindocument } { \__zrefclever_if_package_loaded:nTF { hyperref } { - \bool_if:NT \l__zrefclever_use_hyperref_bool + \bool_if:NT \l__zrefclever_hyperlink_bool { \RequirePackage { zref-hyperref } } } { - \bool_if:NT \l__zrefclever_warn_hyperref_bool + \bool_if:NT \l__zrefclever_hyperref_warn_bool { \msg_warning:nn { zref-clever } { missing-hyperref } } - \bool_set_false:N \l__zrefclever_use_hyperref_bool + \bool_set_false:N \l__zrefclever_hyperlink_bool } - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { hyperref .code:n = - { \msg_warning:nn { zref-clever } { hyperref-preamble-only } } + { \msg_warning:nn { zref-clever } { hyperref-preamble-only } } , + nohyperref .code:n = + { \bool_set_false:N \l__zrefclever_hyperlink_bool } , } } \str_new:N \l__zrefclever_nameinlink_str -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { nameinlink .choice: , nameinlink / true .code:n = @@ -1054,12 +1345,14 @@ nameinlink .initial:n = tsingle , nameinlink .default:n = true , } -\bool_new:N \l__zrefclever_preposinlink_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { - preposinlink .bool_set:N = \l__zrefclever_preposinlink_bool , - preposinlink .initial:n = false , - preposinlink .default:n = true , + preposinlink .code:n = + { + % NOTE Option deprecated in 2022-01-12 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { preposinlink } { refbounds } + } , } \tl_new:N \l__zrefclever_ref_language_tl @@ -1083,10 +1376,9 @@ \tl_set:Nn \l__zrefclever_main_language_tl { english } } } - \tl_set:Nn \l__zrefclever_ref_language_tl - { \l__zrefclever_current_language_tl } } -\keys_define:nn { zref-clever / reference } +\tl_set:Nn \l_zrefclever_ref_language_tl { \l__zrefclever_ref_language_tl } +\keys_define:nn { zref-clever/reference } { lang .code:n = { @@ -1098,40 +1390,34 @@ { \tl_set:Nn \l__zrefclever_ref_language_tl { \l__zrefclever_current_language_tl } - \__zrefclever_provide_langfile_verbose:x - { \l__zrefclever_ref_language_tl } } { main } { \tl_set:Nn \l__zrefclever_ref_language_tl { \l__zrefclever_main_language_tl } - \__zrefclever_provide_langfile_verbose:x - { \l__zrefclever_ref_language_tl } } } { - \prop_if_in:NnTF \g__zrefclever_languages_prop {#1} - { \tl_set:Nn \l__zrefclever_ref_language_tl {#1} } + \tl_set:Nn \l__zrefclever_ref_language_tl {#1} + \__zrefclever_language_if_declared:nF {#1} { \msg_warning:nnn { zref-clever } { unknown-language-opt } {#1} - \tl_set:Nn \l__zrefclever_ref_language_tl - { \l__zrefclever_current_language_tl } } - \__zrefclever_provide_langfile_verbose:x - { \l__zrefclever_ref_language_tl } } + \__zrefclever_provide_langfile:x + { \l__zrefclever_ref_language_tl } } } , + lang .initial:n = current , lang .value_required:n = true , } \AddToHook { begindocument / before } { \AddToHook { begindocument } { - \__zrefclever_provide_langfile:x { \l__zrefclever_ref_language_tl } - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { lang .code:n = { @@ -1141,44 +1427,35 @@ { \tl_set:Nn \l__zrefclever_ref_language_tl { \l__zrefclever_current_language_tl } - \__zrefclever_provide_langfile:x - { \l__zrefclever_ref_language_tl } } { main } { \tl_set:Nn \l__zrefclever_ref_language_tl { \l__zrefclever_main_language_tl } - \__zrefclever_provide_langfile:x - { \l__zrefclever_ref_language_tl } } } { - \prop_if_in:NnTF \g__zrefclever_languages_prop {#1} - { \tl_set:Nn \l__zrefclever_ref_language_tl {#1} } + \tl_set:Nn \l__zrefclever_ref_language_tl {#1} + \__zrefclever_language_if_declared:nF {#1} { \msg_warning:nnn { zref-clever } { unknown-language-opt } {#1} - \tl_set:Nn \l__zrefclever_ref_language_tl - { \l__zrefclever_current_language_tl } } - \__zrefclever_provide_langfile:x - { \l__zrefclever_ref_language_tl } } } , - lang .value_required:n = true , } } } \tl_new:N \l__zrefclever_ref_decl_case_tl -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { d .code:n = { \msg_warning:nnn { zref-clever } { option-document-only } { d } } , } \AddToHook { begindocument } { - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { d .tl_set:N = \l__zrefclever_ref_decl_case_tl , d .value_required:n = true , @@ -1190,7 +1467,7 @@ \bool_new:N \l__zrefclever_nudge_singular_bool \bool_new:N \l__zrefclever_nudge_gender_bool \tl_new:N \l__zrefclever_ref_gender_tl -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { nudge .choice: , nudge / true .code:n = @@ -1251,37 +1528,37 @@ } \AddToHook { begindocument } { - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { g .tl_set:N = \l__zrefclever_ref_gender_tl , g .value_required:n = true , } } \tl_new:N \l__zrefclever_ref_typeset_font_tl -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { font .tl_set:N = \l__zrefclever_ref_typeset_font_tl } -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { titleref .code:n = { \RequirePackage { zref-titleref } } , titleref .value_forbidden:n = true , } \AddToHook { begindocument } { - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { titleref .code:n = { \msg_warning:nn { zref-clever } { titleref-preamble-only } } } } \tl_new:N \l__zrefclever_zcref_note_tl -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { note .tl_set:N = \l__zrefclever_zcref_note_tl , note .value_required:n = true , } \bool_new:N \l__zrefclever_zrefcheck_available_bool \bool_new:N \l__zrefclever_zcref_with_check_bool -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { check .code:n = { \RequirePackage { zref-check } } , check .value_forbidden:n = true , @@ -1291,7 +1568,7 @@ \__zrefclever_if_package_loaded:nTF { zref-check } { \bool_set_true:N \l__zrefclever_zrefcheck_available_bool - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { check .code:n = { @@ -1303,7 +1580,7 @@ } { \bool_set_false:N \l__zrefclever_zrefcheck_available_bool - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { check .value_forbidden:n = false , check .code:n = @@ -1312,7 +1589,7 @@ } } \prop_new:N \l__zrefclever_counter_type_prop -\keys_define:nn { zref-clever / label } +\keys_define:nn { zref-clever/label } { countertype .code:n = { @@ -1341,7 +1618,7 @@ } , } \seq_new:N \l__zrefclever_counter_resetters_seq -\keys_define:nn { zref-clever / label } +\keys_define:nn { zref-clever/label } { counterresetters .code:n = { @@ -1367,7 +1644,7 @@ counterresetters .value_required:n = true , } \prop_new:N \l__zrefclever_counter_resetby_prop -\keys_define:nn { zref-clever / label } +\keys_define:nn { zref-clever/label } { counterresetby .code:n = { @@ -1391,7 +1668,7 @@ } , } \tl_new:N \l__zrefclever_current_counter_tl -\keys_define:nn { zref-clever / label } +\keys_define:nn { zref-clever/label } { currentcounter .tl_set:N = \l__zrefclever_current_counter_tl , currentcounter .value_required:n = true , @@ -1399,7 +1676,7 @@ } \bool_new:N \g__zrefclever_nocompat_bool \seq_new:N \g__zrefclever_nocompat_modules_seq -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { nocompat .code:n = { @@ -1419,7 +1696,7 @@ } \AddToHook { begindocument } { - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { nocompat .code:n = { @@ -1445,129 +1722,137 @@ \seq_gremove_all:Nn \g__zrefclever_nocompat_modules_seq {#1} } } -\prop_new:N \l__zrefclever_ref_options_prop \seq_map_inline:Nn - \c__zrefclever_ref_options_reference_seq + \c__zrefclever_rf_opts_tl_reference_seq { - \keys_define:nn { zref-clever / reference } + \keys_define:nn { zref-clever/reference } { - #1 .default:V = \c_novalue_tl , + #1 .default:x = \c_novalue_tl , #1 .code:n = { \tl_if_novalue:nTF {##1} - { \prop_remove:Nn \l__zrefclever_ref_options_prop {#1} } - { \prop_put:Nnn \l__zrefclever_ref_options_prop {#1} {##1} } + { + \__zrefclever_opt_tl_unset:c + { \__zrefclever_opt_varname_general:nn {#1} { tl } } + } + { + \tl_set:cn + { \__zrefclever_opt_varname_general:nn {#1} { tl } } + {##1} + } } , } } -\keys_define:nn { zref-clever / reference } +\keys_define:nn { zref-clever/reference } { refpre .code:n = { % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha. \msg_warning:nnnn { zref-clever }{ option-deprecated } - { refpre } { preref } + { refpre } { refbounds } } , refpos .code:n = { % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha. \msg_warning:nnnn { zref-clever }{ option-deprecated } - { refpos } { postref } + { refpos } { refbounds } } , - } -\keys_define:nn { } - { - zref-clever / zcsetup .inherit:n = + preref .code:n = { - zref-clever / label , - zref-clever / reference , - } - } -\ProcessKeysOptions { zref-clever / zcsetup } -\NewDocumentCommand \zcsetup { m } - { \__zrefclever_zcsetup:n {#1} } -\cs_new_protected:Npn \__zrefclever_zcsetup:n #1 - { \keys_set:nn { zref-clever / zcsetup } {#1} } -\cs_generate_variant:Nn \__zrefclever_zcsetup:n { x } -\NewDocumentCommand \zcRefTypeSetup { m m } - { - \prop_if_exist:cF { l__zrefclever_type_ #1 _options_prop } - { \prop_new:c { l__zrefclever_type_ #1 _options_prop } } - \tl_set:Nn \l__zrefclever_setup_type_tl {#1} - \keys_set:nn { zref-clever / typesetup } {#2} + % NOTE Option deprecated in 2022-01-14 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { preref } { refbounds } + } , + postref .code:n = + { + % NOTE Option deprecated in 2022-01-14 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { postref } { refbounds } + } , } -\keys_define:nn { zref-clever / typesetup } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_seq_refbounds_seq { - cap .code:n = + \keys_define:nn { zref-clever/reference } { - \tl_if_empty:nTF {#1} + #1 .default:x = \c_novalue_tl , + #1 .code:n = { - \prop_remove:cn + \tl_if_novalue:nTF {##1} { - l__zrefclever_type_ - \l__zrefclever_setup_type_tl _options_prop + \__zrefclever_opt_seq_unset:c + { \__zrefclever_opt_varname_general:nn {#1} { seq } } } - { cap } - } - { - \bool_lazy_or:nnTF - { \str_if_eq_p:nn {#1} { true } } - { \str_if_eq_p:nn {#1} { false } } { - \prop_put:cnn + \seq_clear:N \l_tmpa_seq + \__zrefclever_opt_seq_set_clist_split:Nn + \l_tmpa_seq {##1} + \bool_lazy_or:nnTF + { \tl_if_empty_p:n {##1} } + { \int_compare_p:nNn { \seq_count:N \l_tmpa_seq } = { 4 } } { - l__zrefclever_type_ - \l__zrefclever_setup_type_tl _options_prop + \seq_set_eq:cN + { \__zrefclever_opt_varname_general:nn {#1} { seq } } + \l_tmpa_seq + } + { + \msg_warning:nnxx { zref-clever } + { refbounds-must-be-four } + {#1} { \seq_count:N \l_tmpa_seq } } - { cap } {#1} - } - { - \msg_warning:nnn { zref-clever } - { key-boolean-or-empty } {#1} } - } - } , - cap .default:n = true , - nocap .meta:n = { cap = false } , - nocap .value_forbidden:n = true , - - abbrev .code:n = + } , + } + } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_bool_maybe_type_specific_seq + { + \keys_define:nn { zref-clever/reference } { - \tl_if_empty:nTF {#1} + #1 .choice: , + #1 / true .code:n = { - \prop_remove:cn - { - l__zrefclever_type_ - \l__zrefclever_setup_type_tl _options_prop - } - { abbrev } - } + \bool_set_true:c + { \__zrefclever_opt_varname_general:nn {#1} { bool } } + } , + #1 / false .code:n = { - \bool_lazy_or:nnTF - { \str_if_eq_p:nn {#1} { true } } - { \str_if_eq_p:nn {#1} { false } } - { - \prop_put:cnn - { - l__zrefclever_type_ - \l__zrefclever_setup_type_tl _options_prop - } - { abbrev } {#1} - } - { - \msg_warning:nnn { zref-clever } - { key-boolean-or-empty } {#1} - } - } - } , - abbrev .default:n = true , - noabbrev .meta:n = { abbrev = false }, - noabbrev .value_forbidden:n = true , + \bool_set_false:c + { \__zrefclever_opt_varname_general:nn {#1} { bool } } + } , + #1 / unset .code:n = + { + \__zrefclever_opt_bool_unset:c + { \__zrefclever_opt_varname_general:nn {#1} { bool } } + } , + #1 .default:n = true , + no #1 .meta:n = { #1 = false } , + no #1 .value_forbidden:n = true , + } + } +\keys_define:nn { } + { + zref-clever/zcsetup .inherit:n = + { + zref-clever/label , + zref-clever/reference , + } + } +\ProcessKeysOptions { zref-clever/zcsetup } +\NewDocumentCommand \zcsetup { m } + { \__zrefclever_zcsetup:n {#1} } +\cs_new_protected:Npn \__zrefclever_zcsetup:n #1 + { \keys_set:nn { zref-clever/zcsetup } {#1} } +\cs_generate_variant:Nn \__zrefclever_zcsetup:n { x } +\NewDocumentCommand \zcRefTypeSetup { m m } + { + \tl_set:Nn \l__zrefclever_setup_type_tl {#1} + \keys_set:nn { zref-clever/typesetup } {#2} } \seq_map_inline:Nn - \c__zrefclever_ref_options_necessarily_not_type_specific_seq + \c__zrefclever_rf_opts_tl_not_type_specific_seq { - \keys_define:nn { zref-clever / typesetup } + \keys_define:nn { zref-clever/typesetup } { #1 .code:n = { @@ -1577,101 +1862,171 @@ } } \seq_map_inline:Nn - \c__zrefclever_ref_options_typesetup_seq + \c__zrefclever_rf_opts_tl_typesetup_seq { - \keys_define:nn { zref-clever / typesetup } + \keys_define:nn { zref-clever/typesetup } { - #1 .default:V = \c_novalue_tl , + #1 .default:x = \c_novalue_tl , #1 .code:n = { \tl_if_novalue:nTF {##1} { - \prop_remove:cn + \__zrefclever_opt_tl_unset:c { - l__zrefclever_type_ - \l__zrefclever_setup_type_tl _options_prop + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } {#1} { tl } } - {#1} } { - \prop_put:cnn + \tl_set:cn { - l__zrefclever_type_ - \l__zrefclever_setup_type_tl _options_prop + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } {#1} { tl } } - {#1} {##1} + {##1} } } , } } -\keys_define:nn { zref-clever / typesetup } +\keys_define:nn { zref-clever/typesetup } { refpre .code:n = { % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha. \msg_warning:nnnn { zref-clever }{ option-deprecated } - { refpre } { preref } + { refpre } { refbounds } } , refpos .code:n = { % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha. \msg_warning:nnnn { zref-clever }{ option-deprecated } - { refpos } { postref } + { refpos } { refbounds } + } , + preref .code:n = + { + % NOTE Option deprecated in 2022-01-14 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { preref } { refbounds } + } , + postref .code:n = + { + % NOTE Option deprecated in 2022-01-14 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { postref } { refbounds } } , } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_seq_refbounds_seq + { + \keys_define:nn { zref-clever/typesetup } + { + #1 .default:x = \c_novalue_tl , + #1 .code:n = + { + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_seq_unset:c + { + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } {#1} { seq } + } + } + { + \seq_clear:N \l_tmpa_seq + \__zrefclever_opt_seq_set_clist_split:Nn + \l_tmpa_seq {##1} + \bool_lazy_or:nnTF + { \tl_if_empty_p:n {##1} } + { \int_compare_p:nNn { \seq_count:N \l_tmpa_seq } = { 4 } } + { + \seq_set_eq:cN + { + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } {#1} { seq } + } + \l_tmpa_seq + } + { + \msg_warning:nnxx { zref-clever } + { refbounds-must-be-four } + {#1} { \seq_count:N \l_tmpa_seq } + } + } + } , + } + } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_bool_maybe_type_specific_seq + { + \keys_define:nn { zref-clever/typesetup } + { + #1 .choice: , + #1 / true .code:n = + { + \bool_set_true:c + { + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } , + #1 / false .code:n = + { + \bool_set_false:c + { + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } , + #1 / unset .code:n = + { + \__zrefclever_opt_bool_unset:c + { + \__zrefclever_opt_varname_type:enn + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } , + #1 .default:n = true , + no #1 .meta:n = { #1 = false } , + no #1 .value_forbidden:n = true , + } + } \NewDocumentCommand \zcLanguageSetup { m m } { \group_begin: - \prop_get:NnNTF \g__zrefclever_languages_prop {#1} - \l__zrefclever_base_language_tl + \__zrefclever_language_if_declared:nTF {#1} { \tl_clear:N \l__zrefclever_setup_type_tl - \exp_args:NNx \seq_set_from_clist:Nn - \l__zrefclever_lang_declension_seq + \tl_set:Nn \l__zrefclever_setup_language_tl {#1} + \__zrefclever_opt_seq_get:cNF { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { declension } + \__zrefclever_opt_varname_language:nnn + {#1} { declension } { seq } } + \l__zrefclever_lang_declension_seq + { \seq_clear:N \l__zrefclever_lang_declension_seq } \seq_if_empty:NTF \l__zrefclever_lang_declension_seq { \tl_clear:N \l__zrefclever_lang_decl_case_tl } { \seq_get_left:NN \l__zrefclever_lang_declension_seq \l__zrefclever_lang_decl_case_tl } - \exp_args:NNx \seq_set_from_clist:Nn - \l__zrefclever_lang_gender_seq + \__zrefclever_opt_seq_get:cNF { - \prop_item:cn - { - g__zrefclever_lang_ - \l__zrefclever_base_language_tl _prop - } - { gender } + \__zrefclever_opt_varname_language:nnn + {#1} { gender } { seq } } - \keys_set:nn { zref-clever / langsetup } {#2} + \l__zrefclever_lang_gender_seq + { \seq_clear:N \l__zrefclever_lang_gender_seq } + \keys_set:nn { zref-clever/langsetup } {#2} } { \msg_warning:nnn { zref-clever } { unknown-language-setup } {#1} } \group_end: } \@onlypreamble \zcLanguageSetup -\cs_new_protected:Npn \__zrefclever_declare_lang_opt_type:nnnn #1#2#3#4 - { - \prop_gput:cnn { g__zrefclever_lang_ #1 _prop } - { type- #2 - #3 } {#4} - } -\cs_generate_variant:Nn - \__zrefclever_declare_lang_opt_type:nnnn { VVnn , VVxn , VVnx , VVnV } -\cs_new_protected:Npn \__zrefclever_declare_lang_opt_default:nnn #1#2#3 - { - \prop_gput:cnn { g__zrefclever_lang_ #1 _prop } - { default- #2 } {#3} - } -\cs_generate_variant:Nn \__zrefclever_declare_lang_opt_default:nnn { Vnn , VnV } -\keys_define:nn { zref-clever / langsetup } +\keys_define:nn { zref-clever/langsetup } { type .code:n = { @@ -1685,14 +2040,14 @@ \seq_if_empty:NTF \l__zrefclever_lang_declension_seq { \msg_warning:nnxx { zref-clever } { language-no-decl-setup } - { \l__zrefclever_base_language_tl } {#1} + { \l__zrefclever_setup_language_tl } {#1} } { \seq_if_in:NnTF \l__zrefclever_lang_declension_seq {#1} { \tl_set:Nn \l__zrefclever_lang_decl_case_tl {#1} } { \msg_warning:nnxx { zref-clever } { unknown-decl-case } - {#1} { \l__zrefclever_base_language_tl } + {#1} { \l__zrefclever_setup_language_tl } \seq_get_left:NN \l__zrefclever_lang_declension_seq \l__zrefclever_lang_decl_case_tl } @@ -1700,12 +2055,13 @@ } , case .value_required:n = true , + gender .default:x = \c_novalue_tl , gender .code:n = { \seq_if_empty:NTF \l__zrefclever_lang_gender_seq { \msg_warning:nnxxx { zref-clever } { language-no-gender } - { \l__zrefclever_base_language_tl } { gender } {#1} + { \l__zrefclever_setup_language_tl } { gender } {#1} } { \tl_if_empty:NTF \l__zrefclever_setup_type_tl @@ -1714,82 +2070,69 @@ { option-only-type-specific } { gender } } { - \clist_clear:N \l_tmpa_clist - \clist_map_inline:nn {#1} + \tl_if_novalue:nTF {#1} { - \seq_if_in:NnTF \l__zrefclever_lang_gender_seq {##1} - { \clist_put_right:Nn \l_tmpa_clist {##1} } + \__zrefclever_opt_seq_gunset:c { - \msg_warning:nnxx { zref-clever } - { gender-not-declared } - { \l__zrefclever_base_language_tl } {##1} + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + { gender } + { seq } } } - \clist_if_empty:NF \l_tmpa_clist { - \__zrefclever_declare_lang_opt_type:VVnx - \l__zrefclever_base_language_tl - \l__zrefclever_setup_type_tl - { gender } { \clist_use:Nn \l_tmpa_clist { , } } + \seq_clear:N \l_tmpa_seq + \clist_map_inline:nn {#1} + { + \seq_if_in:NnTF \l__zrefclever_lang_gender_seq {##1} + { \seq_put_right:Nn \l_tmpa_seq {##1} } + { + \msg_warning:nnxx { zref-clever } + { gender-not-declared } + { \l__zrefclever_setup_language_tl } {##1} + } + } + \seq_gset_eq:cN + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + { gender } + { seq } + } + \l_tmpa_seq } } } } , - gender .value_required:n = true , - - cap .choices:nn = - { true , false } - { - \tl_if_empty:NTF \l__zrefclever_setup_type_tl - { - \__zrefclever_declare_lang_opt_default:VnV - \l__zrefclever_base_language_tl - { cap } \l_keys_choice_tl - } - { - \__zrefclever_declare_lang_opt_type:VVnV - \l__zrefclever_base_language_tl - \l__zrefclever_setup_type_tl - { cap } \l_keys_choice_tl - } - } , - cap .default:n = true , - nocap .meta:n = { cap = false } , - nocap .value_forbidden:n = true , - - abbrev .choices:nn = - { true , false } - { - \tl_if_empty:NTF \l__zrefclever_setup_type_tl - { - \__zrefclever_declare_lang_opt_default:VnV - \l__zrefclever_base_language_tl - { abbrev } \l_keys_choice_tl - } - { - \__zrefclever_declare_lang_opt_type:VVnV - \l__zrefclever_base_language_tl - \l__zrefclever_setup_type_tl - { abbrev } \l_keys_choice_tl - } - } , - abbrev .default:n = true , - noabbrev .meta:n = { abbrev = false }, - noabbrev .value_forbidden:n = true , } \seq_map_inline:Nn - \c__zrefclever_ref_options_necessarily_not_type_specific_seq + \c__zrefclever_rf_opts_tl_not_type_specific_seq { - \keys_define:nn { zref-clever / langsetup } + \keys_define:nn { zref-clever/langsetup } { - #1 .value_required:n = true , + #1 .default:x = \c_novalue_tl , #1 .code:n = { \tl_if_empty:NTF \l__zrefclever_setup_type_tl { - \__zrefclever_declare_lang_opt_default:Vnn - \l__zrefclever_base_language_tl - {#1} {##1} + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_tl_gunset:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } {#1} { tl } + } + } + { + \tl_gset:cn + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } {#1} { tl } + } + {##1} + } } { \msg_warning:nnn { zref-clever } @@ -1799,72 +2142,292 @@ } } \seq_map_inline:Nn - \c__zrefclever_ref_options_possibly_type_specific_seq + \c__zrefclever_rf_opts_tl_maybe_type_specific_seq { - \keys_define:nn { zref-clever / langsetup } + \keys_define:nn { zref-clever/langsetup } { #1 .value_required:n = true , #1 .code:n = { \tl_if_empty:NTF \l__zrefclever_setup_type_tl { - \__zrefclever_declare_lang_opt_default:Vnn - \l__zrefclever_base_language_tl - {#1} {##1} + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_tl_gunset:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } {#1} { tl } + } + } + { + \tl_gset:cn + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } {#1} { tl } + } + {##1} + } } { - \__zrefclever_declare_lang_opt_type:VVnn - \l__zrefclever_base_language_tl - \l__zrefclever_setup_type_tl - {#1} {##1} + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_tl_gunset:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { tl } + } + } + { + \tl_gset:cn + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { tl } + } + {##1} + } } } , } } -\keys_define:nn { zref-clever / langsetup } +\keys_define:nn { zref-clever/langsetup } { refpre .code:n = { % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha. \msg_warning:nnnn { zref-clever }{ option-deprecated } - { refpre } { preref } + { refpre } { refbounds } } , refpos .code:n = { % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha. \msg_warning:nnnn { zref-clever }{ option-deprecated } - { refpos } { postref } + { refpos } { refbounds } + } , + preref .code:n = + { + % NOTE Option deprecated in 2022-01-14 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { preref } { refbounds } + } , + postref .code:n = + { + % NOTE Option deprecated in 2022-01-14 for v0.2.0-alpha. + \msg_warning:nnnn { zref-clever }{ option-deprecated } + { postref } { refbounds } } , } \seq_map_inline:Nn - \c__zrefclever_ref_options_type_names_seq + \c__zrefclever_rf_opts_tl_type_names_seq { - \keys_define:nn { zref-clever / langsetup } + \keys_define:nn { zref-clever/langsetup } { #1 .value_required:n = true , #1 .code:n = { \tl_if_empty:NTF \l__zrefclever_setup_type_tl { - \msg_warning:nnn { zref-clever } - { option-only-type-specific } {#1} + \msg_warning:nnn { zref-clever } + { option-only-type-specific } {#1} + } + { + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_tl_gunset:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { tl } + } + } + { + \tl_if_empty:NTF \l__zrefclever_lang_decl_case_tl + { + \tl_gset:cn + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { tl } + } + {##1} + } + { + \tl_gset:cn + { + \__zrefclever_opt_varname_lang_type:eeen + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + { \l__zrefclever_lang_decl_case_tl - #1 } + { tl } + } + {##1} + } + } + } + } , + } + } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_seq_refbounds_seq + { + \keys_define:nn { zref-clever/langsetup } + { + #1 .default:x = \c_novalue_tl , + #1 .code:n = + { + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_seq_gunset:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { seq } + } + } + { + \seq_gclear:N \g_tmpa_seq + \__zrefclever_opt_seq_gset_clist_split:Nn + \g_tmpa_seq {##1} + \bool_lazy_or:nnTF + { \tl_if_empty_p:n {##1} } + { + \int_compare_p:nNn + { \seq_count:N \g_tmpa_seq } = { 4 } + } + { + \seq_gset_eq:cN + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { seq } + } + \g_tmpa_seq + } + { + \msg_warning:nnxx { zref-clever } + { refbounds-must-be-four } + {#1} { \seq_count:N \g_tmpa_seq } + } + } + } + { + \tl_if_novalue:nTF {##1} + { + \__zrefclever_opt_seq_gunset:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } {#1} { seq } + } + } + { + \seq_gclear:N \g_tmpa_seq + \__zrefclever_opt_seq_gset_clist_split:Nn + \g_tmpa_seq {##1} + \bool_lazy_or:nnTF + { \tl_if_empty_p:n {##1} } + { + \int_compare_p:nNn + { \seq_count:N \g_tmpa_seq } = { 4 } + } + { + \seq_gset_eq:cN + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } {#1} { seq } + } + \g_tmpa_seq + } + { + \msg_warning:nnxx { zref-clever } + { refbounds-must-be-four } + {#1} { \seq_count:N \g_tmpa_seq } + } + } + } + } , + } + } +\seq_map_inline:Nn + \c__zrefclever_rf_opts_bool_maybe_type_specific_seq + { + \keys_define:nn { zref-clever/langsetup } + { + #1 .choice: , + #1 / true .code:n = + { + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \bool_gset_true:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } + } + } + { + \bool_gset_true:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } + } , + #1 / false .code:n = + { + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \bool_gset_false:c + { + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } + } } { - \tl_if_empty:NTF \l__zrefclever_lang_decl_case_tl + \bool_gset_false:c + { + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } + } + } + } , + #1 / unset .code:n = + { + \tl_if_empty:NTF \l__zrefclever_setup_type_tl + { + \__zrefclever_opt_bool_gunset:c { - \__zrefclever_declare_lang_opt_type:VVnn - \l__zrefclever_base_language_tl - \l__zrefclever_setup_type_tl - {#1} {##1} + \__zrefclever_opt_varname_lang_default:enn + { \l__zrefclever_setup_language_tl } + {#1} { bool } } + } + { + \__zrefclever_opt_bool_gunset:c { - \__zrefclever_declare_lang_opt_type:VVxn - \l__zrefclever_base_language_tl - \l__zrefclever_setup_type_tl - { \l__zrefclever_lang_decl_case_tl - #1 } {##1} + \__zrefclever_opt_varname_lang_type:eenn + { \l__zrefclever_setup_language_tl } + { \l__zrefclever_setup_type_tl } + {#1} { bool } } } } , + #1 .default:n = true , + no #1 .meta:n = { #1 = false } , + no #1 .value_forbidden:n = true , } } \NewDocumentCommand \zcref { s O { } m } @@ -1872,11 +2435,11 @@ \cs_new_protected:Npn \__zrefclever_zcref:nnn #1#2#3 { \group_begin: - \keys_set:nn { zref-clever / reference } {#3} + \keys_set:nn { zref-clever/reference } {#3} \seq_set_from_clist:Nn \l__zrefclever_zcref_labels_seq {#1} \bool_set:Nn \l__zrefclever_link_star_bool {#2} \__zrefclever_provide_langfile:x { \l__zrefclever_ref_language_tl } - \__zrefclever_process_language_options: + \__zrefclever_process_language_settings: \bool_lazy_and:nnT { \l__zrefclever_zrefcheck_available_bool } { \l__zrefclever_zcref_with_check_bool } @@ -1891,7 +2454,10 @@ \group_end: \tl_if_empty:NF \l__zrefclever_zcref_note_tl { - \__zrefclever_get_ref_opt_typeset:nN { notesep } \l_tmpa_tl + \__zrefclever_get_rf_opt_tl:nxxN { notesep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l_tmpa_tl \l_tmpa_tl \l__zrefclever_zcref_note_tl } @@ -1914,9 +2480,11 @@ \bool_new:N \l__zrefclever_link_star_bool \NewDocumentCommand \zcpageref { s O { } m } { - \IfBooleanTF {#1} - { \zcref*[#2, ref = page] {#3} } - { \zcref [#2, ref = page] {#3} } + \group_begin: + \IfBooleanT {#1} + { \bool_set_false:N \l__zrefclever_hyperlink_bool } + \zcref [#2, ref = page] {#3} + \group_end: } \tl_new:N \l__zrefclever_label_type_a_tl \tl_new:N \l__zrefclever_label_type_b_tl @@ -1931,7 +2499,7 @@ \cs_new_protected:Npn \__zrefclever_sort_labels: { \seq_clear:N \l__zrefclever_label_types_seq - \tl_if_eq:NnF \l__zrefclever_ref_property_tl { page } + \tl_if_eq:NnF \l__zrefclever_ref_propserty_tl { page } { \seq_map_function:NN \l__zrefclever_zcref_labels_seq \__zrefclever_label_type_put_new_right:n @@ -1973,7 +2541,7 @@ \cs_new_protected:Npn \__zrefclever_label_type_put_new_right:n #1 { \__zrefclever_extract_default:Nnnn - \l__zrefclever_label_type_a_tl {#1} { zc@type } { \c_empty_tl } + \l__zrefclever_label_type_a_tl {#1} { zc@type } { } \seq_if_in:NVF \l__zrefclever_label_types_seq \l__zrefclever_label_type_a_tl { @@ -1997,15 +2565,15 @@ \cs_new_protected:Npn \__zrefclever_sort_default_same_type:nn #1#2 { \__zrefclever_extract_default:Nnnn \l__zrefclever_label_enclval_a_tl - {#1} { zc@enclval } { \c_empty_tl } + {#1} { zc@enclval } { } \tl_reverse:N \l__zrefclever_label_enclval_a_tl \__zrefclever_extract_default:Nnnn \l__zrefclever_label_enclval_b_tl - {#2} { zc@enclval } { \c_empty_tl } + {#2} { zc@enclval } { } \tl_reverse:N \l__zrefclever_label_enclval_b_tl \__zrefclever_extract_default:Nnnn \l__zrefclever_label_extdoc_a_tl - {#1} { externaldocument } { \c_empty_tl } + {#1} { externaldocument } { } \__zrefclever_extract_default:Nnnn \l__zrefclever_label_extdoc_b_tl - {#2} { externaldocument } { \c_empty_tl } + {#2} { externaldocument } { } \bool_set_false:N \l__zrefclever_sort_decided_bool @@ -2190,6 +2758,7 @@ \bool_new:N \l__zrefclever_last_of_type_bool \int_new:N \l__zrefclever_type_count_int \int_new:N \l__zrefclever_label_count_int +\int_new:N \l__zrefclever_ref_count_int \tl_new:N \l__zrefclever_label_a_tl \tl_new:N \l__zrefclever_label_b_tl \tl_new:N \l__zrefclever_typeset_queue_prev_tl @@ -2198,9 +2767,10 @@ \tl_new:N \l__zrefclever_type_first_label_type_tl \tl_new:N \l__zrefclever_type_name_tl \bool_new:N \l__zrefclever_name_in_link_bool +\bool_new:N \l__zrefclever_type_name_missing_bool \tl_new:N \l__zrefclever_name_format_tl \tl_new:N \l__zrefclever_name_format_fallback_tl -\tl_new:N \l__zrefclever_type_name_gender_tl +\seq_new:N \l__zrefclever_type_name_gender_seq \int_new:N \l__zrefclever_range_count_int \int_new:N \l__zrefclever_range_same_count_int \tl_new:N \l__zrefclever_range_beg_label_tl @@ -2214,12 +2784,22 @@ \tl_new:N \l__zrefclever_listsep_tl \tl_new:N \l__zrefclever_lastsep_tl \tl_new:N \l__zrefclever_rangesep_tl -\tl_new:N \l__zrefclever_preref_tl -\tl_new:N \l__zrefclever_postref_tl \tl_new:N \l__zrefclever_namefont_tl \tl_new:N \l__zrefclever_reffont_tl -\bool_new:N \l__zrefclever_capitalize_bool +\bool_new:N \l__zrefclever_cap_bool \bool_new:N \l__zrefclever_abbrev_bool +\seq_new:N \l__zrefclever_refbounds_first_seq +\seq_new:N \l__zrefclever_refbounds_first_sg_seq +\seq_new:N \l__zrefclever_refbounds_first_pb_seq +\seq_new:N \l__zrefclever_refbounds_first_rb_seq +\seq_new:N \l__zrefclever_refbounds_mid_seq +\seq_new:N \l__zrefclever_refbounds_mid_rb_seq +\seq_new:N \l__zrefclever_refbounds_mid_re_seq +\seq_new:N \l__zrefclever_refbounds_last_seq +\seq_new:N \l__zrefclever_refbounds_last_pe_seq +\seq_new:N \l__zrefclever_refbounds_last_re_seq +\seq_new:N \l__zrefclever_type_first_refbounds_seq +\bool_new:N \l__zrefclever_type_first_refbounds_set_bool \bool_new:N \l__zrefclever_verbose_testing_bool \cs_new_protected:Npn \__zrefclever_typeset_refs: { @@ -2232,15 +2812,23 @@ \tl_clear:N \l__zrefclever_range_beg_label_tl \int_zero:N \l__zrefclever_label_count_int \int_zero:N \l__zrefclever_type_count_int + \int_zero:N \l__zrefclever_ref_count_int \int_zero:N \l__zrefclever_range_count_int \int_zero:N \l__zrefclever_range_same_count_int + \bool_set_false:N \l__zrefclever_type_first_refbounds_set_bool % Get type block options (not type-specific). - \__zrefclever_get_ref_opt_typeset:nN { tpairsep } + \__zrefclever_get_rf_opt_tl:nxxN { tpairsep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_tpairsep_tl - \__zrefclever_get_ref_opt_typeset:nN { tlistsep } + \__zrefclever_get_rf_opt_tl:nxxN { tlistsep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_tlistsep_tl - \__zrefclever_get_ref_opt_typeset:nN { tlastsep } + \__zrefclever_get_rf_opt_tl:nxxN { tlastsep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_tlastsep_tl % Process label stack. @@ -2323,32 +2911,86 @@ } } - % Get type-specific separators, pre-/postref font and other options, - % once per type. + % Get possibly type-specific separators, refbounds, font and other + % options, once per type. \int_compare:nNnT { \l__zrefclever_label_count_int } = { 0 } { - \__zrefclever_get_ref_opt_typeset:nN { namesep } + \__zrefclever_get_rf_opt_tl:nxxN { namesep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_namesep_tl - \__zrefclever_get_ref_opt_typeset:nN { pairsep } + \__zrefclever_get_rf_opt_tl:nxxN { pairsep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_pairsep_tl - \__zrefclever_get_ref_opt_typeset:nN { listsep } + \__zrefclever_get_rf_opt_tl:nxxN { listsep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_listsep_tl - \__zrefclever_get_ref_opt_typeset:nN { lastsep } + \__zrefclever_get_rf_opt_tl:nxxN { lastsep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_lastsep_tl - \__zrefclever_get_ref_opt_typeset:nN { rangesep } + \__zrefclever_get_rf_opt_tl:nxxN { rangesep } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_rangesep_tl - \__zrefclever_get_ref_opt_typeset:nN { preref } - \l__zrefclever_preref_tl - \__zrefclever_get_ref_opt_typeset:nN { postref } - \l__zrefclever_postref_tl - \__zrefclever_get_ref_opt_font:nN { namefont } + \__zrefclever_get_rf_opt_tl:nxxN { namefont } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_namefont_tl - \__zrefclever_get_ref_opt_font:nN { reffont } + \__zrefclever_get_rf_opt_tl:nxxN { reffont } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_reffont_tl - \__zrefclever_get_ref_opt_bool:nnN { cap } { false } - \l__zrefclever_capitalize_bool - \__zrefclever_get_ref_opt_bool:nnN { abbrev } { false } + \__zrefclever_get_rf_opt_bool:nnxxN { cap } { false } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_cap_bool + \__zrefclever_get_rf_opt_bool:nnxxN { abbrev } { false } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } \l__zrefclever_abbrev_bool + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-first } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_first_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-first-sg } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_first_sg_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-first-pb } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_first_pb_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-first-rb } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_first_rb_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-mid } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_mid_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-mid-rb } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_mid_rb_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-mid-re } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_mid_re_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-last } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_last_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-last-pe } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_last_pe_seq + \__zrefclever_get_rf_opt_seq:nxxN { refbounds-last-re } + { \l__zrefclever_label_type_a_tl } + { \l__zrefclever_ref_language_tl } + \l__zrefclever_refbounds_last_re_seq } % Here we send this to a couple of auxiliary functions. @@ -2373,19 +3015,31 @@ \l__zrefclever_label_a_tl \tl_set:NV \l__zrefclever_type_first_label_type_tl \l__zrefclever_label_type_a_tl + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_sg_seq + \bool_set_true:N \l__zrefclever_type_first_refbounds_set_bool } % The last is the second: we have a pair (if not repeated). % Test: 'zc-typeset01.lvt': "Last of type: pair" { 1 } { - \int_compare:nNnF { \l__zrefclever_range_same_count_int } = { 1 } + \int_compare:nNnTF { \l__zrefclever_range_same_count_int } = { 1 } + { + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_sg_seq + \bool_set_true:N \l__zrefclever_type_first_refbounds_set_bool + } { \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_pairsep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_pe_seq } + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_pb_seq + \bool_set_true:N \l__zrefclever_type_first_refbounds_set_bool } } } @@ -2398,28 +3052,56 @@ % Test: 'zc-typeset01.lvt': "Last of type: not range" { 0 } { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \int_compare:nNnTF { \l__zrefclever_ref_count_int } < { 2 } + { + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_pairsep_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_pe_seq + } + } { - \exp_not:V \l__zrefclever_lastsep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_lastsep_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_seq + } } } % Last in the range is also the second in it. % Test: 'zc-typeset01.lvt': "Last of type: pair in sequence" { 1 } { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \int_compare:nNnTF + { \l__zrefclever_range_same_count_int } = { 1 } { % We know `range_beg_label' is not empty, since this is the % second element in the range, but the third or more in the % type list. - \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V \l__zrefclever_range_beg_label_tl - \int_compare:nNnF - { \l__zrefclever_range_same_count_int } = { 1 } + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_pairsep_tl + \__zrefclever_get_ref:VN + \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_last_pe_seq + } + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_pb_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } + { + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { + \exp_not:V \l__zrefclever_listsep_tl + \__zrefclever_get_ref:VN + \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_seq \exp_not:V \l__zrefclever_lastsep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_seq } } } @@ -2437,49 +3119,117 @@ { 0 } { % If `range_beg_label' is empty, it means it was also the - % first of the type, and hence was already handled. - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + % first of the type, and hence its typesetting was already + % handled, and we just have to set refbounds. + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_sg_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } + { + \int_compare:nNnTF + { \l__zrefclever_ref_count_int } < { 2 } { - \exp_not:V \l__zrefclever_lastsep_tl - \__zrefclever_get_ref:V - \l__zrefclever_range_beg_label_tl + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_pairsep_tl + \__zrefclever_get_ref:VN + \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_last_pe_seq + } + } + { + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_lastsep_tl + \__zrefclever_get_ref:VN + \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_last_seq + } } } } - % A `range', but with no skipped value, treat as list. + % A `range', but with no skipped value, treat as pair if range + % started with first of type, otherwise as list. % Test: 'zc-typeset01.lvt': "Last of type: range to pair" { 1 } { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + % Ditto. + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl + { + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_pb_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_pairsep_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_pe_seq + } + } { - % Ditto. - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V + \__zrefclever_get_ref:VN \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_seq + } + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_lastsep_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_seq } - \exp_not:V \l__zrefclever_lastsep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl } } } { % An actual range. % Test: 'zc-typeset01.lvt': "Last of type: range" - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + % Ditto. + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl + { + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_rb_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } { - % Ditto. - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + \int_compare:nNnTF + { \l__zrefclever_ref_count_int } < { 2 } + { + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_pairsep_tl + \__zrefclever_get_ref:VN + \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_rb_seq + } + \seq_set_eq:NN + \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_pb_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } { - \exp_not:V \l__zrefclever_lastsep_tl - \__zrefclever_get_ref:V - \l__zrefclever_range_beg_label_tl + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_lastsep_tl + \__zrefclever_get_ref:VN + \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_rb_seq + } } + } + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { \exp_not:V \l__zrefclever_rangesep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_re_seq } } } @@ -2511,16 +3261,40 @@ } % Test: 'zc-typeset01.lvt': "Last of type: option range" % Test: 'zc-typeset01.lvt': "Last of type: option range to pair" - \tl_set:Nx \l__zrefclever_typeset_queue_curr_tl + \bool_if:NTF \l__zrefclever_next_maybe_range_bool { - \bool_if:NTF \l__zrefclever_next_maybe_range_bool - { \exp_not:V \l__zrefclever_pairsep_tl } - { \exp_not:V \l__zrefclever_rangesep_tl } - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \tl_set:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_pairsep_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_pe_seq + } + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_pb_seq + \bool_set_true:N \l__zrefclever_type_first_refbounds_set_bool + } + { + \tl_set:Nx \l__zrefclever_typeset_queue_curr_tl + { + \exp_not:V \l__zrefclever_rangesep_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_last_re_seq + } + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_rb_seq + \bool_set_true:N \l__zrefclever_type_first_refbounds_set_bool } } } + % If none of the special cases for the first of type refbounds have been + % set, do it. + \bool_if:NF \l__zrefclever_type_first_refbounds_set_bool + { + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_seq + } + % Now that the type block is finished, we can add the name and the first % ref to the queue. Also, if "typeset" option is not "both", handle it % here as well. @@ -2536,7 +3310,10 @@ { % Test: 'zc-typeset01.lvt': "Last of type: option typeset ref" \tl_put_left:Nx \l__zrefclever_typeset_queue_curr_tl - { \__zrefclever_get_ref:V \l__zrefclever_type_first_label_tl } + { + \__zrefclever_get_ref:VN \l__zrefclever_type_first_label_tl + \l__zrefclever_type_first_refbounds_seq + } } { \bool_if:NTF \l__zrefclever_typeset_name_bool @@ -2636,9 +3413,11 @@ \tl_clear:N \l__zrefclever_type_first_label_type_tl \tl_clear:N \l__zrefclever_range_beg_label_tl \int_zero:N \l__zrefclever_label_count_int + \int_zero:N \l__zrefclever_ref_count_int \int_incr:N \l__zrefclever_type_count_int \int_zero:N \l__zrefclever_range_count_int \int_zero:N \l__zrefclever_range_same_count_int + \bool_set_false:N \l__zrefclever_type_first_refbounds_set_bool } } \cs_new_protected:Npn \__zrefclever_typeset_refs_not_last_of_type: @@ -2666,6 +3445,7 @@ \l__zrefclever_label_a_tl \tl_set:NV \l__zrefclever_type_first_label_type_tl \l__zrefclever_label_type_a_tl + \int_incr:N \l__zrefclever_ref_count_int % If the next label may be part of a range, we set `range_beg_label' % to "empty" (we deal with it as the "first", and must do it there, to @@ -2710,10 +3490,12 @@ % Test: 'zc-typeset01.lvt': "Not last of type: no range" { 0 } { + \int_incr:N \l__zrefclever_ref_count_int \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_mid_seq } } % Last is second in the range: if `range_same_count' is also @@ -2723,20 +3505,33 @@ % Test: 'zc-typeset01.lvt': "Not last of type: range pair" { 1 } { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl + { + \seq_set_eq:NN \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } { - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + \int_incr:N \l__zrefclever_ref_count_int + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V + \__zrefclever_get_ref:VN \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_seq } - \int_compare:nNnF - { \l__zrefclever_range_same_count_int } = { 1 } + } + \int_compare:nNnF + { \l__zrefclever_range_same_count_int } = { 1 } + { + \int_incr:N \l__zrefclever_ref_count_int + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_mid_seq } } } @@ -2755,44 +3550,85 @@ % Test: 'zc-typeset01.lvt': "Not last of type: range to one" { 0 } { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl { - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + \seq_set_eq:NN + \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } + { + \int_incr:N \l__zrefclever_ref_count_int + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V + \__zrefclever_get_ref:VN \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_seq } } } % Test: 'zc-typeset01.lvt': "Not last of type: range to pair" { 1 } { - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl + { + \seq_set_eq:NN + \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } { - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + \int_incr:N \l__zrefclever_ref_count_int + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V + \__zrefclever_get_ref:VN \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_seq } + } + \int_incr:N \l__zrefclever_ref_count_int + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_mid_seq } } } { % Test: 'zc-typeset01.lvt': "Not last of type: range" - \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + \tl_if_empty:VTF \l__zrefclever_range_beg_label_tl + { + \seq_set_eq:NN + \l__zrefclever_type_first_refbounds_seq + \l__zrefclever_refbounds_first_rb_seq + \bool_set_true:N + \l__zrefclever_type_first_refbounds_set_bool + } { - \tl_if_empty:VF \l__zrefclever_range_beg_label_tl + \int_incr:N \l__zrefclever_ref_count_int + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl { \exp_not:V \l__zrefclever_listsep_tl - \__zrefclever_get_ref:V + \__zrefclever_get_ref:VN \l__zrefclever_range_beg_label_tl + \l__zrefclever_refbounds_mid_rb_seq } + } + % For the purposes of the serial comma, and thus for the + % distinction of 'lastsep' and 'pairsep', a "range" counts + % as one. Since 'range_beg' has already been counted + % (here or with the first of type), we refrain from + % incrementing 'ref_count_int'. + \tl_put_right:Nx \l__zrefclever_typeset_queue_curr_tl + { \exp_not:V \l__zrefclever_rangesep_tl - \__zrefclever_get_ref:V \l__zrefclever_label_a_tl + \__zrefclever_get_ref:VN \l__zrefclever_label_a_tl + \l__zrefclever_refbounds_mid_re_seq } } } @@ -2808,49 +3644,47 @@ { \zref@default } \cs_new_protected:Npn \__zrefclever_name_default: { \zref@default } -\cs_new:Npn \__zrefclever_get_ref:n #1 +\cs_new:Npn \__zrefclever_get_ref:nN #1#2 { \zref@ifrefcontainsprop {#1} { \l__zrefclever_ref_property_tl } { \bool_if:nTF { - \l__zrefclever_use_hyperref_bool && + \l__zrefclever_hyperlink_bool && ! \l__zrefclever_link_star_bool } { - \bool_if:NF \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_preref_tl } + \exp_not:N \group_begin: + \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn #2 { 1 } % It's two `@s', but escaped for DocStrip. \exp_not:N \hyper@@link { \__zrefclever_extract_url_unexp:n {#1} } { \__zrefclever_extract_unexp:nnn {#1} { anchor } { } } { - \bool_if:NT \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_preref_tl } - \exp_not:N \group_begin: - \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn #2 { 2 } \__zrefclever_extract_unexp:nvn {#1} { l__zrefclever_ref_property_tl } { } - \exp_not:N \group_end: - \bool_if:NT \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_postref_tl } + \seq_item:Nn #2 { 3 } } - \bool_if:NF \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_postref_tl } + \seq_item:Nn #2 { 4 } + \exp_not:N \group_end: } { - \exp_not:V \l__zrefclever_preref_tl \exp_not:N \group_begin: \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn #2 { 1 } + \seq_item:Nn #2 { 2 } \__zrefclever_extract_unexp:nvn {#1} { l__zrefclever_ref_property_tl } { } + \seq_item:Nn #2 { 3 } + \seq_item:Nn #2 { 4 } \exp_not:N \group_end: - \exp_not:V \l__zrefclever_postref_tl } } { \__zrefclever_ref_default: } } -\cs_generate_variant:Nn \__zrefclever_get_ref:n { V } +\cs_generate_variant:Nn \__zrefclever_get_ref:nN { VN } \cs_new:Npn \__zrefclever_get_ref_first: { \zref@ifrefundefined { \l__zrefclever_type_first_label_tl } @@ -2862,6 +3696,7 @@ { \l__zrefclever_type_first_label_tl } { \l__zrefclever_ref_property_tl } { + \exp_not:N \group_begin: % It's two `@s', but escaped for DocStrip. \exp_not:N \hyper@@link { @@ -2878,18 +3713,19 @@ \exp_not:V \l__zrefclever_type_name_tl \exp_not:N \group_end: \exp_not:V \l__zrefclever_namesep_tl - \exp_not:V \l__zrefclever_preref_tl \exp_not:N \group_begin: \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 1 } + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 2 } \__zrefclever_extract_unexp:Vvn \l__zrefclever_type_first_label_tl { l__zrefclever_ref_property_tl } { } + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 3 } \exp_not:N \group_end: - \bool_if:NT \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_postref_tl } } - \bool_if:NF \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_postref_tl } + \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 4 } + \exp_not:N \group_end: } { \exp_not:N \group_begin: @@ -2901,7 +3737,7 @@ } } { - \tl_if_empty:NTF \l__zrefclever_type_name_tl + \bool_if:nTF \l__zrefclever_type_name_missing_bool { \__zrefclever_name_default: \exp_not:V \l__zrefclever_namesep_tl @@ -2911,7 +3747,8 @@ \exp_not:V \l__zrefclever_namefont_tl \exp_not:V \l__zrefclever_type_name_tl \exp_not:N \group_end: - \exp_not:V \l__zrefclever_namesep_tl + \tl_if_empty:NF \l__zrefclever_type_name_tl + { \exp_not:V \l__zrefclever_namesep_tl } } \zref@ifrefcontainsprop { \l__zrefclever_type_first_label_tl } @@ -2919,12 +3756,14 @@ { \bool_if:nTF { - \l__zrefclever_use_hyperref_bool && + \l__zrefclever_hyperlink_bool && ! \l__zrefclever_link_star_bool } { - \bool_if:NF \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_preref_tl } + \exp_not:N \group_begin: + \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn + \l__zrefclever_type_first_refbounds_seq { 1 } % It's two '@s', but escaped for DocStrip. \exp_not:N \hyper@@link { @@ -2936,29 +3775,29 @@ \l__zrefclever_type_first_label_tl { anchor } { } } { - \bool_if:NT \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_preref_tl } - \exp_not:N \group_begin: - \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn + \l__zrefclever_type_first_refbounds_seq { 2 } \__zrefclever_extract_unexp:Vvn \l__zrefclever_type_first_label_tl { l__zrefclever_ref_property_tl } { } - \exp_not:N \group_end: - \bool_if:NT \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_postref_tl } + \seq_item:Nn + \l__zrefclever_type_first_refbounds_seq { 3 } } - \bool_if:NF \l__zrefclever_preposinlink_bool - { \exp_not:V \l__zrefclever_postref_tl } + \seq_item:Nn + \l__zrefclever_type_first_refbounds_seq { 4 } + \exp_not:N \group_end: } { - \exp_not:V \l__zrefclever_preref_tl \exp_not:N \group_begin: \exp_not:V \l__zrefclever_reffont_tl + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 1 } + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 2 } \__zrefclever_extract_unexp:Vvn \l__zrefclever_type_first_label_tl { l__zrefclever_ref_property_tl } { } + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 3 } + \seq_item:Nn \l__zrefclever_type_first_refbounds_seq { 4 } \exp_not:N \group_end: - \exp_not:V \l__zrefclever_postref_tl } } { \__zrefclever_ref_default: } @@ -2968,18 +3807,24 @@ \cs_new_protected:Npn \__zrefclever_type_name_setup: { \zref@ifrefundefined { \l__zrefclever_type_first_label_tl } - { \tl_clear:N \l__zrefclever_type_name_tl } + { + \tl_clear:N \l__zrefclever_type_name_tl + \bool_set_true:N \l__zrefclever_type_name_missing_bool + } { \tl_if_eq:NnTF \l__zrefclever_type_first_label_type_tl { zc@missingtype } - { \tl_clear:N \l__zrefclever_type_name_tl } + { + \tl_clear:N \l__zrefclever_type_name_tl + \bool_set_true:N \l__zrefclever_type_name_missing_bool + } { % Determine whether we should use capitalization, abbreviation, % and plural. \bool_lazy_or:nnTF - { \l__zrefclever_capitalize_bool } + { \l__zrefclever_cap_bool } { - \l__zrefclever_capitalize_first_bool && + \l__zrefclever_capfirst_bool && \int_compare_p:nNn { \l__zrefclever_type_count_int } = { 0 } } { \tl_set:Nn \l__zrefclever_name_format_tl {Name} } @@ -3034,19 +3879,15 @@ { \l__zrefclever_nudge_gender_bool } { ! \tl_if_empty_p:N \l__zrefclever_ref_gender_tl } { - \__zrefclever_get_lang_opt_type:xxnNF - { \l__zrefclever_ref_language_tl } + \__zrefclever_get_rf_opt_seq:nxxN { gender } { \l__zrefclever_type_first_label_type_tl } - { gender } - \l__zrefclever_type_name_gender_tl - { \tl_clear:N \l__zrefclever_type_name_gender_tl } - \clist_set:NV \l_tmpa_clist - \l__zrefclever_type_name_gender_tl - \clist_if_in:NVF - \l_tmpa_clist + { \l__zrefclever_ref_language_tl } + \l__zrefclever_type_name_gender_seq + \seq_if_in:NVF + \l__zrefclever_type_name_gender_seq \l__zrefclever_ref_gender_tl { - \tl_if_empty:NTF \l__zrefclever_type_name_gender_tl + \seq_if_empty:NTF \l__zrefclever_type_name_gender_seq { \msg_warning:nnxxx { zref-clever } { nudge-gender-not-declared-for-type } @@ -3059,7 +3900,10 @@ { nudge-gender-mismatch } { \l__zrefclever_type_first_label_type_tl } { \l__zrefclever_ref_gender_tl } - { \l__zrefclever_type_name_gender_tl } + { + \seq_use:Nn + \l__zrefclever_type_name_gender_seq { ,~ } + } { \l__zrefclever_ref_language_tl } } } @@ -3068,12 +3912,13 @@ \tl_if_empty:NTF \l__zrefclever_name_format_fallback_tl { - \prop_get:cVNF + \__zrefclever_opt_tl_get:cNF { - l__zrefclever_type_ - \l__zrefclever_type_first_label_type_tl _options_prop + \__zrefclever_opt_varname_type:een + { \l__zrefclever_type_first_label_type_tl } + { \l__zrefclever_name_format_tl } + { tl } } - \l__zrefclever_name_format_tl \l__zrefclever_type_name_tl { \tl_if_empty:NF \l__zrefclever_ref_decl_case_tl @@ -3082,13 +3927,18 @@ \tl_put_left:NV \l__zrefclever_name_format_tl \l__zrefclever_ref_decl_case_tl } - \__zrefclever_get_lang_opt_type:xxxNF - { \l__zrefclever_ref_language_tl } - { \l__zrefclever_type_first_label_type_tl } - { \l__zrefclever_name_format_tl } + \__zrefclever_opt_tl_get:cNF + { + \__zrefclever_opt_varname_lang_type:eeen + { \l__zrefclever_ref_language_tl } + { \l__zrefclever_type_first_label_type_tl } + { \l__zrefclever_name_format_tl } + { tl } + } \l__zrefclever_type_name_tl { \tl_clear:N \l__zrefclever_type_name_tl + \bool_set_true:N \l__zrefclever_type_name_missing_bool \msg_warning:nnxx { zref-clever } { missing-name } { \l__zrefclever_name_format_tl } { \l__zrefclever_type_first_label_type_tl } @@ -3096,20 +3946,22 @@ } } { - \prop_get:cVNF + \__zrefclever_opt_tl_get:cNF { - l__zrefclever_type_ - \l__zrefclever_type_first_label_type_tl _options_prop + \__zrefclever_opt_varname_type:een + { \l__zrefclever_type_first_label_type_tl } + { \l__zrefclever_name_format_tl } + { tl } } - \l__zrefclever_name_format_tl \l__zrefclever_type_name_tl { - \prop_get:cVNF + \__zrefclever_opt_tl_get:cNF { - l__zrefclever_type_ - \l__zrefclever_type_first_label_type_tl _options_prop + \__zrefclever_opt_varname_type:een + { \l__zrefclever_type_first_label_type_tl } + { \l__zrefclever_name_format_fallback_tl } + { tl } } - \l__zrefclever_name_format_fallback_tl \l__zrefclever_type_name_tl { \tl_if_empty:NF \l__zrefclever_ref_decl_case_tl @@ -3124,19 +3976,29 @@ \l__zrefclever_name_format_fallback_tl \l__zrefclever_ref_decl_case_tl } - \__zrefclever_get_lang_opt_type:xxxNF - { \l__zrefclever_ref_language_tl } - { \l__zrefclever_type_first_label_type_tl } - { \l__zrefclever_name_format_tl } - \l__zrefclever_type_name_tl + \__zrefclever_opt_tl_get:cNF { - \__zrefclever_get_lang_opt_type:xxxNF + \__zrefclever_opt_varname_lang_type:eeen { \l__zrefclever_ref_language_tl } { \l__zrefclever_type_first_label_type_tl } - { \l__zrefclever_name_format_fallback_tl } + { \l__zrefclever_name_format_tl } + { tl } + } + \l__zrefclever_type_name_tl + { + \__zrefclever_opt_tl_get:cNF + { + \__zrefclever_opt_varname_lang_type:eeen + { \l__zrefclever_ref_language_tl } + { \l__zrefclever_type_first_label_type_tl } + { \l__zrefclever_name_format_fallback_tl } + { tl } + } \l__zrefclever_type_name_tl { \tl_clear:N \l__zrefclever_type_name_tl + \bool_set_true:N + \l__zrefclever_type_name_missing_bool \msg_warning:nnxx { zref-clever } { missing-name } { \l__zrefclever_name_format_tl } @@ -3152,7 +4014,7 @@ % Signal whether the type name is to be included in the hyperlink or not. \bool_lazy_any:nTF { - { ! \l__zrefclever_use_hyperref_bool } + { ! \l__zrefclever_hyperlink_bool } { \l__zrefclever_link_star_bool } { \tl_if_empty_p:N \l__zrefclever_type_name_tl } { \str_if_eq_p:Vn \l__zrefclever_nameinlink_str { false } } @@ -3180,20 +4042,20 @@ \cs_new:Npn \__zrefclever_extract_url_unexp:n #1 { \zref@ifpropundefined { urluse } - { \__zrefclever_extract_unexp:nnn {#1} { url } { \c_empty_tl } } + { \__zrefclever_extract_unexp:nnn {#1} { url } { } } { \zref@ifrefcontainsprop {#1} { urluse } - { \__zrefclever_extract_unexp:nnn {#1} { urluse } { \c_empty_tl } } - { \__zrefclever_extract_unexp:nnn {#1} { url } { \c_empty_tl } } + { \__zrefclever_extract_unexp:nnn {#1} { urluse } { } } + { \__zrefclever_extract_unexp:nnn {#1} { url } { } } } } \cs_generate_variant:Nn \__zrefclever_extract_url_unexp:n { V } \cs_new_protected:Npn \__zrefclever_labels_in_sequence:nn #1#2 { \__zrefclever_extract_default:Nnnn \l__zrefclever_label_extdoc_a_tl - {#1} { externaldocument } { \c_empty_tl } + {#1} { externaldocument } { } \__zrefclever_extract_default:Nnnn \l__zrefclever_label_extdoc_b_tl - {#2} { externaldocument } { \c_empty_tl } + {#2} { externaldocument } { } \tl_if_eq:NNT \l__zrefclever_label_extdoc_a_tl @@ -3264,145 +4126,105 @@ } } } -\cs_new_protected:Npn \__zrefclever_get_ref_opt_typeset:nN #1#2 +\cs_new_protected:Npn \__zrefclever_get_rf_opt_tl:nnnN #1#2#3#4 { % First attempt: general options. - \prop_get:NnNF \l__zrefclever_ref_options_prop {#1} #2 + \__zrefclever_opt_tl_get:cNF + { \__zrefclever_opt_varname_general:nn {#1} { tl } } + #4 { % If not found, try type specific options. - \bool_lazy_and:nnTF - { - \prop_if_exist_p:c - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - } - { - \prop_if_in_p:cn - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - {#1} - } - { - \prop_get:cnN - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - {#1} #2 - } + \__zrefclever_opt_tl_get:cNF + { \__zrefclever_opt_varname_type:nnn {#2} {#1} { tl } } + #4 { % If not found, try type- and language-specific. - \__zrefclever_get_lang_opt_type:xxnNF - { \l__zrefclever_ref_language_tl } - { \l__zrefclever_label_type_a_tl } - {#1} #2 + \__zrefclever_opt_tl_get:cNF + { \__zrefclever_opt_varname_lang_type:nnnn {#3} {#2} {#1} { tl } } + #4 { % If not found, try language-specific default. - \__zrefclever_get_lang_opt_default:xnNF - { \l__zrefclever_ref_language_tl } - {#1} #2 + \__zrefclever_opt_tl_get:cNF + { \__zrefclever_opt_varname_lang_default:nnn {#3} {#1} { tl } } + #4 { % If not found, try fallback. - \__zrefclever_get_fallback_unknown_lang_opt:nNF {#1} #2 - { - \tl_clear:N #2 - \msg_warning:nnn { zref-clever } - { missing-string } {#1} - } + \__zrefclever_opt_tl_get:cNF + { \__zrefclever_opt_varname_fallback:nn {#1} { tl } } + #4 + { \tl_clear:N #4 } } } } } } -\cs_new_protected:Npn \__zrefclever_get_ref_opt_font:nN #1#2 +\cs_generate_variant:Nn \__zrefclever_get_rf_opt_tl:nnnN { nxxN } +\cs_new_protected:Npn \__zrefclever_get_rf_opt_seq:nnnN #1#2#3#4 { % First attempt: general options. - \prop_get:NnNF \l__zrefclever_ref_options_prop {#1} #2 + \__zrefclever_opt_seq_get:cNF + { \__zrefclever_opt_varname_general:nn {#1} { seq } } + #4 { % If not found, try type specific options. - \bool_if:nTF - { - \prop_if_exist_p:c - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - } + \__zrefclever_opt_seq_get:cNF + { \__zrefclever_opt_varname_type:nnn {#2} {#1} { seq } } + #4 { - \prop_get:cnNF + % If not found, try type- and language-specific. + \__zrefclever_opt_seq_get:cNF + { \__zrefclever_opt_varname_lang_type:nnnn {#3} {#2} {#1} { seq } } + #4 { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop + % If not found, try language-specific default. + \__zrefclever_opt_seq_get:cNF + { \__zrefclever_opt_varname_lang_default:nnn {#3} {#1} { seq } } + #4 + { + % If not found, try fallback. + \__zrefclever_opt_seq_get:cNF + { \__zrefclever_opt_varname_fallback:nn {#1} { seq } } + #4 + { \seq_clear:N #4 } + } } - {#1} #2 - { \tl_clear:N #2 } } - { \tl_clear:N #2 } } } -\cs_new_protected:Npn \__zrefclever_get_ref_opt_bool:nnN #1#2#3 +\cs_generate_variant:Nn \__zrefclever_get_rf_opt_seq:nnnN { nxxN } +\cs_new_protected:Npn \__zrefclever_get_rf_opt_bool:nnnnN #1#2#3#4#5 { % First attempt: general options. - \prop_get:NnNF \l__zrefclever_ref_options_prop {#1} \l_tmpa_tl + \__zrefclever_opt_bool_get:cNF + { \__zrefclever_opt_varname_general:nn {#1} { bool } } + #5 { % If not found, try type specific options. - \bool_lazy_and:nnTF - { - \prop_if_exist_p:c - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - } - { - \prop_if_in_p:cn - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - {#1} - } - { - \prop_get:cnN - { - l__zrefclever_type_ - \l__zrefclever_label_type_a_tl _options_prop - } - {#1} \l_tmpa_tl - } + \__zrefclever_opt_bool_get:cNF + { \__zrefclever_opt_varname_type:nnn {#3} {#1} { bool } } + #5 { % If not found, try type- and language-specific. - \__zrefclever_get_lang_opt_type:xxnNF - { \l__zrefclever_ref_language_tl } - { \l__zrefclever_label_type_a_tl } - {#1} \l_tmpa_tl + \__zrefclever_opt_bool_get:cNF + { \__zrefclever_opt_varname_lang_type:nnnn {#4} {#3} {#1} { bool } } + #5 { % If not found, try language-specific default. - \__zrefclever_get_lang_opt_default:xnNF - { \l__zrefclever_ref_language_tl } - {#1} \l_tmpa_tl + \__zrefclever_opt_bool_get:cNF + { \__zrefclever_opt_varname_lang_default:nnn {#4} {#1} { bool } } + #5 { - % If not found, use default argument. - \bool_lazy_or:nnTF - { \str_if_eq_p:nn {#2} { true } } - { \str_if_eq_p:nn {#2} { false } } - { \tl_set:Nn \l_tmpa_tl {#2} } - { - % And, if even that fails, presume false. - \tl_set:Nn \l_tmpa_tl { false } - } + % If not found, try fallback. + \__zrefclever_opt_bool_get:cNF + { \__zrefclever_opt_varname_fallback:nn {#1} { bool } } + #5 + { \use:c { bool_set_ #2 :N } #5 } } } } } - % Having retrieved the option value, set the boolean. At this point, we - % *know* '\l_tmpa_tl' is either 'true' or 'false'. - \use:c { bool_set_ \l_tmpa_tl :N } #3 } +\cs_generate_variant:Nn \__zrefclever_get_rf_opt_bool:nnnnN { nnxxN } \__zrefclever_compat_module:nn { appendix } { \AddToHook { cmd / appendix / before } @@ -3638,11 +4460,7 @@ { \__zrefclever_zcsetup:n { currentcounter = equation } } } \zcRefTypeSetup { equation } - { - reffont = \upshape , - preref = {\textup{(}} , - postref = {\textup{)}} , - } + { reffont = \upshape } \msg_info:nnn { zref-clever } { compat-package } { amsmath } } } -- cgit v1.2.3