LaTeX3宏展开与预期不符

发布于 2025-12-12 07:20:18
\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}

查看更多

关注者
0
被浏览
54
1 个回答
Eureka
Eureka 1小时前
这家伙很懒,什么也没写!

因为 \str_set:Nn 是不可展的,一般的赋值命令都是不可展的;除了 flag 相关的命令,可自行参见 interface3 用户手册;

所在在 \str_set:Nxx 型展开中 \str_set:Nn 没有被展开,但是 \l_my_str 被展开了,此时这个宏还没有被赋值,所以展开为空。而在 str 相关命令的赋值中,命令的参数中的所有 token 的 catcode 均被设置为12, 包括 {} 所以 {1,2} 就被展开为自身;

备注:

  • \cs_under_skip_prepro:n 命令疑似应为 \my_test:n
  • 再者,不推荐使用 x 型展开,推荐使用 e 型展开。
  • 在 LaTeX 2020-02-02 及其之后的版本中均无需再手动加载 expl3 宏包

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览