我在枚举环境中有一个长列表。我想将出现在该列表上的最后一项的编号作为页眉添加到页面中(或者无论如何将其保存在变量中以供其他地方使用)。
我想要做的一个最小示例是在 luatex 中的以下代码中(其中我对 lua 的唯一用途是拥有 120 个连续的项目来获得我想要的东西)。
\documentclass{article}
\usepackage[absolute]{textpos}
\let\mycounter=0
\AddToHook{shipout/before}{
\begin{textblock}{40}(0,0)
Last entry: \mycounter
\end{textblock}}
\AddToHook{cmd/item/before}{\let\beginitmpage=\thepage}
\AddToHook{cmd/item/after}{\let\enditmpage=\thepage \ifnum \thepage=\beginitmpage \let\mycounter=\theenumi\fi}
\begin{document}
\begin{enumerate}
\directlua{
for i=1,120,1 do
tex.print("\\item Dummy text from page \\beginitmpage\\ to page \\enditmpage")
end}
\end{enumerate}
\end{document}
可以看出,在第一页的末尾,计数器已经是 32(但打印的最后一行是 28)。条目 29-32“相信”在第 1 页,即使它们是在第 2 页格式化的。
我知道 tex 已经处理了第二页上要显示的部分文本,这是正常的,但这正是我想避免的。其余页面也出现了类似的问题。
有没有什么简单的方法可以以“简单”的方式实现我想要得到的东西?(即不是获取shipout时的计数器值,而是获取用于构建页面的计数器的值)。
答案1
按照@John的建议,经过一番调试,我终于得到了满意的结果。这是代码(在每页上打印列表的第一个和最后一个条目的编号)。
\documentclass{article}
\usepackage{luacode}
\usepackage[absolute]{textpos}
\usepackage{lipsum}
\def\lastcounter{\relax}
\def\firstcounter{\relax}
% ref_page from https://tex.stackexchange.com/questions/659916/get-page-number-of-label-in-lualatex
\begin{luacode*}
function ref_page(l)
local r = token.get_macro('r@'..l)
if r == nil then
return 0
end
local sec, page = r:match("{([^}]*)}{([^}]*)}")
return page
end
toSwap=0
function process()
currPage=tonumber(tex.count['c@page'])
if toSwap==1 and Bpage==currPage then
tex.sprint('\\global\\def\\firstcounter{'..nextval..'}')
toSwap=0
end
enumi=tonumber(tex.count['c@enumi'])
Apage=tonumber(ref_page('Q'..tostring(enumi-1)))
Bpage=tonumber(ref_page('Q'..tostring(enumi)))
if (Apage<Bpage and toSwap==0) then
nextval=enumi
toSwap=1
print("S")
end
if (Apage<=Bpage and Bpage==currPage) then
tex.sprint('\\global\\def\\lastcounter{'..(enumi)..'}')
end
print("ref #="..enumi.." on page "..Apage.."/"..Bpage.." cpage="..currPage)
end
\end{luacode*}
\AddToHook{shipout/before}{
\begin{textblock}{40}(0,0)
{\rm First entry: \firstcounter} \\
{\rm Last entry: \lastcounter}
\end{textblock}
}
\AddToHook{cmd/item/after}{\expandafter\label{Q\theenumi}\directlua{process()}}
%%% SAMPLE TEXT
\begin{document}
\begin{enumerate}
\directlua{
for i=1,120,1 do
tex.print("\\item {\\bf Dummy text on page \\pageref{Q"..(i).."} } \\lipsum[2]" )
end}
\end{enumerate}
\end{document}