书籍/文件末尾的注释——现代的做法是什么?

书籍/文件末尾的注释——现代的做法是什么?

我是不是谈论\footnote出现的两个都在当前页面的末尾在书的最后。

反而,我说的是

  • 保持\footnote原样,
  • 使用另一种机制来创建打印在书末的笔记。

对于后者,下面两张照片应该可以清楚地解释我的意思: 在此处输入图片描述

这么大的注释根本不适合用作脚注,所以它必须是尾注。

这是我能注意到的特点:

  • 尾注和引用它的文本可以互相引用,因此它有点像是 2 \label,并且每个文本都可以引用\ref另一个:

    • 在打印的注释中,通过页码来引用参考文本;
    • 引用该注释的地方,仅给出打印该注释的页码。
  • 纸币上印有粗体标题,由两部分组成:

    • 一种称谓:,这显然与注释不同
    • 进一步阅读的建议:,所有笔记都相同

    随后是注释的全文。因此,我怀疑,理论上引用文本可以提到一种称谓:(也许没有) \ref,如果作者愿意的话。

显然有几个包可能针对这样的布局,但是每个包似乎都有一些缺点。

  • endnotes

    最新版本来自 2020-01-02,所以不是最近才有的。另外还有几个包,比如pagenote提到它有一些缺点,所以我没有花太多精力去理解如何使用它。

  • pagenote

    其中一个问题描述这个问题,Enrico Gregorio 提供了一种解决方法。不过,显然,该解决方法不再有效,您可以通过编译他的答案中的 MWE 并检查后记中的章节编号是否为 1 来验证。

    毕竟这个包的最新版本是 v1.1a,最后修订于 2009/09/03,所以这是一个相当老的软件包,我对它没有太多的期望(尽管一个答案我最近有一个问题表明该包仍然可以使用,并且有一定的成功率)。

  • enotez

    从包装文档中,我并没有真正理解如何避免像脚注一样对注释进行编号,以获得如附图所示的布局。

    另外,还有一个类似的问题pagenotes,通过编译以下 MWE 可以看到,前言和后言的章节分别编号为 0 和 1:

    \documentclass{book}
    \usepackage{enotez}
    \setenotez{split=chapter, totoc=chapter}
    \begin{document}
    \frontmatter
    \chapter{Introduction}
    text in frontmatter\endnote{note from frontmatter}
    \mainmatter
    \chapter{The first}
    text in mainmatter\endnote{note from mainmatter}
    \backmatter
    \chapter{Epilogue}
    text in backmatter\endnote{note from backmatter}
    \printendnotes
    \end{document}
    

    尽管如此,最新版本来自 2022-01-04,所以这个包相当新并且可能是我应该使用的。

  • postnotes

    这似乎是最近更新的,最新更新日期为 2022-11-13。目前我被困在了File `postnotes.sty' not found,但文档中没有结果的示例,所以在花时间之前,我想了解这是否确实是我应该使用的包。

    另一个(小)缺点是它不能babel自动支持,因为目前支持的语言只有英语、德语、法语和葡萄牙语。(实际上,以德语开始文档\documentclass[german]{book} \usepackage[german]{babel}不会使注释的标题变成德语,所以……)

因此,对于这个问题,我想知道是否有人对这个主题有足够的经验来得出一个答案,说出这些软件包的优缺点,概述每个软件包提供的功能,而不是所有其他软件包都提供的功能。

答案1

我觉得自己可能就是这样的人。但这个答案需要免责声明,我是的作者postnotes。我会尽量做到公正,但要小心。

尾注

endnotes是用于此目的的古老而传统的软件包。它已经存在了几十年,其变更日志可以追溯到 20 世纪 80 年代,并且非常可靠。它的代码非常清晰。这真是一个美丽的东西,我希望有一天我能像那样编码。

即使可以说是斯巴达式的,也是endnotes经过精心打造的,实际上很容易调整。@e​​greg 在网站上的回答就是一个例证。一些常见任务的示例:

然而,随着时间的推移,endnotes它也变得有些过时了。最明显的一点可能是缺乏hyperref支持。尾注-hy是一个配套软件包,提供此类支持,但功能有限。仅提供超链接用于标记注释,并且它对标签使用了一种特殊的语法,其中\label必须放在注释之外(手册说明了使用这种语法的原因,但我个人并不十分相信。enotez也使用相同的语法,大概是通过“继承”,这样它就可以作为的替代品endnotes)。

另一个值得一提的配套套餐是端头它提供了打印笔记的页眉功能,其中包含有关笔记来源页面的信息。但出于某种原因,它硬编码了依赖项fancyhdr,我不确定包的状态(上次尝试时,我根本无法让它工作)。

回忆录/页注

据我所知,memoir已经开发了自己的尾注基础结构,最终发展为一个独立包,供其他类使用,这就是pagenote。它们有一些花哨的功能,并且比 更容易配置endnotes,即使后者在简单性方面非常强大。不过,可以说memoir/pagenote比 更方便用户使用endnotes

据我所知,两者的维护工作memoir已经pagenote分开。两者的维护工作已移交给不同的维护者,而且他们似乎采取了不同的方式。

一个区别似乎是,它memoir支持hyperref从注释标记到打印标记的链接,而不pagenote支持。

然而,最重要的是,memoir.dtx对此有如下说明:

% \changes{v3.6h}{2011/01/19+}{Reimplemented page notes}
% This used to be a copy of the \Lpack{pagenote} package, with minor
% amendments. But it turned out that the implementation used by
% \Lpack{pagenote} at that time, had a few serious flaws. In this
% implementation we will instead turn to the trick used by the
% \Lpack{endnotes} package to overcome the same problem.
% For the sake of history, let us summarise what the actual problem
% was. Basically the command \cs{pagenote}\marg{text} would write an
% entry to an external file in the following format
% \begin{verbatim}
% \noteentry{nom}{id}{text}{pagenum}
% \end{verbatim}
% and when typesetting the page notes, this file would be read into
% the document and \cs{noteentry} would typeset each page note. The
% main problem here is \verb|{text}| which is written verbatimly to
% the external file, but it is written on a single line!, thus an
% input like this
% \begin{verbatim}
% \pagenote{Test%
% test}
% \end{verbatim}
% would give us the entry
% \begin{verbatim}
% \noteentry{num}{id}{Test%test}{pagenum}
% \end{verbatim}
% oops! This is what we will solve using inspiration from
% \Lpack{endnotes}, kudos to  John Lavagnino.

我不确定“当时”是否意味着路径早些时候已经分叉,但考虑到这条评论来自 2011 年,而的最后一次更新pagenote是在 2009 年,似乎有理由避免此时将其作为独立包(在撰写本文时,pagenote的版本是 2009/09/03 的 v1.1a)。评论中提到的错误在最新版本中仍然存在,并且还endnotes.sty给出了不将注释写成单个长行的其他原因(“这很可能会超出输出行长度的限制”)。但我还认为即使有一些限制,该包仍然可用(我已经测试过它,它在一个简单的、表现良好的文档中工作)。

埃诺特兹

enotez据我所知,它致力于成为以前存在的更现代的替代品。它是一个功能强大的软件包,其亮点如下:

  • 全面hyperref支持,包括从打印笔记到笔记标记的反向链接。
  • 该包具有高度可配置性,具有 key=value 用户界面。
  • 它可以根据注释所在的章节或部分自动拆分注释列表。

其两个显著特点enotez是:

  • 对嵌套注释的支持。
  • 在实际调用注释之前打印注释的可能性。//endnotes通过在调用注释时将每个注释写入外部文件来工作,该文件在打印注释集时被读取和丢弃。因此,只有“过去”的注释才能打印。memoir做了一些不同的事情,它将注释及其完整内容写入文件,以便您可以随时获得所有注释,然后可以随时打印。pagenoteenotez.auxbegindocument

后记

我在今年早些时候编写了这个包,因为我正在编写一份需要尾注的文档,但很难从现有包中获得我想要的东西。在之前存在的包中,我显然选择了enotez。但对我来说,一个重要的要求并没有真正实现,而且我对此还有另一个实际/技术上的疑虑。这个要求是打印的运行头,其中包含来自注释来源(页面等)的信息。出现技术问题是因为我正在处理一个大型文档,尾注部分本身大约有 150 页,所以enotez工作方式意味着文件中最终会出现大量材料.aux,从而导致编译时间相应减少。因此,postnotes是那些“解决我自己的问题”的包之一。

一些独特的特点:

  • 支持打印注释的运行头。默认情况下,它的形式是“NM 页注释”,但你可以得到更花哨的形式,如“AB 章注释,NM 页注释”等等。(这个特定功能实际上已经提供给enotez,在撰写本文时正在等待代码审查https://github.com/cgnieder/enotez/issues/37)。
  • postnotes努力存储笔记放置位置的一些“上下文”,并使其在打印笔记时可用。我biblatex在实现这一点时非常重视,并尝试添加对 、 和 的支持refsectionrefcontext事实refsegment证明,这比我预想的要难得多biblatexhttps://github.com/plk/biblatex/issues/1226)。但它仍然是一个潜在的强大功能。特别是,我昨天给你的答案(https://tex.stackexchange.com/a/669491/105447) 正是通过这种方式来工作的,放置注释的页面被存储起来,然后\pnthepage在打印的地方提供。
  • 从技术方面来说,postnotes不将笔记内容写入外部文件,而是将其存储在变量中。该.aux文件仅用于存储页面引用。因此,避免了通常由写入和读取引起的问题。
  • 将注释存储在变量中增加了一些灵活性,这是可以利用的。例如,通常,放置在浮点中的结束注释可能会扰乱注释的顺序。可以通过设置手动标记来更正编号。但注释打印的顺序是乱序的。有了一组可用作变量的注释,我们可以对它们进行预处理,例如对它们进行排序。这确实有效postnotes。(从技术上讲,enotez也可以这样做,但我认为它不行)。

其他值得注意的特点:

  • 由于enotezpostnotes也提供全力hyperref支持,包括反向链接。
  • UI 主要是 key=val,但并非完全如此。它非常灵活,与 相比,确实牺牲了一些用户友好性来换取灵活性enotez
  • 更好地支持对尾注的交叉引用,语法更好。您可以为注释标记和注释文本设置标签(据我所知,这postnotes是唯一允许这样做的软件包)。语法形式为\postnote[label=en:mark]{\label{en:text}End note.}。此外,还支持zrefzref-clever
  • 就像 一样enotez,有工具可以自动按章节/节拆分注释。这可能需要比 更多的手动工作enotez,但作为补偿,UI 更灵活,能够处理未编号的节。

现在,postnotes故意打破一些传统,这可能会使其不适合或更加繁琐,无法满足您的需求。

  • \postnote不遵循 的传统语法,\endnote因为其可选参数可以接收 key=val 选项集。因此,要设置手动标记,您必须执行\postnotes[mark=5]{End note.}。这意味着几件事,postnotes不是 和其他遵循其传统语法的软件包的替代品endnotes。此外,切换脚注和尾注的常见程序不能不\let\footnote\endnote经过调整就完成。
  • postnotes不提供手动将注释与其标记分开的\...mark\...text体。还有其他技术可以处理这些技术适用的常见情况(请参阅手册)。但同样,它不是替代品。

其他套餐

  • 雷莱德麦克:真正庞大的版本,可满足学术/批判版本的需要,它提供的众多功能中,广泛支持尾注,包括多个系列的尾注,等等。
  • biblatex-chicago维护cmsendnotes.sty,这是一个修改后的版本,endnotes以支持hyperref(通过 Ulrich Dirr 的 comp.text.tex 答案)和它自己的noteref选项,但据我所知,它也可以独立使用。
  • enotesj自称提供“日式尾注”,但我无法通过阅读手册来告诉您这是什么意思。
  • 一些用于执行其他操作的相当专业的包也可用于生成结束语:parnotessepfootnotes

好吧...看来我比我承诺的更偏袒。我想我可以多说一点我所做的事情是很自然的。我希望我没有不公平。;-)

尽管如此,这四种替代方案都非常好(可能除了独立的pagenote,如上所述)。检查您的需求和它们提供的内容,如果它们足够,您将获得良好的服务。如果您不需要hyperref,您可能更喜欢 的稳健性和稳定性endnotes。如果您正在使用memoir,您会发现一个集成良好且资源丰富的尾注基础架构。如果您需要反向链接和更大的灵活性,enotezpostnotes会为您提供这些。如果您需要笔记的运行标题,那么postnotesendnotes都是endheads替代方案。

在评估软件包时,您似乎将“现代”、“最新”或“上次升级”理解为“最佳”。但对于一般软件来说,情况往往并非如此,对于 LaTeX 软件包来说可能更是如此。此外,在了解任何特定软件包时,您应该花点时间至少浏览一下其文档,然后再下结论并如此迅速地丢弃它们。我非常有信心,您在问题中提到的许多问题(即使不是全部)都是可以解决的。

关于你努力实现的那种尾注风格,我也同意评论中表达的观点,即这对读者来说特别困难。我提供了在其他地方实现这种风格的pagenote方法postnoteshttps://tex.stackexchange.com/a/669491/105447endnotes),但我个人不会使用它。使用和可能可以达到相同的效果enotez(因为endnotes你可以尝试https://tex.stackexchange.com/a/438715/105447)。

PS:关于您的评论:

但文档中没有结果的示例

这似乎不公平,因为手册中有不少于 7 个使用示例。

至于:

另一个(次要的)缺点是它不能自动支持 babel,因为目前支持的语言只有英语、德语、法语和葡萄牙语。(实际上,以 \documentclass[german]{book} \usepackage[german]{babel} 开头的文档不会使注释的标题变成德语,所以……)

babel只要支持该语言,它就应该遵循的设置(否则将恢复为英语)。如果确实不支持,您应该报告。但我怀疑可能发生的情况是german,该软件包最近才收到贡献,而您可能正在运行它的过时版本。如果您缺少所需的任何其他语言,欢迎您贡献它,这实际上非常简单。

相关内容