我想解析包含我的简历数据的 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-yaml
。dpkg --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
我终于设法让它工作了。我需要三个组件:
\usepackage{luacode}
。我已经有这个了。\usepackage{luapackageloader}
(感谢@likethevegetable 的建议)来自加拿大运输安全局:“此包允许 LuaTeX 从默认的 package.path 和 package.cpath 位置加载包。这对于加载外部 Lua 模块(包括通过 LuaRocks 安装的模块)很有用”。- 指定路径在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*}