定义数据集

定义数据集

我想将一些数据存储在.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四个参数:collectedtobesaved和。也许这就是我的错误所在。我不知道他们在做什么。initializerfinalizer

从文件中检索值的接口是什么.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

结果:结果

相关内容