该xparse
包有一个概念-NoValue-
,一种\null
用于表示不存在任何值的“ ”标记(其中\null
可能被视为一个值)。
如果我想手动使用这个值,我该怎么做?
\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\begin{document}
\some_test:NTF{\marker}{true}{false} % should print true
\end{document}
我的具体用例如下l3prop
:
\prop_new:N \g__ds_type_supertype_subtypes_prop
\prop_put:Nnn \g__ds_type_supertype_subtypes_prop
{ some_type_that_has_no_supertypes }
{ \marker,subtypes,here }
具有概括性(请注意,我还没有直接测试过这一点)。
% To manage our typing, we will have a property list going from
% supertype -> supertype,subtype,...,subtype
\prop_new:N \g__ds_types_supertype_subtypes_prop
\let\_ds_types_no_supertype\q_no_value
\let\_ds__if_no_supertype_p\quark_if_no_value_p
% Create a new type (#1) that has a supertype (#2)
\cs_new:Npn \_ds_new_type_with_supertype:nn #1 #2
{
\clist_new:c
{ g__types__ #1 __supertype_subtypes_clist }
\clist_put_right:cn
{ g__types__ #1 __supertype_subtypes_clist }
{ #2 }
\prop_put:Nnn \g__ds_types_supertype_subtypes_prop
{ #1 }
{ \use:c { g__types__ #1 __supertype_subtypes_clist } }
}
% Create a new type (#1) that has no supertypes
\cs_new:Npn \_ds_new_type:n #1
{
\_ds_new_type_with_supertype:nn { #1 } { \_ds_types_no_supertype }
}
答案1
标记\NoValue
已被故意删除xparse
。这是有道理的:它违背了不当您有一个扩展为这个无值的宏时的值。
不过,在 expl3 代码级别,您可以使用 quark \q_no_value
,并使用
\quark_if_no_value:n(TF)
,\quark_if_no_value_p:n
,\quark_if_no_value:N(TF)
或者\quark_if_no_value_p:N
。
如果您发现自己在文档级别上需要,\IfNoValueTF{\NoValue}{true}{false}
那么我怀疑您所做的语法选择是错误的,应该重新考虑。
答案2
已经有一个cgnieder 的回答解释一下我们在代码层面上的情况\q_no_value
,但我认为了解为什么我们有两个明显相似的概念会很有用。
在文档级别,用户可以省略值,而且确实会省略值:毕竟,LaTeX 语法中一个强大的部分就是可选参数的概念。因此,为了测试存在/不存在,我们需要一个标记。但是,由于在用户级别可能会出错,并且能够打印此标记实际上可能很有用,因此我们使用了一个可以安全打印的构造:-NoValue-
。实现此操作的基础是一些类别代码内容以及类似字符串的 ( \(pdf)strcmp
) 比较。
在代码层面,并且已经存在了很长时间,我们有\q_no_value
,正如 cgnieder 提到的,它是一个“夸克”:一个扩展为自身的宏。因此,这样的宏可以绝不可以安全地以不受控制的方式展开,因为会产生无限循环(单次展开是可以的,因为它不会改变夸克)。夸克测试的编写速度非常快,并且早于\(pdf)strcmp
中的使用expl3
。它们还可以这样工作:
\quark_if_no_value:NTF \q_no_value
和
\tl_set:Nn \l_tmpa_tl { \q_no_value }
\quark_if_no_value:NTF \l_tmpa_tl
给出相同的结果。
随着时间的推移,团队对夸克的使用进行了一些改进:\q_no_value
本质上被设计为通过“get”函数返回,例如
\prop_get:NnN \l_some_prop { some-key } \l_tmpa_tl
当在数据结构中找不到该值时。相反,-NoValue-
这是关于在非常不同的(接口)级别上缺少某些东西。