Hintergrund

Hintergrund

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

Seite 4 von 145

Seite 61 von 145

Seite 144 von 145

Andere Dokumente scheitern leider mit einem Rechenfehler (wahrscheinlich Division durch Null).

Frage

Was ist die korrekte Methode zum Berechnen des abgeschlossenen Prozentsatzes, sodass, wenn \lastpagedieser nicht gültig ist (d. h. erster von mehreren Durchgängen), die Berechnung verschoben wird, bis \lastpageein bekannter Wert vorliegt?

Antwort1

Das Makro \lastpageist 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

verwandte Informationen