% Copyright 2018-2025 by Romano Giannetti
% Copyright 2015-2025 by Stefan Lindner
% Copyright 2013-2025 by Stefan Erhardt
% Copyright 2007-2025 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}[2021/04/13 utilities for formatting circuitikz manual]
\RequirePackage{ifthen}
\RequirePackage{xparse}
\RequirePackage{showexpl}
\RequirePackage{ragged2e}
\RequirePackage{textcomp}
\RequirePackage{booktabs}
\renewcommand{\arraystretch}{1.2}
\RequirePackage{a4wide} % smaller borders
\RequirePackage{titling}
\RequirePackage{titlesec}
% clear page on section break
\newcommand{\sectionbreak}{\clearpage}
\setcounter{secnumdepth}{4}
\setcounter{tocdepth}{4}
% for some example we need them...
\usetikzlibrary{calc, fit, decorations, decorations.pathmorphing, tikzmark}
\RequirePackage{upgreek}
%
% Thanks to Ulrike Fischer https://tex.stackexchange.com/a/57160/38080
% make the listing line number invisible to copy and paste
% it seems that sometimes it works, sometimes no!
%
\RequirePackage{accsupp}
\newcommand{\emptyaccsupp}[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}%
%
% 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
%
\RequirePackage{showexpl}
\lstset{frameround=fttt}
\lstloadlanguages{TeX}
\lstset{pos=l,
   width=-99pt,
   overhang=0pt,
   hsep=\columnsep,
   vsep=\bigskipamount,
   rframe=single,
   xleftmargin=1em,
   columns=flexible,
   language=[LaTeX]TEX,
   breaklines=true,
   basicstyle=\small\ttfamily,
   numbers=left,
   numbersep=.3em,
   numberstyle=\tiny\emptyaccsupp,
   tabsize=3}
% override explpreset to add the \emptyaccsupp macro
\lstset{explpreset={numbers=left,numberstyle=\tiny\emptyaccsupp,numbersep=.3em,
 xleftmargin=1em,columns=flexible,language=[LaTeX]TEX},pos=l,width=-99pt,
 overhang=0pt,hsep=\columnsep,vsep=\bigskipamount,rframe=single}

\newcommand{\email}[1]{\href{mailto:#1}{#1}}
\long\def\comment#1{}

\RequirePackage{framed}
\RequirePackage{xtab}
\RequirePackage{hyperref}
\hypersetup{
   pdftitle={CircuiTikZ \pgfcircversion\ - manual}, % title
   pdfauthor={Massimo Redaelli, Stefan Lindner, Stefan Erhardt, Romano Giannetti}, % authors
   pdfsubject={CircuiTikZ manual},   % subject of the document
   pdfkeywords={},   % list of keywords
   colorlinks=true,  % false: boxed links; true: colored links
   linkcolor=blue,   % color of internal links
   citecolor=blue,   % color of links to bibliography
   filecolor=blue,   % color of file links
   urlcolor=blue     % color of external links
}

% There are a lot of boxes in the document; let's try to give TeX
% a bit of leverage... do not use parindent (which looks strange between examples)
% and add stretch between paragraph, to avoid a lot of sections and subsections
% starting at the end of the page.
\parindent=0pt
\parskip=4pt plus 6pt minus 2pt
%
% names
%
\def\TikZ{Ti\emph{k}Z}
\def\Circuitikz{Circui\TikZ}
\def\ConTeXt{Con\TeX t}
%
% Start of special macros for component descriptions
%
% 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\hbadness=9500 #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};
               }{
               % if it's non-fillable, red should not go through
               \draw (0,0) node[#3,scale=#2,
               % fill=red
               ](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|seealso{#3}} }}%
   \twopartbox{%
       \begin{circuitikz}
       \IfBooleanTF{#1}{%
           \draw (0,0) to[#3, name=B, fill=fillcol] (2,0);
           }{
           % if it's non-fillable, red should not go through
           \draw (0,0) to[#3, name=B,
           %fill=red
           ] (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}%
   }%
}
% command to add the content to the index
\NewDocumentCommand{\IndexKey}{O{#2} m}{%
   \index{\detokenize{#1}|textit}\texttt{#2}%
}

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