我怎样才能引用 expl3 中缺失的值?

我怎样才能引用 expl3 中缺失的值?

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-这是关于在非常不同的(接口)级别上缺少某些东西。

相关内容