背景

背景

背景

想要沿著每個頁面的底部繪製一個水平「進度條」。第一頁在頁碼上方不應有一行(或非常非常短),最後一頁應有一行\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

相關內容