将 LaTeX 块传递给 Lua

将 LaTeX 块传递给 Lua

我想使用 Lua 来处理 中的某些文本块。实际上,lualatex如果我直接传递也可以。hboxes

我尝试了以下操作。

\documentclass{article}
\usepackage{luacode}
\newcommand\mytest[1]{%
    \directlua{
      x=[[\luatexluaescapestring{#1}]]
      tex.print(x)
     }}
\begin{document}
\mytest{abc}
\mytest{ab\c{c}\i}
\end{document}

如果的参数\mytest是没有任何命令的字符串,则一切都会按预期工作;但是,如果包含任何宏,结果有时(几乎总是)是错误的;例如,请参见 \i扩展的方式(而如果我使用unicode无点i,则不会出现问题)。有没有一种规范的方法来继续并获得我需要的东西?

答案1

在此处输入图片描述

请注意,在最近的 latex 版本中,命令的自然名称不是\luaescapestring\luatexluaescapestring不想同时使用\luaescapestring[[ ]]字符串形式,而且您还想使用\unexpanded它来在传递给 lua 之前停止宏扩展。

请注意,您加载的 luacode 包有一个 luacode 环境来解决其中的一些问题,但在这里我只是使用\directlua您使用过的环境,而不是 luacode 包环境。

\documentclass{article}

\newcommand\mytest[1]{%
    \directlua{
      x='\luaescapestring{\unexpanded{#1}}'
      tex.sprint(x)
     }}
\begin{document}
\mytest{abc}
\mytest{ab\c{c}\i}
\end{document}

您没有说明想要对 Lua 中的文本执行什么操作,因为与“直接传递 hbox”相关,您可以从 Lua 内部看到任何盒子寄存器的内容。

下面,将访问 hbox 寄存器中的节点列表(但这里不会更改),并将 box\usebox调用打印出来。

\documentclass{article}


\newbox\mybox
\begin{document}

\sbox\mybox{this and that}
\directlua{
local b = tex.box['mybox']
print('BOX' .. node.type(b))
tex.sprint('\string\\usebox\string\\mybox')
}
\end{document}

答案2

由于您正在加载luacode包,因此您不妨使用该包的\luastringN宏,将其参数转换为 Lua 字符串没有进行扩展。

打字x=\luastringN{<some arg>}应该比 更容易输入,也更容易记住,x='\luaescapestring{\unexpanded{<some arg>}}'对吧?:-)

在此处输入图片描述

\documentclass{article}
\usepackage{luacode}
\newcommand\mytest[1]{%
    \directlua{x = \luastringN{#1}
               tex.sprint(x) }}
\begin{document}
\mytest{abc}
\mytest{ab\c{c}\i}
\end{document}

另外:该luacode包还提供了宏\luastring,它在将参数转换为 Lua 字符串之前对其进行完全扩展,以及\luastringO执行one 扩展步骤,在第一个标记上。)

相关内容