Что такое \newluafunction? Как ее использовать?

Что такое \newluafunction? Как ее использовать?

Как в названии. Я нашел отнекоторые ответычто в LaTeX, кажется, есть макрос \newluafunction.

Однако документация, похоже, весьма скудна...

Скриншот из source2e.pdf

  • Что такое "именованный \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}

Связанный контент