problema en lualatex y mongo

problema en lualatex y mongo

Tengo un problema con lualatex y mongo.

% !config
% arara: lualatex :{shell : yes , synctex : yes}
% arara : tikzmake :{ jobs : 1, force : yes}
\documentclass[12pt,a4paper]{book}
\usepackage{Bibles}
\usepackage{lipsum}
%\usepackage[utf8x]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\author{PADDEU Dylan}
\title{bible accessibilité}
\usepackage{ifluatex}
\usepackage{luatexbase}
\usepackage{luacode}
\begin{document}
\maketitle
\begin{luacode*}
    dofile("bible.lua")
\end{luacode*}
\end{document}

mi código lua:

mongo = require('mongo')
client = mongo.Client('mongodb://127.0.0.1:27017')
ERP = client:getCollection('bible','Etablissement Recevant du Public (ERP)')
vote = client:getCollection('bible','bureau de vote')
enseignement = client:getCollection('bible',"etablissement enseignement")
logement = client:getCollection('bible','logement')
transport = client:getCollection('bible','transport')
voirie = client:getCollection('bible','voirie')
stationnement = client:getCollection('bible','carte de stationnement')
travail = client:getCollection('bible','lieux de travail')
CCIA  = client:getCollection('bible','commission communale et intercommunale accessibilite')
CCDSA = client:getCollection('bible','COMMISSION CONSULTATIVE DEPARTEMENTALE DE SECURITE ET D’ACCESSIBILITE')
formation_acces = client:getCollection('bible','formation accessibilite')
test1 = client:getCollection('bible','test')
function essais()
    local q = mongo.BSON{_id=9}
    local r = test1:findOne(q):value()
    print("nom du domaine",r.domaine)
end

y el problema

 module 'mongo' not found:
    no field package.preload['mongo']
    [kpse lua searcher] file not found: 'mongo'
    [kpse C searcher] file not found: 'mongo'
stack traceback:
    [C]: in function 'require'
    ./bible.lua:1: in main chunk
    [C]: in function 'require'
    [\directlua]:1: in main chunk.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }

respecto

Respuesta1

No puedo pretender ser más que un aficionado a Luatex, ni realmente una persona de Lua; Espero que aquellos con más conocimientos que yo perdonen mis errores, pero al menos puedo contar mi experiencia.

Dentro de Luatex, package.searchersse reemplaza, de modo que cuando ingresa requireun módulo de TeX, Luatex usa el mecanismo de búsqueda de TeX, no el habitual. En la práctica, eso significa que cuando ejecuta Lua desde Luatex, no encontrará módulos que encuentre su sistema normal Lua. (No sé lo suficiente sobre la arquitectura, peroasumires deliberado, porque quiere poder mantener de forma segura diferentes estructuras paralelas y asegurarse de que LuaTeX siempre elija módulos apropiados para TeX, incluso si otros módulos están instalados en otro lugar).

En la práctica, eso significa que si ha instalado un módulo lua a través de luarocks, necesitará colocar una copia o incluir un enlace simbólico dentro de un directorio que kpathseaencontrará. Luarocks es algo bastante simple, hasta donde yo sé, y simplemente descarga archivos en un directorio conveniente, por lo que debería poder encontrarlos y vincularlos o copiarlos. La documentación advierte de manera bastante linda: "Por supuesto, no es gran cosa escribir un cargador alternativo y usarlo en un paquete de macros", aunque para algunos de nosotros (¡como yo!) eso puede ser un gran problema.

No tengo experiencia de cómo funciona esto si estás usando un módulo lua que no es Lua puro pero que se basa en código compilado desde C. El propio Luatex ya vincula algunas de esas bibliotecas (como slnunicode), pero no tengo idea de cómo eso puede afectar tu Caso de uso, me temo. Espero que "simplemente funcione", pero...

Cuando estás creando algo que quieres probar de forma independiente y como algo vinculado a TeX, encontré por prueba y error:

  • Si necesita (como es posible) código que se ejecute solo si está en un entorno u otro, pruebe la definición que lua.versionse definirá si está ejecutando en Luatex. Supongo que, estrictamente hablando, basta con comprobar lua (y comprobar lua.versionno es seguro, porque si luano está definido se producirá un error).

    if lua and lua.version then
     -- we're in LuaTeX
    else
     -- we're not
    end
    
  • Una forma de desarrollarse en paralelo es utilizartexlua como intérprete de lua. Si haces eso, tuvoluntadobtenga acceso automáticamente a las bibliotecas vinculadas estáticamente que siempre forman parte de luatex (como LPEGy slnunicode, es decir, sin necesidad de requirehacerlo). Y su secuencia de comandos se ejecutará más o menos "como si" se estuviera ejecutando mediante una llamada desde un documento TeX. Pero hay un problema. Texlua no "encuentra" automáticamente la kpathseafunción, por lo que debe "decirle" qué hacer:

    kpse.set_program_name("kpsewhich") -- or whatever
    

    Ahora, por ejemplo

    local xml = require("luaxml-domobject")
    

    encontrará el módulo apropiado en el árbol del directorio TeX, usando kpsewhich: sin esa magia, recibirá las tristes quejas depackage.loader no encontrar el módulo. O, peor aún, obtendrásamódulo con ese nombre, pero no el que obtendrá cuando Luatex esté "realmente" a cargo.

¡El siguiente código puede ser más fácil de seguir que la explicación! Si lo ejecuta, texluaobtendrá un resultado; si con luauna salida ligeramente diferente, pero en ambos casos funciona.

local luatexing = lua and lua.version

-- local lpeg shadows global lpeg if luatex is running this
local lpeg = lpeg

if luatexing then
   kpse.set_program_name("kpsewhich")
else
   -- if luatex is not in charge we need to require the library
   lpeg = require("lpeg")
end

-- The output here will differ depending on
-- whether we have luatex (with statically
-- linked unicode library) or not. Of course,
-- we could then `require` something
-- appropriate.

if luatexing then
   io.write(unicode.utf8.lower("Ê") .. "\n")
else
   io.write(string.lower("Ê") .. "!\n")
end

-- But this will work in either case: with
-- luatex via the statically linked lpeg
-- library. With regular lua via the require

j = lpeg.P("a matcher")

io.write(j:match("a matcher") .. "\n")

Lo que no sé, porque realmente no lo he explorado, es si hay que tener cuidado al eliminar la kpathseaconfiguración de un archivo que se va a llamar directamente desde un documento TeX, donde ya estará configurada. Pero para fines de desarrollo, esta configuración, si es que se necesita alguna, le permite acercarse razonablemente a la forma en que se interpretará un script cuando se llame desde una ejecución de TeX.

información relacionada