Fundo

Fundo

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 \textwidthde 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:

Página 4 de 145

Página 61 de 145

Página 144 de 145

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 \lastpagenão for válida (ou seja, a primeira passagem de múltiplas passagens), o cálculo seja adiado até que \lastpagetenha 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

informação relacionada