考虑以下 MWE。如果我将一些 TeX 代码传递给 Lua(通过\directlua
),而 Lua 尝试将其传回 TeX(通过tex.sprint
),则会出现以下问题。
下面的代码打印
text is \newcommand {\foo }{##1} \foo end
正如你所见,#
双精度浮点数曾经被传递给Lua,这当然会破坏宏\foo
。
有必要将text
参数包装在\detokenize
或类似的东西中,以便在传递给 Lua 之前阻止 TeX 对其进行扩展,但和都\detokenize
存在\unexpanded
这个问题。
这个问题:宏字符#
在形成字母时会加倍吗?可能是同样的现象。如何精确扩展一次带有参数的宏。
非常感谢您提出解决此问题的建议。我显然更喜欢一种方法,即将传递给luafun
内部的参数包装\NewDocumentCommand
在某个东西中,而不是#
在文本中每次出现时添加额外的特殊代码。
在此背景下,其他特殊 TeX 字符是否还隐藏着其他令人不快的意外?如果是,请立即警告我。
\documentclass[12pt]{article}
\usepackage{xparse}
\usepackage{filecontents}
\begin{filecontents*}{fn.lua}
function luafun (text)
texio.write_nl(string.format([[text is %s end]], text))
tex.sprint(text)
end
\end{filecontents*}
\directlua{local scratch = require "fn.lua"}
\NewDocumentCommand{\luafun}{+m}
{
\directlua{luafun([[\detokenize{#1}]])}
%\directlua{luafun([[\unexpanded{#1}]])}
}
\begin{document}
\luafun
{
\newcommand{\foo}[1]{#1}
%\foo{foo}
}
\end{document}
答案1
您需要\unexpanded
在这里,因为它的行为类似于 toks。您还需要正确转义标记,因此[[ .. ]]
不起作用。请尝试
\NewDocumentCommand{\luafun}{+m}
{%
\directlua{luafun("\luaescapestring{\unexpanded{#1}}")}%
}