Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

How can I do this diagram with tikz?

share|improve this question
Could you name this kind of diagram? Then you should add such term in question title and body, making it less vague when you don't see a picture and more useful for googlers/searchers. –  przemoc Jul 12 '11 at 14:02

2 Answers 2

up vote 3 down vote accepted

My tikz answer is a little longer than with egreg's xy-pic solution. Here is the code.



%this shifts a straight line perpendicular to its direction
\tikzstyle{s}=[decorate,decoration={show path construction,
lineto code={
    \draw let 
    \p1 = (\tikzinputsegmentfirst),
    \p2 = (\tikzinputsegmentlast),
    \p3 = ($(\p2)-(\p1)$),
    \p4 = ($(\p1)+{2/veclen(\x3,\y3)}*(\p3)$)
    ($(\p1)!1!90:(\p4)$) -- ++ (\p3)



\matrix[matrix of math nodes,column sep=1cm,row sep=1cm] (m) {

\draw[->] (m-1-1) -- (m-1-2);
\draw[->] (m-1-2) -- (m-1-3);
\draw[->] (m-1-3) -- (m-1-4) node[above,midway] {$\scriptstyle\alpha$};
\draw[->] (m-1-4) -- (m-1-5);
\draw[->] (m-2-1) -- (m-2-2);
\draw[->] (m-2-2) -- (m-2-3);
\draw[->] (m-2-3) -- (m-2-4) node[above,midway] {$\scriptstyle\alpha'$} ;
\draw[->] (m-2-4) -- (m-2-5);

\draw[double equal sign distance,shorten <=5pt,shorten >=5pt] (m-1-4) -- (m-2-4);
\draw[s,->] (m-1-3) -- (m-2-3) node[right,midway] {$\scriptstyle\lambda$};
\draw[s,->] (m-2-3) -- (m-1-3) node[left,midway] {$\scriptstyle\lambda'$};

The result is

enter image description here

From comments: There is problem with horizontal lines between node. Here are two solutions. 1- (suggested from the link in the comments) Add text height and width for the nodes. The beginning code for the matrix is then

\matrix[matrix of math nodes,column sep=1cm,row sep=1cm,text height=1.5ex, text depth=0.25ex]

2- Here are two styles you can use to make sure you get horizontal lines. You can also use small adjustments such as \vphantom{'} (see comments). They are a little like the -| and |- to get lines, but without the |.

%draws a horizontal line with the vertical position determined by
%the end point of the specified points.
%hwrend : hor. with respect to end
\tikzstyle{hwrend}=[decorate,decoration={show path construction,
lineto code={
    \draw let 
    \p1 = (\tikzinputsegmentfirst),
    \p2 = (\tikzinputsegmentlast),
    \p3 = ($(\p2)-(\p1)$)
    (\x1,\y2) -- ++ (\x3,0)

%hwrstart : hor. with respect to start
\tikzstyle{hwrstart}=[decorate,decoration={show path construction,
lineto code={
    \draw let 
    \p1 = (\tikzinputsegmentfirst),
    \p2 = (\tikzinputsegmentlast),
    \p3 = ($(\p2)-(\p1)$)
    (\x1,\y1) -- ++ (\x3,0)
share|improve this answer
Interesting; I'd add \scriptstyle for the arrow labels and \vphantom{'} to better align the bottom row. –  egreg Jul 11 '11 at 21:29
Yes, it works. But if I write \path instead of \draw it doesn't work, could you tell me the difference between them, please? –  Peter E Jul 11 '11 at 21:45
@Frederic: Replace double by double equal sign distance to get correctly spaced lines. –  Caramdir Jul 11 '11 at 22:01
@Peter: \path basically only creates the graphic, but does not actually draw it (there are situations where this is quite useful). –  Caramdir Jul 11 '11 at 22:03
@Caramdir: thanks for the suggestion. –  Frédéric Jul 12 '11 at 0:55

I don't know with TikZ, but with Xy-pic it's quite easy:


  0 \ar[r] &
  K \ar[r] &
  P \ar@<3pt>[d]^{\lambda} \ar[r]^{\alpha}  &
  M \ar@{=}[d] \ar[r] &
  0 \\
  0\vphantom{'} \ar[r] &
  K' \ar[r] &
  P' \ar@<3pt>[u]^{\lambda'} \ar[r]^{\alpha'} &
  M\vphantom{'} \ar[r] &


share|improve this answer

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.