在此邮政我找到了一个非常有用的答案,使用 制作 Mayer-Vietoris 同源序列tikz-cd
。但是,我需要一些帮助来创建这样的图表:
我想用同一个包来画它,但我无法正确修改帖子中给出的代码来绘制连接同态的反向箭头。这是我尝试修改的代码,但没有成功。
\documentclass{article}
\usepackage{tikz-cd}
\tikzset{
curarrow/.style={
rounded corners=8pt,
execute at begin to={every node/.style={fill=red}},
to path={-- ([xshift=50pt]\tikztostart.center)
|- (#1) node[fill=white] {$\scriptstyle d^*$}
-| ([xshift=-50pt]\tikztotarget.center)
-- (\tikztotarget)}
}
}
\begin{document}
\begin{tikzcd}[arrow style=math font,cells={nodes={text height=2ex,text depth=0.75ex}}]
H^{k+1}(M) \arrow[r, "i^{*}"] & H^{k+1}(U) \oplus H^{k+1}(V) \arrow[r] & \cdots \\
H^{k}(M) \arrow[r, "i^{*}"] & H^{k}(U) \oplus H^{k}(V) \arrow[r, "j^{*}"] \arrow[draw=none]{u}[name=Y, shape=coordinate]{} \arrow[draw=none]{d}[name=Z,shape=coordinate]{} & H^{k}(U \cap V) \arrow[curarrow=Y]{ull}{} \\
\cdots \arrow[r] & H^{k-1}(U) \oplus H^{k-1}(V) \arrow[r, "j^{*}"] & H^{k-1}(U \cap V) \arrow[curarrow=Z]{ull}{}
\end{tikzcd}
\end{document}
答案1
我对您发布的代码块进行了工作修改:
\documentclass{article}
\usepackage{tikz-cd}
\tikzset{
curarrow/.style={
rounded corners=8pt,
execute at begin to={every node/.style={fill=red}},
to path={-- ([xshift=-50pt]\tikztostart.center)
|- (#1) node[fill=white] {$\scriptstyle d_*$}
-| ([xshift=50pt]\tikztotarget.center)
-- (\tikztotarget)}
}
}
\begin{document}
\begin{tikzcd}[arrow style=math font,cells={nodes={text height=2ex,text depth=0.75ex}}]
\cdots & H_{k-1}(U) \oplus H_{k-1}(V) \arrow[l] \arrow[draw=none]{d}[name=Y, shape=coordinate]{} & \arrow[l] H_{k-1}(U \cap V) \\
H_{k}(M) \arrow[curarrow=Y]{urr}{} & H_{k}(U) \oplus H_{k}(V) \arrow[l] \arrow[draw=none]{d}[name=Z,shape=coordinate]{} & H_{k}(U \cap V) \arrow[l] \\
H_{k+1}(M) \arrow[curarrow=Z]{urr}{} & H_{k+1}(U) \oplus H_{k+1}(V) \arrow[l] & \cdots \arrow[l]
\end{tikzcd}
\end{document}
我所做的更改:
在您发布的代码块中,在中间位置之后
H^{k}(U) \oplus H^{k}(V)
,有两个坐标设置箭头\arrow[draw=none]{u}[name=Y, shape=coordinate]{} \arrow[draw=none]{d}[name=Z,shape=coordinate]{}
这些坐标用于设置边界图标签的位置:Y 坐标设置在中间中间和中间顶部之间(通过向上指向的箭头),Z 坐标设置在中间中间和中间底部之间(通过向下指向的箭头)。我想从中间左侧向右上方发送一个箭头,但在使用它之前必须定义坐标 Y,所以我将定义移动到中间顶部,指向中间中间。
我稍微修改了样式的定义
curarrow
。在原始版本中,路径从移动到正确的50pt,转身,然后超越左边在结束前减小 50pt;这些反映在xshift
s 中。由于箭头的方向是反转的,因此我反转了xshift
s 上的符号以反映变化。显然箭头是反转的。由于原始代码块为上同调生成了 Mayer-Vietoris,并且箭头已反转,因此我还擅自将群切换为同调群。这可能不是您想要的,抱歉。
答案2
您可以使用pstricks
和psmatrix
环境获得此图。对于连接同态,我在连续行之间的每一端添加中间空节点,并使用复合路径将它们连接起来:
\documentclass{article}
\usepackage{pst-node, auto-pst-pdf}
\begin{document}
\[ \def\psrowhookiii{\psset{mrow=r}}
\begin{psmatrix}[rowsep=1.35]
\pnode[-0.5,0]{A}\\
\pnode[1,1]{A2}H^{q+1}_c(M) & H^{q + 1}_c(U) \oplus H^{q + 1}_c(V) & H^{q + 1}_c(U \cap V)\pnode[0,-0.8]{B2}\\
\pnode[0,1]{A3} H^q_c(M) & H^q_c(U) \oplus H^q_c(V) & H^q_c(U \cap V)\pnode[-1,-0.8]{B3}\\
& & \pnode{B}
\psset{arrows=->, arrowinset=0.12, nodesep=4pt, linearc=0.4}
\ncline{2,3}{2,2} \ncline{2,2}{2,1}\ncbar[angle=180, ]{2,1}{A2}%
\ncbar[arm=0.7, angle=180, arrows=-, nodesepB=0]{3,1}{A3}\ncline[arrows=-, nodesep=0]{A3}{B2}\nbput[labelsep=1.5pt]{d^*}%
\ncbar[arm=0.76, angle=0, arrows=->, nodesepA=0]{B2}{2,3}%
\ncline{3,3}{3,2} \ncline{3,2}{3,1}\ncbar[arm=0.76, angle=0, arrows=->, nodesepA=0]{B3}{3,3}%
\end{psmatrix} \]
\end{document}