%% This document is part of the document tex-overview and should not be distributed without it. This file contains the formatting and definitions for typesetting. Please do *not* consider anything here as an example of good TeX coding style – it's not.
%% author: Arno Trautmann

% !TeX root = tex-overview.tex
%% (for the TeXworks-users.)
\documentclass{scrartcl}
\usepackage[svgnames]{xcolor}

\usepackage{
  array,
  bookmark,
  booktabs,
  colortbl,
  fontspec,
  geometry,
  hyperref,
  longtable,
  luacode,
  metalogo,
  multicol,
  microtype,
%  pdftexcmds,
  tabu,
  tikz,
  xparse
}
%% copied definitions from old dtklogos, which are no longer supported:
\makeatletter
\providecommand\NTS{\mbox{\mathsurround=0pt
    \(\cal N\mkern -4mu\lower .5ex\hbox{$\cal T$}\mkern -2mu S\)}}
\providecommand\AMS{{\normalfont\(\cal A\)\kern-.1667em\lower.5ex\hbox{\(\cal M\)}\kern-.125em{\(\cal S\)}}}
\providecommand\LamSTeX{%
  L\raise.42ex\hbox{\kern-.3em\the\scriptfont2 A}%
  \kern-.2em\lower.376ex\hbox{\the\textfont2 M}%
  \kern-.125em {\the\textfont2 S}-\TeX}
\DeclareRobustCommand{\BibTeX}{B\kern-.05em%
    \hbox{$\m@th$% %% force math size calculations
          \csname S@\f@size\endcsname
          \fontsize\sf@size\z@
          \math@fontsfalse\selectfont
          I\kern-.025emB}%
    \kern-.08em%
    \-\TeX}

\newcommand*{\noaddvspace}{\renewcommand*{\addvspace}[1]{}}
\addtocontents{toc}{\protect\noaddvspace}

