假设我定义一个新的定理“定理”,并声明每当子部分计数器递增或重置时,它的计数器应该重置:
\newtheorem{theorem}{Theorem}[subsection]
在我的(文章)文档中的某个位置,我开始了一个新内容\section
(例如,第 2 节),但没有开始\subsection
。我希望本节中的第一个定理的编号为“2.0.1”(这可能被认为是不好的风格)。然而,这个定理的编号是“2.0.2”。
这是“设计使然”(从技术上讲,我没有开始新的\subsection
)还是一个错误?此外,什么是适当的解决方法?(这种解决方法不应涉及手动重置定理计数器,并且它应该适用于我除了“定理”之外可能定义的任何定理类型。)
\documentclass{article}
\newtheorem{theorem}{Theorem}[subsection]
\begin{document}
\section{bla}
\subsection{blubb}
\begin{theorem}
Some text.
\end{theorem}
\subsection{foo}
\begin{theorem}
Some text.
\end{theorem}
\section{bar}
\begin{theorem}
Some text.
\end{theorem}
\end{document}
编辑:回应 Seamus 的评论:意外的计数器值也出现在amsthm
和中ntheorem
。
答案1
在 LaTeX 中,“子计数器”仅当计数器增加时才会重置\stepcounter
。它们是不是当计数器以任何其他方式改变时(例如通过\setcounter
或 TeX 命令)重置。
增加\section
节计数器,从而将子节计数器设置为 0。但这不会重置定理计数器。只有下一个\subsection
(增加子节计数器)才会重置定理计数器。
我猜最简单(或至少最安全;见评论)的解决方法是简单地将定理计数器添加到部分计数器的重置列表中:
\makeatletter
\@addtoreset{theorem}{section}
\makeatother
答案2
也许 Caramdir 的回答更能激发 LaTeX 核心的动机 -latex.ltx
- 定义了一个新定理你的使用方式\newtheorem{<env_name>}{<caption>}[<within>]
。这将定义一个名为 的新计数器<env_name>
并执行\@addtoreset{<env_name>}{<within>}
(如果计数器<within>
存在,否则 LaTeX 会产生错误)。后者会<env_name>
在每次<within>
增加 时重置计数器。
因此,添加
\makeatletter
\@addtoreset{theorem}{section}
\makeatother
theorem
无论何时使用都会重置计数器\section{...}
。
答案3
Caramdir 解决方案的一个不太深奥的版本是通过以下chngcntr
包实现的:
\usepackage{chngcntr}
\newtheorem{theorem}{Theorem}[subsection]
\counterwithin*{theorem}{section}
*-version\counterwithin
避免了包的智能和重新定义\thetheorem
,就像没有*
如果您想避免为定义的每个类似定理的环境执行额外的命令,只需抽象构造:
\usepackage{chngcntr}
\newcommand{\newsubsectheorem}[2]{%
\newtheorem{#1}{#2}[subsection]%
\counterwithin{#1}{section}}
\newsubsectheorem{theorem}{Theorem}
\newsubsectheorem{proposition}{Proposition}
\newsubsectheorem{lemma}{Lemma}
如果您稍后改变主意并想返回“截面定理”编号,只需进行相应修改即可\newsubsectheorem
。