LaTeX3项目中的expl3编程入门指南

LaTeX3项目中的expl3编程入门指南

摘要

LaTeX3项目现已推出功能完善的宏编程代码,这些代码已包含在主要的TeX发行版中。本文作为高级入门指南,旨在帮助宏编写者开始采用这一新系统。

LaTeX3项目背景

LaTeX3项目始于多年前,旨在改进当时的LaTeX2.09和后来的LaTeXe系统。该项目包含三个主要方面:

  1. 支持当前版本的LaTeX
  2. 构建改进LaTeXe的宏编程模型
  3. 为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),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窦岑品

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值