使用 TikZcd 独立实现交换图

使用 TikZcd 独立实现交换图

我正在尝试绘制一个单射但非全射的函数图。我正在使用独立程序,并希望最终结果看起来像这样:

一个粗略的想法

我的代码修改自https://tex.stackexchange.com/a/167913/197489运气不太好。这是我的 LaTeX

\documentclass[crop,tikz]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[3][]{%
    \tikz[overlay,remember picture]{
        \draw[black,#1]
        ($(#2)+(-0.5em,2.0ex)$) rectangle
        ($(#3)+(0.75em,-0.75ex)$);}
}

%Draw an arrow diagram that represents a function that is an injection but is not a surjection.

\begin{document}
        \begin{tikzcd}[scale=.1]
        \tikzmark{Atop} a \arrow[r] & \tikzmark{Btop}x \\
        b \arrow[r] & y \\
        \tikzmark{Abottom}& z\tikzmark{Bbottom} \\
        \DrawBox[thick, red]{Atop}{Abottom}
        \DrawBox[thick, blue]{Btop}{Bbottom}
        \end{tikzcd}
\end{document}

其结果是

裁剪不当的 tikz

有什么建议么?

如果有帮助的话,我正在 TeXStudio 中使用 MiKTeX。

答案1

您的方法嵌套了tikzpictures。这是因为\tikz启动了一个新的tikzpicture并且您在 内部使用它tikzcd,而tikzpicture本身就是一个。

绘制类似于您发布的屏幕截图的东西tikz-cd可能不是最好的选择。例如,您可以使用以下代码:

\documentclass[crop,tikz]{standalone}
\usetikzlibrary{matrix,fit}
\begin{document}
\begin{tikzpicture}
 \matrix[matrix of nodes,nodes={circle,fill,inner sep=2pt},
    column sep=4em,row sep=1em,inner sep=0pt] (mat)
 {
  |[label=above left:$a$]| {} & |[label=above right:$x$]| {}\\
  |[label=above left:$b$]| {} & |[label=above right:$y$]| {}\\
  & |[label=above right:$z$]| {}\\
 };
 \node[blue,draw,very thick,fit={(mat.north west) ([xshift=1ex]mat-1-1.east|-mat.south)},
    inner sep=1ex,label={[blue]above:$S$}]{};
 \node[red,draw,very thick,fit={(mat.north east) ([xshift=-1ex]mat-1-2.west|-mat.south)},
 inner sep=1ex,label={[red]above:$T$}]{};
 \foreach \X in {1,2}
 {\draw[-stealth] (mat-\X-1) -- (mat-\X-2);}
\end{tikzpicture}
\end{document}

在此处输入图片描述

请注意,您可以tikzcd使用execute at end picture钩子在环境中安全地绘制某些内容。

\documentclass[crop,tikz]{standalone}
\usepackage{tikz-cd}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzcd}[column sep=4em,
    execute at end picture={%
 \node[blue,draw,very thick,fit={(\tikzcdmatrixname.north west) ([xshift=1ex]\tikzcdmatrixname-1-1.east|-\tikzcdmatrixname.south)},
    inner sep=1ex,label={[blue]above:$S$}]{};
 \node[red,draw,very thick,fit={(\tikzcdmatrixname.north east) ([xshift=-1ex]\tikzcdmatrixname-1-2.west|-\tikzcdmatrixname.south)},
 inner sep=1ex,label={[red]above:$T$}]{};
    }]
         a \arrow[r] & x \\
        b \arrow[r] & y \\
        & z 
\end{tikzcd}
\end{document}

在此处输入图片描述

相关内容