Fondo
Buscando dibujar una "barra de progreso" horizontal en la parte inferior de cada página. La primera página no debe tener ninguna línea encima del número de página (o debe ser muy, muy corta) y la última página debe tener una línea \textwidth
de longitud.
Código
El siguiente código funciona en algunas situaciones, pero no en 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
Salida de ejemplo
A continuación se muestran algunos ejemplos que funcionan con el código anterior:
Desafortunadamente, otros documentos fallan con un error aritmético (probablemente dividido por cero).
Pregunta
¿Cuál es la forma correcta de calcular el porcentaje completo de modo que, si \lastpage
no es válido (es decir, el primer paso de varios pases), el cálculo se posponga hasta que \lastpage
tenga un valor conocido?
Respuesta1
La macro \lastpage
es 0 durante la primera pasada porque se desconoce la última página del documento. Esto permite establecer el porcentaje en 0 puntos para la primera pasada y en la dimensión deseada para todas las demás pasadas. Además, las medidas proporcionan una interfaz de nivel superior para las dimensiones 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