我希望创建一个如下所示的图形。
使用以下代码时,我遇到了上述错误。有人能告诉我哪里出错了吗?
\begin{tikzcd}[arrows={-latex, outer sep=-1.5pt},row sep=1cm, column sep=2cm]
& A \arrow[r, "f"] \arrow[to=F,phantom,"{}\tikzmark{catA}"] & B \arrow[d, "g"] \arrow[rd, "h"'{name=F}]\\
& C
\end{tikzcd}\hspace{2.5cm}
\begin{tikzcd}[arrows={-latex, outer sep=-1.5pt},row sep=1cm, column sep=2cm]
& F(A) \arrow[to=Ff,phantom,"{}\tikzmark{catop}"] & F(B) \arrow[l, "F(f)"'] \arrow[rd, "h"'{name=Ff}\\
& F(C) \arrow[u, "F(g)"'] \arrow[lu, "F(g \circ f)"]
\end{tikzcd}
\begin{tikzpicture}[remember picture, overlay]
\node[cloudnode1, label={left:$\cat{A}$}](lft) at (pic cs:catA){};
\node[cloudnode1, label={right:$\cat{B}$}](rgt) at (pic cs:catop){};
\draw[-latex, black!80, bend left = 10](lft)to node[above]{F}(rgt);
\end{tikzpicture}
答案1
首先,在处理tikzmark
和cloud
s 之前,先让交换图看起来像你想要的那样:
\begin{tikzcd}[arrows={-latex},row sep=1cm, column sep=1cm]
a \arrow[r, "f"]\arrow[rd, "g\circ f"'] & b \arrow[d, "g"]\\
& c
\end{tikzcd}\hspace{2.5cm}
\begin{tikzcd}[arrows={-latex},row sep=1cm, column sep=1cm]
F(a) & F(b) \arrow[l, "F(f)"'] \\
& F(c) \arrow[u, "F(g)"'] \arrow[lu, "F(g \circ f)"]
\end{tikzcd}
然后,一旦这些都正确了,tikzmark
在左图的中心添加一个。我认为一个好的位置是沿着从a
到的箭头c
,但在顶部。因此将rd
箭头的代码更改为
\arrow[rd, "g\circ f"', "\tikzmark{catA}"]
现在您有一个稍后可以使用的tikzmark
名称catA
。要测试位置,请创建一个新的tikzpicture
using \begin{tikzpicture}[remember picture, overlay]
,它允许您引用之前的tikzmarks
。
\begin{tikzpicture}[remember picture, overlay]
\node[cloudnode1, label={above:$C$}](lft) at (pic cs:catA){};
\end{tikzpicture}
我假设您在序言中已经cloudnode1
使用类似如下的代码定义了样式:
\tikzset{cloudnode1/.style={draw, dashed, black!80, inner sep=1cm,
cloud, cloud puffs=10, cloud puff arc=150}}
我改编自这个先前的答案。顺便说一句,当您在此网站上发布代码时,您应该始终引用其他人的作品。
请记住你必须编译两次!结果是这样的:
到目前为止一切顺利。现在您需要在另一个图表上执行相同的操作。将lu
箭头更改为:
\arrow[lu, "F(g \circ f)", "\tikzmark{catop}"']
添加行
\node[cloudnode1, label={above:$B$}](rgt) at (pic cs:catop){};
到tikzpicture
和...
看起来云太小了。增加到inner sep
或1.3cm
任何你觉得合适的值。最后,添加
\draw[-latex, black!80, bend left = 10, dashed](lft)to node[above]{$F$}(rgt);
并调整两朵云之间的距离。记得编译两次!
完整代码如下:
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{tikzmark,shapes.symbols}
\tikzset{cloudnode1/.style={draw, dashed, black!80, inner sep=1.3cm, cloud, cloud puffs=10, cloud puff arc=150}}
\begin{document}
\begin{tikzcd}[arrows={-latex},row sep=1cm, column sep=1cm]
a \arrow[r, "f"]\arrow[rd, "g\circ f"', "\tikzmark{catA}"] & b \arrow[d, "g"]\\
& c
\end{tikzcd}\hspace{3cm}
\begin{tikzcd}[arrows={-latex},row sep=1cm, column sep=1cm]
F(a) & F(b) \arrow[l, "F(f)"'] \\
& F(c) \arrow[u, "F(g)"'] \arrow[lu, "F(g \circ f)", "\tikzmark{catop}"']
\end{tikzcd}
\begin{tikzpicture}[remember picture, overlay]
\node[cloudnode1, label={above:$C$}](lft) at (pic cs:catA){};
\node[cloudnode1, label={above:$B$}](rgt) at (pic cs:catop){};
\draw[-latex, black!80, bend left = 10, dashed](lft)to node[above]{$F$}(rgt);
\end{tikzpicture}
\end{document}
最后,您可能想要增加左图的row sep
和column sep
,以使其具有与右图相同的大小。
\begin{tikzcd}[arrows={-latex},row sep=1.3cm, column sep=1.3cm]
那么结果是:
我觉得这看起来很不错。