使用 Binet 公式

使用 Binet 公式

如何以斐波那契数列显示页码。示例:正常页码 1、2、3、4、5、6、7、8、...

斐波那契页码样式:1、1、2、3、5、8、13、...

答案1

套餐fibnum帮助:

\usepackage{fibnum}
\renewcommand*{\thepage}{\fibnum{\value{page}}}

完整示例:

\documentclass{article}
\usepackage{fibnum}
\renewcommand*{\thepage}{\fibnum{\value{page}}}
\begin{document}
\newcommand*{\test}{%
  \begin{tabular}{ll}
    Page value: & \the\value{page}\\
    \texttt{\textbackslash thepage}: & \thepage
  \end{tabular}%
  \newpage
}
\test
\test
\test
\test
\test
\test
\test
\test
\test
\end{document}

如果页数很大 (>> 46),则应\fibnumPreCalc使用以获得更高效的\fibnum\fibnum每次都必须计算数字,除非通过提前计算值\fibnumPreCalc。示例:

\documentclass{article}

\usepackage{fibnum}
\renewcommand*{\thepage}{\fibnum{\value{page}}}

\usepackage{atbegshi}
\AtBeginShipout{%
  \fibnumPreCalc{\value{page}}%
}

\begin{document}
\newcommand*{\test}{%
  \begin{tabular}{ll}
    Page value: & \the\value{page}\\
    \texttt{\textbackslash thepage}: & \thepage
  \end{tabular}%
  \newpage
}
\test
\test
\test
\test
\test
\test
\test
\test
\setcounter{page}{200}
\test
\end{document}

最后一页的表格:

结果 200

该包fibnum计算并存储前 46 个斐波那契数,因为这些数字也适合 TeX 计数寄存器。但是,数字不受此限制,如上例所示。上述值包fignum通过使用包的大整数可扩展运算来切换其计算方法bigintcalc

答案2

两种解决方案。

使用 Binet 公式

\documentclass{article}
\usepackage[paperwidth=3cm,paperheight=4cm,textheight=2cm]{geometry}
\usepackage{xparse}

\ExplSyntaxOn
\fp_const:Nn \c_rudstep_phi_fp { (sqrt(5)+1)/2 } % the golden ratio

\DeclareExpandableDocumentCommand{\fibonacci}{m}
 {
  \fp_eval:n
   {
    round( ( ( \c_rudstep_phi_fp)^(#1) - (1 - \c_rudstep_phi_fp)^(#1) ) / sqrt(5) , 0 )
   }
 }

\ExplSyntaxOff

\renewcommand{\thepage}{\fibonacci{\value{page}}}

\begin{document}

a\newpage a\newpage a\newpage a\newpage a\newpage a\newpage
a\newpage a\newpage a\newpage a\newpage a\newpage a\newpage

\end{document}

笔记:四舍五入操作仅对 68 页保证了良好的结果。Indeed\fibonacci{68}返回 72723460248141,这是正确的;另一方面\fibonacci{69}返回 117669030460995,而正确值是 117669030460994。此后返回的数字都不正确。

使用递归公式

\documentclass{article}
\usepackage[paperwidth=3cm,paperheight=4cm,textheight=2cm]{geometry}
\usepackage{atbegshi}

\newcounter{twoback}
\newcounter{oneback}
\setcounter{twoback}{0}
\setcounter{oneback}{1}

\AtBeginShipout{%
  \setcounter{page}{\numexpr\value{twoback}+\value{oneback}-1}% page is stepped later
  \setcounter{twoback}{\value{oneback}}%
  \setcounter{oneback}{\numexpr\value{page}+1}%
}

\begin{document}

a\newpage a\newpage a\newpage a\newpage a\newpage a\newpage
a\newpage a\newpage a\newpage a\newpage a\newpage a\newpage

\end{document}

笔记:此方法将生成正确的数字,直到斐波那契数小于 2 31,即在 TeX 整数范围内。因此仅支持 46 个页面。

可以使用 jfbu 的包来克服这个限制xint,基本上相同的方法并不重新计算数字,而只是应用递归定义。

\documentclass{article}
\usepackage[paperwidth=3cm,paperheight=4cm,textheight=2cm]{geometry}
\usepackage{xint,atbegshi}

\newcommand\twoback{0}
\newcommand\oneback{1}

\AtBeginShipout{%
  \oodef\temp{\xintiiAdd{\twoback}{\oneback}}%         
  \global\let\thepage\temp
  \global\let\twoback\oneback
  \global\let\oneback\temp
}
\AtBeginDocument{\def\thepage{1}}% initialize, just to be on the safe side

\begin{document}

a\newpage a\newpage a\newpage a\newpage a\newpage a\newpage
a\newpage a\newpage a\newpage a\newpage a\newpage a\newpage

\end{document}

两者的输出

注意与的设置geometry不相关。

在此处输入图片描述


自 2014 年 9 月 22 日起,有一个新的软件包可用:bnumexpr,允许更自然的表示法。因此,xint可以加载bnumexpr并将上面的代码更改为

\usepackage{bnumexpr,atbegshi}

\newcommand\twoback{0}
\newcommand\oneback{1}

\AtBeginShipout{%
  \edef\temp{\thebnumexpr\twoback+\oneback\relax}%
  \global\let\thepage\temp
  \global\let\twoback\oneback
  \global\let\oneback\temp
}
% initialize, just to be on the safe side; the second is easier ;-)
%\AtBeginDocument{\edef\thepage{\thebnumexpr\twoback+\oneback\relax}}
\AtBeginDocument{\def\thepage{1}}

相关内容