\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
\str_new:N\l_my_str
\cs_new:Npn\my_test:n#1{%
\str_set:Nn\l_my_str{#1}%
\str_use:N\l_my_str%
}
\str_set:Nx\l_tmpb_str{\cs_under_skip_prepro:n{1,2}}
\typeout{====测试展开:~\l_tmpb_str}
\ExplSyntaxOff
\end{document}typeout的
预期结果是:====测试展开: 1,2;
实际结果是:====测试展开: \str_set:Nn {1,2}
因为 \str_set:Nn 是不可展的,一般的赋值命令都是不可展的;除了 flag 相关的命令,可自行参见 interface3 用户手册;
所在在 \str_set:Nx 的 x 型展开中 \str_set:Nn 没有被展开,但是 \l_my_str 被展开了,此时这个宏还没有被赋值,所以展开为空。而在 str 相关命令的赋值中,命令的参数中的所有 token 的 catcode 均被设置为12, 包括 { 和 } 所以 {1,2} 就被展开为自身;
备注:
\cs_under_skip_prepro:n 命令疑似应为 \my_test:n。x 型展开,推荐使用 e 型展开。expl3 宏包
现在的需求是,我的宏会复用一段代码,我计划把他抽出去到一个新的命令里面去,希望调用之后直接得到这个命令的计算结果,除了把计算的值传到一个变量里寄存没有其他办法嘛~
例:
有没有好的处理方法~
@u156756 直接将
复用代码保存到一个tl变量中,之后直接使用这个tl变量就可实现代码复用这一目标;还是说你这段
复用代码需要接受参数,需要封装成一个命令?为何一定要使用到str 相关的函数?能给一个具体的,更加详细的示例吗?