refactor powerset macro into own package
This commit is contained in:
parent
3630c47b59
commit
d8322bb5f1
2 changed files with 100 additions and 78 deletions
|
@ -5,6 +5,7 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
|
|
||||||
\RequirePackage{amsthm}
|
\RequirePackage{amsthm}
|
||||||
\RequirePackage{thmtools}
|
\RequirePackage{thmtools}
|
||||||
|
\RequirePackage{mkessler-powerset}
|
||||||
|
|
||||||
\hook_new:n { groupthm / prename }
|
\hook_new:n { groupthm / prename }
|
||||||
\hook_new:n { groupthm / postname }
|
\hook_new:n { groupthm / postname }
|
||||||
|
@ -120,6 +121,7 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
{
|
{
|
||||||
#1
|
#1
|
||||||
}
|
}
|
||||||
|
\str_gset:Nn \g_groupthm_last_theorem_group_str { #1 }
|
||||||
}
|
}
|
||||||
\cs_generate_variant:Nn \new_theorem_group:nnnnn { n V V V V }
|
\cs_generate_variant:Nn \new_theorem_group:nnnnn { n V V V V }
|
||||||
|
|
||||||
|
@ -163,10 +165,6 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
\cs_new:Npn \new_grouped_theorem:nnnn #1 #2 #3 #4
|
\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_clear:N \l_groupthm_prename_tl
|
||||||
\tl_set:Nn \l_groupthm_name_tl { #3 }
|
\tl_set:Nn \l_groupthm_name_tl { #3 }
|
||||||
|
@ -263,57 +261,7 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
\declare_theorem_group_rule:nnnn {#1} {#2} {#3} {#4}
|
\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
|
%%% Theorem variants declaration
|
||||||
|
@ -338,24 +286,11 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
\hook_use:n { groupthm / groupsort }
|
\hook_use:n { groupthm / groupsort }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
% envname, name, thmtools, list of groups
|
||||||
% evname, name, thmtools, star?
|
\cs_new:Npn \generate_theorem_variants:nnnn #1 #2 #3 #4
|
||||||
\cs_new:Npn \declare_theorem_variants_aux:nnnn #1 #2 #3 #4
|
|
||||||
{
|
{
|
||||||
|
\clist_set:Nn \l_groupthm_groups_clist { #4 }
|
||||||
\clist_set:Nn \l_groupthm_groups_clist { dagger, star }
|
\powerset_clist_foreach:Nn \l_groupthm_groups_clist
|
||||||
% \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:
|
\sort_group_names:
|
||||||
\new_grouped_theorem:xVnn
|
\new_grouped_theorem:xVnn
|
||||||
|
@ -364,9 +299,16 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
{ #2 }
|
{ #2 }
|
||||||
{ #3 }
|
{ #3 }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
% evname, star?
|
||||||
\NewDocumentEnvironment{#1}{ !s !t+ }
|
\cs_new:Npn \declare_theorem_variants_aux:nn #1 #2
|
||||||
|
{
|
||||||
|
\exp_args:Nx\NewDocumentEnvironment
|
||||||
|
{
|
||||||
|
#1\IfBooleanT{#2}{*}
|
||||||
|
}
|
||||||
|
{ !s !t+ }
|
||||||
{
|
{
|
||||||
\clist_clear:N \l_groupthm_groups_clist
|
\clist_clear:N \l_groupthm_groups_clist
|
||||||
\IfBooleanT{##2}
|
\IfBooleanT{##2}
|
||||||
|
@ -377,6 +319,10 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
{
|
{
|
||||||
\clist_put_left:Nn \l_groupthm_groups_clist { star }
|
\clist_put_left:Nn \l_groupthm_groups_clist { star }
|
||||||
}
|
}
|
||||||
|
\IfBooleanT{#2}
|
||||||
|
{
|
||||||
|
\clist_put_left:Nn \l_groupthm_groups_clist { starred }
|
||||||
|
}
|
||||||
\sort_group_names:
|
\sort_group_names:
|
||||||
\begin{__#1__groups_\clist_use:Nn \l_groupthm_groups_clist{_}}
|
\begin{__#1__groups_\clist_use:Nn \l_groupthm_groups_clist{_}}
|
||||||
}
|
}
|
||||||
|
@ -390,15 +336,29 @@ __HEADER__(Grouping theorems for easier customization.)
|
||||||
{
|
{
|
||||||
\clist_put_left:Nn \l_groupthm_groups_clist { dagger }
|
\clist_put_left:Nn \l_groupthm_groups_clist { dagger }
|
||||||
}
|
}
|
||||||
|
\IfBooleanT{#2}
|
||||||
|
{
|
||||||
|
\clist_put_left:Nn \l_groupthm_groups_clist { starred }
|
||||||
|
}
|
||||||
\sort_group_names:
|
\sort_group_names:
|
||||||
\end{__#1__groups_\clist_use:Nn \l_groupthm_groups_clist{_}}
|
\end{__#1__groups_\clist_use:Nn \l_groupthm_groups_clist{_}}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
\DeclareDocumentCommand{\DeclareTheoremVariants}{mmmm}
|
% envname, name, thmtools
|
||||||
|
\cs_new:Npn \declare_theorem_variants:nnn #1 #2 #3
|
||||||
{
|
{
|
||||||
\declare_theorem_variants_aux:nnnn{#1}{#2}{#3}{#4}
|
\generate_theorem_variants:nnnn { #1 } { #2 } { #3 } { star, dagger, starred }
|
||||||
|
\declare_theorem_variants_aux:nn { #1 } { \BooleanTrue }
|
||||||
|
\declare_theorem_variants_aux:nn { #1 } { \BooleanFalse }
|
||||||
|
}
|
||||||
|
|
||||||
|
% envname, group-determining function
|
||||||
|
%\cs_new:Nn \toggle_variable_environment
|
||||||
|
|
||||||
|
\DeclareDocumentCommand{\DeclareTheoremVariants}{mmm}
|
||||||
|
{
|
||||||
|
\declare_theorem_variants:nnn{#1}{#2}{#3}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
62
src/utils/powerset.pysty3
Normal file
62
src/utils/powerset.pysty3
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
__HEADER__(Iterate over powerset of clist)
|
||||||
|
|
||||||
|
\ExplSyntaxOn
|
||||||
|
|
||||||
|
%%% Iterate over powerset of claist
|
||||||
|
|
||||||
|
\clist_new:N \l_powerset_copied_clist
|
||||||
|
\seq_new:N \l_powerset_saved_seq
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
\cs_generate_variant:Nn \clist_remove_all:Nn { N V }
|
||||||
|
|
||||||
|
% Pseudocode of this macro
|
||||||
|
% remove left -> push on stack
|
||||||
|
% call recursive
|
||||||
|
% add left to 'extra'
|
||||||
|
% call recursive
|
||||||
|
% remove left from 'extra'
|
||||||
|
% add from stack to left
|
||||||
|
|
||||||
|
\cs_new:Npn \__powerset_clist_foreach_aux:Nn #1 #2
|
||||||
|
{
|
||||||
|
\clist_if_empty:NTF \l_powerset_copied_clist
|
||||||
|
{
|
||||||
|
#2
|
||||||
|
}
|
||||||
|
{
|
||||||
|
\clist_get:NN \l_powerset_copied_clist \l_tmpa_tl
|
||||||
|
\seq_push:NV \l_powerset_saved_seq \l_tmpa_tl
|
||||||
|
\clist_pop:NN \l_powerset_copied_clist { \l_tmpa_tl }
|
||||||
|
|
||||||
|
\__powerset_clist_foreach_aux:Nn #1 {#2}
|
||||||
|
|
||||||
|
\seq_get:NN \l_powerset_saved_seq \l_tmpa_tl
|
||||||
|
\clist_put_left:NV #1 \l_tmpa_tl
|
||||||
|
|
||||||
|
\__powerset_clist_foreach_aux:Nn #1 {#2}
|
||||||
|
|
||||||
|
\seq_get:NN \l_powerset_saved_seq \l_tmpa_tl
|
||||||
|
\clist_remove_all:NV #1 \l_tmpa_tl
|
||||||
|
\clist_push:NV \l_powerset_copied_clist \l_tmpa_tl
|
||||||
|
\seq_pop:NN \l_powerset_saved_seq \l_tmpa_tl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
% Usage:
|
||||||
|
% \clist_use_powerset:Nn {clist variable name}{code for each subset}
|
||||||
|
% This will execute #2 for each subset of the listname given as #1
|
||||||
|
% In #2, the name given as #1 can be used for the current subset
|
||||||
|
% After execution, the value of #1 is restored
|
||||||
|
\cs_new:Npn \powerset_clist_foreach:Nn #1 #2
|
||||||
|
{
|
||||||
|
\clist_set_eq:NN \l_powerset_copied_clist #1
|
||||||
|
\clist_clear:N #1
|
||||||
|
\clist_remove_duplicates:N \l_powerset_copied_clist
|
||||||
|
|
||||||
|
\__powerset_clist_foreach_aux:Nn #1 {#2}
|
||||||
|
|
||||||
|
\clist_set_eq:NN #1 \l_powerset_copied_clist
|
||||||
|
}
|
Loading…
Reference in a new issue