何时应该在 LaTeX 中使用本地变量或全局变量?

何时应该在 LaTeX 中使用本地变量或全局变量?

根据手册,LaTeX3 变量可以地方政府,G全球,或C常量范围。什么时候应该使用各种类型?在我天真的编码尝试中,我只是习惯用 来声明大多数变量,因为\l_@@_它们只打算在包宏中使用,而不是打算以其他方式接触。我一直在编写的包包含在一个 中*.dtx,因为目前将其拆分为多个文件的好处似乎不值得付出努力和额外的复杂性。

对于何时应使用每种类型的变量,是否存在比单行解释更深入的通用指南或启发式方法expl3.pdf

答案1

TeX 作用域基于分组,而不是基于文件/定义/...,这一点在其他语言中可能有所体现。这是因为 TeX 是通过宏扩展来工作的,因此不存在根据定义内容而创建的作用域。

最明显的分组形式是明确创建的,expl3

\group_begin:
  % Local settings here
\group_end:

在此设置中,任何本地设置的材料都将在组结束时丢失。这对于“包含”值很有用

\int_new:N \l__my_int
\int_set:Nn \l__my_int { 10 }
\group_begin:
  \int_set:Nn \l__my_int { 20 }
\group_end:
\int_show:N \l__my_int % "10"

重要的是,TeX 组在开始时不会“重置”值,因此我们会得到

\int_set:Nn \l__my_int { 10 }
\group_begin:
   \int_show:N \l__my_int % "10"

大多数变量要么设置在顶层,要么故意限制其范围,因此大多数时候你需要expl3 \l_变量和\int_set:NnETC。

当值需要“逃离”某个范围时,全局变量非常有用。在 LaTeX2e 中,有几个“明显”的地方可以考虑。第一个是环境:它们形成组。例如,如果我们想要一个列表,列出有多少次\foo,如果它可能出现在

\begin{some-env}
  \foo ...
  \foo ...
\end{some-env}
\showfoousage % "2"

我们需要使用全局变量。这同样适用于各种低级 TeX“隐藏”分组。可能最重要的是框和表格单元格。

因此,您需要思考的是“这个值是否是一个单一的全局值”。大多数情况下,诸如设置、暂存空间等ETC。不是。主要是诸如标签/跟踪数据之类的想法是全局的。(根据您的使用情况,您可能有一些想法需要“忽略” TeX 组:同样,这必须是全局的。)

答案2

以下几点是说明用例的示例:

  • 常量:您需要常量来表示永远不会改变的值,但您需要例如一致性。假设您编写了一个计算值的包,但您的输出(在当前状态下)只显示两位小数。因此,您引入了一个包含精度的常量,这样以后就可以轻松地更改它:

    \int_const:Nn \c_robbie_precision_int { 2 }
    
  • 全局变量:这些变量在整个文档中都是必需的,但它们的值可能会(或应该)发生变化。举个例子:你想用 l3 模拟一个 LaTeX 计数器,并用它来对整个文档的环境进行编号。这是全局的。因此你可以像这样定义它

    \int_new:N \g_robbie_mycount_int
    \int_gset:Nn \g_robbie_mycount_int { 1 }
    

    并记住使用全局函数(带有 的函数g)来更改值。要增加“计数器”,请执行以下操作

    \int_gincr:N \g_robbie_mycount_int
    
  • 局部变量:这些变量仅在本地组中使用。它们要么改变某些现有设置,要么引入组外不需要(且不可访问)的变量值。典型示例是需要将结果存储在临时变量中的简单计算。以下示例切换两个整数的值(您不希望临时值在其他任何地方):

    \int_set:Nn \l_tmpa_int { \g_robbie_mycountx_int }
    \int_gset_eq:NN \g_robbie_mycountx_int \g_robbie_mycount_int
    \int_gset_eq:NN \g_robbie_mycount_int \l_tmpa_int
    

相关内容