答案1
这是...的工作tikzmark
!
基本思路:tikzcd
像往常一样制作你的。但是将一个放在tikzmark
中间。我将一个放在从到的不可见的( phantom
)箭头上,并将其命名为。a
f
middleL
tikzpicture
然后留出一些空间,像往常一样制作。但要tikzmark
在中间放置一个。我把一个放在了,(0,0)
并称之为middleR
。
tikzpicture
然后使用开始新的\begin{tikzpicture}[remember picture, overlay]
。绘制大而蓬松的云节点(使用shapes.symbols
)并使用语法(pic cs:middleL)
和将它们放置在坐标上(pic cs:middleR)
(这是如何引用前一个tikzmark
s )。然后将它们视为普通节点 -label
它们和\draw
它们之间的箭头bend left
。
注意:使用 tikzmark 时必须编译两次。
以下是代码:
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{tikzmark,shapes.geometric,shapes.symbols}
\tikzset{elnode/.style={draw, ellipse, dotted, minimum height=1cm, label distance=-2mm},
cloudnode/.style={draw, dashed, black!80, inner sep=1.75cm, cloud, cloud puffs=20, cloud puff arc=120}}
\begin{document}
\begin{tikzcd}[arrows={-latex, outer sep=-1.5pt},row sep=1cm, column sep=2cm]
& b\arrow[dd,bend left=20,"f"{name=F}]\\
a\arrow[ur,bend left,"g_1"]\arrow[ur,"g_2"]\arrow[ur,bend right,"g_3"]
\arrow[dr,bend left=20,"h_1"']\arrow[dr,bend right=20,"h_2"']
\arrow[to=F,phantom,"{}\tikzmark{middleL}"] \\
& c
\end{tikzcd}\hspace{3.5cm}
\begin{tikzpicture}[baseline,font=\small]
\node[elnode,label={above:$C(a,b)$}] at(0,1){$g_1\quad g_2\quad g_3$};
\node[elnode,label={below:$C(a,c)$}] at (0,-1){$h_1\quad h_2$};
\node at (0,0){\tikzmark{middleR}{}};
\end{tikzpicture}
\begin{tikzpicture}[remember picture, overlay]
\node[cloudnode, label={above:$C$}](lft) at (pic cs:middleL){};
\node[cloudnode, label={above:\textbf{Set}}](rgt) at (pic cs:middleR){};
\draw[-latex](lft)to[bend left]node[above]{$C(a,-)$}(rgt);
\end{tikzpicture}
\end{document}