我有一份用 LuaLaTeX 编写的多语言简历。为了在不同语言之间切换,我使用了两个通过以下 TeX 命令调用的 Lua 函数:
\directlua{code = require("code")}
\newcommand{\lc}[1]{\directlua{code.sel_lang(#1)}}
\newcommand{\setlang}{\directlua{code.set_lang()}}
\begin{document}
\setlang{}
\lc{{
eng="Ravenna, Italy",
ita="Ravenna, Italia",
swe="Ravenna, Italien"
}}
\lc{{
eng="B.Sc.\\ in Computer Science",
ita="Laurea triennale in Scienze Informatiche",
swe="Kandidatexamen i datavetenskap"
}}
Lua代码如下:
-- Language Table
local languages = {}
languages["eng"] = "english"
languages["ita"] = "italian"
languages["swe"] = "swedish"
-- Main Language
local main_language = "english"
-- Language defined in the jobname cmd parameter
local cmd_language = string.sub(tex.jobname, -3)
texio.write_nl("Command line language: "..cmd_language)
local language = languages[cmd_language]
-- Set language for TeX directives
function set_document_language()
texio.write_nl("Setting babel language")
tex.sprint("\\selectlanguage{"..language.."}")
end
-- Print text in the desired language
function select_language(langmap)
if (langmap[cmd_language] == nil) then
tex.sprint("!! Missing Text !!")
end
tex.sprint(langmap[cmd_language])
end
return { sel_lang = select_language, set_lang = set_document_language }
这曾经与旧版本的 LuaLaTeX 一起工作,但现在\\
B.Sc. 后面的“ ”会触发以下错误:
[\directlua]:1: invalid escape sequence near '"B.Sc.\A'.
\lc #1->\directlua {code.sel_lang(#1)}
尝试修复错误
为了修复该错误,我尝试向 Lua 函数传递一个转义字符串:
\newcommand{\lc}[1]{\directlua{code.sel_lang("\luaescapestring{\unexpanded{#1}}")}}
我对Lua函数进行了如下修改:
-- Print text in the desired language
function select_language(langmap)
texio.write_nl("String received:" ..langmap) --debug
string = load("return "..langmap)()
if (langmap[cmd_language] == nil) then
tex.sprint("!! Missing Text !!")
end
tex.sprint(langmap[cmd_language])
end
但现在我收到了如下错误:
String received:{ eng="ABOUT ME", ita="PRESENTAZIONE", swe="OM MIG" }...exmf-dist/tex/luatex/luaotfload/luaotfload-auxiliary.lua:970: attempt to call a nil value (field 'lower').
Lua 试图调用表结构上不存在的函数。
您能告诉我该如何进行/尝试什么吗?
我希望这个问题是可以理解的,对于任何错误和不清楚的解释我深表歉意,我既不是 Tex 也不是 Lua 的专家。
非常感谢!
答案1
这lua代码该软件包最出名的可能是提供luacode
和luacode*
环境。然而,这并不是该软件包所能提供的全部。特别是,它还提供了三个 LaTeX 宏,用于将字符串变量从 TeX 传递到 Lua。它们是
\luastring
——充分阐述其论点\luastringN
- 做不是扩展其论点\luastringO
-- 准确扩展其论点一次
重要的是,这些宏的参数始终被视为字符串。例如,\luastring{1}
作为1
细绳而不是作为整数到 Lua。
使用\luastringN
,你可以简化
\newcommand{\lc}[1]{\directlua{code.sel_lang("\luaescapestring{\unexpanded{#1}}")}
到
\newcommand{\lc}[1]{\directlua{code.sel_lang(\luastringN{#1})}}