From 3630c47b593b407f8e3fe33754f6998d36c2aa54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Ke=C3=9Fler?= Date: Sun, 16 Jan 2022 21:38:19 +0100 Subject: [PATCH] theorem variants generation add iterating over powerset of clist function add sorting hack for theoremgroups add declare_theorem_variants macro --- src/environments/groupthm.pysty3 | 163 +++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/src/environments/groupthm.pysty3 b/src/environments/groupthm.pysty3 index 13fef23..a84d141 100644 --- a/src/environments/groupthm.pysty3 +++ b/src/environments/groupthm.pysty3 @@ -11,6 +11,8 @@ __HEADER__(Grouping theorems for easier customization.) \hook_new:n { groupthm / mapname } \hook_new:n { groupthm / thmtools } +\hook_new:n { groupthm / groupsort } + \newcounter{indocument} \newcounter{insection}[section] @@ -25,6 +27,7 @@ __HEADER__(Grouping theorems for easier customization.) } \cs_generate_variant:Nn \declaretheorem:nn { n V } +\cs_generate_variant:Nn \hook_gset_rule:nnnn { n n V n } %%% Messages @@ -56,6 +59,10 @@ __HEADER__(Grouping theorems for easier customization.) \tl_new:N \l_groupthm_relation_tl +\clist_new:N \l_groupthm_groups_clist + +\str_new:N \g_groupthm_last_theorem_group_str + %%% Keys @@ -107,6 +114,12 @@ __HEADER__(Grouping theorems for easier customization.) \clist_put_right:Nn \l_groupthm_thmtools_clist { #5 } } } + \hook_gset_rule:nnnn { groupthm / groupsort } + \g_groupthm_last_theorem_group_str + { before } + { + #1 + } } \cs_generate_variant:Nn \new_theorem_group:nnnnn { n V V V V } @@ -150,6 +163,11 @@ __HEADER__(Grouping theorems for easier customization.) \cs_new:Npn \new_grouped_theorem:nnnn #1 #2 #3 #4 { +% \tl_show:n { #1 } +% \tl_show:n { #2 } +% \tl_show:n { #3 } +% \tl_show:n { #4 } + \tl_clear:N \l_groupthm_prename_tl \tl_set:Nn \l_groupthm_name_tl { #3 } \tl_clear:N \l_groupthm_postname_tl @@ -183,6 +201,7 @@ __HEADER__(Grouping theorems for easier customization.) \l_groupthm_thmtools_clist } \cs_generate_variant:Nn \new_grouped_theorem:nnnn { n V V V } +\cs_generate_variant:Nn \new_grouped_theorem:nnnn { x V n n } % envname, keys \cs_new:Npn \new_grouped_theorem_from_keys:nn #1 #2 @@ -215,6 +234,9 @@ __HEADER__(Grouping theorems for easier customization.) } + +%% Rules for different theorem groups + \cs_generate_variant:Nn \hook_gset_rule:nnnn { n n V n } % hook group1 relation group2 @@ -241,6 +263,145 @@ __HEADER__(Grouping theorems for easier customization.) \declare_theorem_group_rule:nnnn {#1} {#2} {#3} {#4} } +%%% Iterate over powerset of claist + +\clist_new:N \copied_clist +\seq_new:N \saved_seq + +%remove left -> push on stack +% call recursive +% add left to 'extra' +% call recursive +% remove left from 'extra' +% add from stack to left + + +\cs_generate_variant:Nn \clist_remove_all:Nn { N V } + +\cs_new:Npn \clist_use_powerset_aux:Nn #1 #2 +{ + \clist_if_empty:NTF \copied_clist + { + #2 + } + { + + \clist_get:NN \copied_clist \l_tmpa_tl % gets first element of copied list into local + \seq_push:NV \saved_seq \l_tmpa_tl % pushes local value onto stack + \clist_pop:NN \copied_clist { \l_tmpa_tl } % removes from copied list + + \clist_use_powerset_aux:Nn #1 {#2} + + \seq_get:NN \saved_seq \l_tmpa_tl + \clist_put_left:NV #1 \l_tmpa_tl + + \clist_use_powerset_aux:Nn #1 {#2} + + \seq_get:NN \saved_seq \l_tmpa_tl + \clist_remove_all:NV #1 \l_tmpa_tl + \clist_push:NV \copied_clist \l_tmpa_tl + \seq_pop:NN \saved_seq \l_tmpa_tl + } +} + +\cs_new:Npn \clist_use_powerset:Nn #1 #2 +{ + \clist_set_eq:NN \copied_clist #1 + \clist_clear:N #1 + \clist_remove_duplicates:N \copied_clist + + \clist_use_powerset_aux:Nn #1 {#2} + + \clist_set_eq:NN #1 \copied_clist +} + + +%%% Theorem variants declaration + +\ExplSyntaxOn + + +\cs_new:Npn \add_to_sort_hook:n #1 +{ + \hook_gput_code:nnn { groupthm / groupsort } + { #1 } + { + \clist_put_left:Nn \l_groupthm_groups_clist { #1 } + } +} + +\cs_new:Npn \sort_group_names: +{ + \hook_gremove_code:nn { groupthm / groupsort }{*} + \clist_map_function:NN \l_groupthm_groups_clist \add_to_sort_hook:n + \clist_clear:N \l_groupthm_groups_clist + \hook_use:n { groupthm / groupsort } +} + + +% evname, name, thmtools, star? +\cs_new:Npn \declare_theorem_variants_aux:nnnn #1 #2 #3 #4 +{ + + \clist_set:Nn \l_groupthm_groups_clist { dagger, star } +% \clist_set:Nn \l_groupthm_thmtools_clist {#3} +% \IfBooleanT{#4} + + % envname, groups, name, thmtools +% \clist_sort:Nn \l_groupthm_groups_clist +% { +% \str_compare:nNnTF { #1 } > { #2 } +% { \sort_return_swapped: } +% { \sort_return_same: } +% } + + \clist_use_powerset:Nn \l_groupthm_groups_clist + { + \sort_group_names: + \new_grouped_theorem:xVnn + {__#1__groups_\clist_use:Nn \l_groupthm_groups_clist {_}} + \l_groupthm_groups_clist + { #2 } + { #3 } + } + + + \NewDocumentEnvironment{#1}{ !s !t+ } + { + \clist_clear:N \l_groupthm_groups_clist + \IfBooleanT{##2} + { + \clist_put_left:Nn \l_groupthm_groups_clist { dagger } + } + \IfBooleanT{##1} + { + \clist_put_left:Nn \l_groupthm_groups_clist { star } + } + \sort_group_names: + \begin{__#1__groups_\clist_use:Nn \l_groupthm_groups_clist{_}} + } + { + \clist_clear:N \l_groupthm_groups_clist + \IfBooleanT{##1} + { + \clist_put_left:Nn \l_groupthm_groups_clist { star } + } + \IfBooleanT{##2} + { + \clist_put_left:Nn \l_groupthm_groups_clist { dagger } + } + \sort_group_names: + \end{__#1__groups_\clist_use:Nn \l_groupthm_groups_clist{_}} + } + +} + +\DeclareDocumentCommand{\DeclareTheoremVariants}{mmmm} +{ + \declare_theorem_variants_aux:nnnn{#1}{#2}{#3}{#4} +} + + %%% Default groups available @@ -286,3 +447,5 @@ __HEADER__(Grouping theorems for easier customization.) \DeclareTheoremGroupRule { starred } { higher } { small } \DeclareTheoremGroupRule { starred } { higher } { dagger } \DeclareTheoremGroupRule { starred } { higher } { star } + +\DeclareTheoremGroupRule { starred } { higher } { starred}