\expanded 是否可以替代 \romannumeral 的扩展技巧?

\expanded 是否可以替代 \romannumeral 的扩展技巧?

TeXLive 2019 已经到来 :D

其备受期待的功能之一是\expanded现在所有主要引擎中都可用的新原语(前几年仅在 LuaTeX 中可用),这要感谢 Joseph Wright。

到目前为止,我们拥有的是:

  • \edef使用等进行完全扩展;优点:扩展尊重(任何形式的)标记
    的整个标记列表 缺点:作为赋值操作,它本身不可扩展; \protected

  • 部分扩展利用\romannumeral,在寻找⟨integer⟩和尾随的同时扩展标记⟨optional space⟩
    优点:可扩展,允许一个人1编写一些非常有趣的宏(包括\expanded原语的可扩展模拟);
    缺点:只扩展标记列表的“头部”,一旦找到不适合其参数规范的可扩展标记就会停止;

\expanded\edef将两者进行了很好的结合,让我们能够获得标记列表的完整扩展,同时其本身也是可扩展的,显然涵盖了和的大量用例\romannumeral

当然,\edef当标记的扩展需要存储在宏中时,它仍然非常有用,并且生成的宏可以正常接受参数,而这不是的特点\expanded

然而,这个\romannumeral技巧似乎已经失去了它的用处\expanded。据我所知,许多需要\romannumeral完全展开某些东西的情况,现在可以\expanded通过适当的扩张原始。

我知道标题中问题的答案是“否”,因为在某些情况下\romannumeral它仍然有用。我认为主要的情况是无界参数;\expanded需要将材料作为参数展开⟨general text⟩,而\romannumeral可以将其放入标记中并无限期地起作用,直到找到不可展开的标记。当然,另一种情况是,当一个真的只想要扩展令牌列表的头部,那么\romannumeral这个工具就是用于该工作的工具。

但这两种情况似乎都比使用\romannumeral扩展 的整个范围要小得多。因此,我的问题(最后)是: 的扩展技巧是否可以\romannumeral在几乎所有地方被替换(例如,我可以提到大量使用这种\romannumeral-powered 扩展的 LaTeX3 内核)?还有哪些情况需要\romannumeral扩展 而不能使用\expanded


1在这种情况下,非常特殊:)

答案1

在很多情况下这个\romannumeral技巧已经过时了,但至少有两种情况下它仍然有用。

第一个是,正如问题中提到的那样,它是“开放式的”,而\expanded需要一个参数来获取。第二个是,\romannumeral扩展通过标记进行,就像 TeX 本身在排版时所做的那样,直到找到一些“有效载荷”。这使我们能够处理任何可扩展的材料,然后“向前看”第一个不可扩展的标记。以下是一个例子l3galley

\cs_new_protected:Npn \galley_par:
  {
    \s__galley_par_omit
    \exp_after:wN \__galley_par_auxi: \exp:w \exp_end_continue_f:w
  }
\cs_new_protected:Npn \__galley_par_auxi:
  {
    \peek_meaning:NTF \s__galley_par_omit
      { \__galley_par_aux:N }
      { \__galley_par_auxii: }
  }
\cs_new_protected:Npn \__galley_par_aux:N #1
  {
    \str_if_eq:nnF {#1} { \s__galley_par_omit }
      {
        \__galley_par_auxii:
        #1
      }
  }

此处\romannumeral隐藏在 内\exp:w,但想法很简单。扩展将持续进行,直到找到某个不可扩展的标记。然后我们“返回”到前瞻,检查与 完全等同的标记\s__galley_par_omit,后者是连续标记的标记\par。这需要 的开放性\romannumeral和它会停止的事实。

还值得注意的是,\romannumeral忽略\protected状态:上面显示的状态,在宏等实现中也很方便\halign。(这是我们需要前瞻性的另一个地方。)


这些方面非常专业,在大多数情况下并不适用。转向的更大障碍\expanded是它现在才普遍可用:要过很多年才能安全地假设它\expanded可以安全使用而无需后备。

相关内容