\expandafter
LaTeX3 大大减少了使用/ 的需要\exp_after:wN
。但是 LaTeX3 解决这个问题的方法是什么呢?
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\tl_new:N \__a
\tl_new:N \__b
\tl_set:Nn \__a { \emph{emph} }
\tl_set:No \__b { \exp_after:wN \overset
\exp_after:wN {
\exp_after:wN o
\exp_after:wN }
\exp_after:wN { \__a } }
\tl_show:N \__b % target: b = \overset{o}{\emph{emph}}
\end{document}
答案1
虽然在这里可以使用\tl_put_right:NV
或类似的东西,但效率会有所损失,因为你必须引入一个括号组,而这需要几个步骤。相反,我会在这里使用x
-type 扩展和适当的控制:
\tl_set:Nn \l_tmpa_tl { \emph { emph } }
\tl_set:Nx \l_tmpb_tl
{ \exp_not:N \overset { o } { \exp_not:V \l_tmpa_tl } }
由于我们总是可以限制扩展,所以这里没有必要担心使用x
-type 进程(\edef
)。
\tl_put_right:NV
如果我只是直接加入两个令牌列表而不使用括号业务,我会使用或类似的。
答案2
我们不是把 2e 惯例和 expl3 惯例混在一起了吗?作为 Joseph 答案的替代,如何:
在 expl3 约定中有一个版本\overset
,即
\cs_set_eq:NN \overset:nn \overset % not a very good expl3 name though :-)
在这里提供您需要的变体,即
\cs_generate_variant:Nn \overset:nn { no }
然后简单地使用
\overset:no {o}{\__a}
我想说的是,问题不在于扩展第二个括号组的问题,问题在于如果我们混合使用 2e 名称,我们就无法应用 expl3 约定。
事实上 expl3 甚至具有直接实现这一功能的功能:
\exp_args:Nno \overset {o}{\__a}
但我认为,从长远来看,始终使用 expl3 约定更简洁,即,如果您想在 expl3 上下文中使用它们,请屏蔽 2e 名称。出于同样的原因,它\__a
很短但却不受欢迎,因为 expl3 提倡使用变量类型和l
和g
来指示本地和全局!