看来expl3
语言还不是很流行,我甚至找不到这个测试的一个例子。我试过了,但失败了。我的理解是,\reverse_if:N <primitive conditional>
将检查其参数是否为True
或,并适当地运行在或旁边False
定义的。\if_false:
\else:
\documentclass{beamer}
\mode<presentation>
{ \usetheme{metropolis} }
\geometry{verbose,papersize={160mm,90mm}}
\setlength{\parindent}{0pt}
\ExplSyntaxOn
\NewDocumentCommand\ifelsetest{ m o }{
Ltroiscommand~test \\
optional~parameter~:~#2
\if_false:
false
\else:
else
\fi:
\reverse_if:N { #2 }
}
\ExplSyntaxOff
\begin{document}
\begin{frame}
\ifelsetest{test} % #2 should be -NoValue-, therefore I suppose 'False'
\ifelsetest{test}[optarg~shouldtesttrue] % Anything elsethan -NoValue- should
% be 'True' I suppose
\end{frame}
\end{document}
答案1
具有参数规范的函数:N
期望接收单个标记作为参数,因此\reverse_if:N { #1 }
不合法。
实际上,\reverse_if:N
是原始的别名\unless
。如果你在中查看它interface3
,你会看到
这意味着\reverse_if:N
必须是第 4.6.2 节中描述的原始条件之一,即
\if_true: \if_false: \if_meaning:w \if:w \if_catcode:w \if_charcode:w
\if_cs_exist:N \if_cs_exist:w \if_mode_(...)
(最后包含用于测试排版模式的四个条件)以及
\if_int_compare:w \if_dim:w
随后的任何其他操作\reverse_if:N
都将产生错误。
另一方面,\reverse_if:N
不鼓励直接使用这些条件和 of 来编写函数,而建议使用更高级的编程。这些原始条件无疑速度更快,但它们只应在必须简化代码以提高效率时使用,而这种情况并不常见。
因此,很少看到带有\else:
或的代码。请查看有关布尔变量和函数的部分。\fi:
如果您希望\ifelsetest
在存在可选参数时打印“true”,则应使用以下xparse
功能:
\NewDocumentCommand{\ifelsetest}{mo}{%
\IfNoValueTF{#2}{False}{True}%
}
\ifelsetest{text} % prints False
\ifelsetest{text}[whatever] % prints True
答案2
\reverse_if:N
反转原始条件。也就是说,其\reverse_if:N \if_true:
行为类似于\if_false:
和。\reverse_if:N \if_false:
\if_true:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\if_true: true~branch \else: false~branch \fi:
\par
\reverse_if:N \if_true: true~branch \else: false~branch \fi:
\end{document}
您可以在 eTeX 中搜索\unless
非 LaTeX3 语法的示例。