我正在尝试使用 LuaLatex 将内容写入\foo
文件。请考虑以下示例:
\newcommand{\abcd}{test}
\newcommand{\foo}{XXX \abcd}
\directlua{
local f = {}
f.foo = token.get_macro 'foo'
(...)
稍后将的内容写入f.foo
文件时,内容将包含字符串XXX \\abcd
。如果我们将其更改为以下内容:
f.foo = "\luaescapestring{\foo}"
结果将是预期的XXX test
。
当命令\foo
包含“特殊”命令(如)时~
,结果将为XXX \\protect \\unhbox \\voidb@x \\penalty \\@M \\ {} test
。这虽然不好看,但可以解析/可行。但是,当使用\\
或等命令时\xspace
,编译将失败,例如:
! Undefined control sequence.
\GenericError ...
#4 \errhelp \@err@ ...
l.180 }
错误消息似乎根据所使用的命令而不同。
有没有办法扩展命令\foo
,使得执行递归扩展并且保护/转义任意特殊命令,或者至少编译不会中断?
编辑1
文件main.tex
:
\documentclass[british]{report}
\usepackage{luacode}
\begin{document}
Test text
\newcommand{\abcd}{test}
\newcommand{\foo}{XXX \\ \abcd}
\directlua{
local f = {}
f.foo = "\luaescapestring{\foo}"
local fd = io.open("test.out", "a")
fd:write(f.foo)
fd:flush()
fd:close()
}
\end{document}
编译为latexmk -pdf -pdflatex="lualatex" main.tex
上面会引发错误,但是可以正常工作\newcommand{\foo}{XXX \abcd}
。
答案1
为了使“脆弱的命令在移动参数中安全”,LaTex 设置\protect
为合适的值,这里的扩展发生在传递给 Lua 时,但其他方面与 TeX 中发生的扩展类似,\write
\string
这里是一个合适的值,所以
\documentclass[british]{report}
\begin{document}
Test text
\newcommand{\abcd}{test}
\newcommand{\foo}{XXX \\ \abcd}
{\let\protect\string
\directlua{
local f = {}
f.foo = "\luaescapestring{\foo}"
local fd = io.open("test.out", "a")
fd:write(f.foo)
fd:flush()
fd:close()
}}
\end{document}
写入内容文件
XXX \\ test