如何获取页面上出现的列表的最后一项的编号?

如何获取页面上出现的列表的最后一项的编号?

我在枚举环境中有一个长列表。我想将出现在该列表上的最后一项的编号作为页眉添加到页面中(或者无论如何将其保存在变量中以供其他地方使用)。

我想要做的一个最小示例是在 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}

相关内容