如何绘制蛇形引理中连接同态的“蛇”形箭头?

如何绘制蛇形引理中连接同态的“蛇”形箭头?

当使用蛇稃

当考虑长精确同调序列时,我还对绘制类似的箭头作为“回车符”感兴趣。

如果这有点模糊,我很抱歉。我希望已经做过这件事的人可能愿意分享一个模板。我更喜欢 xy-pic 中的东西,但也有兴趣看看其他可以做到的方法。

答案1

我很高兴您说:

但也有兴趣了解其他可以实现的方法。

因为我现在不再使用了xy-pic(虽然在 TikZ 出现之前它非常棒)。这是我用 TikZ 拍出的最佳照片。

结果如下:

蛇稃

代码如下。我对我的选择有几点评论。加载的库中没有一个是严格没有必要,但我觉得matrixcalc库使代码更简洁,我不喜欢标准箭头,所以arrows库使它看起来更好。我明确标记了矩阵条目,这不是绝对必要的,同样是因为我觉得它使代码更容易阅读。我将蛇形箭头的水平向上移动以避免向下箭头上的标签。圆角的关键效果是最终rounded corners路径的(等待它)选项。该amsmath包纯粹是为了获取(已经在 latex 中定义)\DeclareMathOperator的命令。同样,这可以通过另一种方式轻松完成。\coker\ker

