\endinput 和 \tex_endinput:D 之间有什么区别吗?

\endinput 和 \tex_endinput:D 之间有什么区别吗?

在我的几个包中有一个快速模式,它通常以 开始\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

不会。

相关内容