考虑一下代码
\ExplSyntaxOn
% ... lots of stuff 1 ...
\ExplSyntaxOn
% ... lots of stuff 2 ...
\ExplSyntaxOff
% ... lots of stuff 3 ...
\ExplSyntaxOff
(a) 目前位置 2 和 3 处的内容是如何解释的:作为 LaTeX2e 代码还是 expl3 代码?
(b) 这样的代码是否应该被解释?如果是,如何解释?
(题外话:由于复制粘贴,此类构造开始出现在我的文件中。)
答案1
不可以。没有实现堆栈。
当\ExplSyntaxOn
遇到时,一些字符的类别代码会发生变化,但它们以前的类别代码存储在定义中\ExplSyntaxOff
(默认情况下不执行任何操作)。
当\ExplSyntaxOff
下次遇到时,它会将类别代码重置为以前的状态,并重新定义自己不执行任何操作。
以下是一个例子:
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\tl_show:N \ExplSyntaxOff
\ExplSyntaxOn
\tl_show:N \ExplSyntaxOff
\ExplSyntaxOff
\tl_show:N \ExplSyntaxOff
\ExplSyntaxOff
\stop
这是终端上的输出:您会看到,expl3
第一个代码之后的代码不再有效,\ExplSyntaxOff
并\tl_show:N
引发错误。
> \ExplSyntaxOff=\char_set_catcode:nn {9}{10}\char_set_catcode:nn
{32}{10}\char_set_catcode:nn {34}{12}\char_set_catcode:nn
{38}{4}\char_set_catcode:nn {58}{12}\char_set_catcode:nn
{94}{7}\char_set_catcode:nn {95}{8}\char_set_catcode:nn
{124}{12}\char_set_catcode:nn {126}{13}\tex_endlinechar:D =13\scan_stop:
\bool_set_false:N \l__kernel_expl_bool \cs_set_protected:Npn \ExplSyntaxOff
{}.
<recently read> }
l.5 \tl_show:N \ExplSyntaxOff
?
> \ExplSyntaxOff=\char_set_catcode:nn {9}{10}\char_set_catcode:nn
{32}{10}\char_set_catcode:nn {34}{12}\char_set_catcode:nn
{38}{4}\char_set_catcode:nn {58}{12}\char_set_catcode:nn
{94}{7}\char_set_catcode:nn {95}{8}\char_set_catcode:nn
{124}{12}\char_set_catcode:nn {126}{13}\tex_endlinechar:D =13\scan_stop:
\bool_set_false:N \l__kernel_expl_bool \cs_set_protected:Npn \ExplSyntaxOff
{}.
<recently read> }
l.8 \tl_show:N \ExplSyntaxOff
?
! Undefined control sequence.
l.11 \tl
_show:N \ExplSyntaxOff
?
答案2
\ExplSyntaxOn
并且\ExplSyntaxOff
开关改变某些类别代码以允许不同的编码语法。它们与\makeatletter
...\makeatother
对用于允许@
宏中的。
使用字体展示类似内容开关可能是结论性的:
\documentclass{article}
\begin{document}
\bfseries
First % ... lots of stuff 1 ...
\bfseries
Second % ... lots of stuff 2 ...
\mdseries
Third % ... lots of stuff 3 ...
\mdseries
Last % ... lots of stuff last ...
\end{document}
人们可以考虑\mdseries
撤销\bfseries
已经完成的操作,但这并不意味着它们是可嵌套的。
开关与分组不同,分组提供范围和嵌套。