https://stone-zeng.github.io/...git
将函数与变量分离,都是以\
开头。能够在“命令”中使用下划线区分单词。github
定义函数:<module>_<description>:<arg-spec>
参数<arg-spec>由一串字母表示:正则表达式
{..}
所包围的标准宏参数。#1#2
等。例子:编程
% LaTeX2ε \def\myfunc#1{Hello #1} % LaTeX3 \cs_new:Npn \my_func:n #1 { Hello~ #1 }
与 def
不一样的是,cs_new:Npn
会作重复定义检查。于是 cs_new:Npn
的实际效果其实更接近 LATEX 2ε 中的 newcommand
,只是参数形式更加灵活(newcommand
只能定义不带参数,或者参数形如 [<可选参数>]{<必选参数 1>}...
的命令)。c#
int_if_even:nTF
:它属于 int
模块,用于处理整数。这一函数的做用是判断一个数字(由 n
参数接受)是否是偶数,如果,则执行 T
分支,不然执行 F
分支。数组
int_if_even:nTF { 12 } { <true code> } { <false code> }
int_if_even:nT
表示数字为偶数则执行 T
分支,不然什么也不作;int_if_even:nF
也是相似的。函数
做用域(scope
)、模块名(module
)、描述(description
)以及变量类型(type
),<scope>_<module>_<description>_<type>
,没有冒号。
做用域有三个,分别时c常数、g全局变量、l局部变量。ui
例子:3d
% 声明变量 int_new:N l_my_variable_int int_new:N g_my_variable_int % 查看变量的值 int_show:N l_my_variable_int % => 0 int_show:N g_my_variable_int % => 0 % 开启一个分组 { % 赋值 int_set:Nn l_my_variable_int { 1 } int_gset:Nn g_my_variable_int { 1 } % 查看变量的值 int_show:N l_my_variable_int % => 1 int_show:N g_my_variable_int % => 1 } int_show:N l_my_variable_int % => 0 int_show:N g_my_variable_int % => 1
变量类型,又被称为寄存器,code
box
,盒子变量int
<– count
(integer),计数器,至关于整型变量dim
<– dimen
,刚性长度(dimension)skip
,弹性长度muskip
,数学弹性长度(skip in math unit)fp
:浮点数(floating points)intarray
、fparray
:整型、浮点型数组(integer/floating point array)bool
:布尔型变量regex
:正则表达式(regular expression)私有函数以两个下划线开头,如 __my_function:nn
;私有变量则在做用域标记以后跟着两个下划线,如 l__my_variable_tl
。
LATEX3 提供了 l3docstrip
宏包,它在文学编程宏包 docstrip
的基础上引入了名字空间的手法。%<@@=myi>
引入命名空间,@@
表明__xx
,而后使用\@@_
就是使用的当前命名空间的函数或方法,最后使用%<@@=>
关闭。
documentclass{article} usepackage{expl3} % RequirePackage{expl3} ExplSyntaxOn % 开启 LaTeX3 编程环境 ... ExplSyntaxOff % 关闭 LaTeX3 编程环境
在编写宏包或文档类时,@
符号能够被当成字母使用。