我想将一些数据存储在.tuc
文件中,下次运行将获取这些数据。我成功存储了一些值,但之后无法检索它们。
这是我的尝试:
\starttext
\startluacode
local collected = utilities.storage.allocate()
local tobesaved = utilities.storage.allocate()
job.register("job.userdata", tobesaved)
tobesaved["foo"] = "value_foo"
tobesaved["bar"] = "value_bar"
\stopluacode
\stoptext
这会导致文件中出现以下条目.tuc
:
utilitydata.job.userdata={
["bar"]="value_bar",
["foo"]="value_foo",
}
这两个值根据需要存储。
附带问题:我随机选择了表utilitydata.job.userdata
来存储我的值。是否有一个默认表可用于此目的,以避免与系统使用的表发生冲突?
我希望能够使用例如检索数据collected["foo"]
,但collected
表是空的。
消息来源告诉我,有job.register
四个参数:collected
,tobesaved
和。也许这就是我的错误所在。我不知道他们在做什么。initializer
finalizer
从文件中检索值的接口是什么.tuc
?
(我不知道这个问题是否以 ConTeXt 为中心,或者普遍适用于 LuaTeX。如果该机制与 ConTeXt 相关,请随意添加语境标签。)
答案1
定义数据集
要将值存储到.tuc
文件中,您可以使用\definedataset [myset]
定义数据的容器。
存储数据
要存储键值对,请使用命令\setdataset
。
\setdataset [myset] [foo=foo-first, bar=bar-first]
\setdataset [myset] [foo=foo-second, bar=bar-second]
\setdataset [myset] [foo=foo-third, bar=bar-third]
像上面的例子中那样,使用相同的键对不同的数据进行后续调用不会覆盖以前的值。全部值被存储和枚举。上面的调用导致.tuc
文件中出现以下条目。
utilitydata.job.datasets.collected={
["myset"]={
{
["bar"]="bar-first",
["foo"]="foo-first",
},
{
["bar"]="bar-second",
["foo"]="foo-second",
},
{
["bar"]="bar-third",
["foo"]="foo-third",
},
},
}
系统负责处理表的名称,以免干扰核心表。
还可以添加另一个参数来处理后续调用中的各个值(使用相同的键)。
\setdataset [myset] [first] [foo=foo-first, bar=bar-first]
\setdataset [myset] [second] [foo=foo-second, bar=bar-second]
\setdataset [myset] [third] [foo=foo-third, bar=bar-third]
这些带有附加参数的调用导致.tuc
文件中出现以下条目。
utilitydata.job.datasets.collected={
["myset"]={
["first"]={
["bar"]="bar-first",
["foo"]="foo-first",
},
["second"]={
["bar"]="bar-second",
["foo"]="foo-second",
},
["third"]={
["bar"]="bar-third",
["foo"]="foo-third",
},
},
}
检索值
可以使用命令检索值\datasetvariable
。第一个参数是用 定义的数据集\definedataset
。
如果使用了带有两个参数的第一个变体
\setdataset
,则第二个参数是一个数字。它是调用的编号\setdataset
。如果使用了带有三个参数的第二个变体,则它是第二个参数中给出的标识符。
第三个参数是应该检索值的键。
笔记:与其他提到的命令不同,的参数
\datasetvariable
用括号而不是方括号分隔,因为实际上排版数据。这是 ConTeXts 惯例。
完整示例
\starttext
\definedataset [myset-1]
% two arguments ⇒ the data is accessed by number
\setdataset [myset-1] [foo=foo-first, bar=bar-first]
\setdataset [myset-1] [foo=foo-second, bar=bar-second]
% Outputs foo-first
\datasetvariable{myset-1}{1}{foo}\par
% Outputs foo-second
\datasetvariable{myset-1}{2}{foo}\par
% Outputs bar-first
\datasetvariable{myset-1}{1}{bar}\par
% Outputs bar-second
\datasetvariable{myset-1}{2}{bar}\blank
\definedataset [myset-2]
% three arguments ⇒ the data is accessed by identifier
\setdataset [myset-2] [first] [alpha=alpha-first, beta=beta-first]
\setdataset [myset-2] [second] [alpha=alpha-second, beta=beta-second]
% Outputs alpha-first
\datasetvariable{myset-2}{first} {alpha}\par
% Outputs alpha-second
\datasetvariable{myset-2}{second}{alpha}\par
% Outputs beta-first
\datasetvariable{myset-2}{first} {beta}\par
% Outputs beta-second
\datasetvariable{myset-2}{second}{beta}\par
\stoptext
结果: