%% Dimension line for LaTeX/TikZ %% Copyright © 2013 Sébastien Gross %% %% 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.