一个不受约束的格式化对通常用于格式化单词中的一个或几个字符。

我应该什么时候使用不受限制的格式?

考虑以下问题:

  1. 在开启或关闭格式标记的直接外侧有字母、数字或下划线吗?

  2. 在开放格式标记之前直接有冒号、分号或闭合大括号吗?

  3. 格式标记内部直接是否有空格?

如果你对这些问题中的任何一个回答了“是”,你需要使用一个不受约束的对。

为了帮助你判断特定的语法模式是需要不受限对还是受限对,考虑以下情况:

Table 1. 受限还是不受限?
AsciiDoc 结果 格式对 原因

Sara__h__

Sarah

不受限制

字母 a 直接与开头标记相邻。

**B**old

Bold

不受限制

字母 o 直接与结束标记相邻。

–**2016**

2016

不受限制

符号 ; 直接与开头标记相邻。

** bold **

bold

不受限制

标记符号内部直接有空格。

*2016*–

2016

受限制

相邻的 & 不是字母、数字、下划线、冒号或分号。

*9*-to-*5*

9-to-5

受限制

相邻的连字符不是字母、数字、下划线、冒号或分号。

不受约束的配对边界情况

有些情况下,使用约束型对(constrained pair)似乎是合逻辑的,但实际上需要使用非约束型对(unconstrained pair)。在处理格式标记之前,解析器可能已经应用了替换内容,这种情况下,那些标记旁边的字符可能与你在原始源代码中看到的不同。

一个这样的例子是将一个`monospace phrase`放置在`curved quotation marks`内,例如“end points”。

你可能会从以下语法开始:

端点

那只会给你“end points”。这些反引号有助于形成弯曲的引号,但单词并没有以等宽字体呈现。

再添加一对反引号也不够。

"端点"

解析器忽略了内部的一对反引号,并将它们解释为字面字符,将这个短语呈现为“end points”。

您必须使用一对无约束的等宽格式标记来使短语以等宽字体显示,并使用一对受约束的反引号来使引号呈现为弯曲的样式。总共需要三对反引号。

一句放在弯曲引号里的等宽字体短语
end points

如果,相反,你想用打字机引号将单间隔短语包围起来,比如“end points”,那么你需要通过对单间隔短语应用一个角色或者转义打字机引号来中断曲线引号。例如:

放在打字机引号内的等宽字体短语
"[.code]``end points``" or \"``end points``"

另一个例子是一个所有格的单间距短语,以“s”结束。在这种情况下,你必须将单间距短语切换为不受限制的格式。

The ``class```' static methods make it easy to operate
on files and directories.
Example 1. 呈现的所有格,等宽字体短语

The class’ static methods make it easy to operate on files and directories.

作为一种选择,你可以直接在AsciiDoc源文件中编码弯曲的撇号,以获得相同的结果。

The `class`’ static methods make it easy to operate on files and directories.

'类' 的静态方法使得在文件和目录上的操作变得简单。

这种情况预计在将来会有所改善,届时AsciiDoc语言将切换到使用解析表达式语法来处理内联格式,而不是目前基于正则表达式的策略。有关详情,请关注 Asciidoctor issue #61

逃避不受约束的格式化标记

由于不受限制的格式化标记旨在匹配文本中的任何位置,不考虑上下文,这意味着有时您可能会捕捉到您不想要的样式文本。必须承认,当内容需要时,这些符号有点难以直接输入。但是,能否做到这一点只是一个了解技巧的问题,本节将介绍这些技巧。

让我们假设你正在输入以下两行:

'''__kernel 限定符可与 __attribute__ 关键字一起使用...
'''

#`CB###2`# 和 #`CB###3`#

在第一句中,你并不寻求任何文本格式化,但你肯定会得到它。处理器会将___kernel前的双下划线解释为不受限的格式化标记。在第二句中,你可能期望CB###2CB###3_突出显示,并使用等宽字体显示。然而,你得到的却是一团乱麻。这一行中混合使用受限和不受限的格式化标记是模糊的。

有两种可靠的方法来避免不受约束的格式化标记:

  • 使用属性引用来插入未受限制的格式化标记verbatim,或者

  • 将您不希望格式化的文本包裹在内联直通中。

属性引用是首选,因为它最易于阅读:

:scores: __
:hash3: ###

{scores}kernel修饰符可以与{scores}attribute{scores}关键字一起使用...

#`CB{hash3}2`# 和 #`CB{hash3}3`#

这之所以有效,是因为属性扩展是在文本格式化之后(即,引用替换)按照正常的替换顺序执行的。

下面是使用内联单加号宏来转义不受约束的格式标记来编写这些行的方法:

The +__kernel+ qualifier can be used with the +__attribute__+ keyword...

#`+CB###2+`# 和 #`+CB###3+`#

注意加号的添加。加号之间的所有内容都从插值中逃脱(属性引用、文本格式化等)。然而,文本仍会对HTML特殊字符接收适当的输出转义(例如,<`变成&lt;`)。

在AsciiDoc中,`+TEXT+`(在加号包围的文本中使用反引号)是一种特殊的格式组合。它意味着将TEXT格式化为等宽字体,但不对TEXT中的格式标记或属性引用进行解释。这与Markdown的反引号大致相当。由于AsciiDoc提供了更高级的格式化选项,因此需要双重包围。