
Como autor do pacote, quero escrever um módulo Lua que possa ser encontrado por lualatex
e context
.
O lualatex
protótipo funciona razoavelmente e estou convencido de que isso também será verdade se eu lançar o pacote.
No entanto, o context
protótipo não encontra meus arquivos, mas posso forçá-lo a encontrá-los especificando uma LUAINPUTS
variável de ambiente adequada (que aponta para o diretório no qual meus arquivos podem ser encontrados diretamente).
Porém, não entendo se (ou como) meu pacote irá funcionar no "selvagem" onde esta variável de ambiente estánãodefinido como no meu ambiente de desenvolvimento.
A questão é essencialmente: onde devo colocar meus arquivos para que context
possam require
?
Aqui está o que acredito ser um exemplo mínimo de trabalho:
Vamos supor que meu pacote resida em /tmp/luamodule/texmf/tex/generic/pgfplots/libs/foo/bar/xyz.lua
. Isso se assemelha à minha vaga ideia de que texmf
será o texmf
ponto de entrada global, então eu tenho meu pacote (diretórios tex/generic/pgfplots/libs
) e então tenho uma estrutura de subdiretórios semelhante ao meu pacote Lua ( foo/bar/xyz.lua
).
O arquivo do pacote xyz.lua
contém o pacote avançado
io.write("\nFOUND IT!\n")
Então eu tenho um arquivo contendo
\documentclass{standalone}
\directlua{require('foo.bar.xyz')}
\begin{document}
OK.
\end{document}
Processando isso com
export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
lualatex xyz.tex
funciona: vejo "FOUND IT" na saída do console.
Em seguida, tento fazer o mesmo novamente context
e escrevo um arquivo xyzcontext.tex
contendo
\directlua{require('foo.bar.xyz')}
\starttext
OK.
\stoptext
Traduzindo isso com
export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
context xyzcontext
falha porque não consegue encontrar o arquivo Lua.
No entanto, funciona se eu escrever
export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots/libs/:"
context xyzcontext
A diferença é que meu primeiro caminho LUAINPUTS contém um include recursivo ( //
), enquanto o segundo contém o diretório raiz preciso.
Já aprendi que context
faz as coisas de maneira diferente em comparação com lualatex
(não usa kpse
durante require
e lida com os períodos de maneira diferente). Mas esse problema nos permite pensar: lualatex
parece funcionar com caminhos de arquivo lua definidos recursivamente. A julgar pelas configurações do texmf.cnf fornecidas com o tex live, espero que meu esquema de nomenclatura de diretório funcione. Mas e o contexto!? Ele encontrará meus arquivos se eu não definir esse caminho raiz? Parece que esse tipo de esquema de nomenclatura funciona com a biblioteca de desenho gráfico do PGF (em ambos lualatex
e context
), mas realmente não vejo por quê.
Até tentei copiar meus .lua
arquivos para a árvore global do TL 2014 texmf
(seguido por texhash
) - sem sucesso.
Assim, minha pergunta: onde devo colocar meus .lua
arquivos para que ambos lualatex
possam context
encontrá-los?
relacionado: Melhores práticas para módulos Lua
Responder1
Para ter uma resposta wiki da comunidade que possa ser votada positivamente para eliminar esta questão, e que eu possa reformatar se obtiver votos positivos/solicitações suficientes, aqui estão os comentários:
Você executou mtxrun --generate para recriar o banco de dados de nomes de arquivos? Isso deve disponibilizar os arquivos do TEXMF para as rotinas de pesquisa do Context. – Philipp Gesang 25/12/14 às 15:53
[…continuação] Além disso, o código de contexto raramente chama require() para carregar pacotes, geralmente apenas para bibliotecas externas não-TeX. Em vez disso, é mais idiomático usar environment.loadluafile() no final de Lua e \registerctxluafile no TeX. – Philipp Gesang 25/12/14 às 15:53
@phg Eu não conhecia mtxrun --generate. Executei agora mesmo sem nenhuma diferença aparente (ou seja, ainda não encontra o arquivo). – Christian Feuersänger 25/12/14 às 17:31
@phg sua referência a environment.loadluafile é nova para mim. Essa é a solução? Também recebi informações de algum cara do contexto que dofile(resolvers.findfile("foo.bar.whatever.lua")) é (parte de?) uma prática recomendada. É certo que isso apenas aumenta minha confusão sobre como escrever bibliotecas LUA que deveriam ser usadas tanto no lualatex quanto no contexto. – Christian Feuersänger 25/12/14 às 17:34
... talvez uma resposta à minha pergunta possa ser uma espécie de mudança "se eu sou contexto, se eu sou lualatex ..."
Se o arquivo não for encontrado após --generate, talvez ele esteja localizado na árvore errada? Os módulos do Garden geralmente residem nos módulos texmf, coisas que você instala manualmente vão para texmf-local. Isso presumindo que você esteja usando os Mínimos, é claro. Existem certas convenções relativas à localização dos arquivos. A maioria dos arquivos de módulos de terceiros pertencem a tex/context/third/${MODULE}/, scripts que deveriam ser chamados de mtxrun em ./scripts/context/lua/third/${MODULE}, mas eu não acho que essa convenção é aplicada ao fazer pesquisas de arquivos. – Philipp Gesang 27 de dezembro de 2014 às 11h36
Aqui está uma sugestão para depurar a pesquisa de caminho: Primeiro determine onde o Context armazena as informações do arquivo. Geralmente este é um diretório chamado luatex-cache/context sob a raiz texmf-cache ou texmf-var. Em seguida, crie um arquivo fictício com um nome exclusivo em algum lugar sob seu arquivo texmf-local/. Agora execute mtxrun --generate e grep o luatex-cache recursivamente para o nome do arquivo fictício. Se o arquivo for encontrado ele aparecerá em uma descrição do conteúdo da árvore (luatex-cache/context//trees/.lua). Caso contrário, o local não será atravessado pelo Contexto. – Philipp Gesang 27 de dezembro de 2014 às 11h44
Por falar nisso. um dos meus pacotes funciona em Context, Plain e Latex: bitbucket.org/phg/enigma/src - acabei de verificar que colocar os arquivos nas respectivas árvores sob o texmf-local funciona perfeitamente. – Philipp Gesang 27 de dezembro de 2014 às 11h55
@phg obrigado pela sua paciência e tempo! Isso resolveu! Coloquei o arquivo em /home/ludewich/tl2014/texmf-dist/tex/generic/pgf/math/foo/bar, executei mtxrun --generate e ele foi indexado corretamente e minha execução mínima. Achei que tinha feito o mesmo depois do seu primeiro comentário, mas talvez tenha cometido algum erro? Se você escrever sua dica sobre mtxrun em uma resposta, terei prazer em aceitá-la. – Christian Feuersänger 27 de dezembro de 2014 às 14h10