\ExplSyntaxOn 和 \ExplSyntaxOff 可以嵌套吗?

\ExplSyntaxOn 和 \ExplSyntaxOff 可以嵌套吗?

考虑一下代码

\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已经完成的操作,但这并不意味着它们是可嵌套的。

开关与分组不同,分组提供范围和嵌套。

相关内容