Problem mit Lualatex und Mongo

Problem mit Lualatex und Mongo

Ich habe ein Problem mit Lualatex und 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}

mein Lua-Code:

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

und das Problem

 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 }

betrachten

Antwort1

Ich kann nicht behaupten, mehr als ein Luatex-Dilettant zu sein, noch ein richtiger Lua-Mensch. Ich hoffe, dass die Leute, die sich besser auskennen als ich, mir meine Patzer verzeihen, aber ich kann zumindest von meinen Erfahrungen berichten.

Innerhalb von Luatex package.searcherswird ersetzt, so dass requireLuatex, wenn Sie ein Modul von TeX verwenden, den Suchmechanismus von TeX verwendet und nicht den üblichen. Das bedeutet in der Praxis, dass Lua, wenn Sie es innerhalb von Luatex ausführen, keine Module findet, die Ihr normales System Lua findet. (Ich weiß nicht genug über die Architektur, aber ichannehmenDies ist Absicht, da verschiedene parallele Strukturen sicher verwaltet werden sollen und sichergestellt werden soll, dass LuaTeX immer die für TeX geeigneten Module auswählt, auch wenn anderswo andere Module installiert sind.)

In der Praxis bedeutet das, dass Sie, wenn Sie ein Lua-Modul über Luarocks installiert haben, entweder eine Kopie erstellen oder einen symbolischen Link in ein Verzeichnis einfügen müssen, das kpathseagefunden wird. Luarocks ist, soweit ich das beurteilen kann, ein ziemlich einfaches Ding und legt Dateien einfach in einem geeigneten Verzeichnis ab, sodass Sie sie finden und darauf verlinken oder sie kopieren können sollten. Die Dokumentation warnt ziemlich niedlich: „Natürlich ist es keine große Sache, einen alternativen Loader zu schreiben und diesen in einem Makropaket zu verwenden“, obwohl das für einige von uns (wie mich!) eine ziemlich große Sache sein kann.

Ich habe keine Erfahrung damit, wie sich das auswirkt, wenn Sie ein Lua-Modul verwenden, das nicht reines Lua ist, sondern auf aus C kompiliertem Code basiert. Luatex selbst verknüpft bereits einige solcher Bibliotheken (wie slnunicode), aber ich habe leider keine Ahnung, wie sich das auf Ihren Anwendungsfall auswirken könnte. Ich würde hoffen, dass es „einfach funktioniert“, aber ...

Wenn Sie etwas erstellen, das Sie sowohl als eigenständiges Produkt als auch in Verbindung mit TeX testen möchten, habe ich durch Ausprobieren Folgendes herausgefunden:

  • Wenn Sie (was durchaus möglich ist) Code benötigen, der nur in der einen oder anderen Umgebung ausgeführt wird, prüfen Sie, welche Definition lua.versiondefiniert wird, wenn Sie in Luatex arbeiten. Ich nehme an, streng genommen reicht eine Prüfung auf Lua aus (und eine Prüfung auf lua.versionist nicht sicher, da luaes zu einem Fehler kommt, wenn es nicht definiert ist).

    if lua and lua.version then
     -- we're in LuaTeX
    else
     -- we're not
    end
    
  • Eine Möglichkeit der parallelen Entwicklung ist die Verwendungtexlua als Lua-Interpreter. Wenn Sie das tun,Willeerhalten Sie automatisch Zugriff auf die statisch verknüpften Bibliotheken, die immer Teil von luatex sind (wie LPEGund slnunicode, d. h. ohne dass requireSie sie benötigen). Und Ihr Skript wird mehr oder weniger ausgeführt, „als ob“ es über einen Aufruf aus einem TeX-Dokument ausgeführt würde. Aber es gibt einen Haken. Texlua „findet“ die kpathseaFunktion nicht automatisch, also müssen Sie ihm „sagen“, was es tun soll:

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

    Jetzt zum Beispiel

    local xml = require("luaxml-domobject")
    

    wird das entsprechende Modul im TeX-Verzeichnisbaum finden, indem Sie verwenden kpsewhich: Ohne diese Magie werden Sie die düsteren Beschwerden vonpackage.loader dass Sie das Modul nicht finden. Oder, schlimmer noch, Sie werdenAModul mit diesem Namen, aber nicht das, das Sie erhalten, wenn Luatex „wirklich“ das Sagen hat.

Der folgende Code ist möglicherweise leichter zu verstehen als die Erklärung! Wenn Sie ihn mit ausführen, texluaerhalten Sie eine Ausgabe; wenn mit luaeine leicht unterschiedliche Ausgabe, aber in beiden Fällen funktioniert es.

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")

Was ich nicht weiß (weil ich es nicht wirklich erforscht habe), ist, ob man vorsichtig sein muss, wenn man die kpathseaEinstellung aus einer Datei entfernt, die direkt aus einem TeX-Dokument aufgerufen wird, wo sie bereits festgelegt ist. Aber für Entwicklungszwecke ermöglicht Ihnen diese Einstellung, falls sie überhaupt erforderlich ist, eine relativ gute Annäherung an die Art und Weise, wie ein Skript interpretiert wird, wenn es aus einem TeX-Lauf aufgerufen wird.

verwandte Informationen