背景

背景

背景

希望在每页底部绘制一条水平“进度条”。第一页的页码上方不应有线条(或非常非常短),最后一页应有一条\textwidth长度的线条。

代码

以下代码在某些但并非所有情况下有效:

% Calculate the percentage complete for a progress meter.
\define\PercentComplete{\the\dimexpr\textwidth*\currentpage/\lastpage\relax}

%
\define\PageNumber{%
  \inframed[
    frame=off,
    bottomframe=on,
    width=\PercentComplete,
    framecolor=ProgressBar,
  ]{\currentpage\ of \lastpage}
}

\startsetups[FooterLeft]
  \midaligned{\FontFooter \PageNumber}
\stopsetups

\startsetups[FooterRight]
  \midaligned{\FontFooter \PageNumber}
\stopsetups

示例输出

以下是使用上述代码的一些示例:

第 4 页,共 145 页

第 61 页,共 145 页

第 144 页,共 145 页

不幸的是,其他文档因算术错误(可能除以零)而失败。

问题

计算完成百分比的正确方法是什么,以便如果\lastpage无效(即,多次传递中的第一次传递),则计算被推迟直到\lastpage具有已知值?

答案1

由于文档的最后一页未知,因此在第一遍期间宏\lastpage为 0。这样可以将第一遍的百分比设置为 0pt,并将所有其他遍的百分比设置为所需尺寸。此外,度量还为自适应尺寸提供了更高级别的接口。

\doifelse{\lastpage}{0}{
  \definemeasure
    [percent complete]
    [0pt]
}{
  \definemeasure
    [percent complete]
    [\textwidth*\currentpage/\lastpage]
}

\define\PageNumber{%
  \inframed[
    frame=off,
    bottomframe=on,
    width=\measure{percent complete},
    framecolor=ProgressBar,
  ]{\currentpage\ of \lastpage}
}

\def\FontFooter{\ss}

\startsetups[FooterLeft]
  \midaligned{\FontFooter \PageNumber}
\stopsetups

\startsetups[FooterRight]
  \midaligned{\FontFooter \PageNumber}
\stopsetups

\setupfootertexts[\setups{FooterLeft}][\setups{FooterRight}]

\starttext

\dorecurse{10}{\input knuth\relax}

\stoptext

相关内容