lualatex と mongo に関する問題

lualatex と mongo に関する問題

lualatexと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}

私の 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

そして問題

 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 }

尊重する

答え1

私は Luatex を少しだけ使っているというわけではなく、Lua に精通しているわけでもありません。私よりも知識のある方々が私の失敗を許してくれることを望みますが、少なくとも私の経験を報告することはできます。

Luatex内ではpackage.searchers置換されるため、requireTeXからモジュールを読み込む場合、Luatexは通常の検索メカニズムではなくTeXの検索メカニズムを使用します。つまり、実際にはLuatex内からLuaを実行すると、通常のシステムLuaが見つけるモジュールが見つからないことになります。(アーキテクチャについてはよく知りませんが、仮定するこれは意図的なものであり、異なる並列構造を安全に維持し、他のモジュールが他の場所にインストールされている場合でも、LuaTeX が常に TeX に適したモジュールを選択するようにするためです。

実際には、luarocks 経由で lua モジュールをインストールした場合、検索するディレクトリ内にコピーを配置するか、シンボリック リンクを含める必要がありますkpathsea。私の知る限り、luarocks は非常に単純なもので、ファイルを便利なディレクトリにダンプするだけなので、それらを見つけてリンクしたりコピーしたりできるはずです。ドキュメントには、「もちろん、代替ローダーを書いてマクロ パッケージで使用するのは大したことではありません」とかなりかわいらしく警告されていますが、一部の人にとって (私のように!)、それはかなり大きな問題になるかもしれません。

純粋な Lua ではなく、C からコンパイルされたコードに依存している lua モジュールを使用している場合、これがどのように機能するかについては経験がありません。Luatex 自体はすでにそのようなライブラリ (などslnunicode) をいくつかリンクしていますが、残念ながら、それが使用ケースにどのような影響を与えるかはわかりません。「そのまま動作する」ことを願っていますが...

スタンドアロンとして、また TeX に結び付けられるものとしてテストしたいものを構築する場合、試行錯誤して次のことがわかりました。

  • ある環境または別の環境にある場合にのみ実行されるコードが必要な場合 (おそらく必要になると思いますが)、lua.versionLuatex で実行している場合に定義される定義をテストします。厳密に言えば、lua のチェックだけで十分だと思います (が未定義の場合はエラーになるため、 のチェックはlua.version安全ではありませんlua)。

    if lua and lua.version then
     -- we're in LuaTeX
    else
     -- we're not
    end
    
  • 並行して開発する方法の1つは、luaインタープリターとして使用することですtexlua。そうすると、意思常に luatex の一部である静的にリンクされたライブラリに自動的にアクセスします ( や のようにLPEGslnunicodeつまりrequireそれらを必要としません)。そして、スクリプトは多かれ少なかれ「あたかも」TeX ドキュメントからの呼び出しを介して実行されているかのように実行されます。しかし、落とし穴があります。Texlua は関数を自動的に「見つける」わけではないのでkpathsea、何をすべきかを「伝える」必要があります。

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

    さて、例えば

    local xml = require("luaxml-domobject")
    

    :を使用すると、TeXディレクトリツリーから適切なモジュールが見つかりますkpsewhich。この魔法がなければ、モジュールが見つからないという悲惨な苦情が寄せられるでしょうpackage.loader。あるいは、もっとひどいことに、1つのその名前のモジュールですが、Luatex が「実際に」制御しているときに取得するモジュールではありません。

以下のコードは説明よりもわかりやすいかもしれません。 で実行すると、texlua1 つの出力が得られます。で実行するとlua、出力が少し異なりますが、どちらの場合でも機能します。

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

実際に調査していないのでわからないのは、kpathseaTeX ドキュメントから直接呼び出されるファイルから設定を削除する際に、設定がすでに設定されているかどうかです。しかし、開発目的でこの設定が必要な場合、スクリプトが TeX 実行内から呼び出されたときにスクリプトが解釈される方法にかなり近づくことができます。

関連情報