在Lua中,一个token对象是用一个userdata
对象来表示的。
我希望能够将这些标记返回给 TeX,对它们进行一些操作,然后用 Lua 读回它们;但之后我需要知道哪个标记来自哪里。例如:
%! TEX program = lualatex
\documentclass[12pt]{article}
\usepackage[paper=a4paper,margin=0.6cm]{geometry}
\usepackage{luacode}
%\usepackage{prettytok} \prettyN {}
\begin{document}
\ExplSyntaxOn
\directlua{dofile "a.lua"}
\def\g{\directlua{g()}}
\def\swap #1 #2{\g #2 #1}
\use:n {
\directlua{f()} \a \a
}
\ExplSyntaxOff
\end{document}
Lua:
prettyprint=print
function f()
local a=token.get_next()
local b=token.get_next()
prettyprint(a, b)
prettyprint(a.tok, b.tok) -- same token, .tok is the same
prettyprint(a.id, b.id) -- but id is different
token.put_next({token.create("swap"), a, b})
--a._tag=123 -- error: attempt to index a luatex.token value
end
function g()
local a=token.get_next()
local b=token.get_next()
prettyprint(a, b)
prettyprint(a.tok, b.tok) -- same token, .tok is the same
prettyprint(a.id, b.id) -- unfortunately the id is different from the previous
end
可以看到,中的a
和b
对象分别f
是两个\a
token,然后展开为→ 。这里我想“区分”这两个,即判断宏是否真的交换了两个参数。\swap \a1 \a2
\g \a2 \a1
\a
\swap
当然,这并非 100% 万无一失(例如,如果 TeX 宏 do\cs_to_str:N
后跟\use:c
,则标签可能会丢失),但对于这个简单的用例,有什么解决方案吗(除了在 Lua 内部重新实现 TeX 的令牌抓取机制/输入流)?(我尝试跟踪该.id
值,但它会发生变化。)
背景:用例,我正在实现某种输出 TeX 的编译器,我想将标签数据保留为附加到每个标记的行号,并且我想允许用户定义操作代码本身的宏;但我不知道在这种情况下如何跟踪行号