読者です 読者をやめる 読者になる 読者になる

Fibonacci 数列で TikZ してみた

あべのりさんが [id:abenori:20120422] で、脱 Xy-pic 宣言をしていたので、ぼくも真似してみた。いや、ぼくの場合は、某職場以外で PSTricks を使わない宣言をしたほうがいいな(わら

今日の気分は…、

なので、Fibonacci 数列を題材にしました。

ただ単に、Fibonacci 数列をそのまま出力するのはつまらないので、diagram にしてみました。まぁ、某数学分野の K 理論入門書などで、Bratteli diagram wikipedia:en:Bratteli_diagram としてしばしば見かける例だけど(汗

%#!lualatex fibdiag
\documentclass{article}
%\def\pgfsysdriver{pgfsys-dvipdfm.def} % for dvipdfmx
\usepackage{tikz}
\usetikzlibrary{arrows}
\pagestyle{empty}
\begin{document}

\makeatletter
\newcount\FibDiag@counter
\newcount\FibDiag@temp
\newcount\FibDiag@F
\newcount\FibDiag@G
\newcount\FibDiag@oldF
\newcount\FibDiag@oldG
\def\FibonacciDiagram#1{%
  \FibDiag@counter=#1  
  \FibDiag@temp=\z@
  \FibDiag@oldF=\@ne
  \FibDiag@oldG=\z@
  \FibDiag@F=\@ne
  \FibDiag@G=\@ne
  \begin{tikzpicture}[arrows={->},auto]
     \node                (F1) {1};
     \node [right of=F1]  (G0) {1}; 
  \FibDiag@loop
  \end{tikzpicture}
}

\def\FibDiag@loop{%
  \let\FibDiag@next=\FibDiag@loop
  \FibDiag@temp=\FibDiag@F
  \FibDiag@F=\FibDiag@G
  \advance \FibDiag@G by \FibDiag@temp
  %
  \node [below of=F\the\FibDiag@F] (F\the\FibDiag@G) {\the\FibDiag@G};
  \node [right of=F\the\FibDiag@G] (G\the\FibDiag@F) {\the\FibDiag@F};
  \draw (F\the\FibDiag@oldF) -- (F\the\FibDiag@G);
  \draw (G\the\FibDiag@oldG) -- (F\the\FibDiag@G);
  \draw (F\the\FibDiag@F)    -- (G\the\FibDiag@F);
  %
  \ifnum \FibDiag@counter=\z@
    \let\FibDiag@next=\relax
  \else
    \FibDiag@oldF=\FibDiag@G
    \FibDiag@oldG=\FibDiag@F
    \advance \FibDiag@counter by \m@ne
  \fi  
  \FibDiag@next  
}
\makeatother
%\FibonacciDiagram{100}
\FibonacciDiagram{10}
\end{document}

こいつを e-TeX 拡張が有効な LaTeX でタイプセットすると、以下のような出力を得る。