我想要做的事情听起来很简单:
\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