AsciiDoc 提供了 footnote 宏来向文档添加脚注。脚注是对脚注列表中某项的引用。脚注在 AsciiDoc 中的引用位置处定义,但文本会被提取到脚注列表中的一个项目。通过为第一次出现的脚注分配一个 ID,并在后续出现中引用该 ID,可以在多个位置引用同一个脚注。

Note
所有的AsciiDoc处理器,包括Asciidoctor,目前都将脚注实现为尾注。脚注的放置和编号可以通过自定义转换器来定制。

脚注宏语法

您可以使用脚注宏在文档中插入脚注。脚注的文本在脚注宏的方括号之间定义(footnote:[text])。脚注宏接受一个可选的ID,使用宏的目标(footnote:id[text])。指定一个ID允许您在文档的多个位置引用同一个脚注。要引用之前定义的脚注,您只需在目标中指定ID而不指定文本(footnote:id[])。

脚注语法
Unresolved directive in footnote.adoc - include::example$footnote.adoc[tag=base-c]
  1. 将脚注宏直接插入到任何标点符号之后。请注意,脚注宏只使用一个冒号(:)。

  2. 将脚注内容插入方括号([])内。文本可能会跨越多行。

  3. 如果你打算重用一个脚注,在目标位置指定一个唯一的ID。

  4. 要引用已有的脚注,您只需要在目标槽中指定脚注的ID。方括号间的文本应该为空。如果同时指定了ID和文本,并且ID已由之前的脚注定义,那么该文本将被忽视。

Tip
如果你发现必须将脚注宏直接放在单词旁边会让阅读变得困难,你可以在中间插入一个属性引用,它解析为空字符串(例如,word{empty}footnote:[text])。

文章中的脚注是连续编号的。

结果显示在下方。

Unresolved directive in footnote.adoc - include::example$footnote.adoc[tag=base-x]

就像普通段落文本一样,您可以在脚注的文本中使用文本格式标记。

将脚注外化

由于脚注是使用内联宏定义的,因此必须将脚注内容与其注解的文本一起插入。这一要求可能会使文本更难阅读。通过使用文档属性来外部化您的脚注,您可以解决这个问题。

当定义一个包含脚注的文档属性时,你可以随意命名这个文档属性。一个常见的做法是使用`fn-前缀来命名属性。属性的名称可以是详尽的(如`fn-disclaimer)或者简洁的(如`fn-1`),这取决于你的偏好。

这是前面的示例,其中脚注定义在文档属性中,并使用属性引用插入。

外部化脚注
Unresolved directive in footnote.adoc - include::example$footnote.adoc[tag=externalized]

注意到你仍然能够受益于看到脚注放置的位置,而不需要所有的干扰。由于脚注现在是在文档头部定义的,它们可以进一步外部化到一个包含文件中。

这种方法之所以有效,是因为属性引用会在解析脚注之前被展开。然而,如果脚注文本中有文本格式标记(例如,*bold*),这种技术就不起作用。那些标记不会被解释。这是因为属性替换(替换属性引用)是在引号替换(解释文本格式标记)之后应用的。为了在脚注文本中使用文本格式标记,你需要使用 pass:[] 宏,在属性条目的值上配置替换。

以下示例演示了如何配置应用于外部化脚注文本的替换,以便尊重文本格式标记。

带有文本格式的外部化脚注
Unresolved directive in footnote.adoc - include::example$footnote.adoc[tag=externalized-format]

'''The c,q target on the pass macro instructs the processor to apply the special characters substitution followed by the quotes substitution. That means the text formatting in the footnote text will already be applied when the footnote is inserted using an attribute reference.''' 的中文翻译是:'''`c,q`目标在pass宏上指示处理器首先应用特殊字符替换,然后应用引号替换。这意味着当脚注通过属性引用插入时,脚注文本中的文本格式将已经被应用。'''

标题中的脚注

在预规范的AsciiDoc中,脚注*并不官方支持用在标题(章节标题和独立标题)中。虽然脚注会被解析,但不能保证它能够正确工作,可能需要使用一些解决方法。一旦AsciiDoc语言被规范定义,这一限制可能会被取消。

如果你在标题中使用脚注,你可能会发现脚注索引是错误的(要么没有递增,要么顺序错误)。这是因为标题(章节标题和离散标题)在文档顺序之外被转换,以便生成ID,填充交叉引用,以及急切地解析属性引用。

解决这个问题的一个方法是为包含脚注的任何标题分配一个显式的ID和参考文本。例如:

见 <<标题>>。

[[标题,标题]]
== 标题脚注:[这是一个带有脚注的标题]

将一个显式的ID和reftext分配给一个标题将阻止在渲染标题之前应用替换,因此允许按照文档顺序处理脚注宏。这种解决方法也将防止脚注编号在xref的文本中重新出现。然而,你还必须避免在标题中使用任何属性引用,因为那也会导致应用替换过于急切,这可能导致脚注的处理顺序不当。