%% tikz-palattice.sty
%% Copyright 2017 J. Schmidt
%% tikz-palattice LaTeX package
%
% 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
% http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is J. Schmidt.
%
% This work consists of the files tikz-palattice.sty and tikz-palattice_documentation.tex
% and the 5 example files example1_linear.tex, example2_circular.tex,
% example3_coordinates.tex, example4_labels.tex and elsa.tex

\ProvidesPackage{tikz-palattice}[2017/03/09 v2.3]
\RequirePackage{tikz}
\RequirePackage{ifthen}
\RequirePackage{siunitx}
\RequirePackage{xargs}
\RequirePackage{etoolbox}
\RequirePackage{iflang}
\usetikzlibrary{calc,positioning,fit,chains}
\usetikzlibrary{scopes}
\pgfdeclarelayer{background}
\pgfsetlayers{background,main}




%---lattice environment---
\newenvironmentx{lattice}[2][1=1, 2=]{%
%begin
\tikzpicture[node distance=0mm, remember picture, #2]
\newdimen\labeldist
\newdimen\savelabeldist
\newdimen\corners;
\newdimen\elementheight;
\newdimen\elementwidth;
\newdimen\markerlen;
\pgfmathsetmacro{\scal}{#1*0.1};
\def\labelfont{\normalsize};
\def\labelcolor{black};
\def\labelang{-90};
\def\marklabelang{+90};
\def\labelrot{0};
\providetoggle{userlabelanchor}
\settoggle{userlabelanchor}{false}
\pgfmathsetlength{\labeldist}{\scal*20cm*0.35};
\pgfmathsetlength{\savelabeldist}{\scal*20cm*0.35};
\pgfmathtruncatemacro{\i}{0};
\pgfmathtruncatemacro{\j}{0};
\global\def\angle{0}
\node (nodeeast0) [start] at (0,0) {};
\coordinate (east\j) at (nodeeast\j.center); %\declarecoords ("east" only
\global\providetoggle{dip} \global\settoggle{dip}{false}
\global\providetoggle{quad} \global\settoggle{quad}{false}
\global\providetoggle{sext} \global\settoggle{sext}{false}
\global\providetoggle{kick} \global\settoggle{kick}{false}
\global\providetoggle{correct} \global\settoggle{correct}{false}
\global\providetoggle{sol} \global\settoggle{sol}{false}
\global\providetoggle{cav} \global\settoggle{cav}{false}
\global\providetoggle{sourc} \global\settoggle{sourc}{false}
\global\providetoggle{scree} \global\settoggle{scree}{false}
\global\providetoggle{valv} \global\settoggle{valv}{false}
% custom legend
\pgfkeys{/pal/customlegendkeys/.initial = {nix}}
\def\emptycustomlegendkeys{nix}
}{%
%end
\endtikzpicture
}



%---general settings---
\newcommand{\rotate}[1]{\pgfmathparse{\angle+#1} \global\let\angle\pgfmathresult}
\newcommand{\setangle}[1]{\pgfmathparse{#1} \global\let\angle\pgfmathresult}
\newcommand{\start}[1]{%
 \tikzset{x=2cm,y=2cm}
 \node (nodeeast0) [start] at #1 {};
 \coordinate (east\j) at (nodeeast\j.center);
 \tikzset{x=1cm,y=1cm}
}

\newcommandx{\savecoordinate}[2][2=east]{%
\global\csedef{angle#1}{\angle}
\coordinate (#1) at (#2\i);
}

\newcommand{\goto}[1]{%
\coordinate (east\j) at (#1);
%\node[fill=yellow] at (Septum) {\csuse{angle#1}};
\pgfmathparse{\csuse{angle#1}} \global\let\angle\pgfmathresult
%\expandafter\global\csname angle#1\endcsname{\angle}
}



%---color settings---
\newcommandx{\setelementcolor}[3][3=white]{%
\tikzset{#1/.append style={bottom color=#2, top color=#3, fadeElement}}}
\newcommand{\resetelementcolor}[1]{\tikzset{#1/.style={default_#1}}}
\newcommand{\setlinecolor}[2]{\tikzset{#1/.append style={#2, faded}}}
\newcommand{\resetlinecolor}[1]{\tikzset{#1/.style={default_#1}}}

\newenvironmentx{fade}[1][1=0.25]{%
\tikzset{faded/.style={opacity=#1, color=gray}}
\tikzset{fadeElement/.style={faded, color=gray,bottom color=gray,top color=white}}
}{%
\tikzset{faded/.style={opacity=1.0}} % color not set
\tikzset{fadeElement/.style={faded}}
}


%---label settings---
\newenvironment{labeldistance}[1]{%
 \pgfmathsetlength{\savelabeldist}{\labeldist}
 \pgfmathsetlength{\labeldist}{\scal*20cm*#1};
}{%
 \pgfmathsetlength{\labeldist}{\savelabeldist};
}

\newcommand{\setlabeldistance}[1]{%
\pgfmathsetlength{\savelabeldist}{\labeldist}
\pgfmathsetlength{\labeldist}{\scal*20cm*#1};}
\newcommand{\resetlabeldistance}{\pgfmathsetlength{\labeldist}{\savelabeldist};}
\newcommand{\setlabelfont}[1]{\def\labelfont{#1}}
\newcommand{\setlabelcolor}[1]{\def\labelcolor{#1}}

\newcommand{\turnlabels}{%
\ifthenelse{\labelang = -90}{%
\def\labelang{+90} \def\marklabelang{-90}}{%
\def\labelang{-90} \def\marklabelang{+90}}}

\newcommand{\southlabels}{\def\labelang{-90} \def\marklabelang{+90}}
\newcommand{\northlabels}{\def\labelang{+90} \def\marklabelang{-90}}

\newcommandx{\rotatelabels}[2][2=notset]{%
 \def\labelrot{#1}
 \ifthenelse{\equal{#2}{notset}}{%
   \settoggle{userlabelanchor}{false}
 }{%
   \settoggle{userlabelanchor}{true}
   \def\labelanchor{#2}}
}



% rule (maßstab)
\newcommandx{\drawrule}[4][2=1, 3=1, 4=0.06]{%
 \coordinate (rule0) at ($(0,0)!\scal*20!#1$);
 \tikzset{rule/.append style={line width=20pt*#4*10*\scal}}
 \draw[rule] (rule0) --++(#2*20cm*\scal,0) coordinate (rule1) --++(0,#4*20cm*\scal)
 --++(-#2*20cm*\scal,0) --++(0,-#4*20cm*\scal);
\draw[rule,fill=white] (rule1) --++(#2*20cm*\scal,0) coordinate (rule2) --++(0,#4*20cm*\scal)
 --++(-#2*20cm*\scal,0) --++(0,-#4*20cm*\scal);
 \draw[rule] (rule2) --++(#2*20cm*\scal,0) coordinate (rule3) --++(0,#4*20cm*\scal)
 --++(-#2*20cm*\scal,0) --++(0,-#4*20cm*\scal);
 \foreach \x in {0,1,2,3} {%
   \pgfmathsetmacro{\len}{#2*\x}
   \path [draw=none] (rule\x) --+ (-90:0.06*\labeldist/\scal) node[label, black, scale=#3, anchor=north]
   {\SI[zero-decimal-to-integer, round-mode=places, round-precision=1]{\len}{\meter}};
   \draw [black,line width=30pt*#4*10*\scal] (rule\x) --+ (-90:1mm);
   \draw [black,line width=30pt*#4*10*\scal] (rule\x) --+ (90:#4*20cm*\scal+1mm);
 }
}



% legend text defaults
\IfLanguageName{ngerman}{%
\pgfkeyssetvalue{/pal/legendtxt/dipole}{Dipol}
\pgfkeyssetvalue{/pal/legendtxt/quadrupole}{Quadrupol}
\pgfkeyssetvalue{/pal/legendtxt/sextupole}{Sextupol}
\pgfkeyssetvalue{/pal/legendtxt/kicker}{Kicker}
\pgfkeyssetvalue{/pal/legendtxt/corrector}{Korrektor}
\pgfkeyssetvalue{/pal/legendtxt/solenoid}{Solenoid}
\pgfkeyssetvalue{/pal/legendtxt/cavity}{Hochfrequenz}
\pgfkeyssetvalue{/pal/legendtxt/source}{Quelle}
\pgfkeyssetvalue{/pal/legendtxt/screen}{Schirm}
\pgfkeyssetvalue{/pal/legendtxt/valve}{Ventil}
}{%
\pgfkeyssetvalue{/pal/legendtxt/dipole}{Dipole}
\pgfkeyssetvalue{/pal/legendtxt/quadrupole}{Quadrupole}
\pgfkeyssetvalue{/pal/legendtxt/sextupole}{Sextupole}
\pgfkeyssetvalue{/pal/legendtxt/kicker}{Kicker}
\pgfkeyssetvalue{/pal/legendtxt/corrector}{Corrector}
\pgfkeyssetvalue{/pal/legendtxt/solenoid}{Solenoid}
\pgfkeyssetvalue{/pal/legendtxt/cavity}{Cavity}
\pgfkeyssetvalue{/pal/legendtxt/source}{Source}
\pgfkeyssetvalue{/pal/legendtxt/screen}{Screen}
\pgfkeyssetvalue{/pal/legendtxt/valve}{Valve}
}

% change legend text
\newcommand{\setlegendtext}[2]{%
 \pgfkeys{/pal/legendtxt/#1=#2}
}


% add custom legend entry
\newcommand{\addlegendentry}[2]{%
 \pgfkeys{/pal/customlegendkeys/.get = \lktemp}
 \ifdefequal{\lktemp}{\emptycustomlegendkeys}{%
   \pgfkeyssetvalue{/pal/customlegendkeys}{#1}%
 }{%
   \pgfkeys{/pal/customlegendkeys/.append = {,#1}}%
 }%
 \pgfkeys{/pal/customlegendimg/#1/.style = {#2}}%
}


%legend (types that occured in the lattice before this command)
\newcommandx{\legend}[2][2=1]{%
\coordinate (legendstart) at ($(0,0)!\scal*20!#1$);
\pgfmathsetmacro{\savescal}{\scal}
\pgfmathsetmacro{\saveang}{\angle}
\pgfmathsetmacro{\scal}{0.05}
\pgfmathsetmacro{\angle}{-90}
\def\h{0.4}
\def\l{0.3}
\def\dist{0.18}
\savecoordinate{_here_}
\coordinate (east\j) at (legendstart);
\coordinate (legendstart') at ($(legendstart) + (-\h*\scal*15*#2,\dist*\scal*15*#2)$);
\coordinate (legendstart'') at ($(legendstart) + (\h*\scal*15*#2,\dist*\scal*15*#2)$);
\edef\points{(legendstart') (legendstart'')}
\begin{scope}[scale=#2, every node/.style={scale=#2}]
\tikzset{drift/.append style={draw=none}}
\northlabels%
\setlabelcolor{black}%
\setlabeldistance{\h}%
\setlabelfont{\normalsize}%
 \iftoggle{dip}{\dipole{\pgfkeysvalueof{/pal/legendtxt/dipole}}{\l}{0}[r][\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{quad}{\quadrupole{\pgfkeysvalueof{/pal/legendtxt/quadrupole}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{sext}{\sextupole{\pgfkeysvalueof{/pal/legendtxt/sextupole}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{correct}{\corrector{\pgfkeysvalueof{/pal/legendtxt/corrector}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{kick}{\kicker{\pgfkeysvalueof{/pal/legendtxt/kicker}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{cav}{\cavity{\pgfkeysvalueof{/pal/legendtxt/cavity}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{sol}{\solenoid{\pgfkeysvalueof{/pal/legendtxt/solenoid}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{sourc}{\source{\pgfkeysvalueof{/pal/legendtxt/source}}{\l}[\h]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{scree}{\screen{\pgfkeysvalueof{/pal/legendtxt/screen}}[\l]\xdef\points{(elementlabel\j)
     \points}\drift{\dist}}{}%
 \iftoggle{valv}{\drift{\dist}\valve{\pgfkeysvalueof{/pal/legendtxt/valve}}\xdef\points{(elementlabel\j)
     \points}\drift{\dist}\drift{\dist}}{}%
\end{scope}
 % custom entries (addlegendentry)
 \edef\mylist{\pgfkeysvalueof{/pal/customlegendkeys}}%
 \ifdefequal{\mylist}{\emptycustomlegendkeys}{}{%
   \node[anchor=north west,inner sep=0,outer sep=0,xshift=#2*-2mm] at (east\j) {
     \begin{tikzpicture}[start chain=going below,node distance=2mm,scale=#2,transform shape]
       \foreach \ele in \mylist {%
         \node[on chain, draw, thin,/pal/customlegendimg/\ele, minimum width=\h*10mm, minimum height=\l*10mm] (n) {};%
         \node[anchor=west,xshift=5.15mm] (ntxt) at (n.center) {\ele};%
         \xdef\points{($(ntxt.south east)+#2*(2mm,-2mm)$)\points}%
       }
     \end{tikzpicture}
   };
 }
\node[draw=black, rounded corners, fit=\points] {};
\pgfmathsetmacro{\scal}{\savescal}
\pgfmathsetmacro{\angle}{\saveang}
%\tikzset{drift/.append style={draw=black}}
\coordinate (east\j) at (_here_);
}

%complete legend (all types)
\newcommandx{\completelegend}[2][2=1]{%
\settoggle{dip}{true}
\settoggle{quad}{true}
\settoggle{sext}{true}
\settoggle{kick}{true}
\settoggle{correct}{true}
\settoggle{sol}{true}
\settoggle{cav}{true}
\settoggle{sourc}{true}
\settoggle{scree}{true}
\settoggle{valv}{true}
\legend{#1}[#2]
}


%---commands for internal use---
\newcommand{\updatelabelanchor}{%
 \pgfmathtruncatemacro\iang{\angle}
 % handle angle not in [0,360] ([-720,+1080] handled)
 \ifthenelse{\iang<0}{\pgfmathtruncatemacro\iang{\iang+360}}{}
 \ifthenelse{\iang<0}{\pgfmathtruncatemacro\iang{\iang+360}}{}
 \ifthenelse{\iang>360}{\pgfmathtruncatemacro\iang{\iang-360}}{}
 \ifthenelse{\iang>360}{\pgfmathtruncatemacro\iang{\iang-360}}{}
 % set label anchor according to angle
 \iftoggle{userlabelanchor}{}{%  %if labelanchor is set by user just use the set value
   \ifthenelse{\labelang = -90}{%
     \def\labelanchor{north};
     \ifthenelse{\iang > 30}{\def\labelanchor{west}}{}
     \ifthenelse{\iang > 150}{\def\labelanchor{south}}{}
     \ifthenelse{\iang > 210}{\def\labelanchor{east}}{}
     \ifthenelse{\iang > 330}{\def\labelanchor{north}}{}
   }{%
     \def\labelanchor{south};
     \ifthenelse{\iang > 30}{\def\labelanchor{east}}{}
     \ifthenelse{\iang > 150}{\def\labelanchor{north}}{}
     \ifthenelse{\iang > 210}{\def\labelanchor{west}}{}
     \ifthenelse{\iang > 330}{\def\labelanchor{south}}{}
   }
 }
}

\newcommand{\updatemarkerlabelanchor}{%
 \pgfmathtruncatemacro\iang{\angle}
 % handle angle not in [0,360] ([-720,+1080] handled)
 \ifthenelse{\iang<0}{\pgfmathtruncatemacro\iang{\iang+360}}{}
 \ifthenelse{\iang<0}{\pgfmathtruncatemacro\iang{\iang+360}}{}
 \ifthenelse{\iang>360}{\pgfmathtruncatemacro\iang{\iang-360}}{}
 \ifthenelse{\iang>360}{\pgfmathtruncatemacro\iang{\iang-360}}{}
 % set label anchor according to angle
 \ifthenelse{\marklabelang = +90}{%
   \def\labelanchor{south};
   \ifthenelse{\iang > 30}{\def\labelanchor{east}}{}
   \ifthenelse{\iang > 150}{\def\labelanchor{north}}{}
   \ifthenelse{\iang > 210}{\def\labelanchor{west}}{}
   \ifthenelse{\iang > 330}{\def\labelanchor{south}}{}
 }{%
   \def\labelanchor{north};
   \ifthenelse{\iang > 30}{\def\labelanchor{west}}{}
   \ifthenelse{\iang > 150}{\def\labelanchor{south}}{}
   \ifthenelse{\iang > 210}{\def\labelanchor{east}}{}
   \ifthenelse{\iang > 330}{\def\labelanchor{north}}{}
 }
}


\newcommand{\elementlabel}[1]{%
 \updatelabelanchor
 \path [draw=none] (center\j) --+ (\angle\labelang:\labeldist) node[label] (elementlabel\j) {#1};
}

\newcommand{\jinc}{\pgfmathparse{int(\i+1)} \global\let\j\pgfmathresult}
\newcommand{\iinc}{\global\let\i\j}
\newcommand{\angleinc}[1]{\pgfmathparse{\angle+#1} \global\let\angle\pgfmathresult}
\newcommand{\declarecoords}{\coordinate (east\j) at (nodeeast\j.center); \coordinate (center\j) at (nodecenter\j.center);}





% ----- element commands -----
% drift
\newcommandx{\drift}[2][2=]{%
\jinc
\begin{pgfonlayer}{background}
 \draw[drift] (east\i) --++ (\angle:#1*10cm*\scal) node[] (nodecenter\j) {} --++
 (\angle:#1*10cm*\scal) node[] (nodeeast\j) {};
\end{pgfonlayer}{background}
\declarecoords
\elementlabel{#2};
\iinc;
}

%rectangle-element (used for quad,sext,kicker,cavity,...)
\newcommandx{\rectangleelement}[4]{%
\pgfmathsetlength{\corners}{(#2)>=0.4 ? (1mm*10*\scal) : 0mm};
\pgfmathsetlength{\elementheight}{#3*20cm*\scal};
\draw[drift] (east\i) --++ (\angle:#2*10cm*\scal) node[] (nodecenter\j) {} --++
(\angle:#2*10cm*\scal) node[] (nodeeast\j) {};
\draw[#4] (east\i) --++ (0,\elementheight/2) --++ (#2*20cm*\scal,0) --++
(0,-\elementheight) --++ (-#2*20cm*\scal,0) --++ (0,\elementheight/2);
}


%dipole (br,r,s)
\newcommandx{\dipole}[5][4=s, 5=0.6]{%
\jinc
\pgfmathsetlength{\corners}{(#2)>=0.4 ? (1mm*10*\scal) : 0mm};
\pgfmathsetlength{\elementheight}{#5*20cm*\scal};
\def\winkel{#3}
\ifthenelse{\equal{#3}{0}}{
 \rectangleelement{#1}{#2}{#5}{dipole}
}{
 \newdimen\radius
 \newdimen\ri
 \newdimen\ra
 \pgfmathsetlength{\radius}{(#2*20cm*\scal)/rad(\winkel)}; % bogenlänge
 \pgfmathsetlength{\ri}{\radius-0.5*\elementheight}
 \pgfmathsetlength{\ra}{\radius+0.5*\elementheight}

 % draw bend beampipe
 \draw[drift,rotate=\angle] (east\i) arc (-90:(-90+\winkel/2):\radius) node[] (nodecenter\j) {};
 \draw[drift,rotate=\angle] (nodecenter\j) arc ((-90+\winkel/2):(-90+\winkel):\radius) node[] (nodeeast\j) {};

 % [r]ectangle
 \ifthenelse{\equal{#4}{r}}{
   \angleinc{0.5*#3}
   \newdimen\straightlength
   \pgfmathsetlength{\straightlength}{sin(\winkel/2)*2*\radius} % sekante des kreisbogens
   \draw[dipole] (east\i) --++ (0,-\elementheight/2) --++ (\straightlength,0) --++
   (0,\elementheight) --++ (-\straightlength,0) --++ (0,-\elementheight/2);
 }{
   % [s]ector
   \ifthenelse{\equal{#4}{s}}{%
     \draw[dipole] (east\i) -- ++
     (0,-\elementheight/2) arc (-90:(-90+\winkel):\ra) -- ++(\winkel+90:\elementheight) arc
     ((-90+\winkel):-90:\ri) -- cycle;
     \angleinc{0.5*\winkel}
   }{
     % [b]end[r]ectangle
     \angleinc{0.5*#3}
     \draw[dipole] (east\i) -- ++
     (0,-\elementheight/2) arc (-90-\winkel/2:-90+\winkel/2:\radius) -- ++(0,\elementheight) arc
     (-90+\winkel/2:-90-\winkel/2:\radius) -- cycle;
   }
 }
}

\declarecoords
\elementlabel{#1};
\iinc
\global\settoggle{dip}{true}
\angleinc{0.5*\winkel}
}


%quadrupole
\newcommandx{\quadrupole}[3][3=0.5]{%
\jinc
\rectangleelement{#1}{#2}{#3}{quadrupole}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{quad}{true}
}

%sextupole
\newcommandx{\sextupole}[3][3=0.3]{%
\jinc
\rectangleelement{#1}{#2}{#3}{sextupole}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{sext}{true}
}

%kicker
\newcommandx{\kicker}[3][3=0.25]{%
\jinc
\rectangleelement{#1}{#2}{#3}{kicker}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{kick}{true}
}

% corrector
\newcommandx{\corrector}[3][3=0.25]{%
\jinc
\rectangleelement{#1}{#2}{#3}{corrector}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{correct}{true}
}

%cavity
\newcommandx{\cavity}[3][3=0.45]{%
\jinc
\rectangleelement{#1}{#2}{#3}{cavity}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{cav}{true}
}

%solenoid
\newcommandx{\solenoid}[3][3=0.2]{%
\jinc
\rectangleelement{#1}{#2}{#3}{solenoid}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{sol}{true}
}

%beamdump
\newcommandx{\beamdump}[3][3=0.5]{%
\jinc
\rectangleelement{#1}{#2}{#3}{beamdump}
\declarecoords
\elementlabel{#1}
\iinc
%\global\settoggle{}{true} no legend for beamdump
}

%source
\newcommandx{\source}[3][3=0.5]{%
\jinc
\pgfmathsetlength{\corners}{(#2)>=0.4 ? (1mm*10*\scal) : 0mm};
\pgfmathsetlength{\elementheight}{#3*20cm*\scal};
\draw[drift] (east\i) --++ (\angle:#2*10cm*\scal) node[] (nodecenter\j) {} --++
(\angle:#2*10cm*\scal) node[] (nodeeast\j) {};
\draw[source] (east\i) --++ (0,\elementheight/2) --++ (#2*20cm*\scal,-\elementheight/2)
--++ (-#2*20cm*\scal,-\elementheight/2) --++ (0,\elementheight/2);
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{sourc}{true}
}

%screen
\newcommandx{\screen}[2][2=0.2]{%
\jinc
\pgfmathsetlength{\corners}{(#2)>=0.4 ? (1mm*10*\scal) : 0mm};
\newdimen\radius
\pgfmathsetlength{\radius}{#2*20cm*\scal/2};
\draw[drift] (east\i) --++ (\angle:#2*10cm*\scal) node[] (nodecenter\j) {} --++
(\angle:#2*10cm*\scal) node[] (nodeeast\j) {};
\draw[screen] (nodecenter\j.center) circle (\radius);
\draw[screen] (nodecenter\j.center) --++ (45:\radius);
\draw[screen] (nodecenter\j.center) --++ (45+180:\radius);
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{scree}{true}
}

%valve
\newcommandx{\valve}[2][2=0.01]{%
\jinc
\rectangleelement{#1}{#2}{0.15}{valve}
\declarecoords
\elementlabel{#1}
\iinc
\global\settoggle{valv}{true}
}


%marker
\newcommandx{\marker}[2][2=0.35]{%
\pgfmathsetlength{\markerlen}{#2*20cm*\scal};
\updatemarkerlabelanchor
\draw [marker] (east\i) --+ (\angle-90:\markerlen); % half length (=> 10cm)
\draw [marker] (east\i) --+ (\angle+90:\markerlen);
\draw [draw=none] (east\i) --+ (\angle\marklabelang:\markerlen+0.5*\labeldist) node[label] {#1};
}





% ----- styles -----
%faded (for global fade setting)
\tikzset{faded/.style={
opacity=1
}}
\tikzset{fadeElement/.style={
faded
}}

%element (for all, except drift)
\tikzset{element/.style={
rounded corners=\corners,
line width=0.8pt*10*\scal, draw=black,
top color=white,
anchor=west,
rotate=\angle,
fadeElement  %must be last to overwrite other settings
}}

%dipole
\tikzset{default_dipole/.style={
bottom color=blue,
element,
},
dipole/.style={default_dipole}
}


%quadrupole
\tikzset{default_quadrupole/.style={
bottom color=yellow,
element
},
quadrupole/.style={default_quadrupole}
}

%sextupole
\tikzset{default_sextupole/.style={
bottom color=violet!70!black,
element
},
sextupole/.style={default_sextupole}
}

%kicker
\tikzset{default_kicker/.style={
bottom color=red!90!black,
element
},
kicker/.style={default_kicker}
}

%corrector
\tikzset{default_corrector/.style={
bottom color=orange!90!black,
element
},
corrector/.style={default_corrector}
}

%cavity
\tikzset{default_cavity/.style={
bottom color=brown!80!black,
element
},
cavity/.style={default_cavity}
}

%solenoid
\tikzset{default_solenoid/.style={
bottom color=green!70!black,
element
},
solenoid/.style={default_solenoid}
}

%beamdump
\tikzset{default_beamdump/.style={
bottom color=gray,
element
},
beamdump/.style={default_beamdump}
}

%source
\tikzset{default_source/.style={
bottom color=gray,
element
},
source/.style={default_source}
}

%screen
\tikzset{default_screen/.style={
bottom color=white,
element
},
screen/.style={default_screen}
}

%valve
\tikzset{default_valve/.style={
bottom color=gray,
element,
top color=gray,
draw=none
},
valve/.style={default_valve}
}



%drift
\tikzset{default_drift/.style={
line width=0.8pt*10*\scal, draw=black,
faded  %must be last to overwrite other settings
},
drift/.style={default_drift}
}

%text label
\tikzset{label/.style={
text=\labelcolor,
font=\labelfont,
rotate=\labelrot,
anchor=\labelanchor,
faded  %must be last to overwrite other settings
}}

%marker (line)
\tikzset{default_marker/.style={
red, densely dashed,
faded  %must be last to overwrite other settings
},
marker/.style={default_marker}
}

%rule
\tikzset{rule/.style={
draw=black,
fill=black,
faded  %must be last to overwrite other settings
}}

%start
\tikzset{start/.style={%
draw=none,
anchor=center,
scale=0.1,
faded  %must be last to overwrite other settings
}}