不使用 \exp_after:wN 的 LaTeX3 扩展

不使用 \exp_after:wN 的 LaTeX3 扩展

\expandafterLaTeX3 大大减少了使用/ 的需要\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 提倡使用变量类型和lg来指示本地和全局!

相关内容