考虑以下最小示例:
\documentclass{book}
\usepackage{zref-perpage}
\zmakeperpage{footnote}
\begin{document}
\chapter{Test}
\footnote{A footnote}
\footnote{A footnote}
\newpage
\footnote{Another footnote}
\end{document}
预期效果是每页中的第一个脚注编号应为 1,但是每当页面上有章节时,该页面上的第一个脚注编号为 2。
我相信 LaTeX 内核的新变化在某种程度上是罪魁祸首,因为该zref
软件包已经好几年没有更新了。您还可以通过使用像 overleaf 这样的在线 LaTeX 编译器(使用 TeXLive 2014)来确认这个最小示例是否运行良好。
到目前为止,我发现添加另一个
\@addtoreset{footnote}{chapter}
解决了该问题,因此您至少应该有两个这样的问题。
那么问题出在哪里?
答案1
book
和类在每个编号章节report
重置计数器:footnote
\@addtoreset{footnote}{chapter}
计数器应用于两个系统,这两个系统会重置计数器,因此\zmakeperpage
无法完全控制计数器。由于您希望在页面边界重置计数器,因此\@addtoreset
必须撤消的效果。以下软件包removefromreset
可提供帮助:
\documentclass{book}
\usepackage{remreset}
\makeatletter
\@removefromreset{footnote}{chapter}
\makeatother
\usepackage{zref-perpage}
\zmakeperpage{footnote}
\begin{document}
\chapter{Test}
\footnote{A footnote}
\footnote{A footnote}
\newpage
\footnote{Another footnote}
\end{document}
LaTeX 2015/01/01 中负责任的更改是 的定义发生了变化。主计数器增加\@stpelt
后,依赖计数器将被重置。宏实现重置。旧版本只是将计数器设置为零:\@addtoreset{foo}{bar}
bar
foo
\@stpelt
\def\@stpelt#1{\global\csname c@#1\endcsname \z@}
新版本首先设置为 -1 以便使用\stepcounter
:
\def\@stpelt#1{\global\csname c@#1\endcsname \m@ne\stepcounter{#1}}
优势:
优点是,依赖于从属计数器的计数器也会被重置。例如:
... previous section with sections, subsections, subsubsections ... \section % resets subsection
在 的旧版本中
\@stpelt
, 计数器subsubsection
保持不变,其值为 之前的值\section
。新版本会传递性地重置计数器,也就是说,subsubsection
也会作为 重置操作的一部分进行重置subsection
。现在subsubsection
也会重置,并且在 之后立即为 0\section
。
缺点:
传递性存在循环风险,以下文档遇到了这样的循环并因此中断:
\documentclass{book} \makeatletter \@addtoreset{chapter}{footnote} \makeatother \begin{document} \chapter{foo} \end{document}
其他软件包,像钩子
\stepcounter
一样zref-perpage
,不知道这\stepcounter
不是由实体引起的,因此zref-perpage
认为footnote
在章节开头共有四个脚注,而不是问题的 MWE 中的三个。