![基于Lua命令在ConTeXt中定义自定义转换集](https://linux22.com/image/415272/%E5%9F%BA%E4%BA%8ELua%E5%91%BD%E4%BB%A4%E5%9C%A8ConTeXt%E4%B8%AD%E5%AE%9A%E4%B9%89%E8%87%AA%E5%AE%9A%E4%B9%89%E8%BD%AC%E6%8D%A2%E9%9B%86.png)
根据 ConTeXt Garden (https://wiki.contextgarden.net/Command/defineconversion)可以使用列表定义自定义转换。例如:
\defineconversion[inventory][<3,!,\math{\therefore},?]
将用于<3
1,!
用于 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)}}