我想要做的是在标题中显示一个“进度条”,以显示您在文档中的进度,方法是制定一条规则,将页码宽度除以总页数乘以纸张宽度。
这就是我所拥有的:
\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
计算规则的长度。
这还没有经过广泛的测试,但它似乎有效。