为什么 LaTeX 内核的新变化会破坏 zref-perpage 包?

为什么 LaTeX 内核的新变化会破坏 zref-perpage 包?

考虑以下最小示例:

\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}barfoo\@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 中的三个。

相关内容