在我的几个包中有一个快速模式,它通常以 开始\if@...@fast
并包含一些最小版本的命令,然后以 结束\endinput\fi
。
由于我尝试用 expl3 重写这些包,我刚刚发现存在一个\tex_endinput:D
。在这个答案约瑟夫·赖特 (Joseph Wright) 给出了以下例子:
\@ifpackagelater { expl3 } { 2015/09/11 }
{ }
{
\PackageError { siunitx } { Support~package~expl3~too~old }
{
You~need~to~update~your~installation~of~the~bundles~'l3kernel'~and~
'l3packages'.\MessageBreak
Loading~siunitx~will~abort!
}
\tex_endinput:D
}
这似乎表明这与仅保留到当前行末尾\tex_endinput:D
有一点不同。\endinput
\endinput
我想利用类似的东西\tex_endinput:D
,但在这个答案约瑟夫·赖特说:“核心团队代码之外不应出现任何内容“关于:D
说明符。因此我有点困惑,在基于 expl3 的包中我应该使用哪一个?
答案1
确实,...:D
功能是保留给团队的,但这是非常特殊的情况,\tex_endinput:D
与原始的是一样的\endinput
。
后面的括号\tex_endinput:D
似乎让你感到困惑,因为它已经在宏扩展过程中被扫描并删除了。此操作是通过标准构造实现的
\if<whatever>
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{text for true}%
{text for false}%
其中{text for true}{text for false}
被吸收为 或\@firstoftwo
的参数\@secondoftwo
,因此括号被剥离,并且两个标记列表之一仅重新插入到输入流中。
重要的是,同一行}
之后不能再有任何内容\tex_endinput:D
,否则它仍会被扫描。
例如
\makeatletter
\iffalse
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{whatever}
{\endinput
}\foo
会因错误而停止,但是
\makeatletter
\iffalse
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{whatever}
{\endinput
}
\foo
不会。