常见的编程语言(C
)。
// foo is global scope
int foo = 0;
int main() {
// bar is local scope within main
int bar = 1;
}
让我们考虑一下LaTeX3
\documentclass[]{article}
\ExplSyntaxOn
\cs_set:Nn \create_list:n
{
\tl_set:Nn \l_my_tl {(#1)}
}
\NewDocumentCommand\uselist{m}
{
\create_list:n {#1}
\tl_use:N \l_my_tl
}
\ExplSyntaxOff
\begin{document}
\uselist{2}
\end{document}
我LaTeX3
预计的范围\l_my_tl
是的主体\create_list:n
。但从宏\l_my_tl
中也可以看到\uselist{m}
。这是为什么?我在这里误解了什么?
答案1
TeX 中的范围(因此在 中expl3
)不是由宏定义的:它们在“使用”时仅由其定义替换。因此,使用显式组提供范围:
\group_begin:
/\group_end:
(expl3
) -\begingroup
/\endgroup
(经典 TeX 名称){
...}
或者\bgroup
/\egroup
基于括号的版本可能会影响数学模式间距,并且expl3
我们总是使用第一种类型的分组。
有一些“隐藏”范围,例如表格单元格,但对于大部分编程来说,这些不是我们所使用的。