例如 :
\documentclass{article}
\usepackage{chngcntr}
\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\begin{document}
\section{One}
\begin{equation} 2+2=3.99 \end{equation}
\begin{equation} \pi^2=9.86 \end{equation}
\section{Two}
\begin{equation} E=mc^2 \end{equation}
\begin{equation} v=\frac{e}{t} \end{equation}
\subsection{Two \& One}
\begin{equation} 2+2=22 \end{equation}
\end{document}
渲染
对比
\documentclass{article}
\usepackage{chngcntr}
\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\begin{document}
\section*{One}
\begin{equation} 2+2=3.99 \end{equation}
\begin{equation} \pi^2=9.86 \end{equation}
\section*{Two}
\begin{equation} E=mc^2 \end{equation}
\begin{equation} v=\frac{e}{t} \end{equation}
\subsection*{Two \& One}
\begin{equation} 2+2=22 \end{equation}
\end{document}
结果是这样的:
答案1
如果您只希望将其用于一个计数器,那么equation
您可以将以下代码添加到相应的分段命令中
\usepackage{etoolbox}
\cspreto{section}{\setcounter{equation}{-1}\stepcounter{equation}}
\cspreto{subsection}{\setcounter{equation}{-1}\stepcounter{equation}}
其中\cspreto
是在etoolbox
包中定义的。这接近于最近更新中 LaTeX 内核中计数器重置方式的精神。另一方面,如果您希望将其应用于许多子计数器,那么您可以使用与 相关的内置重置\refstepcounter
:
\usepackage{chngcntr,etoolbox}
\cspreto{section}{\addtocounter{section}{-1}\refstepcounter{section}}
\cspreto{subsection}{\addtocounter{subsection}{-1}\refstepcounter{subsection}}
\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\counterwithin
标准不适用的原因\section*
是,带星号的分段指令版本根本不触及计数器。
\documentclass{article}
\usepackage{etoolbox}
\cspreto{section}{\setcounter{equation}{-1}\stepcounter{equation}}
\cspreto{subsection}{\setcounter{equation}{-1}\stepcounter{equation}}
\begin{document}
\section{One}
\begin{equation} 2+2=3.99 \end{equation}
\begin{equation} \pi^2=9.86 \end{equation}
\section*{Two}
\begin{equation} E=mc^2 \end{equation}
\begin{equation} v=\frac{e}{t} \end{equation}
\subsection*{Two \& One}
\begin{equation} 2+2=22 \end{equation}
\end{document}
答案2
您的示例中的行为是正确的。使用
\counterwithin*{equation}{section}
使方程计数器成为节计数器的子计数器。然而,\section*
不会改变节计数器,因此方程计数器不会重置。解决这个问题并不太难。该\stepcounter
命令将计数器的值增加一,并重置所有子计数器。从中latex.ltx
,我们发现它的定义如下。
\def\stepcounter#1{%
\addtocounter{#1}\@ne
\begingroup
\let\@elt\@stpelt
\csname cl@#1\endcsname
\endgroup}
我们需要一个宏来执行 的所有功能\stepcounter
,除了更新计数器本身。我\nullstepcounter
在下面的例子中调用了这个宏。
\documentclass{article}
\usepackage{chngcntr}
\makeatletter
\def\nullstepcounter#1{%
\begingroup
\let\@elt\@stpelt
\csname cl@#1\endcsname
\endgroup}
\makeatother
\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\begin{document}
\section*{One}
\nullstepcounter{section}
\begin{equation} 2+2=3.99 \end{equation}
\begin{equation} \pi^2=9.86 \end{equation}
\section*{Two}
\nullstepcounter{section}
\begin{equation} E=mc^2 \end{equation}
\begin{equation} v=\frac{e}{t} \end{equation}
\subsection*{Two \& One}
\nullstepcounter{subsection}
\begin{equation} 2+2=22 \end{equation}
\end{document}
答案3
做就是了:
% arara: pdflatex
\documentclass{article}
\usepackage{etoolbox}
\pretocmd{\section}{\setcounter{equation}{0}}{}{}
\pretocmd{\subsection}{\setcounter{equation}{0}}{}{}
\begin{document}
\section{One}
\begin{equation}
2+2=3.99
\end{equation}
\begin{equation}
\pi^2=9.86
\end{equation}
\section*{Two}
\begin{equation}
E=mc^2
\end{equation}
\begin{equation}
v=\frac{e}{t}
\end{equation}
\subsection*{Two \& One}
\begin{equation}
2+2=22
\end{equation}
\end{document}
它应该可以满足您的所有要求。