![在 directua 中使用宏时出现问题](https://linux22.com/image/418606/%E5%9C%A8%20directua%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%AE%8F%E6%97%B6%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98.png)
我有以下外部 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
但我发现通常不使用它们并直接控制扩展更简单。