在 TeX 和 Lua 之间交换字符串

在 TeX 和 Lua 之间交换字符串

我有一份用 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代码该软件包最出名的可能是提供luacodeluacode*环境。然而,这并不是该软件包所能提供的全部。特别是,它还提供了三个 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})}}

相关内容