在 LaTeX3 中,如何提前查看活动字符?

在 LaTeX3 中,如何提前查看活动字符?

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}

相关内容