summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/zref-clever/zref-clever.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/zref-clever/zref-clever.dtx')
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever.dtx1469
1 files changed, 1025 insertions, 444 deletions
diff --git a/macros/latex/contrib/zref-clever/zref-clever.dtx b/macros/latex/contrib/zref-clever/zref-clever.dtx
index ac9d81f44e..3027bcab15 100644
--- a/macros/latex/contrib/zref-clever/zref-clever.dtx
+++ b/macros/latex/contrib/zref-clever/zref-clever.dtx
@@ -4,7 +4,7 @@
%
% This file is part of the LaTeX package "zref-clever".
%
-% Copyright (C) 2021 Gustavo Barros
+% Copyright (C) 2021-2022 Gustavo Barros
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
@@ -63,6 +63,9 @@
% \NewDocumentCommand\githubissue{m}{^^A
% issue~\href{https://github.com/gusbrs/zref-clever/issues/#1}{\##1}}
%
+% \NewDocumentCommand\githubPR{m}{^^A
+% PR~\href{https://github.com/gusbrs/zref-clever/pull/#1}{\##1}}
+%
% ^^A Currently just for keeping semantic markup on this.
% \NewDocumentCommand\contributor{m}{#1}
%
@@ -129,7 +132,7 @@
% \cs{bool_case_true:}\dots{}). We presume \pkg{xparse} (which made to the
% kernel in the 2020-10-01 release), and \pkg{expl3} as well (which made to
% the kernel in the 2020-02-02 release). We also just use UTF-8 for the
-% dictionaries (which became the default input encoding in the 2018-04-01
+% language files (which became the default input encoding in the 2018-04-01
% release). Finally, a couple of changes came with the 2021-11-15 kernel
% release, which are important here. First, a fix was made to the new hook
% management system (\pkg{ltcmdhooks}), with implications to the hook we add
@@ -159,7 +162,7 @@
%
% Identify the package.
% \begin{macrocode}
-\ProvidesExplPackage {zref-clever} {2021-12-07} {0.1.1-alpha}
+\ProvidesExplPackage {zref-clever} {2022-01-10} {0.1.2-alpha}
{Clever LaTeX cross-references based on zref}
% \end{macrocode}
%
@@ -520,6 +523,11 @@
}
\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 }
@@ -597,14 +605,15 @@
{ Unknown~value~'#1'~for~'nudgeif'~option~\msg_line_context:. }
\msg_new:nnn { zref-clever } { option-document-only }
{ Option~'#1'~is~only~available~after~\iow_char:N\\begin\{document\}. }
-\msg_new:nnn { zref-clever } { dict-loaded }
- { Loaded~'#1'~dictionary. }
-\msg_new:nnn { zref-clever } { dict-not-available }
- { Dictionary~for~'#1'~not~available~\msg_line_context:. }
+\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~dictionary.~
- See~documentation~for~'\iow_char:N\\zcDeclareLanguage'~and~
+ 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 }
@@ -654,28 +663,33 @@
{ Loaded~support~for~'#1'~package. }
\msg_new:nnn { zref-clever } { compat-class }
{ Loaded~support~for~'#1'~documentclass. }
+\msg_new:nnn { zref-clever } { option-deprecated }
+ {
+ Option~'#1'~has~been~deprecated~\msg_line_context:.\iow_newline:
+ Use~'#2'~instead.
+ }
% \end{macrocode}
%
%
% \subsection{Data extraction}
%
%
-% \begin{macro}{\@@_def_extract:Nnnn}
+% \begin{macro}{\@@_extract_default:Nnnn}
% Extract property \meta{prop} from \meta{label} and sets variable \meta{tl
% var} with extracted value. Ensure \cs{zref@extractdefault} is expanded
% exactly twice, but no further to retrieve the proper value. In case the
% property is not found, set \meta{tl var} with \meta{default}.
% \begin{syntax}
-% \cs{@@_def_extract:Nnnn} \Arg{tl val}
+% \cs{@@_extract_default:Nnnn} \Arg{tl val}
% ~~\Arg{label} \Arg{prop} \Arg{default}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_def_extract:Nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_extract_default:Nnnn #1#2#3#4
{
\exp_args:NNNo \exp_args:NNo \tl_set:Nn #1
{ \zref@extractdefault {#2} {#3} {#4} }
}
-\cs_generate_variant:Nn \@@_def_extract:Nnnn { NVnn }
+\cs_generate_variant:Nn \@@_extract_default:Nnnn { NVnn }
% \end{macrocode}
% \end{macro}
%
@@ -714,31 +728,32 @@
%
% For a general discussion on the precedence rules for reference format
% options, see Section ``Reference format'' in the User manual. Internally,
-% these precedence rules are handled / enforced in \cs{@@_get_ref_string:nN},
-% \cs{@@_get_ref_font:nN}, and \cs{@@_type_name_setup:} which are the basic
-% functions to retrieve proper values for reference format settings. The
-% ``fallback'' settings are stored in \cs{g_@@_fallback_dict_prop}.
+% these precedence rules are handled / enforced in
+% \cs{@@_get_ref_opt_typeset:nN}, \cs{@@_get_ref_opt_font:nN}, and
+% \cs{@@_type_name_setup:} which are the basic functions to retrieve proper
+% values for reference format settings. The ``fallback'' settings are stored
+% in \cs{g_@@_fallback_unknown_lang_prop}.
%
%
% \begin{macro}
% {
% \l_@@_setup_type_tl ,
-% \l_@@_dict_language_tl ,
-% \l_@@_dict_decl_case_tl ,
-% \l_@@_dict_declension_seq ,
-% \l_@@_dict_gender_seq ,
+% \l_@@_base_language_tl ,
+% \l_@@_lang_decl_case_tl ,
+% \l_@@_lang_declension_seq ,
+% \l_@@_lang_gender_seq ,
% }
% Store ``current'' type, language, and declension cases in different places
-% for option and translation handling, notably in
-% \cs{@@_provide_dictionary:n}, \cs{zcRefTypeSetup}, and
-% \cs{zcLanguageSetup}. But also for translations retrieval, in
-% \cs{@@_get_type_transl:nnnN} and \cs{@@_get_default_transl:nnN}.
+% for type-specific and language-specific options handling, notably in
+% \cs{@@_provide_langfile:n}, \cs{zcRefTypeSetup}, and
+% \cs{zcLanguageSetup}. But also for language options retrieval, in
+% \cs{@@_get_lang_opt_type:nnnN} and \cs{@@_get_lang_opt_default:nnN}.
% \begin{macrocode}
\tl_new:N \l_@@_setup_type_tl
-\tl_new:N \l_@@_dict_language_tl
-\tl_new:N \l_@@_dict_decl_case_tl
-\seq_new:N \l_@@_dict_declension_seq
-\seq_new:N \l_@@_dict_gender_seq
+\tl_new:N \l_@@_base_language_tl
+\tl_new:N \l_@@_lang_decl_case_tl
+\seq_new:N \l_@@_lang_declension_seq
+\seq_new:N \l_@@_lang_gender_seq
% \end{macrocode}
% \end{macro}
%
@@ -773,13 +788,13 @@
listsep ,
lastsep ,
rangesep ,
- refpre ,
- refpos ,
+ preref ,
+ postref ,
}
% \end{macrocode}
% Only ``type names'' are ``necessarily type-specific'', which makes them
% somewhat special on the retrieval side of things. In short, they don't have
-% their values queried by \cs{@@_get_ref_string:nN}, but by
+% their values queried by \cs{@@_get_ref_opt_typeset:nN}, but by
% \cs{@@_type_name_setup:}.
% \begin{macrocode}
\seq_const_from_clist:Nn
@@ -830,12 +845,13 @@
%
% \begin{macro}{\g_@@_languages_prop}
% Stores the names of known languages and the mapping from ``language name''
-% to ``dictionary name''. Whether or not a language or alias is known to
+% to ``base language name''. Whether or not a language or alias is known to
% \pkg{zref-clever} is decided by its presence in this property list. A
% ``base language'' (loose concept here, meaning just ``the name we gave for
-% the dictionary in that particular language'') is just like any other one,
-% the only difference is that the ``language name'' happens to be the same
-% as the ``dictionary name'', in other words, it is an ``alias to itself''.
+% the language file in that particular language'') is just like any other
+% one, the only difference is that the ``language name'' happens to be the
+% same as the ``base language name'', in other words, it is an ``alias to
+% itself''.
% \begin{macrocode}
\prop_new:N \g_@@_languages_prop
% \end{macrocode}
@@ -844,7 +860,7 @@
%
% \begin{macro}[int]{\zcDeclareLanguage}
% Declare a new language for use with \pkg{zref-clever}. \meta{language} is
-% taken to be both the ``language name'' and the ``dictionary name''.
+% taken to be both the ``language name'' and the ``base language name''.
% \oarg{options} receive a \texttt{k=v} set of options, with three valid
% options. The first, \opt{declension}, takes the noun declension cases
% prefixes for \meta{language} as a comma separated list, whose first
@@ -856,7 +872,7 @@
% \meta{language} is already known, just warn. This implies a particular
% restriction regarding \oarg{options}, namely that these options, when
% defined by the package, cannot be redefined by the user. This is
-% deliberate, otherwise the built-in dictionaries would become much too
+% deliberate, otherwise the built-in language files would become much too
% sensitive to this particular user input, and unnecessarily so.
% \cs{zcDeclareLanguage} is preamble only.
% \begin{syntax}
@@ -872,8 +888,8 @@
{ \msg_warning:nnn { zref-clever } { language-declared } {#2} }
{
\prop_gput:Nnn \g_@@_languages_prop {#2} {#2}
- \prop_new:c { g_@@_dict_ #2 _prop }
- \tl_set:Nn \l_@@_dict_language_tl {#2}
+ \prop_new:c { g_@@_lang_ #2 _prop }
+ \tl_set:Nn \l_@@_base_language_tl {#2}
\keys_set:nn { zref-clever / declarelang } {#1}
}
}
@@ -885,10 +901,10 @@
%
%
% \begin{macro}[int]{\zcDeclareLanguageAlias}
-% Declare \meta{language alias} to be an alias of \meta{aliased language}.
-% \meta{aliased language} must be already known to \pkg{zref-clever}, as
-% stored in \cs{g_@@_languages_prop}. \cs{zcDeclareLanguageAlias} is
-% preamble only.
+% Declare \meta{language alias} to be an alias of \meta{aliased language}
+% (or ``base language''). \meta{aliased language} must be already known to
+% \pkg{zref-clever}, as stored in \cs{g_@@_languages_prop}.
+% \cs{zcDeclareLanguageAlias} is preamble only.
% \begin{syntax}
% \cs{zcDeclareLanguageAlias} \marg{language alias} \marg{aliased language}
% \end{syntax}
@@ -918,21 +934,21 @@
declension .code:n =
{
\prop_gput:cnn
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ declension } {#1}
} ,
declension .value_required:n = true ,
gender .code:n =
{
\prop_gput:cnn
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ gender } {#1}
} ,
gender .value_required:n = true ,
allcaps .code:n =
{
\prop_gput:cnn
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ allcaps } { true }
} ,
allcaps .value_forbidden:n = true ,
@@ -956,7 +972,7 @@
{
\exp_args:NNx \prop_get:NnNTF \g_@@_languages_prop
{ \l_@@_ref_language_tl }
- \l_@@_dict_language_tl
+ \l_@@_base_language_tl
{
% \end{macrocode}
% Validate the declension case (\opt{d}) option against the declared cases for
@@ -967,16 +983,16 @@
% warning about it.
% \begin{macrocode}
\exp_args:NNx \seq_set_from_clist:Nn
- \l_@@_dict_declension_seq
+ \l_@@_lang_declension_seq
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ declension }
}
- \seq_if_empty:NTF \l_@@_dict_declension_seq
+ \seq_if_empty:NTF \l_@@_lang_declension_seq
{
\tl_if_empty:NF \l_@@_ref_decl_case_tl
{
@@ -990,18 +1006,18 @@
{
\tl_if_empty:NTF \l_@@_ref_decl_case_tl
{
- \seq_get_left:NN \l_@@_dict_declension_seq
+ \seq_get_left:NN \l_@@_lang_declension_seq
\l_@@_ref_decl_case_tl
}
{
- \seq_if_in:NVF \l_@@_dict_declension_seq
+ \seq_if_in:NVF \l_@@_lang_declension_seq
\l_@@_ref_decl_case_tl
{
\msg_warning:nnxx { zref-clever }
{ unknown-decl-case }
{ \l_@@_ref_decl_case_tl }
{ \l_@@_ref_language_tl }
- \seq_get_left:NN \l_@@_dict_declension_seq
+ \seq_get_left:NN \l_@@_lang_declension_seq
\l_@@_ref_decl_case_tl
}
}
@@ -1012,16 +1028,16 @@
% genders declared for the former, clear \cs{l_@@_ref_gender_tl} and warn.
% \begin{macrocode}
\exp_args:NNx \seq_set_from_clist:Nn
- \l_@@_dict_gender_seq
+ \l_@@_lang_gender_seq
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ gender }
}
- \seq_if_empty:NTF \l_@@_dict_gender_seq
+ \seq_if_empty:NTF \l_@@_lang_gender_seq
{
\tl_if_empty:NF \l_@@_ref_gender_tl
{
@@ -1036,7 +1052,7 @@
{
\tl_if_empty:NF \l_@@_ref_gender_tl
{
- \seq_if_in:NVF \l_@@_dict_gender_seq
+ \seq_if_in:NVF \l_@@_lang_gender_seq
\l_@@_ref_gender_tl
{
\msg_warning:nnxx { zref-clever }
@@ -1048,20 +1064,20 @@
}
}
% \end{macrocode}
-% Ensure \cs{l_@@_capitalize_bool} is set to \texttt{true} when the language
-% was declared with \opt{allcaps} option.
+% Ensure the \opt{cap} in \cs{l_@@_ref_options_prop} is set to \texttt{true}
+% when the language was declared with \opt{allcaps} option.
% \begin{macrocode}
\str_if_eq:eeT
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ allcaps }
}
{ true }
- { \bool_set_true:N \l_@@_capitalize_bool }
+ { \prop_put:Nnn \l_@@_ref_options_prop { cap } { true } }
}
{
% \end{macrocode}
@@ -1091,26 +1107,25 @@
%
%
%
-% \subsection{Dictionaries}
+% \subsection{Language files}
%
% Contrary to general options and type options, which are always \emph{local},
-% ``dictionaries'', ``translations'' or ``language-specific settings'' are
-% always \emph{global}. Hence, the loading of built-in dictionaries, as well
-% as settings done with \cs{zcLanguageSetup}, should set the relevant
-% variables globally.
-%
-% The built-in dictionaries and their related infrastructure are designed to
-% perform ``on the fly'' loading of dictionaries, ``lazily'' as needed. Much
-% like \pkg{babel} does for languages not declared in the preamble, but used
-% in the document. This offers some convenience, of course, and that's one
-% reason to do it. But it also has the purpose of parsimony, of ``loading the
-% least possible''. Therefore, we load at \texttt{begindocument} one single
-% language (see \zcref[ref=title, noname]{sec:lang-option}), as specified by
-% the user in the preamble with the \opt{lang} option or, failing any
-% specification, the current language of the document, which is the default.
-% Anything else is lazily loaded, on the fly, along the document.
-%
-% This design decision has also implications to the \emph{form} the dictionary
+% language-specific settings are always \emph{global}. Hence, the loading of
+% built-in language files, as well as settings done with \cs{zcLanguageSetup},
+% should set the relevant variables globally.
+%
+% The built-in language files and their related infrastructure are designed to
+% perform ``on the fly'' loading of the language files, ``lazily'' as needed.
+% Much like \pkg{babel} does for languages not declared in the preamble, but
+% used in the document. This offers some convenience, of course, and that's
+% one reason to do it. But it also has the purpose of parsimony, of ``loading
+% the least possible''. Therefore, we load at \texttt{begindocument} one
+% single language (see \zcref[ref=title, noname]{sec:lang-option}), as
+% specified by the user in the preamble with the \opt{lang} option or, failing
+% any specification, the current language of the document, which is the
+% default. Anything else is lazily loaded, on the fly, along the document.
+%
+% This design decision has also implications to the \emph{form} the language
% files assumed. As far as my somewhat impressionistic sampling goes,
% dictionary or localization files of the most common packages in this area of
% functionality, are usually a set of commands which perform the relevant
@@ -1126,193 +1141,196 @@
% \file{.ini} files are not in this form, but actually resemble
% ``configuration files'' of sorts, which means they are read and processed
% somehow else than with just \cs{input}. So we do the more or less the same
-% here. It seems a reasonable way to ensure we can load dictionaries on the
+% here. It seems a reasonable way to ensure we can load language files on the
% fly robustly mid-document, without getting paranoid with the last bit of
% white-space in them, and without introducing any undue content on the stream
% when we cannot afford to do it. Hence, \pkg{zref-clever}'s built-in
-% dictionary files are a set of \emph{key-value options} which are read from
-% the file, and fed to \texttt{\cs{keys_set:nn}\{zref-clever/dictionary\}} by
-% \cs{@@_provide_dictionary:n}. And they use the same syntax and options as
-% \cs{zcLanguageSetup} does. The dictionary file itself is read with
+% language files are a set of \emph{key-value options} which are read from the
+% file, and fed to \texttt{\cs{keys_set:nn}\{zref-clever/langfile\}} by
+% \cs{@@_provide_langfile:n}. And they use the same syntax and options as
+% \cs{zcLanguageSetup} does. The language file itself is read with
% \cs{ExplSyntaxOn} with the usual implications for white-space and catcodes.
%
-% \cs{@@_provide_dictionary:n} is only meant to load the built-in
-% dictionaries. For languages declared by the user, or for any settings to a
-% known language made with \cs{zcLanguageSetup}, values are populated directly
-% to a variable \cs{g_@@_dict_\meta{language}_prop}. Hence, there is no need
-% to ``load'' anything in this case: definitions and assignments made by the
-% user are performed immediately.
+% \cs{@@_provide_langfile:n} is only meant to load the built-in language
+% files. For languages declared by the user, or for any settings to a known
+% language made with \cs{zcLanguageSetup}, values are populated directly to a
+% variable \cs{g_@@_lang_\meta{language}_prop}. Hence, there is no need to
+% ``load'' anything in this case: definitions and assignments made by the user
+% are performed immediately.
%
%
% \subsubsection*{Provide}
%
-% \begin{macro}{\g_@@_loaded_dictionaries_seq}
-% Used to keep track of whether a dictionary has already been loaded or not.
+% \begin{macro}{\g_@@_loaded_langfiles_seq}
+% Used to keep track of whether a language file has already been loaded or
+% not.
% \begin{macrocode}
-\seq_new:N \g_@@_loaded_dictionaries_seq
+\seq_new:N \g_@@_loaded_langfiles_seq
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\l_@@_load_dict_verbose_bool}
-% Controls whether \cs{@@_provide_dictionary:n} fails silently or verbosely
-% in case of unknown languages or dictionaries not found.
+% \begin{macro}{\l_@@_load_langfile_verbose_bool}
+% Controls whether \cs{@@_provide_langfile:n} fails silently or verbosely
+% in case of unknown languages or not found language files.
% \begin{macrocode}
-\bool_new:N \l_@@_load_dict_verbose_bool
+\bool_new:N \l_@@_load_langfile_verbose_bool
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\@@_provide_dictionary:n}
-% Load dictionary for known \meta{language} if it is available and if it has
-% not already been loaded.
+% \begin{macro}{\@@_provide_langfile:n}
+% Load language file for known \meta{language} if it is available and if it
+% has not already been loaded.
% \begin{syntax}
-% \cs{@@_provide_dictionary:n} \Arg{language}
+% \cs{@@_provide_langfile:n} \Arg{language}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_provide_dictionary:n #1
+\cs_new_protected:Npn \@@_provide_langfile:n #1
{
\group_begin:
\@bsphack
\prop_get:NnNTF \g_@@_languages_prop {#1}
- \l_@@_dict_language_tl
+ \l_@@_base_language_tl
{
\seq_if_in:NVF
- \g_@@_loaded_dictionaries_seq
- \l_@@_dict_language_tl
+ \g_@@_loaded_langfiles_seq
+ \l_@@_base_language_tl
{
\exp_args:Nx \file_get:nnNTF
- { zref-clever- \l_@@_dict_language_tl .dict }
+ { zref-clever- \l_@@_base_language_tl .lang }
{ \ExplSyntaxOn }
\l_tmpa_tl
{
\tl_clear:N \l_@@_setup_type_tl
\exp_args:NNx \seq_set_from_clist:Nn
- \l_@@_dict_declension_seq
+ \l_@@_lang_declension_seq
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ declension }
}
- \seq_if_empty:NTF \l_@@_dict_declension_seq
- { \tl_clear:N \l_@@_dict_decl_case_tl }
+ \seq_if_empty:NTF \l_@@_lang_declension_seq
+ { \tl_clear:N \l_@@_lang_decl_case_tl }
{
- \seq_get_left:NN \l_@@_dict_declension_seq
- \l_@@_dict_decl_case_tl
+ \seq_get_left:NN \l_@@_lang_declension_seq
+ \l_@@_lang_decl_case_tl
}
\exp_args:NNx \seq_set_from_clist:Nn
- \l_@@_dict_gender_seq
+ \l_@@_lang_gender_seq
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ gender }
}
- \keys_set:nV { zref-clever / dictionary } \l_tmpa_tl
- \seq_gput_right:NV \g_@@_loaded_dictionaries_seq
- \l_@@_dict_language_tl
- \msg_note:nnx { zref-clever } { dict-loaded }
- { \l_@@_dict_language_tl }
+ \keys_set:nV { zref-clever / langfile } \l_tmpa_tl
+ \seq_gput_right:NV \g_@@_loaded_langfiles_seq
+ \l_@@_base_language_tl
+ \msg_note:nnx { zref-clever } { langfile-loaded }
+ { \l_@@_base_language_tl }
}
{
- \bool_if:NT \l_@@_load_dict_verbose_bool
+ \bool_if:NT \l_@@_load_langfile_verbose_bool
{
- \msg_warning:nnx { zref-clever } { dict-not-available }
- { \l_@@_dict_language_tl }
+ \msg_warning:nnx { zref-clever } { langfile-not-available }
+ { \l_@@_base_language_tl }
}
% \end{macrocode}
-% Even if we don't have the actual dictionary, we register it as ``loaded''.
-% At this point, it is a known language, properly declared. There is no point
-% in trying to load it multiple times, because users cannot really provide the
-% dictionary files (well, technically they could, but we are working so they
-% don't need to, and have better ways to do what they want). And if the users
-% had provided some translations themselves, by means of \cs{zcLanguageSetup},
-% everything would be in place, and they could use the \opt{lang} option
-% multiple times, and the \texttt{dict-not-available} warning would never go
-% away.
-% \begin{macrocode}
- \seq_gput_right:NV \g_@@_loaded_dictionaries_seq
- \l_@@_dict_language_tl
+% Even if we don't have the actual language file, we register it as
+% ``loaded''. At this point, it is a known language, properly declared.
+% There is no point in trying to load it multiple times, because users cannot
+% really provide the language files (well, technically they could, but we are
+% working so they don't need to, and have better ways to do what they want).
+% And if the users had provided some language-specific options themselves, by
+% means of \cs{zcLanguageSetup}, everything would be in place, and they could
+% use the \opt{lang} option multiple times, and the
+% \texttt{langfile-not-available} warning would never go away.
+% \begin{macrocode}
+ \seq_gput_right:NV \g_@@_loaded_langfiles_seq
+ \l_@@_base_language_tl
}
}
}
{
- \bool_if:NT \l_@@_load_dict_verbose_bool
+ \bool_if:NT \l_@@_load_langfile_verbose_bool
{ \msg_warning:nnn { zref-clever } { unknown-language-load } {#1} }
}
\@esphack
\group_end:
}
-\cs_generate_variant:Nn \@@_provide_dictionary:n { x }
+\cs_generate_variant:Nn \@@_provide_langfile:n { x }
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\@@_provide_dictionary_verbose:n}
-% Does the same as \cs{@@_provide_dictionary:n}, but warns if the loading of
-% the dictionary has failed.
+% \begin{macro}{\@@_provide_langfile_verbose:n}
+% Does the same as \cs{@@_provide_langfile:n}, but warns if the loading of
+% the language file has failed.
% \begin{syntax}
-% \cs{@@_provide_dictionary_verbose:n} \Arg{language}
+% \cs{@@_provide_langfile_verbose:n} \Arg{language}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_provide_dictionary_verbose:n #1
+\cs_new_protected:Npn \@@_provide_langfile_verbose:n #1
{
\group_begin:
- \bool_set_true:N \l_@@_load_dict_verbose_bool
- \@@_provide_dictionary:n {#1}
+ \bool_set_true:N \l_@@_load_langfile_verbose_bool
+ \@@_provide_langfile:n {#1}
\group_end:
}
-\cs_generate_variant:Nn \@@_provide_dictionary_verbose:n { x }
+\cs_generate_variant:Nn \@@_provide_langfile_verbose:n { x }
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}
% {
-% \@@_provide_dict_type_transl:nn ,
-% \@@_provide_dict_default_transl:nn ,
+% \@@_provide_lang_opt_type:nn ,
+% \@@_provide_lang_opt_default:nn ,
% }
% A couple of auxiliary functions for the of
-% \texttt{{zref-clever/dictionary}} keys set in
-% \cs{@@_provide_dictionary:n}. They respectively ``provide'' (i.e. set if
+% \texttt{{zref-clever/langfile}} keys set in
+% \cs{@@_provide_langfile:n}. They respectively ``provide'' (i.e. set if
% it value does not exist, do nothing if it already does) ``type-specific''
-% and ``default'' translations. Both receive \meta{key} and
-% \meta{translation} as arguments, but \cs{@@_provide_dict_type_transl:nn}
+% and ``default'' language options. Both receive \meta{key} and
+% \meta{value} as arguments, but \cs{@@_provide_lang_opt_type:nn}
% relies on the current value of \cs{l_@@_setup_type_tl}, as set by the
% \texttt{type} key.
% \begin{syntax}
-% \cs{@@_provide_dict_type_transl:nn} \Arg{key} \Arg{translation}
-% \cs{@@_provide_dict_default_transl:nn} \Arg{key} \Arg{translation}
+% \cs{@@_provide_lang_opt_type:nn} \Arg{key} \Arg{value}
+% \cs{@@_provide_lang_opt_default:nn} \Arg{key} \Arg{value}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_provide_dict_type_transl:nn #1#2
+\cs_new_protected:Npn \@@_provide_lang_opt_type:nn #1#2
{
\exp_args:Nnx \prop_gput_if_new:cnn
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ type- \l_@@_setup_type_tl - #1 } {#2}
}
-\cs_new_protected:Npn \@@_provide_dict_default_transl:nn #1#2
+\cs_generate_variant:Nn \@@_provide_lang_opt_type:nn { nV }
+\cs_new_protected:Npn \@@_provide_lang_opt_default:nn #1#2
{
\prop_gput_if_new:cnn
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ default- #1 } {#2}
}
+\cs_generate_variant:Nn \@@_provide_lang_opt_default:nn { nV }
% \end{macrocode}
% \end{macro}
%
%
-% The set of keys for \texttt{{zref-clever/dictionary}}, which is used to
-% process the dictionary files in \cs{@@_provide_dictionary:n}. The no-op
-% cases for each category have their messages sent to ``info''. These
-% messages should not occur, as long as the dictionaries are well formed, but
-% they're placed there nevertheless, and can be leveraged in regression tests.
+% The set of keys for \texttt{{zref-clever/langfile}}, which is used to
+% process the language files in \cs{@@_provide_langfile:n}. The no-op cases
+% for each category have their messages sent to ``info''. These messages
+% should not occur, as long as the language files are well formed, but they're
+% placed there nevertheless, and can be leveraged in regression tests.
%
% \begin{macrocode}
-\keys_define:nn { zref-clever / dictionary }
+\keys_define:nn { zref-clever / langfile }
{
type .code:n =
{
@@ -1320,31 +1338,33 @@
{ \tl_clear:N \l_@@_setup_type_tl }
{ \tl_set:Nn \l_@@_setup_type_tl {#1} }
} ,
+
case .code:n =
{
- \seq_if_empty:NTF \l_@@_dict_declension_seq
+ \seq_if_empty:NTF \l_@@_lang_declension_seq
{
\msg_info:nnxx { zref-clever } { language-no-decl-setup }
- { \l_@@_dict_language_tl } {#1}
+ { \l_@@_base_language_tl } {#1}
}
{
- \seq_if_in:NnTF \l_@@_dict_declension_seq {#1}
- { \tl_set:Nn \l_@@_dict_decl_case_tl {#1} }
+ \seq_if_in:NnTF \l_@@_lang_declension_seq {#1}
+ { \tl_set:Nn \l_@@_lang_decl_case_tl {#1} }
{
\msg_info:nnxx { zref-clever } { unknown-decl-case }
- {#1} { \l_@@_dict_language_tl }
- \seq_get_left:NN \l_@@_dict_declension_seq
- \l_@@_dict_decl_case_tl
+ {#1} { \l_@@_base_language_tl }
+ \seq_get_left:NN \l_@@_lang_declension_seq
+ \l_@@_lang_decl_case_tl
}
}
} ,
case .value_required:n = true ,
+
gender .code:n =
{
- \seq_if_empty:NTF \l_@@_dict_gender_seq
+ \seq_if_empty:NTF \l_@@_lang_gender_seq
{
\msg_info:nnxxx { zref-clever } { language-no-gender }
- { \l_@@_dict_language_tl } { gender } {#1}
+ { \l_@@_base_language_tl } { gender } {#1}
}
{
\tl_if_empty:NTF \l_@@_setup_type_tl
@@ -1353,27 +1373,71 @@
{ option-only-type-specific } { gender }
}
{
- \seq_if_in:NnTF \l_@@_dict_gender_seq {#1}
- { \@@_provide_dict_type_transl:nn { gender } {#1} }
+ \clist_clear:N \l_tmpa_clist
+ \clist_map_inline:nn {#1}
+ {
+ \seq_if_in:NnTF \l_@@_lang_gender_seq {##1}
+ { \clist_put_right:Nn \l_tmpa_clist {##1} }
+ {
+ \msg_info:nnxx { zref-clever }
+ { gender-not-declared }
+ { \l_@@_base_language_tl } {##1}
+ }
+ }
+ \clist_if_empty:NF \l_tmpa_clist
{
- \msg_info:nnxx { zref-clever } { gender-not-declared }
- { \l_@@_dict_language_tl } {#1}
+ \exp_args:Nnx \@@_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_@@_setup_type_tl
+ {
+ \@@_provide_lang_opt_default:nV
+ { cap } \l_keys_choice_tl
+ }
+ {
+ \@@_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_@@_setup_type_tl
+ {
+ \@@_provide_lang_opt_default:nV
+ { abbrev } \l_keys_choice_tl
+ }
+ {
+ \@@_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_@@_ref_options_necessarily_not_type_specific_seq
{
- \keys_define:nn { zref-clever / dictionary }
+ \keys_define:nn { zref-clever / langfile }
{
#1 .value_required:n = true ,
#1 .code:n =
{
\tl_if_empty:NTF \l_@@_setup_type_tl
- { \@@_provide_dict_default_transl:nn {#1} {##1} }
+ { \@@_provide_lang_opt_default:nn {#1} {##1} }
{
\msg_info:nnn { zref-clever }
{ option-not-type-specific } {#1}
@@ -1384,21 +1448,21 @@
\seq_map_inline:Nn
\c_@@_ref_options_possibly_type_specific_seq
{
- \keys_define:nn { zref-clever / dictionary }
+ \keys_define:nn { zref-clever / langfile }
{
#1 .value_required:n = true ,
#1 .code:n =
{
\tl_if_empty:NTF \l_@@_setup_type_tl
- { \@@_provide_dict_default_transl:nn {#1} {##1} }
- { \@@_provide_dict_type_transl:nn {#1} {##1} }
+ { \@@_provide_lang_opt_default:nn {#1} {##1} }
+ { \@@_provide_lang_opt_type:nn {#1} {##1} }
} ,
}
}
\seq_map_inline:Nn
\c_@@_ref_options_type_names_seq
{
- \keys_define:nn { zref-clever / dictionary }
+ \keys_define:nn { zref-clever / langfile }
{
#1 .value_required:n = true ,
#1 .code:n =
@@ -1409,11 +1473,11 @@
{ option-only-type-specific } {#1}
}
{
- \tl_if_empty:NTF \l_@@_dict_decl_case_tl
- { \@@_provide_dict_type_transl:nn {#1} {##1} }
+ \tl_if_empty:NTF \l_@@_lang_decl_case_tl
+ { \@@_provide_lang_opt_type:nn {#1} {##1} }
{
- \@@_provide_dict_type_transl:nn
- { \l_@@_dict_decl_case_tl - #1 } {##1}
+ \@@_provide_lang_opt_type:nn
+ { \l_@@_lang_decl_case_tl - #1 } {##1}
}
}
} ,
@@ -1425,22 +1489,22 @@
%
% \subsubsection*{Fallback}
%
-% All ``strings'' queried with \cs{@@_get_ref_string:nN} -- in practice, those
-% in either \cs{c_@@_ref_options_necessarily_not_type_specific_seq} or
+% All ``strings'' queried with \cs{@@_get_ref_opt_typeset:nN} -- in practice,
+% those in either \cs{c_@@_ref_options_necessarily_not_type_specific_seq} or
% \cs{c_@@_ref_options_possibly_type_specific_seq} -- must have their values
% set for ``fallback'', even if to empty ones, since this is what will be
-% retrieved in the absence of a proper translation, which will be the case if
-% \pkg{babel} or \pkg{polyglossia} is loaded and sets a language which
-% \pkg{zref-clever} does not know. On the other hand, ``type names'' are not
-% looked for in ``fallback'', since it is indeed impossible to provide any
-% reasonable value for them for a ``specified but unknown language''. Also
-% ``font'' options -- those in \cs{c_@@_ref_options_font_seq}, and queried
-% with \cs{@@_get_ref_font:nN} -- do not need to be provided here, since the
-% later function sets an empty value if the option is not found.
+% retrieved in the absence of a proper language-specific option, which will be
+% the case if \pkg{babel} or \pkg{polyglossia} is loaded and sets a language
+% which \pkg{zref-clever} does not know. On the other hand, ``type names''
+% are not looked for in ``fallback'', since it is indeed impossible to provide
+% any reasonable value for them for a ``specified but unknown language''.
+% Also ``font'' options -- those in \cs{c_@@_ref_options_font_seq}, and
+% queried with \cs{@@_get_ref_opt_font:nN} -- do not need to be provided here,
+% since the later function sets an empty value if the option is not found.
%
% \begin{macrocode}
-\prop_new:N \g_@@_fallback_dict_prop
-\prop_gset_from_keyval:Nn \g_@@_fallback_dict_prop
+\prop_new:N \g_@@_fallback_unknown_lang_prop
+\prop_gset_from_keyval:Nn \g_@@_fallback_unknown_lang_prop
{
tpairsep = {,~} ,
tlistsep = {,~} ,
@@ -1451,33 +1515,33 @@
listsep = {,~} ,
lastsep = {,~} ,
rangesep = {\textendash} ,
- refpre = {} ,
- refpos = {} ,
+ preref = {} ,
+ postref = {} ,
}
% \end{macrocode}
%
%
%
-% \subsubsection*{Get translations}
+% \subsubsection*{Get language options}
%
-% \begin{macro}{\@@_get_type_transl:nnnNF}
-% Get type-specific translation of \meta{key} for \meta{type} and
+% \begin{macro}{\@@_get_lang_opt_type:nnnNF}
+% Get type-specific language option of \meta{key} for \meta{type} and
% \meta{language}, and store it in \meta{tl variable} if found. If not
% found, leave the \meta{false code} on the stream, in which case the value
% of \meta{tl variable} should not be relied upon.
% \begin{syntax}
-% \cs{@@_get_type_transl:nnnNF} \Arg{language} \Arg{type} \Arg{key}
+% \cs{@@_get_lang_opt_type:nnnNF} \Arg{language} \Arg{type} \Arg{key}
% ~~\meta{tl variable} \Arg{false code}
% \end{syntax}
% \begin{macrocode}
\prg_new_protected_conditional:Npnn
- \@@_get_type_transl:nnnN #1#2#3#4 { F }
+ \@@_get_lang_opt_type:nnnN #1#2#3#4 { F }
{
\prop_get:NnNTF \g_@@_languages_prop {#1}
- \l_@@_dict_language_tl
+ \l_@@_base_language_tl
{
\prop_get:cnNTF
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ type- #2 - #3 } #4
{ \prg_return_true: }
{ \prg_return_false: }
@@ -1485,29 +1549,29 @@
{ \prg_return_false: }
}
\prg_generate_conditional_variant:Nnn
- \@@_get_type_transl:nnnN { xxxN , xxnN } { F }
+ \@@_get_lang_opt_type:nnnN { xxxN , xxnN } { F }
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\@@_get_default_transl:nnNF}
-% Get default translation of \meta{key} for \meta{language}, and store it in
-% \meta{tl variable} if found. If not found, leave the \meta{false code} on
-% the stream, in which case the value of \meta{tl variable} should not be
-% relied upon.
+% \begin{macro}{\@@_get_lang_opt_default:nnNF}
+% Get default language option of \meta{key} for \meta{language}, and store
+% it in \meta{tl variable} if found. If not found, leave the \meta{false
+% code} on the stream, in which case the value of \meta{tl variable} should
+% not be relied upon.
% \begin{syntax}
-% \cs{@@_get_default_transl:nnNF} \Arg{language} \Arg{key}
+% \cs{@@_get_lang_opt_default:nnNF} \Arg{language} \Arg{key}
% ~~\meta{tl variable} \Arg{false code}
% \end{syntax}
% \begin{macrocode}
\prg_new_protected_conditional:Npnn
- \@@_get_default_transl:nnN #1#2#3 { F }
+ \@@_get_lang_opt_default:nnN #1#2#3 { F }
{
\prop_get:NnNTF \g_@@_languages_prop {#1}
- \l_@@_dict_language_tl
+ \l_@@_base_language_tl
{
\prop_get:cnNTF
- { g_@@_dict_ \l_@@_dict_language_tl _prop }
+ { g_@@_lang_ \l_@@_base_language_tl _prop }
{ default- #2 } #3
{ \prg_return_true: }
{ \prg_return_false: }
@@ -1515,25 +1579,26 @@
{ \prg_return_false: }
}
\prg_generate_conditional_variant:Nnn
- \@@_get_default_transl:nnN { xnN } { F }
+ \@@_get_lang_opt_default:nnN { xnN } { F }
% \end{macrocode}
% \end{macro}
%
%
-% \begin{macro}{\@@_get_fallback_transl:nNF}
-% Get fallback translation of \meta{key}, and store it in \meta{tl variable}
-% if found. If not found, leave the \meta{false code} on the stream, in
-% which case the value of \meta{tl variable} should not be relied upon.
+% \begin{macro}{\@@_get_fallback_unknown_lang_opt:nNF}
+% Get fallback language option of \meta{key}, and store it in \meta{tl
+% variable} if found. If not found, leave the \meta{false code} on the
+% stream, in which case the value of \meta{tl variable} should not be relied
+% upon.
% \begin{syntax}
-% \cs{@@_get_fallback_transl:nNF} \Arg{key}
+% \cs{@@_get_fallback_unknown_lang_opt:nNF} \Arg{key}
% ~~\meta{tl variable} \Arg{false code}
% \end{syntax}
% \begin{macrocode}
% {<key>}<tl var to set>
\prg_new_protected_conditional:Npnn
- \@@_get_fallback_transl:nN #1#2 { F }
+ \@@_get_fallback_unknown_lang_opt:nN #1#2 { F }
{
- \prop_get:NnNTF \g_@@_fallback_dict_prop
+ \prop_get:NnNTF \g_@@_fallback_unknown_lang_prop
{ #1 } #2
{ \prg_return_true: }
{ \prg_return_false: }
@@ -1712,14 +1777,26 @@
% \subsubsection*{\opt{cap} and \opt{capfirst} options}
%
% \begin{macrocode}
-\bool_new:N \l_@@_capitalize_bool
\bool_new:N \l_@@_capitalize_first_bool
\keys_define:nn { zref-clever / reference }
{
- cap .bool_set:N = \l_@@_capitalize_bool ,
- cap .initial:n = false ,
+ cap .code:n =
+ {
+ \tl_if_empty:nTF {#1}
+ { \prop_remove:Nn \l_@@_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_@@_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 .meta:n = { cap = false } ,
nocap .value_forbidden:n = true ,
capfirst .bool_set:N = \l_@@_capitalize_first_bool ,
@@ -1732,12 +1809,24 @@
% \subsubsection*{\opt{abbrev} and \opt{noabbrevfirst} options}
%
% \begin{macrocode}
-\bool_new:N \l_@@_abbrev_bool
\bool_new:N \l_@@_noabbrev_first_bool
\keys_define:nn { zref-clever / reference }
{
- abbrev .bool_set:N = \l_@@_abbrev_bool ,
- abbrev .initial:n = false ,
+ abbrev .code:n =
+ {
+ \tl_if_empty:nTF {#1}
+ { \prop_remove:Nn \l_@@_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_@@_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 ,
@@ -1871,8 +1960,8 @@
% executed. Finally, we set a third \texttt{begindocument} hook, at
% \texttt{begindocument/before}, so that it runs after any options set in the
% preamble. This hook redefines the \opt{lang} option for immediate execution
-% in the document body, and ensures the \texttt{current} language's dictionary
-% gets loaded, if it hadn't been already.
+% in the document body, and ensures the \texttt{current} language's language
+% file gets loaded, if it hadn't been already.
%
% For the \pkg{babel} and \pkg{polyglossia} variables which store the
% ``current'' and ``main'' languages, see
@@ -1911,9 +2000,9 @@
% Provide default value for \cs{l_@@_ref_language_tl} corresponding to option
% \opt{current}, but do so outside of the \pkg{l3keys} machinery (that is,
% instead of using \texttt{.initial:n}), so that we are able to distinguish
-% when the user actually gave the option, in which case the dictionary loading
-% is done verbosely, from when we are setting the default value (here), in
-% which case the dictionary loading is done silently.
+% when the user actually gave the option, in which case the language file
+% loading is done verbosely, from when we are setting the default value
+% (here), in which case the language file loading is done silently.
% \begin{macrocode}
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_current_language_tl }
@@ -1934,7 +2023,7 @@
{
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_current_language_tl }
- \@@_provide_dictionary_verbose:x
+ \@@_provide_langfile_verbose:x
{ \l_@@_ref_language_tl }
}
@@ -1942,7 +2031,7 @@
{
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_main_language_tl }
- \@@_provide_dictionary_verbose:x
+ \@@_provide_langfile_verbose:x
{ \l_@@_ref_language_tl }
}
}
@@ -1955,7 +2044,7 @@
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_current_language_tl }
}
- \@@_provide_dictionary_verbose:x
+ \@@_provide_langfile_verbose:x
{ \l_@@_ref_language_tl }
}
}
@@ -1975,12 +2064,12 @@
% language is already loaded, otherwise, ensure the default one
% (\texttt{current}) gets loaded early, but not verbosely.
% \begin{macrocode}
- \@@_provide_dictionary:x { \l_@@_ref_language_tl }
+ \@@_provide_langfile:x { \l_@@_ref_language_tl }
% \end{macrocode}
% Redefinition of the \texttt{lang} key option for the document body. Also,
-% drop the verbose dictionary loading in the document body, as it can become
-% intrusive depending on the use case, and does not provide much ``juice''
-% anyway: in \cs{zcref} missing names warnings will already ensue.
+% drop the verbose language file loading in the document body, as it can
+% become intrusive depending on the use case, and does not provide much
+% ``juice'' anyway: in \cs{zcref} missing names warnings will already ensue.
% \begin{macrocode}
\keys_define:nn { zref-clever / reference }
{
@@ -1992,7 +2081,7 @@
{
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_current_language_tl }
- \@@_provide_dictionary:x
+ \@@_provide_langfile:x
{ \l_@@_ref_language_tl }
}
@@ -2000,7 +2089,7 @@
{
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_main_language_tl }
- \@@_provide_dictionary:x
+ \@@_provide_langfile:x
{ \l_@@_ref_language_tl }
}
}
@@ -2013,7 +2102,7 @@
\tl_set:Nn \l_@@_ref_language_tl
{ \l_@@_current_language_tl }
}
- \@@_provide_dictionary:x
+ \@@_provide_langfile:x
{ \l_@@_ref_language_tl }
}
} ,
@@ -2480,8 +2569,8 @@
% ``not necessarily type-specific'' options are pertinent here. However, they
% \emph{may} either be type-specific or language-specific, and thus must be
% stored in a property list, \cs{l_@@_ref_options_prop}, in order to be
-% retrieved from the option \emph{name} by \cs{@@_get_ref_string:nN} and
-% \cs{@@_get_ref_font:nN} according to context and precedence rules.
+% retrieved from the option \emph{name} by \cs{@@_get_ref_opt_typeset:nN} and
+% \cs{@@_get_ref_opt_font:nN} according to context and precedence rules.
%
% The keys are set so that any value, including an empty one, is added to
% \cs{l_@@_ref_options_prop}, while a key with \emph{no value} removes the
@@ -2505,6 +2594,21 @@
} ,
}
}
+\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 }
+ } ,
+ refpos .code:n =
+ {
+ % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha.
+ \msg_warning:nnnn { zref-clever }{ option-deprecated }
+ { refpos } { postref }
+ } ,
+ }
% \end{macrocode}
%
%
@@ -2573,13 +2677,12 @@
%
% \cs{zcRefTypeSetup} is the main user interface for ``type-specific''
% reference formatting. Settings done by this command have a higher
-% precedence than any translation, hence they override any language-specific
-% setting, either done at \cs{zcLanguageSetup} or by the package's
-% dictionaries. On the other hand, they have a lower precedence than non
-% type-specific general options. The \meta{options} should be given in the
-% usual \texttt{key=val} format. The \meta{type} does not need to pre-exist,
-% the property list variable to store the properties for the type gets created
-% if need be.
+% precedence than any language-specific setting, either done at
+% \cs{zcLanguageSetup} or by the package's language files. On the other hand,
+% they have a lower precedence than non type-specific general options. The
+% \meta{options} should be given in the usual \texttt{key=val} format. The
+% \meta{type} does not need to pre-exist, the property list variable to store
+% the properties for the type gets created if need be.
%
% \begin{macro}[int]{\zcRefTypeSetup}
% \begin{syntax}
@@ -2599,14 +2702,14 @@
%
% Inside \cs{zcRefTypeSetup} any of the options \emph{can} receive empty
% values, and those values, if they exist in the property list, will override
-% translations, regardless of their emptiness. In principle, we could live
-% with the situation of, once a setting has been made in
+% language-specific options, regardless of their emptiness. In principle, we
+% could live with the situation of, once a setting has been made in
% \cs{l_@@_type_<type>_options_prop} or in \cs{l_@@_ref_options_prop} it stays
% there forever, and can only be overridden by a new value at the same
% precedence level or a higher one. But it would be nice if an user can
% ``unset'' an option at either of those scopes to go back to the lower
-% precedence level of the translations at any given point. So both in
-% \cs{zcRefTypeSetup} and in setting reference options (see
+% precedence level of the language-specific options at any given point. So
+% both in \cs{zcRefTypeSetup} and in setting reference options (see
% \zcref{sec:reference-options}), we leverage the distinction of an ``empty
% valued key'' (\texttt{key=} or \texttt{key=\{\}}) from a ``key with no
% value'' (\texttt{key}). This distinction is captured internally by the
@@ -2618,6 +2721,79 @@
% \url{https://tex.stackexchange.com/q/614690} and
% \url{https://github.com/latex3/latex3/pull/988}.
%
+%
+% \begin{macrocode}
+\keys_define:nn { zref-clever / typesetup }
+ {
+ cap .code:n =
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \prop_remove:cn
+ {
+ l_@@_type_
+ \l_@@_setup_type_tl _options_prop
+ }
+ { cap }
+ }
+ {
+ \bool_lazy_or:nnTF
+ { \str_if_eq_p:nn {#1} { true } }
+ { \str_if_eq_p:nn {#1} { false } }
+ {
+ \prop_put:cnn
+ {
+ l_@@_type_
+ \l_@@_setup_type_tl _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 ,
+
+ abbrev .code:n =
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \prop_remove:cn
+ {
+ l_@@_type_
+ \l_@@_setup_type_tl _options_prop
+ }
+ { abbrev }
+ }
+ {
+ \bool_lazy_or:nnTF
+ { \str_if_eq_p:nn {#1} { true } }
+ { \str_if_eq_p:nn {#1} { false } }
+ {
+ \prop_put:cnn
+ {
+ l_@@_type_
+ \l_@@_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 ,
+ }
+% \end{macrocode}
+%
+%
% \begin{macrocode}
\seq_map_inline:Nn
\c_@@_ref_options_necessarily_not_type_specific_seq
@@ -2663,6 +2839,21 @@
} ,
}
}
+\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 }
+ } ,
+ refpos .code:n =
+ {
+ % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha.
+ \msg_warning:nnnn { zref-clever }{ option-deprecated }
+ { refpos } { postref }
+ } ,
+ }
% \end{macrocode}
%
%
@@ -2674,9 +2865,9 @@
% between the two cases is captured by the \texttt{type} key, which works as a
% sort of a ``switch''. Inside the \meta{options} argument of
% \cs{zcLanguageSetup}, any options made before the first \texttt{type} key
-% declare ``default'' (non type-specific) translations. When the
+% declare ``default'' (non type-specific) language options. When the
% \texttt{type} key is given with a value, the options following it will set
-% ``type-specific'' translations for that type. The current type can be
+% ``type-specific'' language options for that type. The current type can be
% switched off by an empty \texttt{type} key. \cs{zcLanguageSetup} is
% preamble only.
%
@@ -2689,32 +2880,32 @@
{
\group_begin:
\prop_get:NnNTF \g_@@_languages_prop {#1}
- \l_@@_dict_language_tl
+ \l_@@_base_language_tl
{
\tl_clear:N \l_@@_setup_type_tl
\exp_args:NNx \seq_set_from_clist:Nn
- \l_@@_dict_declension_seq
+ \l_@@_lang_declension_seq
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ declension }
}
- \seq_if_empty:NTF \l_@@_dict_declension_seq
- { \tl_clear:N \l_@@_dict_decl_case_tl }
+ \seq_if_empty:NTF \l_@@_lang_declension_seq
+ { \tl_clear:N \l_@@_lang_decl_case_tl }
{
- \seq_get_left:NN \l_@@_dict_declension_seq
- \l_@@_dict_decl_case_tl
+ \seq_get_left:NN \l_@@_lang_declension_seq
+ \l_@@_lang_decl_case_tl
}
\exp_args:NNx \seq_set_from_clist:Nn
- \l_@@_dict_gender_seq
+ \l_@@_lang_gender_seq
{
\prop_item:cn
{
- g_@@_dict_
- \l_@@_dict_language_tl _prop
+ g_@@_lang_
+ \l_@@_base_language_tl _prop
}
{ gender }
}
@@ -2730,38 +2921,39 @@
%
% \begin{macro}
% {
-% \@@_declare_type_transl:nnnn ,
-% \@@_declare_default_transl:nnn ,
+% \@@_declare_lang_opt_type:nnnn ,
+% \@@_declare_lang_opt_default:nnn ,
% }
% A couple of auxiliary functions for the of
-% \texttt{{zref-clever/translation}} keys set in \cs{zcLanguageSetup}. They
+% \texttt{{zref-clever/langsetup}} keys set in \cs{zcLanguageSetup}. They
% respectively declare (unconditionally set) ``type-specific'' and
-% ``default'' translations.
+% ``default'' language-specific options.
% \begin{syntax}
-% \cs{@@_declare_type_transl:nnnn} \Arg{language} \Arg{type}
-% ~~\Arg{key} \Arg{translation}
-% \cs{@@_declare_default_transl:nnn} \Arg{language}
-% ~~\Arg{key} \Arg{translation}
+% \cs{@@_declare_lang_opt_type:nnnn} \Arg{language} \Arg{type}
+% ~~\Arg{key} \Arg{value}
+% \cs{@@_declare_lang_opt_default:nnn} \Arg{language}
+% ~~\Arg{key} \Arg{value}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_declare_type_transl:nnnn #1#2#3#4
+\cs_new_protected:Npn \@@_declare_lang_opt_type:nnnn #1#2#3#4
{
- \prop_gput:cnn { g_@@_dict_ #1 _prop }
+ \prop_gput:cnn { g_@@_lang_ #1 _prop }
{ type- #2 - #3 } {#4}
}
-\cs_generate_variant:Nn \@@_declare_type_transl:nnnn { VVnn , VVxn }
-\cs_new_protected:Npn \@@_declare_default_transl:nnn #1#2#3
+\cs_generate_variant:Nn
+ \@@_declare_lang_opt_type:nnnn { VVnn , VVxn , VVnx , VVnV }
+\cs_new_protected:Npn \@@_declare_lang_opt_default:nnn #1#2#3
{
- \prop_gput:cnn { g_@@_dict_ #1 _prop }
+ \prop_gput:cnn { g_@@_lang_ #1 _prop }
{ default- #2 } {#3}
}
-\cs_generate_variant:Nn \@@_declare_default_transl:nnn { Vnn }
+\cs_generate_variant:Nn \@@_declare_lang_opt_default:nnn { Vnn , VnV }
% \end{macrocode}
% \end{macro}
%
%
-% The set of keys for \texttt{{zref-clever/langsetup}}, which is used to
-% set language-specific translations in \cs{zcLanguageSetup}.
+% The set of keys for \texttt{{zref-clever/langsetup}}, which is used to set
+% language-specific options in \cs{zcLanguageSetup}.
%
% \begin{macrocode}
\keys_define:nn { zref-clever / langsetup }
@@ -2772,31 +2964,33 @@
{ \tl_clear:N \l_@@_setup_type_tl }
{ \tl_set:Nn \l_@@_setup_type_tl {#1} }
} ,
+
case .code:n =
{
- \seq_if_empty:NTF \l_@@_dict_declension_seq
+ \seq_if_empty:NTF \l_@@_lang_declension_seq
{
\msg_warning:nnxx { zref-clever } { language-no-decl-setup }
- { \l_@@_dict_language_tl } {#1}
+ { \l_@@_base_language_tl } {#1}
}
{
- \seq_if_in:NnTF \l_@@_dict_declension_seq {#1}
- { \tl_set:Nn \l_@@_dict_decl_case_tl {#1} }
+ \seq_if_in:NnTF \l_@@_lang_declension_seq {#1}
+ { \tl_set:Nn \l_@@_lang_decl_case_tl {#1} }
{
\msg_warning:nnxx { zref-clever } { unknown-decl-case }
- {#1} { \l_@@_dict_language_tl }
- \seq_get_left:NN \l_@@_dict_declension_seq
- \l_@@_dict_decl_case_tl
+ {#1} { \l_@@_base_language_tl }
+ \seq_get_left:NN \l_@@_lang_declension_seq
+ \l_@@_lang_decl_case_tl
}
}
} ,
case .value_required:n = true ,
+
gender .code:n =
{
- \seq_if_empty:NTF \l_@@_dict_gender_seq
+ \seq_if_empty:NTF \l_@@_lang_gender_seq
{
\msg_warning:nnxxx { zref-clever } { language-no-gender }
- { \l_@@_dict_language_tl } { gender } {#1}
+ { \l_@@_base_language_tl } { gender } {#1}
}
{
\tl_if_empty:NTF \l_@@_setup_type_tl
@@ -2805,21 +2999,68 @@
{ option-only-type-specific } { gender }
}
{
- \seq_if_in:NnTF \l_@@_dict_gender_seq {#1}
+ \clist_clear:N \l_tmpa_clist
+ \clist_map_inline:nn {#1}
{
- \@@_declare_type_transl:VVnn
- \l_@@_dict_language_tl
- \l_@@_setup_type_tl
- { gender } {#1}
+ \seq_if_in:NnTF \l_@@_lang_gender_seq {##1}
+ { \clist_put_right:Nn \l_tmpa_clist {##1} }
+ {
+ \msg_warning:nnxx { zref-clever }
+ { gender-not-declared }
+ { \l_@@_base_language_tl } {##1}
+ }
}
+ \clist_if_empty:NF \l_tmpa_clist
{
- \msg_warning:nnxx { zref-clever } { gender-not-declared }
- { \l_@@_dict_language_tl } {#1}
+ \@@_declare_lang_opt_type:VVnx
+ \l_@@_base_language_tl
+ \l_@@_setup_type_tl
+ { gender } { \clist_use:Nn \l_tmpa_clist { , } }
}
}
}
} ,
gender .value_required:n = true ,
+
+ cap .choices:nn =
+ { true , false }
+ {
+ \tl_if_empty:NTF \l_@@_setup_type_tl
+ {
+ \@@_declare_lang_opt_default:VnV
+ \l_@@_base_language_tl
+ { cap } \l_keys_choice_tl
+ }
+ {
+ \@@_declare_lang_opt_type:VVnV
+ \l_@@_base_language_tl
+ \l_@@_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_@@_setup_type_tl
+ {
+ \@@_declare_lang_opt_default:VnV
+ \l_@@_base_language_tl
+ { abbrev } \l_keys_choice_tl
+ }
+ {
+ \@@_declare_lang_opt_type:VVnV
+ \l_@@_base_language_tl
+ \l_@@_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_@@_ref_options_necessarily_not_type_specific_seq
@@ -2831,8 +3072,8 @@
{
\tl_if_empty:NTF \l_@@_setup_type_tl
{
- \@@_declare_default_transl:Vnn
- \l_@@_dict_language_tl
+ \@@_declare_lang_opt_default:Vnn
+ \l_@@_base_language_tl
{#1} {##1}
}
{
@@ -2852,19 +3093,34 @@
{
\tl_if_empty:NTF \l_@@_setup_type_tl
{
- \@@_declare_default_transl:Vnn
- \l_@@_dict_language_tl
+ \@@_declare_lang_opt_default:Vnn
+ \l_@@_base_language_tl
{#1} {##1}
}
{
- \@@_declare_type_transl:VVnn
- \l_@@_dict_language_tl
+ \@@_declare_lang_opt_type:VVnn
+ \l_@@_base_language_tl
\l_@@_setup_type_tl
{#1} {##1}
}
} ,
}
}
+\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 }
+ } ,
+ refpos .code:n =
+ {
+ % NOTE Option deprecated in 2022-01-10 for v0.1.2-alpha.
+ \msg_warning:nnnn { zref-clever }{ option-deprecated }
+ { refpos } { postref }
+ } ,
+ }
\seq_map_inline:Nn
\c_@@_ref_options_type_names_seq
{
@@ -2879,18 +3135,18 @@
{ option-only-type-specific } {#1}
}
{
- \tl_if_empty:NTF \l_@@_dict_decl_case_tl
+ \tl_if_empty:NTF \l_@@_lang_decl_case_tl
{
- \@@_declare_type_transl:VVnn
- \l_@@_dict_language_tl
+ \@@_declare_lang_opt_type:VVnn
+ \l_@@_base_language_tl
\l_@@_setup_type_tl
{#1} {##1}
}
{
- \@@_declare_type_transl:VVxn
- \l_@@_dict_language_tl
+ \@@_declare_lang_opt_type:VVxn
+ \l_@@_base_language_tl
\l_@@_setup_type_tl
- { \l_@@_dict_decl_case_tl - #1 } {##1}
+ { \l_@@_lang_decl_case_tl - #1 } {##1}
}
}
} ,
@@ -2938,13 +3194,13 @@
\seq_set_from_clist:Nn \l_@@_zcref_labels_seq {#1}
\bool_set:Nn \l_@@_link_star_bool {#2}
% \end{macrocode}
-% Ensure dictionary for reference language is loaded, if available. We cannot
-% rely on \cs{keys_set:nn} for the task, since if the \opt{lang} option is set
-% for \texttt{current}, the actual language may have changed outside our
-% control. \cs{@@_provide_dictionary:x} does nothing if the dictionary is
-% already loaded.
+% Ensure language file for reference language is loaded, if available. We
+% cannot rely on \cs{keys_set:nn} for the task, since if the \opt{lang} option
+% is set for \texttt{current}, the actual language may have changed outside
+% our control. \cs{@@_provide_langfile:x} does nothing if the language file
+% is already loaded.
% \begin{macrocode}
- \@@_provide_dictionary:x { \l_@@_ref_language_tl }
+ \@@_provide_langfile:x { \l_@@_ref_language_tl }
% \end{macrocode}
% Process \cs{zcDeclareLanguage} options.
% \begin{macrocode}
@@ -2976,7 +3232,7 @@
% \begin{macrocode}
\tl_if_empty:NF \l_@@_zcref_note_tl
{
- \@@_get_ref_string:nN { notesep } \l_tmpa_tl
+ \@@_get_ref_opt_typeset:nN { notesep } \l_tmpa_tl
\l_tmpa_tl
\l_@@_zcref_note_tl
}
@@ -3175,7 +3431,7 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_label_type_put_new_right:n #1
{
- \@@_def_extract:Nnnn
+ \@@_extract_default:Nnnn
\l_@@_label_type_a_tl {#1} { zc@type } { \c_empty_tl }
\seq_if_in:NVF \l_@@_label_types_seq
\l_@@_label_type_a_tl
@@ -3201,9 +3457,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_sort_default:nn #1#2
{
- \@@_def_extract:Nnnn
+ \@@_extract_default:Nnnn
\l_@@_label_type_a_tl {#1} { zc@type } { zc@missingtype }
- \@@_def_extract:Nnnn
+ \@@_extract_default:Nnnn
\l_@@_label_type_b_tl {#2} { zc@type } { zc@missingtype }
\tl_if_eq:NNTF
@@ -3223,15 +3479,15 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_sort_default_same_type:nn #1#2
{
- \@@_def_extract:Nnnn \l_@@_label_enclval_a_tl
+ \@@_extract_default:Nnnn \l_@@_label_enclval_a_tl
{#1} { zc@enclval } { \c_empty_tl }
\tl_reverse:N \l_@@_label_enclval_a_tl
- \@@_def_extract:Nnnn \l_@@_label_enclval_b_tl
+ \@@_extract_default:Nnnn \l_@@_label_enclval_b_tl
{#2} { zc@enclval } { \c_empty_tl }
\tl_reverse:N \l_@@_label_enclval_b_tl
- \@@_def_extract:Nnnn \l_@@_label_extdoc_a_tl
+ \@@_extract_default:Nnnn \l_@@_label_extdoc_a_tl
{#1} { externaldocument } { \c_empty_tl }
- \@@_def_extract:Nnnn \l_@@_label_extdoc_b_tl
+ \@@_extract_default:Nnnn \l_@@_label_extdoc_b_tl
{#2} { externaldocument } { \c_empty_tl }
\bool_set_false:N \l_@@_sort_decided_bool
@@ -3638,13 +3894,15 @@
% \l_@@_listsep_tl ,
% \l_@@_lastsep_tl ,
% \l_@@_rangesep_tl ,
-% \l_@@_refpre_tl ,
-% \l_@@_refpos_tl ,
+% \l_@@_preref_tl ,
+% \l_@@_postref_tl ,
% \l_@@_namefont_tl ,
% \l_@@_reffont_tl ,
+% \l_@@_capitalize_bool ,
+% \l_@@_abbrev_bool ,
% }
-% Auxiliary variables for \cs{@@_typeset_refs:} separators, refpre/pos and
-% font options.
+% Auxiliary variables for \cs{@@_typeset_refs:} separators, pre-/postref and
+% font and other options.
% \begin{macrocode}
\tl_new:N \l_@@_tpairsep_tl
\tl_new:N \l_@@_tlistsep_tl
@@ -3654,10 +3912,12 @@
\tl_new:N \l_@@_listsep_tl
\tl_new:N \l_@@_lastsep_tl
\tl_new:N \l_@@_rangesep_tl
-\tl_new:N \l_@@_refpre_tl
-\tl_new:N \l_@@_refpos_tl
+\tl_new:N \l_@@_preref_tl
+\tl_new:N \l_@@_postref_tl
\tl_new:N \l_@@_namefont_tl
\tl_new:N \l_@@_reffont_tl
+\bool_new:N \l_@@_capitalize_bool
+\bool_new:N \l_@@_abbrev_bool
% \end{macrocode}
% \end{macro}
%
@@ -3692,11 +3952,11 @@
\int_zero:N \l_@@_range_same_count_int
% Get type block options (not type-specific).
- \@@_get_ref_string:nN { tpairsep }
+ \@@_get_ref_opt_typeset:nN { tpairsep }
\l_@@_tpairsep_tl
- \@@_get_ref_string:nN { tlistsep }
+ \@@_get_ref_opt_typeset:nN { tlistsep }
\l_@@_tlistsep_tl
- \@@_get_ref_string:nN { tlastsep }
+ \@@_get_ref_opt_typeset:nN { tlastsep }
\l_@@_tlastsep_tl
% Process label stack.
@@ -3721,9 +3981,11 @@
\tl_set:Nn \l_@@_label_type_b_tl { page }
}
{
- \@@_def_extract:NVnn \l_@@_label_type_a_tl
+ \@@_extract_default:NVnn
+ \l_@@_label_type_a_tl
\l_@@_label_a_tl { zc@type } { zc@missingtype }
- \@@_def_extract:NVnn \l_@@_label_type_b_tl
+ \@@_extract_default:NVnn
+ \l_@@_label_type_b_tl
\l_@@_label_b_tl { zc@type } { zc@missingtype }
}
@@ -3777,28 +4039,32 @@
}
}
- % Get type-specific separators, refpre/pos and font options, once per
- % type.
+ % Get type-specific separators, pre-/postref font and other options,
+ % once per type.
\int_compare:nNnT { \l_@@_label_count_int } = { 0 }
{
- \@@_get_ref_string:nN { namesep }
+ \@@_get_ref_opt_typeset:nN { namesep }
\l_@@_namesep_tl
- \@@_get_ref_string:nN { pairsep }
+ \@@_get_ref_opt_typeset:nN { pairsep }
\l_@@_pairsep_tl
- \@@_get_ref_string:nN { listsep }
+ \@@_get_ref_opt_typeset:nN { listsep }
\l_@@_listsep_tl
- \@@_get_ref_string:nN { lastsep }
+ \@@_get_ref_opt_typeset:nN { lastsep }
\l_@@_lastsep_tl
- \@@_get_ref_string:nN { rangesep }
+ \@@_get_ref_opt_typeset:nN { rangesep }
\l_@@_rangesep_tl
- \@@_get_ref_string:nN { refpre }
- \l_@@_refpre_tl
- \@@_get_ref_string:nN { refpos }
- \l_@@_refpos_tl
- \@@_get_ref_font:nN { namefont }
+ \@@_get_ref_opt_typeset:nN { preref }
+ \l_@@_preref_tl
+ \@@_get_ref_opt_typeset:nN { postref }
+ \l_@@_postref_tl
+ \@@_get_ref_opt_font:nN { namefont }
\l_@@_namefont_tl
- \@@_get_ref_font:nN { reffont }
+ \@@_get_ref_opt_font:nN { reffont }
\l_@@_reffont_tl
+ \@@_get_ref_opt_bool:nnN { cap } { false }
+ \l_@@_capitalize_bool
+ \@@_get_ref_opt_bool:nnN { abbrev } { false }
+ \l_@@_abbrev_bool
}
% Here we send this to a couple of auxiliary functions.
@@ -4348,33 +4614,33 @@
}
{
\bool_if:NF \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpre_tl }
+ { \exp_not:V \l_@@_preref_tl }
% It's two `@s', but escaped for DocStrip.
\exp_not:N \hyper@@@@link
{ \@@_extract_url_unexp:n {#1} }
{ \@@_extract_unexp:nnn {#1} { anchor } { } }
{
\bool_if:NT \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpre_tl }
+ { \exp_not:V \l_@@_preref_tl }
\exp_not:N \group_begin:
\exp_not:V \l_@@_reffont_tl
\@@_extract_unexp:nvn {#1}
{ l_@@_ref_property_tl } { }
\exp_not:N \group_end:
\bool_if:NT \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpos_tl }
+ { \exp_not:V \l_@@_postref_tl }
}
\bool_if:NF \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpos_tl }
+ { \exp_not:V \l_@@_postref_tl }
}
{
- \exp_not:V \l_@@_refpre_tl
+ \exp_not:V \l_@@_preref_tl
\exp_not:N \group_begin:
\exp_not:V \l_@@_reffont_tl
\@@_extract_unexp:nvn {#1}
{ l_@@_ref_property_tl } { }
\exp_not:N \group_end:
- \exp_not:V \l_@@_refpos_tl
+ \exp_not:V \l_@@_postref_tl
}
}
{ \@@_ref_default: }
@@ -4421,7 +4687,7 @@
\exp_not:V \l_@@_type_name_tl
\exp_not:N \group_end:
\exp_not:V \l_@@_namesep_tl
- \exp_not:V \l_@@_refpre_tl
+ \exp_not:V \l_@@_preref_tl
\exp_not:N \group_begin:
\exp_not:V \l_@@_reffont_tl
\@@_extract_unexp:Vvn
@@ -4429,10 +4695,10 @@
{ l_@@_ref_property_tl } { }
\exp_not:N \group_end:
\bool_if:NT \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpos_tl }
+ { \exp_not:V \l_@@_postref_tl }
}
\bool_if:NF \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpos_tl }
+ { \exp_not:V \l_@@_postref_tl }
}
{
\exp_not:N \group_begin:
@@ -4467,7 +4733,7 @@
}
{
\bool_if:NF \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpre_tl }
+ { \exp_not:V \l_@@_preref_tl }
% It's two '@s', but escaped for DocStrip.
\exp_not:N \hyper@@@@link
{
@@ -4480,7 +4746,7 @@
}
{
\bool_if:NT \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpre_tl }
+ { \exp_not:V \l_@@_preref_tl }
\exp_not:N \group_begin:
\exp_not:V \l_@@_reffont_tl
\@@_extract_unexp:Vvn
@@ -4488,20 +4754,20 @@
{ l_@@_ref_property_tl } { }
\exp_not:N \group_end:
\bool_if:NT \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpos_tl }
+ { \exp_not:V \l_@@_postref_tl }
}
\bool_if:NF \l_@@_preposinlink_bool
- { \exp_not:V \l_@@_refpos_tl }
+ { \exp_not:V \l_@@_postref_tl }
}
{
- \exp_not:V \l_@@_refpre_tl
+ \exp_not:V \l_@@_preref_tl
\exp_not:N \group_begin:
\exp_not:V \l_@@_reffont_tl
\@@_extract_unexp:Vvn
\l_@@_type_first_label_tl
{ l_@@_ref_property_tl } { }
\exp_not:N \group_end:
- \exp_not:V \l_@@_refpos_tl
+ \exp_not:V \l_@@_postref_tl
}
}
{ \@@_ref_default: }
@@ -4594,15 +4860,17 @@
{ \l_@@_nudge_gender_bool }
{ ! \tl_if_empty_p:N \l_@@_ref_gender_tl }
{
- \@@_get_type_transl:xxnNF
+ \@@_get_lang_opt_type:xxnNF
{ \l_@@_ref_language_tl }
{ \l_@@_type_first_label_type_tl }
{ gender }
\l_@@_type_name_gender_tl
{ \tl_clear:N \l_@@_type_name_gender_tl }
- \tl_if_eq:NNF
- \l_@@_ref_gender_tl
+ \clist_set:NV \l_tmpa_clist
\l_@@_type_name_gender_tl
+ \clist_if_in:NVF
+ \l_tmpa_clist
+ \l_@@_ref_gender_tl
{
\tl_if_empty:NTF \l_@@_type_name_gender_tl
{
@@ -4640,7 +4908,7 @@
\tl_put_left:NV \l_@@_name_format_tl
\l_@@_ref_decl_case_tl
}
- \@@_get_type_transl:xxxNF
+ \@@_get_lang_opt_type:xxxNF
{ \l_@@_ref_language_tl }
{ \l_@@_type_first_label_type_tl }
{ \l_@@_name_format_tl }
@@ -4682,13 +4950,13 @@
\l_@@_name_format_fallback_tl
\l_@@_ref_decl_case_tl
}
- \@@_get_type_transl:xxxNF
+ \@@_get_lang_opt_type:xxxNF
{ \l_@@_ref_language_tl }
{ \l_@@_type_first_label_type_tl }
{ \l_@@_name_format_tl }
\l_@@_type_name_tl
{
- \@@_get_type_transl:xxxNF
+ \@@_get_lang_opt_type:xxxNF
{ \l_@@_ref_language_tl }
{ \l_@@_type_first_label_type_tl }
{ \l_@@_name_format_fallback_tl }
@@ -4776,9 +5044,9 @@
% \begin{macrocode}
\cs_new_protected:Npn \@@_labels_in_sequence:nn #1#2
{
- \@@_def_extract:Nnnn \l_@@_label_extdoc_a_tl
+ \@@_extract_default:Nnnn \l_@@_label_extdoc_a_tl
{#1} { externaldocument } { \c_empty_tl }
- \@@_def_extract:Nnnn \l_@@_label_extdoc_b_tl
+ \@@_extract_default:Nnnn \l_@@_label_extdoc_b_tl
{#2} { externaldocument } { \c_empty_tl }
\tl_if_eq:NNT
@@ -4855,27 +5123,28 @@
%
%
%
-% Finally, a couple of functions for retrieving options values, according to
-% the relevant precedence rules. They both receive an \meta{option} as
-% argument, and store the retrieved value in \meta{tl variable}. Though these
-% are mostly general functions (for a change\dots{}), they are not completely
-% so, they rely on the current state of \cs{l_@@_label_type_a_tl}, as set
-% during the processing of the label stack. This could be easily generalized,
-% of course, but I don't think it is worth it, \cs{l_@@_label_type_a_tl} is
-% indeed what we want in all practical cases. The difference between
-% \cs{@@_get_ref_string:nN} and \cs{@@_get_ref_font:nN} is the kind of option
-% each should be used for. \cs{@@_get_ref_string:nN} is meant for the general
-% options, and attempts to find values for them in all precedence levels (four
-% plus ``fallback''). \cs{@@_get_ref_font:nN} is intended for ``font''
+% Finally, some functions for retrieving reference options values, according
+% to the relevant precedence rules. They both receive an \meta{option} as
+% argument, and store the retrieved value in an appropriate. Though these are
+% mostly general functions (for a change\dots{}), they are not completely so,
+% they rely on the current state of \cs{l_@@_label_type_a_tl}, as set during
+% the processing of the label stack. This could be easily generalized, of
+% course, but I don't think it is worth it, \cs{l_@@_label_type_a_tl} is
+% indeed what we want in all practical cases. The difference between each of
+% these functions is the kind of option each should be used for.
+% \cs{@@_get_ref_opt_typeset:nN} is meant for the general options, and
+% attempts to find values for them in all precedence levels (four plus
+% ``fallback''). \cs{@@_get_ref_opt_font:nN} is intended for ``font''
% options, which cannot be ``language-specific'', thus for these we just
-% search general options and type options.
+% search general options and type options. \cs{@@_get_ref_opt_bool:nN} is
+% intended for boolean options.
%
-% \begin{macro}{\@@_get_ref_string:nN}
+% \begin{macro}{\@@_get_ref_opt_typeset:nN}
% \begin{syntax}
-% \cs{@@_get_ref_string:nN} \Arg{option} \Arg{tl variable}
+% \cs{@@_get_ref_opt_typeset:nN} \Arg{option} \Arg{tl variable}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_ref_string:nN #1#2
+\cs_new_protected:Npn \@@_get_ref_opt_typeset:nN #1#2
{
% First attempt: general options.
\prop_get:NnNF \l_@@_ref_options_prop {#1} #2
@@ -4906,19 +5175,19 @@
{#1} #2
}
{
- % If not found, try type specific translations.
- \@@_get_type_transl:xxnNF
+ % If not found, try type- and language-specific.
+ \@@_get_lang_opt_type:xxnNF
{ \l_@@_ref_language_tl }
{ \l_@@_label_type_a_tl }
{#1} #2
{
- % If not found, try default translations.
- \@@_get_default_transl:xnNF
+ % If not found, try language-specific default.
+ \@@_get_lang_opt_default:xnNF
{ \l_@@_ref_language_tl }
{#1} #2
{
% If not found, try fallback.
- \@@_get_fallback_transl:nNF {#1} #2
+ \@@_get_fallback_unknown_lang_opt:nNF {#1} #2
{
\tl_clear:N #2
\msg_warning:nnn { zref-clever }
@@ -4932,12 +5201,12 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@@_get_ref_font:nN}
+% \begin{macro}{\@@_get_ref_opt_font:nN}
% \begin{syntax}
-% \cs{@@_get_ref_font:nN} \Arg{option} \Arg{tl variable}
+% \cs{@@_get_ref_opt_font:nN} \Arg{option} \Arg{tl variable}
% \end{syntax}
% \begin{macrocode}
-\cs_new_protected:Npn \@@_get_ref_font:nN #1#2
+\cs_new_protected:Npn \@@_get_ref_opt_font:nN #1#2
{
% First attempt: general options.
\prop_get:NnNF \l_@@_ref_options_prop {#1} #2
@@ -4967,6 +5236,74 @@
% \end{macro}
%
%
+% \begin{macro}{\@@_get_ref_opt_bool:nnN}
+% \begin{syntax}
+% \cs{@@_get_ref_opt_bool:nN} \Arg{option}
+% ~~\Arg{default} \Arg{bool variable}
+% \end{syntax}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_get_ref_opt_bool:nnN #1#2#3
+ {
+ % First attempt: general options.
+ \prop_get:NnNF \l_@@_ref_options_prop {#1} \l_tmpa_tl
+ {
+ % If not found, try type specific options.
+ \bool_lazy_and:nnTF
+ {
+ \prop_if_exist_p:c
+ {
+ l_@@_type_
+ \l_@@_label_type_a_tl _options_prop
+ }
+ }
+ {
+ \prop_if_in_p:cn
+ {
+ l_@@_type_
+ \l_@@_label_type_a_tl _options_prop
+ }
+ {#1}
+ }
+ {
+ \prop_get:cnN
+ {
+ l_@@_type_
+ \l_@@_label_type_a_tl _options_prop
+ }
+ {#1} \l_tmpa_tl
+ }
+ {
+ % If not found, try type- and language-specific.
+ \@@_get_lang_opt_type:xxnNF
+ { \l_@@_ref_language_tl }
+ { \l_@@_label_type_a_tl }
+ {#1} \l_tmpa_tl
+ {
+ % If not found, try language-specific default.
+ \@@_get_lang_opt_default:xnNF
+ { \l_@@_ref_language_tl }
+ {#1} \l_tmpa_tl
+ {
+ % 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 }
+ }
+ }
+ }
+ }
+ }
+ % 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
+ }
+% \end{macrocode}
+% \end{macro}
+%
%
% \section{Compatibility}
%
@@ -5461,8 +5798,8 @@
\zcRefTypeSetup { equation }
{
reffont = \upshape ,
- refpre = {\textup{(}} ,
- refpos = {\textup{)}} ,
+ preref = {\textup{(}} ,
+ postref = {\textup{)}} ,
}
\msg_info:nnn { zref-clever } { compat-package } { amsmath }
}
@@ -5752,10 +6089,10 @@
%
%
%
-% \section{Dictionaries}
+% \section{Language files}
%
% Initial values for the English, German, French, Portuguese, and Spanish,
-% dictionaries have been provided by the author. Translations available for
+% language files have been provided by the author. Translations available for
% document elements' names in other packages have been an useful reference for
% the purpose, namely: \pkg{babel}, \pkg{cleveref}, \pkg{translator}, and
% \pkg{translations}.
@@ -5763,7 +6100,7 @@
%
% \subsection{English}
%
-% English dictionary has been initially provided by the author.
+% English language file has been initially provided by the author.
%
% \begin{macrocode}
%<*package>
@@ -5779,7 +6116,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-%<*dict-english>
+%<*lang-english>
% \end{macrocode}
%
% \begin{macrocode}
@@ -5838,8 +6175,6 @@ type = page ,
name-sg = page ,
Name-pl = Pages ,
name-pl = pages ,
- name-sg-ab = p. ,
- name-pl-ab = pp. ,
rangesep = {\textendash} ,
type = line ,
@@ -5897,8 +6232,8 @@ type = equation ,
name-sg-ab = eq. ,
Name-pl-ab = Eqs. ,
name-pl-ab = eqs. ,
- refpre = {(} ,
- refpos = {)} ,
+ preref = {(} ,
+ postref = {)} ,
type = theorem ,
Name-sg = Theorem ,
@@ -5980,14 +6315,14 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%</dict-english>
+%</lang-english>
% \end{macrocode}
%
%
%
% \subsection{German}
%
-% German dictionary has been initially provided by the author.
+% German language file has been initially provided by the author.
%
% \begin{macrocode}
%<*package>
@@ -6004,7 +6339,7 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%<*dict-german>
+%<*lang-german>
% \end{macrocode}
%
% \begin{macrocode}
@@ -6251,8 +6586,8 @@ type = equation ,
case = G ,
Name-sg = Gleichung ,
Name-pl = Gleichungen ,
- refpre = {(} ,
- refpos = {)} ,
+ preref = {(} ,
+ postref = {)} ,
type = theorem ,
gender = n ,
@@ -6451,18 +6786,18 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%</dict-german>
+%</lang-german>
% \end{macrocode}
%
%
%
% \subsection{French}
%
-% French dictionary has been initially provided by the author, and has been
-% improved thanks to Denis Bitouzé (\githubissue{1}) and participants of the
-% Groupe francophone des Utilisateurs de \TeX{} (GUTenberg) (at
-% \url{https://groups.google.com/g/gut_fr/c/rNLm6weGcyg}) and the
-% \texttt{fr.comp.text.tex} (at
+% French language file has been initially provided by the author, and has been
+% improved thanks to Denis Bitouzé and François Lagarde (at \githubissue{1})
+% and participants of the Groupe francophone des Utilisateurs de \TeX{}
+% (GUTenberg) (at \url{https://groups.google.com/g/gut_fr/c/rNLm6weGcyg}) and
+% the \texttt{fr.comp.text.tex} (at
% \url{https://groups.google.com/g/fr.comp.text.tex/c/Fa11Tf6MFFs}) mailing
% lists.
%
@@ -6477,7 +6812,7 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%<*dict-french>
+%<*lang-french>
% \end{macrocode}
%
% \begin{macrocode}
@@ -6596,8 +6931,8 @@ type = equation ,
name-sg = équation ,
Name-pl = Équations ,
name-pl = équations ,
- refpre = {(} ,
- refpos = {)} ,
+ preref = {(} ,
+ postref = {)} ,
type = theorem ,
gender = m ,
@@ -6692,14 +7027,14 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%</dict-french>
+%</lang-french>
% \end{macrocode}
%
%
%
% \subsection{Portuguese}
%
-% Portuguese dictionary provided by the author, who's a native speaker of
+% Portuguese language file provided by the author, who's a native speaker of
% (Brazilian) Portuguese. I do expect this to be sufficiently general, but if
% Portuguese speakers from other places feel the need for a Portuguese
% variant, please let me know.
@@ -6714,7 +7049,7 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%<*dict-portuguese>
+%<*lang-portuguese>
% \end{macrocode}
%
% \begin{macrocode}
@@ -6780,8 +7115,6 @@ type = page ,
name-sg = página ,
Name-pl = Páginas ,
name-pl = páginas ,
- name-sg-ab = p. ,
- name-pl-ab = pp. ,
rangesep = {\textendash} ,
type = line ,
@@ -6847,8 +7180,8 @@ type = equation ,
name-sg-ab = eq. ,
Name-pl-ab = Eqs. ,
name-pl-ab = eqs. ,
- refpre = {(} ,
- refpos = {)} ,
+ preref = {(} ,
+ postref = {)} ,
type = theorem ,
gender = m ,
@@ -6943,14 +7276,14 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%</dict-portuguese>
+%</lang-portuguese>
% \end{macrocode}
%
%
%
% \subsection{Spanish}
%
-% Spanish dictionary has been initially provided by the author.
+% Spanish language file has been initially provided by the author.
%
% \begin{macrocode}
%<*package>
@@ -6959,7 +7292,7 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%<*dict-spanish>
+%<*lang-spanish>
% \end{macrocode}
%
% \begin{macrocode}
@@ -7078,8 +7411,8 @@ type = equation ,
name-sg = ecuación ,
Name-pl = Ecuaciones ,
name-pl = ecuaciones ,
- refpre = {(} ,
- refpos = {)} ,
+ preref = {(} ,
+ postref = {)} ,
type = theorem ,
gender = m ,
@@ -7174,7 +7507,255 @@ type = solution ,
% \end{macrocode}
%
% \begin{macrocode}
-%</dict-spanish>
+%</lang-spanish>
+% \end{macrocode}
+%
+%
+%
+% \subsection{Dutch}
+%
+% Dutch language file initially contributed by \texttt{niluxv} (\githubPR{5}).
+% All genders were checked against the ``Dikke Van Dale''. Many words have
+% multiple genders.
+%
+% \begin{macrocode}
+%<*package>
+\zcDeclareLanguage [ gender = { f , m , n } ] { dutch }
+%</package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*lang-dutch>
+% \end{macrocode}
+%
+% \begin{macrocode}
+namesep = {\nobreakspace} ,
+pairsep = {~en\nobreakspace} ,
+listsep = {,~} ,
+lastsep = {~en\nobreakspace} ,
+tpairsep = {~en\nobreakspace} ,
+tlistsep = {,~} ,
+tlastsep = {,~en\nobreakspace} ,
+notesep = {~} ,
+rangesep = {~t/m\nobreakspace} ,
+
+type = book ,
+ gender = n ,
+ Name-sg = Boek ,
+ name-sg = boek ,
+ Name-pl = Boeken ,
+ name-pl = boeken ,
+
+type = part ,
+ gender = n ,
+ Name-sg = Deel ,
+ name-sg = deel ,
+ Name-pl = Delen ,
+ name-pl = delen ,
+
+type = chapter ,
+ gender = n ,
+ Name-sg = Hoofdstuk ,
+ name-sg = hoofdstuk ,
+ Name-pl = Hoofdstukken ,
+ name-pl = hoofdstukken ,
+
+type = section ,
+ gender = m ,
+ Name-sg = Paragraaf ,
+ name-sg = paragraaf ,
+ Name-pl = Paragrafen ,
+ name-pl = paragrafen ,
+
+type = paragraph ,
+ gender = f ,
+ Name-sg = Alinea ,
+ name-sg = alinea ,
+ Name-pl = Alinea's ,
+ name-pl = alinea's ,
+
+type = appendix ,
+ gender = { m , n } ,
+ Name-sg = Appendix ,
+ name-sg = appendix ,
+ Name-pl = Appendices ,
+ name-pl = appendices ,
+
+type = page ,
+ gender = { f , m } ,
+ Name-sg = Pagina ,
+ name-sg = pagina ,
+ Name-pl = Pagina's ,
+ name-pl = pagina's ,
+ rangesep = {\textendash} ,
+
+type = line ,
+ gender = m ,
+ Name-sg = Regel ,
+ name-sg = regel ,
+ Name-pl = Regels ,
+ name-pl = regels ,
+
+type = figure ,
+ gender = { n , f , m } ,
+ Name-sg = Figuur ,
+ name-sg = figuur ,
+ Name-pl = Figuren ,
+ name-pl = figuren ,
+
+type = table ,
+ gender = { f , m } ,
+ Name-sg = Tabel ,
+ name-sg = tabel ,
+ Name-pl = Tabellen ,
+ name-pl = tabellen ,
+
+type = item ,
+ gender = n ,
+ Name-sg = Punt ,
+ name-sg = punt ,
+ Name-pl = Punten ,
+ name-pl = punten ,
+
+type = footnote ,
+ gender = { f , m } ,
+ Name-sg = Voetnoot ,
+ name-sg = voetnoot ,
+ Name-pl = Voetnoten ,
+ name-pl = voetnoten ,
+
+type = endnote ,
+ gender = { f , m } ,
+ Name-sg = Eindnoot ,
+ name-sg = eindnoot ,
+ Name-pl = Eindnoten ,
+ name-pl = eindnoten ,
+
+type = note ,
+ gender = f ,
+ Name-sg = Opmerking ,
+ name-sg = opmerking ,
+ Name-pl = Opmerkingen ,
+ name-pl = opmerkingen ,
+
+type = equation ,
+ gender = f ,
+ Name-sg = Vergelijking ,
+ name-sg = vergelijking ,
+ Name-pl = Vergelijkingen ,
+ name-pl = vergelijkingen ,
+ Name-sg-ab = Vgl. ,
+ name-sg-ab = vgl. ,
+ Name-pl-ab = Vgl.'s ,
+ name-pl-ab = vgl.'s ,
+ preref = {(} ,
+ postref = {)} ,
+
+type = theorem ,
+ gender = f ,
+ Name-sg = Stelling ,
+ name-sg = stelling ,
+ Name-pl = Stellingen ,
+ name-pl = stellingen ,
+% \end{macrocode}
+%
+% 2022-01-09, \texttt{niluxv}: An alternative plural is ``lemmata''. That is
+% also a correct English plural for lemma, but the English language file
+% chooses ``lemmas''. For consistency we therefore choose ``lemma's''.
+%
+% \begin{macrocode}
+type = lemma ,
+ gender = n ,
+ Name-sg = Lemma ,
+ name-sg = lemma ,
+ Name-pl = Lemma's ,
+ name-pl = lemma's ,
+
+type = corollary ,
+ gender = n ,
+ Name-sg = Gevolg ,
+ name-sg = gevolg ,
+ Name-pl = Gevolgen ,
+ name-pl = gevolgen ,
+
+type = proposition ,
+ gender = f ,
+ Name-sg = Propositie ,
+ name-sg = propositie ,
+ Name-pl = Proposities ,
+ name-pl = proposities ,
+
+type = definition ,
+ gender = f ,
+ Name-sg = Definitie ,
+ name-sg = definitie ,
+ Name-pl = Definities ,
+ name-pl = definities ,
+
+type = proof ,
+ gender = n ,
+ Name-sg = Bewijs ,
+ name-sg = bewijs ,
+ Name-pl = Bewijzen ,
+ name-pl = bewijzen ,
+
+type = result ,
+ gender = n ,
+ Name-sg = Resultaat ,
+ name-sg = resultaat ,
+ Name-pl = Resultaten ,
+ name-pl = resultaten ,
+
+type = remark ,
+ gender = f ,
+ Name-sg = Opmerking ,
+ name-sg = opmerking ,
+ Name-pl = Opmerkingen ,
+ name-pl = opmerkingen ,
+
+type = example ,
+ gender = n ,
+ Name-sg = Voorbeeld ,
+ name-sg = voorbeeld ,
+ Name-pl = Voorbeelden ,
+ name-pl = voorbeelden ,
+
+type = algorithm ,
+ gender = { n , f , m } ,
+ Name-sg = Algoritme ,
+ name-sg = algoritme ,
+ Name-pl = Algoritmes ,
+ name-pl = algoritmes ,
+% \end{macrocode}
+%
+% 2022-01-09, \texttt{niluxv}: EN-NL Van Dale translates listing as (3)
+% ``uitdraai van computerprogramma'', ``listing''.
+%
+% \begin{macrocode}
+type = listing ,
+ gender = m ,
+ Name-sg = Listing ,
+ name-sg = listing ,
+ Name-pl = Listings ,
+ name-pl = listings ,
+
+type = exercise ,
+ gender = { f , m } ,
+ Name-sg = Opgave ,
+ name-sg = opgave ,
+ Name-pl = Opgaven ,
+ name-pl = opgaven ,
+
+type = solution ,
+ gender = f ,
+ Name-sg = Oplossing ,
+ name-sg = oplossing ,
+ Name-pl = Oplossingen ,
+ name-pl = oplossingen ,
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</lang-dutch>
% \end{macrocode}
%
%