Estoy produciendo algunos diagramas de flujo de teoría de control en TikZ
los 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 box
estilo 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-ext
paquete 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 elexternal
biblioteca.
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
:
Tipo: Cuadro de texto.
\pgfnodeparttextbox
Antes 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 align
clave (predeterminadacenter
) garantiza que se haga correctamente.text=<name>
establece todotext height
,text depth
ytext width
al mismo .<name>
De forma predeterminada, esto solo está configurado para las formas base
rectangle
ycircle
. Después de declarar otra forma (generalmente cargando una de lasshapes.*
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:
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:
Circle
yRectangle
.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 width
and/pgf/minimum height
, esto ignora cualquier valor de/pgf/outer xsep
and/pgf/outer ysep
o el ancho de línea en sí.
Establecer un valor vacío deshabilitará las acciones de esta biblioteca.<name>
Internamente, la escritura en el .aux
archivo ocurre al final de la imagen que utiliza \tikz@atend@picture
( execute at end picture
).
La clave prefix
especifica prefix
para 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, test
pero todas son diferentes.
También he usado la positioning
biblioteca 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
Segunda recopilación
Salida (ejemplos)