原文地址:https://zhuanlan.zhihu.com/p/10765530753
一、LaTeX3 与 expl3
背景
在 LaTeX2e 的基础之上开发一个 LaTeX 内核的第一步是解决底层系统是如何编程的。与目前混合使用 LaTeX 和 TeX 宏相比,LaTeX3 系统为控制 TeX 的所需的功能提供了它自己的一致接口。这样 LaTeX 程序员和用户就可以在不熟悉内核和 plain TeX 的内部性质的状态下,仍能有效地工作。
expl3 包
expl3 包为 LaTeX 提供了这个新的编程接口(又称 l3 编程)。为了使编程系统化,LaTeX3 使用了一些完全异于 LaTeX2e 或 plain TeX 的约定。
-
为所有命令(包括 TeX 原语)提供一致的命名方案;
-
将命令分类为 LaTeX 函数和 LaTeX 参数,并根据其功能将其划分为模块;
-
-
提供一组核心的 LaTeX 函数,足以处理队列、集合、堆栈、属性列表等编程结构;
-
二、引例
\documentclass{article}
% 新版本已经将 expl3 包合并到 LaTeX 内核中
% 所以不需要再单独加载,网上很多教程都是旧版本的内容
% \usepackage{expl3}
\begin{document}
\ExplSyntaxOn % 开启 expl3 模式
\cs_set:Npn \__my_command:n #1 { Hello, #1! } % 定义一个命令
\__my_command:n { LaTeX3 } % 使用命令,{ LaTeX3 }为参数
\ExplSyntaxOff % 关闭 expl3 模式
\end{document}
最新版本的 expl3 已经集成到 LaTeX2e 内核中的,所以不需要单独加载。但需要使用
\ExplSyntaxOn
和
\ExplSyntaxOff
来开启和关闭 expl3 模式。
\cs_new:Npn \__my_command:n #1 { Hello, #1! }
是定义一个命令(函数)的语法。
\__my_command:n { LaTeX3}
是使用命令(函数)的语法。
三、函数、变量与模块
函数与变量
尽管 TeX 实际上是一个宏处理器,但根据 expl3 编程语言的约定,我们区分"函数"与"变量"。
函数可以有参数,它们可以展开或者执行。引例中
\cs_new:Npn
就是一个函数。它可以用来定义其它函数。
变量可以被赋值,它们可以在函数的参数中使用;它们不是直接使用,而是由函数来操纵(包括获取与设置)。变量应该总是在尝试赋值之前声明。
注,函数与变量是一个不准确的术语,并不是真正的函数与变量。这一条前期可以忽略,等理解后在深入理解。
模块
模块是 LaTeX3 中组织代码的基本单位。每个模块都包含相关的函数和变量,使代码更加结构化和易于维护。
例如:
一个不严谨的理解,可以简单理解为模块就是宏包。
四、命名规则
LaTeX3 的命名规则是一套约定俗成的规则,用于区分函数、变量、私有函数与变量等。虽然它本身并不强制,但遵循它可以使代码更加清晰和易于维护。
基本命名规则
-
LaTeX3 不使用“@”作为定义内部宏的“字母”。相反,在内部宏中使用“_”和“
:
”符号来提供结构;
-
LaTeX3 的函数名称由三个组成部分:
\\_:
;
-
-
所有名称的语法都包含和,它们都提供了命令的相关信息。这里的的作用类似轻量的命名空间。
引例中
\cs_new:Npn
的模块为
cs
,
new
则是描述,
Npn
则是参数说明。