如何定义全局变量?
如何定义全局变量?如果“全局变量”是编程中唯一使用的术语,那么我想要的是一种存储某些内容并在需要时更改或使用它的方法。
以下是我的方法
\documentclass{article}
\newcommand{\varx}{}
\newcommand{\setx}[1]{\renewcommand{\varx}{#1}}
\begin{document}
\setx{abc}
\varx
\setx{def}
\varx
\end{document}
存在问题:
- 我必须对每个变量使用单独的命令来更改它们的值。
- 这看起来很奇怪。好像应该有另一个命令来执行此操作。(只是我不知道。)
顺便说一句,我不知道该使用什么标签。
答案1
TeX 提供 token 寄存器。您可以通过 声明一个新的 token 寄存器,通过或\newtoks\abc
将值设置为该寄存器,并通过 使用该值。问题是声明一个控制序列而不检查它是否已经定义,因此是允许的,但您的 LaTeX 文档(如果您使用的是 LaTeX,原文如此)在此之后会被损坏。我建议定义一个宏,该宏仅在声明的控制序列未定义时运行。该宏具有以下语法\abc={value}
\abc{value}
\the\abc
\newtoks
\newtoks\end
\declvar
\newtoks
\declvar\sequence {default value}
实现及测试如下:
\def\declvar #1{%
\ifx#1\undefined
\newtoks#1#1%
\else
\errmessage{\string\declvar: \string#1 cannot be var, it is defined already}%
\toks0
\fi}
\declvar\abc {default value}
\the\abc % expands to "default value"
\abc={new value}
\the\abc % expands to "new value"
\declvar\begin {default} % throws error message
答案2
答案3
目前还不清楚这些“变量”应该包含什么。通用容器被称为expl3
“令牌列表”。
您可以使用某种命名空间来解决已定义命令的问题。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\setvar}{mm}
{
% clear an existing variable or allocate a new one
\tl_clear_new:c { g__youthdoo_var_#1_tl }
% set to the stated value
\tl_gset:cn { g__youthdoo_var_#1_tl } { #2 }
}
\NewExpandableDocumentCommand{\usevar}{m}
{
% deliver the contents
\tl_use:c { g__youthdoo_var_#1_tl }
}
\ExplSyntaxOff
\begin{document}
\setvar{x}{abc}
\usevar{x}
\setvar{x}{def}
\usevar{x}
\end{document}
还有更具体的变量类型,例如浮点数。