
作為包作者,我想寫一個可以被 和 找到的 Lualualatex
模組context
。
原型lualatex
工作合理,我相信如果我發布該軟體包,這也將是正確的。
但是,context
原型沒有找到我的文件,但我可以透過指定合適的LUAINPUTS
環境變數(指向可以直接找到我的文件的目錄)來強制它找到我的文件。
但是,我不明白我的包是否(或如何)在該環境變數所在的“狂野”環境中工作不是設定為我的開發環境。
問題本質上是:我應該將文件放置在context
哪裡require
?
我認為這是一個最小的工作範例:
讓我們假設我的包位於/tmp/luamodule/texmf/tex/generic/pgfplots/libs/foo/bar/xyz.lua
.這類似於我模糊的想法,即texmf
作為全域texmf
入口點,然後我有我的包(目錄tex/generic/pgfplots/libs
),然後我有一個類似於我的 Lua 包()的子目錄結構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 ( //
),而第二個路徑包含精確的根目錄。
我已經了解到,與(在期間不使用並且以不同方式處理期間)context
相比,它的作用有所不同。但這個問題讓我們想知道:似乎可以使用遞歸定義的 lua 檔案路徑。從 tex live 附帶的 texmf.cnf 配置來看,我希望我的目錄命名方案能夠運作。但是上下文又如何呢?如果我不設定這樣的根路徑,它會找到我的檔案嗎?似乎這種命名方案適用於 PGF 的圖形繪製庫(在 和 中),但我真的不明白為什麼。lualatex
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
[...續] 此外,上下文程式碼很少會呼叫 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}/ 下,這些腳本應該從 ./scripts/context/lua/third/${MODULE} 下的 mtxrun 調用,但我不會這樣做認為在進行文件查找時強制執行約定。 – Philipp Gesang 2014-12-27 11:36
以下是調試路徑查找的建議:首先確定 Context 儲存其檔案資訊的位置。通常這是根 texmf-cache 或 texmf-var 下名為 luatex-cache/context 的目錄。然後在 texmf-local/ 下的某個位置建立一個具有唯一名稱的虛擬檔案。現在執行 mtxrun --generate 並遞歸地 grep luatex-cache 來取得虛擬檔案的名稱。如果找到該文件,它將顯示在樹內容的描述中(luatex-cache/context//trees/.lua)。如果不是,則 Context 根本不會遍歷該位置。 – Philipp Gesang 2014-12-27 11:44
順便提一句。我的一個套件可以在 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