
lualatex
パッケージ作成者として、と の両方で見つけられる Lua モジュールを作成したいと考えていますcontext
。
プロトタイプlualatex
は適切に動作しており、パッケージをリリースした場合も同様に動作すると確信しています。
ただし、プロトタイプではファイルが見つかりませんが、適切な環境変数 (ファイルが直接見つかるディレクトリを指す) をcontext
指定することによって、強制的にファイルを見つけるようにすることができます。LUAINPUTS
しかし、この環境変数が「野生」で動作するかどうか(またはどのように動作するか)はわかりません。ない私の開発環境と同じように設定します。
質問の本質は、それがcontext
可能なようにファイルをどこに配置すればよいかということですrequire
。
以下は、私が考える最小限の動作例です。
私のパッケージが にあると仮定しましょう。これは、グローバル エントリ ポイントになる/tmp/luamodule/texmf/tex/generic/pgfplots/libs/foo/bar/xyz.lua
という漠然としたアイデアに似ており、次にパッケージ (ディレクトリ) があり、さらに Lua パッケージ ( ) に似たサブディレクトリ構造があります。texmf
texmf
tex/generic/pgfplots/libs
foo/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 のグラフ描画ライブラリ ( と の両方)で機能するようです。しかし、その理由がよくわかりません。kpse
require
lualatex
lualatex
context
.lua
ファイルを TL 2014 グローバルtexmf
ツリー (続いて) にコピーしようとしましたがtexhash
、成功しませんでした。
そこで質問です。 と の両方が見つけられるように、ファイルをどこに配置すればよいのでしょうか.lua
?lualatex
context
関連している: 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/bar に配置し、mtxrun --generate を実行したところ、適切にインデックスが作成され、最小限の実行が完了しました。最初のコメントの後で同じことをしたつもりでしたが、何か間違えたのでしょうか?mtxrun に関するヒントを回答に書き込んでいただければ、喜んでお受けします。 – Christian Feuersänger 2014 年 12 月 27 日 14:10