如何测试一个 token 变量是否存在?

如何测试一个 token 变量是否存在?

expl3提供谓词来测试各种数据类型的变量是否存在,例如,,,,等\cs_if_exist:NTF。但是,我找不到针对该数据类型的类似函数(Interfaces3 文档中的第 XV 部分)。那么,如何测试标记变量是否存在(例如,可能使用创建的变量)?\tl_if_exist:NTF\str_if_exist:NTF\int_if_exist:NTFtoken\token_new:Nn

这是一个用例。每当我编写接受参数的 LaTeX3 函数时,我在函数主体中做的第一件事就是命名参数,即我用原始参数初始化局部变量#1#2此后,我再也不会使用原始参数;只使用命名变量。

因此,假设我希望编写一个函数,\g它接受一个参数,该参数应为“函数变量”类型,该变量可能已定义也可能未定义,然后我希望测试此变量是否已定义。因此,\g的结构将是这样的:

\ExplSyntaxOn
\cs_new:Npn \g #1
{
    \token_new:Nn \f {#1}
    \token_if_exist:NTF \f {...} {...}
}
\ExplSyntaxOff

除非\token_if_exist:NTF无法获得expl3

答案1

实际上并不存在任何“标记变量”:该l3token模块是一组用于“标记内容”的低级函数,反映了 TeX 使用标记的事实,因此我们有时需要在这个级别思考。

例如,我们无法像创建/操作 token 那样创建/操作字母 token cs,因此我们并不清楚该怎么\token_if_exist:N(TF)做。例如,对于 Unicode 引擎,我们可以拥有 1000 个字符 token 的“存在​​性”,但这可能不是要测试的内容。因此,很有可能这种情况\cs_if_exist:N(TF)会提供同样有用的信息。


如果你希望将传递的确切标记存储在变量中,则需要使用tl: 来执行此操作,这与参数的性质无关。因此,我们可能有

\tl_new:N \l__my_tmp_tl
\cs_new_protected:Npn \my_demo:N #1
  {
    \tl_set:Nn \l__my_tmp_tl {#1}

稍后,如果您想知道cs给定的 as是否#1已定义,并且如果您不想仅仅使用#1,则需要从`tl

\exp_after:wN \cs_if_exist:NTF \l__my_tmp_tl

请注意,由于\cs_if_exist:NTF需要cs“按原样”,我不得不使用\exp_after:Nw它来扩展tl。就我个人而言,我会坚持只使用#1,但这最终取决于您!


值得注意的是,l3token迄今为止(2017 年 10 月)尚未像 的其他部分那样经过仔细审查expl3。这项审查工作是在 的使用范围expl3扩大并且这些想法得到良好“传播”之后进行的。团队很可能会在不久的将来对其进行审查l3token,并且很有可能会删除/更改某些功能。

相关内容