LaTeX3 定义了\peek_catcode_ignore_spaces:NTF
允许我提前查看流中的下一个标记(忽略空格)并将其 catcode 与一系列标准标记的 catcode 进行对比。因此我可以这样做:
\peek_catcode_ignore_spaces:NTF \c_math_toggle_token
{
Uh-oh,~ upcoming~ math!
}
{
Phew!~ Just~ text.
}
看看接下来是否是数学转变。
我该如何做同样的事情,但要针对一个活跃的角色?没有\c_active_token
可以测试的。我尝试通过模拟制作其他令牌的代码来制作一个,但我的尝试失败了。有\c_catcode_active_tl
一个包含一个活动令牌,但它包含它,所以\exp_not:N
即使这样做
\exp_last_unbraced:NV \peek_catcode_ignore_spaces:NTF \c_catcode_token_tl
不起作用。
然而,有一个\token_if_active:NTF
,所以我假设我可以通过有效地复制定义和交换测试的代码来拼凑一些测试活动角色的 peek 代码变体\peek_catcode_stuff
。但在尝试之前,我想问问我是否遗漏了什么。
那么,有没有一种直接的方法来查看下一个角色是否处于活动状态?
答案1
您快到了。 仅\exp_last_unbraced:NV
扩展\c_catcode_active_tl
一次,然后
\exp_last_unbraced:NV \peek_catcode_ignore_spaces:NTF \c_catcode_active_tl
{ true } { false }
变成
\peek_catcode_ignore_spaces:NTF \exp_not:N % <- test token
* % <- true branch
{ true } % <- false branch
{ false } % <- leftover
然后事情就变得非常糟糕了:)
由于 中的活动标记\c_catcode_active_tl
前面有\exp_not:N
,因此您可以安全地x
对其进行 -expand 以显示实际标记:
\ExplSyntaxOn
\cs_new_protected:Npx \test
{
\peek_catcode_ignore_spaces:NTF \c_catcode_active_tl
{ \exp_not:N \__test_aux:Nn \c_true_bool }
{ \exp_not:N \__test_aux:Nn \c_false_bool }
}
\cs_new_protected:Npn \__test_aux:Nn #1 #2
{ \iow_term:x { \bool_if:NF #1 { NOT~an~ } active~token:~\tl_to_str:n {#2} } }
\ExplSyntaxOff
\test ~
\test a
\test \stop
\test \relax
\test {ab}
\stop
上面的测试打印:
active token: ~
non-active token: a
non-active token: \stop
non-active token: \relax
non-active token: ab
PS:没有,因为这样做会产生一个与 具有相同定义的常规宏,在这种情况下没有用。\c_catcode_active_token
\let \c_catcode_active_token <actual active token>
\c_catcode_active_token
<actual active token>
答案2
提取活动字符标记的另一种方法\c_catcode_active_tl
是使用\exp_args:Ne
:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand\zzMath{}{
\peek_catcode_ignore_spaces:NTF \c_math_toggle_token
{
Uh-oh,~ upcoming~ math!
}
{
Phew!~ Just~ text.
}
}
\NewDocumentCommand\zzActive{}{
\exp_args:Ne\peek_catcode_ignore_spaces:NTF \c_catcode_active_tl
{
Uh-oh,~ upcoming~ active!
}
{
Phew!~ Just~ text.
}
}
\ExplSyntaxOff
\begin{document}
[\zzMath abc] [\zzMath $x=2$] [\zzMath ~zz]
[\zzActive abc] [\zzActive $x=2$] [\zzActive ~zz]
\end{document}