让我先用 MWE 来说明我的疑问。
\documentclass{book}
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}[section]
\begin{document}
\chapter{Some title}
\section{Another title}
\begin{theorem}
A nice theorem
\end{theorem}
\section{Yet another title}
\begin{theorem}
Another nice theorem
\end{theorem}
\section*{Optional section}
\begin{theorem}
An optional theorem
\end{theorem}
\end{document}
由此得出的定理数为
定理 1.1.1
定理 1.2.1
定理 1.2.2。
我想实现的是
定理 1.1.1
定理 1.2.1
定理 1.E.1。
换句话说,我希望计数器重新启动(我认为我可以用 来实现\setcounter
),但我希望部分计数器有一个不同的符号,比如 E 表示“额外”。我应该在部分级别通过重新定义 来执行此操作吗\thesection
?还是通过修改theorem
环境(最好不要)?我应该定义一个新的定理环境吗(最好也不要)?我更喜欢系统解决方案,而不是临时方法(我需要对定理环境的每个实例分别采取行动)。
谢谢大家。
编辑:正如 Andrew 在他的回答中指出的那样,我在问题中输入了错误的定理数字。我现在已经更正了它们,以避免对可能对此问题感兴趣的其他用户产生混淆。
答案1
要使其工作,您需要\thesection
在可选部分内重新定义 ,它用作定理环境中计数器的一部分,然后您必须\thesection
在这些部分的末尾重置。您可能可以通过一些\patchcmd
技巧来做到这一点,但更直接的方法是为可选部分定义一个新的环境,它将为您处理这些更改。这样做,您可以将可选部分编写为
\begin{section*}{Optional section title}
\begin{theorem}
An optional theorem
\end{theorem}
\end{section*}
重新排列你的 MWE,以便我们在两个部分之间有一个可选部分,这将产生输出:
请注意,尽管 OP 说如果要对定理进行编号,定理编号应该是 1.1.1、1.E.2、1.2.3里面节,则如上所述,每次节号更改时,它们都会被重置,给出编号 1.1.1、1.E.1、1.2.1。如果需要编号 1.1.1、1.E.2、1.2.3,则将定义定理环境的行替换为:
\newtheorem{theorem}{Theorem}%[section]
\numberwithin{theorem}{chapter}% needs \usepackage{amsmath}
\renewcommand\thetheorem{\thesection.\arabic{theorem}}
并将其\setcounter{theorem}{0}
从section*
环境中移除。
完整代码如下:
\documentclass{book}
\usepackage{amsthm}
\newenvironment{section*}[1]{% \begin{section*}{section title}....\end{section*}
\section*{#1}
\renewcommand\thesection{\thechapter.E}
\setcounter{theorem}{0}}{}
\newtheorem{theorem}{Theorem}[section]
\begin{document}
\chapter{Some title}
\section{Another title}
\begin{theorem}
A nice theorem
\end{theorem}
\begin{section*}{Optional section}
\begin{theorem}
An optional theorem
\end{theorem}
\end{section*}
\section{Yet another title}
\begin{theorem}
Another nice theorem
\end{theorem}
\end{document}
编辑
正如 Barbara Beeton 在评论中所建议的那样,最好为section*
环境提供一个可选参数来覆盖E
可选部分中出现的定理数字。这很容易做到:
% \begin{section*}[label]{section title}....\end{section*}
\newenvironment{section*}[2][E]{
\section*{#2}
\renewcommand\thesection{\thechapter.#1}
\setcounter{theorem}{0}}{}
它的用法与前面完全相同,如果你想用一个来标记定理,E
但要把它改成一个,F
你可以用
\begin{section*}[F]{Optional section title}
\begin{theorem}
An optional theorem
\end{theorem}
\end{section*}
答案2
对语法稍作调整,
\section*[F]{Title}
允许设置不同的键来代替默认的“E”。
\documentclass{book}
\usepackage{amsthm}
\usepackage{xparse}
% save the original meaning of \section
\let\latexsection\section
% by default, sections are numbered with arabic numbers
\newcommand{\defaultsectionkey}{\arabic{section}}
% initialize \sectionkey
\let\sectionkey\defaultsectionkey
% redefine \thesection
\renewcommand{\thesection}{\thechapter.\sectionkey}
% tweak \section
\RenewDocumentCommand{\section}{s}{%
\IfBooleanTF{#1}{\sectionstar}{\sectionnostar}%
}
\NewDocumentCommand{\sectionstar}{O{E}m}{%
% this resets the counters associated to section
\stepcounter{section}\addtocounter{section}{-1}%
% change the meaning of \sectionkey
\renewcommand{\sectionkey}{#1}%
\latexsection*{#2}%
}
\NewDocumentCommand{\sectionnostar}{O{#2}m}{%
% revert \sectionkey to the default
\let\sectionkey\defaultsectionkey
\latexsection[#1]{#2}%
}
\newtheorem{theorem}{Theorem}[section]
\begin{document}
\chapter{Some title}
\section{Another title}
\begin{theorem}
A nice theorem
\end{theorem}
\section{Yet another title}
\begin{theorem}
Another nice theorem
\end{theorem}
\section*{Optional section}
\begin{theorem}
An optional theorem
\end{theorem}
\section*[F]{Another optional section}
\begin{theorem}
An optional theorem
\end{theorem}
\section{Normal section}
\begin{theorem}
A big theorem
\end{theorem}
\end{document}