我正在尝试绘制一个单射但非全射的函数图。我正在使用独立程序,并希望最终结果看起来像这样:
我的代码修改自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}
其结果是
有什么建议么?
如果有帮助的话,我正在 TeXStudio 中使用 MiKTeX。
答案1
您的方法嵌套了tikzpicture
s。这是因为\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}