我想在我的文档的所有环境中写入这样的页码“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
来计数所有部分,甚至是未编号的部分,以便为所有部分创建单独的计数器。