这份指南提供了一个对AsciiDoc的温和介绍,一个_纯文本_文档的*语法*和*处理器*。这个介绍面向任何希望减少编写和发布内容所需努力的人,无论是技术文档、文章、网页还是传统的散文。

如果你想知道AsciiDoc的全部内容,请在https://docs.asciidoctor.org/asciidoc/latest/#about-asciidoc[关于AsciiDoc]中找到答案。如果你正在寻找一个简洁的AsciiDoc语法概览,请查阅https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/[AsciiDoc语法快速参考]。

在这份指南中,你将学到:

  • AsciiDoc文档的基本结构

  • 如何创建您的第一个AsciiDoc文档

  • 如何添加其他结构元素,例如列表、区块引用和源代码

  • 如何将AsciiDoc文档转换为HTML、DocBook和PDF

除了介绍AsciiDoc的基本知识,这份指南还建议了一套约定,帮助你创建更一致的文档,并最大化你的写作效率。

让我们深入了解AsciiDoc吧!

使用AsciiDoc编写

这个部分的目标是教你怎样编写你的第一个AsciiDoc文档。希望当你回顾时,你会同意这很有道理。

你的AsciiDoc冒险之旅从你最喜欢的文本编辑器开始。

这只是文本,伙计。

由于AsciiDoc语法仅仅是纯文本,你可以使用任何文本编辑器编写AsciiDoc文档。你不需要像Microsoft Word、OpenOffice Writer或Google Docs这样复杂的文字处理程序。事实上,你不应该使用这些程序,因为它们会向你的文档添加不必要的内容(你看不见的),这会使转换变得繁琐。

虽然任何文本编辑器都可以工作,但我建议选择一个支持AsciiDoc语法高亮的编辑器。那些*color*会给文本带来对比度,使得它更易于阅读。高亮显示也能确认你是否为内联元素或区块元素输入了正确的语法。

在macOS上编辑纯文本最受欢迎的应用是*TextMate*。Linux上的一个类似选择是*GEdit*。在Windows上,远离记事本和写字板,因为它们生成的纯文本不具备跨平台友好性。相反,应该选择像*Notepad++这样的能干的文本编辑器。如果你是程序员(或者是有内在极客精神的作家),你可能会更喜欢*VimEmacs*或*Sublime Text,这些都是跨平台可用的。所有这些编辑器共享的关键功能是为AsciiDoc提供语法高亮显示。

打开你最喜欢的文本编辑器,准备好写一些AsciiDoc吧!

内容为王!

在文档中,大部分内容都是段落文本。这就是为什么Asciidoctor不需要任何特殊的标记或属性来指定段落内容。你可以直接开始输入。

在Asciidoctor中,相邻或连续的文本行会形成一个段落元素。在其他元素后开始一个新段落,比如节标题或表格,请按两次RETURN键以插入一个空行,然后继续输入你的内容。

AsciiDoc文档中的两个段落
这段旅程始于一个周一的傍晚,在安特卫普。
我们团队迫切需要咖啡,但我们中没有人敢打开办公室的门。

离开意味着代码的解体和必然的死亡。
两段使用默认的(html5)转换器和样式表(asciidoctor.css)渲染。

这段旅程始于一个周一傍晚在安特卫普。我们团队急需咖啡,但我们中没有一个人敢去开办公室门。

离开意味着代码的解体和必然的死亡。

就这样,你正在使用AsciiDoc编写文档! 正如你所见,这和写一封电子邮件差不多。

将文件保存为扩展名为 .adoc 的文件。

如果你想要了解如何将文档转换为HTML、DocBook或PDF格式,请跳转到[converting-your-document]节。

文本换行和硬回车

由于在Asciidoctor转换文档时,相邻的文本行会被合并成一个单独的段落,这意味着你可以对段落文本进行换行处理,或者将每个句子或短语放在单独的行上。这些换行符不会出现在输出中。

然而,如果你希望在段落中保留换行符,你可以在每一行的末尾使用一个加号 (+) 或者在段落上设置`hardbreaks`选项。这将导致每行后面都出现一个可见的换行标签(例如,<br>)。

通过空格加上加号(+)来保持换行不变
红宝石呈红色,
黄玉呈蓝色。

红宝石是红色的,
黄玉是蓝色的。

使用hardbreaks选项保留了换行
[%hardbreaks]
Ruby is red.
Java is black.

Ruby是红色的。Java是黑色的。

为了在整个文档中保持换行符,将`hardbreaks`属性添加到文档的头部。

使用hardbreaks属性可以在整个文档中保持换行不变。
= 换行符文档标题
硬换行

红宝石是红色的,黄玉是蓝色的。

劝告

有些声明你可能希望通过将它们从内容的流程中拿出来,并用优先级标签来标记以引起注意。这些被称为警示。它的呈现样式由分配的标签(即值)决定。Asciidoctor 提供了五种警示样式标签:

  • 注意

  • TIP

  • 重要

  • 小心

  • 警告

谨慎与警告

当你在选择警告类型时,你可能会发现自己在“谨慎(caution)”和“警告(warning)”之间感到困惑,因为这两个词经常被交替使用。这里有一个简单的规则帮助你区分这两者:

  • 使用*小心*来建议读者谨慎行动(即,小心谨慎)。

  • 使用*警告*来通知读者存在的危险、伤害或后果。

当你想要突出一个单独的段落时,从你想使用的标签开始该段落的第一行。标签必须是大写的,并且后面跟着一个冒号(:)。

警示段落语法
警告:众所周知,沃尔珀廷哥喜欢在服务器机架中筑巢。(1) (2)
请自行承担风险进入。
1 标签必须是大写字母,并且紧跟着一个冒号(:)。
2 将段落的第一行与标签之间用一个空格分开。
结果:警告段落
沃尔珀廷格通常被知道筑巢在服务器机架中。自行进入请谨慎。

一个警告段落将以呼叫框的形式呈现,并且在侧边栏中带有警告标签或其对应的图标。通过在文档上设置 icons 属性可以启用图标。

警告也可以包含任何块内容,我们稍后会详细介绍。

温和的标点,强烈的影响

就像我们在说话时强调某些词语和短语一样,我们可以通过用标点符号包围它们来在文本中强调它们。AsciiDoc将这种标记称为“引用文本”。

引用文本

例如,在一封电子邮件中,你可以通过用星号包围一个词来“强调”它的读音。

我简直不敢相信,我们赢了!

如你所预期的,星号会使文本中的 won 变成粗体。你几乎可以感受到其中的情感。这是引用(即,格式化)文本的一个例子。

术语“quote”在这里被广泛使用,用于指任何围绕文本的符号以赋予强调或特殊含义。

AsciiDoc识别的引用文本形式有:

粗体、斜体和等宽格式语法
加粗 *受约束的* & **不**受约束的

斜体 _受限_ 和 __不__受限

加粗斜体 *_受限制的_* 和 **__不__**受限制的

等宽 `受限的` & ``不受限的

