使用 tikzmark 与多个 tikzcd 时出错

使用 tikzmark 与多个 tikzcd 时出错

我希望创建一个如下所示的图形。

在此处输入图片描述

使用以下代码时,我遇到了上述错误。有人能告诉我哪里出错了吗?

\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

首先,在处理tikzmarkclouds 之前,先让交换图看起来像你想要的那样:

在此处输入图片描述

\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。要测试位置,请创建一个新的tikzpictureusing \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 sep1.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 sepcolumn sep,以使其具有与右图相同的大小。

\begin{tikzcd}[arrows={-latex},row sep=1.3cm, column sep=1.3cm]

那么结果是:

在此处输入图片描述

我觉得这看起来很不错。

相关内容