summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-11-07 03:02:46 +0000
committerNorbert Preining <norbert@preining.info>2023-11-07 03:02:46 +0000
commit02646b6e89ef69971235e0c883e86fd746955e2b (patch)
tree203df1a9b40b37e9452e03d936e392da7d03c7af /graphics/pgf/contrib
parent240fd5fe8af67337e240c10434af4834fc86278f (diff)
CTAN sync 202311070302
Diffstat (limited to 'graphics/pgf/contrib')
-rw-r--r--graphics/pgf/contrib/polyhedra/README.md19
-rw-r--r--graphics/pgf/contrib/polyhedra/polyhedra-doc.pdfbin0 -> 183790 bytes
-rw-r--r--graphics/pgf/contrib/polyhedra/polyhedra-doc.tex418
-rw-r--r--graphics/pgf/contrib/polyhedra/polyhedra.sty577
4 files changed, 1014 insertions, 0 deletions
diff --git a/graphics/pgf/contrib/polyhedra/README.md b/graphics/pgf/contrib/polyhedra/README.md
new file mode 100644
index 0000000000..6a64479e05
--- /dev/null
+++ b/graphics/pgf/contrib/polyhedra/README.md
@@ -0,0 +1,19 @@
+# polyhedra.sty
+A tikz package for drawing polyhedra
+
+Copyright 2015-2023 Zafeirakis Zafeirakopoulos
+zafeirakopoulos@gmail.com
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Zafeirakis Zafeirakopoulos.
+
+This work consists of the files polyhedra.sty and polyhedra-doc.tex. \ No newline at end of file
diff --git a/graphics/pgf/contrib/polyhedra/polyhedra-doc.pdf b/graphics/pgf/contrib/polyhedra/polyhedra-doc.pdf
new file mode 100644
index 0000000000..1b956e586d
--- /dev/null
+++ b/graphics/pgf/contrib/polyhedra/polyhedra-doc.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/polyhedra/polyhedra-doc.tex b/graphics/pgf/contrib/polyhedra/polyhedra-doc.tex
new file mode 100644
index 0000000000..c37a67a0c8
--- /dev/null
+++ b/graphics/pgf/contrib/polyhedra/polyhedra-doc.tex
@@ -0,0 +1,418 @@
+\documentclass[a4paper]{article}
+\usepackage{listings}
+
+\usepackage{polyhedra}
+
+\begin{document}
+
+\lstset{language=[LaTeX]{TeX}}
+
+\lstset{
+basicstyle=\small\sffamily,
+backgroundcolor=\color{gray!20},
+%numbers=left,
+numberstyle=\tiny,
+breaklines=true,
+%frame=l,
+xleftmargin=\parindent,
+columns=fullflexible,
+showstringspaces=false,
+keywordstyle=\bfseries\color{solarized-green},
+commentstyle=\color{black!50},
+identifierstyle=\color{solarized-blue},
+stringstyle=,
+escapeinside={(*}{*)}
+}
+
+
+\title{Polyhedra \LaTeX\ package - v. 0.3}
+\author{Zafeirakis zafeirakopoulos}
+\maketitle
+\begin{abstract}
+This package provides macros for creating polyhedral objects in 2D and 3D.
+It requires tikz and tikz-3dplot.
+The macros provided can be used for drawing vertices, edges, rays, polygons and
+cones.
+\end{abstract}
+
+\section{Introduction}
+
+
+All the drawing commands work with keyword arguments and are the same in
+2d and 3D.
+
+
+
+\section{Functionality}
+
+\subsection{The \emph{polyhedron} environment}
+
+The \emph{polyhedron} environment is essentially a wrapper for a tikzpicture
+environment.
+It accepts as extra arguments the dimension of the picture (either $2$ or $3$)
+and if the dimension is $3$, then the arguments for the three angles defining
+the rotated coordinate system are given.
+For the 3D coordinate system, we use tikz-plot3d.
+
+\begin{center}
+ \begin{minipage}{0.6\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{dim=2}
+ \axes{x={1,3},y={1,3}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \qquad\qquad
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{dim=2}
+ \axes{x={1,3},y={1,3}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+The dimension argument defaults to $2$.
+
+
+\begin{center}
+ \begin{minipage}{0.6\textwidth}
+ \begin{lstlisting}
+ \begin{polyhedron}{}
+ \axes{x={1,3},y={1,3}}
+ \end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \qquad\qquad
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \axes{x={1,3},y={1,3}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+Let us define a 3D polyhedron.
+
+\begin{center}
+ \begin{minipage}{0.6\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{dim=3}
+ \axes{x={1,3},y={1,3},z={1,3}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \qquad\qquad
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{dim=3}
+ \axes{x={1,3},y={1,3},z={1,3}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+Since we did not give the angles for the main coordinate system, we get the
+default tikz $xy$-plane.
+
+Now lets rotate the coordinate system by 60 degrees around the $x$-axis and
+120 degrees around the $z$-axis.
+
+\begin{center}
+ \begin{minipage}{0.6\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{dim=3,phi=60,theta=120}
+ \axes{x={1,3},y={1,3},z={1,3}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \qquad\qquad
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{dim=3,phi=60,theta=120}
+ \axes{x={1,3},y={1,3},z={1,3}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+\subsection{Input}
+
+The following macros work within the \texttt{polyhedron} environment.
+
+\subsubsection{Point.} To let A be a point (x,y) or (x,y,z)
+\begin{lstlisting}
+\point{(x,y,z)}{A}
+\end{lstlisting}
+After defining a point, we can use the handle (variable name) A, instead of
+writing down the coordinates in the macros that follow.
+
+
+\subsubsection{Axes.}
+
+We saw already some examples using the \emph{axes} command.
+
+\begin{center}
+ \begin{minipage}{0.6\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{dim=3,phi=60,theta=120}
+ \axes{x={1,3},y={1,3},z={1,3}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \qquad\qquad
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{dim=3,phi=60,theta=120}
+ \axes{x={1,3},y={1,3},z={1,3}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+The command takes the following (self-explanatory) arguments.
+All arguments are optional, defaulting to the ones shown here.
+
+\begin{lstlisting}
+x={0,1},y={0,1},z={},xlabel={x},ylabel={y},zlabel={z},labels={true}
+\end{lstlisting}
+
+
+
+\begin{center}
+ \begin{minipage}{0.6\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{dim=3,phi=60,theta=120}
+ \axes{x={1,3},z={1,3},zlabel={not z}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \qquad\qquad
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{dim=3,phi=60,theta=120}
+ \axes{x={1,3},z={1,3},zlabel={not z}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+
+\subsection{Drawing commands}
+
+All drawing commands accept the following options:
+\begin{description}
+ \item[color] The color of the polyhedral object to draw.
+ \item[status] The status of the object. The possible values are:
+ \begin{itemize}
+ \item normal
+ \item focus
+ \item alert
+ \item open
+ \end{itemize}
+ \item[opacity] The opacity of the object.
+ \item[thickness] The width of the lines
+ \item[pattern] The draw pattern
+\end{description}
+
+\subsubsection{Vertex}
+
+The \emph{vertex} command is used to draw a vertex at a point (x,y,z) or A.
+The standard options of color, status, opacity, thickness and pattern apply.
+The extra options for vertex are:
+\begin{description}
+ \item[point] sets the coordinates of the vertex and it can be either a tikz
+ coordinate tuple or a point already defined.
+ \item[text] The text of the vertex label.
+ \item[textcolor] The color of the label's text.
+ \item[anchora] The label anchor relative to the vertex: north, south, east,
+ west
+ \item[anchorb] The text's anchor relative to the label: above, below, right,
+ left
+\end{description}
+
+
+\begin{center}
+ \begin{minipage}{0.7\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{}
+ \vertex{point={0,0},status=normal}
+ \vertex{point={1,0},status=alert}
+ \vertex{point={2,0},status=open}
+ \vertex{point={3,0},color=red,pattern={north west lines}}
+ \vertex{point={4,0},color=orange,text={A}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \hskip 2em
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \vertex{point={0,0},status=normal}
+ \vertex{point={1,0},status=alert}
+ \vertex{point={2,0},status=open}
+ \vertex{point={3,0},color=red,pattern={north west lines}}
+ \vertex{point={4,0},color=orange,text={A}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+
+\subsubsection{Edges and Rays} The command \emph{edge} is used to draw an
+edge from point A to point B.
+The extra arguments are:
+\begin{description}
+ \item[points] sets the coordinates of the vertices of the edge. It is a list
+of (two) points in \{\}.
+\end{description}
+
+
+\begin{center}
+ \begin{minipage}{0.7\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{}
+ \edge{points={(0,0),(2,2)},status=alert}
+ \edge{points={(0,0),(2,3)},status=focus}
+ \edge{points={(0,0),(2,4)},status=open}
+ \edge{points={(0,0),(2,5)},color=orange}
+ \edge{points={(0,0),(2,6)},status=normal}
+ \edge{points={(2,1),(3,3)},thickness=3}
+ \edge{points={(4,1),(3,3)},pattern={dotted}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \hskip 2em
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \edge{points={(0,0),(2,2)},status=alert}
+ \edge{points={(0,0),(2,3)},status=focus}
+ \edge{points={(0,0),(2,4)},status=open}
+ \edge{points={(0,0),(2,5)},color=orange}
+ \edge{points={(0,0),(2,6)},status=normal}
+ \edge{points={(2,1),(3,3)},thickness=3}
+ \edge{points={(4,1),(3,3)},pattern={dotted}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+Similarly, the command \emph{ray} draw a ray.
+The options are exactly the same as for edge.
+Note that the sequence in which the points are given matters.
+\begin{center}
+ \begin{minipage}{0.7\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{}
+ \ray{points={(0,0),(2,2)},status=alert}
+ \ray{points={(0,0),(2,3)},status=focus}
+ \ray{points={(0,0),(2,4)},status=open}
+ \ray{points={(0,0),(2,5)},color=orange}
+ \ray{points={(0,0),(2,6)},status=normal}
+ \ray{points={(2,1),(3,3)},thickness=3}
+ \ray{points={(4,1),(3,3)},pattern={dotted}}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \hskip 2em
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \ray{points={(0,0),(2,2)},status=alert}
+ \ray{points={(0,0),(2,3)},status=focus}
+ \ray{points={(0,0),(2,4)},status=open}
+ \ray{points={(0,0),(2,5)},color=orange}
+ \ray{points={(0,0),(2,6)},status=normal}
+ \ray{points={(2,1),(3,3)},thickness=3}
+ \ray{points={(4,1),(3,3)},pattern={dotted}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+\subsubsection{Cone}
+
+The command \emph{cone} is used to draw a polyhedral cone.
+The extra arguments are:
+\begin{description}
+ \item[vertex] Sets the apex of the cone.
+ \item[generators] A list of points
+ \item[openeness] A list of boolean values declaring the openness of a
+ simplicial cone.
+\end{description}
+
+
+\begin{center}
+ \begin{minipage}{0.7\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{}
+ \cone{vertex={(0,0)}, generators={(0,2),(2,2)},
+ status=alert}
+ \cone{vertex={(0,0)}, generators={(2,0),(2,-2)},
+ status=focus}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \hskip 2em
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \cone{vertex={(0,0)}, generators={(0,2),(2,2)},status=alert}
+ \cone{vertex={(0,0)}, generators={(2,0),(2,-2)},status=focus}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+\begin{center}
+ \begin{minipage}{0.7\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{}
+ \cone{vertex={(0,0)}, generators={(2,0),(2,-2)},
+ status=focus}
+ \cone{vertex={(3,2)},generators={(0,0),(2,-1)},
+ pattern={north east lines}}
+\end{polyhedron}
+\end{lstlisting}
+ \end{minipage}
+ \hskip 2em
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \cone{vertex={(0,0)}, generators={(2,0),(2,-2)},status=focus}
+ \cone{vertex={(3,2)},generators={(0,0),(2,-1)},pattern={north east lines}}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+
+\subsubsection{Polygon}
+
+The command \emph{polygon} is used to draw a 2-dimensional polytope in 2D or 3D.
+Attention must be paid in the sequence of the points given.
+The command does not take the convex hull, but rather draws the polygonal
+line defined by the sequence of points.
+
+The extra arguments are:
+\begin{description}
+ \item[points] The vertices of the cone.
+ \item[boundary] True or False, for drawing or not the boundary of the polygon.
+\end{description}
+
+
+\begin{center}
+ \begin{minipage}{0.7\textwidth}
+ \begin{lstlisting}
+\begin{polyhedron}{}
+ \polygon{points={(0,2),(2,2),(2,0)},status=alert}
+ \polygon{points={(0,-2),(-2,-2),(-2,0)},status=open}
+ \polygon{points={(0,1),(0,0),(1,0),(1,1)},status=open,
+ boundary=false,color=orange}
+\end{polyhedron}
+ \end{lstlisting}
+ \end{minipage}
+ \hskip 2em
+ \begin{minipage}{0.2\textwidth}
+ \begin{polyhedron}{}
+ \polygon{points={(0,2),(2,2),(2,0)},status=alert}
+ \polygon{points={(0,-2),(-2,-2),(-2,0)},status=open}
+\polygon{points={(0,1),(0,0),(1,0),(1,1)},status=open,boundary=false,
+color=orange}
+ \end{polyhedron}
+ \end{minipage}
+\end{center}
+
+
+
+\section{Known limitations and errors}
+
+
+\end{document}
diff --git a/graphics/pgf/contrib/polyhedra/polyhedra.sty b/graphics/pgf/contrib/polyhedra/polyhedra.sty
new file mode 100644
index 0000000000..2f2ea0f9b8
--- /dev/null
+++ b/graphics/pgf/contrib/polyhedra/polyhedra.sty
@@ -0,0 +1,577 @@
+% % polyhedra.sty
+% % polyhedra LaTeX package
+% % Copyright 2015-2023 Zafeirakis Zafeirakopoulos
+% % zafeirakopoulos@gmail.com
+
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+
+% This work has the LPPL maintenance status `maintained'.
+
+% The Current Maintainer of this work is Zafeirakis Zafeirakopoulos.
+
+% This work consists of the files polyhedra.sty and polyhedra-doc.tex.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Identification %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{polyhedra}[2023/10/31 v.0.3 Polyhedra LaTeX package]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Required Packages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{xcolor,xcolor-solarized}
+\RequirePackage{tikz,tikz-3dplot}
+\RequirePackage{xparse,xstring}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Tikz setup %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\usetikzlibrary{shapes}
+\usetikzlibrary{patterns}
+\usetikzlibrary{arrows}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Package Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\DeclareOption*{\PackageWarning{Polyhedra}{Unknown ‘\CurrentOption’}}
+\ProcessOptions\relax
+
+% \PackageWarningNoLine{Polyhedra}{Solarized Color Scheme used}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default Options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default Sizes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\PolyhedraDefaultHeight}{0.5\textheight}
+\newcommand{\PolyhedraDefaultWidth}{0.5\textwidth}
+\newcommand{\PolyhedraDefaultScale}{0.6}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default Colors %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcommand{\VertexColor}{solarized-blue}
+\newcommand{\VertexTextColor}{black}
+
+\newcommand{\EdgeColor}{solarized-blue}
+\newcommand{\RayColor}{solarized-cyan}
+\newcommand{\PolygonColor}{solarized-blue}
+\newcommand{\HalfspaceColor}{gray}
+
+\newcommand{\AlertColor}{solarized-red}
+\newcommand{\FocusColor}{solarized-green}
+\newcommand{\intersectionColor}{solarized-base2}
+\newcommand{\OpenColor}{solarized-base2}
+
+\newcommand{\ShadeColor}{gray}
+
+\newcommand{\OpenPolygonPattern}{north east lines}
+\newcommand{\OpenHyperplanePattern}{north west lines}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default Thickness %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newcommand{\VertexThickness}{2}
+\newcommand{\RayThickness}{1}
+\newcommand{\EdgeThickness}{1}
+
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Graphics Commands %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Environments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter
+\define@key{polyhedron}{dim}{\def\mm@dim{#1}}
+\define@key{polyhedron}{phi}{\def\mm@phi{#1}}
+\define@key{polyhedron}{theta}{\def\mm@theta{#1}}
+\DeclareDocumentEnvironment{polyhedron}{m}
+{
+ \setkeys{polyhedron}{
+dim={2},
+phi={0},
+theta={0},
+,#1 } %
+ \ifthenelse{\equal{\mm@dim}{3}}
+ {
+ \tdplotsetmaincoords{\mm@phi}{\mm@theta}
+ \begin{tikzpicture}[scale=\PolyhedraDefaultScale,tdplot_main_coords]
+ }{
+ \begin{tikzpicture}[scale=\PolyhedraDefaultScale]
+ }
+}
+{
+ \end{tikzpicture}
+}
+\makeatother
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%% Macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+
+
+\def\splicelist#1{
+\StrCount{#1}{,}[\numofelem]
+\ifnum\numofelem>0\relax
+ \StrBefore[1]{#1}{,}[\myhead]%
+ \StrBehind[\numofelem]{#1}{,}[\mylast]%
+\else
+ \let\myhead#1%
+ \let\mylast#1%
+\fi
+}
+
+
+\newcommand{\point}[2]{
+ \coordinate (#2) at #1;
+}
+
+
+
+\makeatletter
+
+
+\define@key{vertex}{color}{\def\mm@color{#1}}
+\define@key{vertex}{status}{\def\mm@status{#1}}
+\define@key{vertex}{opacity}{\def\mm@opacity{#1}}
+\define@key{vertex}{thickness}{\def\mm@thickness{#1}}
+\define@key{vertex}{pattern}{\def\mm@pattern{#1}}
+
+\define@key{vertex}{point}{\def\mm@point{#1}}
+
+\define@key{vertex}{text}{\def\mm@text{#1}}
+\define@key{vertex}{textcolor}{\def\mm@textcolor{#1}}
+\define@key{vertex}{anchora}{\def\mm@anchora{#1}}
+\define@key{vertex}{anchorb}{\def\mm@anchorb{#1}}
+\DeclareDocumentCommand{\vertex}{m}{%
+\begingroup%
+\setkeys{vertex}{
+color=\VertexColor,
+opacity={1},
+thickness=\VertexThickness,
+point={(0,0)},
+status={normal},
+pattern={},
+text={},
+anchora={north},
+anchorb={above}
+,#1 } %
+\ifthenelse{\equal{\mm@status}{normal}}{\def\fillcolor{\mm@color}}{
+\ifthenelse{\equal{\mm@status}{intesection}}{\def\fillcolor{\IntersectionColor}}
+{
+\ifthenelse{\equal{\mm@status}{alert}}{\def\fillcolor{\AlertColor}}{
+\ifthenelse{\equal{\mm@status}{focus}}{\def\fillcolor{\FocusColor}}{
+\ifthenelse{\equal{\mm@status}{open}}{\def\fillcolor{\OpenColor}}{
+ \def\fillcolor{\mm@color}
+}}}}}
+
+\StrLeft{\mm@point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\mm@point}}{\def\thepoint{(
+\mm@point)}}
+\ifthenelse{\equal{\mm@text}{}}{\def\thelabel{}}
+{\def\thelabel{label={[anchor=\mm@anchora]\mm@anchorb: \mm@text}}}
+ \xdef\drawcom{
+ node[draw,circle,
+ color=\mm@color,
+ inner sep=\mm@thickness pt,
+ fill=\fillcolor,
+ pattern=\mm@pattern,
+ pattern color=\mm@color,
+ opacity=\mm@opacity,
+ \thelabel
+ ]
+ at \thepoint {} ;
+ }
+ \draw \drawcom
+ \endgroup%
+}
+
+\define@key{ray}{color}{\def\mm@color{#1}}
+\define@key{ray}{opacity}{\def\mm@opacity{#1}}
+\define@key{ray}{thickness}{\def\mm@thickness{#1}}
+\define@key{ray}{status}{\def\mm@status{#1}}
+\define@key{ray}{pattern}{\def\mm@pattern{#1}}
+
+\define@key{ray}{points}{\def\mm@points{#1}}
+ \DeclareDocumentCommand{\ray}{m}{%
+\begingroup%
+\setkeys{ray}{
+color=\RayColor,
+opacity={1},
+thickness=\RayThickness,
+points={(0,0)},
+status={normal},
+pattern={},
+ ,#1 } %
+ \xdef\raypattern{\mm@pattern}
+
+\ifthenelse{\equal{\mm@status}{normal}}{\xdef\rcolor{\mm@color}}{
+\ifthenelse{\equal{\mm@status}{intesection}}{\xdef\rcolor{\IntersectionColor}
+}
+{
+ \ifthenelse{\equal{\mm@status}{alert}}{\xdef\rcolor{\AlertColor}}{
+ \ifthenelse{\equal{\mm@status}{open}}{\xdef\raypattern{dashed}\xdef\rcolor{
+\mm@color}}{
+
+ \ifthenelse{\equal{\mm@status}{focus}}{\xdef\rcolor{\FocusColor}}{
+ \xdef\rcolor{\mm@color}
+}}}}}
+
+ \gdef\drawcom{
+ [->, color=\rcolor,
+ line width=\mm@thickness,
+ opacity=\mm@opacity,
+ \raypattern]
+ }
+ \foreach \point [count=\xi] in \mm@points{
+ \StrLeft{\point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\point}}{\def\thepoint{(
+\point)}}
+ \ifnum\xi=1
+ \xdef\drawcom{\drawcom \thepoint}
+ \else
+ \xdef\drawcom{\drawcom -- \thepoint}
+ \fi
+ }
+ \xdef\drawcom{\drawcom ;}
+ \draw \drawcom
+ \endgroup%
+}
+
+
+\define@key{edge}{color}{\def\mm@color{#1}}
+\define@key{edge}{opacity}{\def\mm@opacity{#1}}
+\define@key{edge}{thickness}{\def\mm@thickness{#1}}
+\define@key{edge}{status}{\def\mm@status{#1}}
+\define@key{edge}{pattern}{\def\mm@pattern{#1}}
+\define@key{edge}{points}{\def\mm@points{#1}}
+\DeclareDocumentCommand{\edge}{m}{%
+\begingroup%
+\setkeys{edge}{
+color=\EdgeColor,
+opacity={1},
+thickness=\EdgeThickness,
+points={(0,0)},
+status={normal},
+pattern={},
+,#1 } %
+\xdef\edgepattern{\mm@pattern}
+\ifthenelse{\equal{\mm@status}{normal}}{\xdef\rcolor{\mm@color}}{
+\ifthenelse{\equal{\mm@status}{intesection}}{\xdef\rcolor{\IntersectionColor}
+}
+{
+ \ifthenelse{\equal{\mm@status}{alert}}{\xdef\rcolor{\AlertColor}}{
+
+\ifthenelse{\equal{\mm@status}{open}}{\xdef\edgepattern{dashed}\xdef\rcolor{
+\mm@color}}{
+
+ \ifthenelse{\equal{\mm@status}{focus}}{\xdef\rcolor{\FocusColor}}{
+ \xdef\rcolor{\mm@color}
+}}}}}
+
+ \gdef\drawcom{
+ [color=\rcolor,
+ line width=\mm@thickness,
+ opacity=\mm@opacity,
+ \edgepattern]
+ }
+ \foreach \point [count=\xi] in \mm@points{
+ \StrLeft{\point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\point}}{\def\thepoint{(
+\point)}}
+ \ifnum\xi=1
+ \xdef\drawcom{\drawcom \thepoint}
+ \else
+ \xdef\drawcom{\drawcom -- \thepoint}
+ \fi
+ }
+ \xdef\drawcom{\drawcom ;}
+ \draw \drawcom
+ \endgroup%
+}
+
+
+\define@key{polygon}{color}{\def\mm@color{#1}}
+\define@key{polygon}{status}{\def\mm@status{#1}}
+\define@key{polygon}{pattern}{\def\mm@pattern{#1}}
+\define@key{polygon}{opacity}{\def\mm@opacity{#1}}
+\define@key{polygon}{thickness}{\def\mm@thickness{#1}}
+
+\define@key{polygon}{points}{\def\mm@points{#1}}
+\define@key{polygon}{boundary}{\def\mm@boundary{#1}}
+\DeclareDocumentCommand{\polygon}{m}{%
+\begingroup%
+ \setkeys{polygon}{color=\PolygonColor,opacity={1},thickness={1},
+points={(0,0)},status={normal},pattern={},boundary={true},#1 } %
+
+\xdef\polygonpattern{\mm@pattern}
+\ifthenelse{\equal{\mm@status}{normal}}{\xdef\rcolor{\mm@color}}{
+\ifthenelse{\equal{\mm@status}{intesection}}{\xdef\rcolor{\IntersectionColor}
+}
+{
+ \ifthenelse{\equal{\mm@status}{alert}}{\xdef\rcolor{\AlertColor}}{
+
+\ifthenelse{\equal{\mm@status}{open}}{\xdef\polygonpattern{\OpenPolygonPattern}
+\xdef\rcolor {
+\mm@color}}{
+
+ \ifthenelse{\equal{\mm@status}{focus}}{\xdef\rcolor{\FocusColor}}{
+ \xdef\rcolor{\mm@color}
+}}}}}
+
+\ifthenelse{\equal{\mm@boundary}{true}}
+{\def\bounddraw{draw=\rcolor}}
+{\def\bounddraw{draw=none}}
+
+ \gdef\drawcom{
+ [\bounddraw,
+ line width=\mm@thickness,
+ fill=\rcolor,
+ opacity=\mm@opacity,
+ pattern=\polygonpattern,
+ pattern color=\rcolor
+ ]
+ }
+ \foreach \point [count=\xi] in \mm@points{
+ \StrLeft{\point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\point}}{\def\thepoint{(
+\point)}}
+ \ifnum\xi=1
+ \xdef\drawcom{\drawcom \thepoint}
+ \else
+ \xdef\drawcom{\drawcom -- \thepoint}
+ \fi
+ }
+ \xdef\drawcom{\drawcom -- cycle ;}
+ \draw \drawcom
+ \endgroup%
+}
+
+
+\define@key{halfspace}{color}{\def\mm@color{#1}}
+\define@key{halfspace}{opacity}{\def\mm@opacity{#1}}
+\define@key{halfspace}{thickness}{\def\mm@thickness{#1}}
+\define@key{halfspace}{points}{\def\mm@points{#1}}
+\define@key{halfspace}{status}{\def\mm@status{#1}}
+\define@key{halfspace}{pattern}{\def\mm@pattern{#1}}
+\define@key{halfspace}{patterncolor}{\def\mm@patterncolor{#1}}
+\DeclareDocumentCommand{\halfspace}{m}{%
+\begingroup%
+ \setkeys{halfspace}{color=blue,opacity={0.7},thickness={1},
+points={(0,0)},status={normal},pattern={north west
+lines},patterncolor={\HalfspaceColor}
+,#1 } %
+ \gdef\drawcom{
+ [draw=none,color=\mm@color,
+ line width=\mm@thickness,
+ fill=\mm@color,
+ opacity=\mm@opacity,
+ pattern=\mm@pattern,
+ pattern color=\mm@patterncolor
+ ]
+ }
+ \foreach \point [count=\xi] in \mm@points{
+ \StrLeft{\point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\point}}{\def\thepoint{(
+\point)}}
+ \ifnum\xi=1
+ \xdef\drawcom{\drawcom \thepoint}
+ \else
+ \xdef\drawcom{\drawcom -- \thepoint}
+ \fi
+ }
+ \xdef\drawcom{\drawcom -- cycle ;}
+ \draw \drawcom
+ \endgroup%
+}
+
+
+
+\define@key{cone}{color}{\def\mm@color{#1}}
+\define@key{cone}{opacity}{\def\mm@opacity{#1}}
+\define@key{cone}{thickness}{\def\mm@thickness{#1}}
+\define@key{cone}{status}{\def\mm@status{#1}}
+\define@key{cone}{pattern}{\def\mm@pattern{#1}}
+
+\define@key{cone}{generators}{\def\mm@generators{#1}}
+\define@key{cone}{vertex}{\def\mm@vertex{#1}}
+\DeclareDocumentCommand{\cone}{m}{%
+\begingroup%
+ \setkeys{cone}{color=solarized-blue,opacity={1},thickness={1},
+ vertex={(0,0)},generators={(0,0)},status={normal},pattern={north west
+lines},#1 } %
+
+\ifthenelse{\equal{\mm@status}{normal}}{\xdef\rcolor{\mm@color}}{
+\ifthenelse{\equal{\mm@status}{intesection}}{\xdef\rcolor{\IntersectionColor}
+}
+{
+ \ifthenelse{\equal{\mm@status}{alert}}{\xdef\rcolor{\AlertColor}}{
+ \ifthenelse{\equal{\mm@status}{focus}}{\xdef\rcolor{\FocusColor}}{
+ \xdef\rcolor{\mm@color}
+}}}}
+
+ \gdef\drawcom{
+ [->,color=\rcolor,
+ line width=\mm@thickness,
+ fill=\rcolor,
+ opacity=\mm@opacity]
+ }
+
+ \StrLeft{\mm@vertex}{1}[\firstletter]
+ \ifthenelse{\equal{\firstletter}{(}}
+ {\def\thevertex{\mm@vertex}}
+ {\def\thevertex{(\mm@vertex)}}
+
+ \gdef\previouspoint{\thevertex}
+
+ \foreach \point in \mm@generators{
+ \StrLeft{\point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\point}}{\def\thepoint{(
+\point)}}
+
+ \node (xxxxO) at \thevertex {}; % Possible to add generator labels
+ \node (xxxxA) at \thepoint {}; % Possible to add generator labels
+ \coordinate (xxxxB) at ($(xxxxO)!1.5!(xxxxA)$);
+ \draw [dashed,color=\rcolor] \thevertex -- (xxxxB) ;
+ \draw \drawcom \thevertex -- (xxxxA) ;
+ \ifthenelse{\equal{\previouspoint}{\thevertex}}{}
+ {
+ \node (xxxxC) at \previouspoint {}; % Possible to add generator labels
+ \draw [draw=none,pattern color=\rcolor,pattern=\mm@pattern,opacity=0.6]
+ \thevertex -- ($(xxxxO)!1.3!(xxxxC)$) --
+($(xxxxO)!1.3!(xxxxA)$) ; }
+ \xdef\previouspoint{\thepoint}
+
+}
+\endgroup%
+}
+
+
+
+
+\define@key{axes}{x}{\def\mm@x{#1}}
+\define@key{axes}{y}{\def\mm@y{#1}}
+\define@key{axes}{z}{\def\mm@z{#1}}
+\define@key{axes}{xlabel}{\def\mm@xlabel{#1}}
+\define@key{axes}{ylabel}{\def\mm@ylabel{#1}}
+\define@key{axes}{zlabel}{\def\mm@zlabel{#1}}
+\define@key{axes}{labels}{\def\mm@labels{#1}}
+\DeclareDocumentCommand{\axes}{m}{%
+\begingroup%
+
+\setkeys{axes}{x={0,1},y={0,1},z={},xlabel={x},ylabel={y},zlabel={z},labels={
+true} , #1 } %
+
+ \splicelist{\mm@x}
+ \ifthenelse{\equal{\mm@z}{}}{
+ \coordinate (Origin) at (0,0);
+ \splicelist{\mm@x}
+ \coordinate (XAxisMin) at (-\myhead,0);
+ \coordinate (XAxisMax) at (\mylast,0);
+ \coordinate (XLabel) at (\mylast +0.3,0,0);
+
+ \splicelist{\mm@y}
+ \coordinate (YAxisMin) at (0,-\myhead);
+ \coordinate (YAxisMax) at (0,\mylast);
+ \coordinate (YLabel) at (0,\mylast +0.3,0);
+
+ \draw [thin, gray,-latex] (XAxisMin) -- (XAxisMax) ;% Draw x axis
+ \draw [thin, gray,-latex] (YAxisMin) -- (YAxisMax);% Draw y axis
+ \ifthenelse{\equal{\mm@labels}{no}}{}{
+ \node at (XLabel) {\mm@xlabel};
+ \node at (YLabel) {\mm@ylabel};
+ }
+
+ }{
+ \coordinate (Origin) at (0,0);
+ \splicelist{\mm@x}
+ \coordinate (XAxisMin) at (-\myhead,0);
+ \coordinate (XAxisMax) at (\mylast,0);
+ \coordinate (XLabel) at (\mylast +0.3,0,0);
+
+ \splicelist{\mm@y}
+ \coordinate (YAxisMin) at (0,-\myhead);
+ \coordinate (YAxisMax) at (0,\mylast);
+ \coordinate (YLabel) at (0,\mylast +0.3,0);
+
+ \splicelist{\mm@z}
+ \coordinate (ZAxisMin) at (0,0,-\myhead);
+ \coordinate (ZAxisMax) at (0,0,\mylast);
+ \coordinate (ZLabel) at (0,0,\mylast +0.3);
+
+ \draw [thin, gray,-latex] (XAxisMin) -- (XAxisMax) ;% Draw x axis
+ \draw [thin, gray,-latex] (YAxisMin) -- (YAxisMax);% Draw y axis
+ \draw [thin, gray,-latex] (ZAxisMin) -- (ZAxisMax);% Draw z axis
+ \ifthenelse{\equal{\mm@labels}{no}}{}{
+ \node at (XLabel) {\mm@xlabel};
+ \node at (YLabel) {\mm@ylabel};
+ \node at (ZLabel) {\mm@zlabel};
+ }
+
+ }
+
+
+
+\endgroup%
+}
+
+
+
+
+
+\define@key{hyperplane}{color}{\def\mm@color{#1}}
+\define@key{hyperplane}{fill}{\def\mm@fill{#1}}
+\define@key{hyperplane}{opacity}{\def\mm@opacity{#1}}
+\define@key{hyperplane}{thickness}{\def\mm@thickness{#1}}
+\define@key{hyperplane}{points}{\def\mm@points{#1}}
+\define@key{hyperplane}{status}{\def\mm@status{#1}}
+\define@key{hyperplane}{pattern}{\def\mm@pattern{#1}}
+\define@key{hyperplane}{patterncolor}{\def\mm@patterncolor{#1}}
+\DeclareDocumentCommand{\hyperplane}{m}{%
+\begingroup%
+ \setkeys{hyperplane}{color=blue,fill=orange,opacity={0.7},thickness={1},
+points={(0,0)},status={normal},pattern={north west
+lines},patterncolor={\HalfspaceColor}
+,#1 } %
+ \gdef\drawcom{
+ [draw=none,color=\mm@color,
+ line width=\mm@thickness,
+ fill=\mm@fill,
+ opacity=\mm@opacity,
+ pattern=\mm@pattern,
+ pattern color=\mm@patterncolor
+ ]
+ }
+ \foreach \point [count=\xi] in \mm@points{
+ \StrLeft{\point}{1}[\firstletter]
+\ifthenelse{\equal{\firstletter}{(}}{\def\thepoint{\point}}{\def\thepoint{(
+\point)}}
+ \ifnum\xi=1
+ \xdef\drawcom{\drawcom \thepoint}
+ \else
+ \xdef\drawcom{\drawcom -- \thepoint}
+ \fi
+ }
+ \xdef\drawcom{\drawcom -- cycle ;}
+ \draw \drawcom
+ \endgroup%
+}
+
+
+\makeatother