与问题相关\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…