打印所有定理

打印所有定理
\documentclass[french]{book}
\usepackage[french]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}

\begin{document}
{

\newtheorem{theorem}{Théorème}
\newtheorem*{theorem*}{Théorème}
\newtheorem{proposition}[theorem]{Proposition}
\newtheorem{corollary}[theorem]{Corollaire}
\newtheorem{lemma}[theorem]{Lemme}

\chapter{Pomme}
Bonjour
\begin{theorem}
Si alors
\end{theorem}

Bonjour
\begin{theorem*}
Ssi
\end{theorem*}

\begin{theorem}
$\Rightarrow$
\end{theorem}



\chapter{Banane}
\begin{corollary}
Donc
\end{corollary}

\begin{lemma}
Ainsi
\end{lemma}

\chapter*{Théorèmes}
%Reprint all the theorems here

\end{document}

我怎样才能第二次打印所有定理?

答案1

使用代码https://tex.stackexchange.com/a/474095/4427(已修正)

\documentclass[a4paper]{book}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}

\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{exercise}

\ExplSyntaxOn

\NewDocumentCommand{\newtheoremx}{smomo}
 {
  \IfBooleanTF{#1}
   {
    \printthm_nonumber:nn { #2 } { #4 }
   }
   {
    \printthm_number:nnnn { #2 } { #3 } { #4 } { #5 }
   }
 }

\cs_new_protected:Nn \printthm_nonumber:nn
 {
  \newtheorem*{#1@inner}{#2}
  \NewDocumentEnvironment{#1}{o+b}
   {
    % start the inner environment (without or with optional argument)
    \tl_if_novalue:nTF { ##1 }
     { \begin{#1@inner} }
     { \begin{#1@inner}[##1] }
    % typeset the statement
    ##2
    % end the inner environment
    \end{#1@inner}
    % store the statement in a sequence variable, actually as
    % four arguments as shown
    \seq_gput_right:Nx \g_riccardo_theorems_seq
     {
      *
      { #1 } % name
      { } % number
      \tl_if_novalue:nF { ##1 } { [\exp_not:n {##1}] } % attribution
      { \exp_not:n { ##2 } } % body
     }
   }{}
 }

\cs_new_protected:Nn \printthm_number:nnnn
 {
  % * Let's duplicate the working of \newtheorem; \newtheoremx should
  %   be used for theorems that need to be listed
  % * \newtheoremx{theorem}{Theorem} will actually do
  %   \newtheorem{theorem@inner}{Theorem} (honoring the usual optional arguments)
  % * We also need a property list to store along with the theorem
  %   the one which it is subordinate to
  \tl_if_novalue:nTF { #2 }
   {
    \tl_if_novalue:nTF { #4 }
     {
      \newtheorem{#1@inner}{#3}
     }
     {
      \newtheorem{#1@inner}{#3}[#4]
     }
    % #1 is not subordinate, store the name itself
    \prop_gput:Nnn \g_riccardo_theorems_prop { #1 } { #1 }
    \seq_gput_right:Nn \g_riccardo_theorems_counters_seq { #1 }
   }
   {
    \newtheorem{#1@inner}[#2@inner]{#3}
    % #1 is subordinate to #2
    \prop_gput:Nnn \g_riccardo_theorems_prop { #1 } { #2 }
   }
  % define a "grabbing" environment #1 with the usual features 
  \NewDocumentEnvironment{#1}{o+b}
   {
    % start the inner environment (without or with optional argument)
    \tl_if_novalue:nTF { ##1 }
     { \begin{#1@inner} }
     { \begin{#1@inner}[##1] }
    % save the statement number
    \tl_gset:Nx \g__riccardo_theorems_number_tl { \use:c {@currentlabel} }
    % typeset the statement
    ##2
    % end the inner environment
    \end{#1@inner}
    % store the statement in a sequence variable, actually as
    % four arguments as shown
    \seq_gput_right:Nx \g_riccardo_theorems_seq
     {
      { #1 } % name
      { \g__riccardo_theorems_number_tl } % number
      \IfValueT{##1}{ [\exp_not:n { ##1 }] } % attribution
      { \exp_not:n { ##2 } } % body
     }
   }{}
 }

% allocate the needed variables
\prop_new:N \g_riccardo_theorems_prop
\seq_new:N \g_riccardo_theorems_seq
\tl_new:N \g__riccardo_theorems_number_tl
\iow_new:N \g_riccardo_theorems_stream
\seq_new:N \g_riccardo_theorems_counters_seq

% print the stored theorems
\NewDocumentCommand{\printtheorems}{}
 {
  % we need a group where nullifying the action of \label
  \group_begin:
  \cs_set_eq:NN \label \use_none:n
  % map the sequence, passing each item to the function that prints a theorem
  \file_if_exist_input:n { \c_sys_jobname_str.thl }
  % end the group
  \group_end:
  \seq_map_inline:Nn \g_riccardo_theorems_counters_seq
   {
    \setcounter{##1@inner}{0}
   }
 }

\cs_new_protected:Nn \riccardo_theorems_save:
 {
  \seq_map_function:NN \g_riccardo_theorems_seq \__riccardo_theorems_save:n
 }
\cs_new_protected:Nn \__riccardo_theorems_save:n
 {
  \iow_now:Nn \g_riccardo_theorems_stream
   {
    \savedtheorem #1
   }
 }
\AtEndDocument
 {
  \iow_open:Nn \g_riccardo_theorems_stream { \c_sys_jobname_str.thl }
  \riccardo_theorems_save:
  \iow_close:N \g_riccardo_theorems_stream
 }

\NewDocumentCommand{\savedtheorem}{smmom}
 {
  % redefine \the<statement>@inner to yield the stored number
  % we use the property list to use the correct counter
  % (for instance, in case of "lemma", <statement> will be "theorem"
  \IfBooleanTF{#1}
   {
    \IfNoValueTF{#4}
     {\begin{#2@inner}#5\end{#2@inner}}
     {\begin{#2@inner}[#4]#5\end{#2@inner}}
   }
   {
    \cs_set:cpn { the \prop_item:Nn \g_riccardo_theorems_prop {#2} @inner } { #3 }
    \IfNoValueTF{#4}
     {
      % no attribution
      \begin{#2@inner} #5 \end{#2@inner}
     }
     {
      % attribution
      \begin{#2@inner}[#4] #5 \end{#2@inner}
     }
   }
 }

\ExplSyntaxOff

\newtheoremx{theorem}{Théorème}[chapter]
\newtheoremx*{theorem*}{Théorème}
\newtheoremx{proposition}[theorem]{Proposition}
\newtheoremx{corollary}[theorem]{Corollaire}
\newtheoremx{lemma}[theorem]{Lemme}


\begin{document}

\chapter{Pomme}
Bonjour
\begin{theorem}
Si alors
\end{theorem}

Bonjour
\begin{theorem*}
Ssi
\end{theorem*}

\begin{theorem}[Attribution]
$\Rightarrow$
\end{theorem}



\chapter{Banane}
\begin{corollary}
Donc
\end{corollary}

\begin{lemma}
Ainsi
\end{lemma}

\begin{Exercise}[difficulty=2]
\begin{theorem*}[Théorème de Steiner]Whatever.\end{theorem*}
\end{Exercise}

\chapter*{Théorèmes}

\printtheorems

\end{document}

最后一页:

在此处输入图片描述

相关内容