Tamaño de nodo dependiente en TikZ

Tamaño de nodo dependiente en TikZ

Estoy produciendo algunos diagramas de flujo de teoría de control en TikZlos que he especificado el tamaño del cuadro de nodos. Dado que estoy creando muchos de estos diagramas de flujo, les he establecido estilos globales, por ejemplo el boxestilo que estoy usando actualmente:

box/.style={rectangle, draw, minimum width = 8ex,
            minimum height = 4ex, inner sep = 1ex}

La cantidad de texto en los nodos varía. El problema es que si un texto de nodo exige más espacio que minimum, el resto de los nodos en esa imagen deben mantener el mismo tamaño que el nodo más grande. ¿Cómo puedo hacer esto? La solución enesta preguntaes uno que me gustaría evitar, ya que en mi opinión es demasiado "manual", necesito automatización.

Una MWE:

\documentclass[12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
    box/.style={rectangle, draw, minimum width = 8ex,
                minimum height = 4ex, inner sep = 0},
    split/.style={circle, draw, minimum size = 2.5pt, fill=black,
                inner sep = 0},
}
\begin{document}
\begin{tikzpicture}[
    every path/.style={>={stealth}, ->, draw, node distance = 1pt, inner sep = 0pt},
    ]
    \node[split] (split)  {};
    \node[box] (I) at ($(split) + (4,0)$) {Short};
    \node[box] (P) at ($(I)+(0,1)$) {This node has long node text};
    \node[box] (D) at ($(I)+(0,-1)$) {Short};
    \draw (split.north) |-(P);
    \draw (split.east) -- (I) ;
    \draw (split.south) |-(D);

\end{tikzpicture}
\end{document}

Respuesta1

esta respuestase convirtió en su propia biblioteca TikZext.node-families como parte de mitikz-extpaquete de ension.


Creo que esto es casi tan automático como parece. Utiliza el.aux archivo y no funcionará cuando la imagen se externalice con elexternalbiblioteca.

Usted especifica una familia de nodos que tendrán la misma dimensión con las siguientes claves que están todas en el espacio de nombres /tikz/node family:

  1. Tipo: Cuadro de texto.

    \pgfnodeparttextboxAntes de construir un nodo , se mide y compara la dimensión del cuadro de texto que contiene el texto del nodo ( ). Se utiliza el mayor valor.

    • text height=<name>: Los nodos con el mismo tendrán la misma altura de texto.<name>

    • text depth=<name>: Los nodos con el mismo tendrán la misma profundidad de texto.<name>

    • text width=<name>: Los nodos con el mismo tendrán el mismo ancho de texto.<name>

    • text width align = left|center|right:

      Establecer el ancho del cuadro de texto solo extiende el cuadro hacia la derecha. Es necesario realinear el contenido del cuadro. La text width alignclave (predeterminada center) garantiza que se haga correctamente.

    • text=<name>establece todo text height, text depthy text widthal mismo .<name>

    De forma predeterminada, esto solo está configurado para las formas base rectangley circle. Después de declarar otra forma (generalmente cargando una de las shapes.*bibliotecas), se puede configurar de la misma manera usando

    \tikzset{node family/setup shape=<shape name>}
    

    Esto debe hacerse sólo una vez por forma.

    Dado que esto solo cambia las dimensiones del cuadro de texto, para diferentes formas en la misma familia esto puede generar diferentes anchos o alturas de la forma, ya que sus dimensiones se calculan de manera diferente según el tamaño del cuadro de texto. Considere este ejemplo:

    \tikz[nodes=draw, node family/text width=test]
      \node {Foo} node[circle] {Barbarbar};
    

    lo que conduce al siguiente resultado:

    ingrese la descripción de la imagen aquí

  2. Tipo: Alto mínimo y ancho mínimo.

    A diferencia de las medidas del cuadro de texto, este utiliza la altura y el ancho de la forma que se calcula mediante la propia declaración de la forma. Como este cálculo se realiza en algún lugar profundo de la declaración de la forma, son necesarias nuevas declaraciones de forma: Circley Rectangle.

    • width=<name>: Los nodos con el mismo tendrán el mismo ancho.<name>

    • height=<name>: Los nodos con el mismo tendrán la misma altura.<name>

    Al igual que con /pgf/minimum widthand /pgf/minimum height, esto ignora cualquier valor de /pgf/outer xsepand /pgf/outer ysepo el ancho de línea en sí.

Establecer un valor vacío deshabilitará las acciones de esta biblioteca.<name>


Internamente, la escritura en el .auxarchivo ocurre al final de la imagen que utiliza \tikz@atend@picture( execute at end picture).

La clave prefixespecifica prefixpara todas las familias de nodos. De forma predeterminada, esto es \pgfpictureid-, esto hace que las familias de nodos solo se apliquen a TikZpictures de forma individual.

En el siguiente ejemplo, se nombran todas las familias, testpero todas son diferentes.


También he usado la positioningbiblioteca que hace que el efecto sea más notorio.

El código aún se puede optimizar un poco, como en el ejemplo siguiente, el archivo define siete macros adicionales .aux. ¿Podría ser mejor guardar todos los valores de una familia en una macro?

Código

\documentclass[12pt,tikz]{standalone}
\usetikzlibrary{
  positioning,       % better positioning (right=of …)
  ext.node-families, % node families
  arrows.meta        % arrow tips
}
\begin{document}
\begin{tikzpicture}[
  node distance=.3cm and 1cm,
  box/.style={
    rectangle, draw, minimum width=+8ex, minimum height=+4ex, inner sep=+0pt,
    node family/text width=test},
  split/.style={
    circle, draw, minimum size=+2.5pt, fill=black, inner sep=+0pt}]
\node[split] (split)  {};
\node[box, right=of split] (I)  {Short};
\node[box, above=of I]     (P)  {This node has long node text};
\node[box, below=of I]     (D)  {Short};
\draw[-Stealth] (split.north) |-(P);
\draw[-Stealth] (split.east) -- (I) ;
\draw[-Stealth] (split.south) |-(D);
\end{tikzpicture}
\tikz % only the same height (text is still centered)
  \foreach \cnt[count=\Cnt] in {a,...,h}
    \node[draw, Circle, node family/height=test] at (right:\Cnt) {\cnt};
\tikz % height and text height (text depth set to zero)
  \foreach \cnt[count=\Cnt] in {a,...,h}
    \node[draw, Circle, text depth=+0pt,
      node family={height=test, text height=test}]
      at (right:\Cnt) {\cnt};
\begin{tikzpicture}[% http://tex.stackexchange.com/q/134983
   nodes={circle, draw=black, node family/text=test}]
\node                 (A) {$n$};
\node[right=0pt of A] (B) {$n+1$};
\end{tikzpicture}
\end{document}

Producción

Primera recopilación

ingrese la descripción de la imagen aquí

Segunda recopilación

ingrese la descripción de la imagen aquí

Salida (ejemplos)

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

información relacionada