三、变量
LaTeX3 中的变量是用于存储数据的容器。变量可以是数字、字符串、列表等。
3.1 为什么需要变量
变量在 LaTeX3 中非常重要,因为它们允许我们存储和重用数据。变量的使用可以简化代码、提高代码的可读性和可维护性。以下是一些使用变量的原因:
存储中间结果:在复杂的计算或处理过程中,变量可以用来存储中间结果,以便后续使用。 重用代码:变量可以使代码变得更加模块化和可重用,减少代码的重复编写。 提高代码的可读性:使用变量可以使代码变得更加易于理解,因为变量的名称可以描述其存储的数据的含义。 简化代码:变量可以简化代码的编写,因为它们可以减少重复的代码和复杂的表达式。
总之,变量是 LaTeX3 编程中一个非常有用的工具,可以帮助我们编写更加简洁、可读和可维护的代码。
3.2 变量的类型
在 LaTeX3 中,每个变量都有对应的类型。LaTeX3 预定了一系列的变量类型,如:
整数变量(int):用于存储整数值的变量。 浮点数变量(fp):用于存储浮点数的变量。 字符串变量(str):用于存储字符串的变量。 逗号分隔列表变量(clist):用于存储逗号分隔的列表的变量。 布尔值变量(bool):用于存储布尔值的变量。 凭据表变量(tl):用于存储凭据表的变量。
LaTeX3 为每种类型都提供了一系列的函数,用于定义和操作该类型的变量。
3.3 定义变量
LaTeX3 变量使用前必须先定义(声明)。LaTeX3 变量的命名规则如上篇所介绍:\<作用域>_<模块>_<描述>_<类型>
。这里的类型就是指要声明的变量的类型。
在 LaTeX3 中,可以使用 \<type>_new:N
、\<type>_const:Nn
等函数来定义变量。这些命令接收的第一个参数,都用于指定新变量的名称。
\ExplSyntaxOn
% 定义整形局部变量
\int_new:N \l_my_tmp_int
% 定义字符串全局变量
\str_new:N \g_my_tmp_str
% 定义的凭据表常量(常量只能在声明时初始化)
\tl_const:Nn \c_my_tmp_tl { $A=1$ }
\ExplSyntaxOff
注,变量不能重复定义,否则会报错。
3.4 设置变量
在 LaTeX3 中,可以使用 \<type>_set:Nn
、\<type>_gset:Nn
等函数来修改变量的值(后者是前者的全局版)。这些命令都接收两个参数,用于指定要设置的变量及设置的值。
\ExplSyntaxOn
% 设置整形局部变量
\int_set:Nn \l_my_tmp_int { 1 }
% 设置字符串全局变量
\str_gset:Nn \g_my_tmp_str { ABC }
% 常量不能修改
\ExplSyntaxOff
3.5 使用变量
在 LaTeX3 中,可以使用 \<type>_use:N
等函数来使用变量。这些命令接收都一个参数,用于指定要使用的变量。
\ExplSyntaxOn
% 使用整形变量
\int_use:N \l_my_tmp_int
% 使用字符串变量
\str_use:N \g_my_tmp_str
% 使用凭据表变量
\tl_use:N \c_my_tmp_tl
\ExplSyntaxOff
以上示例最终会输出 “1ABCA=1”。
3.6 预定义变量
LaTeX3 中的大部分类型,预定了如下四个变量,用于临时存储:
% 一组局部临时变量
\l_tmpa_<type>
\l_tmpb_<type>
% 一组全局临时变量
\g_tmpa_<type>
\g_tmpb_<type>
LATEX3 保证不在内核中使用它们,但有可能补其它非内核代码使用, 所以应当仅用于短期存储。即:
\ExplSyntaxOn
\int_set:Nn \l_tmpa_int { 1 }
% 调用内核代码...
% 调用自己且不设置该变量的代码...
\int_use:N \l_tmpa_int % 输出 1
% 调用其它命令...
\int_use:N \l_tmpa_int % 输出不确定
\ExplSyntaxOff
3.7 函数定义中使用变量
可以在函数的定义里(函数体中)使用函数外定义的变量。函数体里对变量的操作是在函数展开时(使用函数时)执行的。
因此,理论上只要调用函数时,函数体里的变量已经定义即可。但一般不建议这样操作,推荐先定义变量,再创建相关函数。
\ExplSyntaxOn
% 定义并初始化变量
\str_new:N \g_my_split_char_str
\str_gset:Nn \g_my_split_char_str { , }
% 定义函数里使用变量
\cs_new:Npn \my_function:n #1
{ #1 \str_use:N \g_my_split_char_str #1 }
% 使用函数
\my_function:n { ABC }
% 修改变量的值再使用函数
\str_gset:Nn \g_my_split_char_str { - }
\my_function:n { DEF }
\ExplSyntaxOff
以上示例将输出 ABC,ABCDEF-DEF
。
3.8 没有局部变量
LaTeX3 定义的所有变量与函数均是文档级别的(即使在函数中定义的变量),它没有其它编程语言中的局部变量的概念。
% 错误的示例
\ExplSyntaxOn
\cs_new:Npn \my_function:n #1
{
\str_new:N \l__my_tmp_str
\str_set:Nn \l__my_tmp_str { #1 }
% 其它操作...
}
\my_function:n { ABC }
\my_function:n { DEF }
\ExplSyntaxOff
如上示例编译时将报错:“变量 \l__my_tmp_str
已经定义”。因为在第一次调用函数时,它就已经创建了,并且在函数展开后仍然存在;而第二次调用函数时,它会重复去创建,从而导致报错。
变量的<作用域>前缀,是指示变量值的设置的方式;私有变量则指示变量不应当在模块外使用。它们的作用和局部变量是没有关系的。
内容选自:https://zhuanlan.zhihu.com/p/11399513472
春节路上,希望大家平安到家,新年快乐!
成为 LaTeX 会员,尽享精致科研!
开通 LaTeX VIP 地址:
https://www.latexstudio.net/index/recharge/choice.html