\documentclass[a4paper,11pt]{ltxdoc}

\usepackage[utf8]{inputenc}
\usepackage{makeidx}\makeindex
\usepackage{luatextra}
\usepackage[margin=1in]{geometry}

\usepackage{fancyvrb}
\fvset{frame=single,numbers=left,numbersep=3pt,tabsize=4}

\usepackage{tikz}
\usetikzlibrary{math,backgrounds,calc,intersections,arrows.meta,external,decorations.pathreplacing,shadings}
\directlua{dofile('./luatikz.lua')}

\newcommand{\example}[2]
{
\par#2
\VerbatimInput{example/#1.lua}
{\centering
\begin{tikzpicture}[framed,scale=1]
\directlua{dofile('example/#1.lua')tikz.without()}
\end{tikzpicture}\par}
}

\newcommand{\examplecode}[2]
{
\bigskip\par\noindent #2
\VerbatimInput{example/#1.lua}
}


\title{luatikz}
\author{Axel Kittenberger}
\def\version{2.12.0}
\date{luatikz version \version}

\setlength{\parindent}{0pt}
\setlength{\parskip}{1ex}

\begin{document}

\maketitle

\section{Introduction}
Luatikz is a graphics library to draw tikz graphics using the Lua programming language.

\example{intro}
{Following code draws two lines by specifying begin and end points. First using intermediatery variables and the second line within a single codeline:}

Following \TeX{} wrapper can be used to compile the luatikz Lua code.
\VerbatimInput{example/wrapper.tex}

Luatikz obviously needs \LuaLaTeX{} to compile.

Note that 2D graphics is a vast topic, functionality to luatikz has been and will be added on a per need basis.

\section{Pointer math}

Mathematical operations are possible with points, adding them with each other or multiplying them with a scalar.
\example{spiral}{This example uses pointer math to create a spiral:}

\newpage
\section{Immutability}

In luatikz pointers like all objects are immutable. That means a object once created in memory can no longer be changed.
However the variable holding an object can be changed to another object with different attributes.

\examplecode{immute1}{Thus following example is invalid:}
\examplecode{immute2}{This on the other hand are two valid methods to change the value of p1}

\newpage
\section{luatikz objects}

\subsection{Bezier (quatratic)}
\example{bezier2}{A quadratic bezier curve is defined by it begin, end and a control point:}

\newpage
\subsection{Bezier (cubic)}
\example{bezier3a}{A cubic bezier curve is defined by it begin, end and two control points:}

\newpage
A cubic bezier has the functions pt and phit that return the point and angle ranging from 0..1 on the curve.
\example{bezier3b}{This example draw 10 normal lines onto the bezier curve:}

\newpage
\subsection{BLine}
\example{blinea}{A bline is defined by it's begin and it's end. Additionally to the standard line it is bend}

\newpage
\subsection{Circle}
\example{circle}{A circle is defined by it's center (``at'') and the circle ``radius'':}

\newpage
\subsection{Curve}
\example{curvea}{A curve is defined by a list of points:}

\newpage
\example{curveb}{A curve can cycle and has a changeable tension:}

\newpage
\subsection{Ellipse}
\example{ellipse}{An ellipse is difined by it's center (``at'') and a x- and yradius:}

\newpage
\subsection{EllipseArc}
\example{ellipseArc}{An ellipse arc is a an ellipse limited by it's ``from'' and ``to'' angle:}

\newpage
\subsection{Line}
\example{linea}{A line is defined by it's begin and it's end. There are two basic variants to define a line:}

\example{lineb}{You can use intersectLine() to find the intersection of a line with another. If there is none ``nil'' will be returned:}

\newpage
\example{linec}{A line can also be defined by it's starting point, angle and length:}

\example{lined}{``length'' and ``phi'' are attributes of a line:}

\newpage
\subsection{Plot}
\example{plota}{A plot uses a function to determine a series of points on a curve. It takes values going ``from''--``to''. The function is to be a lua function that takes the input scalar and returns a point. The whole curve is offset ``at'' a point:}

%\newpage
%\subsection{SuperEllipse}
%\example{superEllipse}{A ``super'' ellipse is just as an ellipse, but additionally has a strength factor ``n'' that ranges from diamond, to ellipse to rectangle:}

\newpage
\subsection{Polyline}
\example{polylinea}{A polyline is a list of points to be connected via straight lines. If the string ``cycle'' is given at the end, it cycles:}

\newpage
\subsection{Rect}
\example{recta}{Rectangles have various creation options. Also they provide a wide range of attributes of their points ``pnw'', ``pne'',  ``psw'', ``pse'', ``pn'', ``pe'', ``ps'', ``pw'', ``pc'', ``height'', and ``width'':
}

\newpage
\section{Labels a.k.a Nodes}

Labels are created as nodes. Contrary to all other objects they do not need the ``draw'' command to be printed, but the ``put'' command. This is due any call to ``draw'' is turned into exactly one ``draw'' command to tikz and nodes in tikz are not using the ``draw'' command.

\example{nodea}{In it's simplest form a node is specified by it's position and text. The double square brackets are Lua's way to make string constants that may contain simple blackslashes:}

All constructors options of node are as follows; they correspond to the standard tikz options:
\begin{itemize}
	\item above
	\item anchor
	\item align
	\item at
	\item below
	\item color
	\item draw
	\item left
	\item minimum\_height
	\item node\_distance
	\item name
	\item right
	\item rotate
	\item text
	\item text\_width
\end{itemize}
\newpage

\example{nodeb}{Another node example}

\newpage
\section{Styling}

Styling is applied to draw commands by specifying style options, luatikz autodetects the difference between objects and styles.

\example{stylea}{An example using arrows and dashes}

\newpage
\section{Shades}

The ``shade'' command works analogous to classical tikz.

\example{shadea}{For example a ball:}

Recognized shade options are:
\begin{itemize}
	\item ball\_color
	\item left\_color
	\item lower\_left\_color
	\item lower\_right\_color
	\item opacity
	\item right\_color
	\item shading
	\item upper\_left\_color
	\item upper\_right\_color
\end{itemize}

\newpage
\section{Some larger examples}

\subsection{A radon projection}
\example{radon1}{A radon projection, calculating correct projection curves:}

\newpage
\subsection{A sierpiński fractal}
\example{sierpinski}{A sierpiński fractal. This one creates own temporary lua objects:}

\printindex

\end{document}
