LaTeX3项目中的expl3编程入门指南
摘要
LaTeX3项目现已推出功能完善的宏编程代码,这些代码已包含在主要的TeX发行版中。本文作为高级入门指南,旨在帮助宏编写者开始采用这一新系统。
LaTeX3项目背景
LaTeX3项目始于多年前,旨在改进当时的LaTeX2.09和后来的LaTeXe系统。该项目包含三个主要方面:
- 支持当前版本的LaTeX
- 构建改进LaTeXe的宏编程模型
- 为LaTeXe的继任者开发新的用户界面
expl3包是一套定义新LaTeX编程模型的模块集合。多年来,许多宏编写者对LaTeXe提供的工具(或缺乏工具)感到不满,并在此基础上构建了自己的编程层。
expl3包的核心特点
1. 命名空间与语法
expl3扩展了LaTeX传统的命名空间概念,使用_
和:
作为分隔符:
_
用于分隔宏名中的逻辑部分:
用于分隔宏名与其参数定义
例如:\use_ii:nn
等同于传统的\@secondoftwo
2. 代码结构
使用expl3的包通常这样开始:
\RequirePackage{expl3}
\ProvidesExplPackage{test-expl3}{2008/08/22}
{v0.1}{A test package for expl3}
3. 空白处理
expl3代码中的空格会被忽略,大大提高了代码可读性:
\cs_new:Nn \mymacro:n {
\tl_if_blank:nTF {#1} {
[empty]
}{
#1
}
}
编程语法详解
1. 参数说明符
expl3使用后缀字母作为参数说明符,将函数行为编码到函数名中:
| 说明符 | 含义 | 示例 |
|--------|--------------------------|--------------------------|
| n
| 普通参数(用花括号包围) | \tl_reverse:n{abc}
|
| N
| 单个token(无花括号) | \cs_set_eq:NN \a \b
|
| x
| 先完全展开再传递 | \cs_set:Npx
类似\edef
|
| TF
| 真/假分支 | \tl_if_eq:nnTF
|
2. 变量命名规范
expl3有严格的变量命名规范,提高代码可读性和可维护性:
| 后缀 | 数据类型 | 示例 |
|---------|--------------------|--------------|
| _int
| 整数 | \l_my_int
|
| _clist
| 逗号分隔列表 | \g_list_clist
|
| _tl
| 令牌列表 | \l_text_tl
|
全局变量以g_
开头,局部变量以l_
开头。
核心编程概念
1. 函数定义
expl3提供了一套低层命令来定义宏(称为"函数"):
\cs_set:Npn \foo:nn #1#2 {(#1)/(#2)}
\cs_set:cpn {foo:nn} #1#2 {(#1)/(#2)}
等效于TeX的:
\long\def\foo:nn
\expandafter\long\expandafter\def\csname foo:nn\endcsname
2. 布尔逻辑
expl3采用不同于传统\newif
的方法处理布尔逻辑:
\bool_if:nTF{\c_false}{yes}{no}
3. 令牌列表处理
expl3引入"tl"(Token List)数据类型专门用于存储文本:
\tl_set:Nx \NewMacro {#1}
高级技巧
1. 局部定义
保持所有定义局部化,实现宏的嵌套和局部效果:
\cs_new:Npn \MyMacro #1 {
\group_begin:
\cs_set_eq:NN \SomeOtherMacro \scan_stop:
\tl_set:Nx \NewMacro {#1}
\exp_args:NNNo
\group_end:
\tl_set:Nn \NewMacro {\NewMacro}
}
2. 与LuaTeX的关系
expl3为LaTeX提供了结构化基础,可以逐步用Lua重写部分功能,例如l3prg
中的快速排序算法。
学习资源
expl3包提供了丰富的文档:
expl3.pdf
:介绍expl3的哲学和编程模块概述source3.pdf
:完整的expl3包文档
通过本文介绍的基础概念,开发者可以开始使用expl3这一强大而灵活的LaTeX编程平台。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考