Cómo dibujar dentro de un nodo en tikzpicture con un borde

Cómo dibujar dentro de un nodo en tikzpicture con un borde

ingrese la descripción de la imagen aquí

¿Cómo puedo dibujar tales gráficos usando tikzpicture?

Respuesta1

Definición picssiguiente del capítulo 18 de latikzEl manual es definitivamente el camino a seguir. El siguiente código define dos imágenes 2boxy 3boxpara los cuadros que contienen dos o tres círculos o cuadrados, respectivamente. Es 2boxun poco más fácil ya que solo se necesitan cuatro argumentos: las etiquetas en los dos círculos y las etiquetas encima y debajo de las flechas. Usando esto puedes dibujar el cuadro superior usando

\pic at (0,0) {2box={r,a,1{\mid}0,01}};

Define piclos siguientes nodos útiles:

  • rapara toda la caja
  • ra-rpara el primer círculo
  • ra-apara el segundo circulo

Esto es en parte para dibujar la imagen y en parte para dibujar las flechas más adelante. La 3boximagen es similar pero necesita siete argumentos: las tres etiquetas de nodo y las cuatro etiquetas encima y debajo de las dos flechas.

Una vez colocados, es sólo cuestión de dibujar los cuadros, usar 2boxy 3boxy luego dibujar los bordes. Al principio pensé en usar la positioningbiblioteca para colocar los nodos pero, lamentablemente, picsno positioningcombinan bien entre sí, así que he colocado todo a mano para producir:

ingrese la descripción de la imagen aquí

Para que sea más fácil el cambio, he aplicado una generosa dosis de peinado. Aquí está el código completo:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\tikzset{
  arrow/.style = {-{LaTeX}, thick},
  label/.style = {pos=0.4, font=\scriptsize},
  mynode/.style = {fill=white, inner sep=3pt, thick, draw=black},
  onode/.style = {circle, mynode},
  snode/.style = {rectangle, mynode},
  box/.style = {thick, fill=gray!50, draw=black, anchor=south west},
  pics/2box/.style args = {#1,#2,#3,#4}{% a,b,top,bot
    code = {
        \node[box, minimum width=2cm, minimum height=1cm](#1#2) at (0,0){};
        \node[onode] (#1#2-#1) at (0.4,0.5){#1};
        \node[onode] (#1#2-#2) at (1.6,0.5){#2};
        \draw[arrow](#1#2-#1) -- node[label,above]{$#3$}
                                 node[label,below]{$#4$} (#1#2-#2);
    }
  },
  pics/3box/.style args = {#1,#2,#3,#4,#5,#6,#7}{% a,b,c,top,bot,top,bot}
    code = {
        \node[box, minimum width=2cm, minimum height=2cm](#1#2#3) at (0,0){};
        \node[snode] (#1#2#2-#1) at (0.4,1.5){#1};
        \node[snode] (#1#2#2-#2) at (0.4,0.5){#2};
        \node[onode] (#1#2#2-#3) at (1.6,1){#3};
        \draw[arrow](#1#2#2-#1.east) to[out=20, in=135]
            node[label,above]{$#4$} node[label,below]{$#5$} (#1#2#2-#3);
        \draw[arrow](#1#2#2-#2.east) to[out=-20, in=225]
            node[label,above]{$#6$} node[label,below]{$#7$} (#1#2#2-#3);
    }
  },
}

\begin{document}

  \begin{tikzpicture}
    \pic at (0,9) {2box={r,a,1{\mid}0,01}};
    \pic at (0,6) {3box={b,q,m,1{\mid}0,02,2{\mid}0,02}};
    \pic at (1,4) {2box={q,b,1{\mid}0,03}};
    \pic at (0,2) {2box={e,p,1{\mid}2,04}};
    \pic at (0,0) {2box={q,e,1{\mid}0,05}};
    \draw[arrow] (ra.south)--(bqm.north);
    \draw[arrow] (bqm.south)--(qb.north);
    \draw[arrow] (bqm) to[out=250, in=120](ep);
    \draw[arrow] (ep.south)--(qe.north);
    \draw[arrow] (qe.south)--++(0,-0.5);
    \draw[thick](0.5,10.6) -- ++(0,-0.1)--++(1,0)--++(0,0.1);
    \draw[{LaTeX}-,thick](ra.north)--++(0,0.5);
    \draw[arrow,rounded corners]
    (2.5,4)--++(0,-0.3)--++(1,0)--++(0,6.65)--++(-2,0)--++(0,-0.35);
  \end{tikzpicture}

\end{document}

Como puede ver, la definición de 2boxy 3boxson sólo pequeñas piezas de conceptos bastante similares.tikzcódigo. Dentro de la definición picsse utilizan las coordenadas relativas. Las etiquetas las he dejado \deltacomo ejercicio.

información relacionada