285 lines
11 KiB
TeX
285 lines
11 KiB
TeX
%% 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.measures.code.tex}%
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
% global settings
|
|
%%%%%%%%%%%%%%%
|
|
\RequirePackage{tikz,etoolbox}%
|
|
\usetikzlibrary{calc,intersections,arrows.meta}%
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
% tikz keys for multiple use
|
|
%%%%%%%%%%%%%%%
|
|
\ifdeflength{\objectlength}{}{% Not defined, so define it!
|
|
\newlength{\objectlength}%
|
|
}%
|
|
\setlength{\objectlength}{4cm}%
|
|
%
|
|
\pgfkeys{%
|
|
/tikz/trackschematic/.is family,%
|
|
/tikz/trackschematic/.cd,%
|
|
%% color foreground
|
|
foreground/.store in=\foreground,%
|
|
foreground=black,% DEFAULT
|
|
/tikz/foreground/.forward to=/tikz/trackschematic/foreground,%
|
|
%% color background
|
|
background/.store in=\background,%
|
|
background=white,% DEFAULT
|
|
/tikz/background/.forward to=/tikz/trackschematic/background,%
|
|
%% face
|
|
face/.value required,% forward, backward OR bidirectional
|
|
face/.store in=\face,% forward, backward OR bidirectional
|
|
/tikz/face/.forward to=/tikz/trackschematic/face,%
|
|
/tikz/forward/.code={\pgfkeys{/tikz/trackschematic/face=forward}},%
|
|
/tikz/backward/.code={\pgfkeys{/tikz/trackschematic/face=backward}},%
|
|
/tikz/bidirectional/.code={\pgfkeys{/tikz/trackschematic/face=bidirectional}},%
|
|
%% 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,%
|
|
/tikz/traffic practice/.forward to=/tikz/trackschematic/traffic practice,%
|
|
/tikz/position/.forward to=/tikz/trackschematic/traffic practice,%
|
|
%% label
|
|
shift label/.store in=\labelcoord,% (coord)
|
|
shift label=(none),% DEFAULT
|
|
/tikz/shift label/.forward to=/tikz/trackschematic/shift label,%
|
|
}%
|
|
\tikzset{traffic practice=right}%
|
|
%
|
|
% tikz keys
|
|
\pgfkeys{%
|
|
/tikz/trackschematic/measures/.is family,%
|
|
/tikz/trackschematic/measures/.cd,%
|
|
%% color hectometer
|
|
color/.store in=\hectometercolor,%
|
|
color=\foreground!50!\background,% DEFAULT
|
|
/tikz/hectometer color/.forward to=/tikz/trackschematic/measures/color,%
|
|
}%
|
|
%%%%%%%%%%%%%%%%
|
|
% symbol train berth
|
|
%%%%%%%%%%%%%%%
|
|
%% command
|
|
\newcommand\berth{}% just for safety
|
|
\def\berth[#1]#2(#3)#4(#5){% \berth[options] at (coord) length (usable length);
|
|
\pic[#1] at (#3) {train_berth={#2/#4/#5}}% symbol
|
|
}%
|
|
%%
|
|
%% symbol definition
|
|
\tikzset{%
|
|
pics/train_berth/.default=,%
|
|
pics/train_berth/.style args={#1/#2/#3}{code={%
|
|
%% settings
|
|
\def\coordcommand{#1}% beware of leading and tailing spaces!
|
|
\def\labelcommand{#2}% beware of leading and tailing spaces!
|
|
\def\labelcontent{#3}%
|
|
%% face setup
|
|
\ifdefstring{\face}{bidirectional}{% face
|
|
\pgfmathsetmacro{\facefactor}{1}%
|
|
}{%
|
|
\ifdefstring{\face}{forward}{% face
|
|
\pgfmathsetmacro{\facefactor}{1}%
|
|
}{%
|
|
\ifdefstring{\face}{backward}{% face
|
|
\pgfmathsetmacro{\facefactor}{-1}%
|
|
}{% error message
|
|
\pgfkeys{/errors/unknown choice value={/tikz/trackschematic/face}{“forward“, “backward“ OR “bidirectional“ as key required}}%
|
|
}%
|
|
}%
|
|
}% end \ifdefstring{\face}
|
|
%% 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}
|
|
%
|
|
\tikzset{every path/.style={draw=\foreground,line width=0.75pt,line cap=round,dash pattern=on 0pt off 2.4\pgflinewidth}};%
|
|
\path% berth shape forward
|
|
($-0.5*(\objectlength,0) + (-0.05,0) + \trafficfactor*\facefactor*(0,-0.25)$) --%
|
|
($-0.5*(\objectlength,0) + (-0.05,0) + \trafficfactor*\facefactor*(0,-0.35)$)%
|
|
($-0.5*(\objectlength,0) + (-0.05,0) + \trafficfactor*\facefactor*(0,-0.35) + (\pgflinewidth,0)$) --%
|
|
($ 0.5*(\objectlength,0) + ( 0.05,0) + \trafficfactor*\facefactor*(0,-0.35)$)%
|
|
($ 0.5*(\objectlength,0) + ( 0.05,0) + \trafficfactor*\facefactor*(0,-0.25)$) --%
|
|
($ 0.5*(\objectlength,0) + ( 0.05,0) + \trafficfactor*\facefactor*(0,-0.35)$);% berth shape forward
|
|
\path[draw=none,fill=\foreground]% arrow front
|
|
($\facefactor*0.5*(\objectlength,0) + \facefactor*(-0.1,0) + \trafficfactor*\facefactor*(0,-0.35)$) --%
|
|
++($(0,-0.04) + \facefactor*(-0.1,0)$) -- ++(0,0.08) -- cycle;% arrow
|
|
\path[draw=none,fill=\foreground]% arrow back
|
|
($\facefactor*-0.5*(\objectlength,0) + \facefactor*(0.2,0) + \trafficfactor*\facefactor*(0,-0.35)$) --%
|
|
++($(0,-0.04) + \facefactor*(-0.1,0)$) -- ++(0,0.08) -- cycle;% arrow
|
|
\ifdefstring{\face}{bidirectional}{% bidirectional
|
|
\pgfmathsetmacro{\facefactor}{-1}%
|
|
\path% berth shape forward
|
|
($-0.5*(\objectlength,0) + (-0.05,0) + \trafficfactor*\facefactor*(0,-0.25)$) --%
|
|
($-0.5*(\objectlength,0) + (-0.05,0) + \trafficfactor*\facefactor*(0,-0.35)$)%
|
|
($-0.5*(\objectlength,0) + (-0.05,0) + \trafficfactor*\facefactor*(0,-0.35) + (\pgflinewidth,0)$) --%
|
|
($ 0.5*(\objectlength,0) + ( 0.05,0) + \trafficfactor*\facefactor*(0,-0.35)$)%
|
|
($ 0.5*(\objectlength,0) + ( 0.05,0) + \trafficfactor*\facefactor*(0,-0.25)$) --%
|
|
($ 0.5*(\objectlength,0) + ( 0.05,0) + \trafficfactor*\facefactor*(0,-0.35)$);% berth shape forward
|
|
\path[draw=none,fill=\foreground]% arrow front
|
|
($\facefactor*0.5*(\objectlength,0) + \facefactor*(-0.1,0) + \trafficfactor*\facefactor*(0,-0.35)$) --%
|
|
++($(0,-0.04) + \facefactor*(-0.1,0)$) -- ++(0,0.08) -- cycle;% arrow
|
|
\path[draw=none,fill=\foreground]% arrow back
|
|
($\facefactor*-0.5*(\objectlength,0) + \facefactor*(0.2,0) + \trafficfactor*\facefactor*(0,-0.35)$) --%
|
|
++($(0,-0.04) + \facefactor*(-0.1,0)$) -- ++(0,0.08) -- cycle;% arrow
|
|
}{}%
|
|
%% label
|
|
\ifdefstring{\labelcontent}{}{}{% label NOT empty
|
|
\node[fill=\background,text=\foreground,inner sep=1pt] at ($\facefactor*(0,-0.35)$) {\tiny \labelcontent};%
|
|
\ifdefstring{\face}{bidirectional}{% bidirectional
|
|
\pgfmathsetmacro{\facefactor}{1}%
|
|
\node[fill=\background,text=\foreground,inner sep=1pt] at ($\facefactor*(0,-0.35)$) {\tiny \labelcontent};%
|
|
}{}%
|
|
}%
|
|
}},% END pics/train_berth/.style args={#1/#2/#3}
|
|
% symbology entry
|
|
symbology_train_berth/.pic = {%
|
|
\maintrack (0,0) -- (6,0);%
|
|
\berth[forward] at (3,0) length (length);%
|
|
},%
|
|
}%
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
% symbol track distance
|
|
%%%%%%%%%%%%%%%
|
|
%
|
|
%% command
|
|
\newcommand\trackdistance{}% just for safety
|
|
\def\trackdistance#1(#2)#3(#4)#5(#6){% \trackdistance between (coord1) and (coord2) distance (distance);
|
|
\path[draw=\background,<->,>={Stealth[\foreground,inset=0pt,angle=50:0.2cm]},shorten <=1pt,shorten >=1pt] (#2) -- (#4)% arrow tips
|
|
node[hectometer base=(current bounding box.center),text=\foreground,midway,sloped,rotate=90] {#6};% label
|
|
}%
|
|
% symbology entry
|
|
\tikzset{%
|
|
symbology_track_distance/.pic = {%
|
|
\maintrack (0,-0.5) -- (6,-0.5);%
|
|
\maintrack (0, 0.5) -- (6, 0.5);%
|
|
\trackdistance between (3, 0.5) and (3,-0.5) distance (distance);%
|
|
},%
|
|
}%
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
% symbol hectometer posts
|
|
%%%%%%%%%%%%%%%
|
|
%
|
|
%% command
|
|
\newcommand\hectometer{}% just for safety
|
|
\def\hectometer[#1]#2(#3)#4(#5){% \hectometer[options] at (coord) label (name);
|
|
\pic[#1] at (#3) {hectometer_posts={#2/#4/#5}}% symbol
|
|
}%
|
|
% tikz keys
|
|
\pgfkeys{%
|
|
/tikz/trackschematic/measures/hectometer/.is family,%
|
|
/tikz/trackschematic/measures/hectometer/.cd,%
|
|
%% hectometer base
|
|
base/.value required,%
|
|
base/.store in=\basecoord,%
|
|
/tikz/hectometer base/.forward to=/tikz/trackschematic/measures/hectometer/base,%
|
|
%% hectometer base
|
|
orientation/.value required,%
|
|
orientation/.store in=\orientation,%
|
|
/tikz/orientation/.forward to=/tikz/trackschematic/measures/hectometer/orientation,%
|
|
}%
|
|
%% symbol definition
|
|
\tikzset{%
|
|
pics/hectometer_posts/.default=,%
|
|
pics/hectometer_posts/.style args={#1/#2/#3}{code={%
|
|
%% settings
|
|
\def\coordcommand{#1}% beware of leading and tailing spaces!
|
|
\def\labelcommand{#2}% beware of leading and tailing spaces!
|
|
\def\labelcontent{#3}%
|
|
%
|
|
%% orientation setup
|
|
\ifdefstring{\orientation}{left}{% orientation
|
|
\def\align{right}%
|
|
}{%
|
|
\ifdefstring{\orientation}{right}{% orientation
|
|
\def\align{left}%
|
|
}{% error message
|
|
\pgfkeys{/errors/unknown choice value={/tikz/trackschematic/measures/hectometer/orientation}{“left“ OR “right“ as key required}}%
|
|
}%
|
|
}% end \ifdefstring{\orientation}
|
|
%% calculation of coordinates
|
|
%%
|
|
%% bend 1 bend 2
|
|
%% (0,0.75) (ts-hm-b1) (ts-hm-b2)
|
|
%% (0,0)• • ------- • --------- • ----- •(ts-hm-l) label
|
|
%%
|
|
\path let \p1=\basecoord in coordinate (ts-hm-l) at (0,\y1);%
|
|
\ifdefstring{\labelcoord}{(none)}{%
|
|
\coordinate (ts-hm-b1) at (ts-hm-l);%
|
|
\coordinate (ts-hm-b2) at (ts-hm-l);%
|
|
}{% initialize if NOT default
|
|
\coordinate (ts-hm-b1) at ($(ts-hm-l) + (0,0.5)$);%
|
|
\path let \p1=\labelcoord in coordinate (ts-hm-b2) at ($(ts-hm-l) + (\x1,0.25)$);%
|
|
\path let \p1=\labelcoord in coordinate (ts-hm-l) at ($(ts-hm-l) + (\x1,\y1)$);%
|
|
}%
|
|
%% symbol
|
|
\path[draw=\hectometercolor,dashed,shorten <=0.75cm]%
|
|
(0,0) -- (ts-hm-b1) -- (ts-hm-b2) -- (ts-hm-l);%
|
|
%% label
|
|
\ifdefstring{\labelcontent}{}{}{% label NOT empty
|
|
\node[font=\sffamily,text=\hectometercolor,rotate=-90,\orientation,align=\align,fill=\background] at (ts-hm-l) {\labelcontent};%
|
|
}%
|
|
}},% END
|
|
% symbology entry
|
|
symbology_hectometer/.pic = {%
|
|
\tikzset{hectometer base={(0,-2)},orientation=right};%
|
|
\hectometer[] at (0,0) mileage (hectometer 1);%
|
|
\hectometer[] at (3,0) mileage (hectometer 2);%
|
|
\hectometer[shift label={(0.3,0)}] at (3.5,0) mileage (hectometer 3);%
|
|
\hectometer[] at (6,0) mileage (hectometer 4);%
|
|
},%
|
|
}%
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
% symbol measureline
|
|
%%%%%%%%%%%%%%%
|
|
%
|
|
% command
|
|
\newcommand\measureline{}% just for safety
|
|
\def\measureline{\path[MeasureLine]}% \measureline (coord1) -- (coord2);
|
|
%
|
|
\tikzset{%
|
|
MeasureLine/.style={draw=\hectometercolor,dashed,shorten <=0.75cm,shorten >=0.75cm},
|
|
% symbology entry
|
|
symbology_measure_line/.pic = {%
|
|
\measureline (0,0) -- (6,0);%
|
|
},%
|
|
}%
|
|
%%%%%%%%%%%%%%%
|
|
% symbol track marking
|
|
%%%%%%%%%%%%%%%
|
|
%
|
|
% command
|
|
\newcommand\trackmarking{}% just for safety
|
|
\def\trackmarking[#1]{\path[draw,TrackMark,#1]}% \trackmarking[color] (coord1) -- (coord2);
|
|
%
|
|
\tikzset{%
|
|
TrackMark/.style={line width=8pt, opacity=0.4, arrows = {Bar[line cap=round,line width=1pt,width=12pt]-Bar[line cap=round,line width=1pt,width=12pt]},shorten >=1pt,shorten <=1pt},
|
|
% symbology entry
|
|
symbology_track_marking/.pic = {%
|
|
\maintrack (0,0) -- (6,0);%
|
|
\trackmarking[] (1,0) -- (5,0);%
|
|
},%
|
|
}%
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
% TODO:
|
|
% * platform length
|
|
% * direction of milage
|
|
%
|
|
%%%%%%%%%%%%%%%
|
|
\endinput%
|
|
% |