如何保存和恢复当前 tex 状态(寄存器)?

如何保存和恢复当前 tex 状态(寄存器)?

我正在尝试获取 tex 输出(将进行一些更改),因此我将所有内容放入一个框中并遍历节点。除了全局定义之外,一切都很好。第一次尝试是使用\globaldef此框来避免它们,但字体分配和其他一些命令存在问题。

现在我想保存 tex 寄存器(\count、\toks 等),并在框完成后恢复它们。但问题是我找不到这个寄存器是否是全局的。当然,仍然有评估的全局定义,但它们可能没有那么有害。

\documentclass{article}

\usepackage{luacode}
\begin{luacode*}
local tex_registers = {}
function savetexstate(totalcount, totaltoks, totaldimen)
    tex_registers = {[totalcount] = "count", [totaldimen] = "dimen",  [totaltoks] ="toks"}
    for total, value in pairs (tex_registers) do
        for i=0, total do
            -- it's not safe to take 10000 blindly but for now don't mind
            local idx = 10000 + i 
            if tex[value][i] then
                -- Globaly saving tex registers \count10001=\count1, \count10002=\coun2, ...
                if value == "toks" then
                    tex.sprint([[\global\]] .. value .. idx ..  "={" .. tex[value][i] .. [[}]])
                else
                    tex.sprint([[\global\]] .. value .. idx ..  [[=\the\]] .. value .. i)
                end
            end
        end
    end
end

function restoretexstate()
    for total, value in pairs (tex_registers) do
        for i=0, total do
            local idx = 10000 + i
            if tex[value][idx] then
                if value == "toks" then
                    -- Globaly restoring tex registers \count1=\count10001, \count2=\coun10002, ...
                    tex.sprint([[\global\]] .. value .. i ..  "={" .. tex[value][idx] .. [[}]])
                else
                    tex.sprint([[\global\]] .. value .. i ..  [[=\the\]] .. value .. idx)
                end
            end
        end
    end
end
\end{luacode*}


\makeatletter

\def\dosomething#1{%
  #1% HERE NORMAL LATEX OUTPUT
  \bgroup
    %% is there a better way to get total number of allocated registers?
    \globaldefs=-\@ne    % no global defs
    \newcount\tmpcount
    \edef\totalcountnum{\the\allocationnumber}%
    \newtoks\tmptoks
    \edef\totaltoksnum{\the\allocationnumber}%
    \newdimen\tmpdimen
    \edef\totaldimennum{\the\allocationnumber}%
    \globaldefs=\z@      % normal global defs
    \directlua{savetexstate(\totalcountnum, \totaltoksnum, \totaldimennum)}%
    \setbox0=\hbox{\vbox{#1}}%
    % <<< here lua code traveses box 0 >>>
    \directlua{restoretexstate()}%
  \egroup
  }

\makeatother

\begin{document}

\newtoks\fee 
\newtoks\foo 
\fee={\textbf{A}}
\foo={\textbf{1}}

{
  {
    \dosomething{
      TEXT 
      \global\fee=\expandafter{\the\fee B} 
      \foo=\expandafter{\the\foo 2} 
      \stepcounter{equation} 
      }
    \fee={C}
    \foo={3}
  }
}
\showthe\fee  % output \textbf{A}B (OK)
\showthe\foo  % output \textbf{1}2 (WRONG) should be \textbf{1} 
\makeatletter
\showthe\c@equation  % output 1 (OK)
\makeatother
\end{document}

问题在于restoretexstate()我在哪里全局分配备份寄存器:( tex.sprint([[\global不明白如何使用 tex.set 所以我使用 tex.sprint)如果我可以测试它是全局寄存器,那么我只能全局恢复它。

是否甚至可以保存 tex 当前状态?也许我在胡说八道?是否有其他方法可以扫描 tex 输出而不将其添加到框中?我无法输出该框,因为我更改了其中的某些内容。使用 LuaTeX,版本 beta-0.76.0-2013041409

相关内容