LaTeX3 入门之基础概念

文摘   2025-01-04 22:52   浙江  
点击👇LaTeX工作室” 关注公众号
精致美好科研生活从 LaTeX 开始!


原文地址: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 的约定。

  1. 为所有命令(包括 TeX 原语)提供一致的命名方案;
  2. 将命令分类为 LaTeX 函数和 LaTeX 参数,并根据其功能将其划分为模块;
  3. 拥有一套控制参数展开的简单机制;
  4. 提供一组核心的 LaTeX 函数,足以处理队列、集合、堆栈、属性列表等编程结构;
  5. 一种 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 的命名规则是一套约定俗成的规则,用于区分函数、变量、私有函数与变量等。虽然它本身并不强制,但遵循它可以使代码更加清晰和易于维护。

基本命名规则

  1. LaTeX3 不使用“@”作为定义内部宏的“字母”。相反,在内部宏中使用“_”和“:”符号来提供结构;
  2. LaTeX3 的函数名称由三个组成部分:\<模块>\_<描述>:<参数说明符列表>
  3. 变量名则有四个部分:\<作用域>_\*<模块>_\*<描述>\_<类型>
  4. 所有名称的语法都包含<模块>和<描述>,它们都提供了命令的相关信息。这里的<模块>的作用类似轻量的命名空间。

引例中\cs_new:Npn的模块为csnew则是描述,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 变量有类型,常见的类型有:intstrbooldim 等。

expl3 分别为各个类型提供了一系列的函数,用于操作对应类型的变量。通常,这类函数定义在与类型同名的模块中。

五、相关术语【2024/12/21 更新】

  • 控制序列(Control Sequences)是指以反斜杠\ 开头的命令或符号,用来指示 TeX 执行特定的功能。函数和变量都是一种控制序列。在 LaTeX3 中经常缩写为"cs"。
  • 本质是文本替换,即当调用宏时,宏的内容会被直接插入到调用的位置。宏是基于 TeX 的基本功能,它是控制序列的一种具体表现形式,所有的宏都是控制序列,但控制序列不仅仅是宏。
  • 命令 是控制序列的一个子集,通常用于直接排版操作或调用特定功能。主要是针对 LaTeX2e 及 TeX 的术语。命令主要是面向文档用户,提供高层排版接口。命令是宏的一种具体形式。
  • 函数 是 LaTeX3 中的术语,指 expl3 编程环境下定义的、严格规范的控制序列。函数的本质就是宏。
  • 变量 是 LaTeX3 中的术语,指指可以存储数据(例如数字、文本、布尔值等)并在需要时取值或修改的一种特殊的控制序列。



点击👇LaTeX工作室” 关注公众号
从 LaTeX 开始即刻享受科研精致美好生活
 关注公众号回复1进本硕博脱单群

成为 LaTeX 会员,尽享精致科研!

开通 LaTeX VIP 地址:

https://www.latexstudio.net/index/recharge/choice.html

LaTeX工作室
精致科研生活从 LaTeX 开始! 模版定制 | 培训 | 排版 | 答疑 加VX:t314159265
 最新文章