如何将 \pageref{foo} 用作数字?

如何将 \pageref{foo} 用作数字?

我想要做的是在标题中显示一个“进度条”,以显示您在文档中的进度,方法是制定一条规则,将页码宽度除以总页数乘以纸张宽度。

这就是我所拥有的:

\usepackage{fancyhdr,lastpage}
\pagestyle{fancy}
\lhead{\rule{\value{page}/\value{\pageref{LastPage}}*120mm}{2mm}}

但显然它不起作用。

答案1

解决这类问题是存在的理由refcount。以下是使用它的一种方法:

\documentclass[oneside]{book}
\usepackage{lipsum,fancyhdr,lastpage,refcount}
\pagestyle{fancy}
\setrefcountdefault{-1}
\lhead{\rule{\dimexpr \textwidth * \thepage/\getpagerefnumber{LastPage}}{2mm}}
\begin{document}
\lipsum[1-60] %Insert dummy text for demonstration
\end{document}

答案2

如果页码不是数字,例如\pagenumbering{Roman},Lev 的代码将会中断。我会使用参考值包裹:

\documentclass[oneside]{book}
\usepackage{lipsum,fancyhdr}
\pagestyle{fancy}
\usepackage[lastpage]{zref}
\pagenumbering{Roman}
\makeatletter
\zref@newprop*{numpage}{\the\value{page}}
\zref@addprop{main}{numpage}
\lhead{\rule{\dimexpr \textwidth * \the\value{page}/\zref@extractdefault{LastPage}{numpage}{1}}{2mm}}
\makeatother
\begin{document}
\lipsum[1-60] %Insert dummy text for demonstration
\end{document}

(如果需要绝对页码,也可以使用“abspage”而不是新属性“numpage”。)

答案3

好的,您已经得到了 4 个答案,但为了给其他查找该问题的人提供更多选择:

由于您已经在使用最后一页包,您还可以使用\lastpage@lastpage(至少使用最新版本 1.2k):

\documentclass[oneside]{book}
\usepackage{fancyhdr,lastpage}
\pagestyle{fancy}
\makeatletter
\def\lastpage@lastpage{1000}% because \lastpage@lastpage is undefined before
% the .aux file has been loaded at the begin of the document
% (and during the first compilation run).
\lhead{\rule{\dimexpr \textwidth*\thepage/\lastpage@lastpage \relax}{2mm}}%
\makeatother
\usepackage{lipsum}
\begin{document}
\lipsum[1-60] % inserts dummy text for demonstration.
\end{document}

当使用另一种页码方案(例如 Roman)或页码被重置时,这将不起作用,例如\lastpage@lastpage可能是X(Roman for 10),并且可能不会计算带有的页面\AtEndDocument(取决于包的加载顺序)。在这些情况下页面可以使用包(v1.2a):

\documentclass[oneside]{book}
\usepackage{fancyhdr,pageslts}
\setcounter{pagesLTS.pagenr}{1000}
% because pagesLTS.pagenr is zero before
% the .aux file has been loaded at the begin of the document
% (and during the first compilation run).
\pagestyle{fancy}
\lhead{\rule{\dimexpr \textwidth*\theCurrentPage/\the\value{pagesLTS.pagenr}\relax}{2mm}}%
\usepackage{lipsum}
\begin{document}
\pagenumbering{arabic}
\lipsum[1-30] % inserts dummy text for demonstration.
\clearpage
\pagenumbering{Roman}
\lipsum[31-60] % inserts dummy text for demonstration.
\end{document}

(我也将 fixed 替换120mm\textwidth。)

答案4

做到这一点有点棘手,因为您需要展开\pageref所做的一切,但您需要做的基本上可以归结为这一点。

\newcount\lastpagecount
\makeatletter
\AtBeginDocument{%
        \expandafter\ifx\csname r@LastPage\endcsname\relax
                \lastpagecount\m@ne
        \else
                \lastpagecount\expandafter\@secondoftwo\r@LastPage\relax
        \fi
}
\lhead{%
        \begingroup
                \ifnum\c@page>\lastpagecount
                        \count@\c@page
                \else
                        \count@\lastpagecount
                \fi
                \dimen@\dimexpr 120mm * \c@page/\count@\relax
                \rule{\dimen@}{2mm}%
        \endgroup
}
\makeatother

传递给的代码将\AtBeginDocument检查 LastPage 引用是否已设置。如果尚未设置,则将其设置\lastpagecount为 -1。如果已设置,则将其设置\lastpagecount为最后一页的值。

然后,在 中\lhead\count@设置为当前页和最后一页中的最大值。请注意,当前页可能大于最后一页,因为您需要至少编译两次才能找到真正的最后一页号。然后它用于\dimexpr ... \relax计算规则的长度。

这还没有经过广泛的测试,但它似乎有效。

相关内容