Как в названии. Я нашел отнекоторые ответычто в LaTeX, кажется, есть макрос \newluafunction
.
Однако документация, похоже, весьма скудна...
- Что такое "именованный
\luafunction
"? Является ли он расширяемым/нерасширяемым/глобальным и т. д.? - Что значит дать определение?
- Как можно использовать макрос для определения функции, а затем вызвать ее?
решение1
Оболочка, выделяющая число для использования с \luafunction
и \luadef
, но, возможно, не такая полезная по сравнению с \newluacmd
или его эквивалентом Lua, 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}