将页码显示为“完成百分比”

将页码显示为“完成百分比”

我想在页脚中显示文档的当前进度。例如,如果文档包含 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

相关内容