pagenote:添加交叉引用机制

pagenote:添加交叉引用机制

这个问题源自于SourceForge.net:biblatex自 2010 年 4 月起。有用户指出,某种biblatex样式 ( verbose-inote) 与pagenote包(引用其文档,“提供与脚注类似的注释,只是排版在不同的页面上”)。以下是作者 Philipp Lehman 的回应biblatex

看起来 pagenote 包中有一个错误,它似乎不支持 pagenotes 中的 \label:

\documentclass{scrartcl}
\usepackage{pagenote}
\makepagenote
\begin{document}
Text\pagenote{Page note.\label{test1}}
Text\pagenote{See note \ref{test1}.}
Text\pagenote{Another page note.\label{test2}}
Text\pagenote{See note \ref{test2}.}
\printnotes
\end{document}

它与 endnotes 包配合得很好,所以我建议您尝试一下:

\documentclass{scrartcl}
\usepackage{endnotes}
\begin{document}
Text\endnote{Endnote.\label{test1}}
Text\endnote{See note \ref{test1}.}
Text\endnote{Another endnote.\label{test2}}
Text\endnote{See note \ref{test2}.}
\theendnotes
\end{document}

verbose-inote 样式使用 \label+\ref 机制。由于这是 LaTeX 的标准功能,因此我认为这是 pagenote 包的一个错误/限制。

最近,我查看了一下endnotes.sty(其中还包含包文档)并偶然发现了以下更改说明:

1991 年 9 月 19 日,伦敦,Dominik Wujastyk 修改:

移动了线路

\edef\@currentlabel{\csname p@endnote\endcsname\@theenmark}

脱离 @endnotetext 的定义并进入 @doanenote 的定义,以便 \label 和 \ref 命令在尾注中正常工作。否则,\label 仅指向 \theendnotes 命令前面的最后一个节标题(或其他内容)。

软件包以前的这个错误endnotes实际上相当于 的当前行为pagenote。我不清楚软件包的作者pagenotePeter Wilson 是否不想包含交叉引用机制,或者是否也遇到了与以前pagenote类似的错误,但对于的详细 inote 样式,中的+机制将非常有用。endnotesbiblatex\label\refpagenote

现在,你可能已经猜到了真正的问题:pagenote.sty为了支持标准 LaTeX 交叉引用机制,需要进行哪些修改/添加?

答案1

经过多次尝试和错误,我终于想出了一个看似可行的解决方案。但我怀疑我的方法有些冗长,还有改进的空间。

翻阅endnotes.stypagenote.sty,我注意到提供了在文件(包含尾注文本的辅助文件)endnotes中写入更多数据的功能。基本上,部分机制(尤其是)是“外包”的。我尝试了的单次出现,以便将数据写入辅助文件,并且在某些时候部分成功了——页面注释的交叉引用有点奏效,但重置新章节/节的计数器(没有包选项的默认行为)被破坏了。.ent\refstepcounter\edef\@currentlabelpagenote\refstepcounterpagenotecontinuous

我目前的方法是创建一个“镜像”pagenote计数器的新计数器。每次\@wrpnote宏增加原始计数器时,它也会写入\refstepcounter{pnotemirror}辅助.ent文件,并且每次原始计数器的值为 0(即已被\chapter\section命令重置)时,“镜像”计数器也会重置。虽然很笨拙,但似乎有效。

\documentclass{scrartcl}

\usepackage[%
  continuous% Default: pagenote counter is reset with new chapters/sections
]{pagenote}
\makepagenote

\usepackage{etoolbox}

\newcounter{pnotemirror}

\makeatletter
\renewcommand{\@wrpnote}[2][]{%
  \ifnumequal{\value{pagenote}}{0}% NEW
    {\@pnwrite\@notefile{}{\string\setcounter{pnotemirror}{0}}}% NEW
    {}% NEW
  \refstepcounter{pagenote}%
  \notenumintext{\thepagenote}%
  \ifpnhaschapter
    \ifnum\value{pnotesavechap}=\value{chapter}\else
      \setcounter{pnotesavechap}{\value{chapter}}%
      \addtonotes{\pagenotesubhead{\thechapter}{\f@rtoc}}%
    \fi
  \else
    \ifnum\value{pnotesavechap}=\value{section}\else
      \setcounter{pnotesavechap}{\value{section}}%
      \addtonotes{\pagenotesubhead{\thesection}{}}%
    \fi
  \fi
  \@pnwrite\@notefile{}
%     {\string\noteentry{\thepagenote}{#1}{#2}{\thepage}}% DELETED
    {\string\refstepcounter{pnotemirror}\string\noteentry{\thepagenote}{#1}{#2}{\thepage}}% NEW
  \endgroup
  \@esphack}
\makeatother

\begin{document}

\section{foo}

Text\pagenote{Page note.\label{test1}}
Text\pagenote{See note \ref{test1}.}
Text\pagenote{Another page note.\label{test2}}
Text\pagenote{See note \ref{test2}.}

\section{bar}

Text\pagenote{Page note.\label{test3}}
Text\pagenote{See note \ref{test3}.}
Text\pagenote{Another page note.\label{test4}}
Text\pagenote{See note \ref{test4}.}

\printnotes

\end{document}

编辑:memoir类模拟了包的功能pagenote,因此也存在同样的错误。由于memoir使用了不同的宏名,为了方便起见,这里提供了一个“补丁” memoir(将在文档序言中添加):

\usepackage{etoolbox}

\newcounter{pnotemirror}

\makeatletter
\renewcommand{\m@m@wrpnote}[2][]{%
  \@ifmtarg{#1}{%
    \ifnumequal{\value{pagenote}}{0}%
      {\m@m@pnwrite\@notefile{}{\string\setcounter{pnotemirror}{0}}}%
      {}%
    \refstepcounter{pagenote}%
    \notenumintext{\thepagenote}}{}%
  \ifm@mpn@new@chap
    \global\m@mpn@new@chapfalse
    \addtonotes{\string\pagenotesubhead{\@chapapp}{\thechapter}{\pnchap}}%
  \fi
  \ifm@mpn@new@schap
    \global\m@mpn@new@schapfalse
    \addtonotes{\string\pagenotesubhead{\@chapapp}{}{\pnschap}}%
  \fi
  \m@m@pnwrite\@notefile{}
    {\string\refstepcounter{pnotemirror}\string\noteentry{\thepagenote}{#1}{#2}{\thepage}}%
  \endgroup
  \@esphack}
\makeatother

相关内容