基于Lua命令在ConTeXt中定义自定义转换集

基于Lua命令在ConTeXt中定义自定义转换集

根据 ConTeXt Garden (https://wiki.contextgarden.net/Command/defineconversion)可以使用列表定义自定义转换。例如:

\defineconversion[inventory][<3,!,\math{\therefore},?]

将用于<31,!用于 2 等等。然而,当需要更大的列表时,这是一项痛苦的任务。如果我需要基于 Lua 函数的转换,则以下

\startluacode
function myfunction(n)
  -- return something 
end
\stopluacode
\def\myfunction#1\directlua{context(myfunction(n))}

不会在

\defineconversion[myfunction][\myfunction]

阅读邮件列表毫无意义,因为转换是写进去的core-con.lua,而特定情况(西班牙数字等)的解决方案需要一段时间才能将转换合并到文件中。有没有一种解决方案不需要调整,core-con.lua也不需要手动写入转换集的每个元素?

答案1

只需在 Lua 中定义整个转换。

\starttext

\startluacode
local function myfunction(n)
    local t = { "<3", "!", "\\math{\\therefore}", "?" }
    return t[n]
end

interfaces.implement {
    name = "myfunction",
    actions = { myfunction, context },
    arguments = "integer",
}
\stopluacode
\unprotect
\def\myfunction#1{\clf_myfunction\numexpr#1\relax}
\protect

\defineconversion[inventory][\myfunction]

\startitemize[inventory][stopper=,width=2em]
    \item foo
    \item bar
    \item baz
\stopitemize

\stoptext

在此处输入图片描述

原则上,您也可以使用\directlua问题中的方法,但我发现这很丑陋。

\startluacode
function userdata.myfunction(n)
    assert(type(n) == "number")
    local t = { "<3", "!", "\\math{\\therefore}", "?" }
    context(t[n])
end
\stopluacode
\def\myfunction#1{\ctxlua{userdata.myfunction(\number\numexpr#1\relax)}}

相关内容