rework theorem family generation
This commit is contained in:
parent
d0939faa5b
commit
cc853a87e2
3 changed files with 121 additions and 583 deletions
|
@ -2159,7 +2159,7 @@
|
||||||
% {
|
% {
|
||||||
% \groupthm_new_theorem:nnnn,
|
% \groupthm_new_theorem:nnnn,
|
||||||
% \groupthm_new_theorem:nVVV,
|
% \groupthm_new_theorem:nVVV,
|
||||||
% \groupthm_new_theorem:xVnn
|
% \groupthm_new_theorem:xVnn,
|
||||||
% \groupthm_provide_theorem:nnnn,
|
% \groupthm_provide_theorem:nnnn,
|
||||||
% \groupthm_provide_theorem:nVVV,
|
% \groupthm_provide_theorem:nVVV,
|
||||||
% \groupthm_provide_theorem:xVnn
|
% \groupthm_provide_theorem:xVnn
|
||||||
|
@ -2260,7 +2260,6 @@
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
%
|
|
||||||
% \subsection{Theorem families}
|
% \subsection{Theorem families}
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
|
@ -2269,10 +2268,10 @@
|
||||||
% As a backend, we use the following auxiliary function
|
% As a backend, we use the following auxiliary function
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
% \begin{macro}{\@@_declare_grouped_theorem_family_aux:nnnnnn}
|
% \begin{macro}{\@@_define_family:nnnnnn}
|
||||||
% \begin{syntax}
|
% \begin{syntax}
|
||||||
% \cs{@@_declare_grouped_theorem_family_aux:nnnnnn}\marg{family name}\marg{groups clist}
|
% \cs{@@_define_family:nnnnnn}\marg{family name}\marg{groups clist}
|
||||||
% \marg{name}\marg{name}\marg{thmtools clist}\marg{extra groups clist}\marg{generation type}
|
% \marg{name}\marg{thmtools clist}\marg{extra groups clist}
|
||||||
% \end{syntax}
|
% \end{syntax}
|
||||||
%
|
%
|
||||||
% This will generate a new grouped theorem for each union of a subset of \mymeta{groups clist}
|
% This will generate a new grouped theorem for each union of a subset of \mymeta{groups clist}
|
||||||
|
@ -2282,10 +2281,8 @@
|
||||||
% the \mymeta{family name} and the list of groups of this variant, that will be generated
|
% the \mymeta{family name} and the list of groups of this variant, that will be generated
|
||||||
% in a unique manner to later retrieve the generated theorems when parsing theorem families.
|
% in a unique manner to later retrieve the generated theorems when parsing theorem families.
|
||||||
%
|
%
|
||||||
% The \mymeta{generation type} can be either \texttt{new} or \texttt{provide},
|
|
||||||
% depending on which backend for grouped theorem generation to use
|
|
||||||
% \begin{macrocode}
|
% \begin{macrocode}
|
||||||
\cs_new:Npn \@@_declare_grouped_theorem_family_aux:nnnnnn #1 #2 #3 #4 #5 #6
|
\cs_new:Npn \@@_define_family:nnnnn #1 #2 #3 #4 #5
|
||||||
{
|
{
|
||||||
% \end{macrocode}
|
% \end{macrocode}
|
||||||
% Make a local copy of the \mymeta{groups clist} argument,
|
% Make a local copy of the \mymeta{groups clist} argument,
|
||||||
|
@ -2306,360 +2303,79 @@
|
||||||
% \begin{macrocode}
|
% \begin{macrocode}
|
||||||
\@@_sort_group_names:
|
\@@_sort_group_names:
|
||||||
% \end{macrocode}
|
% \end{macrocode}
|
||||||
% Now just declare the grouped theorem, passing the corresponding arguments and using
|
% Now just declare the grouped theorem, passing the corresponding arguments
|
||||||
% specified \texttt{\#6} as backend.
|
|
||||||
% \begin{macrocode}
|
% \begin{macrocode}
|
||||||
\use:c{groupthm_#6_grouped_theorem:xVnn}
|
\use:c{groupthm_new_theorem:xVnn}
|
||||||
{__#1__groups_\clist_use:Nn \l_@@_group_clist {_}}
|
{__#1__groups_\clist_use:Nn \l_@@_group_clist {_}}
|
||||||
\l_@@_group_clist
|
\l_@@_group_clist
|
||||||
{ #3 }
|
{ #3 }
|
||||||
{ #4 }
|
{ #4 }
|
||||||
}
|
}
|
||||||
|
% \end{macrocode}
|
||||||
|
% We save the set of variants we generated for later error checking:
|
||||||
|
% \begin{macrocode}
|
||||||
|
\clist_new:c { @@_family__#1__group_clist }
|
||||||
|
\clist_set_eq:cN {@@_family__#1__group_clist } \l_tmpa_clist
|
||||||
|
\clist_new:c { @@_family__#1__always_group_clist }
|
||||||
|
\clist_set:cn {@@_family__#1__always_group_clist } { #5 }
|
||||||
}
|
}
|
||||||
% \end{macrocode}
|
% \end{macrocode}
|
||||||
% \end{macro}
|
% \end{macro}
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
% \begin{macro}{\groupthm_new_grouped_theorem_family:nnnn,\groupthm_new_grouped_theorem_family:nVVV}
|
% \begin{macro}{\groupthm_new_family:nnnnn,\groupthm_new_family:nVVVV}
|
||||||
% \begin{syntax}
|
% \begin{syntax}
|
||||||
% \cs{groupthm_new_grouped_theorem_family:nnnn}\marg{family name}
|
% \cs{groupthm_new_theorem_family:nnnnn}\marg{theorem family}
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
% \marg{groups_1}\marg{name}\marg{thmtools clist}\marg{groups_2}
|
||||||
% \end{syntax}
|
% \end{syntax}
|
||||||
%
|
%
|
||||||
% Just pass the arguments to the auxiliary function, with no additional groups
|
|
||||||
% and the \texttt{new} backend.
|
|
||||||
%
|
%
|
||||||
% \begin{macrocode}
|
% \begin{macrocode}
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family:nnnn #1 #2 #3 #4
|
\@@_define_multiple:nnnNNnn
|
||||||
{
|
{ new, provide }
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
{ theorem ~ family }
|
||||||
{ #1 } { #2 } { #3 } { #4 } { } { new }
|
{ @@_family__##1__group_clist }
|
||||||
}
|
\@@_error:
|
||||||
\cs_generate_variant:Nn \groupthm_new_grouped_theorem_family:nnnn { n V V V }
|
\@@_define_family:nnnnn
|
||||||
|
{ groupthm_#1_family:nnnnn }
|
||||||
|
{ { ##1 } { ##2 } { ##3 } { ##4 } { ##5 }}
|
||||||
|
\cs_generate_variant:Nn \groupthm_new_family:nnnnn { n V V V V }
|
||||||
|
\cs_generate_variant:Nn \groupthm_provide_family:nnnnn { n V V V V }
|
||||||
% \end{macrocode}
|
% \end{macrocode}
|
||||||
% \end{macro}
|
% \end{macro}
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
%
|
% \begin{macro}{\groupthm_new_family:nnn}
|
||||||
% \begin{macro}{\groupthm_provide_grouped_theorem_family:nnnn,\groupthm_provide_grouped_theorem_family:nVVV}
|
|
||||||
% \begin{syntax}
|
% \begin{syntax}
|
||||||
% \cs{groupthm_provide_grouped_theorem_family:nnnn}\marg{family name}
|
% \cs{groupthm_new_family:nnn}\marg{key=value list}\marg{theorem family}\marg{bool}
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
% \end{syntax}
|
||||||
%
|
%
|
||||||
% Just pass the arguments to the auxiliary function, with no additional groups
|
% The third argument indicates whether the generated theorem(s) will all be added to the
|
||||||
% and the \texttt{provide} backend.
|
% \texttt{unnumbered} group.
|
||||||
%
|
%
|
||||||
% \begin{macrocode}
|
% \begin{macrocode}
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family:nnnn #1 #2 #3 #4
|
\@@_wrap_multiple:nnn
|
||||||
|
{ new, provide }
|
||||||
|
{ groupthm_#1_family:nnn }
|
||||||
{
|
{
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
\@@_set_normalized_keys:nnn { ##1 } { theorem ~ family } { ##2 }
|
||||||
{ #1 } { #2 } { #3 } { #4 } { } { provide }
|
\bool_if:nTF { ##3}
|
||||||
|
{
|
||||||
|
\clist_set:Nn \l_tmpa_clist { unnumbered }
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \groupthm_provide_grouped_theorem_family:nnnn { n V V V }
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% The starred variants that add the \texttt{unnumbered} group are straightforward:
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_grouped_theorem_family_star:nnnn,\groupthm_new_grouped_theorem_family_star:nVVV}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_grouped_theorem_family_star:nnnn}\marg{family name}
|
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just pass the arguments to the auxiliary function, with the additional
|
|
||||||
% \texttt{unnumbered group} and the \texttt{new} backend.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
{
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
\clist_clear:N \l_tmpa_clist
|
||||||
{ #1 } { #2 } { #3 } { #4 } { unnumbered } { new }
|
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \groupthm_new_grouped_theorem_family_star:nnnn { n V V V }
|
\bool_if:NT \l_@@_starred_version_bool
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_grouped_theorem_family_star:nnnn,\groupthm_provide_grouped_theorem_family_star:nVVV}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_grouped_theorem_family_star:nnnn}\marg{family name}
|
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just pass the arguments to the auxiliary function, with the additional
|
|
||||||
% \texttt{unnumbered group} and the \texttt{provide} backend.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
{
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
\clist_put_left:Nn \l_@@_group_clist { starred }
|
||||||
{ #1 } { #2 } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \groupthm_provide_grouped_theorem_family_star:nnnn { n V V V }
|
\use:c { groupthm_#1_family:nVVVV }
|
||||||
% \end{macrocode}
|
{ ##2 }
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% Now define the variants that also generate the starred and unstarred family versions.
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_theorem_family:nnnn,\groupthm_new_theorem_family:nVVV}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_theorem_family:nnnn}\marg{family name}
|
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { } { new }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_new_theorem_family:nnnn { n V V V }
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_theorem_family:nnnn,\groupthm_provide_theorem_family:nVVV}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_theorem_family:nnnn}\marg{family name}
|
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_provide_theorem_family:nnnn { n V V V }
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_theorem_family_star:nnnn,\groupthm_new_theorem_family_star:nVVV}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_theorem_family_star:nnnn}\marg{family name}
|
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { unnumbered } { new }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_new_theorem_family_star:nnnn { n V V V }
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_theorem_family_star:nnnn,\groupthm_provide_theorem_family_star:nVVV}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_theorem_family_star:nnnn}\marg{family name}
|
|
||||||
% \marg{groups}\marg{name}\marg{thmtools clist}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\@@_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_provide_theorem_family_star:nnnn { n V V V }
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% We now make the key variants available of these, all of the work in the same way
|
|
||||||
% as we just have to set the normalized keys and pass to our non-key-value versions.
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_grouped_theorem_family_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_grouped_theorem_family_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_new_grouped_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_grouped_theorem_family_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_grouped_theorem_family_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } {grouped ~ theorem} { #2 }
|
|
||||||
\groupthm_provide_grouped_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_grouped_theorem_family_star_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_grouped_theorem_family_star_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem }{ #2 }
|
|
||||||
\groupthm_new_grouped_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_grouped_theorem_family_star_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_grouped_theorem_family_star_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem }{ #2 }
|
|
||||||
\groupthm_provide_grouped_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_theorem_family_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_theorem_family_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_new_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_theorem_family_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_theorem_family_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_provide_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_new_theorem_family_star_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_new_theorem_family_star_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_new_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
|
||||||
\l_@@_name_tl
|
|
||||||
\l_@@_thmtools_clist
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\groupthm_provide_theorem_family_star_from_keys:nn}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{groupthm_provide_theorem_family_star_from_keys:nn}\marg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
% Just retrieve the normalized keys and pass on arguments.
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\@@_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_provide_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l_@@_group_clist
|
\l_@@_group_clist
|
||||||
\l_@@_name_tl
|
\l_@@_name_tl
|
||||||
\l_@@_thmtools_clist
|
\l_@@_thmtools_clist
|
||||||
|
\l_tmpa_clist
|
||||||
}
|
}
|
||||||
% \end{macrocode}
|
% \end{macrocode}
|
||||||
% \end{macro}
|
% \end{macro}
|
||||||
|
@ -2669,96 +2385,31 @@
|
||||||
% Finally, we can provide document commands that make these available.
|
% Finally, we can provide document commands that make these available.
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
% \begin{macro}{\NewGroupedTheoremFamily,\NewGroupedTheoremFamily*}
|
% \begin{macro}
|
||||||
|
% {
|
||||||
|
% \NewGroupedTheoremFamily,\NewGroupedTheoremFamily*,
|
||||||
|
% \ProvideGroupedTheoremFamily, \ProvideGroupedTheoremFamily*
|
||||||
|
% }
|
||||||
% \begin{syntax}
|
% \begin{syntax}
|
||||||
% \cs{NewGroupedTheoremFamily}\oarg{keys}\marg{family name}
|
% \cs{NewGroupedTheoremFamily}\oarg{keys}\marg{family name}
|
||||||
% \end{syntax}
|
% \end{syntax}
|
||||||
%
|
%
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
% \begin{macrocode}
|
||||||
\NewDocumentCommand{\NewGroupedTheoremFamily}{s O{} m}
|
\@@_wrap_multiple_document:nnnn
|
||||||
|
{ new, provide }
|
||||||
|
{ \Declarator GroupedTheoremFamily }
|
||||||
|
{ s O{} m }
|
||||||
{
|
{
|
||||||
\IfBooleanTF { #1 }
|
\use:c { groupthm_#1_family:nnn }
|
||||||
{
|
{ ##2 }
|
||||||
\groupthm_new_grouped_theorem_family_star_from_keys:nn { #2 } { #3 }
|
{ ##3 }
|
||||||
}
|
{ ##1 }
|
||||||
{
|
|
||||||
\groupthm_new_grouped_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
% \end{macrocode}
|
% \end{macrocode}
|
||||||
% \end{macro}
|
% \end{macro}
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
% \begin{macro}{\ProvideGroupedTheoremFamily,\ProvideGroupedTheoremFamily*}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{ProvideGroupedTheoremFamily}\oarg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\NewDocumentCommand{\ProvideGroupedTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_provide_grouped_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_provide_grouped_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\NewTheoremFamily,\NewTheoremFamily*}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{NewTheoremFamily}\oarg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\NewDocumentCommand{\NewTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_new_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_new_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macro}{\ProvideTheoremFamily,\ProvideTheoremFamily*}
|
|
||||||
% \begin{syntax}
|
|
||||||
% \cs{ProvideTheoremFamily}\oarg{keys}\marg{family name}
|
|
||||||
% \end{syntax}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \begin{macrocode}
|
|
||||||
\NewDocumentCommand{\ProvideTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_provide_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_provide_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
% \end{macrocode}
|
|
||||||
% \end{macro}
|
|
||||||
%
|
|
||||||
%
|
|
||||||
% \subsection{Theorem family options}
|
% \subsection{Theorem family options}
|
||||||
%
|
%
|
||||||
%
|
%
|
||||||
|
|
|
@ -559,7 +559,7 @@
|
||||||
{ ##3 }
|
{ ##3 }
|
||||||
{ ##1 }
|
{ ##1 }
|
||||||
}
|
}
|
||||||
\cs_new:Npn \__groupthm_declare_grouped_theorem_family_aux:nnnnnn #1 #2 #3 #4 #5 #6
|
\cs_new:Npn \__groupthm_define_family:nnnnn #1 #2 #3 #4 #5
|
||||||
{
|
{
|
||||||
\clist_set:Nn \l_tmpa_clist { #2 }
|
\clist_set:Nn \l_tmpa_clist { #2 }
|
||||||
\powerset_clist_foreach:Nn \l_tmpa_clist
|
\powerset_clist_foreach:Nn \l_tmpa_clist
|
||||||
|
@ -567,172 +567,59 @@
|
||||||
\clist_set_eq:NN \l__groupthm_group_clist \l_tmpa_clist
|
\clist_set_eq:NN \l__groupthm_group_clist \l_tmpa_clist
|
||||||
\clist_put_right:Nn \l__groupthm_group_clist { #5 }
|
\clist_put_right:Nn \l__groupthm_group_clist { #5 }
|
||||||
\__groupthm_sort_group_names:
|
\__groupthm_sort_group_names:
|
||||||
\use:c{groupthm_#6_grouped_theorem:xVnn}
|
\use:c{groupthm_new_theorem:xVnn}
|
||||||
{__#1__groups_\clist_use:Nn \l__groupthm_group_clist {_}}
|
{__#1__groups_\clist_use:Nn \l__groupthm_group_clist {_}}
|
||||||
\l__groupthm_group_clist
|
\l__groupthm_group_clist
|
||||||
{ #3 }
|
{ #3 }
|
||||||
{ #4 }
|
{ #4 }
|
||||||
}
|
}
|
||||||
|
\clist_new:c { __groupthm_family__#1__group_clist }
|
||||||
|
\clist_set_eq:cN {__groupthm_family__#1__group_clist } \l_tmpa_clist
|
||||||
|
\clist_new:c { __groupthm_family__#1__always_group_clist }
|
||||||
|
\clist_set:cn {__groupthm_family__#1__always_group_clist } { #5 }
|
||||||
}
|
}
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family:nnnn #1 #2 #3 #4
|
\__groupthm_define_multiple:nnnNNnn
|
||||||
|
{ new, provide }
|
||||||
|
{ theorem ~ family }
|
||||||
|
{ __groupthm_family__##1__group_clist }
|
||||||
|
\__groupthm_error:
|
||||||
|
\__groupthm_define_family:nnnnn
|
||||||
|
{ groupthm_#1_family:nnnnn }
|
||||||
|
{ { ##1 } { ##2 } { ##3 } { ##4 } { ##5 }}
|
||||||
|
\cs_generate_variant:Nn \groupthm_new_family:nnnnn { n V V V V }
|
||||||
|
\cs_generate_variant:Nn \groupthm_provide_family:nnnnn { n V V V V }
|
||||||
|
\__groupthm_wrap_multiple:nnn
|
||||||
|
{ new, provide }
|
||||||
|
{ groupthm_#1_family:nnn }
|
||||||
{
|
{
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
\__groupthm_set_normalized_keys:nnn { ##1 } { theorem ~ family } { ##2 }
|
||||||
{ #1 } { #2 } { #3 } { #4 } { } { new }
|
\bool_if:nTF { ##3}
|
||||||
|
{
|
||||||
|
\clist_set:Nn \l_tmpa_clist { unnumbered }
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \groupthm_new_grouped_theorem_family:nnnn { n V V V }
|
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family:nnnn #1 #2 #3 #4
|
|
||||||
{
|
{
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
\clist_clear:N \l_tmpa_clist
|
||||||
{ #1 } { #2 } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \groupthm_provide_grouped_theorem_family:nnnn { n V V V }
|
\bool_if:NT \l__groupthm_starred_version_bool
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
{
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
\clist_put_left:Nn \l__groupthm_group_clist { starred }
|
||||||
{ #1 } { #2 } { #3 } { #4 } { unnumbered } { new }
|
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \groupthm_new_grouped_theorem_family_star:nnnn { n V V V }
|
\use:c { groupthm_#1_family:nVVVV }
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family_star:nnnn #1 #2 #3 #4
|
{ ##2 }
|
||||||
{
|
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2 } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_provide_grouped_theorem_family_star:nnnn { n V V V }
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { } { new }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_new_theorem_family:nnnn { n V V V }
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_provide_theorem_family:nnnn { n V V V }
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { unnumbered } { new }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_new_theorem_family_star:nnnn { n V V V }
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family_star:nnnn #1 #2 #3 #4
|
|
||||||
{
|
|
||||||
\__groupthm_declare_grouped_theorem_family_aux:nnnnnn
|
|
||||||
{ #1 } { #2, starred } { #3 } { #4 } { } { provide }
|
|
||||||
}
|
|
||||||
\cs_generate_variant:Nn \groupthm_provide_theorem_family_star:nnnn { n V V V }
|
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_new_grouped_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
\l__groupthm_group_clist
|
||||||
\l__groupthm_name_tl
|
\l__groupthm_name_tl
|
||||||
\l__groupthm_thmtools_clist
|
\l__groupthm_thmtools_clist
|
||||||
|
\l_tmpa_clist
|
||||||
}
|
}
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family_from_keys:nn #1 #2
|
\__groupthm_wrap_multiple_document:nnnn
|
||||||
|
{ new, provide }
|
||||||
|
{ \Declarator GroupedTheoremFamily }
|
||||||
|
{ s O{} m }
|
||||||
{
|
{
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } {grouped ~ theorem} { #2 }
|
\use:c { groupthm_#1_family:nnn }
|
||||||
\groupthm_provide_grouped_theorem_family:nVVV
|
{ ##2 }
|
||||||
{ #2 }
|
{ ##3 }
|
||||||
\l__groupthm_group_clist
|
{ ##1 }
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\cs_new:Npn \groupthm_new_grouped_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem }{ #2 }
|
|
||||||
\groupthm_new_grouped_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\cs_new:Npn \groupthm_provide_grouped_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem }{ #2 }
|
|
||||||
\groupthm_provide_grouped_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_new_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_provide_theorem_family:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\cs_new:Npn \groupthm_new_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_new_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\cs_new:Npn \groupthm_provide_theorem_family_star_from_keys:nn #1 #2
|
|
||||||
{
|
|
||||||
\__groupthm_set_normalized_keys:nnn { #1 } { grouped ~ theorem } { #2 }
|
|
||||||
\groupthm_provide_theorem_family_star:nVVV
|
|
||||||
{ #2 }
|
|
||||||
\l__groupthm_group_clist
|
|
||||||
\l__groupthm_name_tl
|
|
||||||
\l__groupthm_thmtools_clist
|
|
||||||
}
|
|
||||||
\NewDocumentCommand{\NewGroupedTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_new_grouped_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_new_grouped_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\NewDocumentCommand{\ProvideGroupedTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_provide_grouped_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_provide_grouped_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\NewDocumentCommand{\NewTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_new_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_new_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
\NewDocumentCommand{\ProvideTheoremFamily}{s O{} m}
|
|
||||||
{
|
|
||||||
\IfBooleanTF { #1 }
|
|
||||||
{
|
|
||||||
\groupthm_provide_theorem_family_star_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
{
|
|
||||||
\groupthm_provide_theorem_family_from_keys:nn { #2 } { #3 }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
\cs_new:Npn \groupthm_add_theorem_to_group:n #1
|
\cs_new:Npn \groupthm_add_theorem_to_group:n #1
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{orange}{\leavevmode {\color {orange}o}}\ insert code example output}{3}{section*.3}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{orange}{\leavevmode {\color {orange}o}}\ insert code example output}{4}{section*.3}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{orange}{\leavevmode {\color {orange}o}}\ code}{4}{section*.4}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{orange}{\leavevmode {\color {orange}o}}\ code}{5}{section*.4}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{6}{section*.5}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{7}{section*.5}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{6}{section*.6}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{7}{section*.6}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{7}{section*.7}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{8}{section*.7}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{8}{section*.8}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{9}{section*.8}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{9}{section*.9}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{10}{section*.9}%
|
||||||
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{18}{section*.10}%
|
\contentsline {todo}{\color@fb@x {}{black}{}{red!40}{\leavevmode {\color {red!40}o}}\ Add reference.}{18}{section*.10}%
|
||||||
|
|
Loading…
Reference in a new issue