我一直在试验 ConTeXt,并尝试使用它来创建考试。
我希望在 lua 中有一个数组来保存每个问题的权重,以及一个名为“问题”的自定义枚举,它使用它自己的计数器值从数组中获取正确的权重,并将其打印在问题编号旁边。
我无法让从 tex 传递的计数器值在 lua 中得到正确解释。它被正确识别为字符串,lua 将该字符串打印为正确的值,我甚至可以将更多数字附加到字符串中,它也能正常工作。但任何将该值转换为数字的尝试都会导致 Lua 中的值为 nil。
有人知道我做错什么了吗?
这是我编写的基本代码,在当前版本的 ConTeXt mkiv 下编译时,它会为 a 和 b 打印 nil。编译时 ConTeXt 会暂停并给我一个“请输入命令或说‘\end’)”提示,我认为这可能以某种方式连接,但也许这是一个单独的问题。
\startluacode
local lpeg = require"lpeg"
userdata = userdata or {}
qVals = {2, 3, 5, 10}
function userdata.getQval(numb)
local int = lpeg.S'+-'^-1 * lpeg.R'09'^1
local a = lpeg.match(int,numb)
local b = qVals[tonumber(numb)]
context(type(numb) .. type(a) .. type(b) .. qVals[1])
end
\stopluacode
\def\getQuestionVal#1{%
\ctxlua{userdata.getQval([==[#1]==])}%
}
\defineenumeration[question]
\setupenumerations[question][
text=\getQuestionVal{\getnumber[question]},
headstyle=normal
]
\starttext
\question This is the question
\question Another
\question and another
\stoptext
编辑:经过更多的搜索,我得出结论,它只\getnumber[question]
在最后展开,因此不能按原样用于索引。所以现在的问题是如何强制它展开
答案1
笔记
几年前,高级计数器机制的名称已从更改为\definenumber
,\definecounter
旧名称只是新命令名称的同义词。
例子
您的示例中的问题在于,您尝试使用命令\getnumber
将值传递给 Lua,但\getnumber
命令本身不可扩展。要获取 Lua 端计数器的值,您必须使用可扩展命令\rawcountervalue
,另一种方法是使用函数从 Lua 访问该值structures.counters.value
。
\startluacode
function userdata.showcounter_value(value)
context(tonumber(value))
end
function userdata.showcounter_name(name)
context(structures.counters.value(name))
end
\stopluacode
\definecounter[testcounter]
\starttext
\incrementcounter[testcounter]
\ctxlua{userdata.showcounter_value(\rawcountervalue[testcounter])}
\incrementcounter[testcounter]
\ctxlua{userdata.showcounter_name("testcounter")}
\stoptext