在`ifeval`指令内部闭合的行(也就是,在`ifeval`与`endif`指令之间)若`ifeval`指令方括号内的表达式评估为真,则这些行会被包含进来。

ifeval 示例
ifeval::[{sectnumlevels} == 3]
If the `sectnumlevels` attribute has the value 3, this sentence is included.
endif::[]

ifeval` 指令没有像 ifdefifndef 那样的单行形式或长格式变体。

与`ifdef`和`ifndef`不同,你不能用其补码终止特定的`ifeval`指令。例如,以下的`ifeval`块是无效的:

无效的ifeval终止符
ifeval::[<condition>]
conditional content
endif::[<condition>]

你只能使用一个匿名的`endif::[]`指令来终止前面的`ifeval`指令,如下所示:

有效的不可执行终止符
ifeval::[<condition>]
conditional content
endif::[]

如果你正在混合使用`ifeval`指令与`ifdef`或`ifndef`指令,你应该总是通过名称关闭多行的`ifdef`和`ifndef`指令(endif::name-of-attribute[]),以防止`ifeval`指令过早结束。

解剖学

ifeval指令的表达式由左边的值和右边的值组成,中间有一个操作符。通常在操作符的两边各加一个空格。

ifeval表达式示例
ifeval::[2 > 1]
...
endif::[]

ifeval::["{backend}" == "html5"]
...
endif::[]

ifeval::[{sectnumlevels} == 3]
...
endif::[]

// the value of outfilesuffix includes a leading period (e.g., .html)
ifeval::["{docname}{outfilesuffix}" == "main.html"]
...
endif::[]

价值观

每个表达式值可以使用属性引用语法引用零个或多个AsciiDoc属性的名字(例如,{backend})。

属性引用首先会被解析(即,替换)。一旦属性引用被解析后,每个值都会被强制转换为一个被识别的类型。

当你期望属性引用解析为一个字符串时,即一系列字符时,请将表达式的那一侧用引号括起来。例如:

比较两个字符串表达式的ifeval
ifeval::["{backend}" == "html5"]

如果你期望属性解析为一个数字,那么你不需要用引号来包围表达式。在这种情况下,值将被作为数字进行比较。同样的规则适用于布尔值。

你不应该尝试在比较中混合使用不同的值类型。例如,以下表达式是无效的:

无效的 ifeval 表达式
如果`"{sectnumlevels}" > 3

以下类型的值被识别:

数字

一个整数或浮点值。

引用字符串

被包裹在单引号(')或双引号(")内。

布尔值

字面值为 truefalse

值类型强制转换是如何工作的

如果一个值被引号包围,那么引号之间的字符将被使用,并且总是被强制转换为字符串。

如果一个值*不*被引号包围,它将遵循下列类型强制转换规则:

  • 一个空值会变成nil(也就是null)(因此在比较中使用是安全的)。

  • 一个值为`true`或`false`会变成布尔值。

  • 只包含重复空白的值会变成一个单一空格字符串。

  • 一个包含小数点的值会变成一个浮点数。

  • 任何其他的值都会被强制转换成一个整数值。

操作符

每一边的值都使用运算符进行比较,以得出一个结果。

==

检查这两个值是否相等。

!=

检查两个值是否不相等。

<

检查左侧是否小于右侧。

<=

检查左侧是否小于或等于右侧。

>

检查左边的值是否大于右边的值。

>=

检查左侧是否大于或等于右侧。

双方应具有相同的值类型。如果它们不同,则比较将失败。如果比较失败,条件将评估为假(即,指令内的内容将被跳过)。

这些运算符遵循与Ruby中的运算符相同的规则。