我想使用 来获取 的整数值\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@one
token.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}