等宽粗体`*受限的*` & ``**非**``受限的

单空格斜体 `_constrained_` 和 ``__un__``constrained

单间距粗斜体 `*_约束_*` 和 ``**__非约束__**``unconstrained

当你想要引用文本(例如,添加强调)但不是在单词边界处时,你需要重复使用标点符号。

结果:粗体,斜体和等宽字体文本

加粗 受限 & 限制

斜体 受限 & 不受 限制

加粗斜体 受限受限

等宽 constrained & unconstrained

等宽粗体 受限制的 & ``受限制的

等宽斜体 constrained & unconstrained

等宽粗体斜体 受限 & 受限

任何引用文本都可以在前面加上属性列表。第一个位置属性被当作一个角色。角色可以用来为文本应用自定义样式。比如:

在搜索栏中输入单词 [.userinput]#asciidoc#。

当转换成HTML时,单词 “asciidoc” 被包裹在 <span> 标签中,并且角色被用作元素的CSS类:

<span class="userinput">asciidoc</span>

你可以使用CSS来对文本应用样式。

你可能并不总是希望这些替换发生。在那些情况下,你需要使用标记来转义文本。

防止替换

如果您在不想要的地方获得了引用文本的表现,您可以使用反斜杠或者穿透宏来阻止它。

Asciidoctor 提供了几种方法来防止替换。

反斜杠转义

为了防止标点符号被解释为格式标记,需要在其前面加上反斜杠(\)。如果格式标点以两个字符开头(例如,__),则需要在它前面加上两个反斜杠(\\)。这也是防止字符和属性引用替换的方法。当文档被处理时,反斜杠会被移除,因此它不会在输出结果中显示。

*Stars* 将显示为 *Stars*,而不是粗体文本。

\&sect; 将以实体形式出现,而不是 &sect; 符号。

