コンテキスト パッケージの Lua ルートとは何ですか?

コンテキスト パッケージの Lua ルートとは何ですか?

lualatexパッケージ作成者として、と の両方で見つけられる Lua モジュールを作成したいと考えていますcontext

プロトタイプlualatexは適切に動作しており、パッケージをリリースした場合も同様に動作すると確信しています。

ただし、プロトタイプではファイルが見つかりませんが、適切な環境変数 (ファイルが直接見つかるディレクトリを指す) をcontext指定することによって、強制的にファイルを見つけるようにすることができます。LUAINPUTS

しかし、この環境変数が「野生」で動作するかどうか(またはどのように動作するか)はわかりません。ない私の開発環境と同じように設定します。

質問の本質は、それがcontext可能なようにファイルをどこに配置すればよいかということですrequire

以下は、私が考える最小限の動作例です。

私のパッケージが にあると仮定しましょう。これは、グローバル エントリ ポイントになる/tmp/luamodule/texmf/tex/generic/pgfplots/libs/foo/bar/xyz.luaという漠然としたアイデアに似ており、次にパッケージ (ディレクトリ) があり、さらに Lua パッケージ ( ) に似たサブディレクトリ構造があります。texmftexmftex/generic/pgfplots/libsfoo/bar/xyz.lua

パッケージファイルにはxyz.lua高度なパッケージが含まれています

io.write("\nFOUND IT!\n")

次に、ファイルの内容

\documentclass{standalone}

\directlua{require('foo.bar.xyz')}

\begin{document}

OK.
\end{document}

これを処理して

export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
lualatex xyz.tex

動作: コンソール出力に「FOUND IT」と表示されます。

次に、同じことを再度実行し、次の内容を含むcontextファイルを書き込みます。xyzcontext.tex

\directlua{require('foo.bar.xyz')}
\starttext
OK.
\stoptext

これを翻訳すると

export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
context xyzcontext

Lua ファイルが見つからないため失敗します。

しかし、次のように書くとうまくいきます

export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots/libs/:"
context xyzcontext

違いは、最初の LUAINPUTS パスには再帰的な include( //) が含まれているのに対し、2 番目のパスには正確なルート ディレクトリが含まれていることです。

contextは と比較して動作が異なることを既に知っています( はduringlualatexを使用せず、 periods を異なる方法で処理します)。しかし、この問題により、次のことが疑問になります。 は、再帰的に定義された lua ファイル パスで動作するようです。Tex Live に同梱されている texmf.cnf 構成から判断すると、ディレクトリ命名スキームが機能すると予想されます。しかし、コンテキストはどうでしょうか。このようなルート パスを設定しないと、ファイルは見つかりますか。この種の命名スキームは、PGF のグラフ描画ライブラリ ( と の両方)で機能するようです。しかし、その理由がよくわかりません。kpserequirelualatexlualatexcontext

.luaファイルを TL 2014 グローバルtexmfツリー (続いて) にコピーしようとしましたがtexhash、成功しませんでした。

そこで質問です。 と の両方が見つけられるように、ファイルをどこに配置すればよいのでしょうか.lua?lualatexcontext

関連している: Lua モジュールのベスト プラクティス

答え1

この質問を削除するために賛成できるコミュニティ ウィキの回答を用意し、十分な賛成/リクエストが集まったら再フォーマットできるようにするために、コメントを次に示します。

ファイル名データベースを再作成するために mtxrun --generate を実行しましたか? これにより、TEXMF 内のファイルが Context のルックアップ ルーチンで使用できるようになります。 – Philipp Gesang 2014 年 12 月 25 日 15:53

[… 続き] また、Context コードはパッケージをロードするために require() を呼び出すことはめったになく、通常は外部の非 TeX ライブラリに対してのみ呼び出します。代わりに、Lua 側で environment.loadluafile() を使用し、TeX 側で \registerctxluafile を使用する方が慣用的です。 – Philipp Gesang 2014 年 12 月 25 日 15:53

@phg mtxrun --generate については知りませんでした。今実行してみましたが、明らかな違いはありませんでした (つまり、まだファイルが見つかりません)。 – Christian Feuersänger 2014 年 12 月 25 日 17:31

@phg environment.loadluafile への言及は初めて聞きました。これが解決策ですか? また、コンテキストの担当者から、dofile(resolvers.findfile("foo.bar.whatever.lua")) はベスト プラクティス (の一部?) であるという意見も聞きました。確かに、これは lualatex とコンテキストの両方から使用されるはずの LUA ライブラリの記述方法についての混乱を増すだけです。 – Christian Feuersänger 2014 年 12 月 25 日 17:34

... おそらく私の質問に対する答えは、ある種のスイッチ「もし私がコンテキストなら、そうでなければ私が lualatex なら...」かもしれません – Christian Feuersänger 2014 年 12 月 25 日 17:35

--generate を実行してもファイルが見つからない場合は、おそらく間違ったツリーにあるのでしょう。Garden のモジュールは通常 texmf-modules にあり、手動でインストールしたものは texmf-local の下にあります。もちろん、これは Minimals を使用していると仮定した場合です。ファイルの場所については一定の規則があります。サードパーティ モジュールのほとんどのファイルは tex/context/third/${MODULE}/ の下にあり、mtxrun から呼び出されるスクリプトは ./scripts/context/lua/third/${MODULE} の下にありますが、ファイル検索を行うときにこの規則が強制されるとは思えません。 – Philipp Gesang 2014 年 12 月 27 日 11:36

パス検索をデバッグするための提案を次に示します。まず、Context がファイル情報を保存する場所を特定します。通常、これはルート texmf-cache または texmf-var の下の luatex-cache/context という名前のディレクトリです。次に、texmf-local/ の下のどこかに一意の名前を持つダミー ファイルを作成します。次に、mtxrun --generate を実行し、ダミー ファイルの名前を求めて luatex-cache を再帰的に grep します。ファイルが見つかった場合は、ツリーの内容の説明に表示されます (luatex-cache/context//trees/.lua)。見つからない場合は、その場所は Context によってまったくトラバースされていません。 – Philipp Gesang 2014 年 12 月 27 日 11:44

ちなみに、私のパッケージの 1 つは Context、Plain、Latex で動作します: bitbucket.org/phg/enigma/src -- texmf-local の下の各ツリーにファイルを配置すると問題なく動作することを確認しました。 – Philipp Gesang 2014 年 12 月 27 日 11:55

@phg 忍耐と時間をありがとう!これで解決しました!ファイルを /home/ludewich/tl2014/texmf-dist/tex/generic/pgf/math/foo/ba‌​r に配置し、mtxrun --generate を実行したところ、適切にインデックスが作成され、最小限の実行が完了しました。最初のコメントの後で同じことをしたつもりでしたが、何か間違えたのでしょうか?mtxrun に関するヒントを回答に書き込んでいただければ、喜んでお受けします。 – Christian Feuersänger 2014 年 12 月 27 日 14:10

関連情報