我想使用 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 扩展步骤,在第一个标记上。)