\\__func__` 将会显示为 `__func__`,而不是被强调的文本。

\{两个分号\}将会出现{两个分号},不会被解析为 ;;。

Asciidoctor支持多种形式的直通宏。

内联传递宏

一个名为 pass 的内联宏,可用于透传内容。 支持一组可选的替换。

pass:[content like #{variable} passed directly to the output] followed by normal content.

应用了仅选择性替换的内容:通过:c,a[__<{email}>__]
单身和双倍加分

一种用于防止文本被格式化的特殊语法。它只转义特殊字符以符合输出格式,并不支持明确的替代。

三重加号

一种用于指定直通内容的特殊语法。不应用任何替换(相当于内联直通宏)且不支持显式替换。

双美元符号(已弃用)

一种已废弃的特殊语法,用于指定直通内容。就像三重加号,它不应用任何替换,并且不支持显式替换。

Asciidoctor没有实现块传递宏。相反,您应该使用一个传递块

内联pass宏和显式替换

要从替换中排除一个短语并禁用特殊字符的转义,请将其括在内联传递宏中。例如,以下是在从AsciiDoc生成HTML时将文本格式设置为下划线的一种方法:

文本pass:[<u>underline me</u>]被加了下划线。

文本underline me已经被加下划线。

如果你想要启用临时的`quotes`替换,那么就将`macros`值分配给`subs`并使用内联pass宏。

[subs=+macros] (1)
----
我最好不包含加粗或斜体文字。密码:引用[但我应该包含加粗文字。] (2)
----
1 "`macros` 被赋值给 subs,这允许块内的任何宏进行处理。"
2 The pass宏被赋予了`quotes`值。方括号内的文本将被格式化。

内联传递宏确实会在源代码中引入额外的标记,这可能会导致原始形式的代码无效。然而,它产生的输出在查看器(HTML、PDF等)中查看时将是有效的。

I better not contain *bold* or _italic_ text.
But I should contain bold text.

内联传递宏还接受用于指定替换的简写值。

  • c` 是特殊字符

  • q` = 引号

  • a` = 属性

  • r` = 替换品

  • m` = 宏

  • p` = 发帖替换

例如,在下面的内联直通宏中分配了引用文本的替换值:

文本pass:q[<u>下划线 *我*</u>]已加下划线,单词“`我`”加粗。

文本加下划线已经被加下划线,单词“me”是粗体。

三重加通行

三重加号直通与pass宏的作用非常相似。要从替代中排除内容,请将其包含在三重加号(+++})中。

content passed directly to the output followed by normal content.

三重加宏经常被用来输出自定义的HTML或XML。

文本 +++<u>下划线</u>+++ 被加了下划线。

文本 划线我 被划了下划线。

单加围栏

要排除短语不被替换,请将其用加号(+)括起来。

这个 +*literal*+ 将会显示为 *literal*。

替换品

AsciiDoc也识别符号、箭头和破折号的文本表示形式。

文字符号替换
名称 语法 Unicode 替换 渲染 备注

版权

(C)
&#169;

©

注册商标

(R)
&#174;

®

商标

(TM)
&#8482;

破折号

--
&#8212;

 — 

只有当两边为单词字符、单词字符与行边界之间,或两边都有空格时才替换。

当两边被空格字符包围时(例如,a -- b),普通的空格会被替换为窄空格(&#8201;)。

省略号

...
&#8230;

…​

单向右箭头

->
&#8594;

双向右箭头

=>
&#8658;

=

单向左箭头

<-
&#8592;

双向左箭头

<=
&#8656;

排印引号

Sam's
Sam&#8217;s

Sam’s

打字机引号会被替换为排印(又称为卷曲)引号。

这种温和的标点符号并不影响文本的可读性。实际上,你可以说它使文本更易于阅读。重要的是这些都是你可能已经熟悉的惯例。

标点符号在AsciiDoc中被用来创建文档中另一种非常常见的元素,列表!

列表,列表,列表

AsciiDoc中支持三种类型的列表。

  1. 无序

  2. 有序

  3. 描述

无序列表和有序列表在结构上非常相似。它们由前缀为不同类型标记(即,项目符号)的项目组成。相比之下,描述列表——也称为变量列表、标签列表或术语定义列表——是一系列有各自支持内容的术语的集合。与无序和有序列表不同,描述列表很少嵌套,尽管它们经常包含前者。

让我们探索每一种类型的列表,然后将它们混合在一起。我们还将看看如何在列表项内放置复杂内容。

物品清单

如果你要在电子邮件中创建一个列表,你会怎么做?很可能,你会使用和Asciidoctor寻找列表项时相同的字符来标记列表项。

在下面的例子中,每个列表项都使用星号(*)标记,这是AsciiDoc语法指定的无序列表项。

* 爱伦·坡
* 谢里·S·蒂珀
* 比尔·布莱森

列表项的第一行文本必须至少与标记(*)有一个空格的偏移。如果你愿意,也可以缩进列表项。列表的前后需要空白行。此外,在列表项之间允许使用空白行,但不是必须的。

渲染无序列表
  • 埃德加·爱伦·坡

  • 舍里·S·泰珀

  • 比尔·布莱森

你可以通过在标题前加上句号(.)来为列表添加一个标题。

.Kizmet的最爱作家
* 爱伦·坡
* 谢里·S·特珀
* 比尔·布莱森
渲染无序列表并附有标题
Kizmet最喜欢的作者
  • 埃德加·爱伦·坡

  • 舍里·S·泰珀

  • 比尔·布莱森

你的直觉是使用连字符(-)而不是星号来标记列表项吗?猜猜看?那也行!

- 埃德加·爱伦·坡
- 谢里·S·泰珀
- 比尔·布莱森

你应该只在单层列表中使用连字符(-),因为连字符不支持嵌套列表。既然我们提到了嵌套列表,让我们进入下一部分,学习如何创建多层次的列表。

分隔列表

如果你有相邻的列表,它们会倾向于融合在一起。要想将列表强行分开,可以在两个列表之间插入一个被空行包围的行注释(//)。这里有一个例子,行注释中的`-`文本表示这一行作为"`列表结束`"的标记:

* 苹果
* 橙子

//-

* 核桃
* 杏仁

要嵌套一个项目,只需在标记符号上增加一个星号(*),并且每增加一个层级就再增加一个星号。

.Possible DefOps manual locations
* West wood maze
** Maze heart
*** Reflection pool
** Secret exit
* Untracked file in git repository
渲染嵌套的无序列表
可能的DefOps手册位置
  • 西木迷宫

    • 迷宫之心

      • 倒影池

    • 秘密出口

  • Git仓库中的未跟踪文件

在Asciidoctor 1.5.7及更早版本中,你最多只能拥有六级(6)嵌套(假设一个级别使用连字符标记)。

自从Asciidoctor 1.5.8以来,你可以将无序列表嵌套到任何深度。但是,请记住,一些接口在达到一定深度后会开始展平列表。GitHub在列表嵌套达到10层后开始展平列表。

* 一级
** 二级
*** 三级
**** 四级
***** 五级
* 一级
  • 一级

    • 二级

      • 三级

        • 四级

          • 五级 一级 ==

虽然看起来星号的数量代表嵌套的层级,但这并不是决定深度的方式。每遇到一个独特的标记符就会创建一个新的层级。然而,遵循星号数量等同于嵌套层级的惯例要直观得多。毕竟,我们的目标是一种即便是以原本样式阅读也能便于理解的纯文本标记。

==== 点单物品

有时,我们需要对列表中的项目进行编号。直觉可能会告诉你给每个项目前加一个数字,就像下一个列表中这样:

1. 质子
2. 电子
3. 中子

上述方法可行,但由于编号是显而易见的,如果你省略它们,AsciiDoc处理器将为你插入编号:

质子
电子
中子
  1. 质子

  2. 电子

  3. 中子

如果你决定使用数字来排序你的列表,你必须保持它们的顺序性。这与其他轻量级标记语言不同。这是调整列表编号偏移的一种方式。例如,你可以输入:

4. 第四步
5. 第五步
6. 第六步

然而,通常最佳实践是使用`start`属性来配置这类事情:

从第四步开始
第四步
第五步
第六步

要以相反的顺序展示项目,请添加`reversed`选项:

原子的组成部分
. 质子
. 电子
. 中子
原子的组成部分
  1. 质子

  2. 电子

  3. 中子

你可以通过在行首加上一个点并紧跟文本(点后不留任何空格)来给列表添加标题。

这是一个带标题的列表示例:

原子的组成部分
. 质子
. 电子
. 中子
原子的组成部分
  1. 质子

  2. 电子

  3. 中子

您可以通过在每个项目前使用一个或多个点来创建嵌套项。

步骤 1
步骤 2
.. 步骤 2a
.. 步骤 2b
步骤 3

AsciiDoc为每个嵌套等级选择不同的编号方案。以下是之前列表的渲染方式:

  1. 第一步

  2. 步骤2

    1. 第2a步

    2. 步骤 2b 第三步 ===

就像在无序列表中的星号一样,有序列表中的点的数量并不代表嵌套层级。然而,遵循这一惯例更直观:

点的数量 = 嵌套的层级

再次强调,我们的目标是创建即使是以纯文本格式查看也依然可读的标记。

Asciidoctor 努力推断出对我们人类来说最直观的项目之间的关系。下面是一个在有序列表中嵌套一个无序列表的例子:

. Linux
* Fedora
* Ubuntu
* Slackware
. BSD
* FreeBSD
* NetBSD
  1. Linux(操作系统)

    • 费多拉(操作系统)

    • Ubuntu

    • Slackware

  2. 伯克利软件发行版

    • FreeBSD NetBSD

你可以展开这些项,并且如果这样可以让你阅读起来更加清晰的话,可以对嵌套的列表进行缩进。

Linux

* Fedora
* Ubuntu
* Slackware

Berkeley Software Distribution

* FreeBSD
  * NetBSD

下表显示了每个嵌套级别默认使用的编号方案。

根据层级的有序列表编号方案
Level Numbering Scheme Examples CSS class (HTML converter)

1

Arabic

1. 2. 3.

arabic

2

Lower Alpha

a. b. c.

loweralpha

3

Lower Roman

i. ii. iii.

lowerroman

4

Upper Alpha

A. B. C.

upperalpha

5

Upper Roman

I. II. III.

upperroman

您可以通过设置其样式(块属性列表中的第一个位置条目)来覆盖任何级别的编号方案。您还可以使用`start`属性设置起始编号:

五
六
a
b
c
七

==== 描述列表

描述列表(通常缩写为dlist)在您需要为一个或多个术语包含描述或支持文本时非常有用。描述列表中的每一项由以下部分组成:

  • 一个或多个术语

  • 每个术语后面都跟有一个分隔符(通常是双冒号,::

  • 至少有一个空格或换行

  • 支持内容(无论是文本、附加块,或两者兼有)

这是一个描述列表的例子,它标识了计算机的各个部分:

CPU:计算机的大脑。
硬盘:用于操作系统和/或用户文件的永久存储。
RAM:在操作过程中临时存储CPU使用的信息。
键盘:用于输入文本或控制屏幕上的项目。
鼠标:用于在计算机屏幕上指向和选择项目。
显示器:使用文本和图形以视觉形式显示信息。

默认情况下,每个项目的内容将在渲染时显示在描述下方。这是此列表渲染效果的预览:

中央处理器

计算机的大脑。

硬盘驱动器

操作系统和/或用户文件的永久存储。

随机存取存储器

暂时存储CPU在操作过程中使用的信息。

键盘

用于输入文本或控制屏幕上的项。

老鼠

用来指向和选择计算机屏幕上的项目。

显示器

使用文本和图形以视觉形式显示信息。

如果你想要描述和内容显示在同一行,给列表添加横向样式。

CPU:: 计算机的大脑。
硬盘:: 操作系统和/或用户文件的永久存储。
RAM:: CPU在运行过程中临时存储信息。
中央处理器

计算机的大脑。

硬盘驱动器

操作系统和/或用户文件的永久存储。

随机存取存储器

暂时存储CPU在操作过程中使用的信息。

描述列表的内容可以是任何AsciiDoc元素。例如,我们可以重写上面的杂货清单,使每个过道都是一个描述,而不是一个父级大纲列表项。

乳制品::
* 牛奶
* 鸡蛋
面包店::
* 面包
农产::
* 香蕉
乳制品
  • 牛奶

  • 鸡蛋

面包店
  • 面包

生产

香蕉 ==

描述列表对空白字符的处理相当宽松,所以你可以分散各项,甚至在内容里添加缩进,如果这样能让你觉得更易于阅读的话:

奶制品::

* 牛奶
* 鸡蛋

面包店::

面包

生产:

香蕉

混合列表

最终,你可以在单个混合列表中混合并匹配这三种列表类型。Asciidoctor 努力推断出对我们人类最直观的项目之间的关系。

这里有一个列表,混合了描述性的、有序的和无序的列表项:

Operating Systems::
  Linux:::
    . Fedora
      * Desktop
    . Ubuntu
      * Desktop
      * Server
  BSD:::
    . FreeBSD
    . NetBSD

Cloud Providers::
  PaaS:::
    . OpenShift
    . CloudBees
  IaaS:::
    . Amazon EC2
    . Rackspace

列表的呈现方式如下:

混合列表
操作系统
Linux(操作系统)
  1. 费多拉(操作系统)

    • 桌面

  2. Ubuntu

    • 桌面

    • 服务器

伯克利软件发行版
  1. FreeBSD

  2. NetBSD

云服务提供商
平台即服务
  1. OpenShift

  2. CloudBees

基础设施即服务
  1. 亚马逊EC2

  2. Rackspace

你可以在列表项中包含更复杂的内容。

链接和图片

AsciiDoc 使得在文档中包含链接、图片和其他类型的媒体变得简单。

外部链接

你不需要做任何事情来创建一个指向URL的链接。只需在文档中包含URL,AsciiDoc会自动将其转换为链接。

Asciidoctor在没有任何标记的帮助下识别以下常见方案。

  • HTTP

  • 超文本传输安全协议

  • 文件传输协议

  • 互联网中继聊天

  • mailto

  • email@email.com

您可以将这些看作是隐式宏名称(裸露的电子邮件地址是一个特例)。由于下面示例中的URL以一个协议开头(在这种情况下是_https_加上冒号),因此当Asciidoctor处理时,它会自动将其转化为超链接。

Asciidoctor 项目的主页是 https://asciidoctor.org。 (1)
1 句子末尾的句点不会成为链接的一部分。

为了防止URL被自动链接,可以在它前面加上反斜杠(\)。

一旦启动,该网站将可通过 \https://example.org 访问。

如果您希望URL显示时隐藏协议方案,请在文档的头部设置`hide-uri-scheme`属性。

:hide-uri-scheme:

https://asciidoctor.org

当设置了hide-uri-scheme属性时,上述URL将如下渲染:

<a href="https://asciidoctor.org">asciidoctor.org</a>

注意在`<a>`元素内部没有_https_。

要将URL附加到文本上,将文本用方括号括起来放在URL的末尾,这样就把它变成了一个URL宏:

在irc://irc.freenode.org/#fedora[Fedora IRC频道]中与其他Fedora用户聊天。

当一个URL不是以任何已知common schemes开头,或者URL没有被单词边界所包围时,你必须使用`link`宏。link`宏是URI宏的加强版,你可以认为它是一个不受限制的宏。URL之前要加上`link text`),属性会被自动解析。

