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
可以安全使用而无需后备。