Ich nutze einen Fortschrittsbalken in Beamer. Bis Folienanzahl 89 funktioniert alles tadellos, ab Folienanzahl 90 kommt die Fehlermeldung.
\documentclass{beamer} \usepackage{tikz} \definecolor{pbbg}{RGB}{0,122,59}% filling color for the progress bar \definecolor{pbfill}{RGB}{0,122,59}% background color for the progress bar \makeatletter \def\progressbar@progressbar{} % the progress bar \newcount\progressbar@tmpcounta% auxiliary counter \newcount\progressbar@tmpcountb% auxiliary counter \newdimen\progressbar@pbht %progressbar height \newdimen\progressbar@pbwd %progressbar width \newdimen\progressbar@tmpdim % auxiliary dimension \progressbar@pbwd=\paperwidth \progressbar@pbht=0.5ex % the progress bar \def\progressbar@progressbar{% \progressbar@tmpcounta= \insertframenumber % max = ? \progressbar@tmpcountb=\inserttotalframenumber \progressbar@tmpdim=.5\progressbar@pbwd \multiply\progressbar@tmpdim by \progressbar@tmpcounta \divide\progressbar@tmpdim by \progressbar@tmpcountb \progressbar@tmpdim=2\progressbar@tmpdim \begin{tikzpicture}[rounded corners=1.5pt,very thin] \shade[top color=pbbg!20,bottom color=pbbg!20,middle color=pbbg!50] (0pt, 0pt) rectangle ++ (\progressbar@pbwd, \progressbar@pbht); \shade[draw=pbfill,top color=pbfill!50,bottom color=pbfill!50,middle color=pbfill] % (0pt, 0pt) rectangle ++ (\progressbar@tmpdim, \progressbar@pbht); \draw[color=normal text.fg!50] (0pt, 0pt) rectangle (\progressbar@pbwd, \progressbar@pbht) node[pos=0.5,color=normal text.fg] {\textnormal{% }% }; \end{tikzpicture}% } \addtobeamertemplate{footline} {% \begin{beamercolorbox}[wd=\paperwidth,ht=2.0ex,center,dp=0ex]{white}% \progressbar@progressbar% \end{beamercolorbox}% } \makeatother \begin{document} \foreach \x in {1,2,...,90} {\begin{frame}[label=test]{My frame} Test \x \end{frame}} \end{document} gefragt 18 Jul '21, 14:53 Tischa |
Wie @huibub bereits in seinen Kommentaren richtig bemerkt hat, darf bei TeX das Ergebnis einer arithmetischen Operation maximal Zusätzlich wäre theoretisch in der Tat zu empfehlen, erst durch die Gesamtzahl der Frames zu dividieren und dann mit der aktuellen Framenummer zu multiplizieren. Leider hat das am Ende dann keine Auswirkungen, weil, wie @huibub ebenfalls in seinen Kommentaren richtig bemerkt, Das Problem mit dem zu kleinen \documentclass{beamer} \usepackage{tikz} \definecolor{pbbg}{RGB}{0,122,59}% filling color for the progress bar \definecolor{pbfill}{RGB}{0,122,59}% background color for the progress bar \makeatletter \def\progressbar@progressbar{} % the progress bar \newdimen\progressbar@pbht %progressbar height \newdimen\progressbar@pbwd %progressbar width \newdimen\progressbar@tmpdim % auxiliary dimension \progressbar@pbwd=\paperwidth \progressbar@pbht=0.5ex % the progress bar \def\progressbar@progressbar{% % Die Progressbar ergibt nur Sinn, wenn \inserttotalframenumber > \value{framenumber} ist \expandafter\ifnum \value{framenumber}>\number\inserttotalframenumber\relax\else \progressbar@tmpdim=\progressbar@pbwd \divide\progressbar@tmpdim by \number\inserttotalframenumber\relax \multiply\progressbar@tmpdim by \value{framenumber} \begin{tikzpicture}[rounded corners=1.5pt,very thin] \shade[top color=pbbg!20,bottom color=pbbg!20,middle color=pbbg!50] (0pt, 0pt) rectangle ++ (\progressbar@pbwd, \progressbar@pbht); \shade[draw=pbfill,top color=pbfill!50,bottom color=pbfill!50,middle color=pbfill] % (0pt, 0pt) rectangle ++ (\progressbar@tmpdim, \progressbar@pbht); \draw[color=normal text.fg!50] (0pt, 0pt) rectangle (\progressbar@pbwd, \progressbar@pbht) node[pos=0.5,color=normal text.fg] {\textnormal{% }% }; \end{tikzpicture}% \fi } \addtobeamertemplate{footline} {% \begin{beamercolorbox}[wd=\paperwidth,ht=2.0ex,center,dp=0ex]{white}% \progressbar@progressbar% \end{beamercolorbox}% } \makeatother \begin{document} \foreach \x in {1,2,...,90} {\begin{frame}[label=test\x]{My frame} Test \x \end{frame}} \end{document} Es sei darauf hingewiesen dass es auch einen Nachteil dieser Lösung gibt. Sobald sich die Anzahl der Frames der Breite der Frames in Übrigens ist auch @huibub's Frage berechtigt, warum man die Berechnung nicht gleich mit Mit dem ebenfalls von @huibub gemeldeten Problem der beantwortet 20 Sep '21, 09:59 gast3 |
Damit, dass es bis 89 funktioniert, meinst du doch die \foreach-schleife, richtig? Ich bekomme da schon ein "Dimension too large" mit \foreach \x in {1,2,...,45}. Ich denke, dass kommt davon, weil beim multiplizieren von der halben papierbreite mit der foliennummer eine zu große länge rauskommt. Ich habe irgendwo gelesen, dass das latex nur ungefähr 2m kann.
Außerdem gibt es aber ganz viele "pdfTeX warning (ext4): destination with the same identifier (name{test<1>}) has been already used, duplicate ignored \relax". Also stimmt noch mehr nicht.
Auch nach der änderung ist die angabe, dass es mit 89 noch funktioniere falsch. Wie man leicht im online compiler feststellen kann, funktioniert es nur bis 44. Hauptgrund ist, dass erst multipliziert und dann dividiert wird. Dabei überschreitet das ergebnis von 2 * (182pt * 45) eben bereits die maximal zulässige Länge von <16384pt. Es nützt leider auch nichts, die division und die multiplikation zu vertauschen, weil
\inserttotalframenumber
beim ersten latex lauf immer 1 liefert. Mit tex arithmetik ist das so also nicht lösbar. Man müsste schon erst einmal durch einen recht hohen wert teilen.BTW: Warum verwendest du nicht
pgfmath
für die berechnung? Das ist doch für berechnungen innerhalb vonpgf
prädestiniert. Vielleicht kann das (zumindest unter lualatex) auch mit größeren zahlen rechnen. Probiert habe ich es aber nicht.