在 lualatex 中获取 \label 的页码

在 lualatex 中获取 \label 的页码

我想使用 来获取 的整数值\pageref{...}lualatex但是,使用 时token.get_macro(s),我发现参数必须是没有参数的宏。也许\label{}在后台定义一些我可以直接访问的东西?

参见 MWE:

\documentclass{article}
\usepackage{luacode}

\begin{document}
\section{Hello}\label{one}
Should be 2: \pageref{two}

Should be 10:
\begin{luacode*}
  tex.print(tostring(5*tonumber(token.get_macro('pageref{two}'))))
\end{luacode*}

\pagebreak
\section{World}\label{two}
Should be 1: \pageref{one}

Should be 5:
\begin{luacode*}
  tex.print(tostring(5*tonumber(token.get_macro('pageref{one}'))))
\end{luacode*}

\end{document}

编辑:也许一个更好的一般问题是,我如何评估任意的 LaTeX 表达式(而不仅仅是 cs)并将其输出捕获为 Lua 变量?类似于(在 Lua 中):

page_number_of_label = tex.eval('\\pageref{two}')

答案1

知道稍后将通过 aux 文件在稍后的运行中\label{one}定义(感谢 egreg),我可以使用它来获取并使用字符串模式匹配来提取页面和章节编号。\r@onetoken.get_macro{'r@one'}{sec}{page}

编辑:更新函数,如果标签尚未定义(即第一次编译),则返回 0,并更新正则表达式以配合hyperref实现\r@

\documentclass{article}
\usepackage{hyperref}
\usepackage{luacode}

\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
\end{luacode*}

\begin{document}

\section{Hello}\label{one}

Should be 2: \pageref{two}

Should be 10:\luadirect{tex.print(tostring(tonumber(5*ref_page('two'))))}


\pagebreak


\section{World}\label{two}

Should be 1: \pageref{one}

Should be 5:\luadirect{tex.print(tostring(tonumber(5*ref_page('one'))))}

\end{document}

相关内容