Como no título. eu encontrei dealgumas respostasque parece haver uma macro \newluafunction
no LaTeX.
No entanto, a documentação parece bastante escassa ...
- O que é um "nomeado
\luafunction
"? É expansível/não expansível/global etc.? - O que significa definir um?
- Como posso usar a macro para definir uma função e depois chamar a função?
Responder1
Um wrapper alocando um número para usar com \luafunction
e \luadef
, mas possivelmente não tão útil comparado a \newluacmd
ou seu equivalente em Lua, luatexbase.new_luafunction
.
Um csname definido via \luadef
acessa diretamente uma tabela Luatex de funções, portanto é equivalente a usar \directlua
com uma chamada de função Lua, exceto que salva uma expansão de um nome de macro e salva a expansão do argumento de \directua
como tokens TeX e passando para Lua a ser avaliado a cada vez. Então \qqq
abaixo é \directlua{qqq()}
mais rápido.
\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}
Na prática, teria sido melhor simplesmente usar o tamanho da lua.get_functions_table()
tabela, em vez de um número alocado no TeX, mas pareceu uma boa ideia na época.
Veja também \newluacmd
o que foi adicionado posteriormente, que aloca números da mesma sequência, mas evita a necessidade de uma chamada extra explícita para\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
disponibiliza a mesma alocação de Lua luatexbase.new_luafunction
que salva a passagem de números entre TeX e Lua. Isso define \qqq
a referência direta à função Lua com toda a alocação e definição sendo feitas em 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}