add grouped theorem user interface

This commit is contained in:
Maximilian Keßler 2022-01-18 02:32:15 +01:00
parent 396005cc44
commit 808b8c457f
3 changed files with 95 additions and 350 deletions

View file

@ -794,10 +794,8 @@
% \cs{groupthm_new_theorem_star_from_keys:nn}\ma{keys}\ma{environment name} % \cs{groupthm_new_theorem_star_from_keys:nn}\ma{keys}\ma{environment name}
% \end{syntax} % \end{syntax}
% %
%
% \LaTeX3 version of \cs{NewTheorem*}, \cs{ProvideTheorem*} % \LaTeX3 version of \cs{NewTheorem*}, \cs{ProvideTheorem*}
% %
%
% \end{function} % \end{function}
% %
% %
@ -1644,40 +1642,40 @@
% Its value is restored at the end of the iteration. % Its value is restored at the end of the iteration.
% %
% \begin{macrocode} % \begin{macrocode}
\clist_new:N \l_powerset_copied_clist \clist_new:N \l__powerset_copied_clist
\seq_new:N \l_powerset_saved_seq \seq_new:N \l__powerset_saved_seq
\cs_generate_variant:Nn \clist_remove_all:Nn { N V } \cs_generate_variant:Nn \clist_remove_all:Nn { N V }
\cs_new:Npn \__powerset_clist_foreach_aux:Nn #1 #2 \cs_new:Npn \__powerset_clist_foreach_aux:Nn #1 #2
{ {
\clist_if_empty:NTF \l_powerset_copied_clist \clist_if_empty:NTF \l__powerset_copied_clist
{ {
#2 #2
} }
{ {
\clist_get:NN \l_powerset_copied_clist \l_tmpa_tl \clist_get:NN \l__powerset_copied_clist \l_tmpa_tl
\seq_push:NV \l_powerset_saved_seq \l_tmpa_tl \seq_push:NV \l__powerset_saved_seq \l_tmpa_tl
\clist_pop:NN \l_powerset_copied_clist { \l_tmpa_tl } \clist_pop:NN \l__powerset_copied_clist { \l_tmpa_tl }
\__powerset_clist_foreach_aux:Nn #1 {#2} \__powerset_clist_foreach_aux:Nn #1 {#2}
\seq_get:NN \l_powerset_saved_seq \l_tmpa_tl \seq_get:NN \l__powerset_saved_seq \l_tmpa_tl
\clist_put_left:NV #1 \l_tmpa_tl \clist_put_left:NV #1 \l_tmpa_tl
\__powerset_clist_foreach_aux:Nn #1 {#2} \__powerset_clist_foreach_aux:Nn #1 {#2}
\seq_get:NN \l_powerset_saved_seq \l_tmpa_tl \seq_get:NN \l__powerset_saved_seq \l_tmpa_tl
\clist_remove_all:NV #1 \l_tmpa_tl \clist_remove_all:NV #1 \l_tmpa_tl
\clist_push:NV \l_powerset_copied_clist \l_tmpa_tl \clist_push:NV \l__powerset_copied_clist \l_tmpa_tl
\seq_pop:NN \l_powerset_saved_seq \l_tmpa_tl \seq_pop:NN \l__powerset_saved_seq \l_tmpa_tl
} }
} }
\cs_new:Npn \powerset_clist_foreach:Nn #1 #2 \cs_new:Npn \powerset_clist_foreach:Nn #1 #2
{ {
\clist_set_eq:NN \l_powerset_copied_clist #1 \clist_set_eq:NN \l__powerset_copied_clist #1
\clist_clear:N #1 \clist_clear:N #1
\clist_remove_duplicates:N \l_powerset_copied_clist \clist_remove_duplicates:N \l__powerset_copied_clist
\__powerset_clist_foreach_aux:Nn #1 {#2} \__powerset_clist_foreach_aux:Nn #1 {#2}
\clist_set_eq:NN #1 \l_powerset_copied_clist \clist_set_eq:NN #1 \l__powerset_copied_clist
} }
% \end{macrocode} % \end{macrocode}
% \end{macro} % \end{macro}
@ -1762,7 +1760,7 @@
% \end{macrocode} % \end{macrocode}
% Now, retrieve the group properties, by writing these into the hooks % Now, retrieve the group properties, by writing these into the hooks
% \begin{macrocode} % \begin{macrocode}
\clist_map_function:nN { #2 } \group_use:n \clist_map_function:nN { #2 } \@@_use_theorem_group:n
% \end{macrocode} % \end{macrocode}
% Execute the hooks, so that local variables will get modified according to the groups % Execute the hooks, so that local variables will get modified according to the groups
% and in the order that were specified for the hooks. % and in the order that were specified for the hooks.
@ -2104,16 +2102,91 @@
} }
% \end{macrocode} % \end{macrocode}
% \end{macro} % \end{macro}
%
%
%
% Now, we can wrap these into document commands
%
%
% \begin{macro}{\NewGroupedTheorem}
% \begin{syntax}
% \cs{NewGroupedTheorem}[\meta{keys}]\ma{theorem name}
% \end{syntax}
%
% \begin{macrocode}
\NewDocumentCommand{\NewGroupedTheorem}{s O{} m}
{
\IfBooleanTF{#1}
{
\groupthm_new_grouped_theorem_star_from_keys:nn { #2 } { #3 }
}
{
\groupthm_new_grouped_theorem_from_keys:nn { #2 } { #3 }
}
}
% \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ProvideGroupedTheorem}
% \begin{syntax}
% \cs{ProvideGroupedTheorem}[\meta{keys}]\ma{theorem name}
% \end{syntax}
%
% \begin{macrocode}
\ProvideDocumentCommand{\NewGroupedTheorem}{s O{} m}
{
\IfBooleanTF{#1}
{
\groupthm_provide_grouped_theorem_star_from_keys:nn { #2 } { #3 }
}
{
\groupthm_provide_grouped_theorem_from_keys:nn { #2 } { #3 }
}
}
% \end{macrocode}
% \end{macro}
% %
% %
% %
% \begin{macro}{\NewTheorem}
% \begin{syntax}
% \cs{NewTheorem}[\meta{keys}]\ma{theorem name}
% \end{syntax}
%
% \begin{macrocode}
\NewDocumentCommand{\NewTheorem}{s O{} m}
{
\IfBooleanTF{#1}
{
\groupthm_new_theorem_star_from_keys:nn { #2 } { #3 }
}
{
\groupthm_new_theorem_from_keys:nn { #2 } { #3 }
}
}
% \end{macrocode}
% \end{macro}
% %
% %
% % \begin{macro}{\ProvideTheorem}
% % \begin{syntax}
% % \cs{ProvideTheorem}[\meta{keys}]\ma{theorem name}
% % \end{syntax}
% %
% \begin{macrocode}
\ProvideDocumentCommand{\NewTheorem}{s O{} m}
{
\IfBooleanTF{#1}
{
\groupthm_provide_theorem_star_from_keys:nn { #2 } { #3 }
}
{
\groupthm_provide_theorem_from_keys:nn { #2 } { #3 }
}
}
% \end{macrocode}
% \end{macro}
% %
% %
% %
@ -2125,3 +2198,4 @@
% \end{implementation} % \end{implementation}
% \end{documentation} % \end{documentation}
% \newpage % \newpage
% \PrintIndex

View file

@ -1,329 +0,0 @@
%%
%% This is file `groupthm.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% groupthm.dtx (with options: `package')
%%
%% IMPORTANT NOTICE:
%%
%% For the copyright see the source file.
%%
%% Any modified versions of this file must be renamed
%% with new filenames distinct from groupthm.sty.
%%
%% For distribution of the original source see the terms
%% for copying and modification in the file groupthm.dtx.
%%
%% This generated file may be distributed as long as the
%% original source files, as listed above, are part of the
%% same distribution. (The sources need not necessarily be
%% in the same archive or directory.)
%% File: groupthm.dtx
\ProvidesExplPackage{groupthm}{2022/01/17}{0.0.1}{Grouped theorems.}
\RequirePackage{amsthm}
\RequirePackage{thmtools}
\RequirePackage{mkessler-powerset}
\cs_new:Npn \__groupthm_declare_theorem_group:nn #1 #2
{
\declaretheorem [ #2 ] { #1 }
}
\cs_generate_variant:Nn \__groupthm_declare_theorem_group:nn { n V }
\cs_new:Npn \__groupthm_hook_gset_rule_foreach:nNnn #1 #2 #3 #4
{
\cs_set:Npn \__groupthm_map_aux:n ##1
{
\hook_gset_rule:nnnn { #1 } { ##1 } { #3 } { #4 }
}
\clist_map_function:NN #2 \__groupthm_map_aux:n
}
\msg_new:nnn { groupthm } { unknown ~ group }
{
Unknown ~ group ~ '#1' ~ supplied ~ \msg_line_context:
}
\msg_new:nnn { groupthm } { unknown ~ key }
{
Unknown ~ key ~ '#1' ~ supplied ~ \msg_line_context:
}
\msg_new:nnn { groupthm } { wrong ~ definition }
{
Bad ~ definition ~ of ~ #1 ~ '#2' ~ \msg_line_context:, ~ #1 ~ is ~ #3 ~ defined.
}
\hook_new:n { __groupthm/prename }
\hook_new:n { __groupthm/postname }
\hook_new:n { __groupthm/mapname }
\hook_new:n { __groupthm/thmtools }
\hook_new:n { __groupthm/groupsort }
\cs_generate_variant:Nn \hook_gset_rule:nnnn { n n V n }
\tl_new:N \l__groupthm_key_prename_tl
\tl_new:N \l__groupthm_key_name_tl
\tl_new:N \l__groupthm_key_postname_tl
\clist_new:N \l__groupthm_key_group_clist
\clist_new:N \l__groupthm_key_mapname_clist
\clist_new:N \l__groupthm_key_thmtools_clist
\tl_new:N \l__groupthm_prename_tl
\tl_new:N \l__groupthm_name_tl
\tl_new:N \l__groupthm_postname_tl
\clist_new:N \l__groupthm_mapname_clist
\clist_new:N \l__groupthm_thmtools_clist
\clist_new:N \l__groupthm_group_clist
\clist_new:N \g__groupthm_defined_theorem_groups_clist
\keys_define:nn { groupthm }
{
prename .tl_set:N = \l__groupthm_key_prename_tl,
prename .default:n = \c_empty_tl,
prename .groups:n = { theoremgroup },
name .tl_set:N = \l__groupthm_key_name_tl,
name .default:n = \c_novalue_tl,
name .groups:n = { groupedtheorem, theoremvariants },
postname .tl_set:N = \l__groupthm_key_postname_tl,
postname .default:n = \c_empty_tl,
postname .groups:n = { theoremgroup },
group .clist_set:N = \l__groupthm_key_group_clist,
group .default:n = {},
group .groups:n = { groupedtheorem, theoremvariants },
mapname .clist_set:N = \l__groupthm_mapname_clist,
mapname .default:n = {},
mapname .groups:n = { theoremgroup },
thmtools .clist_set:N = \l__groupthm_key_thmtools_clist,
thmtools .default:n = {},
thmtools .groups:n =
{ theoremgroup, groupedtheorem, theoremvariants },
unknown .code:n =
\msg_error:nnn { groupthm } { unknown ~ group } { \l_keys_key_str }
}
\cs_new:Npn \__groupthm_set_normalized_keys:nnn #1 #2 #3
{
\keys_set:nn { groupthm } { prename, name, postname, group, mapname, thmtools }
\keys_set_groups:nnn { groupthm } { #2 } { #1 }
\tl_if_eq:NnTF \l__groupthm_key_name_tl { \c_novalue_tl }
{
\tl_set:Nx \l__groupthm_name_tl
{
\text_titlecase_first:n {#3}
}
}
{
\tl_set_eq:NN \l__groupthm_name_tl \l__groupthm_key_name_tl
}
\tl_set_eq:NN \l__groupthm_prename_tl \l__groupthm_key_prename_tl
\tl_set_eq:NN \l__groupthm_postname_tl \l__groupthm_key_postname_tl
\clist_set_eq:NN \l__groupthm_group_clist \l__groupthm_key_group_clist
\clist_set_eq:NN \l__groupthm_mapname_clist \l__groupthm_key_mapname_clist
\clist_set_eq:NN \l__groupthm_thmtools_clist \l__groupthm_key_thmtools_clist
}
\cs_new:Npn \__groupthm_add_to_theorem_group_ordering:n #1
{
\__groupthm_hook_gset_rule_foreach:nNnn
{ __groupthm/groupsort }
\g__groupthm_defined_theorem_groups_clist
{ before }
{ #1 }
}
\cs_new:Npn \__groupthm_remove_from_theorem_group_ordering:n #1
{
\__groupthm_hook_gset_rule_foreach:nNnn
{ __groupthm/groupsort }
\g__groupthm_defined_theorem_groups_clist
{ unrelated }
{ #1 }
}
\cs_new:Npn \__groupthm_add_to_sort_hook:n #1
{
\hook_gput_code:nnn { __groupthm/groupsort }
{ #1 }
{
\clist_put_left:Nn \l__groupthm_group_clist { #1 }
}
}
\cs_new:Npn \__groupthm_sort_theorem_group_names:
{
\hook_gremove_code:nn { __groupthm/groupsort }{*}
\clist_map_function:NN \l__groupthm_group_clist \__add_to_sort_hook:n
\clist_clear:N \l__groupthm_group_clist
\hook_use:n { __groupthm/groupsort }
}
\cs_new:Npn \__groupthm_declare_theorem_group_aux:nnnnn #1#2#3#4#5
{
\cs_new:cpn { __groupthm_use_group_#1: }
{
\hook_gput_code:nnn { __groupthm/prename } { #1 }
{
\tl_put_left:Nx \l__groupthm_prename_tl { #2 }
}
\hook_gput_code:nnn { __groupthm/postname } { #1 }
{
\tl_put_right:Nx \l__groupthm_postname_tl { #3 }
}
\hook_gput_code:nnn { __groupthm/mapname } { #1 }
{
\clist_put_right:Nn \l__groupthm_mapname_clist { #4 }
}
\hook_gput_code:nnn { __groupthm/thmtools } { #1 }
{
\clist_put_right:Nn \l__groupthm_thmtools_clist { #5 }
}
}
\__groupthm_add_to_theorem_group_ordering:n { #1 }
\clist_gput_left:Nn \g__groupthm_defined_theorem_groups_clist { #1 }
}
\cs_new:Npn \__groupthm_undeclare_theorem_group_aux:n #1
{
\cs_undefine:c { __groupthm_use_group_#1: }
\hook_gremove_code:nn { __groupthm/prename } { #1 }
\hook_gremove_code:nn { __groupthm/postname } { #1 }
\hook_gremove_code:nn { __groupthm/mapname } { #1 }
\hook_gremove_code:nn { __groupthm/thmtools } { #1 }
\clist_gremove_all:Nn \g__groupthm_defined_theorem_groups_clist { #1 }
\__groupthm_hook_gset_rule_foreach:nNnn
{ ?? }
\g__groupthm_defined_theorem_groups_clist
{ unrelated }
{ #1 }
\__groupthm_hook_gset_rule_foreach:nNnn
{ __groupthm/prename }
\g__groupthm_defined_theorem_groups_clist
{ unrelated }
{ #1 }
\__groupthm_hook_gset_rule_foreach:nNnn
{ __groupthm/postname }
\g__groupthm_defined_theorem_groups_clist
{ unrelated }
{ #1 }
\__groupthm_hook_gset_rule_foreach:nNnn
{ __groupthm/mapname }
\g__groupthm_defined_theorem_groups_clist
{ unrelated }
{ #1 }
\__groupthm_hook_gset_rule_foreach:nNnn
{ __groupthm/thmtools }
\g__groupthm_defined_theorem_groups_clist
{ unrelated }
{ #1 }
\__groupthm_remove_from_theorem_group_ordering:n { #1 }
}
\cs_new:Npn \groupthm_new_theorem_group:nnnnn #1 #2 #3 #4 #5
{
\cs_if_exist:cTF { __groupthm_use_group_#1: }
{
\msg_error:nnnnn { groupthm } { wrong ~ definition }
{ theorem ~ group } { #1 } { already }
}
{
\__groupthm_declare_theorem_group_aux:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
}
}
\cs_generate_variant:Nn \groupthm_new_theorem_group:nnnnn { n V V V V }
\cs_new:Npn \groupthm_renew_theorem_group:nnnnn #1 #2 #3 #4 #5
{
\cs_if_exist:cTF { __groupthm_use_group_#1: }
{
\__groupthm_undeclare_theorem_group_aux:n { #1 }
\__groupthm_declare_theorem_group_aux:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
}
{
\msg_error:nnnnn { groupthm } { wrong ~ definition }
{ theorem ~ group } { #1 } { not }
}
}
\cs_generate_variant:Nn \groupthm_renew_theorem_group:nnnnn { n V V V V }
\cs_new:Npn \groupthm_provide_theorem_group:nnnnn #1 #2 #3 #4 #5
{
\cs_if_exist:cF { __groupthm_use_group_#1: }
{
\__groupthm_declare_theorem_group_aux:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
}
}
\cs_generate_variant:Nn \groupthm_provide_theorem_group:nnnnn { n V V V V }
\cs_new:Npn \groupthm_declare_theorem_group:nnnnn #1 #2 #3 #4 #5
{
\cs_if_exist:cT { __groupthm_use_group_#1: }
{
\__groupthm_undeclare_theorem_group_aux:n { #1 }
}
\__groupthm_declare_theorem_group_aux:nnnnn { #1 } { #2 } { #3 } { #4 } { #5 }
}
\cs_generate_variant:Nn \groupthm_declare_theorem_group:nnnnn { n V V V V }
\cs_new:Npn \groupthm_new_theorem_group_by_keys:nn #1#2
{
\__groupthm_set_normalized_keys:nnn { #1 } { theoremgroup } { #2 }
\groupthm_new_theorem_group:nVVVV { #2 }
\l__groupthm_prename_tl
\l__groupthm_postname_tl
\l__groupthm_mapname_clist
\l__groupthm_thmtools_clist
}
\cs_new:Npn \groupthm_renew_theorem_group_by_keys:nn #1#2
{
\__groupthm_set_normalized_keys:nnn { #1 } { theoremgroup } { #2 }
\groupthm_renew_theorem_group:nVVVV { #2 }
\l__groupthm_prename_tl
\l__groupthm_postname_tl
\l__groupthm_mapname_clist
\l__groupthm_thmtools_clist
}
\cs_new:Npn \groupthm_provide_theorem_group_by_keys:nn #1#2
{
\__groupthm_set_normalized_keys:nnn { #1 } { theoremgroup } { #2 }
\groupthm_provide_theorem_group:nVVVV { #2 }
\l__groupthm_prename_tl
\l__groupthm_postname_tl
\l__groupthm_mapname_clist
\l__groupthm_thmtools_clist
}
\cs_new:Npn \groupthm_declare_theorem_group_by_keys:nn #1#2
{
\__groupthm_set_normalized_keys:nnn { #1 } { theoremgroup } { #2 }
\groupthm_declare_theorem_group:nVVVV { #2 }
\l__groupthm_prename_tl
\l__groupthm_postname_tl
\l__groupthm_mapname_clist
\l__groupthm_thmtools_clist
}
\NewDocumentCommand{\NewTheoremGroup}{ O{} m }
{
\groupthm_new_theorem_group_by_keys:nn { #1 } { #2 }
}
\NewDocumentCommand{\RenewTheoremGroup}{ O{} m }
{
\groupthm_renew_theorem_group_by_keys:nn { #1 } { #2 }
}
\NewDocumentCommand{\ProvideTheoremGroup}{ O{} m }
{
\groupthm_provide_theorem_group_by_keys:nn { #1 } { #2 }
}
\NewDocumentCommand{\DeclareTheoremGroup}{ O{} m }
{
\groupthm_declare_theorem_group_by_keys:nn { #1 } { #2 }
}
\cs_new:Npn \groupthm_declare_theorem_group_rule:nnnn #1 #2 #3 #4
{
\str_set:Nx \l_tmpa_str { \tl_trim_spaces:n { #3 } }
\str_if_eq:VnT \l_tmpa_str { higher }
{
\str_set:Nn \l_tmpa_tl { after }
}
\str_if_eq:VnT \l_tmpa_str { lower }
{
\str_set:Nn \l_tmpa_tl { before }
}
\str_if_eq:nnTF { #1 } { ?? }
{
\hook_gset_rule:nnVn {??} {#2} \l_tmpa_tl {#4}
}
{
\hook_gset_rule:nnVn { __groupthm / #1 } {#2} \l_tmpa_tl {#4}
}
}
\NewDocumentCommand { \DeclareTheoremGroupRule } { O{??} m m m }
{
\groupthm_declare_theorem_group_rule:nnnn {#1} {#2} {#3} {#4}
}
\endinput
%%
%% End of file `groupthm.sty'.