Construyendo una lista de tokens en lua

Construyendo una lista de tokens en lua

En TeX, se inserta un nodo de 'escritura' con, por ejemplo:

\write1{\string\doit{\the\lastypos}}

Con luatex puro, se podría crear un nodo con:

local n = node.new(8, 1)
n.stream = 1
n.data = <token-list>

Según el manual, <token-list>hay una tabla que representa la lista de tokens que se escribirá (con una lista de tripletes). No pude encontrar ninguna documentación sobre cómo se construye esta lista. Descubrí que se acepta una cadena, pero se convierte en una lista de caracteres encadenados (muy parecido a \meaning), por lo que \the\lastyposse escribe palabra por palabra, no se evalúa.

Encontré una solución alternativa, que se muestra en el siguiente código:

\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

}

Defino un cuadro con a \writey luego inspecciono el nodo. En el código real, en lugar de imprimirlo, lo paso n.datay las primitivas funcionan como se esperaba (con algunos problemas en las macros definidas por el usuario).

Mi pregunta es: ¿cómo generar en lua la lista de tokens para alimentar el datacampo? [Editar. Por favor, tenga en cuenta que mis preguntas no se refieren a \lastypos, sino a la creación de una lista de tokens arbitraria para el datacampo. Recuerde también que, debido a la naturaleza asincrónica de TeX, los números de página y similares no se conocen cuando se crea el nodo de 'escritura', sólo cuando la 'escritura' realmente se genera.]

Aquí hay un archivo latex para hacer algunos experimentos, con un archivo lua llamado extra.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}

El archivo 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

Respuesta1

LuaTeX tiene la token.createfunción de crear un valor de usuario simbólico. Se pueden combinar en una lista de tokens colocándolos en una tabla. Para \string\donothing{\the\lastvpos}esto sería:

tl = {
  token.create'string',
  token.create'donothing',
  token.create(string.byte'{'),
    token.create'the',
    token.create'lastypos',
  token.create(string.byte'}')
}

Normalmente las referencias a listas de tokens en la documentación de LuaTeX se refieren a este tipo de tabla, pero necesitas un tipo diferente: una tabla de tablas de números. Encontrar estos números no es fácil, pero puedes convertir listas de tokens en el formato anterior a este otro formato (aquí estoy usando un pequeño truco: {0, v.tok}se interpreta de la misma manera que si nos hubiéramos dividido v.tokcorrectamente en tres partes):

\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

da como resultado la salida

\donothing{0}
\donothing{0}

información relacionada