\renewcommand*{\addparttocentry}[2]{%
  \addtocentrydefault{part}{#1}{\Large #2 \normalsize}
}

\microtypesetup{stretch=35} %% allow for a bit more expansion to improve typesetting of the columns.
\frenchspacing

%% define the look-and-feel of the document
\setmainfont{TeX Gyre Pagella}
\setsansfont{TeX Gyre Pagella}

%% setup the style of hyperlinks.
\hypersetup{
  unicode=true,
  colorlinks=true,
  linkcolor=DarkRed,
  urlcolor=blue
}
\hyperbaseurl{.}

%% page layout, headings
\pagestyle{empty}
\addtokomafont{disposition}{\color[rgb]{0 0 .7}}
\addtokomafont{section}{\Huge}
\addtokomafont{subsection}{\LARGE}
\addtokomafont{subsubsection}{\Large}

\ExplSyntaxOn
%% some missing definitions for \TeX-like things
\tl_set:Nn\XeT{X\kern -.1667em\lower .5ex\hbox {E}\kern -.125emT\@}
\tl_set:Nn\ConTeXt{Con\TeX{}t}

%% constants for the colors. Might change from time to time …
\tl_set:Nn\vip{red}
\tl_set:Nn\normalimportant{blue}
\tl_set:Nn\experimental{yellow}
\tl_set:Nn\planned{LightSkyBlue}
\tl_set:Nn\fonttechnology{pink}
\tl_set:Nn\program{black}
\tl_set:Nn\package{green}
\tl_set:Nn\distro{orange}
\tl_set:Nn\histdistro{purple}
\tl_set:Nn\annotation{black}

%% shorthand to keep a good structure of the node positions
\fp_new:N\layer_num
\fp_new:N\layerdist_num
\fp_set:Nn\layer_num{0}
\fp_set:Nn\layerdist_num{-1}

\cs_new:Npn\layer{\fp_use:N\layer_num}

%% width of the tooltip-boxes (negative value to make them disappear at all)
\dim_set:Nn\fboxrule{-1mm}

%% to separate important from not-so-important nodes
\bool_new:N\to_short

%% the token list to save all the textviews. When set once, it is reset. May be useful anyhow. Or not.
\tl_set:Nn\to_textviews{}
\NewDocumentCommand\settextviews{}{
  \setcounter{section}{4} %% to enable equal section numbers for both text and tree views
  \to_textviews
  \tl_set:Nn\to_textviews{}
}
\cs_gset:Nn\addtotextviews:f{\tl_gput_right:No\to_textviews{#1}}

%% environment to set the graphs
\NewDocumentCommand\tograph{s+D(){}+m}
{
  \IfBooleanT{#1}{
    \ExplSyntaxOn
    \bool_gset_true:N\to_short
    \ExplSyntaxOff
    #2
    \begin{tikzpicture}
      #3
    \end{tikzpicture}
    \clearpage
  }
  \ExplSyntaxOn
  \bool_gset_false:N\to_short
  \ExplSyntaxOff
  #2
  \begin{tikzpicture}
  	#3
  \end{tikzpicture}
}

%% Style of the nodes: shade from a light 
\tikzstyle{coolnode} = [
	draw=\nodecolor!50!black!70,
	top~color=\nodecolor!10!white!105,
	bottom~color= \nodecolor!50!black!50
]

%% set the first default node style (will change to \distro or \program in the document)
\cs_set_eq:NN\tonodestyle\normalimportant

%% tonode ⇒ tex-overview node, now with better argument specifier
\NewDocumentCommand\tonode{O{\tonodestyle}D(){no label given}D(){no position given}D<>{no description given}m}{

%% test if we are in the short or full view
  \tl_gset:Nn\nodecolor{#1}
  \bool_if:NTF\to_short{
  %% short view
    \tl_if_eq:NNT#1{\vip}{   %% then check if this is an important node
      \node[coolnode] (#2) at (#3) {
	  \href{#4}{\color{black}#5\strut}
      };
    }
  }{
  %% long view
    \node[coolnode] (#2) at (#3) {
	  \href{#4}{\color{black}#5\strut}
    };
  %% and the text view, to be added only once!
  \addtotextviews:f{\subsubsection*{\color{blue}#5}\parbox{\columnwidth}{#4}}
  }
}

%% we want to make use of two pdf layers: the upper (main) one for the nodes
%% and the lower (background) one for the lines. That way, the lines will not cross the nodes
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}

%% the command to draw from one node to the other one. Fine tuning is possible via optional argument #3
\NewDocumentCommand{\todraw}{st{'}t{.}t{-}O{}d()d()}{
  \begin{pgfonlayer}{background}
    %% draw in the case that: either a * is given (always draw) or (' is given and \to_short) or nothing is given
    \bool_if:nT{#1 || (#2 && \to_short) || !(#2 || \to_short)}
      {\draw [thick,gray,\IfBooleanT{#3}{dotted},\IfBooleanT{#4}{dashed},#5] (#6) to (#7);}  %% I’m just loooving expl3!
  \end{pgfonlayer}
}

%% a nice way to control the vertical position of nodes
\NewDocumentCommand{\setlayer}{m}{
  \fp_set:Nn\layer_num{#1}
}
\NewDocumentCommand{\steplayer}{O{\layerdist_num}}{
  \fp_add:Nn\layer_num{#1}
}

\NewDocumentCommand\topart{m}{
%  \clearpage
% \pdfpagewidth is not available in LuaTeX > 0.85. So we skip this gimmick, might come back later.
%%  \dim_set:Nn\pdfpagewidth{9cm}       %% make a smaller paper so the header won’t feel so alone on the big, cold paper
%%  \dim_set:Nn\pdfpageheight{4cm}
%  \newgeometry{margin=1cm}
	\part{#1}
	\newpage
%  \restoregeometry
%%  \dim_set:Nn\pdfpagewidth{21cm}     %% back to a4
%%  \dim_set:Nn\pdfpageheight{29.7cm}
}

%% the following code is made to avoid code doubling on cost of readability. Seems to be stable enough to work here.
%% the first argument, given in (), determines the level (sub/sub/section) of the entry.
% second argument: Short name of the struct for toc
% third argument: Full name of the struct
% forth argument: default node style for this struct. Default for the default is the default style.
\NewDocumentCommand\tostruct{D(){0}omO{\tonodestyle}}{
  \tl_set:Nn\to_disp{section}
  \int_compare:nT{#1 > 0}{\tl_put_left:Nn\to_disp{sub}}
  \int_compare:nT{#1 > 1}{\tl_put_left:Nn\to_disp{sub}}
  \bool_if:NTF\to_short
  {
    \int_compare:nT{#1 = 0}{\stepcounter{section}}
    \tl_gset:cn{\to_disp mand}{\cs:w the\to_disp\cs_end:.\hspace{.175em} #3\newline short~view}
    \IfNoValueTF{#2}{\tl_gset:cn{\to_disp opt}{\tl_use:c{\to_disp mand}}}{\tl_gset:cn{\to_disp opt}{~#2, short~view}}
    \cs:w \to_disp \cs_end:*{\cs:w\to_disp mand\cs_end:}
    \int_compare:nT{#1 = 0}{\addtocounter{section}{-1}}
  }
  {
    \tl_gset:cn{\to_disp mand}{#3}
    \IfNoValueTF{#2}{\tl_gset:cn{\to_disp opt}{\cs:w \to_disp mand\cs_end:}}{\tl_gset:cn{\to_disp opt}{~#2}}
    \addtotextviews:f{\cs:w \to_disp\cs_end:[~#2]{#3}}
    \cs:w \to_disp\cs_end:[\cs:w \to_disp opt\cs_end:]{\cs:w \to_disp mand\cs_end:}
  }
  \cs_gset_eq:NN\tonodestyle#4
}

%% the sectioning of the names table
\NewDocumentCommand\totablesec{m}{
~ \\[-2ex]
  \rowcolor[gray]{0.9}\hspace*{2em}\Large \strut \large\rmfamily #1 \\
 ~ \\[-2ex]
}

%% a command for creation of bib-items.
\NewDocumentCommand\tobibsection{m}{
  \subsection*{#1}
}
\NewDocumentCommand\tobibsubsection{m}{
  \subsection*{#1}
}
\NewDocumentCommand\tobib{mD<>{}O{}}{
  \medskip
\begin{minipage}{\textwidth}  %% to prevent page breaks within bib-items
  \large #1\normalsize\\ \hspace*{1em} \parbox{.95\textwidth}
{\url{#2} #3}
\end{minipage}
}

\ExplSyntaxOff

\AtBeginDocument{
  {
    \centering
    \huge\bfseries An overview of \TeX, its children\\
                             and their friends~\dots
    \vspace*{-.2cm}
    \flushright\parbox{4cm}{
      \large \color[rgb]{0 0 .7} Arno Trautmann\\
      \fontsize{8.25}{10}\selectfont arno.trautmann@gmx.de
    }
    \hspace*{.7cm}\par
  }
  \vspace*{1cm}
}

%% ok, now something just for fun, but I wanted to use this in a "real life" document:
% we first define some Lua functions for drawing and then use them to colorize the corners of the document.
\begin{luacode}
function pdf_print (...)
  for _, str in ipairs({...}) do
    pdf.print(str .. " ")
  end
  pdf.print("\string\n")
end

function move (p)
  pdf_print(p[1],p[2],"m")
end

function line (p)
  pdf_print(p[1],p[2],"l")
end

function curve(p1,p2,p3)
  pdf_print(p1[1], p1[2],
            p2[1], p2[2],
            p3[1], p3[2], "c")
end

function linewidth (w)
  pdf_print(w,"w")
end

function disturb_point(point,strength)
  if strength then else strength = 5 end
  return {point[1] + math.random()*2*strength - strength,
          point[2] + math.random()*2*strength - strength}
end

function sloppyline(start,stop)
  local start_line = disturb_point(start,10)
  local stop_line = disturb_point(stop,10)
  move(start) curve(start_line,stop_line,stop)
  pdf_print("S") -- stroke
end
\end{luacode}

\AtBeginShipout{%
  \AtBeginShipoutUpperLeft{%
	\color[rgb]{0 0 .7}
	\luatexlatelua{
      linewidth(40)
      sloppyline({-30,-30},{30,30})
      sloppyline({620,-30},{560,30})
      sloppyline({-30,-800},{30,-860})
      sloppyline({620,-800},{560,-860})
    }
  }%
}
