我\group_insert_after:N
以为是将局部变量的内容“导出”到设置它的组之外。显然不是。它是用来做什么的?
\tl_set:Nn \l_foo_tl{W}
\group_begin:
\tl_set:Nn \l_bar_tl{X}
\tl_set:Nn \l_foo_tl{X}
\group_insert_after:N \l_foo_tl
\group_end: % W
%\group_begin:
% \tl_set:Nn \l_baz_tl{Y}
% \group_insert_after:N \l_baz_tl
%\group_end: % ! Undefined control sequence. <recently read> \l_baz_tl
答案1
如果你看看来源expl3
你会发现\group_insert_after:N
被定义为\aftergroup
原始:
\tex_let:D \group_insert_after:N \tex_aftergroup:D
TeXbook 有更多相关信息(重点是我的)
\aftergroup
<token>。<token> 保存在 TeX 的堆栈中;它将在当前组完成后立即插入回输入中,并且其本地分配已被撤销. 如果\aftergroup
同一组中出现多条命令,则将按照相同顺序扫描相应的命令;例如,'{\aftergroup\a\aftergroup\b}
' 产生 '\a\b
'。
同时,常规分组规则也保持有效,即您在组内定义的内容将无法在外部使用。这意味着,如果您想生成要插入当前组后的标记,则必须将这些分配设为全局的。这也适用于您的示例:
\documentclass{article}
\usepackage{expl3}
\begin{document}
\ExplSyntaxOn
% always define your variables to identify name clashes early and save
% time debugging
\tl_new:N \l_bar_tl
\tl_new:N \l_foo_tl
\tl_set:Nn \l_foo_tl{W}
\group_begin:
\tl_set:Nn \l_bar_tl{X}
\tl_gset:Nn \l_foo_tl{X} % global assignment!
\group_insert_after:N \l_foo_tl
\group_end:
\ExplSyntaxOff
\end{document}