如何创建本地总计数器?

如何创建本地总计数器?

我想在我的文档的所有环境中写入这样的页码“7/9”。第一个数字(“7”)是当前页面,第二个数字(“9”)是源文件被拆分成的最大分页符数。

我原本打算使用该包totcount,但我意识到它仅考虑了文档末尾计数器的最后一个值,并且无法在本地环境中管理计数器。

这是一个非常愚蠢的例子,但它说明了问题:

\documentclass{report}

\usepackage{totcount}
\newtotcounter{sectnum}

\let\oldsection\section
\renewcommand{\section}{%
  \setcounter{sectnum}{0}%
  \regtotcounter{sectnum}%
  \oldsection%
}

\let\oldsubsection\subsection
\renewcommand{\subsection}{%
  \stepcounter{sectnum}%
  \oldsubsection%
}

\begin{document}

\section*{One}

\subsection*{SectionOne}
\thesectnum / \total{sectnum}

\subsection*{SectionTwo}
\thesectnum / \total{sectnum}

\subsection*{SectionThree}
\thesectnum / \total{sectnum}

\subsection*{SectionFour}
\thesectnum / \total{sectnum}


\section*{Two}

\subsection*{SectionOne}
\thesectnum / \total{sectnum}

\subsection*{SectionTwo}
\thesectnum / \total{sectnum}

\end{document}

给出:

定义本地计数器的尝试失败

我们希望有:'1/4','2/4','3/4','4/4'和'1/2','2/2'。

那么,有没有办法获得这种功能?

答案1

totcount就像任何使用仅在文档后面可用的信息一样,使用辅助文件来获取计数器的最终值。也就是说,在文档末尾,所有已注册计数器的值都会写入辅助文件,并在下一次 TeX 运行开始时读入。

这样做的后果之一是,您无法为同一个计数器保存多个值,只能保存最后一个值。要解决您的问题,您必须.aux自己在每个部分末尾将计数器的当前值写入文件,并在文档开头读取这些值(而不是使用totcount),或者您必须为每个部分使用不同的计数器,如下所示:

\documentclass{report}

\usepackage{etoolbox}
\usepackage{totcount}

\makeatletter
  \newcounter{every@section}
  \pretocmd\section{%
    \stepcounter{every@section}%
    \begingroup
      \edef\@tmpa{\endgroup\noexpand\newtotcounter{my@sectnum-\arabic{every@section}}}%
    \@tmpa
  }{}{}
  \pretocmd\subsection{%
    \stepcounter{my@sectnum-\arabic{every@section}}%
  }{}{}
  \def\thesectnum{\arabic{my@sectnum-\arabic{every@section}}}
  \def\totsectnum{\total{my@sectnum-\arabic{every@section}}}
\makeatother

\begin{document}

\section*{One}

\subsection*{SectionOne}
\thesectnum / \totsectnum

\subsection*{SectionTwo}
\thesectnum / \totsectnum

\subsection*{SectionThree}
\thesectnum / \totsectnum

\subsection*{SectionFour}
\thesectnum / \totsectnum

\section*{Two}

\subsection*{SectionOne}
\thesectnum / \totsectnum

\subsection*{SectionTwo}
\thesectnum / \totsectnum

\end{document}

一些说明:

  • 我使用etoolbox'\pretocmd来修补分段命令,而不是复制和替换它们。
  • 我使用计数器every@section来计数所有部分,甚至是未编号的部分,以便为所有部分创建单独的计数器。

相关内容