%% Dimension line for LaTeX/TikZ
%% Copyright © 2013 Sébastien Gross <seb•ɑƬ•chezwam•ɖɵʈ•org>
%%
%% This file may be distributed and/or modified
%%
%% 1. under the LaTeX Project Public License and/or
%% 2. under the WTF Public License.
%%
%%
%% This simplify the creation drawing of dimension arrows.
%%
%%
%% To install it copy the tango directory to either:
%% - $TEXHOME/tex/latex/
%% - ~/texmf/tex/latex/
%% - ~/Library/texmf/tex/latex
%%
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{tikz-dimline}[2013/03/13 v1.0 initial version]
\RequirePackage{tikz}
\RequirePackage{pgfplots}
\RequirePackage{ifthen}
\usetikzlibrary{calc,decorations.markings,arrows}
\makeatletter
\pgfkeys {
/dimline/.cd,
execute style/.style = {#1},
execute macro/.style = {/dimline/execute style/.expand once=#1},
}
\newdimen\dimline@arrow@linewidth
\pgfarrowsdeclare{dimline}{dimline}
{
\arrowsize=1\pgflinewidth
\pgfarrowsleftextend{0\arrowsize}
\pgfarrowsrightextend{5\arrowsize}
} {
\arrowsize=1\pgflinewidth
\pgfsetdash{}{0pt} % do not dash
% |
\pgfsetlinewidth{.5\arrowsize}
\pgfpathmoveto{\pgfpoint{4.75\arrowsize}{3\arrowsize}}
\pgfpathlineto{\pgfpoint{4.75\arrowsize}{-3\arrowsize}}
\pgfusepathqstroke
% >
\pgfsetlinewidth{0.01pt}
\pgfpathmoveto{\pgfpoint{4.5\arrowsize}{0pt}}
\pgfpathlineto{\pgfpoint{-3\arrowsize}{2\arrowsize}}
\pgfpathlineto{\pgfpoint{-3\arrowsize}{-2\arrowsize}}
\pgfpathclose
\pgfusepathqfillstroke
}
\pgfarrowsdeclare{dimline reverse}{dimline reverse}
{
\arrowsize=1\pgflinewidth
\pgfarrowsleftextend{-5\arrowsize}
\pgfarrowsrightextend{0\arrowsize}
} {
\arrowsize=1\pgflinewidth
\pgfsetdash{}{0pt} % do not dash
% |
\pgfsetlinewidth{0.5\arrowsize}
\pgfpathmoveto{\pgfpoint{-0.25\arrowsize}{3\arrowsize}}
\pgfpathlineto{\pgfpoint{-0.25\arrowsize}{-3\arrowsize}}
\pgfusepathqstroke
% >
\pgfsetlinewidth{0.01pt}
\pgfpathmoveto{\pgfpoint{0pt}{0pt}}
\pgfpathlineto{\pgfpoint{7.5\arrowsize}{2\arrowsize}}
\pgfpathlineto{\pgfpoint{7.5\arrowsize}{-2\arrowsize}}
\pgfpathclose
\pgfusepathqfillstroke
}
% measure lenght
%
http://tex.stackexchange.com/questions/123913
\newcommand{\dimline@do@nothing}[1]{#1}%
%
http://tex.stackexchange.com/questions/58283/tikz-how-to-determine-the-vector-between-two-co-ordinates
% #1: optional keys parameters
% #2: start point
% #3: end point
% #4: text
\newcommand{\dimline}[4][]{%
\pgfplotsifinaxis{%
\let\dimline@internal\pgfplotsextra%
}{%
\let\dimline@internal\dimline@do@nothing%
}%
\dimline@internal{
\pgfkeys{
dimline/.is family,
dimline,
color/.initial = black,
extension start length/.initial=1cm,
extension end length/.initial=1cm,
extension start angle/.initial=-90,
extension end angle/.initial=90,
line style/.initial = {},
label style/.initial = {},
extension style/.initial = {},
extension start style/.initial = {},
extension start path/.initial = {},
extension end style/.initial = {},
extension end path/.initial = {},
#1,
line style/.get = \dimline@line@style,
label style/.get = \dimline@label@style,
extension style/.get = \dimline@extension@style,
extension start style/.get = \dimline@extension@start@style,
extension start path/.get = \dimline@extension@start@path,
extension end style/.get = \dimline@extension@end@style,
extension end path/.get = \dimline@extension@end@path,
}
\begin{scope} [
line/.style = {
color=\pgfkeysvalueof{/dimline/color},
arrows=dimline-dimline,
/dimline/execute macro = \dimline@line@style,
},
extension/.style = {
color=\pgfkeysvalueof{/dimline/color}!40, line width=0.01,
/dimline/execute macro = \dimline@extension@style,
},
extension start/.style = {
extension,
/dimline/execute macro = \dimline@extension@start@style
},
extension end/.style = {
extension,
/dimline/execute macro = \dimline@extension@end@style,
},
label/.style = {
fill=white, align=center, sloped=true, pos=0.5,
/dimline/execute macro = \dimline@label@style
},
]
\coordinate (a) at #2 {};
\coordinate (b) at #3 {};
\ifthenelse{\equal{\dimline@extension@start@path}{}}{
\coordinate (a to b) at ($(a)!\pgfkeysvalueof{/dimline/extension start length}!\pgfkeysvalueof{/dimline/extension start angle}:(b)$);
\draw [extension start] (a.center) -- (a to b);
} {
\draw [extension start] plot coordinates {\dimline@extension@start@path};
}
\ifthenelse{\equal{\dimline@extension@end@path}{}}{
\coordinate (b to a) at ($(b)!\pgfkeysvalueof{/dimline/extension end length}!\pgfkeysvalueof{/dimline/extension end angle}:(a)$);
\draw [extension end] (b.center) -- (b to a);
} {
\draw [extension end] plot coordinates {\dimline@extension@end@path};
}
\draw[line] (a.center) -- (b.center) node[label] {#4};
\end{scope}
}
}
\@ifclassloaded{beamer}{%
\renewcommand<>{\dimline}[4][]{\only#5{\beameroriginal{\dimline}[#1]{#2}{#3}{#4}}}
}
\makeatother
\endinput
%% tikz-dimline.sty ends here.