背景
希望在每页底部绘制一条水平“进度条”。第一页的页码上方不应有线条(或非常非常短),最后一页应有一条\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
示例输出
以下是使用上述代码的一些示例:
不幸的是,其他文档因算术错误(可能除以零)而失败。
问题
计算完成百分比的正确方法是什么,以便如果\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