%% symbol library for TikZ track schematics % % Copyright (c) 2018 - 2022, Martin Scheidt (ISC license) % % Permission to use, copy, modify, and/or distribute this file for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. % \ProvidesFileRCS{tikzlibrarytrackschematic.construction.code.tex}% % %%%%%%%%%%%%%%% % global settings %%%%%%%%%%%%%%% \RequirePackage{tikz,etoolbox}% \usetikzlibrary{calc}% % \ifdeflength{\objectlength}{}{% Not defined, so define it! \newlength{\objectlength}% }% \setlength{\objectlength}{4cm}% % %%%%%%%%%%%%%%% % tikz keys for multiple use %%%%%%%%%%%%%%% \pgfkeys{% /tikz/trackschematic/.is family,% /tikz/trackschematic/.cd,% %% length length/.store in=\objectlength,% default length 4cm /tikz/length/.forward to=/tikz/trackschematic/length,% %% traffic practice traffic practice/.value required,% left OR right traffic practice/.store in=\trafficpractice,% traffic practice=right,% DEFAULT /tikz/traffic practice/.forward to=/tikz/trackschematic/traffic practice,% /tikz/position/.forward to=/tikz/trackschematic/traffic practice,% }% \newlength{\objectwidth}\setlength{\objectwidth}{0.5cm}% \pgfkeys{% /tikz/trackschematic/constructions/.is family,% /tikz/trackschematic/constructions/.cd,% %% side side/.value required,% left, right OR both side/.store in=\side,% left, right OR both side=right,% DEFAULT /tikz/side/.forward to=/tikz/trackschematic/constructions/side,% %% width width/.store in=\objectwidth,% default width 0.5cm /tikz/width/.forward to=/tikz/trackschematic/constructions/width,% }% % %%%%%%%%%%%%%%% % symbol platform %%%%%%%%%%%%%%% % %% command \newcommand\platform{}% just for safety \def\platform[#1]#2(#3){% \platform[options] at (coord); \pic[#1] at (#3) {platform={#2}}% symbol }% %% symbol definition \tikzset{% pics/platform/.default=,% pics/platform/.style args={#1}{code={% %% settings \def\coordcommand{#1}% beware of leading and tailing spaces! % \ifdefstring{\side}{left}{% side \pgfmathsetmacro{\sidefactor}{1}% }{% \ifdefstring{\side}{right}{% side \pgfmathsetmacro{\sidefactor}{-1}% }{% \ifdefstring{\side}{both}{% side }{% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}% }% }% }% end \ifdefstring{\side} %% platform shape \tikzset{every path/.style={draw=foreground,line width=0.75pt}};% \ifdefstring{\side}{both}{% double side \path ($-0.5*(\objectlength,0) + (0, \objectwidth)$) --% ($-0.5*(\objectlength,0) + (0, 0.2)$) --% ($ 0.5*(\objectlength,0) + (0, 0.2)$) --% ($ 0.5*(\objectlength,0) + (0, \objectwidth)$);% part 1 \path ($-0.5*(\objectlength,0) + (0, 0.3)$) --% ($ 0.5*(\objectlength,0) + (0, 0.3)$);% part 2 \path ($-0.5*(\objectlength,0) + (0,-\objectwidth)$) --% ($-0.5*(\objectlength,0) + (0,-0.2)$) --% ($ 0.5*(\objectlength,0) + (0,-0.2)$) --% ($ 0.5*(\objectlength,0) + (0,-\objectwidth)$);% part 3 \path ($-0.5*(\objectlength,0) + (0,-0.3)$) --% ($ 0.5*(\objectlength,0) + (0,-0.3)$);% part 4 }{% single side \path ($-0.5*(\objectlength,0) + \sidefactor*(0,\objectwidth)$) --% ($-0.5*(\objectlength,0) + \sidefactor*(0,0.2)$) --% ($ 0.5*(\objectlength,0) + \sidefactor*(0,0.2)$) --% ($ 0.5*(\objectlength,0) + \sidefactor*(0,\objectwidth)$);% part 1 \path ($-0.5*(\objectlength,0) + \sidefactor*(0,0.3)$) --% ($ 0.5*(\objectlength,0) + \sidefactor*(0,0.3)$);% part 2 }% }},% END pics/platform/.style args={#1} % symbology entry symbology_platform/.pic = {% \maintrack (0,0) -- (6,0);% \platform[side=left] at (3,0);% },% }% % %%%%%%%%%%%%%%% % symbol level crossing %%%%%%%%%%%%%%% % %% command \newcommand\levelcrossing{}% just for safety \def\levelcrossing[#1]#2(#3){% \levelcrossing[options] at (coord); \pic[side=both,#1] at (#3) {level_crossing={#2}}% symbol }% %% tikz keys \newlength{\roadwidth}\setlength{\roadwidth}{0.4cm}% \newtoggle{show_road}\settoggle{show_road}{true}% \pgfkeys{% /tikz/trackschematic/constructions/level crossing/.is family,% /tikz/trackschematic/constructions/level crossing/.cd,% %% barrier barrier/.store in=\barrier,% full, semi OR none barrier=none,% DEFAULT /tikz/barrier/.forward to=/tikz/trackschematic/constructions/level crossing/barrier,% /tikz/barrier side/.forward to=/tikz/trackschematic/constructions/side,% %% show road no road/.value forbidden,% no road/.code={\settoggle{show_road}{false}},% /tikz/no road/.forward to=/tikz/trackschematic/constructions/level crossing/no road,% %% road width road width/.store in=\roadwidth,% default width 0.4cm /tikz/road width/.forward to=/tikz/trackschematic/constructions/level crossing/road width,% }% %% symbol definition \tikzset{% pics/level_crossing/.default=,% pics/level_crossing/.style args={#1}{code={% %% settings \def\coordcommand{#1} % beware of leading and tailing spaces! %% traffic practice setup \ifdefstring{\trafficpractice}{left}{% branch \pgfmathsetmacro{\trafficfactor}{-1}% }{% \ifdefstring{\trafficpractice}{right}{% branch \pgfmathsetmacro{\trafficfactor}{1}% }{% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/trafficcontrol/traffic practice}{“left“ OR “right“ as key required}}% }% }% end \ifdefstring{\trafficpractice} %% symbol \tikzset{every path/.style={draw=foreground,line width=1pt}};% \iftoggle{show_road}{% true \path ($0.5*(-\roadwidth,0) + (0,-0.1)$) --% ++($(0,-\objectwidth)$);% road part 1 \path ($0.5*( \roadwidth,0) + (0,-0.1)$) --% ++($(0,-\objectwidth)$);% road part 2 \path ($0.5*(-\roadwidth,0) + (0, 0.1)$) --% ++($(0, \objectwidth)$);% road part 3 \path ($0.5*( \roadwidth,0) + (0, 0.1)$) --% ++($(0, \objectwidth)$);% road part 4 }{}% END \iftoggle{show_road} \ifdefstring{\barrier}{full}{% full barrier \ifdefstring{\side}{both}{% \filldraw[foreground]% left barrier part 1 ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) circle (0.05);% \filldraw[foreground]% left barrier part 2 ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) circle (0.05);% \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) --% ++($( 0.45\roadwidth,0)+( 0.2,0)$);% left barrier part 3 \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) --% ++($(-0.45\roadwidth,0)+(-0.2,0)$);% left barrier part 4 % \filldraw[foreground]% right barrier part 1 ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) circle (0.05);% \filldraw[foreground]% right barrier part 2 ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) circle (0.05);% \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) --% ++($(-0.45\roadwidth,0)+(-0.2,0)$);% right barrier part 3 \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) --% ++($( 0.45\roadwidth,0)+( 0.2,0)$);% right barrier part 4 }{% \ifdefstring{\side}{left}{% \filldraw[foreground]% left barrier part 1 ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) circle (0.05);% \filldraw[foreground]% left barrier part 2 ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) circle (0.05);% \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,0.35)$) --% ++($( 0.45\roadwidth,0)+( 0.2,0)$);% left barrier part 3 \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,0.35)$) --% ++($(-0.45\roadwidth,0)+(-0.2,0)$);% left barrier part 4 }{% \ifdefstring{\side}{right}{% \filldraw[foreground]% right barrier part 1 ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) circle (0.05);% \filldraw[foreground]% right barrier part 2 ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) circle (0.05);% \path ($( 0.5\roadwidth,0)+( 0.2,0)+(0,-0.35)$) --% ++($(-0.45\roadwidth,0)+(-0.2,0)$);% right barrier part 3 \path ($(-0.5\roadwidth,0)+(-0.2,0)+(0,-0.35)$) --% ++($( 0.45\roadwidth,0)+( 0.2,0)$);% right barrier part 4 }{%% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}% }% END \ifdefstring{\side}{right} }% END \ifdefstring{\side}{left} }% END \ifdefstring{\side}{both} }{% \ifdefstring{\barrier}{semi}{% semi barrier \ifdefstring{\side}{both}{% \filldraw[foreground]% left barrier part 1 ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) circle (0.05);% \path ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) --% ++($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)$);% left barrier part 2 % \filldraw[foreground]% right barrier part 1 ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) circle (0.05);% \path ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) --% ++($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)$);% right barrier part 2 }{% \ifdefstring{\side}{left}{% \filldraw[foreground]% left barrier part 1 ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) circle (0.05);% \path ($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)+(0,0.35)$) --% ++($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)$);% left barrier part 2 }{% \ifdefstring{\side}{right}{% \filldraw[foreground]% right barrier part 1 ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) circle (0.05);% \path ($\trafficfactor*(0.5\roadwidth,0)+\trafficfactor*(0.2,0)+(0,-0.35)$) --% ++($\trafficfactor*(-0.5\roadwidth,0)+\trafficfactor*(-0.2,0)$);% right barrier part 2 }{%% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}% }% END \ifdefstring{\side}{right} }% END \ifdefstring{\side}{left} }% END \ifdefstring{\side}{both} }{% \ifdefstring{\barrier}{none}{% no barriers }{% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/level crossing/barrier}{“full“, “semi“ OR “none“ as key required}}% }% }% END \ifdefstring{\barrier}{semi} }% END \ifdefstring{\barrier}{full} }},% END pics/level_crossing/.style args={#1} % symbology entry symbology_level_crossing/.pic = {% \maintrack (0,0) -- (6,0);% \levelcrossing[barrier=semi] at (3,0);% },% }% % %%%%%%%%%%%%%%% % symbol bridge %%%%%%%%%%%%%%% % %% command \newcommand\bridge{}% just for safety \def\bridge[#1]#2(#3){% \bridge[options] at (coord); \pic[side=both,#1] at (#3) {bridge={#2}}% symbol }% \newlength{\shiftleft}\setlength{\shiftleft}{0cm}% \newlength{\shiftright}\setlength{\shiftright}{0cm}% \newtoggle{show_background}\settoggle{show_background}{true}% %% tikz keys \pgfkeys{% /tikz/trackschematic/constructions/bridge/.is family,% /tikz/trackschematic/constructions/bridge/.cd,% % shift shift left/.store in=\shiftleft,% default shift 0cm /tikz/shift left/.forward to=/tikz/trackschematic/constructions/bridge/shift left,% shift right/.store in=\shiftright,% default shift 0cm /tikz/shift right/.forward to=/tikz/trackschematic/constructions/bridge/shift right,% %% show road no background/.value forbidden,% no background/.code={\settoggle{show_background}{false}},% /tikz/no background/.forward to=/tikz/trackschematic/constructions/bridge/no background,% }% %% symbol definition \tikzset{% pics/bridge/.default=,% pics/bridge/.style args={#1}{code={% %% settings \def\coordcommand{#1} % beware of leading and tailing spaces! %% symbol \iftoggle{show_background}{% true \fill[background]% ($(-0.5\objectlength,\objectwidth)+(0,-0.1)$) rectangle% ($(0.5\objectlength,-\objectwidth)+(0,0.1)$);% }{}% \tikzset{every path/.style={draw=foreground,line width=0.75pt}};% \ifdefstring{\side}{both}{% \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftleft,\objectwidth)$) --% ++($(0.1,-0.1)$) --% ++($(\objectlength,0)$) --% ++($(0.1,0.1)$);% left bridge \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftright,-\objectwidth)$) --% ++($(0.1,0.1)$) --% ++($(\objectlength,0)$) --% ++($(0.1,-0.1)$);% right bridge }{% \ifdefstring{\side}{left}{% \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftleft,\objectwidth)$) --% ++($(0.1,-0.1)$) --% ++($(\objectlength,0)$) --% ++($(0.1,0.1)$);% left bridge }{% \ifdefstring{\side}{right}{% \path ($-0.5*(\objectlength,0)+(-0.1,0)+(\shiftright,-\objectwidth)$) --% ++($(0.1,0.1)$) --% ++($(\objectlength,0)$) --% ++($(0.1,-0.1)$);% right bridge }{%% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}% }% END \ifdefstring{\side}{right} }% END \ifdefstring{\side}{left} }% END \ifdefstring{\side}{both} }},% END pics/bridge/.style args={#1} % symbology entry symbology_bridge/.pic = {% \bridge[] at (3,0);% first \maintrack (0,0) -- (6,0);%% secound },% }% % %%%%%%%%%%%%%%% % symbol interlocking %%%%%%%%%%%%%%% % %% command \newcommand\interlocking{}% just for safety \def\interlocking#1(#2){% \interlocking at (coord); \pic at (#2) {interlocking={#1}}% symbol }% %% tikz keys % \pgfkeys{% % /tikz/trackschematic/.is family,% % /tikz/trackschematic/.cd,% % }% %% symbol definition \tikzset{% pics/interlocking/.default=,% pics/interlocking/.style args={#1}{code={% %% settings \def\coordcommand{#1} % beware of leading and tailing spaces! %% symbol \tikzset{every path/.style={draw=foreground,line width=1pt}};% \path (-0.6,-0.4 ) rectangle ++(1.2,0.8); % building \path[fill=foreground] (-0.5,-0.3 ) rectangle ++(1.0,0.2); % table \path[fill=foreground] ( 0 , 0.15) circle (0.15); % human dot }},% END pics/interlocking/.style args={#1} % symbology entry symbology_interlocking/.pic = { \interlocking at (3,0);% },% }% % %%%%%%%%%%%%%%% % symbol hump %%%%%%%%%%%%%%% % %% command \newcommand\hump{}% just for safety \def\hump#1(#2){% \hump at (coord); \pic at (#2) {hump={#1}}% symbol }% %% tikz keys % \pgfkeys{% % /tikz/trackschematic/.is family,% % /tikz/trackschematic/.cd,% % }% %% symbol definition \tikzset{% pics/hump/.default=,% pics/hump/.style args={#1}{code={% %% settings \def\coordcommand{#1} % beware of leading and tailing spaces! %% symbol \tikzset{every path/.style={draw=foreground,line width=0.75pt}};% % left side \path (-0.3, 0.1) -- ++(0,0.05); \path (-0.2, 0.1) -- ++(0,0.15); \path (-0.1, 0.1) -- ++(0,0.25); \path ( 0.0, 0.1) -- ++(0,0.35); \path ( 0.1, 0.1) -- ++(0,0.25); \path ( 0.2, 0.1) -- ++(0,0.15); \path ( 0.3, 0.1) -- ++(0,0.05); % right side \path (-0.3,-0.1) -- ++(0,-0.05); \path (-0.2,-0.1) -- ++(0,-0.15); \path (-0.1,-0.1) -- ++(0,-0.25); \path ( 0.0,-0.1) -- ++(0,-0.35); \path ( 0.1,-0.1) -- ++(0,-0.25); \path ( 0.2,-0.1) -- ++(0,-0.15); \path ( 0.3,-0.1) -- ++(0,-0.05); }},% END pics/hump/.style args={#1} % symbology entry symbology_hump/.pic = {% \secondarytrack (0,0) -- (6,0);% \hump at (3,0);% },% }% % % %%%%%%%%%%%%%%% % symbol pylon %%%%%%%%%%%%%%% % %% command \newcommand\pylon{}% just for safety \def\pylon[#1]#2(#3){% \pylon[options] at (coord); \pic[#1] at (#3) {pylon={#2}}% symbol }% %% symbol definition \tikzset{% pics/pylon/.default=,% pics/pylon/.style args={#1}{code={% %% settings \def\coordcommand{#1}% beware of leading and tailing spaces! % \ifdefstring{\side}{left}{% side \pgfmathsetmacro{\sidefactor}{1}% }{% \ifdefstring{\side}{right}{% side \pgfmathsetmacro{\sidefactor}{-1}% }{% \ifdefstring{\side}{both}{% side }{% error message \pgfkeys{/errors/unknown choice value={/tikz/trackschematic/constructions/side}{“left“, “right“ OR “both“ as key required}}% }% }% }% end \ifdefstring{\side} %% pylon shape \tikzset{every path/.style={draw=foreground,line width=0.5pt}};% \ifdefstring{\side}{both}{% double side \path (0,-0.5) circle [radius=0.075];% part 1 \path (0, 0.5) circle [radius=0.075];% part 2 \path (0,-0.425) -- (0, 0.425);% part 3 }{% single side \path ($\sidefactor*(0,0.5)$) circle [radius=0.075];% part 1 \path ($\sidefactor*(0,0.425)$) -- ++($\sidefactor*(0,-0.7)$);% part 2 }% }},% END pics/pylon/.style args={#1} % symbology entry symbology_pylon/.pic = {% \maintrack (0,0) -- (6,0);% \pylon[side=left] at (1,0);% \pylon[side=left] at (3,0);% \pylon[side=left] at (5,0);% },% }% % %%%%%%%%%%%%%%% \endinput% %