是否有与 \renewcommand 等效的 \renewtheorem,使用 amsthm 而不是 ntheorem?

是否有与 \renewcommand 等效的 \renewtheorem,使用 amsthm 而不是 ntheorem?

假设我有一个以某种方式定义的定理,如下所示。

\newtheorem*{mytheorem}{Foo}

我想在我的文档中以另一种方式重新定义它,如下所示。

\newtheorem*{mytheorem}{Bar}

解决这个问题最简单的方法是什么?

我想要这样的东西,但我得到的是undefined control序列\renewtheorem

\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}

\begin{document}
\theoremstyle{definition}
\newtheorem*{thmTemp}{Foo}
\begin{thmTemp} First one.  \end{thmTemp}

\renewtheorem*{thmTemp}{Bar}
\begin{thmTemp} Second one.  \end{thmTemp}
\end{document}

当我运行pdflatex这个时,我得到以下信息:

! Undefined control sequence.
l.10     \renewtheorem
                  *{thmTemp}{Bar}

我之所以避免这样做,ntheorem是因为它不会保留由 定义的定理样式amstheorem,即使amsthm将选项传递给它,我也不想重新定义这些样式。

答案1

我不需要每次都重新定义环境,而是定义一个包装器:

\documentclass{article}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem*{inner}{\innerheader}
\newcommand{\innerheader}{}
\newenvironment{defi}[1]
 {\renewcommand\innerheader{#1}\begin{inner}}
 {\end{inner}}

\begin{document}
\begin{defi}{Foo}
First one.
\end{defi}

\begin{defi}{Bar}
Second one.
\end{defi}
\end{document}

在此处输入图片描述

答案2

如果一个人系统地需要在同一文档中使用不同的定理定义,则 egreg 方法很方便。但我们中的许多人可能有一个 mymath.tex具有常用快捷方式和设置的文档,这很可能是定义的位置\newtheorem ,有时人们可能想要覆盖这些定义,例如更改定理的语言环境。

在这些情况下,编辑 mymath.tex或维护第二个定理不方便且容易出错,最好altthm.tex在主文档中插入一个新的定理定义来覆盖定理定义。
为此,我们需要一个\renewtheorem命令:

\makeatletter
\def\renewtheorem#1{%
  \expandafter\let\csname#1\endcsname\relax
  \expandafter\let\csname c@#1\endcsname\relax
  \gdef\renewtheorem@envname{#1}
  \renewtheorem@secpar
}
\def\renewtheorem@secpar{\@ifnextchar[{\renewtheorem@numberedlike}{\renewtheorem@nonumberedlike}}
\def\renewtheorem@numberedlike[#1]#2{\newtheorem{\renewtheorem@envname}[#1]{#2}}
\def\renewtheorem@nonumberedlike#1{  
\def\renewtheorem@caption{#1}
\edef\renewtheorem@nowithin{\noexpand\newtheorem{\renewtheorem@envname}{\renewtheorem@caption}}
\renewtheorem@thirdpar
}
\def\renewtheorem@thirdpar{\@ifnextchar[{\renewtheorem@within}{\renewtheorem@nowithin}}
\def\renewtheorem@within[#1]{\renewtheorem@nowithin[#1]}
\makeatother

使用作为\renewtheorem标准\newtheorem

\renewtheorem{env_name}{caption}[within]
\renewtheorem{env_name}[numbered_like]{caption}

它与 一起工作amsthm

除定义之外,MWE\renewtheorem为:

\documentclass{article}
\begin{document}

\newtheorem{thm}{Theorem}[section]
\begin{thm}
My theorem ...
\end{thm}

\renewtheorem{thm}{Proposition}[section]
\begin{thm}
My theorem ...
\end{thm}

\end{document}

答案3

减少@antonio 的答案:仅使用第一个代码块就可以获得更强大的结果;除了使用 a ,您还可以像下面\renewtheorem一样轻松地使用 a :\cleartheorem

\makeatletter
\def\cleartheorem#1{%
    \expandafter\let\csname#1\endcsname\relax
    \expandafter\let\csname c@#1\endcsname\relax
}
\makeatother

在我看来,额外的复杂性和依赖性\newtheorem(这排除了使用\declaretheoremfrom重新定义定理thmtools,并假设有关定理包及其接口的内部工作原理的其他内容)对于获得所需效果的额外代码行来说是不合理的:

% suppose you're using \declaretheorem
\usepackage{amsthm, thmtools}

% this could be included from a separate file
\declaretheorem[name=Definition,numberwithin=section]{defn}

\cleartheorem{defn}
\declaretheorem[name=RevisedDefinition]{defn} % no error here

编辑:为了进一步方便,可以用一个命令清除所有定理,这样就不会出现多于一行的冗余代码:

% define this in the preamble in between \makeatletter and \makeatother
\def\clearthms#1{ \@for\tname:=#1\do{\cleartheorem\tname} }

然后在文档中:

% clear the previous definitions
\clearthms{defn,example,theorem,coro,prop}


% now execute all of the commands exactly as if the preamble didn't have them...
\theoremstyle{plain}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{coro}{Corollary}[theorem]
\newtheorem{prop}[theorem]{Proposition}

\theoremstyle{definition}
\newtheorem{defn}{Definition}{section}
\declaretheorem[qed=$\square$]{example}

相关内容