O que é \newluafunction? Como posso usá-lo?

O que é \newluafunction? Como posso usá-lo?

Como no título. eu encontrei dealgumas respostasque parece haver uma macro \newluafunctionno LaTeX.

No entanto, a documentação parece bastante escassa ...

Captura de tela de source2e.pdf

  • 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

insira a descrição da imagem aqui

Um wrapper alocando um número para usar com \luafunctione \luadef, mas possivelmente não tão útil comparado a \newluacmdou seu equivalente em Lua, luatexbase.new_luafunction.

Um csname definido via \luadefacessa diretamente uma tabela Luatex de funções, portanto é equivalente a usar \directluacom 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 \directuacomo tokens TeX e passando para Lua a ser avaliado a cada vez. Então \qqqabaixo é \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 \newluacmdo 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}

luatexbasedisponibiliza a mesma alocação de Lua luatexbase.new_luafunctionque salva a passagem de números entre TeX e Lua. Isso define \qqqa 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}

informação relacionada