将 TeX 代码传递给 Lua 并返回 TeX 时,# 符号会出现两倍

将 TeX 代码传递给 Lua 并返回 TeX 时,# 符号会出现两倍

考虑以下 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}}")}%
  }

相关内容