我有以下外部 lua 脚本:
-- file mylua.lua
function test(input)
tex.sprint(input)
end
以及以下lualatex文档:
\documentclass{article}
\usepackage{luacode}
\directlua{dofile("mylua.lua")}
\begin{document}
This works: \directlua{test("Hello world!")}
But this doesn't: \directlua{test("\textit{Hello world!}")}
\end{document}
这是一个简单的例子,说明了我在编写更复杂的代码时遇到的错误。我将我的 lua 代码移至外部文件,以避免转义字符的问题。但是,我不可避免地必须在调用中使用宏\directlua
,而大多数时候我无法控制宏是什么。
有没有什么办法可以避免这个问题?
答案1
您想要打印 Lua 字符串"\textit..."
但是\t
是一个制表符因此您需要"\\textit...."
在 Lua 中\directlua
扩展它的参数\edef
因此您需要停止\\
扩展:
\documentclass{article}
\usepackage{luacode}
\directlua{dofile("mylua.lua")}
\begin{document}
This works: \directlua{test("Hello world!")}
But this doesn't: \directlua{test("\string\\textit{Hello world!}")}
\end{document}
您还可以使用
\directlua{test("\luaescapestring{\detokenize{\textit{Hello world!}}}")}
如果您无法轻松控制内容,那么这可能会更好。
您已经加载(但未使用)了luacode
提供一些包装器的包,\directlua
但我发现通常不使用它们并直接控制扩展更简单。