如何实现 token.get_char

如何实现 token.get_char

token.set_char但没有token.get_char。从

\chardef\MyNumber=1

我可以用

\directlua{
  token.set_char('MyNumber', 421)
}

并在 TeX 端检索值

\the\MyNumber

但是如何在lua端检索该值?

我想到了一个解决方案,但它并不令人满意:使用tex.runtoks,lua 可以要求 tex 将 MyNumber 复制到专用计数寄存器,然后使用 检索该值tex.count

答案1

最快的方法是使用以下方法从 token 中提取值.index

\directlua{
  local char_given = token.command_id'char_given'
  local function get_char(name)
    local tok = token.create(name)
    if not (tok.command == char_given) then
      error'Not a chardef'
    end
    return tok.index
  end
  token.set_char('MyNumber', 421)
  local restored = get_char'MyNumber'
}
\bye

但是如果您希望它更加通用,并且例如接受计数寄存器,您还可以将标记添加到输入流,然后将其作为数字进行扫描:

  local function get_char(name)
    token.put_next(token.create(name))
    return token.scan_int()
  end
  token.set_char('MyNumber', 421)
  local restored = get_char'MyNumber'
}
\bye

答案2

如果你正在使用\directlua(即没有外部.lua文件),那么你可以通过在 Lua 代码内部扩展它来将值从 TeX 世界转移到 Lua 世界,因为\directlua在读取 Lua 代码之前会扩展它的参数。例如

\directlua{... ... myvariable = \the\MyNumber ... ...}

相关内容