笔记

笔记

我一直在试验 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

相关内容