在编辑中添加) 正如评论中指出的那样,在原始代码中,从下方0到的箭头A'略微倾斜。这是因为素数为节点增加了一点高度,这意味着A'箭头的自然目标(东边0和西边A')不在一条直线上。有很多方法可以解决这个问题,我选择的方法是根据它们的中心而不是基线来对齐矩阵中的节点。

由于这个答案如此受欢迎,我对它更加追求完美!我认为灰色水平箭头(内核和余内核)对我来说有点高。所以我选择了“中间”目标。使用“边缘”命令放入这些箭头会产生奇怪的额外箭头(试试看),所以我不得不将每个箭头作为单独的命令放入\draw。我还更改了网格的间距,以便从节点的中心而不是边缘测量空间。

关于这个版本的闲暇想法:我应该能够将mid east/west目标放在命令中edge。我还想知道是否有一些巧妙的方式来表示“确保所有箭头都严格水平”,而不是使用明确的目标。我想知道是否可以使用“交叉点处的坐标”语法,但需要稍微尝试一下,我不确定它是否会更短。

编辑:2012-09-10asymmetrical rectangle我刚刚了解到tikz-cd包,它回答了我上面的闲散想法,所以我想 - 因为这在很多方面都是我的“展示”答案 - 我会更新它以利用它。

\documentclass{article}
\thispagestyle{empty}
\usepackage{amsmath}
\usepackage{tikz}
\usepackage{tikz-cd}
\usetikzlibrary{%
  matrix,%
  calc,%
  arrows%
}

\DeclareMathOperator{\coker}{coker}

\begin{document}
\begin{tikzpicture}[>=triangle 60]
\matrix[matrix of math nodes,column sep={60pt,between origins},row
sep={60pt,between origins},nodes={asymmetrical rectangle}] (s)
{
&|[name=ka]| \ker f &|[name=kb]| \ker g &|[name=kc]| \ker h \\
%
&|[name=A]| A' &|[name=B]| B' &|[name=C]| C' &|[name=01]| 0 \\
%
|[name=02]| 0 &|[name=A']| A &|[name=B']| B &|[name=C']| C \\
%
&|[name=ca]| \coker f &|[name=cb]| \coker g &|[name=cc]| \coker h \\
};
\draw[->] (ka) edge (A)
          (kb) edge (B)
          (kc) edge (C)
          (A) edge (B)
          (B) edge node[auto] {\(p\)} (C)
          (C) edge (01)
          (A) edge node[auto] {\(f\)} (A')
          (B) edge node[auto] {\(g\)} (B')
          (C) edge node[auto] {\(h\)} (C')
          (02) edge (A')
          (A') edge node[auto] {\(i\)} (B')
          (B') edge (C')
          (A') edge (ca)
          (B') edge (cb)
          (C') edge (cc)
;
\draw[->,gray] (ka) edge (kb)
               (kb) edge (kc)
               (ca) edge (cb)
               (cb) edge (cc)
;
\draw[->,gray,rounded corners] (kc) -| node[auto,text=black,pos=.7]
{\(\partial\)} ($(01.east)+(.5,0)$) |- ($(B)!.35!(B')$) -|
($(02.west)+(-.5,0)$) |- (ca);
\end{tikzpicture}
\end{document}

答案2

安德鲁已经画出了一条非常漂亮的蛇形图(我想我从未见过如此漂亮的排版图),所以让我添加一个长正合序列。为此,我通常更喜欢在线条之间画弧形箭头。通过[out=...,in=...]给出线条开始和结束的角度,可以轻松制作出这些箭头。

长正合序列例子

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows}

\begin{document}

\begin{tikzpicture}[descr/.style={fill=white,inner sep=1.5pt}]
        \matrix (m) [
            matrix of math nodes,
            row sep=1em,
            column sep=2.5em,
            text height=1.5ex, text depth=0.25ex
        ]
        { 0 & H^0(\mathcal A) & H^0(\mathcal B) & H^0(\mathcal C) \\
            & H^1(\mathcal A) & H^1(\mathcal B) & H^1(\mathcal C) \\
            & H^2(\mathcal A) & H^2(\mathcal B) & H^2(\mathcal C) \\
            & \mbox{}         &                 & \mbox{}         \\
            & H^n(\mathcal A) & H^n(\mathcal B) & H^n(\mathcal C) \\
        };

        \path[overlay,->, font=\scriptsize,>=latex]
        (m-1-1) edge (m-1-2)
        (m-1-2) edge (m-1-3)
        (m-1-3) edge (m-1-4)
        (m-1-4) edge[out=355,in=175,red] node[descr,yshift=0.3ex] {$\alpha^0$} (m-2-2)
        (m-2-2) edge (m-2-3)
        (m-2-3) edge (m-2-4)
        (m-2-4) edge[out=355,in=175,red] node[descr,yshift=0.3ex] {$\alpha^1$} (m-3-2)
        (m-3-2) edge (m-3-3)
        (m-3-3) edge (m-3-4)
        (m-3-4) edge[out=355,in=175,dashed,red] (m-5-2)
        (m-5-2) edge (m-5-3)
        (m-5-3) edge (m-5-4);
\end{tikzpicture}

\end{document}

该代码与 Andrew 的代码几乎相同,只是我没有命名矩阵条目(因为它们以线性、非混淆的方式使用)。descr顶部的样式定义允许通过中断线(技术上是通过在其上方放置一个白框)将节点放置在线的中间。text height=1.5ex, text depth=0.25ex矩阵选项对于此示例不是必需的,但有助于在节点变得更复杂时对齐箭头和文本。这使得overlay路径不被视为边界框的计算,因为 TikZ 经常会出错。

答案3

这是使用 xy-pic 的解决方案。对于蛇形引理:

\documentclass{minimal}
\usepackage[all,cmtip]{xy}
\usepackage{amsmath}
\DeclareMathOperator{\coker}{coker}
\newcommand*\pp{{\rlap{\('\)}}}
\begin{document}
%
\[
  \xymatrix@!{
              && {\ker(a)} \ar[r]   & {\ker(b)} \ar[r]   & {\ker(c)}
                    \ar`r[d]`[l]`^d[lll]|!{[];[d]}\hole|!{[l];[dl]}\hole|!{[ll];[dll]}\hole
                    `[dddll]|!{[ddllll];[ddll]}\hole [dddll]
                                                                       &   \\
              && A  \ar[r]^{f}      & B  \ar[r]^{g}      & C \ar[r]    & 0 \\
    0 \ar[rr] && A\pp \ar[r]^{f'}   & B\pp \ar[r]^{g'}   & C\pp        &   \\
              && {\coker(a)} \ar[r] & {\coker(b)} \ar[r] & {\coker(c)} &   \\
    % vertical arrows
    \ar"1,3";"2,3"   \ar"1,4";"2,4"   \ar"1,5";"2,5"
    \ar"2,3";"3,3"^a \ar"2,4";"3,4"^b \ar"2,5";"3,5"^c
    \ar"3,3";"4,3"   \ar"3,4";"4,4"   \ar"3,5";"4,5"
  }
\]
\end{document}

对于长正合序列:

\documentclass{minimal}
\usepackage[all,cmtip]{xy}
\newcommand*\mA{\mathcal A} \newcommand*\mB{\mathcal B} \newcommand*\mC{\mathcal C}
\begin{document}
\xymatrix{
    0 \ar[r] & H^0(\mA) \ar[r] & H^0(\mB) \ar[r] & H^0(\mC)
                \ar@{->} `r/8pt[d] `/10pt[l] `^dl[ll]|{\alpha^0} `^r/3pt[dll] [dll] \\
             & H^1(\mA) \ar[r] & H^1(\mB) \ar[r] & H^1(\mC)
                \ar@{->} `r/8pt[d] `/10pt[l] `^dl[ll]|{\alpha^1} `^r/3pt[dll] [dll] \\
             & H^2(\mA) \ar[r] & H^2(\mB) \ar[r] & H^2(\mC)
                \ar@{-->} `r/8pt[d] `/10pt[l] `^dl[ll] `^d[dlll] `^r[ddlll] [ddll]\\
             &&&\\
             & H^n(\mA) \ar[r] & H^n(\mB) \ar[r] & H^n(\mC)
    }
\end{document}

备注:弯曲箭头存在缺陷:它们无法与颜色和虚线形状完美配合。

甚至可以使用低级 xy 代码来改进一些细节(alpha 的位置、精确序列中的最后一个箭头)。

一些解释:

  • \xymatrix@!迫使所有空间相等

  • \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]语法决定转弯的方向。有关更多详细信息,请参阅 xy-pic用户手册

结果

答案4

这是另一个 tikz-cd 版本,其中包括整个蛇形图和蛇箭的美丽交叉。

在此处输入图片描述

\documentclass{article}
\usepackage{tikz-cd}
\usepackage{amsmath}
\newcommand{\bt}[1][normal]{\begin{tikzcd}[ampersand replacement = \&, column sep=#1,row sep=#1]}
%other options are: tiny, small, scriptsize, normal, large, huge
\newcommand{\et}{\end{tikzcd}}
\newcommand{\te}[1]{\mathrel{ \text{#1} }}

\begin{document}

\begin{center}
\bt
  \&
  \& \ker(f') \ar{r}{\overline u'} \ar{d}
  \& \ker(f)\ar{r}{\overline v'} \ar{d}
  \& \ker(f'') \ar{d}   %\arrow[ddll,"\delta",rounded corners
  \&
  \&\\
    \&
    \& M' \ar{r}{\overline u} \ar{dd}[near start]{f'}
    \& M \ar{r}{\overline v} \ar{dd}[near start]{f}
    \& M''\ar{r}\ar{dd}[near start]{f''}
    \&  0
    \& ~\\
        \&
        \&
        \& ~
        \&
        \&
          \ar[r, phantom, ""{coordinate, name=Y}]
        \&~\\
        ~\& \ar[l, phantom, ""{coordinate, name=Z}] 0 \ar{r}
        \& N' \ar{r}{\underline u} \ar{d}
        \& N \ar{r}{\underline v} \ar{d}
        \& N'' \ar{d}
        \&
            \& \\
              \&
              \& \ar[from=uuuurr, "\partial", crossing over, rounded corners,
                      to path=
                              { -- ([xshift=2ex]\tikztostart.east)
                              -| (Y) [near end]\tikztonodes
                              -| (Z) [near end]\tikztonodes
                              |- ([xshift=-2ex]\tikztotarget.west)
                               -- (\tikztotarget)}
                    ]\te{coker}(f')\ar{r}{\underline u'}
               \& \te{coker}(f) \ar{r}{\underline v'}
               \& \te{coker}(f'')
               \&
               \&
    \et
  \end{center}
\end{document}

相关内容