TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Is it possible to define in TikZ a new decoration or something like that, such that it is possible to write something like:

\draw[dim={text,above}] (A) -- (B);
\draw[dim={text,below}] (C) -- (D);

or even better

\draw (A) dim[text,above] (B);
\draw (C) dim[text,below] (C);

to get something like this:


It's important that the text is sloped.

If possible I would prefer the second syntax, because then I could easily combine such path's:

\draw (A) dim[text,above] (B) -- (C) -- (D) dim[text] (E) dim[text,below] (F) -- circle;
share|improve this question
possible duplicate of Dimensioning of a technical drawing in TikZ – Jake Dec 11 '11 at 12:34
It's not a duplicate because the object I want is slightly different, because I want a special syntax and because I want to have the label sloped – student Dec 11 '11 at 12:53
I agree that it isn't a duplicate, just a related question. Having a dim option might be possible, but having a dim path command is not possible (as long you don't rewrite TikZ internal path parser). – Martin Scharrer Dec 11 '11 at 12:59
You can also do this via defining a new decoration with |-| type of arrows. See this question "Line segments with text in the middle in TikZ" and answers for different solutions. – percusse Dec 11 '11 at 17:19
@percusse But how to get the double lines for my case? – student Dec 11 '11 at 17:37
up vote 22 down vote accepted


The result looks fine but perhaps the code can be improved.



\pgfdeclaredecoration{add dim}{final}{

\tikzset{dim/.style args={#1,#2}{decoration={add dim,distance=#2},
                postaction={decorate,decoration={text along path,
                                                 text align={align=center},

\coordinate (A) at (0,0);
\coordinate (B) at (4,2);
\coordinate (C) at (8,-2);

\draw[dim={5 cm,10pt}]  (A) --  (B);
\draw[dim={7 cm,-15pt}]  (B) --  (C); 

\draw[fill=gray] (A) circle(2pt); 
\draw[fill=gray] (B) circle(2pt);
\draw[fill=gray] (C) circle(2pt);    


enter image description here

Update : possible with edge

\draw (A) edge [dim={5 cm,10pt}]  (B) 
          edge[dim={7 cm,-15pt}]  (C)
       (B)edge[dim={4 cm,+10pt}]  (C);  

enter image description here

share|improve this answer
Great. Is it possible to adjust this such that one can write something like \draw (A) dim[text,above] (B) -- (C) -- (D) dim[text] (E) dim[text,below] (F) -- circle; – student Dec 11 '11 at 19:38
@user4011 No it's impossible because decoration is applied to the whole path; you can use edge like in my update code. – Alain Matthes Dec 11 '11 at 20:22
Alain, thanks for this great answer. However, I cannot label the dimension line with a mathematical symbol. As soon as type in $a$ for exmaple, the macro does weird stuff. Is there any way to fix this? – Ingo Jun 5 '13 at 8:13
I'm using pdflatex and had to terminate the application manually after passing a math symbol to the macro as a label... – John Chris Nov 21 '14 at 16:51

Here is a solution, via to path, that allows to use the second required syntax:

enter image description here

  dim above/.style={to path={\pgfextra{
        \draw[>=latex,|<->|] let
        in(\p1) -- (\p2) node[pos=.5,sloped,above]{#1};
      }(\tikztostart) -- (\tikztotarget) \tikztonodes
  dim below/.style={to path={\pgfextra{
        \draw[>=latex,|<->|] let 
        in (\p1) -- (\p2) node[pos=.5,sloped,below]{#1};
      }(\tikztostart) -- (\tikztotarget) \tikztonodes

  \draw (0,0) to[dim above=text] (4,-2) to[dim below=other text](0,-4);
share|improve this answer

In the interim, for whomever might be interested in a pstricks version of this style, which presents a pretty straight-forward way of rotating text labels between paths:

enter image description here

\usepackage{pstricks,pstricks-add}% http://www.tug.org/PSTricks/main.cgi/


It requires the traditional latex -> dvips -> ps2pdf or xelatex compiling sequence (unless you're using auto-pst-pdf).

share|improve this answer
|<*->|* and |*-|* give more precise ends. – kiss my armpit Nov 13 '13 at 5:11

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.