expl3: \group_insert_after:N 是做什么的?

expl3: \group_insert_after:N 是做什么的?

\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}

相关内容