如何自动重复所有定理?

如何自动重复所有定理?

我想要做的事情听起来很简单:

\begin{thm}
Theorem 1 text.
\end{thm}
...
\begin{thm}
Theorem 2 text.
\end{thm}
...
\RepeaAllThms

这应该像平常一样显示定理,但然后\RepeaAllThms应该在一个地方重新显示它们。

我想创建一个环境来增加一些计数器,根据它创建一个名称(例如,,,thmA... thmB),使用它作为restatable名称,并收集所有这些\RepeaAllThms。出于某种原因,我无法让它工作。这是我的 MNWE(最小不工作示例),定理实际上被称为“建议”:

\documentclass[a4paper]{article}

\usepackage{thmtools}
\usepackage{thm-restate}
\usepackage{etoolbox}

\makeatletter
\def\recommend@tions{}
\newcounter{recommend@cnt}
\declaretheorem[name=Recommendation,numberwithin=section]{thmrecommend}
\newenvironment{recommendation}{%
    \stepcounter{recommend@cnt}%
    \edef\rcmdname{recommend\Alph{recommend@cnt}}%
    \restatable{thmrecommend}{\rcmdname}%
}{\endrestatable%
    %\xappto\recommend@tions{recommend\Alph{recommend@cnt}}%
    recommend\Alph{recommend@cnt}%
    %\csname recommend\Alph{recommend@cnt}* \endcsname%
    \recommendA*
}
\newcommand{\allrecommendations}{\recommend@tions}
\makeatother


\begin{document}

\section{Originals}

Some text.

\begin{recommendation}
This is the first recommendation.
\end{recommendation}

Some text.

\begin{recommendation}
This is the second recommendation.
\end{recommendation}

Some text.

\section{All together}

%\allrecommendations
%\recommendA*
%\recommendB*

\end{document}

\recommendA*我已在环境末尾 添加了以检​​查其是否有效,并且它始终被重新定义为最后一个定理。取消注释\recommendA*\recommendB*会导致我无法理解的错误。

知道怎么做吗?不一定非要用restatable。任何能让我自动重复定理内容的方法都可以。

答案1

您几乎已经完成了。您必须传递到\restatable的完整扩展recommendation\Alph{recommend@cnt},然后将正确的标记附加到\recommend@tions

\documentclass[a4paper]{article}

\usepackage{thmtools}
\usepackage{thm-restate}
\usepackage{etoolbox}

\makeatletter
\def\recommend@tions{}
\newcounter{recommend@cnt}
\declaretheorem[name=Recommendation,numberwithin=section]{thmrecommend}
\newenvironment{recommendation}{%
  \stepcounter{recommend@cnt}%
  % fully expand the counter representation
  % before calling \restatable
  \begingroup\edef\x{\endgroup
    \noexpand\restatable{thmrecommend}{recommend\Alph{recommend@cnt}}%
  }\x
}{\endrestatable
  % add to \recommend@tions the command
  % \recommend<letter>*
  \xappto\recommend@tions{%
    \expandafter\noexpand\csname recommend\Alph{recommend@cnt}\endcsname*%
  }%
}
\newcommand{\allrecommendations}{\recommend@tions}
\makeatother


\begin{document}

\section{Originals}

Some text.

\begin{recommendation}
This is the first recommendation.
\end{recommendation}

Some text.

\begin{recommendation}
This is the second recommendation.
\end{recommendation}

Some text.

\section{All together}

\allrecommendations

\end{document}

在此处输入图片描述

xparse带有和的实现expl3也可以处理可选参数,用于归因。

\documentclass[a4paper]{article}

\usepackage{thmtools}
\usepackage{thm-restate}
\usepackage{xparse}

\declaretheorem[
  name=Recommendation,
  numberwithin=section,
]{thmrecommend}

\ExplSyntaxOn
\NewDocumentEnvironment{recommendation}{o}
 {
  \int_gincr:N \g_vedran_recommendation_int
  \IfNoValueTF{#1}
   {
    \vedran_restatable:x { \int_to_Alph:n { \g_vedran_recommendation_int } }
   }
   {
    \vedran_restatable:nx { #1 } { \int_to_Alph:n { \g_vedran_recommendation_int } }
   }
 }
 {
  \endrestatable
  \seq_gput_right:Nx \g_vedran_recommendation_seq
   {
    recommend \int_to_Alph:n { \g_vedran_recommendation_int }
   }
 }

\NewDocumentCommand{\allrecommendations}{}
 {
  \seq_map_inline:Nn \g_vedran_recommendation_seq
   {
    \use:c { ##1 } *
   }
 }

\int_new:N \g_vedran_recommendation_int
\seq_new:N \g_vedran_recommendation_seq

\cs_new_protected:Npn \vedran_restatable:n #1
 {
  \restatable{thmrecommend}{recommend#1}
 }
\cs_generate_variant:Nn \vedran_restatable:n { x }
\cs_new_protected:Npn \vedran_restatable:nn #1 #2
 {
  \restatable[#1]{thmrecommend}{recommend#2}
 }
\cs_generate_variant:Nn \vedran_restatable:nn { nx }
\ExplSyntaxOff

\begin{document}

\section{Originals}

Some text.

\begin{recommendation}[Egreg]
This is the first recommendation.
\end{recommendation}

Some text.

\begin{recommendation}
This is the second recommendation.
\end{recommendation}

Some text.

\section{All together}

\allrecommendations

\end{document}

在此处输入图片描述

答案2

我认为这是一个扩展问题,因为您正在尝试为可重新启动的建议创建一个依赖于计数器的动态标签。除非被迫,否则 TeX 似乎不喜欢在这样的地方扩展!这有点笨拙,但我使用 \fakerec下面的宏解决了这个问题。

输出如下:

在此处输入图片描述

代码如下:

\documentclass[a4paper]{article}

\usepackage{thmtools}
\usepackage{thm-restate}
\usepackage{etoolbox}

\usepackage{environ}
\newcounter{recommendations}
\renewcommand\therecommendations{\Alph{recommendations}}
\declaretheorem[name=Recommendation,numberwithin=section]{thmrecommend}
\NewEnviron{recommendation}[1][]{%
  \stepcounter{recommendations}% makes the change global
  \edef\fakerec{\noexpand\restatable[#1]{thmrecommend}\therecommendations\BODY}
  \fakerec\endrestatable\relax%
  \typeout{Stated restable for \therecommendations}
  \listxadd\recommendationsList\therecommendations%
}

\newcommand\AllRecommendations{%
  \renewcommand{\do}[1]{\csuse{##1}*}
  \dolistloop\recommendationsList%
}

\begin{document}

  \section{Originals}

  Some text.

  \begin{recommendation}
  This is the first recommendation.
  \end{recommendation}

  Some text.

  \begin{recommendation}
  This is the second recommendation.
  \end{recommendation}

  Some text.

  \section{All together}

  \AllRecommendations

\end{document}

一些评论。首先,我真的很喜欢环境包所以我用它来创建recommendation环境。

正如我上面所说,我使用\fakerec是一种技巧,\therecommendations在传递给 时将其展开\restatable。还需要展开,\BODY因为\restatable会保留推荐内容的副本以供以后使用。如果有更好的方法来做到这一点,我会很高兴。

最后,该\AllRecommendations宏使用了一些来自etoolbox 包。具体来说,环境会创建一个推荐环境名称recommendation列表,然后用于将它们打印出来。\recommendationsList\dolistloop

相关内容