%%
%% Новогоднее поздравление 2014 от кафедры Информатики и
%% математического обеспечения ПетрГУ.
%%
%% Для сборки следует использовать lualatex или xelatex.
%%
%% Михаил Крышень <kryshen@cs.karelia.ru>, 2013 г.
%%

\documentclass[a4paper]{article}

\usepackage[english,russian]{babel}

\usepackage{microtype}
\usepackage{fontspec}
\setmainfont{[Ledger-Regular.ttf]} 

%\setmainfont{CMU Serif}
%\setsansfont{CMU Sans Serif}
%\setmonofont{CMU Typewriter Text}

\usepackage[top=0mm,left=0mm,right=0mm,bottom=0mm,noheadfoot]{geometry}
\pagestyle{empty}

\usepackage{xifthen}
\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}

\pgfdeclarelindenmayersystem{Koch curve}{
  \rule{F -> F-F++F-F}}

\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}

%% \def\step{1.33}
%% \def\order{4}

\def\step{0.443}
\def\order{5}

%% ОТЛАДКА: меньше итераций -> быстрая отрисовка, размер сохраняется
%% \def\step{11.97}
%% \def\order{2}

\begin{document}
\begin{tikzpicture}[overlay,
    sf/.style={color=black!15,fill=blue!20,
      very thin,
      l-system={Koch curve, 
        step=\step pt, angle=60,
        axiom=F++F++F, order=\order}}]

  \pgfmathsetmacro{\xstep}{\step * pow(3, \order)}
  \pgfmathsetmacro{\ystep}{\step * pow(3, (\order - 1)) * sqrt(3)}
  \pgfmathsetmacro{\largeo}{\order + 1}
  \pgfmathsetmacro{\smallo}{\order - 1}

  \begin{scope}[xshift=-18pt, yshift=-10pt]
    % Заполняем лист снежинками Коха
    \foreach \yi in {0, ..., 14}{%
      \pgfmathsetmacro{\y}{-\yi * \ystep}
      \foreach \xi in {0, ..., 2}{%
        \pgfmathsetmacro{\x}{(mod(\yi, 2) + \xi * 2) * \xstep}

        \ifthenelse{%
          % Эти пропустить (рисуются отдельно)
          \(\yi=2 \AND \xi=1\) \OR
          \(\yi=3 \AND \(\xi=0 \OR \xi=1\)\) \OR
          \(\yi=4 \AND \xi=1\) \OR
          \(\yi=5 \AND \(\xi=0 \OR \xi=1\)\) \OR
          \(\yi=6 \AND \xi=1\) \OR
          \(\yi=9 \AND \xi=1\) \OR
          \(\yi=10 \AND \xi=0\) \OR
          \(\yi=12 \AND \xi=1\)
        }{}{%
          \pgfmathsetmacro{\c}{mod((\xi + \yi) * 100, 60) + 15}
          \begin{scope}[xshift=\x pt,yshift=\y pt]
            \draw [sf,fill=blue!\c] lindenmayer system -- cycle;
            %% ОТЛАДКА: номера снежинок
            %% \begin{pgfonlayer}{foreground}
            %%   \node at (20pt, 15pt) {\xi, \yi};
            %% \end{pgfonlayer}
          \end{scope}
        }

        % Отдельно для исключенных выше

        \ifthenelse{\yi=5 \AND \xi=0}{%
          % Самая большая снежинка
          \begin{scope}[xshift=\x pt,yshift=\y pt]
            \draw [sf,l-system={order=\largeo},
              fill=blue!10] lindenmayer system -- cycle;
          \end{scope}
          
          \pgfmathsetmacro{\textsx}{\x + \xstep * 1.5}
          \pgfmathsetmacro{\textsy}{\y + \ystep * 1.5}
          \begin{scope}[xshift=\textsx pt,yshift=\textsy pt]
            \node[align=center,color=red,
              font=\fontsize{48}{56}\selectfont] {%
              С Новым\\годом!};
          \end{scope}
        }{}

        \ifthenelse{\yi=9 \AND \xi=1}{%
          \pgfmathsetmacro{\textsx}{\x + \xstep * 0.5}
          \pgfmathsetmacro{\textsy}{\y + \ystep * 0.5 - 3}
          \begin{scope}[xshift=\textsx pt,yshift=\textsy pt]
            \node[align=center,color=red!60!blue,
              font=\fontsize{26}{30}\selectfont] {Здоровья\\и удачи!};
          \end{scope}
        }{}

        \ifthenelse{\yi=10 \AND \xi=0}{%
          % Самые маленькие снежинки
          \foreach \xk in {0, 2/3}{%
            \foreach \yk in {0, 2/3}{%
              \pgfmathsetmacro{\sx}{\x + \xstep * \xk}
              \pgfmathsetmacro{\sy}{\y + \ystep * \yk}
              \pgfmathsetmacro{\c}{mod((\xk + \yk) * 3 * 100, 60) + 15}
              \begin{scope}[xshift=\sx pt,yshift=\sy pt]
                \draw [sf,l-system={order=\smallo},
                  fill=blue!\c] lindenmayer system -- cycle;
              \end{scope}
          }}

          \pgfmathsetmacro{\sx}{\x + \xstep * 1/3}
          \foreach \yk in {1, -1/3}{%
            \pgfmathsetmacro{\sy}{\y + \ystep * \yk}
            \pgfmathsetmacro{\c}{mod((\yk + 1) * 3 * 100, 60) + 15}
            \begin{scope}[xshift=\sx pt,yshift=\sy pt]
              \draw [sf,l-system={order=\smallo},
                fill=blue!\c] lindenmayer system -- cycle;
            \end{scope}
          }
        }{}

        \ifthenelse{\yi=12 \AND \xi=1}{%
          \pgfmathsetmacro{\textsx}{\x + \xstep * 0.5}
          \pgfmathsetmacro{\textsy}{\y + \ystep * 0.5}
          \begin{scope}[xshift=\textsx pt,yshift=\textsy pt]
            \node[align=center,color=blue,
              font=\fontsize{22}{29}\selectfont] {%
              Кафедра\\ИМО};
          \end{scope}
        }{}

        \ifthenelse{\yi=13 \AND \xi=1}{%
          \pgfmathsetmacro{\textsx}{\x + \xstep * 0.5}
          \pgfmathsetmacro{\textsy}{\y + \ystep * 0.5}
          \begin{scope}[xshift=\textsx pt,yshift=\textsy pt]
            \node[align=center,color=white,
              font=\fontsize{22}{30}\selectfont] {2014};
          \end{scope}
        }{}
    }}
  \end{scope}
\end{tikzpicture}%

\end{document}
