一、注释与空白
LaTeX3 仍以 % 为注释符,% 至行未的所有内容都会被忽略。dtx 格式注释规则较复杂,但规则仍与 LaTeX2e 一样。
除了少量殊情况外,LaTeX3忽略所有空白(包括空格、制表、换行符等)。而
~
和 '\ ' 可以用来生成空白,不会被忽略(行首除外)。
如下示例:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn\my_funa:nn#1 #2
{ #1 #2 #1 }
\my_funa:nn{ Hello World! }{~}{ Hello World! }
\ExplSyntaxOff
\end{document}
等效于:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \my_funa:nn #1#2
{ #1 #2 #1 }
\my_funa:nn { Hello World! } { ~ }
{ Hello World! }
\ExplSyntaxOff
\end{document}
将输出:
HelloWorld! HelloWorld!HelloWorld!
。(接下来的内容解释原因)
二、函数
LaTeX3 内置了一系列的预定义函数,同时还支持用户自定义新函数。
函数是简单的带参或不带参宏,函数会展开(Expand)则为置换文本(Replacement Text)。
2.1 特殊的函数
LaTeX3 预定义的函数中,几乎大部分都符合上一节介绍的命名规则。但因功能需要,还是有少量的函数不符合命名规则。所幸,这些函数并不多,而且很容易识别。
前面介绍的
\ExplSyntaxOn
与
\ExplSyntaxOff
就是两个典型的例子。更多的函数将在后续章节中介绍。
启用与禁用 L3 语法
由于 L3 使用了
_
和
:
符号来提供结构,这与 LaTeX2e 本身的语法不兼容。所有要使用 L3 语法时,必须先用
\ExplSyntaxOn
来启用;而要用恢复 LaTeX2e 语法时,则需要使用
\ExplSyntaxOff
来禁用。
(如果你写过 LaTeX2e 宏包,可以把它们看作和
\makeatletter
与
\makeatother
的功能“类似”。)
后面讲解示例时,不再解释这两个命令了。
2.2 参数
函数可以带参数,也可以不带参数。使用标准命名规则的函数,其参数会由参数说明符指示出来,包含参数数量及参数类型等。
在函数定义时,可以使用
#1
、
#2
等符号来引用参数(其它语言中的形参)。LaTeX3 最多支持 9 个参数。
在执行(展开)函数时,会从函数后面的输入流中吸收参数(其它语言中的实参),并按顺序被传递给函数。
2.3 使用已有函数
在示例中,首先使用了
\cs_new:Npn
函数来定义一个新函数,它需要三个参数:函数名(
N
)、函数参数(
p
)和置换文本(
n
)。
实际执行时,会按如下方式传递参数:
-
将
\my_funa:nn
传递给第一个参数(
N
类型,吸收一个凭据);
-
将
#1#2
传递给第二个参数(
p
类型,吸收一个参数列表);
-
将
{ #1 #2 #1 }
传递给第三个参数(
n
类型,吸收一个凭据表)。
这个函数只起声明函数的作用,并不会输出任何内容。
接下来,使用了
\my_funa:nn
函数,它会按如下方式传递参数:
-
将
{ Hello World! }
传递给第一个参数(
n
类型,
#1
);
-
将
{ ~ }
传递给第二个参数(
n
类型,
#2
)。