我正在尝试获取 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