重置定理计数器:\section 和(缺失)\subsection

重置定理计数器:\section 和(缺失)\subsection

假设我定义一个新的定理“定理”,并声明每当子部分计数器递增或重置时,它的计数器应该重置:

\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

相关内容