链接宏的解剖
link:url[optional link text, optional target attribute, optional role attribute]

让我们考虑一个情况,当一个链接不紧邻词语边界(即,不受限制)时,我们需要使用链接宏(而不是仅用URI宏)来展开一个链接。

搜索/链接:https://ecosia.org[艾可西亚]

搜索/链接:https://ecosia.org[艾科西亚]

如果我们在这种情况下不使用`link:`前缀,那么解析器将无法检测到URL宏。

目标窗口和链接的角色属性

= Asciidoctor 文档标题

Let's view the raw HTML of the link:view-source:asciidoctor.org[Asciidoctor homepage,window=_blank].

Let’s view the raw HTML of the Asciidoctor homepage.

因为“_blank”是最常见的窗口名称,我们引入了它的简写形式。只需在链接文本的结尾加上一个插入符号(^)。

Let's view the raw HTML of the link:view-source:asciidoctor.org[Asciidoctor homepage^].
如果您在单个段落中多次使用脱字符(caret)语法,您可能需要使用反斜杠转义第一次出现的位置。

当启用属性解析时,您可以向链接添加一个角色(即,CSS 类)。

在https://discuss.asciidoctor.org/[*邮件列表*^,角色=绿色]上与其他Asciidoctor用户聊天。

在https://discuss.asciidoctor.org/[邮件列表^,role=green]上与其他Asciidoctor用户交流。

具有属性的链接(包括 mailto 链接上的主题和正文部分)是 Asciidoctor 独有的特征。当它们被启用时,如果链接文本包含逗号,你必须用双引号将链接文本包围起来。

相对文件的链接

如果您想要链接到一个与当前文档相关的外部文件,请在文件名前使用`link`宏。

link:protocol.json[打开JSON文件]

