使用 xy-pic 弯曲蛇

使用 xy-pic 弯曲蛇

这是对该问题的后续回答:如何绘制蛇形引理中连接同态的“蛇”形箭头?

我正在尝试使用 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用户手册

第一个例子: 蛇形

第二个 :

snakexy2

答案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}

结果:

蛇形引理,版本 2

编辑(回应评论)

要获取虚线箭头,我们只需将它们从“水平箭头”列表中拉出,然后为它们创建一个新的循环,并添加选项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}

相关内容