使用 section* 时计数器无法正确重置。如何修复?

使用 section* 时计数器无法正确重置。如何修复?

例如 :

\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}

它应该可以满足您的所有要求。

在此处输入图片描述

相关内容