新环境和可重述

新环境和可重述

我正在尝试使用可重写功能创建新环境,但不起作用。我做错了什么?

\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}

相关内容