为什么 luatex 不能识别手动安装的库 lyaml(而 lua 本身可以识别)?

为什么 luatex 不能识别手动安装的库 lyaml(而 lua 本身可以识别)?

我想解析包含我的简历数据的 yaml 文件,然后使用 LaTeX 以编程方式从该数据中编写内容。我已经安装了相关库lyaml,它可以运行,但lua(la?)tex无法检测到它。为什么不能,我该如何改变这种情况?

更多细节

如果这些能帮助任何人诊断我的问题......

下面的程序可以工作:

-- requirements
local io    = require "io"
local lyaml = require "lyaml"

-- get yaml data as a string
local yaml_file   = "cv.yaml"
local f           = assert(io.open(yaml_file, 'r'))
local yaml_string = f:read('a')
f:close()

local cv_table = {}

-- convert yaml string to lua table
cv_table.t = lyaml.load(yaml_string)

for key, value in pairs(cv_table.t) do
    print(key)  
end

它打开文件,将其内容读取为字符串,关闭文件,将字符串解析为 yaml,然后将生成的 lua 表的每个顶级键打印到 stdout。

我使用的是 Debian。具体来说,这个方法有效,因为我已经安装了lua-yamldpkg --listfiles lua-yaml它给了我以下信息:

/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/liblua5.1-yaml.so.0.0.0
/usr/lib/x86_64-linux-gnu/liblua5.2-yaml.so.0.0.0
/usr/lib/x86_64-linux-gnu/liblua5.3-yaml.so.0.0.0
/usr/lib/x86_64-linux-gnu/lua
/usr/lib/x86_64-linux-gnu/lua/5.1
/usr/lib/x86_64-linux-gnu/lua/5.2
/usr/lib/x86_64-linux-gnu/lua/5.3
/usr/share
/usr/share/doc
/usr/share/doc/lua-yaml
/usr/share/doc/lua-yaml/changelog.Debian.gz
/usr/share/doc/lua-yaml/changelog.gz
/usr/share/doc/lua-yaml/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/lua-yaml
/usr/share/lua
/usr/share/lua/5.1
/usr/share/lua/5.1/lyaml
/usr/share/lua/5.1/lyaml/explicit.lua
/usr/share/lua/5.1/lyaml/functional.lua
/usr/share/lua/5.1/lyaml/implicit.lua
/usr/share/lua/5.1/lyaml.lua
/usr/share/lua/5.2
/usr/share/lua/5.2/lyaml
/usr/share/lua/5.3
/usr/share/lua/5.3/lyaml
/usr/lib/x86_64-linux-gnu/liblua5.1-yaml.so.0
/usr/lib/x86_64-linux-gnu/liblua5.2-yaml.so.0
/usr/lib/x86_64-linux-gnu/liblua5.3-yaml.so.0
/usr/lib/x86_64-linux-gnu/lua/5.1/yaml.so
/usr/lib/x86_64-linux-gnu/lua/5.2/yaml.so
/usr/lib/x86_64-linux-gnu/lua/5.3/yaml.so
/usr/share/lua/5.2/lyaml/explicit.lua
/usr/share/lua/5.2/lyaml/functional.lua
/usr/share/lua/5.2/lyaml/implicit.lua
/usr/share/lua/5.2/lyaml.lua
/usr/share/lua/5.3/lyaml/explicit.lua
/usr/share/lua/5.3/lyaml/functional.lua
/usr/share/lua/5.3/lyaml/implicit.lua
/usr/share/lua/5.3/lyaml.lua``shell

然而,这确实不是甚至编译:

\documentclass{article} 

\usepackage{luacode}

\begin{document} 

\begin{luacode*}

    -- requirements
    local io    = require "io"
    local lyaml = require "lyaml"

    -- get yaml data as a string
    local yaml_file   = "cv.yaml"
    local f           = assert(io.open(yaml_file, 'r'))
    local yaml_string = f:read('a')
    f:close()

    local cv_table = {}

    -- convert yaml string to lua table
    cv_table.t = lyaml.load(yaml_string)

    for key, value in pairs(cv_table.t) do
        tex.print(key)  
    end

\end{luacode*}

\end{document}

tex 文件是只是lua 程序,用适当的 latex 包裹,并tex.print替换print。它位于同一目录中。

尝试编译lualatex test.tex会出现以下错误:

(/usr/local/texlive/2020/texmf-dist/tex/latex/base/ts1cmr.fd)...0/texmf-dist/te
x/luatex/lualibs/lualibs-basic-merged.lua:381: attempt to call a nil value (fie
ld 'cpath specification')
stack traceback:
        ...0/texmf-dist/tex/luatex/lualibs/lualibs-basic-merged.lua:381: in field '?'
        ...0/texmf-dist/tex/luatex/lualibs/lualibs-basic-merged.lua:403: in function <
...0/texmf-dist/tex/luatex/lualibs/lualibs-basic-merged.lua:395>
        [C]: in function 'require'
        [\directlua]:3: in main chunk.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }
                                                  
l.28 \end{luacode}

\directlua如果我使用或(未加星号的环境),也会发生同样的事情luacode。同样的错误,所以这不是问题。错误与lyaml库有关,当我将其从代码中删除时,错误就会消失(取而代之的是抱怨我引用了未导入的库的错误)。据我了解,\directlua无论如何,这些都是在后台使用的,因此它们都会遇到同样的问题。

所以问题出在lyaml库上。显然它安装得很好,那么为什么 lua(la?)tex 看不到它呢?

我尝试过的事情

我读过了这个问题。我使用的是 Debian,所以这些评论与我没有直接关系,但我受到启发,尝试了符号链接/usr/share/lua/5.3/lyaml.lua/usr/local/texlive/2020/texmf-dist/tex/luatex/lualibs/lualibs-lyaml.lua。这没有任何区别。然后我尝试了评论建议的操作并运行,sudo fmtutil-sys --byfmt=lualatex但也没有效果。

下列的这个问题我也尝试过将相关文件直接符号链接到工作目录,但这也没有帮助。

答案1

我终于设法让它工作了。我需要三个组件:

  1. \usepackage{luacode}。我已经有这个了。
  2. \usepackage{luapackageloader}(感谢@likethevegetable 的建议)来自加拿大运输安全局:“此包允许 LuaTeX 从默认的 package.path 和 package.cpath 位置加载包。这对于加载外部 Lua 模块(包括通过 LuaRocks 安装的模块)很有用”。
  3. 指定路径在lua中对我来说,在 Debian 上这是正确的,但当然其他人可能需要不同的路径:
\begin{luacode*}
    local my_path = "/usr/share/lua/5.3"
    local my_cpath ="/usr/lib/x86_64-linux-gnu/lua/5.3/"
    package.path  = package.path  .. string.format(";%s/?.lua;%s/?/init.lua", my_path, my_path)
    package.cpath = package.cpath .. string.format(";%s/?.so;%s/?/init.so", my_cpath, my_cpath)
\end{luacode*}

相关内容