
Как автор пакета, я хочу написать модуль Lua, который можно будет найти как с помощью , так lualatex
и 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 содержит рекурсивное включение ( //
), тогда как второй содержит точный корневой каталог.
Я уже узнал, что context
делает вещи по-другому по сравнению с lualatex
(не использует kpse
during require
и обрабатывает периоды по-другому). Но эта проблема заставляет нас задуматься: lualatex
похоже, работает с рекурсивно определенными путями к файлам lua. Судя по конфигурациям texmf.cnf, поставляемым с tex live, я бы ожидал, что моя схема именования каталогов будет работать. Но что с контекстом!? Найдет ли он мои файлы, если я не укажу такой корневой путь? Кажется, что такая схема именования работает с библиотекой рисования графиков PGF (в обоих lualatex
и context
), но я не совсем понимаю, почему.
Я даже пытался скопировать свои .lua
файлы в глобальное дерево TL 2014 texmf
(далее texhash
— ) — безуспешно.
Итак, мой вопрос: где мне разместить свои .lua
файлы, чтобы и я, lualatex
и я context
могли их найти?
связанный: Лучшие практики для модулей Lua
решение1
Для того, чтобы иметь ответ на вики-сайте сообщества, за который можно проголосовать, чтобы снять этот вопрос, и чтобы я мог переформатировать его, если он наберет достаточно голосов/запросов, вот комментарии:
Вы запустили mtxrun --generate для повторного создания базы данных имен файлов? Это должно сделать файлы в TEXMF доступными для подпрограмм поиска Context. – Philipp Gesang 25 дек. 2014 в 15:53
[… продолжение] Также, Context code редко вызывает require() для загрузки пакетов, обычно только для внешних, не-TeX библиотек. Вместо этого более идиоматично использовать environment.loadluafile() на конце Lua и \registerctxluafile из TeX. – Philipp Gesang 25 дек. 2014 в 15:53
@phg Я не знал о mtxrun --generate. Я запустил его прямо сейчас без какой-либо видимой разницы (т.е. он все еще не находит файл). – Christian Feuersänger 25 дек. '14 в 17:31
@phg твоя ссылка на environment.loadluafile для меня в новинку. Это решение? Я также получил информацию от какого-то парня из контекста, что dofile(resolvers.findfile("foo.bar.whatever.lua")) является (частью?) лучшей практикой. По общему признанию, это только увеличивает мое замешательство относительно того, как писать библиотеки LUA, которые должны использоваться как из lualatex, так и из контекста. – Christian Feuersänger 25 дек. 2014 в 17:34
... возможно, ответом на мой вопрос может быть своего рода переключение «если я контекст, иначе, если я lualatex ...» – Кристиан Фейерсэнгер 25 дек. 2014 в 17:35
Если файл не найден после --generate, возможно, он расположен не в том дереве? Модули из Garden обычно находятся в texmf-modules, то, что вы устанавливаете вручную, находится в texmf-local. Это, конечно, при условии, что вы используете Minimals. Существуют определенные соглашения относительно расположения файлов. Большинство файлов сторонних модулей находятся в tex/context/third/${MODULE}/, скрипты, которые должны вызываться из mtxrun, в ./scripts/context/lua/third/${MODULE}, но я не думаю, что это соглашение соблюдается при выполнении поиска файлов. – Philipp Gesang 27 дек. 2014 в 11:36
Вот предложение по отладке поиска пути: сначала определите, где Context хранит информацию о своих файлах. Обычно это каталог с именем luatex-cache/context в корне texmf-cache или texmf-var. Затем создайте фиктивный файл с уникальным именем где-нибудь в вашем texmf-local/. Теперь запустите mtxrun --generate и выполните grep luatex-cache рекурсивно для имени фиктивного файла. Если файл был найден, он отобразится в описании содержимого дерева (luatex-cache/context//trees/.lua). Если нет, то местоположение вообще не просматривается Context. – Philipp Gesang 27 дек. 2014 в 11:44
Кстати, один из моих пакетов работает в Context, Plain и Latex: bitbucket.org/phg/enigma/src — я только что проверил, что размещение файлов в соответствующих деревьях в texmf-local работает отлично. – Philipp Gesang 27 дек. 2014 в 11:55
@phg спасибо за терпение и время! Это решило проблему! Я поместил файл в /home/ludewich/tl2014/texmf-dist/tex/generic/pgf/math/foo/bar, запустил mtxrun --generate, и он был правильно проиндексирован, и мой минимальный запустился. Я думал, что сделал то же самое после вашего первого комментария, но, возможно, я допустил какую-то ошибку? Если вы напишете свой намек относительно mtxrun в ответ, я с радостью его приму. – Christian Feuersänger 27 дек. 2014 в 14:10