一个指向当前AsciiDoc文档中另一个位置或其他AsciiDoc文档的链接被称为[.term]交叉引用(也称为[.term]xref)。要创建一个交叉引用,您首先需要定义引用将指向的位置(即锚点)。然后,您需要使用内联xref宏的某种形式来创建指向该位置的引用。从那里,您可以以各种方式自定义引用文本。
自动锚点
重要的是要理解,许多锚点已经为你定义好了。在默认设置下,AsciiDoc处理器会自动为每个章节和独立标题创建一个锚点。它通过为那个章节(或独立标题)生成一个ID,并在引用目录中注册该ID来实现这一点。然后你可以使用那个ID作为交叉引用的目标。
例如,考虑以下部分。
= 章节标题
AsciiDoc处理器会自动为这一节分配ID _section_title
,然后你可以用它作为xref的目标以创建对这一节的引用。你还可以自定义这个ID是如何生成的。有关AsciiDoc处理器如何生成这些ID的更多信息,请参考sections:auto-ids.html。
如果你指的是除了章节之外的内容元素,你需要在该元素上明确定义一个锚点。
内部交叉引用
在AsciiDoc中,简写xref用于创建对文档内部具有ID的元素(例如,章节、块、列表项等)的交叉引用。简写xref通过宏替换来处理。
如果交叉引用同时指定了ID和文本,那么文本将被格式化并用作链接文本。如果交叉引用仅指定了ID,那么目标元素的reftext(通常是格式化的标题)会自动用作链接文本。如果该元素没有定义reftext,则会使用该ID的一种风格化形式代替。无论是在被引用元素上显式分配ID还是自动生成,这种机制的工作方式都不受影响。
目前,AsciiDoc处理器可以解析对以下元素的交叉引用:
-
章节(ID或块锚点)
-
区块(ID或区块锚点)
-
块宏 (ID)
-
段落中任何位置的内联锚点
-
列表项或表格单元格开始处的内嵌锚点
-
参考文献锚点在参考文献列表中
请注意,处理器无法解析分配给一段格式化文本的ID。如果交叉引用无法解析,并且启用了详细模式,AsciiDoc处理器会发出关于可能的无效引用的警告。在这种情况下,输出文档将盲目地引用目标,因此它仍有可能正常工作。
您可以通过将目标块或章节的ID(或另一个文档的路径以及可选的锚点)括在双尖括号中来创建交叉引用。
Unresolved directive in xref.adoc - include::example$xref.adoc[tag=base]
使用目标章节的ID进行交叉引用的结果显示如下。
Unresolved directive in xref.adoc - include::example$xref.adoc[tag=base]
显式链接文本
转换器通常使用目标的reftext作为链接的默认文本。当文档被解析时,reftext中的属性引用会立即被替换。当显示reftext时,会对文本应用额外的reftext替换,包括特殊字符、引号和替换文本。
您可以通过在交叉引用位置指定替代文本来覆盖目标的参考文本。在ID之后,添加一个逗号,然后输入您希望交叉引用显示的自定义文本。
Unresolved directive in xref.adoc - include::example$xref.adoc[tag=text]
在这种情况下,即使目标含有点号(.
),也会被假定为是同一文档内的一个ID。
你也可以使用内联的xref宏作为xref简写的替代方法。
Unresolved directive in xref.adoc - include::example$xref.adoc[tag=xref-macro]
然而,最好是保留xref宏的使用,用于创建跨文档交叉引用。
在使用xref宏时,如果目标包含一个点(.
),它会被当作是对另一个文档的引用,而不是同一文档内的一个ID。如果意图是链接到同一文档内的一个ID,那么目标前面必须紧跟一个井号(#
)。
自然交叉引用
您也可以通过使用其标题而不是其ID来创建对块或章节的引用。这种类型的引用被称为[.term] 自然交叉引用。标题必须包含至少一个空格字符或包含至少一个大写字母。
Unresolved directive in xref.adoc - include::example$xref.adoc[tag=xref-title]
作为一个经验法则,只有在快速开发或者短暂内容的时候才应该使用自然交叉引用。随着内容的成熟,你应该转而使用ID进行引用,理想情况下是明确声明的ID。通过这样做,它确保你的引用具有最大的稳定性,并且可以防止标题修订的影响。