texlive[72331] Master/texmf-dist: keytheorems (20sep24)

commits+karl at tug.org commits+karl at tug.org
Fri Sep 20 23:23:01 CEST 2024


Revision: 72331
          https://tug.org/svn/texlive?view=revision&revision=72331
Author:   karl
Date:     2024-09-20 23:23:01 +0200 (Fri, 20 Sep 2024)
Log Message:
-----------
keytheorems (20sep24)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/keytheorems/CHANGELOG.md
    trunk/Master/texmf-dist/doc/latex/keytheorems/README.md
    trunk/Master/texmf-dist/doc/latex/keytheorems/keytheorems-doc.pdf
    trunk/Master/texmf-dist/doc/latex/keytheorems/keytheorems-doc.tex
    trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsart-support.tex
    trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsbook-support.tex
    trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsproc-support.tex
    trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-memoir-support.tex
    trunk/Master/texmf-dist/tex/latex/keytheorems/keytheorems.sty

Modified: trunk/Master/texmf-dist/doc/latex/keytheorems/CHANGELOG.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/keytheorems/CHANGELOG.md	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/doc/latex/keytheorems/CHANGELOG.md	2024-09-20 21:23:01 UTC (rev 72331)
@@ -1,5 +1,11 @@
 # Changelog for keytheorems package
 
+## [v0.1.3]
+- add `noteseparator` key
+- add `\IfRestatingT`, `\IfRestatingF`
+- add `store*` key
+- add Portuguese translations
+
 ## [v0.1.2]
 - Move support for memoir and AMS classes to dedicated files
 - document `headformat` key
@@ -14,5 +20,6 @@
 ## 0.1.0 - 2024-09-04
 - First release
 
+[v0.1.3]: https://github.com/mbertucci47/keytheorems/compare/v0.1.2...v0.1.3
 [v0.1.2]: https://github.com/mbertucci47/keytheorems/compare/v0.1.1...v0.1.2
 [v0.1.1]: https://github.com/mbertucci47/keytheorems/compare/v0.1.0...v0.1.1
\ No newline at end of file

Modified: trunk/Master/texmf-dist/doc/latex/keytheorems/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/keytheorems/README.md	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/doc/latex/keytheorems/README.md	2024-09-20 21:23:01 UTC (rev 72331)
@@ -94,7 +94,8 @@
   as in the former, `bodyfont` is `\normalfont`, not the default `\itshape`.
   This package keeps the defaults unless a key is specifically given.
 - There is no `restatable` environment except with package option `thmtools-compat`. Use the
-  `store` (alias `restate`) key.
+  `store` (alias `restate`) key. For counters and labels pointing to the restated theorem,
+  use `store*` (alias `restate*`).
 - Rather than `restate=foo` defining a command `\foo*`, theorems are retrieved with `\getkeytheorem{foo}`.
   For just the theorem body, use `\getkeytheorem[body]{foo}`. Also, this retrieval
   can happen even before the theorem is stated since keytheorems writes the contents
@@ -107,12 +108,7 @@
 - With thmtools, the command `\newtheorem{<envname>}{<heading>}` is changed to behave like
   `\declaretheorem[name=<heading>]{<envname>}`. This is not the default here. Instead either
   only use the new interface or load the package with option `overload`.
