思考这个问题,我想使用 thmtools 的restatable
环境将定理与 csname 中的数字一起存储。这样,人们可以在文档末尾循环遍历它们以重述每一个。我的问题是,thmtools 存储此 csname 的方式似乎阻止了命令的扩展。
这是一个可行的例子。\somecmd
遍历计数器并将其参数存储在cmd-1
、cmd-2
等中。
\documentclass{article}
\newcounter{foo}
\newcommand{\somecmd}[1]{%
\stepcounter{foo}%
\expandafter\def\csname cmd-\thefoo\endcsname{#1}%
}
\begin{document}
\somecmd{A}
\somecmd{B}
\somecmd{C}
\UseName{cmd-1}
\UseName{cmd-2}
\UseName{cmd-3}
\ExpandArgs{c}\ShowCommand{cmd-1}
\ExpandArgs{c}\ShowCommand{cmd-2}
\end{document}
输出为A B C
,日志显示
> \cmd-1=macro:
->A.
<argument> \cmd-1
l.19 \ExpandArgs{c}\ShowCommand{cmd-1}
> \cmd-2=macro:
->B.
<argument> \cmd-2
l.20 \ExpandArgs{c}\ShowCommand{cmd-2}
正如预期的那样。
现在这里有一个 try,它的作用类似于restatable
where ,但也定义了一个将其内容存储在命令中的环境。由于环境获取其内容,因此我们需要使用 argspec 。\declaretheoremx
\declaretheorem
saved<thmname>
thm-<num>
+b
\documentclass{article}
\usepackage{kantlipsum,amsthm,thmtools}
\newcounter{savedthmcount}
\newcommand{\declaretheoremx}[2][]{
\declaretheorem[#1]{#2}
\NewDocumentEnvironment{saved#2}{+b}{%
\stepcounter{savedthmcount}%
\begin{restatable}{#2}{thm-\thesavedthmcount}
##1
\end{restatable}
}{}
}
\declaretheoremx{theorem}
\begin{document}
\begin{savedtheorem}
\kant[2][1]
\end{savedtheorem}
\begin{savedtheorem}
\kant[3][1]
\end{savedtheorem}
\UseName{thm-1}*
\UseName{thm-2}*
\ExpandArgs{c}\ShowCommand{thm-1}
\ExpandArgs{c}\ShowCommand{thm-2}
\end{document}
一切都按预期进行,只是每个命令thm-<num>
只是调用的最后一个定理。在日志中我们得到
> \thm-1=macro:
->\@ifstar {\thmt@thisistheonefalse \csname thmt@stored@thm-\thesavedthmcount \
endcsname }{\thmt@thisistheonetrue \csname thmt@stored@thm-\thesavedthmcount \e
ndcsname }.
<argument> \thm-1
l.31 \ExpandArgs{c}\ShowCommand{thm-1}
> \thm-2=macro:
->\@ifstar {\thmt@thisistheonefalse \csname thmt@stored@thm-\thesavedthmcount \
endcsname }{\thmt@thisistheonetrue \csname thmt@stored@thm-\thesavedthmcount \e
ndcsname }.
<argument> \thm-2
l.32 \ExpandArgs{c}\ShowCommand{thm-2}
这使得存储的 csname 看起来像是文字字符串,thmt@stored@thm-\thesavedthmcount
而不是thmt@stored@thm-thm-1
、thmt@stored@thm-thm-2
等。
restatable
这里出了什么问题?环境的定义thm-restate.sty
有些复杂,但我看不出有什么可以“保护”论点不被扩展。
编辑: 这似乎有效,但如果没有这个技巧,我还是想具体知道出了什么问题。
答案1
我试图重现您的问题,但此代码运行良好。
\documentclass{article}
\usepackage{thmtools, thm-restate}
\declaretheorem{theorem}
\newcounter{foo}
%\renewcommand{\thefoo}{\alph{foo}}
\begin{document}
\stepcounter{foo}
\begin{restatable}[Euclid]{theorem}{test\thefoo}
\label{thm:euclid}%
For every prime $p$, there is a prime $p’>p$.
In particular, the list of primes,
\begin{equation}\label{eq:1}
2,3,5,7,\dots
\end{equation}
is infinite.
\end{restatable}
\stepcounter{foo}
\begin{restatable}[Euclid]{theorem}{test\thefoo}
\label{thm:euclid}%
Every integer greater than 1 has a unique prime decomposition.
\end{restatable}
\setcounter{foo}{0}
\loop\ifnum\value{foo}<2
\stepcounter{foo}%
\csname test\thefoo\endcsname*
\repeat
\end{document}
答案2
\edef
只需使用这个答案。
\documentclass{article}
\usepackage{kantlipsum,amsthm,thmtools}
\newcounter{savedthmcount}
\newcommand{\declaretheoremx}[2][]{
\declaretheorem[#1]{#2}
\NewDocumentEnvironment{saved#2}{O{}+b}{%
\stepcounter{savedthmcount}%
\edef\temp{%
\noexpand\begin{restatable}[##1]{#2}{thm-\thesavedthmcount}%
}%
\temp
##2
\end{restatable}
}{}
}
\declaretheoremx{theorem}
\begin{document}
\begin{savedtheorem}
\kant[1][1]
\end{savedtheorem}
\begin{savedtheorem}
\kant[3][1]
\end{savedtheorem}
\UseName{thm-1}*
\UseName{thm-2}*
\end{document}
答案3
restatable
在其第二个参数(标签)中不执行扩展,而您想要扩展它。最近的\ExpandArgs
功能是您的好朋友。
我对的定义做了一些修改\declaretheoremx
:
\NewDocumentCommand
更加强大;- 计数器作为其中的一部分进行分配;
- 为前缀添加尾随可选参数(默认与主参数相同)。
\documentclass{article}
\usepackage{kantlipsum,amsthm,thmtools}
\NewDocumentCommand{\declaretheoremx}{O{}mO{#2}}{%
\newcounter{saved#2}%
\declaretheorem[#1]{#2}%
\NewDocumentEnvironment{saved#2}{+b}{%
\stepcounter{saved#2}%
\ExpandArgs{nne}\begin{restatable}{#2}{#3-\UseName{thesaved#2}}
##1
\end{restatable}%
}{}%
}
\declaretheoremx{theorem}[thm]
\begin{document}
\section{Main text}
First a theorem
\begin{savedtheorem}
\kant[2][1]
\end{savedtheorem}
Another theorem
\begin{savedtheorem}
\kant[3][1]
\end{savedtheorem}
\section{The statements}
\UseName{thm-1}*
\UseName{thm-2}*
\end{document}