我的目录如下所示:
main.so
mainlua.lua
maintex.tex
其中main.so
是一个用 C++ 编写的模块。
mainlua.lua
包含以下代码:
package.cpath = package.cpath .. ";./?.so;"
local math = require "main"
int, res = math.integral("-1/2*x^2+x+4", -2, 4)
print(int)
print(res)
并执行
lua mainlua.lua
正确打印两个变量。
maintex.tex
另一方面包含几乎相同的代码,即
\documentclass{article}
\usepackage{luacode}
\begin{document}
\begin{luacode}
package.cpath = package.cpath .. ";./?.so;"
local math = require "main"
int, res = math.integral("-1/2*x^2+x+4", -2, 4)
\end{luacode}
The integral $\directlua{tex.print(int)}$ is equal to $\directlua{tex.print(res)}$.
\end{document}
然而,如果我尝试执行
lualatex maintex.tex --shell-escape
我收到以下错误:
This is LuaHBTeX, Version 1.12.0 (TeX Live 2020/Debian)
restricted system commands enabled.
(./maintex.tex
LaTeX2e <2020-10-01> patch level 4
L3 programming layer <2021-01-09> xparse <2020-03-03>
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/lualatex/luacode/luacode.sty
(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifluatex.sty
(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty))
(/usr/share/texlive/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
(/usr/share/texlive/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)))
(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-luatex.def)
(./maintex.aux) (/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd)[\direc
tlua]:2: module 'main' not found:
no field package.preload['main']
[kpse lua searcher] file not found: 'main'
stack traceback:
[C]: in function 'require'
[\directlua]:2: in main chunk.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }
l.12 \end{luacode}
?
我正在使用Ubuntu 21.04
来自以及。LuaLaTeX 1.12.0
TeX Live 2020
Lua 5.3.3
我做错了什么?我该如何解决这个问题?
文件.so
本身似乎不是问题,因为使用独立版本时lua
它可以工作,但使用时不行lualatex
。所以我认为这一定是路径的问题,但我不知道该改什么。
任何帮助都将受到热烈欢迎。
答案1
首先要说明的是:您设置package.cpath
的是在独立 Lua 中需要的,但在 LuaTeX 中会被忽略,因为这些模块是使用 TeX Live 的 kpathsea 而不是 Lua 的常规package.path/cpath
系统找到的。但这不会导致您的问题,因为 kpathsea 默认在当前目录中查找,因此路径已经正确设置。
那么让我们来谈谈真正的问题:您必须使用该-shell-escape
选项调用 LuaLaTeX,否则出于安全原因无法加载以本机代码编写的模块。(如果没有,-shell-escape
您将无法运行任意程序,如果您仍然可以加载不受限制的本机代码,那么这将是完全没有意义的)