如何将 tikz-picture 和 tikz-cd 的功能结合起来

如何将 tikz-picture 和 tikz-cd 的功能结合起来

我使用下面的方法在 tikz-cd 中绘制了一个图表

\begin{tikzcd}
    & A \arrow[r]  & B\arrow[loop above] & C\arrow[l]\\
    D\arrow[r] & E\arrow[loop above] &  & F\arrow[ul]\\
     & G\arrow[u] & H\arrow[ul] & \\
     & J\arrow[u] & & \\
\end{tikzcd}

但是我想绘制一条曲线来分隔两个不相连的图。为此,我想使用 tikz-picture 的选项,例如在 tikz-cd 绘制的同一张图片中声明坐标和绘制曲线。这可能吗?我尝试将 tikz-cd 嵌入 tikz-picture 中

\begin{tikzpicture}
\begin{tikzcd}
    & A \arrow[r]  & B\arrow[loop above] & C\arrow[l]\\
    D\arrow[r] & E\arrow[loop above] &  & F\arrow[ul]\\
     & G\arrow[u] & H\arrow[ul] & \\
     & J\arrow[u] & & \\
\end{tikzcd}
\end{tikzpicture}

但那没有用。

答案1

至于您建议将tikzcd环境包装在 中tikzpicture。请不要这样做!这相当于嵌套tikzpicture,这不受支持并且会导致各种并发症。

我会假设你不是寻找类似手册第 13 页顶部的示例tikz-cd。这允许您在中嵌入矩阵,tikzpicture但它不支持该\arrow命令(无需进一步说明)。为此,以下内容假定您确实想使用该命令\arrow。然后至少有两种方法可以添加纯 TiZ 代码:

  1. execute at end picture, 看这里查看有关此内容的原始帖子。
  2. remember picture

两者都允许您绘制内容,并访问图表中的节点。您可以使用 或alias\tikzcdmatrixname-<row>-<column>这是预定义的节点名称。

\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\subsection*{Method 1: \texttt{execute at end picture}}
\begin{tikzcd}[execute at end picture={
\draw[-latex,red] ([yshift=1cm]A) to[out=45,in=170] ([yshift=1cm]C)
to[out=-10,in=45] (F);
\draw[blue] ([yshift=0.5em]D.north west) to[out=20,in=180] 
([yshift=1.5em]E.north) to[out=0,in=160] ([yshift=-0.5em]F.south east);}]
    & |[alias=A]|A \arrow[r]  & B\arrow[loop above] & |[alias=C]| C\arrow[l]\\
    |[alias=D]|D\arrow[r] & |[alias=E]| E\arrow[loop above] &  & |[alias=F]| F\arrow[ul]\\
     & G\arrow[u] & H\arrow[ul] & \\
     & J\arrow[u] & & \\
\end{tikzcd}

\subsection*{Method 2: \texttt{remember picture}}
\begin{tikzcd}[remember picture]
    & |[alias=A]|A \arrow[r]  & B\arrow[loop above] & |[alias=C]| C\arrow[l]\\
    |[alias=D]| D\arrow[r] & |[alias=E]| E\arrow[loop above] &  & |[alias=F]| F\arrow[ul]\\
     & G\arrow[u] & H\arrow[ul] & \\
     & J\arrow[u] & & \\
\end{tikzcd}

\begin{tikzpicture}[overlay,remember picture]
\draw[-latex,red] ([yshift=1cm]A) to[out=45,in=170] ([yshift=1cm]C)
to[out=-10,in=45] (F);
\draw[blue] ([yshift=0.5em]D.north west) to[out=20,in=180] 
([yshift=1.5em]E.north) to[out=0,in=160] ([yshift=-0.5em]F.south east);
\end{tikzpicture}
\end{document}

在此处输入图片描述

如果您更熟悉calc(而不是 s yshift),只要您加载库,此方法也会有效。如您所见,它overlay有一个轻微的缺点,即边界框不会调整,但可以说它不那么“黑客化”。

相关内容