如果你的文件是一个HTML文件,你可以直接链接到文档中的一个章节,在文件名的末尾追加一个哈希(#)符号以及该章节的ID。

link:external.html#livereload[LiveReload]

对于链接到相关的AsciiDoc文档,应当使用交叉引用。

交叉引用

在AsciiDoc文档内部或者不同AsciiDoc文档之间的链接被称为_交叉引用_(也称为_xref_)。

在Asciidoctor中,内联xref宏被用来创建交叉引用(也叫做文内或页面引文)到具有ID(无论该ID是显式的还是自动生成的)的内容元素(章节、块或短语)。

你通过将目标块或章节的ID(或其他文档的路径及可选锚点)括在双尖括号中来创建一个交叉引用。

使用目标部分的ID进行交叉引用
《图像》一节描述了如何将图像插入到文档中。
使用目标章节的 ID 渲染跨引用

“images”部分描述了如何将图片插入到你的文档中。

你也可以通过引用标题来链接到一个块或者节,这被称为[.term]自然交叉引用。标题必须包含至少一个空格字符或至少包含一个大写字母。(如果你使用的是 Ruby < 2.4,那个大写字母仅限于基本拉丁字符集)。

使用节标题进行交叉引用
参考<<内部交叉引用>>。
利用小节标题渲染的交叉引用

转换器通常使用目标的参考文本作为链接的默认文本。当文档被解析时,参考文本中的属性引用会立即被替换。当参考文本显示时,会对文本应用额外的参考文本替换(特殊字符、引号和替换文本)。

您可以通过在交叉引用位置指定替代文本来覆盖目标的参考文本。在ID之后,添加一个逗号,然后输入您希望交叉引用显示的自定义文本。

使用自定义xreflabel文本进行交叉引用
学习如何在链接宏中<<link-macro-attributes,使用属性>>。
使用自定义的xreflabel文本渲染交叉引用

您也可以使用内联xref宏作为双尖括号形式的替代方案。

内联引用宏
学习如何在链接宏中使用属性。

交叉引用也可以用来创建一个链接,该链接相对于当前文档指向一个文件。对于链接到另一个AsciiDoc文档,这是首选的方式。

尾随的井号 (#) 意味着您指向文档的顶部。

参考相对AsciiDoc文档顶部
请参阅<<document-b.adoc#,文档B>>以获取更多信息。
转换HTML以便与相对路径的AsciiDoc文档交叉引用
有关更多信息,请参考<a href="document-b.html">文档B</a>。

要直接链接到文档中的一个部分,请在井号(#)后面附加该部分的ID。

跨引用到一个相关AsciiDoc文档的特定部分
请参考<<document-b.adoc#section-b,第B节>>获取更多信息。
转换为HTML以便相对于AsciiDoc文档的不同部分进行交叉引用。
参考<a href="document-b.html#section-b">第B部分</a>以获取更多信息。

在这两种情况下,如果你正在引用的文档内部,这种语法也同样适用。如果你要在多个文档之间共享相同的链接,这会很有用。

在从文档间交叉引用创建的链接中,源文件的扩展名会被替换为`outfilesuffix`属性的值。要自定义链接目标中使用的文件扩展名,只需改变此属性的值即可。

图片引用与链接类似,因为它们也是对URL或文件的引用。当然,不同之处在于它们在文档中显示了图片。

图片

要在单独一行中包含图片(即,一个_块级图片_),使用`image::`前缀加在文件名前和方括号加在其后:

image::日落.jpg[]

如果你想指定替代文本,请将其包含在方括号内:

image::日落.jpg["日落"]

你也可以给图片一个id,一个标题(即,说明文字),设置它的尺寸(即,宽度和高度)并使其成为一个链接:

[#img-sunset]
.A mountain sunset
[link=https://www.flickr.com/photos/javh/5448336655]
image::sunset.jpg[Sunset,300,200]

当渲染时,块状图像的标题会显示在图像的下方。这里有一个预览:

一个带有标题的超链接图片
日落
山间日落
图片的解析是相对于`imagesdir`文档属性的值进行的,默认该值为空。`imagesdir`属性可以是绝对路径、相对路径或基础URL。如果图片的目标是一个URL或绝对路径,则不会添加`imagesdir`前缀。
你应该使用`imagesdir`属性来避免在每个图像宏中硬编码共享图片路径。

如果你想要内嵌一张图片,请使用`image:`前缀(注意这里只有一个冒号):

点击图片:save.png[保存,标题="保存"] 按钮。

对于行内图片,可选的标题将作为工具提示显示。

如果将段落和列表视为文档的主体,那么标题和章节就像它的骨架。让我们探索如何给我们的文档添加结构。

题目、题目、题目

AsciiDoc支持三种类型的标题:

  1. 文件标题

  2. 章节标题

  3. 区块标题

AsciiDoc中所有的标题都是可选的。本节将定义每一种标题类型,并解释如何以及何时使用它们。

文件标题

就像每封电子邮件都有主题一样,每个文档(通常)都有一个标题。标题放在AsciiDoc文档的顶部。

文档标题是AsciiDoc文档的一个_可选_功能。

要创建文档标题,从文档的第一行开始,用一个等号后跟至少一个空格(“= ”),然后是标题文本。这种语法是声明文档标题的最简单(因此推荐)的方法。

这里有一个文件标题后面跟着一个缩写段落的例子:

= 轻量级标记语言

据维基百科...

文档标题是文档头部的一部分。那么,头部还可以包含什么呢?好问题。

文件头

注意在上一个示例中标题行和内容的第一行之间的空白行。这个空白行将文档头部和文档主体分开(在这个案例中是一个段落)。文档标题是文档头部的一部分。总的来说,文档头部包含了标题、作者、修订信息和文档范围内的属性。

如果标题行没有被一个空行偏移,它会被解释为一个小节标题,我们稍后将讨论这个。

您的文档现在有了标题,但是作者呢?就像每封电子邮件都有发送者一样,每个文档肯定也要有一个作者。让我们看看如何向页眉添加包括作者在内的额外信息。

你可以在文档标题下方立即添加两行可选的文本,以定义常见的文档属性。

第1行

作者姓名和一个可选的电子邮件地址

线路2

一个可选的修订版,一个日期和一个可选的备注。

让我们将这些行添加到我们的文档中:

= 轻量级标记语言
Doc Writer <doc.writer@asciidoc.org> v1.0, 2012-01-01

据维基百科...

标题现在包含一个文档标题、一个作者、一个修订号和一个日期。这些信息通常会以格式化的头部形式显示在输出文档的顶部。

标题,包括文档标题,不是必需的。如果缺失,AsciiDoc处理器会愉快地转换任何存在的内容。标题仅在生成完整文档时使用。它在嵌入式文档的输出中被排除。

文档头部也可以用来定义属性。

文档属性

属性是AsciiDoc区别于其他轻量级标记语言的特性之一。您可以使用属性来切换特性或存储可重复使用或替换的内容。

通常情况下,属性是在文档的头部定义的。也有一些情况可以在内联定义它们,但我们将关注更常见的用法。

属性条目由一行开头的冒号包围的名字和至少一个空格组成,然后是内容。内容是可选的。

这是一个属性的示例,它包含了一个应用程序的版本信息:

= 用户指南
Doc Writer <doc.writer@asciidoc.org> 2012-01-01 :appversion: 1.0.0
第一个属性条目与其余标题之间不应该有空行。

现在你可以在文档中的任何地方(进行属性替换的地方)通过使用大括号包围属性名来引用这个属性:

当前应用程序的版本是{appversion}。

属性也经常用于存储URL,这些URL可能会相当长。这里有一个例子:

:fedpkg: https://apps.fedoraproject.org/packages/rubygem-asciidoctor

这里使用的属性是:

有关 Fedora 中 Asciidoctor 包的信息可以在 {fedpkg} 处找到。

文档属性也可以用来切换设置或设置配置变量,这些变量控制AsciiDoc处理器生成的输出。

例如,要在你的文档中包含一个目录,你可以定义`toc`属性。

:toc:

要取消定义一个属性,在名称的末尾加上`!`。

:linkcss!:

你也可以设置基本路径到图片(默认值:)、图标(默认值:./images/icons)、样式表(默认值:./stylesheets)和JavaScript文件(默认值:./javascripts):

:imagesdir: ./images
:iconsdir: ./icons
:stylesdir: ./styles
:scriptsdir: ./js
属性值也可以在调用AsciiDoc处理器时被设置和覆盖。我们稍后将探讨这一功能。

当你发现自己反复输入相同的文本,或者经常需要更新的文本时,考虑将其分配给一个文档属性,并使用该属性替代。

当你的文档越来越长时,你会想要将内容分成几个小节,就像这份指南中一样。这可以通过使用章节标题来实现。

章节标题

章节将文档划分为内容层次结构。在AsciiDoc中,章节是通过章节标题来定义的。

章节标题的语法与文档标题相同,不同之处在于该行可以以两个到六个等号开始,而不仅仅是一个等号。等号的数量代表了嵌套的层级(使用从0开始的索引)。

以下是AsciiDoc文档中允许的所有章节等级(对于文章文档类型,默认情况下),显示在文档标题下面:

= 文档标题(0级)

== 一级部分

=== 二级部分

==== 三级部分

===== 四级部分

第5级别小节

== 另一个一级标题
当文档被转换为HTML 5(使用内置的`html5`后端)时,每个节标题都会成为一个标题元素,其标题级别与等号的数量相匹配。例如,一个1级节(2个等号)对应一个`<h2>`元素。

章节层次不能任意选择。 你必须遵循两个规则:

  1. 一个文档如果`doctype`设置为`book`才能有多个0级部分。脚注:[默认的文档类型是`article`,它只允许一个0级部分(即文档标题)。]

  2. 嵌套节时不能跳过节级别。

例如,以下的语法是非法的:

= 文档标题

= 非法的0级标题(违反规则#1)

== 第一部分

==== 非法嵌套部分(违反规则#2)

标题后的首个部分之上的内容是序言的一部分。一旦到达了首个部分,内容就与其前面的部分相关联:

== 第一部分

第一部分的内容

=== 嵌套部分

嵌套部分的内容

== 第二节

第二部分的内容
除了用于定义单行节标题的等号标记外,Asciidoctor还识别来自Markdown的井号(#)。这意味着Markdown文档的大纲可以作为AsciiDoc文档很好地转换过来。

为了让处理器自动为章节编号,需要在文档头部定义`sectnums`属性:

:sectnums:

您也可以在文档中任何部分标题的上方使用此属性条目来切换自动编号设置。当您想关闭编号时,在属性名称的末尾添加一个感叹号:

:sectnums!:

== 无编号章节
序文

文件标题和第一部分之间的内容被称为序言。如果没有文件标题,这部分内容就不会被包含在序言部分中。

= 文档标题

序言

另一个前言段落

== 第一部分
当使用默认的Asciidoctor样式表时,这段前言会以引领文风(即,更大的字体)的样式呈现。

你也可以为单个元素指定标题。

区块标题

您可以为任何段落、列表或分隔块元素指定一个标题。标题被用作元素的标题。在大多数情况下,标题会直接显示在内容的上方。如果内容是图表或图片,标题则会显示在内容的下方。

块标题定义在元素的上一行。该行必须以点(.)开头,并且点后面紧跟标题文本,中间没有空格。

这是一个带标题的列表示例:

.TODO列表
- 学习AsciiDoc语法
- 安装AsciiDoc
- 用AsciiDoc编写我的文档

提到块标题,让我们深入了解块,并发现AsciiDoc支持哪些类型的块。

AsciiDoc中的构建模块

AsciiDoc提供了一套很好的组件,用于在文档中包含非段落文本—​例如引用块、源代码列表、侧边栏和表格。这些组件被称为_定界块_,因为它们被定界线包围。

限定块

你已经看到了很多列表块(即代码块)的例子,它被四个或更多连字符的行包围起来。

----
这是一个 _列表块_ 的示例。
里面的内容以 <pre> 文本显示。
----

在一个界定的区块内,你可以输入任何内容或空行。该区块一直持续到找到结束定界符。区块周围的定界符确定了区块的类型、内容的处理与转换方式,以及在输出中用来包裹内容的元素。

上面的块在转换成HTML并在浏览器中查看时的样子是这样的:

这是一个_列表块_的例子。
里面的内容显示为<pre>文本。

这里是生成的HTML源代码:

<div class="listingblock">
  <div class="content monospaced">
    <pre>This is an example of a _listing block_.
The content inside is displayed as &lt;pre&gt; text.</pre>
  </div>
</div>

您应该注意内容处理时的一些事项:

  • HTML标签 <pre> 被转义了

  • 保留了换行符

  • 短语“listing block”尽管周围有下划线,但并没有变成斜体。

每种类型的块都根据其目的进行处理。文字块没有接受通常应用于段落的全部替换。由于列表块通常用于源代码,所以不希望使用替换。

以下表格标识了AsciiDoc默认提供的分隔块,它们的用途以及对其内容执行的替换。

名称(样式) 行分隔符 用途 替代物

comment

////

私有注释,不在输出中显示

example

====
指定示例内容或定义一个警告块
正常

literal

…​.

输出文本,其显示效果与输入完全相同

verbatim

列表,源代码

----

按照输入显示的源代码或键盘输入

逐字

open

 — 

匿名块,可以充当任何其它块(passtable 除外)

各种各样

pass

Raw text to be passed through unprocessed

none

引用或诗句,带有可选的归属

普通

侧边栏

**

文档流之外显示的边注文本

正常

table

AsciiDoc允许分隔线的长度超过4个字符。不要这样做。 维护长分隔线是巨大的时间浪费,更不用说是随意的和容易出错的。使用创建分隔块所需的最短线长度,然后_继续_起草内容。无论如何,读者都不会看到长分隔符,因为它们不会被保留到输出中。

这个表格展示了在前面的表格中每个替代组引用执行的替代操作。

组别 / 替换种类 正常模式 逐字模式 无效果模式

特殊字符

标记

引用

属性

替换

后处理替换

为了对属性值应用正常的替换,需要用单引号将其包围起来。但有两个例外情况:目前正常的替换并不适用于`options`和`title`属性值。

你可以使用块元数据来控制块的显示方式。

区块元数据

元数据可以分配给任何块。有几种类型的元数据:

  • 标题

  • 标识符(即锚点)

  • 样式(第一个未命名的块属性)

  • 命名块属性

这是一个引用块的示例,其中包含所有类型的元数据:

.Gettysburg Address
[[gettysburg]]
[quote, Abraham Lincoln, Address delivered at the dedication of the Cemetery at Gettysburg]
____
四个评分和七年前我们的父辈在这个大陆上创立了一个新的国家...

现在我们正处于一场伟大的内战之中,测试这个国家,或任何如此设想和投入的国家,能否长久持续下去。...

这是从这个块中提取的元数据:

标题

葛底斯堡演说

身份识别码

葛底斯堡

风格

引号

命名块属性
归因

亚伯拉罕·林肯

引用标题

在葛底斯堡国家公墓奠基仪式上的演讲

一个块可以有多个块属性行。这些属性将被聚合。如果出现名称冲突,最后定义的属性将会覆盖前面的。

一些元数据被用作补充内容,比如标题;而其他元数据,比如样式,则控制了块是如何被转换的。

伪装块

有些块可以伪装成其他块,这是由块样式控制的特性。块样式是块属性列表中的第一个位置属性。

警告区块

例如,一个示例方块可以充当警示方块:

[NOTE]
====
这是一个警告块的例子。
====

与警告段落不同,它可以包含任何AsciiDoc内容。
样式可以是以下警告标签之一:

* 注意
* 提示
* 警告
* 小心
* 重要
====

列表和源代码块

在本教程开始时,记得我们说过在传统文本处理软件中插入源代码是多么痛苦的一件事。它们根本就不是为这种用途设计的。但AsciiDoc就是!

实际上,在AsciiDoc中插入源代码非常容易。只需要将原始代码推入列表块中。

----
require 'asciidoctor'

puts Asciidoctor.convert_file 'mysample.adoc', to_file: false
----

为了在输出中启用语法高亮,将块的样式设置为`source`并在第二个属性位置指定源语言。

[source,ruby]
----
require 'asciidoctor'

puts Asciidoctor.convert_file 'mysample.adoc', to_file: false
----

你甚至可以使用存储在另一个文件中的源代码。只需使用AsciiDoc的include指令即可:

[source,ruby]
----
include::example.rb[]
----

为了真正展示AsciiDoc适用于技术文档的程度,它还支持在源代码中使用标注。代码标注用于解释源代码的各行。这些解释位于列表下方,并通过数字进行标记。这里有一个例子:

[source,ruby]
----
require 'asciidoctor'  # <1>
----

Asciidoctor.convert_file 'mysample.adoc'  # <2>
----
<1> 导入库
<2> 读取、解析并转换文件

呼叫提示在渲染时的显示方式如下:

带有标注的源代码
require 'asciidoctor'  (1)

puts Asciidoctor.convert_file 'mysample.adoc'  (2)
1 导入库
2 读取、解析并转换文件

开放区块

最通用的块元素是开放块。开放块可以充当任何其他的块元素,除了_pass_和_table_之外。这里有一个开放块作为侧边栏使用的例子:

[sidebar]
.Related information
--
这是旁白文本。

它用于呈现与主要内容相关的信息。

直通块

在AsciiDoc中,“任何内容都可行”的机制是透传块。顾名思义,这个块将内容直接传递到输出文档中。当你遇到一个复杂的需求,使用AsciiDoc语法无法满足时,透传块会非常方便。

例如,假设你想要将一个GitHub的代码片段嵌入到你的文档中。你可以定义以下的直通块:

++++
<script src="https://gist.github.com/piscisaureus/3342247.js"></script>
++++
使用直通块将内容与特定的输出格式(例如HTML)关联起来。如果您打算使用直通块,我们推荐使用https://asciidoctor.org/docs/user-manual#conditional-preprocessor-directives[条件预处理指令],以将特定格式的内容与您打算支持的每个后端关联起来。

分隔符可选

如果内容是连续的(没有被空行中断),你可以不使用块定界符,而是在段落上方使用块样式,将其重新定位为其中一个定界块类型。

这种格式通常用于单行列表。

[listing]
sudo dnf install asciidoc

或者单行引用:

今天能推迟到明天的事情就不要今天做。

虽然大多数块是线性的,表格也能让您能够水平布局内容。

关于表格的新视角

表格是AsciiDoc语法中最精致的领域之一。它们易于创建,在原始形式中易于阅读,而且非常复杂。我建议你尽量少用表格,因为它们会打断你和读者的对话。当它们是呈现信息的最合适方式时,请知道你手中拥有一个强大的工具。

你可以将表格视为一个界定的块,它包含一个或多个项目符号列表。列表标记是一个竖线(|)。每个列表代表表格中的一行,并且必须具有相同数量的项(考虑到任何列或行跨度)。

这是一个简单的表格示例,它包含两列和三行:

|===
[cols=2*]
|Firefox
|网页浏览器

|Ruby
|编程语言

|TorqueBox
|应用服务器
|===

块定界符(|===)内的第一非空白行决定了列的数量。 因为我们要把每个列标题放在单独的一行,所以必须使用`cols`块属性来明确声明这个表格有两列。 `*`是重复操作符。 其意味着重复其余列的列规格。 在这个例子中,它意味着在2列中重复没有特殊格式(因为没有指定)。

我们可以将表格的第一行设置为标题,方法是在表格上设置`header`选项。

来源

[cols=2*,options=header]
|===
|Name
|Group

|Firefox
|Web Browser

|Ruby
|Programming Language

...
|===

您也可以使用以下简写来定义`header`选项:

另一种方法是,我们可以在表体行上方空出一行来单独定义标题行,这样就不需要`cols`或`options`属性了。

来源

|===
|名称 |组

|Firefox
|网络浏览器

...
|===

每个项目(即单元格)的内容可以跨越多行,就像AsciiDoc中的其他列表一样。 与其他列表不同的是,每个单元格的内容可以包含空白行,而不需要列表连续符来将它们连接起来。 当遇到另一个非转义的竖线符号(|)时,就会开始一个新单元格。

来源

|===
|名称 |组别 |描述

|Firefox
|网页浏览器
|Mozilla Firefox是一款开源网页浏览器。
它设计用于标准兼容、性能、便携性。

|Ruby
|编程语言
|程序员的好朋友。

...
|===

您可以使用_column specifiers_—一个在`cols`块属性中定义的由逗号分隔的相对值列表来设置每列的相对宽度。列表中的条目数量决定了列的数量。

来源

[cols="2,3,5"]
|===
|Name |Group |Description

|Firefox
|Web Browser
|Mozilla Firefox 是一个开源的网络浏览器。
它的设计目标是遵守标准、性能和可移植性。

|Ruby
|Programming Language
|程序员的好朋友。

...
|===

如果您想在列的内容中包含块或列表,您可以在列的相对值的末尾加上一个`a`(代表AsciiDoc)。

来源

[cols="2,3,5a"]
|===
|名称 |分组 |描述

|火狐浏览器
|网络浏览器
|Mozilla Firefox 是一个开源的网页浏览器。
它的设计初衷是:
* 标准符合性,
* 性能和
* portability.

|Ruby
  |Programming Language
  |A programmer's best friend.

...
|===

另外,您可以通过在垂直条前面加上一个`a`来对单个单元格应用AsciiDoc样式:

来源

Mozilla Firefox是一个开源的网页浏览器。它的设计目的是:

* 标准符合性,
* 表现和
* 可移植性。

您可以使用一整套列和单元格指定符来格式化表格内容,包括样式和对齐方式。

AsciiDoc 表格也可以直接从CSV数据创建。 只需将`format`块属性设置为`csv`,并在块定界符内直接插入CSV数据:

来源

[%header, format=csv]
|===
艺术家,音轨,流派
Baauer,哈林摇摆,嘻哈
The Lumineers,嗨喽,民谣摇滚
|===

或者使用一个`include::[]`指令:

来源

[%header, format=csv]
|===
include::tracks.csv[]
|===

Asciidoctor 0.1.3 也能识别设置 CSV 和 DSV 表格格式的简写表示法。 表格块分隔符(即 |===)的第一个位置可以被数据分隔符替换,以相应地设置表格格式。

您不必使用属性来指定`csv`格式,只需将开头的竖线(|)替换为逗号(,)即可。

,=== a,b,c ,===

同样地,可以通过用冒号(:)替换开头的竖线(|)来指定`dsv`格式。

:=== a:b:c :===

那是一个非常强大的选项。

AsciiDoc还能做什么?

我们已经介绍了AsciiDoc语法的许多特性,但它还有更多深度。AsciiDoc足够简单,可以用于README文件,但也能扩展以满足出版商的要求。

AsciiDoc 语法支持的一些特性包括:

  • 脚注 * 索引 * 附录、序言、致谢、部分介绍 * 多行属性 * 预处理器指令(条件标记) * 数学公式 * 音乐符号 * 图表 * 块过滤器 * 主题 * 自定义块、宏和输出格式

请参阅https://asciidoctor.org/docs/user-manual[Asciidoctor 用户手册]以继续探索语法和处理器的能力。

目前为止的语法已经足够了。你已经创建了你的第一个AsciiDoc文档。现在是时候将这份文档转换成一种可呈现的格式了。这将让你真正感受到AsciiDoc赋予你手中的力量。

正在转换您的文档

AsciiDoc语法的设计目的是在原始形式下也具有可读性,但是这种格式的预期受众是作家和编辑。读者们并不会那么欣赏原始文本。美学很重要。你会想要应用美观的排版,使用遵循“黄金比例”的字体大小、颜色、图标和图片,以赋予它应有的尊重。这就是Asciidoctor处理器的用武之地(在你完成写作之后)。

Asciidoctor 处理器解析文档并将其翻译成后端格式,如 HTML、ePub、DocBook 或 PDF。Asciidoctor 附带了一套默认模板,但您可以自定义模板或创建自己的模板,以获得您想要的确切输出。

在你使用Asciidoctor处理器之前,你必须安装https://rubygems.org/gems/asciidoctor[Asciidoctor Ruby宝石]。如果你在安装宝石时需要帮助,请查阅https://asciidoctor.org/docs/install-toolchain/[Asciidoctor安装指南]。

将文档转换为HTML 5

Asciidoctor既提供了一个命令行工具,也提供了一个Ruby API,用于将AsciiDoc文档转换成HTML 5、Docbook 5.0以及自定义的输出格式。

要使用Asciidoctor生成HTML文档,在命令行中键入`asciidoctor`,后跟您的文档名称。

$ asciidoctor mysample.adoc

在Asciidoctor中,*html5*后端是默认选项,因此不需要显式指定后端就可以生成一个HTML 5文档。

Asciidoctor 还提供了一个 Ruby API,因此您可以直接从 Ruby 应用程序生成 HTML 文档:

require 'asciidoctor'

Asciidoctor.convert_file 'mysample.adoc'

或者,您可以将HTML输出捕获到一个变量中,而不是写入到一个文件:

html = Asciidoctor.convert_file 'mysample.adoc', to_file: false, header_footer: true puts html

要生成DocBook,只需指定后端选项:

Asciidoctor.convert_file 'mysample.adoc', backend: 'docbook'

Asciidoctor的一个优点是它能输出多种格式,不仅仅是HTML。

将文档转换为DocBook

尽管用DocBook写作不太人性化,但它作为一种便携式文档格式还是很有用的。由于AsciiDoc的语法设计是以DocBook的输出为目的,所以转换的效果非常好。对于AsciiDoc语法中的每一种标记,都有相应的DocBook元素。

Asciidoctor 自带了一个 Docbook 5.0 的后端支持。要将文档转换为 Docbook 5.0,需要调用处理器,并将后端标志设置为 docbook5

$ asciidoctor -b docbook5 mysample.adoc

一个新的XML文档,名为`mysample.xml`,现在将出现在当前目录中:

$ ls -1 mysample.adoc mysample.html mysample.xml

如果你使用的是Linux系统,你可以使用Yelp来查看DocBook文件:

$ yelp mysample.xml

DocBook仅仅是Asciidoctor工具链中的一种中间格式。 你可以将其输入一个处理DocBook的系统(比如https://fedorahosted.org/publican[publican]),或者你可以使用https://github.com/asciidoctor/asciidoctor-fopub#readme[asciidoctor-fopub tool]将其转换为PDF。

输出丰富

你对Asciidoctor处理器生成的输出进行的自定义真的是没有尽头的。我们在这里仅仅触及了表面。

查看https://asciidoctor.org/docs/user-manual[Asciidoctor 用户手册]和https://asciidoctor.org/docs[Asciidoctor 文档页面]了解更多信息。

AsciiDoc还支持在哪些地方?

最简单尝试AsciiDoc的方式是在线操作。在GitHub仓库中的AsciiDoc文档/gist或Codeberg仓库会自动转换为HTML并在网页界面中渲染。GitLab仓库/snippets同样也支持——包括`include::[]`指令。

如果你在GitHub、GitLab或Codeberg上有一个项目,你可以用AsciiDoc编写README或者其他任何文档,Git forge的界面将会为访问者显示HTML输出。

Gists是一个用来尝试AsciiDoc的绝佳方式。只需要创建一个新的gist,将文件命名为扩展名`.adoc`,并输入AsciiDoc标记。你可以将文档保存为公开或私密。如果你想在不安装任何软件的情况下尝试AsciiDoc,使用gist是一个很好的起点。

虽然AsciiDoc语法和工具链还有很多需要探索的地方,但你对它的了解已经足够编写各种文档了,从简单的自述文件到全面的用户指南都可以。

总结

使用AsciiDoc进行写作不应比写电子邮件更复杂。你需要做的只是打开文本编辑器并键入常规段落来组成AsciiDoc文档。只有当你需要额外的语义或格式化时,才需要加入标记语言。当你需要记住使用什么标点符号时,让你的直觉来指导你。AsciiDoc的语法基于过去几十年计算历史中经过时间考验的纯文本约定。希望你同意,标记语言不会影响原始形式下文本的可读性,因为这是像AsciiDoc这样的轻量级标记语言的一个关键目标。

作为人类,交流是将我们贯穿时代的纽带,并允许我们传递知识。AsciiDoc让你专注于交流,而不是让一些无关的事情分散你的注意力。将电子邮件的文本复制到一个文档中,看看将其改编为文档有多容易。几乎立刻,你就会找到你的写作禅意,并享受到创作带来的愉悦体验。

词汇表 == 术语表

[glossary] 告诫段落

一个带有标签或图标以指示其优先级的标注段落 告诫区块:: 一个包含复杂内容的标注区块,它带有标签或图标以指示其优先级 后端:: 一组用于将AsciiDoc源代码转换为不同输出格式的模板 交叉引用:: 从文档中的一个位置链接到另一个由锚标记的位置 列表续行:: 单独一行上的一个加号 (+),用于将相邻的文本行连接到列表项 引用文本:: 用特殊标点包围的文本,以赋予其强调或特殊意义