How to number frames with an increasing number of digits of pi? Illustrative, I want the frame numbers to be like - 3 (on the first slide) - 3.1 (on the second slide) - 3.14 (on the third slide) ... and so on. This is a question, which occupies me for quite some time; actually since a talk I gave on March 14th (also known as pi-day :). My present workaround is, to insert the frame numbers by hand – which is of course quite annoying when changing the order of slides. \documentclass[t]{beamer} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \newcommand{\pifoot}[1]{ \begin{textblock*}{120mm}(0mm,84.3mm) \raggedleft #1 \end{textblock*} } \begin{document} \begin{frame} \pifoot{3} \end{frame} \begin{frame} \pifoot{3.1} \end{frame} \begin{frame} \pifoot{3.14} \end{frame} \end{document} **EDIT:** Based on Reds great answer I compiled an unpretentious solution. It abstains new counters in favour of the current page number. \documentclass[t]{beamer} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \usepackage{xstring} \setbeamertemplate{footline}{% \begin{picture}(54,12.5)(0,0) \put(0.9,0.52){% \begin{minipage}[b][12.5mm][c]{112.5mm} \raggedleft 3\StrLeft{.141592653589793238462643383279502884197169399375105820974944592307816406286 208998628034825342117067982148086513282306647093844609550582231725359408128481}{\arabic{framenumber}} \end{minipage} } \end{picture} } \begin{document} \begin{frame} \end{frame} \begin{frame} \end{frame} \end{document}
Here's a way with LaTeX3 macros: \documentclass[t]{beamer} \usepackage{xparse} \setbeamertemplate{navigation symbols}{} % just add the frame numbers \setbeamertemplate{footline}{\hfill\Large\strut\pagepi{\arabic{framenumber}}\hspace*{1pc}} \ExplSyntaxOn \tl_const:Nn \c_pidigits_tl {1415926535897932384626433832795028842} \DeclareExpandableDocumentCommand{\pagepi}{m} { \int_compare:nTF { #1 < 2 } { 3 } { 3. \int_step_function:nnnN { 1 } { 1 } { #1-1 } \my_print_digits:n } } \cs_new:Npn \my_print_digits:n #1 { \tl_item:Nn { \c_pidigits_tl } { #1 } } \ExplSyntaxOff \begin{document} \begin{frame} a\pause b \end{frame} \begin{frame} a\pause b \end{frame} \begin{frame} a\pause b \end{frame} \end{document} ![enter image description here][1] --- A different implementation using a property list; here 250 digits are available, much more than a presentation should need. \documentclass[t]{beamer} \usepackage{xparse} \setbeamertemplate{navigation symbols}{} \setbeamertemplate{footline}{\hfill\Large\strut\pagepi{\arabic{framenumber}}\hspace*{1pc}} \ExplSyntaxOn \tl_const:Nn \c_pidigits_tl {3%. % source: http://www.eveandersson.com/pi/digits 1415926535897932384626433 8327950288419716939937510 5820974944592307816406286 2089986280348253421170679 8214808651328230664709384 4609550582231725359408128 4811174502841027019385211 0555964462294895493038196 4428810975665933446128475 6482337867831652712019091 } \tl_new:N \l__pidigits_cumulate_tl \tl_set:Nn \l__pidigits_cumulate_tl { 3. } \prop_new:N \g_pidigits_prop \prop_gput:Nnn \g_pidigits_prop { 1 } { 3 } \int_step_inline:nnnn { 2 } { 1 } { \tl_count:N \c_pidigits_tl } { \tl_set:Nx \l__pidigits_cumulate_tl { \l__pidigits_cumulate_tl \tl_item:Nn \c_pidigits_tl { #1 } } \prop_gput:NnV \g_pidigits_prop { #1 } \l__pidigits_cumulate_tl } \prop_show:N \g_pidigits_prop \DeclareExpandableDocumentCommand{\pagepi}{m} { \prop_get:Nf \g_pidigits_prop { #1 } % #1 is \arabic{framenumber} } \cs_generate_variant:Nn \prop_get:Nn { Nf } \ExplSyntaxOff \begin{document} \begin{frame} a\pause b \end{frame} \begin{frame} a\pause b \end{frame} \begin{frame} a\pause b \end{frame} \end{document} [1]: https://i.stack.imgur.com/CZcnJ.png
This can also be done by returning `\pgfmathresult` of pi with the precision determined by the frame number. I kinda like that `\pgfmathprintnumber` rounds the output, so the fourth frame will be 3.142, the fifth will be 3.1416, the sixth 3.14159, and so on. \documentclass{beamer} \setbeamertemplate{footline}{% \usebeamerfont{page number in head/foot} \pgfkeys{/pgf/number format/.cd,fixed,precision=\thepage} \pgfmathprintnumber{\pgfmathresult} \vskip.5ex % } % Define pi to as many digits as you need \pgfmathparse{3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067} \setcounter{page}{0} \begin{document} \frame{}\frame{}\frame{}\frame{}\frame{}\frame{} \end{document}
Here I present a ConTeXt solution which admittedly cheats a little and resorts to Perl, instead of using Lua to calculate Pi. The idea can easily be ported to LaTeX as well. First the TeX macro `\PrintPi` is created, which generates one more digit with every consecutive call. It only keeps track of the page number and calls Perl. This macro is then placed in the header of every page. The performance should be sufficient for presentations with less than 400 slides. \setuppapersize [S6] %% screen size for slides \define\PrintPi {\startluacode userdata = userdata or {} userdata.num = userdata.num or 1 userdata.num = userdata.num + 1 f = io.popen("perl -Mbignum=bpi -wle 'print 0+substr(bpi("..userdata.num.."),0,-1)'") context( f:read("*a") ) \stopluacode} \setupheadertexts [\PrintPi] \starttext \dorecurse{80} {\input ward\page} \stoptext Page 69: ![screenshot][1] [1]: https://i.stack.imgur.com/gCw46.png
Here's an approach using `stringstrings` package. \documentclass[t]{beamer} \usepackage{stringstrings} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \def\PI{3.141592653589793238462643383279502884197169} \newcounter{sigdigits} \setcounter{sigdigits}{0} \newcommand{\pifoot}{% \if1\thesigdigits\stepcounter{sigdigits}\fi% \stepcounter{sigdigits}% \begin{textblock*}{120mm}(0mm,84.3mm) \raggedleft \substring{\PI}{1}{\thesigdigits}% \end{textblock*} } \begin{document} \begin{frame} \pifoot \end{frame} \begin{frame} \pifoot \end{frame} \begin{frame} \pifoot \end{frame} \end{document}
Here is a solution using `lua`. With this solution you don't have to bother about which slide is it, or whether you have given enough digits at the beginning. Obviously, it can be easily integrated into one of the themes of `beamer`, so you can typeset it in a fancy way as well. \documentclass[t]{beamer} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \usepackage{luatextra} \newcommand{\pifoot}{ \begin{textblock*}{120mm}(0mm,84.3mm) \raggedleft $\luaexec{ slidenumber = \insertframenumber if tonumber(slidenumber) == 1 then numbertoinsert = tostring(3) else numbertoinsert = "\%." .. tostring(slidenumber-1) .. "f" end tex.sprint(string.format(numbertoinsert,math.pi)) }$ \end{textblock*} } \begin{document} \begin{frame} \pifoot \end{frame} \begin{frame} \pifoot \end{frame} \begin{frame} \pifoot \end{frame} \end{document} Has to be processed using `lualatex`.
A slight modification to your code using the [`xstring`][1] package can do the trick. You have to enter `Pi` as a string, though: \documentclass[t]{beamer} \usepackage{xstring} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \newcounter{Pi} \newcommand{\pifoot}{ \begin{textblock*}{120mm}(0mm,84.3mm) \raggedleft \StrChar{3141592653589793238462643383279502884197169}{\arabic{Pi}} \end{textblock*} \stepcounter{Pi} } \begin{document} \begin{frame} \pifoot \end{frame} \begin{frame} \pifoot \end{frame} \begin{frame} \pifoot \end{frame} \end{document} [1]: http://www.ctan.org/pkg/xstring
I tried to make the total be pi or `\pi` as well but `beamer` didn't want to play, this does the digit counting though. \documentclass[t]{beamer} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \setbeamertemplate{footline}[frame number] \newcommand{\pifoot}[1]{ \begin{textblock*}{120mm}(0mm,84.3mm) \raggedleft #1 \end{textblock*} } \def\pilist{3{.1}4159265.....} \makeatletter \def\insertframenumber{\csname pi-\the\c@framenumber\endcsname} \@namedef{pi-1}{3} \@namedef{pi-2}{3.1} \@namedef{pi-3}{3.14} \@namedef{pi-4}{3.141} \@namedef{pi-5}{3.1415} \makeatother % this doesn't work:-) \def\inserttotalframenumber{pi} \begin{document} \begin{frame} \pifoot{3} \end{frame} \begin{frame} \pifoot{3.1} \end{frame} \begin{frame} \pifoot{3.14} \end{frame} \end{document}
Without PSTricks. Only up to 19 slides! \documentclass{beamer} \usepackage[nomessages]{fp} \usepackage{multido} \begin{document} \multido{\i=0+1}{19}{% \FPtrunc{\x}{\FPpi}{\i}% \begin{frame}{\x} \end{frame}} \end{document} ![enter image description here][1] [1]: https://i.stack.imgur.com/6leIU.gif
## EDIT ## I did not success in using an algorithm to calculate the pi digits but I can get them by the web using the `\write18` command of `LaTeX` (require `--shell-enabled`) and the shell command `wget` and `sed`. All you need to do is substitute the row \CatchFileDef{\PiG}{pi.txt} in the code below with: \IfFileExists{./digits.txt}{} { \immediate\write18{\detokenize{wget http://www.geom.uiuc.edu/~huberty/math5337/groupe/digits.html -O digits.txt}} \immediate\write18{sed -i '/[0-9]$/!d' digits.txt} \immediate\write18{sed -i '1,13!d' digits.txt} \immediate\write18{sed -i 's/ //g' digits.txt} } \CatchFileDef{\PiG}{digits.txt} ---------- This is the correct modification to @user36411 answer. Just create a file `pi.txt` with the number of pi digits you need. \documentclass[t]{beamer} \usepackage{xstring,ifthen,catchfile,forloop} \usepackage[absolute,overlay]{textpos} \setbeamertemplate{navigation symbols}{} \CatchFileDef{\PiG}{pi.txt} \newcounter{Pi} \setcounter{Pi}{1} \newcommand{\pifoot}{ \ifthenelse{\arabic{Pi}=2}{\stepcounter{Pi}}{} \begin{textblock*}{120mm}(0mm,84.3mm) \raggedleft \StrLeft{\PiG}{\arabic{Pi}} \end{textblock*} \stepcounter{Pi} } \begin{document} \newcounter{framenum} \forloop{framenum}{1}{\value{framenumber} < 50}{ \begin{frame} \pifoot \end{frame} } \end{document}