这是对该问题的后续回答:如何绘制蛇形引理中连接同态的“蛇”形箭头?
我正在尝试使用 xy-pic 模拟 Aluffi 在他的书“代数,第 0 章”中绘制的蛇形图:
但我无法正确修改 Matsaya 的代码以实现此目的。我特别喜欢此图的一点是蛇形线,它以这种方式穿过图。
答案1
以下是一次尝试。
首先,代码:
\documentclass{minimal}
\usepackage[all,cmtip]{xy}
\usepackage{amsmath}
\DeclareMathOperator{\coker}{coker}
\newcommand*\pp{{\rlap{\('\)}}}
\begin{document}
%
\[
\xymatrix@!R{
& 0 & 0 & 0 \\
0 \ar@{-->}[r] & {\ker(a)} \ar[r] & {\ker(b)} \ar[r] & {\ker(c)}
\ar@{-}`r[d]`[d]^\delta[d] % curved arrow 1
& \\
0 \ar@{-->}[r] & A \ar[r]^{f} & B \ar[r]^{g} & C \ar[r]
\ar@{}+<0.6cm,0cm>="p1" %intersection point 1
& 0 \\
0 \ar[r] & A\pp \ar[r]^{f'}
\ar@{}[l]+<1cm,0cm>="p2" %intersection point 2
\ar`_l[l]+<1.03cm,0cm>`[d]`[d][d] % curved arrow 2
& B\pp \ar[r]^{g'} & C\pp \ar@{-->}[r] & 0 \\
& {\coker(a)} \ar[r] & {\coker(b)} \ar[r] & {\coker(c)} \ar@{-->}[r] & 0 \\
& 0 & 0 & 0 \\
% vertical arrows
\ar"1,2";"2,2" \ar"1,3";"2,3" \ar"1,4";"2,4"
\ar"2,2";"3,2" \ar"2,3";"3,3" \ar"2,4";"3,4"
\ar"3,2";"4,2"^a \ar"3,3";"4,3"^<<b \ar"3,4";"4,4"^c
\ar"4,2";"5,2" \ar"4,3";"5,3" \ar"4,4";"5,4"
\ar"5,2";"6,2" \ar"5,3";"6,3" \ar"5,4";"6,4"
% diagonal arrow, with 1 hole
\ar@{-}"p1";"p2"|!{"2,3";"3,3"}\hole
}
\]
\end{document}
然后是一些解释。
\xymatrix@!R
强制所有冒号空格相等\newcommand*\pp{{\rlap{\('\)}}}
是隐藏素数的宽度(不是必需的)\ar"1,3";"2,3"
是箭头的明确位置|!{[];[d]}\hole
在当前箭头与从[]
到 的(直线)相交的位置打一个洞[d]
\ar`d[t1]`[t2][t3]
从d
方向开始,转到入口t1
,转四分之一圈,转到入口t2
,转四分之一圈,最后到t3
。/4pt
改变半径。 甚至可以用`^d[t]
或`_ul[t]
语法决定转弯的方向。 但你只能做 1/8 的转弯,而不是你想要的 1/16。最后,我们将两个交点位置命名为 p1 和 p2
\ar@{}+<0.6cm,0cm>="p1"
(交点的寻找是手动完成的,但也许可以改进)并在两点之间画一条箭头。
此版本已“改进”。即间距和定位与您的示例更加一致(但第一个代码可以很容易地更改)。我还添加了虚线箭头@{-->}
(您可以用 来表示点@{..>}
)并将 放在b
稍上方(用 来表示^<<b
)。
您也可以用稍微不同的方式来做,并且不命名点。要获得倾斜的箭头,只需向左移动,然后通过适当的值修改目标(这里也手动查找)。NB 我认为您只能使用语法 +vector 修改路径的最后一个条目。所以你必须分两次绘制箭头。
\[
\xymatrix@!{
& {\ker(a)} \ar[r] & {\ker(b)} \ar[r] & {\ker(c)}
\ar@{-}`r[d]`[d]^\delta[dll]-<1.35cm,2.315cm>|!{"2,3";"3,3"}\hole % curved arrow 1
& \\
& A \ar[r]^{f} & B \ar[r]^{g} & C \ar[r]
& 0 \\
0 \ar[r] & A\pp \ar[r]^{f'}
\ar`_l[l]+<1cm,0cm>`[d]`[d][d]% curved arrow 2
& B\pp \ar[r]^{g'} & C\pp & \\
& {\coker(a)} \ar[r] & {\coker(b)} \ar[r] & {\coker(c)} & \\
% vertical arrows
\ar"1,2";"2,2" \ar"1,3";"2,3" \ar"1,4";"2,4"
\ar"2,2";"3,2"^a \ar"2,3";"3,3"^b \ar"2,4";"3,4"^c
\ar"3,2";"4,2" \ar"3,3";"4,3" \ar"3,4";"4,4"
}
\]
更多详情,请参阅 xy-pic用户手册。
第一个例子:
第二个 :
答案2
看到这些评论后,原帖作者表示他可能对 PSTricks 解决方案感兴趣。下面是使用该pst-node
包的解决方案。“蛇形”曲线并不完美 - 欢迎提出任何改进意见。
\documentclass{article}
\usepackage{pst-node}
\begin{document}
\psset{xunit=1.75cm,yunit=1cm,nodesep=3pt}
\begin{pspicture}(-1,-1)(5,6)
%\psgrid % useful during construction
% put the nodes in- working from the bottom upwards
% bottom row
\psnode(1,0){10}{$0$}
\psnode(2,0){20}{$0$}
\psnode(3,0){30}{$0$}
% second row
\psnode(1,1){cokerl}{coker $\lambda$}
\psnode(2,1){cokerm}{coker $\mu$}
\psnode(3,1){cokern}{coker $\nu$}
% third row
\psnode(0,2){02}{$0$}
\psnode(1,2){L0}{$L_0$}
\psnode(2,2){M0}{$M_0$}
\psnode(3,2){N0}{$N_0$}
\psnode(4,2){42}{$0$}
% fourth row
\psnode(0,3){03}{$0$}
\psnode(1,3){L1}{$L_1$}
\psnode(2,3){M1}{$M_1$}
\psnode(3,3){N1}{$N_1$}
\psnode(4,3){43}{$0$}
% fifth row
\psnode(0,4){04}{$0$}
\psnode(1,4){kerl}{ker $\lambda$}
\psnode(2,4){kerm}{ker $\mu$}
\psnode(3,4){kern}{ker $\nu$}
% sixth row
\psnode(1,5){15}{$0$}
\psnode(2,5){25}{$0$}
\psnode(3,5){35}{$0$}
% horizontal arrows
% 2nd row
\ncline{->}{cokerl}{cokerm}
\ncline{->}{cokerm}{cokern}
% 3rd row
\ncline{->}{02}{L0}
\ncline{->}{L0}{M0}
\nbput{$\alpha_0$}
\ncline{->}{M0}{N0}
\nbput{$\beta_0$}
\ncline{->}{N0}{42}
% 4th row
\ncline{->}{03}{L1}
\ncline{->}{L1}{M1}
\naput{$\alpha_1$}
\ncline{->}{M1}{N1}
\naput{$\beta_1$}
\ncline{->}{N1}{43}
% 5th row
\ncline{->}{04}{kerl}
\ncline{->}{kerl}{kerm}
\ncline{->}{kerm}{kern}
% vertical arrows
\ncline{->}{cokerl}{10}
\ncline{->}{cokerm}{20}
\ncline{->}{cokern}{30}
\ncline{->}{L0}{cokerl}
\ncline{->}{M0}{cokerm}
\ncline{->}{N0}{cokern}
\ncline{->}{L1}{L0}
\nbput{$\lambda$}
\ncline{->}{M1}{M0}
\nbput{$\mu$}
\ncline{->}{N1}{N0}
\nbput{$\nu$}
\ncline{->}{kerl}{L1}
\ncline{->}{kerm}{M1}
\ncline{->}{kern}{N1}
\ncline{->}{15}{kerl}
\ncline{->}{25}{kerm}
\ncline{->}{35}{kern}
\nccurve[angleA=0,angleB=180]{->}{kern}{cokerl}
% npos takes a value between 0 and 1 for \nccurve
\naput[npos=0.1]{$\delta$}
\end{pspicture}
\end{document}
如果你改变行\nccurve...
并\naput...
\ncloop[angleA=0,armA=1cm,armB=1.5cm,angleB=180,loopsize=1.5,linearc=0.25]{->}{kern}{cokerl}
\naput[npos=0.4]{$\delta$}
然后你得到
编辑
如果您想运行代码,pdflatex
那么您的序言应该是这样的:
\documentclass{article}
\usepackage[pdf]{pstricks}
\usepackage{pst-node}
\begin{document}
....
然后你应该运行
pdflatex -shell-escape myfile.tex
如果你想按原样使用代码,那么你应该使用xelatex myfile.tex
或者
latex myfile.tex
dvips myfile.dvi
ps2pdf myfile.ps
答案3
以下是 TikZ 版本的修改版如何绘制蛇形引理中连接同态的“蛇”形箭头?。我想,可以稍微调整一下间距和曲线。另外,如果我从头开始写,我会更恰当地标记事物这蛇稜咒的咒语。
代码:
\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}
结果:
编辑(回应评论)
要获取虚线箭头,我们只需将它们从“水平箭头”列表中拉出,然后为它们创建一个新的循环,并添加选项dashed
。完整代码:
\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}
结果:
答案4
如果你稍微作弊一下你就可以得到下图。
我替换了@cmhuhes 的以下几行
\nccurve[angleA=0,angleB=180]{->}{kern}{cokerl}
% npos takes a value between 0 and 1 for \nccurve
\naput[npos=0.1]{$\delta$}
和
\pnode(3.5,2.8){N11}
\pnode(0.5,2.2){N12}
\nccurve[angleA=0, angleB=10]{-}{kern}{N11}
\naput[npos=0.5]{$\delta$}
\psline(3.57,2.8)(0.45,2.15)
\nccurve[angleA=-150, angleB=-180]{->}{N12}{cokerl}