我想在页脚中显示文档的当前进度。例如,如果文档包含 200 页,那么我希望页脚显示第 23 页的 11.5%。
编辑:我对用英尺来显示当前章节完成百分比也很感兴趣。可以吗?
感谢你的帮助
答案1
该软件包zref-totpages
可以提供总页数,并且expl3
我们拥有强大的数字运算系统。
\documentclass[12pt,paper=a4]{scrbook}
\usepackage{scrpage2}
\usepackage{blindtext}
\usepackage{zref-totpages}
\usepackage{xparse}
\usepackage{xcolor}
\ExplSyntaxOn
\NewDocumentCommand{\percentage}{}
{
\int_compare:nTF { \ztotpages > 0 }
{
\fp_to_decimal:n { round( 100 * \value{page} / \ztotpages , 2 ) }
}
{ -- }
}
\ExplSyntaxOff
\cfoot{\LARGE\textcolor{blue}{\percentage\% -- Page \thepage\ of \ztotpages}}
\ifoot{}
\ofoot{}
\pagestyle{scrheadings}
\begin{document}
\blinddocument
\blinddocument
\blinddocument
\end{document}
答案2
\documentclass{scrartcl}
\usepackage{xparse}
\usepackage{scrlayer-scrpage}
\cfoot{\percentpagemark}
\AtEndDocument{\label{last-page}}
\ExplSyntaxOn
\NewDocumentCommand \percentpagemark { }
{
\int_set:NV \l_tmpa_int { \value{page} }
\int_set:NV \l_tmpb_int { \pageref{last-page} }
\fp_eval:n { round( 100*\l_tmpa_int/\l_tmpb_int , 2 ) } \, \%
}
\cs_generate_variant:Nn \int_set:Nn { NV }
\ExplSyntaxOff
\usepackage{blindtext} % For this example
\begin{document}
\Blinddocument
\end{document}
正如@Werner 所指出的,\AtEndDocument
在某些情况下,此解决方案可能并不完美(与最后一次发货有关,或者可能是在我的代码中包含的引用之后添加的一些内容)。当然,已经有了这样的软件包;使用以下引用可能会获得更好的结果pagelts
(使用atveryend
命令)。
答案3
另一种方法是使用页码计数器和calculator
包。百分比通过 计算\CalculatePercentage[]{}{}
,其中第一个可选参数包含四舍五入的位数,第二个参数是针对当前页码设计的,第三个参数包含总页数。
我使用了不同的方法,偏离了totcount
包装。
\documentclass[12pt,paper=a4]{scrbook}
\usepackage{scrpage2}%
\usepackage{calculator}%
\usepackage{etoolbox}%
\usepackage{forloop}
\usepackage{blindtext}
\usepackage{everypage}%
\usepackage{xcolor}%
\newcommand{\CalculatePercentage}[3][1]{%
\def\tempone{1.0}%
\def\temptwo{1.0}%
\DIVIDE{#2}{#3}{\temptwo}%
\MULTIPLY{\temptwo}{100}{\tempone}
\ROUND[#1]{\tempone}{\temptwo}%
\temptwo%
}%
\newcounter{lastpagecounter}%
\newcounter{totalpagecounter}%
\makeatletter
\AddEverypageHook{%
\refstepcounter{totalpagecounter}%
}%
\AtEndDocument{%
\immediate\write\@auxout{% Store the total number of pages to aux -file
\string\setcounter{lastpagecounter}{\number\value{totalpagecounter}}%
}%
}%
\cfoot{\LARGE \textcolor{blue}{\CalculatePercentage{\number\value{page}}{\number\value{lastpagecounter}}\% -- Page \thepage~of \number\value{lastpagecounter}}}%
\ifoot{}%
\ofoot{}%
\newcounter{loopcounter}%
\pagestyle{scrheadings}%
\newcounter{maxpages}
\setcounter{maxpages}{201}
\begin{document}
\forloop{loopcounter}{1}{\number\value{loopcounter} < \number\value{maxpages}}{%
\blindtext
\newpage
}%
\end{document}
答案4
因为问题中没有包含 LaTeX 这个词,所以我可以展示非 LaTeX 解决方案。第一个任务(占总页面的百分比)很简单,使用 opmac 的\lastpage
:
\input opmac
\openref
\footline={\rm\thefontsize[10]\hfil\the\pageno\ / \dopercent\pageno of\lastpage\hfil}
\def\dopercent #1of#2{\ifnum#2=0 ??\else
\tmpdim=#1 pt
\multiply\tmpdim by10 \divide\tmpdim by#2\multiply\tmpdim by10
\edef\tmp{\expandafter \ignorept \the\tmpdim;}%
\expandafter\onlyoneten \tmp
\fi ~\%%
}
\def\onlyoneten #1.#2#3;{#1.#2}
... document
\bye
第二个任务是计算各章的页数百分比,这个任务稍微复杂一些。我将每章的总页数列表保存到 REF 文件中。这是通过\chaphook
在章节开头执行的 来完成的:\totchappage
保存了上一章的 。\chappagelist
第二次 TeX 运行中包含的内容:
pre_chapter_pages,first_chapter_pages,second_chapter_pages,etc.
从此列表中读取\readttotchappage
第一项并从列表中删除此项。首先,我们需要\readtotchappage
单独运行才能删除pre_chapter_pages
。然后\readtotchappage
在中使用\chaphook
。
\def\chappagelist{}
\input opmac
... the same code as above ...
\newcount\chappage \newcount\totchappage
\def\chaphook{\vfil\break
\savechappage
\chappage=0 \readtotchappage
\footline={\rm\thefontsize[10]\hfil\the\pageno\ / \dopercent\pageno of\lastpage\hfil
\global\advance\chappage by1
chapter: \dopercent\chappage of\totchappage \hfil}
}
\def\readtotchappage{\ifx\chappagelist\empty \totchappage=0 \else
\expandafter \readtotchappageA \chappagelist;\fi
}
\def\savechappage{%
\immediate\write\reffile{\noexpand\addto\noexpand\chappagelist{\the\chappage,}}%
}
\def\readtotchappageA #1,#2;{\totchappage=#1 \def\chappagelist{#2}}
\readtotchappage
\expandafter \def\expandafter \bye \expandafter{\expandafter \savechappage \bye}
... document ...
\bye