% Copyright 2018-2021 by Romano Giannetti
% Copyright 2015-2021 by Stefan Lindner
% Copyright 2013-2021 by Stefan Erhardt
% Copyright 2007-2021 by Massimo Redaelli
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the files gpl-3.0_license.txt and lppl-1-3c_license.txt for more details.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{ctikzmanutils}[2019/07/26 utilities for formatting circuitikz manual]
\RequirePackage{ifthen}
\RequirePackage{xparse}
\RequirePackage{showexpl}
\RequirePackage{ragged2e}
% for some example we need them...
\usetikzlibrary{calc,fit, decorations, decorations.pathmorphing}
\RequirePackage{upgreek}
%
% The following trick is used to silence showexpl a bit, so that the
% logs are readable...
%
\makeatletter
\let\SX@Info=\relax % silence showexpl a bit...
\makeatother
%
\lstset{pos=l,width=-99pt, overhang=0pt,hsep=\columnsep,vsep=\bigskipamount,
    rframe=single,numbers=left,numberstyle=\tiny,numbersep=.3em, xleftmargin=1em,
    columns=flexible, language=[LaTeX]TEX,breaklines=true,
    basicstyle=\normalsize\ttfamily,tabsize=3}

%
% draw the shape without affecting anything
\newcommand{\drawphantomshape}[1] {%
    {\tikz [overlay, color=blue] \path (0,0) node[#1]{};}
}
%% New circuit description macros
\newcommand{\twopartbox}[2]{%
    \leavevmode\null\par\noindent\fbox{\parbox[c]{0.3\linewidth}{#1} \parbox[c]{0.6\linewidth}{\raggedright #2}\par\noindent}%
}
% filling color for filled-enabled component
\colorlet{fillcol}{cyan!30!white}
% find the class for the element. Thanks to Symbol 1
% https://tex.stackexchange.com/a/501389/38080
\def\checkclass#1{%
    \csname pgf@sh@ma@#1\endcsname
    \ifdefined\ctikzclass
        Class: \texttt{\ctikzclass}.%
    \else
        No class.%
    \fi
}
% description of a node component:
% optional star for fillable
% optional: scale of the component in the entry
% mandatory  shape name, description, node text:
% optional between (): anchor specification list
% optional between []: internal nodes specification list
\NewDocumentCommand{\circuitdesc}{s O{1} m m m d() d[]}
{
    \twopartbox{%
        \begin{circuitikz}[]
            \IfBooleanTF{#1}{%
                \draw (0,0) node[#3,scale=#2, fill=fillcol](N){#5};
                }{
                \draw (0,0) node[#3,scale=#2](N){#5};
            }
            \IfValueT{#6}{%
                \foreach \n/\a/\d in {#6} \path(N.\n) \showcoord(\n)<\a:\d>;
            }
            \IfValueT{#7}{%
                \foreach \n/\a/\d in {#7} \path(N-\n) \showcoordb(N-\n)<\a:\d>;
            }
        \end{circuitikz}%
        }{\sloppy%
        {#4, type: node\IfBooleanT{#1}{, fillable}%
        } (\texttt{node[\detokenize{#3}]\IfValueT{#7}{(N)}\{\detokenize{#5}\}}). \index{#3}%
        \checkclass{N}%
    }%
}
% description of a path-style bipole component:
% optional: main name, if different from above
% mandatory component name
% optional between <>: shapename, if note "nodeshape"
% mandatory description, comma separated alias
% optional between (): anchor specification list
% optional between []: internal nodes specification list
%                                    1 2 3 4   5 6 7   8
\NewDocumentCommand{\circuitdescbip}{s o m d<> m m d() d[]}
{
\index{#3} \tikz\foreach \i in {#6} {\index{\i|see{#3}} };
    \twopartbox{%
        \begin{circuitikz}
        \IfBooleanTF{#1}{%
            \draw (0,0) to[#3, name=B, fill=fillcol] (2,0);
            }{
            \draw (0,0) to[#3, name=B] (2,0);
        }
        \IfValueT{#7}{%
                \foreach \n/\a/\d in {#7} \path(B.\n) \showcoord(\n)<\a:\d>;
            }
            \IfValueT{#8}{%
                \foreach \n/\a/\d in {#8} \path(B-\n) \showcoordb(B-\n)<\a:\d>;
            }
        \end{circuitikz}%
        }{\sloppy%
        \texttt{\textbf{#3}}: #5, \texttt{type: path-style\IfBooleanT{#1}{, fillable}%
            \IfValueT{#8}{, \texttt{name=B}}%
            \IfValueTF{#4}{, nodename: #4.}{
            \IfValueTF{#2}{, nodename: #2shape.%\drawphantomshape{#2shape}%
            }{, nodename: #3shape.%\drawphantomshape{#3shape}%
        }}%
        }%
        \ifthenelse{\equal{#6}{}}{ }{%
        Aliases: \texttt{#6}. }\checkclass{B}%
    }%
}

%new environment for grouping descriptions
\newenvironment{groupdesc}{\medskip\begingroup}{\endgroup\par\medskip\par\noindent}

% command to show anchors: (name)<angle>
% usage in path: \path (anchor) \coord(anchor)<60>
\makeatletter % we use the internal circuitikz base length
\def\showcoord(#1)<#2:#3>{%
    node[circle, red, draw, inner sep=1pt,pin={%
        [red, inner sep=0.5pt, font=\small,
        pin distance=#3\pgf@circ@Rlen, pin edge={red, }%
    ]#2:#1}](#1){}}
\def\showcoordb(#1)<#2:#3>{%
    node[circle, blue, draw, inner sep=1pt,pin={%
        [blue, inner sep=0.5pt, font=\small,
        pin distance=#3\pgf@circ@Rlen, pin edge={blue, }%
    ]#2:#1}](#1){}}
    \def\showcoordwc[#1](#2)<#3:#4>{%
    node[circle, #1, draw, inner sep=1pt,pin={%
        [#1, inner sep=0.5pt, font=\small,
        pin distance=#4\pgf@circ@Rlen, pin edge={#1, }%
    ]#3:#2}](#2){}}
\makeatother
% show anchors of a node component:
% optional: options of the circuitikz environment
% mandatory  node spec, node text
% optional between (): anchor specification list
\NewDocumentCommand{\showanchors}{O{} m m d()}
{
        \begin{circuitikz}[#1]
                \draw (0,0) node[#2](N){#3};
            \IfValueT{#4}{%
                \foreach \n/\a/\d in {#4} \path(N.\n) \showcoord(\n)<\a:\d>;
            }
        \end{circuitikz}%
}


\newcommand{\geolrcoord}[2][]{\showanchors[#1]{#2}{text}(north/90/0.4, north east/45/0.4, east/0/0.4,
    south east/-45/0.4,
    south/-90/0.4, south west/-135/0.4, west/180/0.4, north west/135/0.4,
    left/160/0.4, right/30/0.4, center/-120/0.3
    )
}

\newcommand{\geocoord}[2][]{\showanchors[#1]{#2}{text}(north/90/0.4, north east/45/0.4, east/0/0.4,
    south east/-45/0.4,
    south/-90/0.4, south west/-135/0.4, west/180/0.4, north west/135/0.4,
    center/-120/0.3
    )
}
