LaTeX3:选择性扩展

LaTeX3:选择性扩展

我已经将问题缩小到下一个过于简单的令牌列表(还有更多我事先不知道的令牌)

\tl_set:Nn \l_tmpa_tl { \myFoo \myBar { \myBaz } }

例如

\cs_set:Npn \myFoo { Foo }
\cs_set:Npn \myBar { Bar }
\cs_set:Npn \myBaz { Baz }

我只想扩展\myBar并且\myBaz保持 \myFoo 不扩展以\l_tmpa_tl变成

\myFoo Bar { Baz }

为了扩展\myBar,我可以使用 的变体\tl_replace_once:Nnn。这是我的代码片段

\tl_set:Nx \l_tmpb_tl { \myBar }
\cs_generate_variant:Nn \tl_replace_once:Nnn { NnV }
\tl_replace_once:NnV \l_tmpa_tl { \myBar } \l_tmpb_tl

结果实际上是

\myFoo Bar { \myBaz }

\myBaz但是当它位于组内时,我该如何扩展它呢?

某种深度替换会有所帮助,或者至少是一种{ Baz }仅从中创建令牌列表的方法\myBaz

答案1

考虑到你最后的评论,你可以对初始未扩展的标记进行分组,似乎你只需要考虑三个术语。这显示了

> \l_tmpa_tl=macro:
->{\myFoo \myFoo \myFoo }\myBar {\myBaz }.
l.11 \show\l_tmpa_tl
                    
? 
> \l_tmpb_tl=\long macro:
->{\myFoo \myFoo \myFoo }Bar{Baz}.
l.20 \show\l_tmpb_tl

如果你不想将第一个标记分组到最终输出中,你可以使用

\cs_set:Npn\zz_aux:NNn#1#2#3{\exp_not:n{#1}#2{#3}}

但上面的输出是用

\documentclass{article}

\begin{document}
\ExplSyntaxOn
\cs_set:Npn \myFoo { Foo }
\cs_set:Npn \myBar { Bar }
\cs_set:Npn \myBaz { Baz }

\tl_set:Nn \l_tmpa_tl { {\myFoo\myFoo\myFoo} \myBar { \myBaz } }

\show\l_tmpa_tl

\cs_set:Npn\zz_aux:NNn#1#2#3{{\exp_not:n{#1}}#2{#3}}
\cs_set:Npn\zz_expand:NN#1#2{
   \cs_set:Npx#2{\exp_after:wN\zz_aux:NNn#1}
}

\zz_expand:NN \l_tmpa_tl \l_tmpb_tl

\show\l_tmpb_tl
\ExplSyntaxOff
\end{document}

相关内容