正如标题所示。我从一些答案\newluafunction
LaTeX 中似乎有一个宏。
然而,文档似乎相当稀少......
- 什么是“命名
\luafunction
”?它是可扩展/不可扩展/全局的吗?等等。 - 定义一个是什么意思?
- 如何使用宏定义一个函数,然后调用该函数?
答案1
\luafunction
一个包装器,分配一个数字与和 一起使用,但与或其 Lua 等效\luadef
项 相比可能没那么有用。\newluacmd
luatexbase.new_luafunction
通过 定义的 csname\luadef
直接访问 luatex Lua 函数表,因此它相当于使用\directlua
Lua 函数调用,只不过它省去了宏名称的扩展,并且省去了将 的参数扩展为\directua
TeX 标记并每次传递给 Lua 进行评估的过程。所以\qqq
下面的方法\directlua{qqq()}
更快。
\documentclass{article}
\directlua{
qqqn=0
function qqq ()
qqqn=qqqn+1
tex.print(qqqn)
end
}
\newluafunction\qqqn
\directlua {
local t = lua.get_functions_table()
t[\the\qqqn] = qqq
}
\luadef\qqq\qqqn
\begin{document}
A: \qqq
B: \qqq
\end{document}
实际上,最好只是使用lua.get_functions_table()
表的大小,而不是 TeX 分配的数字,但当时这似乎是个好主意。
另请参阅\newluacmd
后来添加的,它从同一序列分配数字,但避免了额外显式调用\luadef
\documentclass{article}
\directlua{
qqqn=0
function qqq ()
qqqn=qqqn+1
tex.print(qqqn)
end
}
\newluacmd\qqq
\directlua {
local t = lua.get_functions_table()
t[\number\allocationnumber] = qqq
}
\begin{document}
A: \qqq
B: \qqq
\end{document}
luatexbase
使 Lua 中的分配与此相同,从而luatexbase.new_luafunction
节省了在 TeX 和 Lua 之间来回传递数字的时间。这定义\qqq
为直接引用 Lua 函数,所有分配和定义都在 Lua 中完成。
\documentclass{article}
\directlua{
qqqn=0
function qqq ()
qqqn=qqqn+1
tex.print(qqqn)
end
local funid= luatexbase.new_luafunction()
lua.get_functions_table()[funid]=qqq
token.set_lua('qqq',funid)
}
\begin{document}
A: \qqq
B: \qqq
\end{document}