Lualatex luaescapestring与变量扩展

Lualatex luaescapestring与变量扩展

我正在尝试使用 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

相关内容