我对 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 一部分的静态链接库(如LPEG
和slnunicode
,即无需访问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 运行中调用脚本时脚本的解释方式。