\newluafunction とは何ですか? どのように使用できますか?

\newluafunction とは何ですか? どのように使用できますか?

タイトルの通り。いくつかの答えLaTeX にはマクロがあるようです\newluafunction

しかし、ドキュメントはかなり乏しいようです...

source2e.pdf からのスクリーンショット

  • 「名前付き\luafunction」とは何ですか? 拡張可能/拡張不可能/グローバルなどですか?
  • 定義するとはどういう意味ですか?
  • マクロを使用して関数を定義し、その関数を呼び出すにはどうすればよいですか?

答え1

ここに画像の説明を入力してください

および で使用する数値を割り当てるラッパーです\luafunctionが、や Lua の同等\luadefの と比べるとそれほど便利ではない可能性があります。\newluacmdluatexbase.new_luafunction

を介して定義された csname は\luadef、luatex Lua 関数テーブル\directluaに直接アクセスするため、マクロ名の展開を保存し、引数を\directuaTeX トークンとして展開して毎回評価される 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}

関連情報