LaTeX3 - 展开嵌套参数

LaTeX3 - 展开嵌套参数

平均能量损失

\tl_set:Nn \l_tmpa_tl {a}
\tl_set:Nn \l_tmpb_tl {\mathbf{\l_tmpa_tl}}
\tl_set:Nn \l_tmpa_tl {b}
\(\l_tmpb_tl\)

上面的代码片段实际上产生了\(\mathbf{b}\)。我想要实现的是产生\(\mathbf{a}\),即l_tmpa_tl在第二行展开 。但是l_tmpa_tl嵌套在\mathbf命令中,我不知道如何展开它。我试过了

\exp_args:NNx \tl_set:Nn \l_tmpb_tl {\exp_args:Nx \mathbf{\l_tmpa_tl}}

但它不起作用。

答案1

你需要:

\tl_set:Nx \l_tmpb_tl { \exp_not:N \mathbf { \exp_not:V \l_tmpa_tl } }

你的方法不起作用有两个原因。首先,你不能嵌套x- 类型扩展,因为- 扩展本身在( 或) 类型扩展x中不起作用。其次,这不会阻止函数扩展,因此即使在( - 类型扩展之后xe\exp_args:N...\tl_set:Nx \l_tmpb_tl { \exp_args:Ne \mathbf { ... } }ex在- 和- 类型扩展内工作e),\mathbf将会扩展。这里你需要的是\exp_not:N防止扩展。然后,你也可以\exp_args:NNx \tl_set:Nn用更简单的替换\tl_set:Nx,并且为了安全起见,\l_tmpa_tl通过使用 来防止 进一步扩展\exp_not:V\exp_not:V \l_tmpa_tl将扩展 的值\l_tmpa_tl,并防止进一步扩展)。

答案2

一般情况下,只需定义辅助函数来完成工作。

\tl_set:Nn \l_tmpa_tl {a}
\cs_set_protected:Npn \__tmp:n #1 {  % when this is executed, it will set \l_tmpb_tl to the desired result
    \tl_set:Nn \l_tmpb_tl {\mathbf{#1}}
}
\cs_generate_variant:Nn \__tmp:n {V}
\__tmp:V \l_tmpa_tl

或者,由于操作是可扩展的,您可以这样做......

\cs_set:Npn \__tmp:n #1 {  % this expands to **exp_not** of the desired result
    \exp_not:n {\mathbf{#1}}
}
\cs_generate_variant:Nn \__tmp:n {V}
\tl_set:Nx \l_tmpb_tl {\__tmp:V \l_tmpa_tl}

...通常更加灵活/方便。

答案3

除了其他答案之外,如果您希望更熟悉 expl3 的各种扩展类型:

\tl_use:N如果您想要依赖 interface3.pdf 中的声明,即可以在单个扩展步骤中直接检索 token-list-variables,即不需要,那么您可以将o-expansion 与结合起来\exp_after:wN

\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {a}
\tl_set:No \l_tmpb_tl {\exp_after:wN \mathbf \exp_after:wN {\l_tmpa_tl}}
\tl_set:Nn \l_tmpa_tl {b}
%\(\l_tmpb_tl\)
\tl_show:N \l_tmpa_tl
\tl_show:N \l_tmpb_tl
%
% Neither \documenclass nor \begin{document} was used, so let's end the
% latex-run with the sledgehammer:
%
\stop

如果你不喜欢\exp_after:wN,你可以触发f-expansion并通过显式空间标记~或隐式空间标记来停止它,后者在停止时\exp_stop_f:被-expansion-mechanism丢弃​​:f

\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {a}
\tl_set:Nf \l_tmpb_tl {\exp_args:NnV \use:n {\exp_stop_f: \mathbf} \l_tmpa_tl}
\tl_set:Nn \l_tmpa_tl {b}
%\(\l_tmpb_tl\)
\tl_show:N \l_tmpa_tl
\tl_show:N \l_tmpb_tl
%
% Neither \documenclass nor \begin{document} was used, so let's end the
% latex-run with the sledgehammer:
%
\stop

如果您想确保当 expl3-policy 关于直接使用 token-list-variables 发生变化时事情仍然可以正常工作,您可以结合使用o-expansion、\exp:w/ \exp_end:-expansion 和\exp_args:NnV

\ExplSyntaxOn
\tl_set:Nn \l_tmpa_tl {a}
\tl_set:No \l_tmpb_tl {\exp:w \exp_args:NnV \use:n {\exp_end: \mathbf} \l_tmpa_tl}
\tl_set:Nn \l_tmpa_tl {b}
%\(\l_tmpb_tl\)
\tl_show:N \l_tmpa_tl
\tl_show:N \l_tmpb_tl
%
% Neither \documenclass nor \begin{document} was used, so let's end the
% latex-run with the sledgehammer:
%
\stop

相关内容