Hintergrund
Ich möchte am unteren Rand jeder Seite einen horizontalen „Fortschrittsbalken“ zeichnen. Die erste Seite sollte oberhalb der Seitenzahl keine Zeile haben (oder nur eine sehr, sehr kurze) und die letzte Seite sollte eine Zeile \textwidth
in der Länge haben.
Code
Der folgende Code funktioniert in einigen, aber nicht allen Situationen:
% 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
Beispielausgabe
Hier sind einige Beispiele, die mit dem obigen Code funktionieren:
Andere Dokumente scheitern leider mit einem Rechenfehler (wahrscheinlich Division durch Null).
Frage
Was ist die korrekte Methode zum Berechnen des abgeschlossenen Prozentsatzes, sodass, wenn \lastpage
dieser nicht gültig ist (d. h. erster von mehreren Durchgängen), die Berechnung verschoben wird, bis \lastpage
ein bekannter Wert vorliegt?
Antwort1
Das Makro \lastpage
ist beim ersten Durchgang 0, da die letzte Seite des Dokuments unbekannt ist. Dadurch kann der Prozentsatz beim ersten Durchgang auf 0pt und bei allen weiteren Durchgängen auf die gewünschte Dimension gesetzt werden. Außerdem bieten Kennzahlen eine Schnittstelle auf höherer Ebene zu adaptiven Dimensionen.
\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