Wie im Titel. Ich fand voneinige Antwortendass es in LaTeX ein Makro zu geben scheint \newluafunction
.
Die Dokumentation scheint jedoch recht spärlich zu sein ...
- Was ist ein „benannter
\luafunction
“? Ist er erweiterbar/nicht erweiterbar/global usw.? - Was bedeutet es, einen zu definieren?
- Wie kann ich das Makro verwenden, um eine Funktion zu definieren und dann die Funktion aufzurufen?
Antwort1
Ein Wrapper, der eine Zahl für die Verwendung mit \luafunction
und zuweist \luadef
, aber möglicherweise nicht so nützlich im Vergleich zu \newluacmd
oder seinem Lua-Äquivalent ist luatexbase.new_luafunction
.
Ein über definierter csname \luadef
greift direkt auf eine Luatex-Lua-Funktionstabelle zu, ist also gleichwertig mit der Verwendung \directlua
mit einem Lua-Funktionsaufruf, mit dem Unterschied, dass es eine Erweiterung eines Makronamens spart und es spart, das Argument von \directua
als TeX-Token zu erweitern und jedes Mal zur Auswertung an Lua weiterzugeben. Das \qqq
Folgende ist also \directlua{qqq()}
noch schneller.
\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}
In der Praxis wäre es besser gewesen, einfach die Größe der lua.get_functions_table()
Tabelle zu verwenden, statt einer von TeX zugewiesenen Zahl, aber damals schien es eine gute Idee zu sein.
Siehe auch \newluacmd
das später hinzugefügte, das Nummern aus der gleichen Sequenz zuweist, aber die Notwendigkeit eines zusätzlichen expliziten Aufrufs von\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
stellt die gleiche Zuweisung von Lua aus zur Verfügung, wodurch luatexbase.new_luafunction
das Hin- und Herschicken von Zahlen zwischen TeX und Lua entfällt. Dies definiert \qqq
den direkten Verweis auf die Lua-Funktion, wobei die gesamte Zuweisung und Definition in Lua erfolgt.
\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}