平均能量损失:
\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
中不起作用。其次,这不会阻止函数扩展,因此即使在( - 类型扩展之后x
e
\exp_args:N...
\tl_set:Nx \l_tmpb_tl { \exp_args:Ne \mathbf { ... } }
e
做x
在- 和- 类型扩展内工作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