![书籍/文件末尾的注释——现代的做法是什么?](https://linux22.com/image/459072/%E4%B9%A6%E7%B1%8D%2F%E6%96%87%E4%BB%B6%E6%9C%AB%E5%B0%BE%E7%9A%84%E6%B3%A8%E9%87%8A%E2%80%94%E2%80%94%E7%8E%B0%E4%BB%A3%E7%9A%84%E5%81%9A%E6%B3%95%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我是不是谈论\footnote
出现的两个都在当前页面的末尾和在书的最后。
反而,我说的是
- 保持
\footnote
原样, - 使用另一种机制来创建打印在书末的笔记。
这么大的注释根本不适合用作脚注,所以它必须是尾注。
这是我能注意到的特点:
尾注和引用它的文本可以互相引用,因此它有点像是 2
\label
,并且每个文本都可以引用\ref
另一个:- 在打印的注释中,通过页码来引用参考文本;
- 引用该注释的地方,仅给出打印该注释的页码。
纸币上印有粗体标题,由两部分组成:
- 一种称谓:,这显然与注释不同
- 进一步阅读的建议:,所有笔记都相同
随后是注释的全文。因此,我怀疑,理论上引用文本可以提到一种称谓:(也许没有:)
\ref
,如果作者愿意的话。
显然有几个包可能针对这样的布局,但是每个包似乎都有一些缺点。
-
这最新版本来自 2020-01-02,所以不是最近才有的。另外还有几个包,比如
pagenote
提到它有一些缺点,所以我没有花太多精力去理解如何使用它。 -
其中一个问题描述这个问题,Enrico Gregorio 提供了一种解决方法。不过,显然,该解决方法不再有效,您可以通过编译他的答案中的 MWE 并检查后记中的章节编号是否为 1 来验证。
毕竟这个包的最新版本是 v1.1a,最后修订于 2009/09/03,所以这是一个相当老的软件包,我对它没有太多的期望(尽管一个答案到我最近有一个问题表明该包仍然可以使用,并且有一定的成功率)。
-
从包装文档中,我并没有真正理解如何避免像脚注一样对注释进行编号,以获得如附图所示的布局。
另外,还有一个类似的问题
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,所以这个包相当新并且可能是我应该使用的。
-
这似乎是最近更新的,最新更新日期为 2022-11-13。目前我被困在了
File `postnotes.sty' not found
,但文档中没有结果的示例,所以在花时间之前,我想了解这是否确实是我应该使用的包。另一个(小)缺点是它不能
babel
自动支持,因为目前支持的语言只有英语、德语、法语和葡萄牙语。(实际上,以德语开始文档\documentclass[german]{book} \usepackage[german]{babel}
不会使注释的标题变成德语,所以……)
因此,对于这个问题,我想知道是否有人对这个主题有足够的经验来得出一个答案,说出这些软件包的优缺点,概述每个软件包提供的功能,而不是所有其他软件包都提供的功能。
答案1
我觉得自己可能就是这样的人。但这个答案需要免责声明,我是的作者postnotes
。我会尽量做到公正,但要小心。
尾注
endnotes
是用于此目的的古老而传统的软件包。它已经存在了几十年,其变更日志可以追溯到 20 世纪 80 年代,并且非常可靠。它的代码非常清晰。这真是一个美丽的东西,我希望有一天我能像那样编码。
即使可以说是斯巴达式的,也是endnotes
经过精心打造的,实际上很容易调整。@egreg 在网站上的回答就是一个例证。一些常见任务的示例:
- 按章节划分尾注:https://tex.stackexchange.com/a/62425/105447或者https://tex.stackexchange.com/a/85001/105447
- 改进交叉引用:https://tex.stackexchange.com/a/209027/105447
- 在列表环境中打印结束注释:https://tex.stackexchange.com/a/225601/105447
然而,随着时间的推移,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
做了一些不同的事情,它将注释及其完整内容写入文件,以便您可以随时获得所有注释,然后可以随时打印。pagenote
enotez
.aux
begindocument
后记
我在今年早些时候编写了这个包,因为我正在编写一份需要尾注的文档,但很难从现有包中获得我想要的东西。在之前存在的包中,我显然选择了enotez
。但对我来说,一个重要的要求并没有真正实现,而且我对此还有另一个实际/技术上的疑虑。这个要求是打印的运行头,其中包含来自注释来源(页面等)的信息。出现技术问题是因为我正在处理一个大型文档,尾注部分本身大约有 150 页,所以enotez
工作方式意味着文件中最终会出现大量材料.aux
,从而导致编译时间相应减少。因此,postnotes
是那些“解决我自己的问题”的包之一。
一些独特的特点:
- 支持打印注释的运行头。默认情况下,它的形式是“NM 页注释”,但你可以得到更花哨的形式,如“AB 章注释,NM 页注释”等等。(这个特定功能实际上已经提供给
enotez
,在撰写本文时正在等待代码审查https://github.com/cgnieder/enotez/issues/37)。 postnotes
努力存储笔记放置位置的一些“上下文”,并使其在打印笔记时可用。我biblatex
在实现这一点时非常重视,并尝试添加对 、 和 的支持refsection
。refcontext
事实refsegment
证明,这比我预想的要难得多biblatex
(https://github.com/plk/biblatex/issues/1226)。但它仍然是一个潜在的强大功能。特别是,我昨天给你的答案(https://tex.stackexchange.com/a/669491/105447) 正是通过这种方式来工作的,放置注释的页面被存储起来,然后\pnthepage
在打印的地方提供。- 从技术方面来说,
postnotes
不将笔记内容写入外部文件,而是将其存储在变量中。该.aux
文件仅用于存储页面引用。因此,避免了通常由写入和读取引起的问题。 - 将注释存储在变量中增加了一些灵活性,这是可以利用的。例如,通常,放置在浮点中的结束注释可能会扰乱注释的顺序。可以通过设置手动标记来更正编号。但注释打印的顺序是乱序的。有了一组可用作变量的注释,我们可以对它们进行预处理,例如对它们进行排序。这确实有效
postnotes
。(从技术上讲,enotez
也可以这样做,但我认为它不行)。
其他值得注意的特点:
- 由于
enotez
,postnotes
也提供全力hyperref
支持,包括反向链接。 - UI 主要是 key=val,但并非完全如此。它非常灵活,与 相比,确实牺牲了一些用户友好性来换取灵活性
enotez
。 - 更好地支持对尾注的交叉引用,语法更好。您可以为注释标记和注释文本设置标签(据我所知,这
postnotes
是唯一允许这样做的软件包)。语法形式为\postnote[label=en:mark]{\label{en:text}End note.}
。此外,还支持zref
和zref-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
自称提供“日式尾注”,但我无法通过阅读手册来告诉您这是什么意思。- 一些用于执行其他操作的相当专业的包也可用于生成结束语:
parnotes
和sepfootnotes
。
好吧...看来我比我承诺的更偏袒。我想我可以多说一点我所做的事情是很自然的。我希望我没有不公平。;-)
尽管如此,这四种替代方案都非常好(可能除了独立的pagenote
,如上所述)。检查您的需求和它们提供的内容,如果它们足够,您将获得良好的服务。如果您不需要hyperref
,您可能更喜欢 的稳健性和稳定性endnotes
。如果您正在使用memoir
,您会发现一个集成良好且资源丰富的尾注基础架构。如果您需要反向链接和更大的灵活性,enotez
或postnotes
会为您提供这些。如果您需要笔记的运行标题,那么postnotes
或endnotes
都是endheads
替代方案。
在评估软件包时,您似乎将“现代”、“最新”或“上次升级”理解为“最佳”。但对于一般软件来说,情况往往并非如此,对于 LaTeX 软件包来说可能更是如此。此外,在了解任何特定软件包时,您应该花点时间至少浏览一下其文档,然后再下结论并如此迅速地丢弃它们。我非常有信心,您在问题中提到的许多问题(即使不是全部)都是可以解决的。
关于你努力实现的那种尾注风格,我也同意评论中表达的观点,即这对读者来说特别困难。我提供了在其他地方实现这种风格的pagenote
方法postnotes
(https://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
,该软件包最近才收到贡献,而您可能正在运行它的过时版本。如果您缺少所需的任何其他语言,欢迎您贡献它,这实际上非常简单。