![如何绘制蛇形引理中连接同态的“蛇”形箭头?](https://linux22.com/image/232454/%E5%A6%82%E4%BD%95%E7%BB%98%E5%88%B6%E8%9B%87%E5%BD%A2%E5%BC%95%E7%90%86%E4%B8%AD%E8%BF%9E%E6%8E%A5%E5%90%8C%E6%80%81%E7%9A%84%E2%80%9C%E8%9B%87%E2%80%9D%E5%BD%A2%E7%AE%AD%E5%A4%B4%EF%BC%9F.png)
当使用蛇稃?
当考虑长精确同调序列时,我还对绘制类似的箭头作为“回车符”感兴趣。
如果这有点模糊,我很抱歉。我希望已经做过这件事的人可能愿意分享一个模板。我更喜欢 xy-pic 中的东西,但也有兴趣看看其他可以做到的方法。
答案1
我很高兴您说:
但也有兴趣了解其他可以实现的方法。
因为我现在不再使用了xy-pic
(虽然在 TikZ 出现之前它非常棒)。这是我用 TikZ 拍出的最佳照片。
结果如下:
代码如下。我对我的选择有几点评论。加载的库中没有一个是严格没有必要,但我觉得matrix
和calc
库使代码更简洁,我不喜欢标准箭头,所以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}