Fundo
Procurando desenhar uma "barra de progresso" horizontal na parte inferior de cada página. A primeira página não deve ter nenhuma linha acima do número da página (ou muito, muito curta) e a última página deve ter uma linha \textwidth
de comprimento.
Código
O código a seguir funciona em algumas situações, mas não em todas:
% 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
Exemplo de saída
Aqui estão alguns exemplos que funcionam usando o código acima:
Outros documentos, infelizmente, falham com erro aritmético (provavelmente divisão por zero).
Pergunta
Qual é a maneira correta de calcular a porcentagem concluída para que, se \lastpage
não for válida (ou seja, a primeira passagem de múltiplas passagens), o cálculo seja adiado até que \lastpage
tenha um valor conhecido?
Responder1
A macro \lastpage
é 0 durante a primeira passagem porque a última página do documento é desconhecida. Isto permite definir a percentagem para 0pt para a primeira passagem e para a dimensão desejada para todas as outras passagens. Além disso, as medidas fornecem uma interface de nível superior para dimensões adaptativas.
\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