如何以斐波那契数列显示页码。示例:正常页码 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}
最后一页的表格:
该包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}}