Here's a modification of the TikZ version from How do you draw the "snake" arrow for the connecting homomorphism in the snake lemma?. One could fine tune the spacing and curving a bit better, I guess. Also, if I were writing it from fresh I'd label things more appropriately for this incantation of the snake lemma.
Code:
\documentclass{article}
%\url{https://tex.stackexchange.com/q/31687/86}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{%
matrix,%
calc,%
arrows%
}
\DeclareMathOperator{\coker}{coker}
\begin{document}
\begin{tikzpicture}[>=angle 60]
\matrix[matrix of math nodes,column sep={30pt},row sep={40pt,between origins}] (s)
{
&|[name=0a]| 0 &|[name=0b]| 0 &|[name=0c]| 0 \\
%
|[name=0k]| 0 &|[name=ka]| \ker \lambda &|[name=kb]| \ker \mu &|[name=kc]| \ker \nu \\
%
|[name=0A]| 0 &|[name=A]| L_1 &|[name=B]| M_1 &|[name=C]| N_1 &|[name=01]| 0 \\
%
|[name=02]| 0 &|[name=A']| L_0 &|[name=B']| M_0 &|[name=C']| N_0 &|[name=0C']| 0 \\
%
&|[name=ca]| \coker \lambda &|[name=cb]| \coker \mu &|[name=cc]| \coker \nu &|[name=0ck]| 0 \\
%
&|[name=0ca]| 0 &|[name=0cb]| 0 &|[name=0cc]| 0 \\
%
};
% Horizontal arrows
\foreach \start/\end in {%
0A/A,
A/B,
B/C,
C/01,
02/A',
A'/B',
B'/C',
C'/0C',
0k/ka,
ka/kb,
kb/kc,
ca/cb,
cb/cc,
cc/0ck%
} {
\draw[->] (\start.mid east) -- (\end.mid west);
}
% Vertical arrows
\foreach \start/\end in {%
0a/ka,
0b/kb,
0c/kc,
ka/A,
kb/B,
kc/C,
A/A',
B/B',
C/C',
A'/ca,
B'/cb,
C'/cc,
ca/0ca,
cb/0cb,
cc/0cc%
} {
\draw[->] (\start) -- (\end);
}
\path (A.mid east) -- node[auto] {\(\alpha_1\)} (B.mid west);
\path (B.mid east) -- node[auto] {\(\beta_1\)} (C.mid west);
\path (A'.mid east) -- node[auto,swap] {\(\alpha_0\)} (B'.mid west);
\path (B'.mid east) -- node[auto,swap] {\(\beta_0\)} (C'.mid west);
\path (A) -- node[auto,swap] {\(\lambda\)} (A');
\path (B) -- node[auto,swap,pos=.3] {\(\mu\)} (B');
\path (C) -- node[auto,swap] {\(\nu\)} (C');
\path (C.mid east) -- node (gap) {} (A'.mid west);
\draw[->] (kc.mid east) to[out=0,in=90] ($(kc)+(1,-.5)$) -- node[auto] {\(\delta\)} ($(C)+(1,.5)$) to[out=-90,in=0] (C.mid east) -- (gap) -- (A'.mid west) to[out=180,in=90] ($(A')+(-1.3,-.5)$) -- ($(ca)+(-1.3,.5)$) to[out=-90,in=180] (ca.mid west);
\end{tikzpicture}
\end{document}
And result:
Edit (in response to the comment)
To get the dashed arrows, we simply pull those ones out of the "Horizontal arrows" list and create a new loop for these, adding in the dashed
option. Full code:
\documentclass{article}
%\url{https://tex.stackexchange.com/q/31687/86}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{%
matrix,%
calc,%
arrows%
}
\DeclareMathOperator{\coker}{coker}
\begin{document}
\begin{tikzpicture}[>=angle 60]
\matrix[matrix of math nodes,column sep={30pt},row sep={40pt,between origins}] (s)
{
&|[name=0a]| 0 &|[name=0b]| 0 &|[name=0c]| 0 \\
%
|[name=0k]| 0 &|[name=ka]| \ker \lambda &|[name=kb]| \ker \mu &|[name=kc]| \ker \nu \\
%
|[name=0A]| 0 &|[name=A]| L_1 &|[name=B]| M_1 &|[name=C]| N_1 &|[name=01]| 0 \\
%
|[name=02]| 0 &|[name=A']| L_0 &|[name=B']| M_0 &|[name=C']| N_0 &|[name=0C']| 0 \\
%
&|[name=ca]| \coker \lambda &|[name=cb]| \coker \mu &|[name=cc]| \coker \nu &|[name=0ck]| 0 \\
%
&|[name=0ca]| 0 &|[name=0cb]| 0 &|[name=0cc]| 0 \\
%
};
% Horizontal arrows
\foreach \start/\end in {%
A/B,
B/C,
C/01,
02/A',
A'/B',
B'/C',
ka/kb,
kb/kc,
ca/cb,
cb/cc%
} {
\draw[->] (\start.mid east) -- (\end.mid west);
}
% Horizontal dashed arrows
\foreach \start/\end in {%
0k/ka,
0A/A,
C'/0C',
cc/0ck%
} {
\draw[dashed,->] (\start.mid east) -- (\end.mid west);
}
% Vertical arrows
\foreach \start/\end in {%
0a/ka,
0b/kb,
0c/kc,
ka/A,
kb/B,
kc/C,
A/A',
B/B',
C/C',
A'/ca,
B'/cb,
C'/cc,
ca/0ca,
cb/0cb,
cc/0cc%
} {
\draw[->] (\start) -- (\end);
}
\path (A.mid east) -- node[auto] {\(\alpha_1\)} (B.mid west);
\path (B.mid east) -- node[auto] {\(\beta_1\)} (C.mid west);
\path (A'.mid east) -- node[auto,swap] {\(\alpha_0\)} (B'.mid west);
\path (B'.mid east) -- node[auto,swap] {\(\beta_0\)} (C'.mid west);
\path (A) -- node[auto,swap] {\(\lambda\)} (A');
\path (B) -- node[auto,swap,pos=.3] {\(\mu\)} (B');
\path (C) -- node[auto,swap] {\(\nu\)} (C');
\path (C.mid east) -- node (gap) {} (A'.mid west);
\draw[->] (kc.mid east) to[out=0,in=90] ($(kc)+(1,-.5)$) -- node[auto] {\(\delta\)} ($(C)+(1,.5)$) to[out=-90,in=0] (C.mid east) -- (gap) -- (A'.mid west) to[out=180,in=90] ($(A')+(-1.3,-.5)$) -- ($(ca)+(-1.3,.5)$) to[out=-90,in=180] (ca.mid west);
\end{tikzpicture}
\end{document}
And result:
PSTricks
or aTikZ
answer?