这个页面介绍了如何创建具有复杂列表项的列表。

一个*复杂列表项*是包含块内容的列表项,这些块内容跟随主要文本(可能为空)。这与主要文本跨多行的列表项不同,对此本页有所区分。此外,页面还解释了如何在祖先列表中将块附加到列表项上。

本页所述的语法主要焦点是保持列表的连续性(即,防止列表中断)。

多行主文本

与常规段落文本一样,列表项中的主要文本可以跨越任意数量的连续行(即,相邻的行之间没有空行)。多行将组合成单个段落,并像常规段落文本一样换行。即使这些行像本示例中的第三个项目符号那样缩进,这一行为也同样适用。

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=indent]

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=indent]

Tip
当列表项包含超过一行文本时,在项之间留一个空行,以便在查看代码时更容易阅读。两个列表项之间的空行不会打断列表。

列表中的空行

列表中两个项目(有序或无序)之间的空行不会打断列表。对于有序列表,这意味着编号将是连续的,而不是重新从1开始。 (请参阅xref:separating.adoc[],了解如何强制两个相邻的列表分开)。

如果列表项后面有一个空行,随后紧接着是一个块的开始,比如一个段落或限定块而不是另一个列表项,那么列表将在此处终止。如果发生这种情况,您会注意到随后的列表项将被放置到一个新的列表中。对于有序列表,这意味着编号将重新开始(从1开始)。

在一些情况下保持列表的连续性——例如当你在记录一个程序中的复杂步骤时——你必须使用一个list continuation 来将块附加到列表项上。对于有序列表,这将确保编号从一个列表项连续到下一个列表项,而不是被重置。

使用列表继续连接块

除了主要文本之外,列表项还可以包含块元素,包括段落、限定块和块宏。要向列表项中添加块元素,您必须使用列表继续符号将它们“附加”(连续排列)。列表继续符号是一个单独行上的`+`符号,紧邻着被附加的块。

Note
在一行的末尾添加一个 + 符号,而不是单独作为一行,这不是列表的延续。相反,它会创建一个硬换行。

这是一个使用列表延续的列表项的例子:

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=cont]

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=cont]

使用列表延续,你可以将任意数量的块元素附加到列表项上。除非该块位于已被附加的限定块内,否则每个块必须前面有一个列表延续才能形成块链。

这是一个示例,它将一个列表块和一个警告段落附加到第一个列表项上:

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex]

这是源代码的渲染方式:

Example 1. 一个包含复杂内容的列表

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex]

如果你要在列表项上附加不止一个块,强烈建议你将内容包裹在一个开放块内。这样,你只需要一个列表延续线就能将开放块附加到列表项上。在开放块内部,你可以像平常一样写作,不再需要担心在各个块之间添加列表延续线来保持它们附着在列表项上。

这是一个例子,包含了在开放区块内包裹复杂列表内容:

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-o]

这是该内容的渲染方式:

Example 2. 一个包含复杂内容的列表被包裹在一个开放块中

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-o]

开放式块封装器在您需要将共享文件的内容包含到列表项中时也很有用。例如:

* 列表项
+
--
include::shared-content.adoc[]
--

通过将include指令包裹在一个开放块中,可以不修改内容地使用。

这项技术唯一的局限性是内容本身可能不能含有开放式区块,因为开放式区块(暂时)还无法嵌套。

删除主要文本

如果列表项的主要文本是空的,主要文本的节点将被删除。这样,您就可以使第一个块(例如列表块)与列表标记对齐。您可以通过使用 {empty} 属性引用来使主要文本为空。

这是一个列表的例子,其中的项目内容_仅仅_是复杂的。

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-only]

这是源代码的渲染方式:

Example 3. 一个包含复杂内容的列表

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-only]

将块附加到祖先列表

你可能需要结束当前列表项并将块附加到其祖先列表项,而不是仅将块附加到当前列表项。在AsciiDoc语法中有两种表达这种组合的方法。你可以将子列表包围在一个开放块中,或者你可以在列表延续之上插入空行以首先从嵌套中逃脱。让我们先来看看将子列表置于开放块中的方法,因为这是首选的方法。

包围在开放区块中

如果您打算将块附加到列表项作为嵌套列表的兄弟元素,创建该结构的最稳健方式是将嵌套列表包含在一个开放块中。这样,就清楚地知道嵌套列表在哪里结束,以及当前列表项在哪里继续。

这是一个列表项的例子,它包含一个嵌套列表,后面跟着一个附加的段落。开放式块使得嵌套列表的边界清晰可见。

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-enclosed]

这是源代码的渲染方式:

Example 4. 一个嵌套列表包含在一个开放的区块中

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-enclosed]

这种方法的主要局限性在于它在层次结构中只能使用一次(即,它只能包含一个嵌套列表)。那是因为开放块本身不能嵌套。如果你需要更多控制,则必须使用祖先列表延续。

祖先列表延续

通常,列表延续会将一个块附加到当前列表项上。对于你在列表延续之前添加的每一个空行,关联将在嵌套中上移一级。换句话说,一个空行会向列表延续发出信号,让它退出当前列表一级。因此,块将被附加到某个祖先列表中的当前项上。这种语法被称为[.term]祖先列表延续

Warning
祖先列表续行是一种脆弱的语法。首先,新作者可能不会意识到列表续行前的空行是有意义的。这是因为AsciiDoc语法通常忽略连续的空行。还有一些情况下,即使这些空行也会被折叠,因此阻止祖先列表续行按预期工作。谨慎使用这一语法特性。如果可能,将嵌套列表放在一个开放的区块中,如前一节所述。

这里有一个段落的例子,它紧接着嵌套列表结束后附加到父列表项中。列表延续上方的空行表明该块应该附加到父列表中的当前列表项。

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-parent]

这是源代码的渲染方式:

Example 5. 一个附加在父列表项上的块

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-parent]

每个紧邻列表连续体之前的空行表示上移一个嵌套层级。这里有一个示例,展示了如何通过使用两个引导空行将一个段落附加到祖父母级列表项上:

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-grandparent]

这是源代码的渲染方式:

Example 6. 附加到祖父母列表项的块

Unresolved directive in continuation.adoc - include::example$complex.adoc[tag=complex-grandparent]

概要

在这个页面上,你学到了列表项的主要文本可以跨越多个连续行,这些行可以为了可读性而缩进,但不会影响输出。你了解到你可以使用列表延续符将任何类型的块状内容附加到一个列表项上。你还学到了,使用这个特性与开放块结合起来可以更容易地创建带有复杂内容的列表项,将块附加到父列表中,或去除主要文本。最后,你学到了你可以使用祖先列表延续符将块附加到祖先列表中的当前项目,并了解了这样做的风险。