带分组的 LaTeX3 条件编译失败

带分组的 LaTeX3 条件编译失败

我正在尝试使用包\prg_new_conditional:Nnn中的代码编写 LaTeX3 条件expl3。由于条件中的代码需要对某些变量进行赋值,因此我想使用分组来在本地执行这些赋值。但是,以下 MWE 无法编译:

\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\prg_new_conditional:Nnn \foo: { p }
{
  \group_begin:
    % Do some stuff.
  \group_end:
  \prg_return_true:
}
\bool_if:nTF { \foo_p: } { true } { false }
\ExplSyntaxOff
\end{document}

下列错误多次出现:

! Missing number, treated as zero.
<to be read again>
\group_begin:
l.11 \bool_if:nTF { \foo_p: }
{ true } { false }
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
! Missing \endcsname inserted.
<to be read again>
\group_begin:
l.11 \bool_if:nTF { \foo_p: }
{ true } { false }
The control sequence marked <to be read again> should
not appear between \csname and \endcsname.

当我删除\group_begin:\group_end:时,一切都按预期工作。那么这里发生了什么?为什么我不能在的定义中使用分组\foo_p:

答案1

为了正常工作,\foo_p:您想要使用的谓词必须扩展为 或\prg_return_true:\prg_return_false:并且在宏扩展后输入流中不会留下任何其他内容。

在替换文本的代码中,您可以自由使用手册中标有(填充)* 的任何条件interface3,并且在它们的真或假部分,仅使用以相同方式标记的函数。

按照您的定义,\group_begin:除非隐藏在总是被跳过的代码中,否则将保留,但在这种情况下它将毫无用处。在代码中无法对应该具有谓词形式的条件执行任何赋值,因为在宏扩展期间不会执行赋值。

因此,例如,不可能有一个条件谓词形式,该条件应该决定某些标记是否最终会以排版文本结束,比如通过执行\hbox_set:Nn \l_tmpa_box {<tokens>}然后测量框。

根据您想做的事情,可能会有扩展的方式。

相关内容