diff --git a/doc/environments/groupthm/groupthm.dtx b/doc/environments/groupthm/groupthm.dtx index e68acd1..6e71bfb 100644 --- a/doc/environments/groupthm/groupthm.dtx +++ b/doc/environments/groupthm/groupthm.dtx @@ -63,14 +63,9 @@ % \newpage % % \begin{itemize} -% \item Inheritance -% \item Appending to groups -% \item default group integration -% \item better error message to avoid low level tex errors in any case +% \item appending to groups % \item potentially: detection of star / nonstar misuse % \item add command to define group rule for all existing groups -% \item various info commands on defined groups? -% \item debugging information? % \end{itemize} % A central thing in \LaTeX is the usage of \enquote{theorems}. % With \enquote{theorems} we actually mean \enquote{environments} that typically @@ -1169,6 +1164,14 @@ \bool_new:N \l_@@_in_family_options_environment_bool % \end{macrocode} % \end{variable} +% \begin{variable}{\g_@@_append_groups_int} +% +% This counts the number of times we appended to a group. +% +% \begin{macrocode} +\int_new:N \g_@@_append_groups_int +% \end{macrocode} +% \end{variable} % % % \subsection{Key interface} @@ -1450,9 +1453,15 @@ % \end{macrocode} % \begin{variable}{ \g_@@_parents_group__\meta{theorem group}__clist } % -% This variable will accumulate the parents of this group: +% This variable will accumulate the parents of this group. % \begin{macrocode} \clist_new:c { g_@@_parents_group__#1__clist } +% \begin{macrocode} +% This ensures default priorities between groups. +% \end{macrocode} + \hook_gset_rule:nnnn { ?? } { all } { before } { #1 } + \hook_gset_rule:nnnn { ?? } { unnumbered } { after } { #1 } + \hook_gset_rule:nnnn { ?? } { starred } { after } { #1 } % \end{macrocode} % \end{variable} % Add defined group to corresponding list @@ -1782,6 +1791,7 @@ \l_@@_thmtools_clist } % \end{macrocode} +\cs_generate_variant:Nn \groupthm_new_group:nn { n x } % \end{macro} % % @@ -1850,20 +1860,21 @@ \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_set:Nn \l_tmpa_str { after } } \str_if_eq:VnT \l_tmpa_str { lower } { - \str_set:Nn \l_tmpa_tl { before } + \str_set:Nn \l_tmpa_str { before } } \str_if_eq:nnTF { #1 } { ?? } { - \hook_gset_rule:nnVn {??} {#2} \l_tmpa_tl {#4} + \hook_gset_rule:nnVn {??} {#2} \l_tmpa_str {#4} } { - \hook_gset_rule:nnVn { @@ / #1 } {#2} \l_tmpa_tl {#4} + \hook_gset_rule:nnVn { @@ / #1 } {#2} \l_tmpa_str {#4} } } +\cs_generate_variant:Nn \groupthm_declare_group_rule:nnnn { n n n x } % \end{macrocode} % \end{macro} @@ -1897,6 +1908,7 @@ \@@_ensure_group_exists:n { #2 } \clist_gput_left:cn { g_@@_parents_group__#1__clist } { #2 } } +\cs_generate_variant:Nn \groupthm_add_parent:nn { n x } % \end{macrocode} % \end{macro} % @@ -1965,6 +1977,51 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\groupthm_append_to_group:nn} +% \begin{syntax} +% \cs{groupthm_append_to_group:nn}\marg{key=value list}\marg{theorem group} +% \end{syntax} +% +% This works the same as defining a new group, except that we append to the group, +% overwriting the old group in case of conflicts. +% +% \begin{macrocode} +\cs_new:Npn \groupthm_append_to_group:nn #1 #2 + { + \groupthm_new_group:nx { #1 } { __append__ \int_use:N \g_@@_append_groups_int } + \groupthm_add_parent:nx { #2 } { __append__ \int_use:N \g_@@_append_groups_int } + \groupthm_declare_group_rule:nnnx + { ?? } { #2 } { before } { __append__ \int_use:N \g_@@_append_groups_int } + \int_gincr:N \g_@@_append_groups_int + } +% \end{macrocodel} +% \end{macro} +% + + +% \begin{macro}{\AppendToTheoremGroup} +% \begin{syntax} +% \cs{AppendToTheoremGroup} \marg{key=value list}\marg{theorem group} +% \end{syntax} +% +% +% +% \begin{macrocode} +\NewDocumentCommand { \AppendToTheoremGroup } { O{} m } + { + \groupthm_append_to_group:nn { #1 } { #2 } + } +% \end{macrocode} +% \end{macro} + + +% We also provide the three default groups: +% +% \begin{macrocode} +\groupthm_new_group:nnnnn { all } { } { } { } { } +\groupthm_new_group:nnnnn { starred } { } { } { } { numbered = no } +\groupthm_new_group:nnnnn { unnumbered } { } { } { } { numbered = no } +% \end{macrocode} % % \subsection{Iterating over powersets} % For generating the different variants of a theorem family, @@ -2120,7 +2177,7 @@ % \end{macrocode} % Now, retrieve the group properties, by writing these into the hooks % \begin{macrocode} - \@@_flatten_groups_hierarchy:nN { #2 } \l_@@_group_clist + \@@_flatten_groups_hierarchy:nN { #2, all } \l_@@_group_clist \clist_map_function:NN \l_@@_group_clist \@@_use_group:n \tl_log:x { Flattened ~ groups ~ '#2' ~ to ~ '\clist_use:Nn \l_@@_group_clist {,}' ~ when ~ defining ~ theorem ~ '#1' } diff --git a/doc/environments/groupthm/groupthm.sty b/doc/environments/groupthm/groupthm.sty index 2cb91e8..0346662 100644 --- a/doc/environments/groupthm/groupthm.sty +++ b/doc/environments/groupthm/groupthm.sty @@ -87,6 +87,7 @@ \clist_new:N \l__groupthm_group_clist \clist_new:N \g__groupthm_defined_groups_clist \bool_new:N \l__groupthm_in_family_options_environment_bool +\int_new:N \g__groupthm_append_groups_int \keys_define:nn { groupthm / theorem ~ group } { prefix .tl_set:N = \l__groupthm_key_prefix_tl, @@ -215,6 +216,9 @@ } \__groupthm_add_to_group_ordering:n { #1 } \clist_new:c { g__groupthm_parents_group__#1__clist } + \hook_gset_rule:nnnn { ?? } { all } { before } { #1 } + \hook_gset_rule:nnnn { ?? } { unnumbered } { after } { #1 } + \hook_gset_rule:nnnn { ?? } { starred } { after } { #1 } \clist_gput_left:Nn \g__groupthm_defined_groups_clist { #1 } } \cs_new:Npn \__groupthm_undefine_group:n #1 @@ -361,6 +365,7 @@ \l__groupthm_mapname_clist \l__groupthm_thmtools_clist } +\cs_generate_variant:Nn \groupthm_new_group:nn { n x } \cs_new:Npn \__groupthm_new_document_command:Nnn #1 #2 #3 { \NewDocumentCommand { #1 } { #2 } { #3 } @@ -387,20 +392,21 @@ \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_set:Nn \l_tmpa_str { after } } \str_if_eq:VnT \l_tmpa_str { lower } { - \str_set:Nn \l_tmpa_tl { before } + \str_set:Nn \l_tmpa_str { before } } \str_if_eq:nnTF { #1 } { ?? } { - \hook_gset_rule:nnVn {??} {#2} \l_tmpa_tl {#4} + \hook_gset_rule:nnVn {??} {#2} \l_tmpa_str {#4} } { - \hook_gset_rule:nnVn { __groupthm / #1 } {#2} \l_tmpa_tl {#4} + \hook_gset_rule:nnVn { __groupthm / #1 } {#2} \l_tmpa_str {#4} } } +\cs_generate_variant:Nn \groupthm_declare_group_rule:nnnn { n n n x } \NewDocumentCommand { \DeclareTheoremGroupRule } { O{??} m m m } { @@ -412,6 +418,7 @@ \__groupthm_ensure_group_exists:n { #2 } \clist_gput_left:cn { g__groupthm_parents_group__#1__clist } { #2 } } +\cs_generate_variant:Nn \groupthm_add_parent:nn { n x } \NewDocumentCommand { \AddTheoremGroupParent } { m m } { \groupthm_add_parent:nn { #1 } { #2 } @@ -440,6 +447,23 @@ } } } +\cs_new:Npn \groupthm_append_to_group:nn #1 #2 + { + \groupthm_new_group:nx { #1 } { __append__ \int_use:N \g__groupthm_append_groups_int } + \groupthm_add_parent:nx { #2 } { __append__ \int_use:N \g__groupthm_append_groups_int } + \groupthm_declare_group_rule:nnnx + { ?? } { #2 } { before } { __append__ \int_use:N \g__groupthm_append_groups_int } + \int_gincr:N \g__groupthm_append_groups_int + } + +\NewDocumentCommand { \AppendToTheoremGroup } { O{} m } + { + \groupthm_append_to_group:nn { #1 } { #2 } + } + +\groupthm_new_group:nnnnn { all } { } { } { } { } +\groupthm_new_group:nnnnn { starred } { } { } { } { numbered = no } +\groupthm_new_group:nnnnn { unnumbered } { } { } { } { numbered = no } \clist_new:N \l__powerset_copied_clist \seq_new:N \l__powerset_saved_seq \cs_generate_variant:Nn \clist_remove_all:Nn { N V } @@ -505,7 +529,7 @@ \hook_gremove_code:nn { __groupthm/suffix }{*} \hook_gremove_code:nn { __groupthm/mapname }{*} \hook_gremove_code:nn { __groupthm/thmtools }{*} - \__groupthm_flatten_groups_hierarchy:nN { #2 } \l__groupthm_group_clist + \__groupthm_flatten_groups_hierarchy:nN { #2, all } \l__groupthm_group_clist \clist_map_function:NN \l__groupthm_group_clist \__groupthm_use_group:n \tl_log:x { Flattened ~ groups ~ '#2' ~ to ~ '\clist_use:Nn \l__groupthm_group_clist {,}' ~ when ~ defining ~ theorem ~ '#1' }