是否可以在 Lua 中将“标签”附加到令牌对象?

是否可以在 Lua 中将“标签”附加到令牌对象?

在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

可以看到,中的ab对象分别f是两个\atoken,然后展开为→ 。这里我想“区分”这两个,即判断宏是否真的交换了两个参数。\swap \a1 \a2\g \a2 \a1\a\swap

当然,这并非 100% 万无一失(例如,如果 TeX 宏 do\cs_to_str:N后跟\use:c,则标签可能会丢失),但对于这个简单的用例,有什么解决方案吗(除了在 Lua 内部重新实现 TeX 的令牌抓取机制/输入流)?(我尝试跟踪该.id值,但它会发生变化。)

背景:用例,我正在实现某种输出 TeX 的编译器,我想将标签数据保留为附加到每个标记的行号,并且我想允许用户定义操作代码本身的宏;但我不知道在这种情况下如何跟踪行号

相关内容