Latex 功能图

Latex 功能图
\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 heighttext 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}

相关内容