假设我有一个以某种方式定义的定理,如下所示。
\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
(这排除了使用\declaretheorem
from重新定义定理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}