在 TeX 中,插入一个“写入”节点,例如:
\write1{\string\doit{\the\lastypos}}
使用纯 luatex,可以使用以下命令创建节点:
local n = node.new(8, 1)
n.stream = 1
n.data = <token-list>
根据手册,这<token-list>
是一个表示要写入的标记列表的表(带有三元组列表)。我找不到有关如何构建此列表的任何文档。我发现可以接受字符串,但它会转换为字符串化的字符列表(非常类似于 \meaning),因此\the\lastypos
是逐字写入的,而不是求值。
我找到了一种解决方法,如下面的代码所示:
\setbox0\hbox{\write1{\the\lastxpos}}
\directlua{
for _,d in ipairs(tex.box[0].head.data) do
texio.write(' ** ' .. d[1] .. '/' .. d[2] .. '/' .. d[3])
end
}
我用 定义一个框,\write
然后检查节点。在实际代码中,我没有打印它,而是将它传递给n.data
,并且基元按预期工作(在用户定义的宏中存在一些问题)。
我的问题是:如何在 lua 中生成令牌列表来提供给该data
字段?[编辑。请注意,我的问题不是关于\lastypos
,而是关于为该字段构建任意标记列表data
。还请记住,由于 TeX 的异步特性,页码等在创建“写入”节点时是未知的,只有在实际输出“写入”时才知道。]
下面是一个用于进行一些实验的 latex 文件,其中有一个名为 extra.lua 的 lua 文件:
\documentclass{article}
\def\donothing#1{}
\directlua{
require'extra'
}
\setbox0\hbox{\write1{\string\donothing{\the\lastypos}}}
\begin{document}
\directlua{
for _,d in ipairs(tex.box[0].head.data) do
texio.write(' +++ ' .. d[1] .. '/' .. d[2] .. '/' .. d[3])
end
}
\copy0
\copy0
\copy0
\end{document}
lua文件:
local n = node.new(8, 1)
n.stream = 1
n.data = 'abcd#&\\the\\lastxpos'
for _,d in ipairs(n.data) do
texio.write(' *** ' .. d[1] .. '/' .. d[2] .. '/' .. d[3])
end
答案1
LuaTeX 具有token.create
创建 token uservalue 的功能。它们可以放入表中,组合成 token 列表。例如\string\donothing{\the\lastvpos}
:
tl = {
token.create'string',
token.create'donothing',
token.create(string.byte'{'),
token.create'the',
token.create'lastypos',
token.create(string.byte'}')
}
通常,LuaTeX 文档中对标记列表的引用指的是这种类型的表,但您需要另一种类型:数字表的表。找到这些数字并不容易,但您可以将上述格式的标记列表转换为另一种格式(这里我使用了一个小技巧:{0, v.tok}
以与我们正确分成三个部分相同的方式解释v.tok
):
\directlua{
local function convert_tl(list)
local new = {}
for i,v in ipairs(list) do
new[i] = {0, v.tok}
end
return new
end
local n = node.new(8, 1)
n.stream = 3
n.data = convert_tl{
token.create'string',
token.create'donothing',
token.create(string.byte'{'),
token.create'the',
token.create'lastypos',
token.create(string.byte'}')
}
tex.box[0] = node.hpack(n)
}
\copy0
\copy0
输出结果
\donothing{0}
\donothing{0}