\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{graphicx}
\usepackage{pgf,pgfplots}
\usetikzlibrary{math,arrows,positioning,shapes,fit,calc}
\begin{document}
\begin{tikzpicture}
\foreach[count=\i] \lseti/\lsetmi in {{A}/{$a$,$b$,$c$},{B}/{5,6,$z$}} {
\begin{scope}[local bounding box=\lseti, x=2cm, y=0.5cm]
\foreach[count=\j] \lj in \lsetmi {
\node[minimum width=1em] (n-\j-\lseti) at (\i,-\j) {\lj};
}
\end{scope}
\node[ellipse, draw, fit=(\lseti), label={above:$\lseti$}] {};
}
\draw[->] (n-1-A) -- (n-1-B);
\draw[->] (n-2-A) -- (n-2-B);
\draw[->] (n-3-A) -- (n-3-B);
\end{tikzpicture}
\end{document}
让上面的代码。它生成一个函数 f 的图表。我如何从标签 A 绘制一个箭头到上面有字母 f 的标签 B?谢谢!
答案1
只需赋予标签名称并连接它们即可。
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,fit}
\begin{document}
\begin{tikzpicture}
\foreach[count=\i] \lseti/\lsetmi in {A/{$a$,$b$,$c$},B/{5,6,$z$}} {
\begin{scope}[local bounding box=\lseti, x=2cm, y=0.5cm]
\foreach[count=\j] \lj in \lsetmi {
\node[minimum width=1em] (n-\j-\lseti) at (\i,-\j) {\lj};
}
\end{scope}
\node[ellipse, draw, fit=(\lseti),
label={[name=l-\lseti]above:$\lseti$}] {};
}
\draw[->] (n-1-A) -- (n-1-B);
\draw[->] (n-2-A) -- (n-2-B);
\draw[->] (n-3-A) -- (n-3-B);
\draw[->] (l-A) -- node[above]{$f$}(l-A.center-|l-B.west);
\end{tikzpicture}
\end{document}
这是对user1146332 的回答。如果您希望垂直对齐正确,则最好使用anchor=base
并给节点一些text height
,text depth
因为这也适用于低于基线的字符。
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric,fit}
\begin{document}
\begin{tikzpicture}
\foreach[count=\i] \lseti/\lsetmi in {A/{$a$,$b$,$g$},B/{5,6,$z$}} {
\begin{scope}[local bounding box=\lseti, x=2cm, y=0.5cm]
\foreach[count=\j] \lj in \lsetmi {
\node[minimum width=1em,anchor=base,text height=1.4ex,text
depth=0.25ex] (n-\j-\lseti)
at (\i,-\j) {\lj};
}
\end{scope}
\node[ellipse, draw, fit=(\lseti),
label={[name=l-\lseti]above:$\lseti$}] {};
}
\draw[->] (n-1-A) -- (n-1-B);
\draw[->] (n-2-A) -- (n-2-B);
\draw[->] (n-3-A) -- (n-3-B);
\draw[->] (l-A) -- node[above]{$f$}(l-B);
\end{tikzpicture}
\end{document}
答案2
作为对薛定谔的回答的一点补充:
如果将图形放置在文本丰富的环境中,读者的印象很可能会因为字符的不同垂直对齐而受到干扰。
为了获得正确的垂直对齐,您可以将节点的锚点设置为base
字符的基线(即)。
\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{math,arrows,positioning,shapes,fit,calc}
\begin{document}
\begin{tikzpicture}[
elems/.style = {
minimum width=1.4em,
anchor=base
},
helper/.style = {
help lines,
red,
shorten <=-1cm,
shorten >= -1cm
}
]
\foreach[count=\i] \lseti/\lsetmi in {{A}/{$a$,$b$,$c$},{B}/{5,6,$z$}} {
\begin{scope}[local bounding box=\lseti, x=2cm, y=0.5cm]
\foreach[count=\j] \lj in \lsetmi {
\node[elems] (n-\j-\lseti) at (\i,-\j) {\vphantom{5}\lj};
}
\end{scope}
\node[ellipse, draw, fit=(\lseti), label={[elems, yshift=0.25em, name=\lseti]$\lseti$}] {};
}
\draw[->] (A) -- node[above]{$f$} (B);
\draw[helper](A.base) -- (B.base);
\foreach \i in {1,2,3} {
\draw[->] (n-\i-A) -- (n-\i-B);
\draw[helper](n-\i-A.base) -- (n-\i-B.base);
}
\end{tikzpicture}
\end{document}