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被替换,因此当您require从 TeX 中获取模块时,Luatex 使用 TeX 的搜索机制,而不是通常的搜索机制。这意味着在实践中,当您在 Luatex 中运行 Lua 时,它不会找到您的正常系统 Lua 找到的模块。(我对架构了解不多,但我认为这是经过深思熟虑的,因为它希望能够安全地维护不同的并行结构,并确保 LuaTeX 始终会选择适合 TeX 的模块,即使其他模块安装在其他地方。)

实际上,这意味着如果您通过 luarocks 安装了 lua 模块,则需要在kpathsea可以找到的目录中放置副本或包含符号链接。据我所知,Luarocks 是一个相当简单的东西,它只是将文件转储到方便的目录中,因此您应该能够找到它们并链接到它们或复制它们。文档相当巧妙地警告“当然,编写替代加载器并在宏包中使用它没什么大不了的”,但对于我们中的某些人(比如我!)来说,这可能是一件大事。

如果您使用的 lua 模块不是纯 Lua,而是依赖于从 C 编译的代码,我不知道这会如何发挥作用。Luatex 本身已经链接了一些这样的库(例如slnunicode),但我不知道这会如何影响您的用例。我希望它“正常工作”,但是...

当你构建某些东西并想同时作为独立的东西和与 TeX 绑定的东西进行测试时,我通过反复试验发现:

  • 如果您需要(正如您所想象的)仅在一个环境或另一个环境中执行的代码,请测试lua.version在 Luatex 中运行时将定义哪个代码。我认为严格来说,仅检查 lua 就足够了(检查lua.version并不安全,因为如果lua未定义,则会出错)。

    if lua and lua.version then
     -- we're in LuaTeX
    else
     -- we're not
    end
    
  • 并行开发的一种方法是使用texlua作为你的 lua 解释器。如果你这样做,你将要自动访问始终是 luatex 一部分的静态链接库(如LPEGslnunicode,即无需访问require它们)。并且您的脚本将或多或少“像”通过 TeX 文档的调用运行一样运行。但有一个问题。Texlua 不会自动“找到”该kpathsea函数,因此您需要“告诉”它要做什么:

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

    现在,例如

    local xml = require("luaxml-domobject")
    

    将在 TeX 目录树中找到相应的模块,使用kpsewhich:如果没有这个魔法,你会得到来自package.loader:如果没有这个魔法,您将收到关于找不到模块的A具有该名称的模块,但不是 Luatex“真正”负责时您将获得的模块。

下面的代码可能比解释更容易理解!如果你用它运行,texlua你将得到一个输出;如果用它运行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")

我不知道,因为我还没有真正探索过,是否需要小心地从将kpathsea直接从 TeX 文档调用的文件中删除设置,因为该设置已经设置好了。但对于开发目的,此设置(如果需要)使您能够相当接近从 TeX 运行中调用脚本时脚本的解释方式。

相关内容