% % 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
