LaTeX3 系列教程之三:基本语法2之变量

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


三、变量

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 开始即刻享受科研精致美好生活
 关注公众号回复1进本硕博脱单群

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

开通 LaTeX VIP 地址:

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


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