-- All new keys (see doc for descriptions):
-  - global (load-time or in `\keytheoremset`): `overload`, `thmtools-compat`, `store-all`, `restate-counters`, `continues-code`, `qed-symbol`, `auto-translate`
-  - keys for theorem envs: `note` (alias `name`), `short-note`, `continues*`, `store` (alias `restate`), `seq`
-  - declaring theorems (in `\newkeytheorem`): `tcolorbox`, `tcolorbox-no-titlebar`
-  - declaring styles (in `\newkeytheoremstyle`): `inherit-style`
-  - list of theorems (in `\keytheoremlistset` and `\listofkeytheorems`): `onlynumbered`, `seq`, `title-code`, `no-title`, `note-code`, `print-body`, `no-continues`, `no-chapter-skip`, `chapter-skip-length`
+- Adds several new keys (see doc for details).
 
 ## thmtools issues resolved by keytheorems
 Issues from the thmtools [github page](https://github.com/muzimuzhi/thmtools),
@@ -464,10 +460,9 @@
 - Clean up the code. Things are out of order, poorly named, etc.
 - Add more error messages.
 - thmtools features not yet implemented
-    - labels pointing to restated theorem, not original
     - real [`beamer`](https://ctan.org/pkg/beamer) support
     - certainly more
-- For a complete list, see [`keytheorems-ideas.txt`](https://github.com/mbertucci47/keytheorems/blob/main/keytheorems-ideas.txt)
+- For a complete list, see [`keytheorems-ideas.md`](https://github.com/mbertucci47/keytheorems/blob/main/keytheorems-ideas.md)
  
 ## Notes/issues on thmtools, not on Github
 

Modified: trunk/Master/texmf-dist/doc/latex/keytheorems/keytheorems-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/keytheorems/keytheorems-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/keytheorems/keytheorems-doc.tex	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/doc/latex/keytheorems/keytheorems-doc.tex	2024-09-20 21:23:01 UTC (rev 72331)
@@ -20,7 +20,7 @@
 \usepackage{cleveref}
 \usepackage{amssymb}
 
-\def\version{0.1.2}
+\def\version{0.1.3}
 
 \title{%
   \pkg{keytheorems} package \\[1ex]
@@ -53,7 +53,17 @@
 \newkeytheorem{remark}[style=remark]
 \tcbset{
   defstyle/.style={arc=0mm,colback=blue!5!white,colframe=blue!75!black},
+  thmstyle/.style={colback=green!5,colframe=green!35!black},
   }
+\newkeytheoremstyle{tcb-standard}{
+  tcolorbox=thmstyle,
+  headpunct={},
+  notebraces={}{},
+  noteseparator={: },
+  notefont=\bfseries,
+  bodyfont=\normalfont,
+  }
+\newkeytheorem{mytheo}[name=My Theorem,style=tcb-standard]
 \newkeytheorem{corollary}[tcolorbox]
 \newkeytheorem{definition}[
   style=definition,
@@ -137,7 +147,7 @@
 
 \section{Dependencies}
 
-Without using the \refKey{tcolorbox} or \refKey{tcolorbox-no-titlebar} options, the package loads the \pkg{aliascnt}, \pkg{amsthm}, \pkg{refcount}, and \pkg{translations} packages.
+Without using the \refKey{tcolorbox} or \refKey{tcolorbox-no-titlebar} options, the package loads the \pkg{aliascnt}, \pkg{amsthm}, \pkg{refcount}, \pkg{translations}, and \pkg{unique} packages.
 A \LaTeX{} kernel no older than 2023-06-01 is required; if older than 2024-06-01, \pkg{nameref} is required.
     
 \section{Global Options}
@@ -198,7 +208,7 @@
   {initially \cs{GetTranslation}\ttbraces{keythms\string_continues}\cs{pageref}\ttbraces{\#1}}
 The code used to typeset the note produced by the \refKey{continues} key.
 If English or an unknown language is used, defaults to \texttt{continuing from p.}\cs{,}\cs{pageref}\ttbraces{\#1}.
-Currently (likely inaccurate!) translations exist for French, German, Italian, and Spanish.
+Currently (likely inaccurate!) translations exist for French, German, Italian, Portuguese, and Spanish.
 \end{docKey}
 
 \begin{docKey}{qed-symbol}
@@ -304,10 +314,10 @@
 \end{docKey}
 
 \begin{docKey}{store}
-  {=\meta{tag}}
+  {\sarg=\meta{tag}}
   {initially unset}
-Alias \docAuxKey{restate}.
-Stores the the theorem to be restated at any point in the document with \refCom{getkeytheorem}.
+Alias \docAuxKey{restate}\sarg.
+Stores the the theorem to be restated at any point in the document with \refCom{getkeytheorem}. With the starred version, counters and labels are taken from the copy called with \cs{getkeytheorem}, so in this case can only be restated once. This allows you, for example, to write all theorems and proofs in the appendix and call \cs{getkeytheorem} at the appropriate time mid-document.
 
 \begin{keythmscode}[]
 \begin{theorem}[store=blub]
@@ -610,6 +620,33 @@
 
 \end{docKey}
 
+\pkg{tcolorbox} offers its own comprehensive \texttt{theorems} library. If all of your theorems are to be tcolorboxes, I highly recommend using it instead of this package! However, if only some of your theorems will use a tcolorbox, you may want to replicate the styles of \cs{NewTcbTheorem}. Here is an example that emulates \pkg{tcolorbox}'s \texttt{standard} theorem style.
+
+\begin{tcbwritetemp}
+\tcbset{
+  thmstyle/.style={
+    colback=green!5,
+    colframe=green!35!black},
+  }
+\newkeytheoremstyle{tcb-standard}{
+  tcolorbox=thmstyle,
+  headpunct={},
+  notebraces={}{},
+  noteseparator={: },
+  notefont=\bfseries,
+  bodyfont=\normalfont,
+  }
+\newkeytheorem{mytheo}[
+  name=My Theorem,
+  style=tcb-standard]
+\end{tcbwritetemp}
+
+\begin{keythmscode}[withpreamble]
+\begin{mytheo}[This is my title]
+Some theorem text
+\end{mytheo}
+\end{keythmscode}
+
 \section{Theorem Styles}
 
 \begin{docCommand}{newkeytheoremstyle}
@@ -698,6 +735,12 @@
 
 \subsection{Keys added by \pkg{keytheorems}}
 
+\begin{docKey}{noteseparator}
+  {=\meta{code}}
+  {initially \textvisiblespace}
+The code inserted before the note, and printed only if there is a note. This is executed \emph{before} the font commands set by \refKey{notefont} take effect.
+\end{docKey}
+
 \begin{docKey}{inherit-style}
   {=\meta{style name}}
   {initially unset}
@@ -712,7 +755,7 @@
 
 \begin{docCommand}{getkeytheorem}
   {\oarg{property}\marg{tag}}
-Retrieves the theorem given the key |store=|\meta{tag}.
+Retrieves the theorem given the key |store=|\meta{tag} or |store*=|\meta{tag}.
 An optional \meta{property} can be given to retrieve only the corresponding part of the theorem.
 Currently only the property |body| is implemented, which retrieves the (unformatted) body of the theorem.
 
@@ -728,9 +771,22 @@
 
 \end{docCommand}
 
-\begin{docCommand}{IfRestatingTF}
-  {\marg{true code}\marg{false code}}
-Executes \meta{true code} if being retrieved with \refCom{getkeytheorem} and \meta{false code} if in the original theorem.
+\begin{docCommands}
+  {
+    {
+      doc name = IfRestatingTF,
+      doc parameter=\marg{true code}\marg{false code}
+    },
+    {
+      doc name = IfRestatingT,
+      doc parameter=\marg{true code}
+    },
+    {
+      doc name = IfRestatingF,
+      doc parameter=\marg{false code}
+    }
+  }
+Executes \meta{true code} if being retrieved with \refCom{getkeytheorem} and \meta{false code} if in the original theorem. This is reversed if \texttt{store*} is used.
 
 \begin{keythmscode}[]
 \begin{example}[store=hmm]
@@ -742,7 +798,7 @@
 \getkeytheorem{hmm}
 \end{keythmscode}
 
-\end{docCommand}
+\end{docCommands}
 
 \section{Listing Theorems}
 
@@ -812,7 +868,7 @@
   {=\meta{text}}
   {initially \cs{GetTranslation}\ttbraces{keythms\string_listof\string_title}}
 Defaults to ``List of Theorems'' if English or an unknown language is used.
-Currently French, German, Italian, and Spanish have (likely inaccurate!) translations.
+Currently French, German, Italian, Portuguese, and Spanish have (likely inaccurate!) translations.
 A translation can be added with a GitHub pull request or manually with \cs{DeclareTranslation}\marg{lang}\ttbraces{keythms\string_listof\string_title}\marg{text}.
 \end{docKey}
 

Modified: trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsart-support.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsart-support.tex	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsart-support.tex	2024-09-20 21:23:01 UTC (rev 72331)
@@ -1,7 +1,7 @@
 % Maintained by Matthew Bertucci, 2024-present
 % Please report all issues and feature requests at https://github.com/mbertucci47/keytheorems
 % This work is licensed under the LPPL version 1.3c or later: https://www.latex-project.org/lppl.txt
-\ProvidesExplFile{keythms-amsart-support}{2024-09-16}{0.1.2}
+\ProvidesExplFile{keythms-amsart-support}{2024-09-19}{0.1.3}
   {keytheorems~support~for~the~amsart~class}
 
 \__keythms_support_AMSshared_code:
@@ -20,6 +20,7 @@
         postheadspace = .5em,
         notefont      = \@acmplainnotefont,
         notebraces    = {(}{)},
+        noteseparator = {~},
         headstyle     = \keythms_thmstyle_headcmd_default:nnn{#1}{#2}{#3},
       }
     \keys_define:nn { keytheorems/thmstyle }
@@ -47,6 +48,7 @@
         postheadspace = 5pt plus 1pt minus 1pt,
         notefont      = \fontseries\mddefault\upshape,
         notebraces    = {(}{)},
+        noteseparator = {~},
         headstyle     = \keythms_thmstyle_headcmd_default:nnn{#1}{#2}{#3},
       }
   }

Modified: trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsbook-support.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsbook-support.tex	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsbook-support.tex	2024-09-20 21:23:01 UTC (rev 72331)
@@ -1,7 +1,7 @@
 % Maintained by Matthew Bertucci, 2024-present
 % Please report all issues and feature requests at https://github.com/mbertucci47/keytheorems
 % This work is licensed under the LPPL version 1.3c or later: https://www.latex-project.org/lppl.txt
-\ProvidesExplFile{keythms-amsbook-support}{2024-09-16}{0.1.2}
+\ProvidesExplFile{keythms-amsbook-support}{2024-09-19}{0.1.3}
   {keytheorems~support~for~the~amsbook~class}
 
 \__keythms_support_AMSshared_code:
@@ -17,6 +17,7 @@
     postheadspace = 5pt plus 1pt minus 1pt,
     notefont      = \fontseries\mddefault\upshape,
     notebraces    = {(}{)},
+    noteseparator = {~},
     headstyle     = \keythms_thmstyle_headcmd_default:nnn{#1}{#2}{#3},
   }
 

Modified: trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsproc-support.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsproc-support.tex	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-amsproc-support.tex	2024-09-20 21:23:01 UTC (rev 72331)
@@ -1,7 +1,7 @@
 % Maintained by Matthew Bertucci, 2024-present
 % Please report all issues and feature requests at https://github.com/mbertucci47/keytheorems
 % This work is licensed under the LPPL version 1.3c or later: https://www.latex-project.org/lppl.txt
-\ProvidesExplFile{keythms-amsproc-support}{2024-09-16}{0.1.2}
+\ProvidesExplFile{keythms-amsproc-support}{2024-09-19}{0.1.3}
   {keytheorems~support~for~the~amsproc~class}
 
 \__keythms_support_AMSshared_code:
@@ -17,6 +17,7 @@
     postheadspace = 5pt plus 1pt minus 1pt,
     notefont      = \fontseries\mddefault\upshape,
     notebraces    = {(}{)},
+    noteseparator = {~},
     headstyle     = \keythms_thmstyle_headcmd_default:nnn{#1}{#2}{#3},
   }
 

Modified: trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-memoir-support.tex
===================================================================
--- trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-memoir-support.tex	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/tex/latex/keytheorems/class-support/keythms-memoir-support.tex	2024-09-20 21:23:01 UTC (rev 72331)
@@ -1,7 +1,7 @@
 % Maintained by Matthew Bertucci, 2024-present
 % Please report all issues and feature requests at https://github.com/mbertucci47/keytheorems
 % This work is licensed under the LPPL version 1.3c or later: https://www.latex-project.org/lppl.txt
-\ProvidesExplFile{keythms-memoir-support}{2024-09-16}{0.1.2}
+\ProvidesExplFile{keythms-memoir-support}{2024-09-19}{0.1.3}
   {keytheorems~support~for~the~memoir~class}
 
 \bool_new:N \l__keythms_support_titlecode_bool

Modified: trunk/Master/texmf-dist/tex/latex/keytheorems/keytheorems.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/keytheorems/keytheorems.sty	2024-09-20 21:22:53 UTC (rev 72330)
+++ trunk/Master/texmf-dist/tex/latex/keytheorems/keytheorems.sty	2024-09-20 21:23:01 UTC (rev 72331)
@@ -2,7 +2,7 @@
 % Please report all issues and feature requests at https://github.com/mbertucci47/keytheorems
 % This work is licensed under the LPPL version 1.3c or later: https://www.latex-project.org/lppl.txt
 \NeedsTeXFormat{LaTeX2e}[2023-06-01]
-\ProvidesExplPackage{keytheorems}{2024-09-16}{0.1.2}{l3keys interface to amsthm}
+\ProvidesExplPackage{keytheorems}{2024-09-19}{0.1.3}{l3keys interface to amsthm}
 
 \IfFormatAtLeastTF { 2024-06-01 } { }
   {
@@ -10,6 +10,7 @@
     \cs_generate_variant:Nn \cs_set:Npn { Npe }
     \cs_generate_variant:Nn \iow_shipout:Nn { Ne }
     \cs_generate_variant:Nn \keys_set:nn { ne }
+    \cs_generate_variant:Nn \msg_warning:nnn { nne }
     \cs_generate_variant:Nn \tl_put_right:Nn { Ne }
     \ProvideDocumentCommand \IfPackageLoadedT { m m }
       { \IfPackageLoadedTF{#1}{#2}{ } }
@@ -45,6 +46,25 @@
     Try~compiling~again.~If~that~doesn't~work,~
     check~the~spelling~of~'#1'.
   }
+\msg_new:nnn { keytheorems } { no-prop-for-stored-theorem }
+  {
+    No~property~'#1'~found~for~stored~theorem~'#2'.
+  }
+\msg_new:nnn { keytheorems } { store-reversed-not-got }
+  {
+    'store*=#1'~only~makes~sense~if~you've~called~\protect\getkeytheorem{#1}.~
+    Check~that~\protect\getkeytheorem{#1}~is~called~and~compile~again.
+  }
+\msg_new:nnn { keytheorems } { restate-body-never-got }
+  {
+    With~'store*=#1',~\protect\getkeytheorem[body]{#1}~only~makes~sense~if~
+    \protect\getkeytheorem{#1}~has~been~called.~
+    Check~that~\protect\getkeytheorem{#1}~is~called~and~compile~again.
+  }
+\msg_new:nnn { keytheorems } { store-reversed-called-twice }
+  {
+    With~'store*=#1',~\protect\getkeytheorem{#1}~can~be~called~only~once.
+  }
 \msg_new:nnn { keytheorems } { undefined-thm-hook }
   {
     No~theorem~hook~'#1'.~Check~the~spelling.~
@@ -116,6 +136,7 @@
 \tl_new:N \l__keythms_thmstyle_rnotebrace_tl
 \tl_new:N \l__keythms_thmuse_envname_tl
 \tl_new:N \g__keythms_thmuse_temprestatedata_tl
+\tl_new:N \g__keythms_thmuse_temprestatedatareversed_tl
 
 \newcounter{keythms_restate_dummyctr}
 \cs_gset:Npn \theHkeythms_restate_dummyctr
@@ -133,19 +154,6 @@
 \cs_generate_variant:Nn \hook_gput_code:nnn { nnV }
 \cs_generate_variant:Nn \keys_precompile:nnN { nv, nVc }
 
-% for detecting AMS classes
-\prg_new_conditional:Npnn \keythms_if_amsclass: { T, TF }
-  {
-    \IfClassLoadedTF { amsart } { \prg_return_true: }
-      {
-        \IfClassLoadedTF { amsbook } { \prg_return_true: }
-          {
-            \IfClassLoadedTF { amsproc } { \prg_return_true: }
-              { \prg_return_false: }
-          }
-      }
-  }
-
 %%%%%%%%%%%%%%
 %%% Styles %%%
 %%%%%%%%%%%%%%
@@ -187,6 +195,7 @@
     break         .value_forbidden:n = true,
     notefont      .tl_set:N = \l__keythms_thmstyle_notefont_tl,
     notebraces    .code:n   = \exp_after:wN \__keythms_thmstyle_setbraces:nn #1,
+    noteseparator .tl_set:N = \l__keythms_thmstyle_noteseparator_tl,
     headstyle     .choice:,
     headstyle / margin .code:n =
       {
@@ -240,7 +249,8 @@
 \cs_new:Npn \NOTE
   {
     \keythms_thmstyle_thmnote:n
-      { ~ \group_begin: % group so notefont doesn't affect headpunct
+      { \exp_not:V \l__keythms_thmstyle_noteseparator_tl
+        \group_begin: % group so notefont doesn't affect headpunct
         \exp_not:V \l__keythms_thmstyle_notefont_tl
         \l__keythms_thmstyle_lnotebrace_tl ##3 \l__keythms_thmstyle_rnotebrace_tl
         \group_end:
@@ -250,11 +260,10 @@
 \cs_new:Npn \keythms_thmstyle_headcmd_default:nnn #1#2#3
   {
     \keythms_thmstyle_thmname:n { #1 }
-    \keythms_thmstyle_thmnumber:n
-      { \tl_if_empty:nF { #1 } { ~ } \exp_not:N \textup { #2 } }
-      % ^ this \tl_if_empty has no effect...
+    \keythms_thmstyle_thmnumber:n { ~ \textup { #2 } }
     \keythms_thmstyle_thmnote:n
-      { ~ \group_begin: % group so notefont doesn't affect headpunct
+      { \exp_not:V \l__keythms_thmstyle_noteseparator_tl
+        \group_begin: % group so notefont doesn't affect headpunct
         \exp_not:V \l__keythms_thmstyle_notefont_tl
         \l__keythms_thmstyle_lnotebrace_tl #3 \l__keythms_thmstyle_rnotebrace_tl
         \group_end:
@@ -278,6 +287,7 @@
     postheadspace = 5pt plus 1pt minus 1pt,
     notefont      = \fontseries\mddefault\upshape,
     notebraces    = {(}{)},
+    noteseparator = {~},
     headstyle     = \keythms_thmstyle_headcmd_default:nnn{#1}{#2}{#3},
   }
 
@@ -824,6 +834,8 @@
     %store      .default:n = \q_no_value, % ={name} causes issues
     restate    .meta:n   = { store = #1 },
     % ^ thmtools compatibility
+    store*   .tl_set:N = \l__keythms_thmuse_storereversed_tl,
+    restate* .meta:n   = { store* = #1 },
     listhack   .choice:, % need equals sign
     listhack / true .code:n = \bool_set_true:N \l__keythms_thmuse_listhack_bool,
     listhack / false .code:n = \bool_set_false:N \l__keythms_thmuse_listhack_bool,
@@ -856,6 +868,68 @@
         \__keythms_thm_postfoot_code:n { #1 }
       }
       {}
+    \DeclareDocumentEnvironment { keythms_grabreversed_#1 } { m O{} +b }
+      { % ##1 = keys, ##2 = note, ##3 = theorem body
+        \tl_if_exist:cTF
+          { c__keythms_storeatbegin_ \l__keythms_thmuse_storereversed_tl _restatecounters_tl }
+          {
+            \bool_set_true:N \l__keythms_thmuse_restating_bool
+            \exp_args:NNe \prop_set_from_keyval:Nn \l__keythms_restate_counters_prop
+              { \tl_use:c { c__keythms_storeatbegin_ \l__keythms_thmuse_storereversed_tl _restatecounters_tl } }
+            \prop_map_inline:Nn \l__keythms_restate_counters_prop
+              {
+                \tl_set:ce { l_keythms_restate_current_####1_tl }
+                  { \the\value{####1} }
+                \setcounter { ####1 } { ####2 }
+                % ^ FIX: what if eq's numbered by section, theorem, etc.? The
+                %        thmtools code is opaque.... Or maybe should be up to the
+                %        user to say "restate-counters={section,chapter,...}".
+                \cs_set:cpn { theH ####1 }
+                  { \use:c { the ####1 } . \theHkeythms_restate_dummyctr }
+              }
+            \tl_if_empty:cTF
+              { c__keythms_storeatbegin_ \l__keythms_thmuse_storereversed_tl _label_tl }
+              { \refstepcounter{keythms_restate_dummyctr} } % for unnumbered theorems
+              {
+                \cs_set:cpn { the #1 }
+                  { \tl_use:c { c__keythms_storeatbegin_ \l__keythms_thmuse_storereversed_tl _label_tl } }
+                \cs_set_eq:cN { c@ #1 } \c at keythms_restate_dummyctr
+                \cs_set_eq:cN { theH #1 } \theHkeythms_restate_dummyctr
+                % ^ why are the last two lines here? We shouldn't be referencing
+                %   restated theorems. Think it's a remnant of thmtools
+                % WRONG: needed to make numbering correct after restated theorem.
+                % not sure about theH. <- this is needed to prevent duplicate anchors
+              }
+           }
+           {
+             \msg_warning:nne { keytheorems } { store-reversed-not-got }
+               { \l__keythms_thmuse_storereversed_tl }
+           }
+        \renewcommand\label[2][]{} % disable \label (opt arg in case cleveref loaded)
+        \cs_set_eq:NN \ltx at label \use_none:n % disable \ltx at label
+        \cs_set_eq:NN \property_record:nn \use_none:nn % disable \RecordProperties
+        \cs_set_eq:NN \setuniqmark \use_none:n % work with numbered=unless-unique
+        % QUESTION: also disable \hyper@@anchor? \MakeLinkTarget?
+        \hook_use:n { keytheorems/#1/restated }
+        \hook_use:n { keytheorems/allthms/restated }
+        \__keythms_thm_prehead_code:n { #1 }
+        \begin{keythms_orig_#1}[{##2}]
+        \__keythms_thm_posthead_code:n { #1 }
+        % below needs to come after posthead so that correct \@currentHref
+        % is stored for tcolorbox theorems
+        \__keythms_thm_addstoredreverseddata:nnn { #1 } { ##1 } { ##3 }
+        \__keythms_thm_tempstorerestatedatareversed:nnn { #1 } { ##1 } { ##3 }
+        ##3
+        \__keythms_thm_prefoot_code:n { #1 }
+        \end{keythms_orig_#1}
+        \__keythms_thm_postfoot_code:n { #1 }
+        \prop_map_inline:Nn \l__keythms_restate_counters_prop
+          {
+            \exp_args:Nnc \setcounter { ####1 }
+              { l_keythms_restate_current_####1_tl }
+          }
+      }
+      { }
       % NOTE: have to do a lot of shenanigans to make sure the begin/end of grabbed
       %       theorem env captures only the body and no package code.
       %       This is the price of on-the-fly redefining the env to grab body
@@ -870,6 +944,14 @@
               \cs_set_eq:NN \__keythms_withhooks_begin:nnV \__keythms_grab_begin:nnV
               \cs_set_eq:NN \__keythms_withhooks_end:n \__keythms_grab_end:n
             }
+          \tl_if_empty:NF \l__keythms_thmuse_storereversed_tl
+            {
+              \bool_gset_true:N \g__keythms_listof_writefile_bool
+              \cs_set_eq:NN \__keythms_withhooks_begin:nn \__keythms_grabreversed_begin:nn
+              \cs_set_eq:NN \__keythms_withhooks_begin:nnn \__keythms_grabreversed_begin:nnn
+              \cs_set_eq:NN \__keythms_withhooks_begin:nnV \__keythms_grabreversed_begin:nnV
+              \cs_set_eq:NN \__keythms_withhooks_end:n \__keythms_grabreversed_end:n
+            }
           \__keythms_thm_prehead_continues_code:n { #1 }
           \tl_if_empty:NTF \l__keythms_thmuse_note_tl
             { \__keythms_withhooks_begin:nn { #1 } { ##1 } }
@@ -903,6 +985,26 @@
                     }
                 }
             }
+          \tl_if_empty:NF \l__keythms_thmuse_storereversed_tl
+            {
+              \cs_if_exist:cF
+                { __keythms_getthm_ \l__keythms_thmuse_storereversed_tl _theorem }
+                {
+                  \cs_new:cpe
+                    { __keythms_getthm_ \l__keythms_thmuse_storereversed_tl _theorem }
+                    {
+                      \exp_not:N \__keythms_getthmreversed_theorem:nnn
+                      \exp_not:o { \g__keythms_thmuse_temprestatedatareversed_tl }
+                    }
+                  \cs_new:cpn
+                    { __keythms_getthm_ \l__keythms_thmuse_storereversed_tl _body }
+                    {
+                      \textbf{??}
+                      \msg_warning:nnn { keytheorems } { restate-body-never-got }
+                        { #1 }
+                    }
+                }
+      }
         }
   }
 \cs_new:Npn \__keythms_use_iii_v_braced:nnnnn #1#2#3#4#5 { {#3}{#5} }
@@ -941,6 +1043,18 @@
 \cs_generate_variant:Nn \__keythms_grab_begin:nnn { nnV }
 \cs_new_protected:Npn \__keythms_grab_end:n #1 { \end{keythms_grab_#1} }
 
+\cs_new_protected:Npn \__keythms_grabreversed_begin:nn #1#2
+  { % #1 = theorem name, #2 = keys
+    \begin{keythms_grabreversed_#1}{#2}
+  }
+\cs_new_protected:Npn \__keythms_grabreversed_begin:nnn #1#2#3
+  { % #1 = theorem name, #2 = keys, #3 = note
+    \begin{keythms_grabreversed_#1}{#2}[{#3}]
+  }
+\cs_generate_variant:Nn \__keythms_grabreversed_begin:nnn { nnV }
+\cs_new_protected:Npn \__keythms_grabreversed_end:n #1
+  { \end{keythms_grabreversed_#1} }
+
 \cs_new_protected:Npn \__keythms_orig_begin:n #1 { \begin{keythms_orig_#1} }
 \cs_new_protected:Npn \__keythms_orig_begin:nn #1#2
   { \begin{keythms_orig_#1}[{#2}] }
@@ -1016,6 +1130,19 @@
           }
       }
   }
+\cs_new_protected:Npn \__keythms_thm_addstoredreverseddata:nnn #1#2#3
+  {
+    \iow_shipout:Ne \@auxout
+      {
+        \exp_not:N \@writefile { thlist }
+          {
+            \KeyThmsSavedTheoremReversed { \l__keythms_thmuse_storereversed_tl }
+              { #1 }
+              { \exp_not:n { #2 } }
+              { \exp_not:n { #3 } }
+          }
+      }
+  }
 \cs_new_protected:Npn \__keythms_thm_tempstorerestatedata:nnn #1#2#3
   { % #1 = theorem name, #2 = keys, #3 = body
     \tl_gset:Ne \g__keythms_thmuse_temprestatedata_tl % needs to be global to get out of env
@@ -1027,7 +1154,15 @@
         { \exp_not:n { #3 } } % with \text_expand:n ?
       }
   }
-
+\cs_new_protected:Npn \__keythms_thm_tempstorerestatedatareversed:nnn #1#2#3
+  {
+    \tl_gset:Ne \g__keythms_thmuse_temprestatedatareversed_tl % needs to be global to get out of env
+      {
+        { #1 }
+        { \exp_not:n { #2 } }
+        { \exp_not:n { #3 } }
+      }
+  }
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %%% Retrieving Theorem Data %%%
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1034,11 +1169,14 @@
 
 \cs_new_protected:Npn \KeyThmsSavedTheorem #1#2#3#4#5#6#7 % 7th arg is body
   { \use:c { __keythms_thmitem_#1:nnnnnn } {#2}{#3}{#4}{#5}{#6}{#7} }
+\cs_new_protected:Npn \KeyThmsSavedTheoremReversed #1#2#3#4 { } % gobble by default
 
 \keys_define:nn { keytheorems/storeatbegin }
   {
     store   .tl_set:N = \l__keythms_storeatbegin_store_tl,
     restate .meta:n   = { store=#1 },
+    store*   .tl_set:N = \l__keythms_storeatbegin_storereversed_tl,
+    restate* .meta:n   = { store*=#1 },
     unknown .code:n   = { } % do nothing with unknown keys
   }
 
@@ -1085,8 +1223,39 @@
                 \__keythms_getthm_body:nn {#5}{#7}
               }
           }
+        \tl_if_empty:NF \l__keythms_storeatbegin_storereversed_tl
+          {
+            \tl_const:cn
+              { c__keythms_storeatbegin_ \l__keythms_storeatbegin_storereversed_tl _label_tl }
+              { #2 }
+            \tl_const:cn
+              { c__keythms_storeatbegin_ \l__keythms_storeatbegin_storereversed_tl _restatecounters_tl }
+              { #5 }
+            \cs_new_protected:cpn
+              { __keythms_getthm_ \l__keythms_storeatbegin_storereversed_tl _body }
+              {
+                \__keythms_getthm_body:nn {#5}{#7}
+              }
+          }
         \group_end:
       }
+    \cs_set_protected:Npn \KeyThmsSavedTheoremReversed #1#2#3#4
+      {
+        \bool_new:c { g__keythms_restate_#1_called_bool }
+        \cs_gset:cpn { __keythms_getthm_ #1 _theorem }
+          { \__keythms_getthmreversed_theorem:nnn { #2 } { #3 } { #4 } }
+        \hook_gput_code:nnn { begindocument/end } { . }
+          {
+            \cs_if_exist:cF { __keythms_getthm_ #1 _body }
+              {
+                \cs_new_protected:cpn { __keythms_getthm_ #1 _body }
+                  {
+                    \textbf{??}
+                    \msg_warning:nnn { keytheorems } { restate-body-never-got } { #1 }
+                  }
+              }
+          }
+      }
     \file_if_exist_input:n { \c_sys_jobname_str.thlist }
     \group_end:
   }
@@ -1098,6 +1267,8 @@
       { \prg_return_false: }
   }
 \NewDocumentCommand \IfRestatingTF { } { \keythms_if_restating:TF }
+\NewDocumentCommand \IfRestatingT { } { \keythms_if_restating:T }
+\NewDocumentCommand \IfRestatingF { } { \keythms_if_restating:F }
 
 \cs_new_protected:Npn \__keythms_getthm_theorem:nnnnn #1#2#3#4#5
   { % #1 = name, #2 = number, #3 = restate counters, #4 = keys, #5 = theorem body
@@ -1111,7 +1282,8 @@
         % ^ FIX: what if eq's numbered by section, theorem, etc.? The
         %        thmtools code is opaque.... Or maybe should be up to the
         %        user to say "restate-counters={section,chapter,...}".
-        \cs_set:cpn { theH ##1 } { \use:c { the ##1 } . \theHkeythms_restate_dummyctr }
+        \cs_set:cpn { theH ##1 }
+          { \use:c { the ##1 } . \theHkeythms_restate_dummyctr }
       }
     \tl_if_empty:nTF { #2 }
       { \refstepcounter{keythms_restate_dummyctr} } % for unnumbered theorems
@@ -1162,7 +1334,8 @@
         % ^ FIX: what if eq's numbered by section, theorem, etc.? The
         %        thmtools code is opaque.... Or maybe should be up to the
         %        user to say "restate-counters={section,chapter,...}".
-        \cs_set:cpn { theH ##1 } { \use:c { the ##1 } . \theHkeythms_restate_dummyctr }
+        \cs_set:cpn { theH ##1 }
+          { \use:c { the ##1 } . \theHkeythms_restate_dummyctr }
       }
     \refstepcounter{keythms_restate_dummyctr}
     \renewcommand\label[2][]{} % disable \label (opt arg in case cleveref loaded)
@@ -1179,18 +1352,79 @@
     \group_end:
   }
 
+\cs_new_protected:Npn \__keythms_getthmreversed_theorem:nnn #1#2#3
+  { % #1 = envname, #2 = keys, #3 = theorem body
+    \group_begin:
+    \bool_set_false:N \l__keythms_thmuse_restating_bool
+    \keys_set:nn { keytheorems/thmuse } { #2 }
+    \__keythms_thm_prehead_continues_code:n { #1 }
+    \__keythms_thm_prehead_code:n { #1 }
+    \tl_if_empty:NTF \l__keythms_thmuse_note_tl
+      { \__keythms_orig_begin:n { #1 } }
+      { \__keythms_orig_begin:nV { #1 } \l__keythms_thmuse_note_tl }
+    \clist_map_inline:Nn \g__keythms_restatecounters_clist
+      {
+        \prop_gput:Nne \g__keythms_thmuse_othercounters_prop { ##1 }
+          { \the\value{##1} }
+      }
+    \__keythms_thm_posthead_code:n { #1 }
+    \__keythms_thm_addcontentsdata:nnnn { #1 }
+      { \prop_to_keyval:N \g__keythms_thmuse_othercounters_prop }
+      { #2 } { #3 }
+    \__keythms_thm_tempstorerestatedata:nnn { #1 } { #2 } { #3 } % for defining getthm_body
+    #3
+    \__keythms_thm_prefoot_code:n { #1 }
+    \__keythms_orig_end:n { #1 }
+    \__keythms_thm_postfoot_code:n { #1 }
+    % While we're here, define getthm_body
+    \cs_if_exist:cF
+      { __keythms_getthm_ \l__keythms_thmuse_storereversed_tl _body }
+      {
+        \cs_new:cpe
+          { __keythms_getthm_ \l__keythms_thmuse_storereversed_tl _body }
+          {
+            \exp_not:N \__keythms_getthm_body:nn
+            \exp_args:No \exp_not:o
+              {
+                \exp_after:wN \__keythms_use_iii_v_braced:nnnnn
+                  \g__keythms_thmuse_temprestatedata_tl
+              }
+          }
+      }
+    \bool_gset_true:c
+      { g__keythms_restate_ \l__keythms_thmuse_storereversed_tl _called_bool }
+    \group_end:
+  }
+
 % \getkeytheorem[<property>]{<tag>}
-\NewDocumentCommand \getkeytheorem { o m }
+\NewDocumentCommand \getkeytheorem { O{theorem} m }
   {
-    \cs_if_exist:cTF { __keythms_getthm_#2_theorem }
+    \cs_if_exist:cTF { __keythms_getthm_#2_#1 }
       {
-        \IfNoValueTF { #1 }
-          { \use:c { __keythms_getthm_#2_theorem } }
+        \bool_if_exist:cTF { g__keythms_restate_#2_called_bool }
+          {
+            \str_if_eq:nnTF { #1 } { theorem }
+              {
+                \bool_if:cTF
+                  { g__keythms_restate_#2_called_bool }
+                  {
+                    \msg_error:nnn { keytheorems }
+                      { store-reversed-called-twice } { #2 }
+                  }
+                  { \use:c { __keythms_getthm_#2_#1 } }
+              }
+              { \use:c { __keythms_getthm_#2_#1 } }
+          }
           { \use:c { __keythms_getthm_#2_#1 } }
       }
       {
         \textbf{??}
-        \msg_warning:nnn { keytheorems } { no-stored-theorem } { #2 }
+        \cs_if_exist:cTF { __keythms_getthm_#2_theorem }
+          {
+            \msg_warning:nnnn { keytheorems } { no-prop-for-stored-theorem }
+              { #1 } { #2 } % should this be an error?
+          }
+          { \msg_warning:nnn { keytheorems } { no-stored-theorem } { #2 } }
       }
   }
 
@@ -1199,13 +1433,11 @@
 %%%%%%%%%%%%%%%%%%%%%
 
 %%% \addtotheoremhook[<envname>]{<hook>}{<code>}
-\NewDocumentCommand \addtotheoremhook { o m +m }
+\NewDocumentCommand \addtotheoremhook { O{allthms} m +m }
   {
     \__hook_if_declared:nTF { keytheorems/allthms/#2 }
       {
-        \IfNoValueTF { #1 }
-          { \hook_gput_code:nnn { keytheorems/allthms/#2 } { . } { #3 } }
-          { \hook_gput_code:nnn { keytheorems/#1/#2 } { . } { #3 } }
+        \hook_gput_code:nnn { keytheorems/#1/#2 } { . } { #3 }
       }
       {
         \msg_error:nnn { keytheorems } { undefined-thm-hook } { #2 }
@@ -1577,7 +1809,8 @@
       {
         \cs_set_protected:Npn \keythms_listof_chaptervspacehack:
           {
-            \int_compare:nNnF { \value{chapter} } = { \g_keythms_listof_prevchapter_int }
+            \int_compare:nNnF
+              { \value{chapter} } = { \g_keythms_listof_prevchapter_int }
               {
                 \addtocontents{ thlist }
                   {
@@ -1665,7 +1898,7 @@
 
 \cs_new_protected:Npn \__keythms_overload_code:
   {
-    \RenewDocumentCommand { \newtheorem } { smomo }
+    \RenewDocumentCommand { \newtheorem } { s m o m o }
       {
         \IfBooleanTF { ##1 }
           { \keythms_thm_newkeythm:nn { ##2 } { name=##4, numbered=no } }
@@ -1708,42 +1941,41 @@
           }
       }
     \ProvideDocumentCommand { \listoftheorems } { } { \listofkeytheorems }
-    \ProvideDocumentCommand { \addtotheorempreheadhook } { o m }
+    \ProvideDocumentCommand { \addtotheorempreheadhook } { O{allthms} m }
       {
-        \IfNoValueTF { ##1 }
-          { \addtotheoremhook { prehead } { ##2 } }
-          { \addtotheoremhook [ ##1 ] { prehead } { ##2 } }
+        \addtotheoremhook [ ##1 ] { prehead } { ##2 }
       }
-    \ProvideDocumentCommand { \addtotheorempostheadhook } { o m }
+    \ProvideDocumentCommand { \addtotheorempostheadhook } { O{allthms} m }
       {
-        \IfNoValueTF { ##1 }
-          { \addtotheoremhook { posthead } { ##2 } }
-          { \addtotheoremhook [ ##1 ] { posthead } { ##2 } }
+        \addtotheoremhook [ ##1 ] { posthead } { ##2 }
       }
-    \ProvideDocumentCommand { \addtotheoremprefoothook } { o m }
+    \ProvideDocumentCommand { \addtotheoremprefoothook } { O{allthms} m }
       {
-        \IfNoValueTF { ##1 }
-          { \addtotheoremhook { prefoot } { ##2 } }
-          { \addtotheoremhook [ ##1 ] { prefoot } { ##2 } }
+        \addtotheoremhook [ ##1 ] { prefoot } { ##2 }
       }
-    \ProvideDocumentCommand { \addtotheorempostfoothook } { o m }
+    \ProvideDocumentCommand { \addtotheorempostfoothook } { O{allthms} m }
       {
-        \IfNoValueTF { ##1 }
-          { \addtotheoremhook { postfoot } { ##2 } }
-          { \addtotheoremhook [ ##1 ] { postfoot } { ##2 } }
+        \addtotheoremhook [ ##1 ] { postfoot } { ##2 }
       }
     \clist_new:N \l__keythms_tcbshaded_keys_clist
     \clist_new:N \l__keythms_tcbthmbox_keys_clist
     \keys_define:nn { keytheorems/thm/shaded }
       {
-        textwidth   .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { width=##1 },
-        bgcolor     .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { colback=##1 },
-        rulewidth   .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { boxrule=##1 },
-        rulecolor   .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { colframe=##1 },
-        margin      .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { boxsep=##1 },
+        textwidth   .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { width=##1 },
+        bgcolor     .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { colback=##1 },
+        rulewidth   .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { boxrule=##1 },
+        rulecolor   .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { colframe=##1 },
+        margin      .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { boxsep=##1 },
         padding     .meta:n = { margin=##1 },
-        leftmargin  .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { left~skip=##1 },
-        rightmargin .code:n = \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { right~skip=##1 },
+        leftmargin  .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { left~skip=##1 },
+        rightmargin .code:n =
+          \clist_put_right:Nn \l__keythms_tcbshaded_keys_clist { right~skip=##1 },
       }
     \keys_define:nn { keytheorems/thm/thmbox }
       {
@@ -2013,6 +2245,11 @@
         thmbox .default:n = M,
         mdframed .code:n = \msg_error:nn { keytheorems } { mdframed-undefined },
       }
+    \keys_define:nn { keytheorems/thmstyle }
+      {
+        shaded .code:n = \keythms_thmstyle_savethmkey_optval:n { ##1 },
+        thmbox .code:n = \keythms_thmstyle_savethmkey_optval:n { ##1 },
+      }
   }
 
 \cs_new_protected:Npn \__keythms_storeall_code:
@@ -2040,6 +2277,8 @@
         \ProvideTranslation { Italian } { keythms_continues } { continua~da~p.\, }
         \ProvideTranslation { Spanish } { keythms_listof_title } { Lista~de~teoremas }
         \ProvideTranslation { Spanish } { keythms_continues } { continúa~de~la~p.\, }
+        \ProvideTranslation { Portuguese } { keythms_listof_title } { Lista~de~teoremas }
+        \ProvideTranslation { Portuguese } { keythms_continues } { continua~da~p.\, }
       }
   }
 



More information about the tex-live-commits mailing list.