%%
%% 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: l3prop.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
  {
    \tl_show:x { Setting~normalized~keys~=~\{#1\}~with~subgroup~#2~and~fallback~#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_declare_theorem_group_aux:nnnnn #1#2#3#4#5
  {
  \tl_show:x {Declaring~new~theorem~group~named~#1,~pre~=~#2,~post~=~#3,~map~=~#4,~thmtools~=~#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  }
    \hook_gremove_code:nn { __groupthm/postname }
    \hook_gremove_code:nn { __groupthm/mapname  }
    \hook_gremove_code:nn { __groupthm/thmtools }
    \clist_remove_all:Nn  \g__groupthm_defined_theorem_groups_clist { #1 }
    \__groupthm_hook_gset_rule_foreach:nNnn
      { ?? }
      \g__groupthm_defined_theorem_groups_clist { #1 }
      { unrelated }
      { #1 }
    \__groupthm_hook_gset_rule_foreach:nNnn
      { __groupthm/prename }
      \g__groupthm_defined_theorem_groups_clist { #1 }
      { unrelated }
      { #1 }
    \__groupthm_hook_gset_rule_foreach:nNnn
      { __groupthm/postname }
      \g__groupthm_defined_theorem_groups_clist { #1 }
      { unrelated }
      { #1 }
    \__groupthm_hook_gset_rule_foreach:nNnn
      { __groupthm/mapname }
      \g__groupthm_defined_theorem_groups_clist { #1 }
      { unrelated }
      { #1 }
    \__groupthm_hook_gset_rule_foreach:nNnn
      { __groupthm/thmtools }
      \g__groupthm_defined_theorem_groups_clist { #1 }
      { unrelated }
      { #1 }
    \__groupthm_remove_from_theorem_group_ordering:n { #1 }
  }
\cs_new:Npn \groupthm_new_theorem_group:nnnnn #1 #2 #3 #4 #5
  {
   \tl_show:x {NewTheorem~group~named~#1,~pre~=~#2,~post~=~#3,~map~=~#4,~thmtools~=~#5}
    \cs_if_exist:cTF { __groupthm_use_group_#1 }
      {
        \msg_error:nnnnn { groupthm } { wrong ~ definition }
          { 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 }
          { 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
{
   \tl_show:x {NewTheorem~group~by~keys~named~#2,~keys=#1}
  \__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 }
  {
   \tl_show:x {NewTheoremGroupp~with~name~#2,~keys=#1}
    \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 }
  }
\endinput
%%
%% End of file `groupthm.sty'.
