
如標題所示。我發現從一些答案\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}