原文地址: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 函数,足以处理队列、集合、堆栈、属性列表等编程结构; 一种 TeX 编程环境,如忽略所有空白。
二、引例
\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 中组织代码的基本单位。每个模块都包含相关的函数和变量,使代码更加结构化和易于维护。
例如:
str
字符串处理模块box
盒子操作模块fp
浮点数计算模块tl
凭据表(Token List)模块
一个不严谨的理解,可以简单理解为模块就是宏包。
四、命名规则
LaTeX3 的命名规则是一套约定俗成的规则,用于区分函数、变量、私有函数与变量等。虽然它本身并不强制,但遵循它可以使代码更加清晰和易于维护。
基本命名规则
LaTeX3 不使用“@”作为定义内部宏的“字母”。相反,在内部宏中使用“_”和“ :
”符号来提供结构;LaTeX3 的函数名称由三个组成部分: \<模块>\_<描述>:<参数说明符列表>
;变量名则有四个部分: \<作用域>_\*<模块>_\*<描述>\_<类型>
;所有名称的语法都包含<模块>和<描述>,它们都提供了命令的相关信息。这里的<模块>的作用类似轻量的命名空间。
引例中\cs_new:Npn
的模块为cs
,new
则是描述,Npn
则是参数说明。
私有函数与变量
LaTeX3 本身并不区分私有函数与变量,私有函数与变量只是约定俗成的一种命名规则。
私有函数与变量是模块内部的函数与变量,不应当在模块外部访问。
私有函数和变量的命名应在模块名称的开头添加“__”。
引例中\__my_command:n
就是私有函数。
作用域
名称中的作用域部分描述了如何访问变量。变量分局部、全局和常量。作用域类型出现在变量名称的开始位置;它们使用如下代码:
c
常量(不可修改的全局变量),如\c_empty_str
;g
只可全局设置的变量,如\g_tmpa_str
;l
只可本地设置的变量,如\l_tmpa_str
。
参数限定符与签名【2024/12/21 更新】
参数限定符用来描述函数期待的什么样的参数。在大部分情况下,单个的字母代表一个参数。一个函数的完整的参数限定符组成的列表称为函数的 签名
(Signature)。
这里先介绍几个常用的参数限定符:
N
单独的凭据(单个控制序列或字符)。引例中定义函数时的\__my_command:n
就是\cs_new:Npn
的一个 N 参数。n
未扩展的凭据或凭据表。这是一个标准的 TeX 未限定宏参数。引例中的{ LaTeX3 }
就是一个 n 参数。p
原始的 TeX 参数说明。它可以是像#1#2#3 的东西,这是在函数定义时使用。
类型【2024/12/21 更新】
LaTeX3 变量有类型,常见的类型有:int
、str
、bool
、dim
等。
expl3
分别为各个类型提供了一系列的函数,用于操作对应类型的变量。通常,这类函数定义在与类型同名的模块中。
五、相关术语【2024/12/21 更新】
控制序列(Control Sequences)是指以反斜杠 \
开头的命令或符号,用来指示 TeX 执行特定的功能。函数和变量都是一种控制序列。在 LaTeX3 中经常缩写为"cs"。宏 本质是文本替换,即当调用宏时,宏的内容会被直接插入到调用的位置。宏是基于 TeX 的基本功能,它是控制序列的一种具体表现形式,所有的宏都是控制序列,但控制序列不仅仅是宏。 命令 是控制序列的一个子集,通常用于直接排版操作或调用特定功能。主要是针对 LaTeX2e 及 TeX 的术语。命令主要是面向文档用户,提供高层排版接口。命令是宏的一种具体形式。 函数 是 LaTeX3 中的术语,指 expl3 编程环境下定义的、严格规范的控制序列。函数的本质就是宏。 变量 是 LaTeX3 中的术语,指指可以存储数据(例如数字、文本、布尔值等)并在需要时取值或修改的一种特殊的控制序列。
成为 LaTeX 会员,尽享精致科研!
开通 LaTeX VIP 地址:
https://www.latexstudio.net/index/recharge/choice.html