% LTeX: language=en

\documentclass[a4paper,english]{article}

\usepackage{xcharter-otf}
\usepackage[left=4cm]{geometry}
\usepackage{xspace}
\usepackage[svgnames]{xcolor}
\usepackage{multicol}
\usepackage{hologo}
\usepackage{listings}
\usepackage{showexpl} % examples
\usepackage{mflogo}
\usepackage{babel}
\usepackage{tikz}
\usepackage{url}
\usepackage{tikz}
\usepackage{luamplib}
\usepackage{siunitx}
\usepackage{accsupp}
\usepackage{pdflscape}
\usepackage{fancyvrb,xparse,xargs}
\usepackage[colorlinks]{hyperref}
\setmonofont{FiraCode-Regular}[
BoldFont=FiraCode-Bold,
Contextuals=Alternate, % Activate the calt feature
Scale=MatchLowercase
]
\usepackage{biblatex}
\usepackage{imakeidx}
\makeindex[title=Index, columns=2]
\usepackage[verbatim]{lstfiracode} % Activate ligatures in verbatim
\usepackage[most]{tcolorbox}
\tcbuselibrary{listings,breakable}
\addbibresource{ctan.bib}
\newcommand\package[1]{\href{https://ctan.org/pkg/#1}{#1}}
\newcommand{\ctan}{\textsc{ctan}}
\newtcolorbox{colourband}[1][]{%
arc=0pt,outer arc=0pt,enhanced, breakable, spread sidewards, left*=0pt, right*=0pt, boxrule=0pt, colback=LightSteelBlue!10, #1}


\definecolor{hellgelb}{rgb}{1,1,0.85}
\definecolor{colKeys}{rgb}{0,0,1}
\definecolor{colIdentifier}{rgb}{0,0,0}
\definecolor{colComments}{rgb}{0.3,0.7,0.3}
\definecolor{colString}{rgb}{0,0.5,0}
\definecolor{mpcode}{rgb}{0.5,0.1,0.1}

\lstset{%
  language=metapost,%
  float=hbp,%
  basicstyle=\ttfamily, %
  identifierstyle=\color{DarkSlateGrey}, %
  keywordstyle=\color{DarkBlue}\itshape, %
  stringstyle=\color{Green}, %
  commentstyle=\color{LightSlateGrey}\itshape, %
  columns=flexible, %
  tabsize=4, %
  extendedchars=true, %
  showspaces=false, %
  showstringspaces=false, %
  numbers=left,
  numbersep=1em,
  numberstyle=\tiny\color{gray}, %
  breaklines=true, %
  breakautoindent=true,
  captionpos=b,
  xleftmargin=0em,
  sensitive=true,
  morekeywords=[10]{},
  keywordstyle=[10]\color{Salmon},
  morekeywords=[7]{draw_axis, 
  draw_grad, 
  draw_legends, 
  draw_line, 
  set_axis_color, 
  set_axis_legends, 
  set_kiviat_unit, 
  set_lattice_color, 
  set_lattice_grid,  set_line_mark, 
  set_line_mark_scale, 
  set_line_mark_type, 
  filldraw_line, 
  set_axis,},
  keywordstyle=[7]\color{FireBrick},
  morekeywords=[8]{},
  keywordstyle=[8]\color{Sienna},
  morekeywords=[9]{},
  keywordstyle=[9]\color{Olive}
}
\lstset{explpreset={pos=t,wide=false,rframe={},preset=\centering}}
\lstdefinestyle{syntax}{backgroundcolor=\color{blue!15},numbers=none,xleftmargin=0pt,xrightmargin=0pt,
  frame=single}
\lstdefinestyle{code}{backgroundcolor=\color{red!15},%numbers=left,
  xleftmargin=0pt,xrightmargin=0pt,
  frame=single}

\newtcblisting{mpcode}{
  arc=0pt,outer arc=0pt,
  colback=mpcode!3,
  breakable,
  boxsep=0pt,left=2pt,right=2pt,top=0pt,bottom=0pt, bottomtitle =
  3pt, toptitle=3pt,
  boxrule=0pt,bottomrule=0.pt,toprule=0.pt, toprule at break =
  0pt, bottomrule at break = 0pt,
  listing only,boxsep=0pt,listing
  options={breaklines}
}


\newtcblisting{commandshell}{colback=black,colupper=white,colframe=black,
  arc=0pt,
  listing only,boxsep=0pt,listing
  options={style=tcblatex,language=sh},
  every listing line={\BeginAccSupp{ActualText={}}\textcolor{red}{\small\ttfamily\bfseries user \$> }}\EndAccSupp{}}

\makeatletter
\tcbset{%
    listing metapost/.code={%
        \def\tcbuselistingtext@input{\begin{mplibcode}
        background:=(.988,.976,.976); input \jobname.listing;
        \end{mplibcode}}%
    }
}
\makeatother
\newtcblisting[auto counter,]{ExempleMP}[1][]{%
  arc=0pt,outer arc=0pt,
  colback=FireBrick!3,
  colframe=FireBrick,
  breakable,fontupper=\small,
  boxsep=0pt,left=2pt,right=2pt,top=0pt,bottom=2pt, bottomtitle =
  3pt, toptitle=3pt, lefttitle=5pt,
  boxrule=0pt,bottomrule=0.5pt,toprule=0.5pt, toprule at break =
  0pt, bottomrule at break = 0pt,
  listing side text,
  listing metapost,
  title={\bfseries\sffamily Exemple~\thetcbcounter},
  listing options={breaklines},#1
}


\newcommand\mpkiviat{\texttt{mpkiviat}\xspace}
\newcommand\fichier[1]{\texttt{#1}}
\newcommand\variableGDD[1]{\texttt{\color{Sienna}#1}}
\newcommand\typeMP[1]{\texttt{\color{Tomato}#1}}
\newcommand\typeGDD[1]{\texttt{\color{Sienna}#1}}
\newcommand\foncGDD[1]{\texttt{\color{Sienna}#1}}

\newenvironment{Note}{
  \noindent\textbf{Note~---~}}
  {}



% 
\colorlet{code}{blue!80!black}
\newcommand\cmd{\texttt}
\newcommand\code[1]{\texorpdfstring{\texttt{\color{code}#1}}{#1}}
\newcommand*\cs[1]{\code{\textbackslash #1}}
\newcommand*\macro{\par\bigskip\noindent\hspace{-30pt}%
    \SaveVerb[aftersave={%
     \UseVerb{Vitem}%
    }%
    ]{Vitem}%
 %   \bigskip
}
\newcommand\vitem[1][]{\SaveVerb[%
    aftersave={\item[\textnormal{\UseVerb[#1]{vsave}}]}]{vsave}}
\newcommand*\textme[1]{\textcolor{black}{\rmfamily\textit{#1}}}
\newcommand*\meta[1]{% % meta
  \textme{\ensuremath{\langle}#1\ensuremath{\rangle}}%
}
\newcommand*\optstar{% % optional star
  \meta{\ensuremath{*}}\xspace
}
\DefineShortVerb{\|}
\setlength{\fboxsep}{2pt}
\fvset{%
    codes={\catcode`\«\active \catcode`\×\active },
    defineactive={\makefancyog\makefancytimes},
    formatcom=\color{FireBrick},
    frame=single
}
% rendre «...» équivalent à \meta{...}
{\catcode`\«\active
  \newcommandx\makefancyog[0][addprefix=\global]{%
    \def«##1»{\meta{##1}}}}
% rendre × équivalent à \optstar
{\catcode`\×\active
  \newcommandx\makefancytimes[0][addprefix=\global]{%
    \def×{\optstar{}}}}
 
\NewDocumentEnvironment{Macro}{ov}{%
\Verb+#2+
}{%
}
\newcommand{\return}[1]{~$\rightarrow$~#1}
\newcommand{\indication}[1]{\hfill(\itshape #1)}

\newcommand{\R}{\mathbf{R}}

\begin{document}
%% === Page de garde ===================================================
\thispagestyle{empty}
\begin{tikzpicture}[remember picture, overlay]
 \node[below right, shift={(-4pt,4pt)}] at (current page.north west) {%
   \includegraphics{fond.pdf}%
 };
\end{tikzpicture}%

\noindent
{\Huge \bfseries \mpkiviat}\\
{\large Package \MP{} to draw Kiviat diagrams}\\[1cm]
\parbox{0.6\textwidth}{
\includegraphics[scale=0.86]{test-2.pdf}
}\hfill
\parbox{0.4\textwidth}{\Large\raggedleft
   \textbf{Contributors}\\
   Maxime \textsc{Chupin}\\
   \url{notezik@gmail.com}
}
\vfill
\begin{center}
Version 0.1, 22th of may 2024\\
\url{https://gitlab.gutenberg-asso.fr/mchupin/mpkiviat}
\end{center}
%% == Page de garde ====================================================
\newpage

\begin{abstract}
  This \hologo{METAPOST} package allows to draw Kiviat diagram (or radar chart,
  web chart, spider chart, etc.).
\end{abstract}

\tableofcontents


\section{Introduction}

\mpkiviat is a package to draw Kiviat diagram (web chart, spider chart, spider
graph, spider web chart, star chart, star plot, cobweb chart, irregular polygon,or
polar chart) with \MP~\cite{ctan-metapost}.

\section{Installation}

\mpkiviat is on \ctan{} and can also be installed via the package manager of
your distribution.

\begin{center}
  \url{https://www.ctan.org/pkg/mpkiviat}
\end{center}


\subsection{With \TeX live under Linux or macOS}

To install \mpkiviat with \TeX Live, you will have to create the directory
\lstinline+texmf+  in your \lstinline+home+. 

\begin{commandshell}
mkdir ~/texmf
\end{commandshell}

Then, you will have to place the \lstinline+mpkiviat.mp+ file in 
\begin{center}
  \lstinline+~/texmf/metapost/mpkiviat/+
\end{center}


Once this is done, \mpkiviat will be loaded with the classic \MP{}
input code
\begin{mpcode}
input mpkiviat
\end{mpcode}

\subsection{With Mik\TeX{} and Windows}

These two systems are unknown to the author of \mpkiviat, so we
refer you to the Mik\TeX documentation concerning the addition of local packages:
\begin{center}
  \url{http://docs.miktex.org/manual/localadditions.html}
\end{center}



\subsection{Dependencies}


\mpkiviat depends, of course on \MP~\cite{ctan-metapost}, as well as the
packages and---if \mpkiviat is not used with
\hologo{LuaLaTeX}~\cite{ctan-lualatex-doc,ctan-luatex} and the
\package{luamplib} or \package{minim-mp}~\cite{ctan-luamplib,ctan-minim-mp} 
packages---the \package{latexmp}~\cite{ctan-latexmp} package. 


\section{Axis and lattice}

\begin{colourband}
  \macro|set_axis(«list of axis names»)|
\medskip

  The \meta{list of axis names} is a list delimited by commas with the names of
  the different axis as \typeMP{string} (e.g.
  \lstinline+"Légumes","Fruits","Produits laitiers"+).
  \index{set_axis@\lstinline+set_axis+}
\end{colourband}

The command to draw the Kiviat background is the following:


\begin{colourband}
  \macro|draw_axis|
  \index{draw_axis@\lstinline+draw_axis+}
\end{colourband}

The combinaison of these two commands produces, for example:
\begin{ExempleMP}[sidebyside=false]
input mpkiviat;
beginfig(1);
set_axis("Légumes","Viande","Lait","Pain","Poissons");
draw_axis;
endfig;
\end{ExempleMP}

By default, legend of each axis are written, but you can avoid that using the
following command:

\begin{colourband}
  \macro|set_axis_legends(«boolean»)|
  \medskip 

  \begin{description}
    \item[\meta{boolean}:] \typeMP{true} or \typeMP{false} 
  \end{description}
  \index{set_axis_legends@\lstinline+set_axis_legends+}
\end{colourband}


Default value for each axis is 10, and there is 10 steps for the lattice. You
can redefine that with the following command that \emph{should be set before the
drawing command} :
\begin{colourband}
  \macro|set_lattice_grid(«unit»,«max»)|
\medskip

  \begin{description}
    \item[\meta{unit}:] (\typeMP{numeric}) is the interval between two lines of the lattice;
    \item[\meta{max}:] (\typeMP{numeric}) is the maximum value for each axis.  
  \end{description}
  \index{set_lattice_grid@\lstinline+set_lattice_grid+}
\end{colourband}

You can print the graduations for the lattice with the following command:
\begin{colourband}
  \macro|draw_grad(«prefix»,«suffix»,«axis number»)|
\medskip

\begin{description}
  \item[\meta{prefix}:] (\typeMP{string}) is a string to add before each graduation;
  \item[\meta{suffix}:] (\typeMP{suffix}) is a string to add after each graduation;
  \item[\meta{axis number}:] (\typeMP{numeric}) is an integer to choose the axis
  used for printing the graduations.   
\end{description}
\index{draw_grad@\lstinline+draw_grad+}
\end{colourband}

\mpkiviat defines a unit that can be modified to scale the entire graph with the
following command (that must be used before the command \lstinline+set_axis+).

\begin{colourband}
  \macro|set_kiviat_unit(«unit»)|
\medskip

\begin{description}
  \item[\meta{unit}:] (\typeMP{string}, default \SI{0.3}{cm}) is the unit to
  draw the graph.   
\end{description}
\index{set_kiviat_unit@\lstinline+set_kiviat_unit+}
\end{colourband}

One can set colors for the axis and the lattice with the two following commands. 


\begin{colourband}
  \macro|set_axis_color(«color»)|
\medskip

  \begin{description}
    \item[\meta{color}:] (\typeMP{color}) is the color for drawing the axis arrows.  
  \end{description}
  \index{set_axis_color@\lstinline+set_axis_color+}
\end{colourband}


\begin{colourband}
  \macro|set_lattice_color(«color»)|
\medskip

  \begin{description}
    \item[\meta{color}:] (\typeMP{color}) is the color for drawing the lattice.  
  \end{description}
  \index{set_lattice_color@\lstinline+set_lattice_color+}
\end{colourband}



The following example illustrates some of the previous commands. 

\begin{ExempleMP}[sidebyside=false]
input mpkiviat;
beginfig(1);
set_kiviat_unit(0.4cm);
set_axis("Légumes","Viande","Lait","Pain","Poissons");
set_axis_color((0.7,0.1,0.1));
set_lattice_color((0.5,0.5,0.9));
set_lattice_grid(100,600);
draw_axis;
draw_grad("","~€",3);
endfig;
\end{ExempleMP}


\section{Add lines}

Once you have drawn the background, you can add lines for your Kiviat diagram. 
The basic command to do that is the following:

\begin{colourband}
  \macro|draw_line(«list of values»)(«color»)|
\medskip

  \begin{description}
    \item[\meta{list of value}:] (list of \typeMP{string}) values for the
    different axis of the Kiviat diagram (e.g. \lstinline+"9","2","3"+). The
    values must match the settings of the lattice. 
    \item[\meta{color}:] (\typeMP{color}) is the color for drawing the line.  
  \end{description}
  \index{draw_line@\lstinline+draw_line+}
\end{colourband}

You can also draw and fill a Kiviat line with the following command:

\begin{colourband}
  \macro|filldraw_line(«list of values»)(«color»)|
\medskip

  \begin{description}
    \item[\meta{list of value}:] (list of \typeMP{string}) values for the
    different axis of the Kiviat diagram (e.g. \lstinline+"9","2","3"+). The
    values must match the settings of the lattice. 
    \item[\meta{color}:] (\typeMP{color}) is the color for drawing the line. The
    filling color is transparent\footnote{Thanks to Anthony Phan \MP{} code : \url{http://www-math.univ-poitiers.fr/~phan/metalpha.html}.}
  \end{description}
  \index{filldraw_line@\lstinline+filldraw_line+}
\end{colourband}

By default, there is mark on a Kiviat line. You can remove marks with the
following command, setting the booelan argument to \lstinline+false+. 



\begin{colourband}
  \macro|set_line_mark(«boolean»)|
\medskip


\begin{description}
  \item[\meta{boolean}:] \typeMP{true} or \typeMP{false} 
\end{description}
  \index{set_line_mark@\lstinline+set_line_mark+}
\end{colourband}

You can also choose the type of mark. \mpkiviat provides three types :
\lstinline+"square"+, by default, \lstinline+"circle"+ and \lstinline+"custom"+.
To choose one of them, you have to use the following command: 
\begin{colourband}
  \macro|set_line_mark_type(«type»)|
\medskip


\begin{description}
  \item[\meta{type}:] (\typeMP{string})  \lstinline+"square"+, by default,
  \lstinline+"circle"+ and \lstinline+"custom"+. 
\end{description}
  \index{set_line_mark_type@\lstinline+set_line_mark_type+}
\end{colourband}

If you choose \lstinline+custom+, you will have to define a macro
\lstinline+line_mark_custom+ that take a \typeMP{pair} as argument and that
define a cycled path shifted around the \typeMP{pair}. For instance, the
\lstinline+line_mark_square+ command is defined as:
\begin{mpcode}
def line_mark_square(expr p)=
  (((-1,-1)--(1,-1)--(1,1)--(-1,1)--cycle scaled _line_mark_scale) shifted p)
enddef;
\end{mpcode}

You can adjust the size of the marks using the following scaling macro:
\begin{colourband}
  \macro|set_line_mark_scale(«scaling factor»)|
\medskip


\begin{description}
  \item[\meta{scaling factor}:] is a \typeMP{numeric} that is, by default, 1. 
\end{description}
  \index{set_line_mark_scale@\lstinline+set_line_mark_scale+}
\end{colourband}

Here is an example that illustrates some of the previous commands. 

\begin{ExempleMP}[sidebyside=false]
input mpkiviat;
beginfig(1);
set_lattice_grid(100,500);
set_kiviat_unit(0.4cm);
set_axis("McCabe","LOC","Live Variables","Halstead N","Variablenspanne");
draw_axis;

filldraw_line(400,300,380,200,250)(red);
set_line_mark_type("circle");
filldraw_line(300,320,180,400,150)(blue);
set_line_mark_type("square");
set_line_mark_scale(2);
filldraw_line(100,420,280,200,50)(green);
endfig;
\end{ExempleMP}

\section{Legends}

\mpkiviat provides the following command to add legends to a Kiviat diagram:

\begin{colourband}
  \macro|draw_legends.«place»(«list of names»)|
\medskip


\begin{description}
  \item[\meta{place}:] is one of the standard \MP{} suffixes :
  empty, \lstinline+lft+, \lstinline+rt+, \lstinline+top+,
  \lstinline+bot+, \lstinline+ulft+, \lstinline+urt+, \lstinline+llft+ and
  \lstinline+lrt+. The legend is placed at the given place of the bounding box
  of the complete Kiviat diagram (without the legend). If it is empty, the
  default place is \lstinline+rt+. 
  \item[\meta{list of names}:] is the list of \typeMP{string} of names for the
  different lines in the order of the construction.   
\end{description}
  \index{draw_legends@\lstinline+draw_legends+}
\end{colourband}

\begin{ExempleMP}[sidebyside=false]
input mpkiviat;
beginfig(1);
set_lattice_grid(100,500);
set_kiviat_unit(0.4cm);
set_axis("McCabe","LOC","Live Variables","Halstead N","Variablenspanne");
draw_axis;

filldraw_line(400,300,380,200,250)(red);
set_line_mark_type("circle");
filldraw_line(300,320,180,400,150)(blue);
set_line_mark_type("square");
set_line_mark_scale(2);
filldraw_line(100,420,280,200,50)(green);
draw_legends.lrt("Première", "Deuxième", "Troisième");
endfig;
\end{ExempleMP}

\printbibliography
\printindex

\end{document}
