我正在尝试使用可重写功能创建新环境,但不起作用。我做错了什么?
\documentclass{article}
\usepackage{amsmath}
\usepackage{thmtools,thm-restate}
\newenvironment{restat}{\begin{restatable}{theorem}{A}}{\end{restatable}}
\begin{document}
\begin{restat}A\end{restat}
\end{document}
我收到以下错误信息:
Runaway argument?
! File ended while scanning use of \thmt@collect@body.
<inserted text>
\par
<*> pr
感谢您的帮助。
答案1
环境restatable
需要看到显式,\end{restatable}
因为它实际上收集了整个环境主体。因此,您需要自己捕获内容:
\documentclass{article}
\usepackage{amsmath,environ}
\usepackage{thmtools,thm-restate}
\NewEnviron{restat}{%
\begin{restatable}{theorem}{A}
\BODY
\end{restatable}%
}
\begin{document}
\begin{restat}
something
\end{restat}
\end{document}
答案2
您只需要使用\restatable
,\endrestatable
因为在需要抓取其内容的环境中通常都是如此。
\documentclass{article}
\usepackage{amsmath}
\usepackage{thmtools,thm-restate}
\newtheorem{theorem}{Theorem}
\newenvironment{restat}
{\restatable{theorem}{important}}
{\endrestatable}
\begin{document}
\begin{restat}
A restatable theorem
\end{restat}
Let's restate it
\important*
\end{document}
答案3
问题是 不是restatable
一个常规环境。相反,它会向前扫描以收集整个环境,然后对其进行处理。 的代码\end{restatable}
实际上是空的。
这取决于字面上地在输入流中查找\end{restatable}
。但由于 不在您的文档源中( 之后)\begin{restatable}
,因此它永远不会完成查找。它会先到达\end{document}
或任何其他位置。
要围绕这种环境创建包装器,您需要以相同的方式收集环境的主体,然后将其提供给包装的环境。environ
使您能够方便地完成此操作。
这是使用手册第 3 页示例的解决方案environ
。我这样做是因为它表明这可能特别适合使用,amsmath
尽管我不太确定在这种情况下这是否重要。
我认为它有助于避免发生冲突的可能性\BODY
。
\documentclass{article}
\usepackage{amsmath}
\usepackage{environ}
\usepackage{thmtools,thm-restate}
\makeatletter
% mnodified from page 3 of environ manual
\newcommand\wrap[1]{\begin{restatable}{theorem}{A}#1\end{restatable}}
\newenvironment{restat}{\Collect@Body\wrap}{}
\makeatother
\begin{document}
\begin{restat}A\end{restat}
\end{document}