在lua中构建令牌列表

在lua中构建令牌列表

在 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}

相关内容