可重述定理存储 csname 的扩展

可重述定理存储 csname 的扩展

思考这个问题,我想使用 thmtools 的restatable环境将定理与 csname 中的数字一起存储。这样,人们可以在文档末尾循环遍历它们以重述每一个。我的问题是,thmtools 存储此 csname 的方式似乎阻止了命令的扩展。

这是一个可行的例子。\somecmd遍历计数器并将其参数存储在cmd-1cmd-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,它的作用类似于restatablewhere ,但也定义了一个将其内容存储在命令中的环境。由于环境获取其内容,因此我们需要使用 argspec 。\declaretheoremx\declaretheoremsaved<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-1thmt@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

  1. \NewDocumentCommand更加强大;
  2. 计数器作为其中的一部分进行分配;
  3. 为前缀添加尾随可选参数(默认与主参数相同)。
\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}

在此处输入图片描述

相关内容