タイトルの通り。いくつかの答えLaTeX にはマクロがあるようです\newluafunction
。
しかし、ドキュメントはかなり乏しいようです...
- 「名前付き
\luafunction
」とは何ですか? 拡張可能/拡張不可能/グローバルなどですか? - 定義するとはどういう意味ですか?
- マクロを使用して関数を定義し、その関数を呼び出すにはどうすればよいですか?
答え1
および で使用する数値を割り当てるラッパーです\luafunction
が、や Lua の同等\luadef
の と比べるとそれほど便利ではない可能性があります。\newluacmd
luatexbase.new_luafunction
を介して定義された csname は\luadef
、luatex Lua 関数テーブル\directlua
に直接アクセスするため、マクロ名の展開を保存し、引数を\directua
TeX トークンとして展開して毎回評価される Lua に渡すことを除いて、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}
実際には、TeX が割り当てた数値ではなく、単にテーブルのサイズを使用する方が適切だったでしょうlua.get_functions_table()
が、当時はそれが良いアイデアのように思えました。
後で追加されたものも参照してください。\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}