ExplSyntaxOn 和 ExplSyntaxOff 起什么作用?

ExplSyntaxOn 和 ExplSyntaxOff 起什么作用?

与问题相关\makeatletter 和 \makeatother 起什么作用?对于 LaTeX2e,此处与 LaTeX3 相关

做什么\ExplSyntaxOn\ExplSyntaxOff做什么?

答案1

LaTeX3 编码语言 ,expl3使用:和作为函数和变量名称中的“字母”。这允许在文档中_使用代码级材料expl3

\cs_new:Npn .... % fails: command \cs followed by characters '_', 'n', 'e', 'w', etc.
\ExplSyntaxOn
\cs_new:Npn .... % works here: command name \cs_new:Npn

\ExplSyntaxOn命令激活此功能,并改变空格和行尾的处理方式,使其被忽略,这意味着

\ExplSyntaxOn
\cs_new:Npn \my_function:nn #1#2
  {
    % Code hre
  }

不需要%在每行末尾(与“普通” LaTeX2e 代码相比)。为了允许在输出中包含空格,~通过 将其变为“普通”空格\ExplSyntaxOn。请注意,空格行为的这种变化对于访问expl3名称来说并不是必不可少的,但两者紧密相关,因为组合允许在 中进行“更清晰”的编程expl3

\ExplSyntaxOff反转此操作,将:_和恢复~为之前的值\ExplSyntaxOn,并再次使空格变得“重要”。

从技术层面上讲,命令名称中的类别代码的概念与\makeatletter 和 \makeatother 起什么作用?,尽管\ExplSyntax...开关的功能更多。


~关于代码块中 的处理,有几点需要注意。首先,与~代码块中的“空格”一样,~TeX 会忽略行首的

\ExplSyntaxOn
~ \cs_new:Npn .... 

完全等同于

\ExplSyntaxOn
\cs_new:Npn .... 

因为“空间”被忽略了。

其次,虽然~是代码块内的“空格”,\␣\~仍然不同且具有 LaTeX2e 定义。


为了完整性,还有一些细节需要讨论。\ExplSyntaxOn还为隐含在其语法中的其他字符适当地设置了 catcode:

  • TAB — 被忽略(就像空格一样)
  • "— 一个“其他”字符,对于十六进制输入是必需的,例如\int_eval:n { "F }(= 15)
  • &— 表格材料的对齐字符
  • ^— 上标 char 用于^^64样式符号
  • |expl3—布尔表达式所必需的“其他”字符

答案2

我想添加一些有关 LaTeX2e 内核宏和 expl3 函数组合的信息。该命令\ExplSyntaxOn不会更改特殊标记的 catcode @。因此,您还必须调用 LaTeX2e 内核宏和 expl3 函数的组合\makeatletter

\ExplSyntaxOn
\makeatletter
\cs_set:Npn \@maketitle…

相关内容