Saltar al contenido

Matriz TikZ no centrada verticalmente de contenido de celda de nodos

Nuestros desarrolladores estrellas agotaron sus depósitos de café, por su búsqueda diariamente por la solución, hasta que Serena encontró el arreglo en Gogs y ahora la compartimos aquí.

Solución:

Una solución con matriz (versión 2)

input tikz
usetikzlibraryarrows,calc,matrix,decorations.pathreplacing 
parindent=0pt
tikzpicture[
  b/.style=
      text width=3.2cm,,minimum height=0pt,,minimum width=0pt
      inner sep =.2cm,anchor=north west,
      align=left,
  m/.style=matrix of nodes,
            inner sep=2pt,
            outer sep=0pt,
            column sep=0pt,
            draw=black!50,
            nodes=minimum height=2cm,
                   minimum width=3.6cm]
  matrix[m] (M) %
   &  \
   &  \
  ; 

node[b] at (M-1-1.north west)%
   Hey, this is a node with a breakbreak and stuff ;
node[b] at (M-1-2.north west)%
   And another one with it. Milkshakes are yummy when the sun is shining;
node[b] at (M-2-1.north west)%
   Let's see what happens; I'm trying to find the logic ;
node[b] at (M-2-2.north west)%
   Does it break when all these cells have different amount of text?;      

draw[very thick,red!50] (M-1-1.north east)--(M-2-1.south east)
                         (M-1-1.south west)--(M-2-2.north east);
draw[double,green!50!black] (M-1-1.north west) rectangle (M-2-2.south east);
draw[decorate,decoration=brace,mirror,raise=6pt]%
     (M-1-1.north west)--(M-2-1.south west);
node[anchor=east,left=1em] at (M-1-1.south west)%
      I'd like for the cells to be top-aligned;
node[anchor=west] at (M-1-2.south east) Yes it does; 
endtikzpicture    
bye

ingrese la descripción de la imagen aquí

Necesita hacer un par de cambios a lo anterior. Probablemente haya más de una forma de hacer esto, pero la siguiente me da una imagen razonable. Sea o no el mejor La solución para usted depende de qué más está tratando de hacer aquí. Para comprenderlo, debe darse cuenta de que hay varias capas involucradas. Está la ubicación del texto en el cuadro de nodo, la ubicación del nodo en su celda de matriz y la alineación de las celdas de matriz. Tus estilos están tratando de actuar sobre todos estos y causando conflictos. Lo que he hecho a continuación es simplificar esto sacando el material de tamaño de los nodos y poniéndolo en la matriz.

El problema básico es que no puede tener un control total sobre cómo se coloca el texto dentro de un nodo. El nodo debe ser lo suficientemente grande para contener el texto y crecer en consecuencia. Puede anular sus cálculos de tamaño automáticos, pero solo especificando absolutos. El texto es siempre colocado en el centro del nodo. La única forma de anular eso es decirle a TikZ / TeX que el texto no es exactamente lo que cree que es; esto es lo que text height y text depth keys son para. Pero si desea decirle a TikZ la altura y profundidad exactas (como no lo hace en este ejemplo, ya que cambia para cada nodo), cuando especifique el minimum size crece el nodo en todas las direcciones para mantener el texto en el centro.

Entonces, al realizar un posicionamiento complicado como este, es mejor no meterse demasiado con los nodos y dejar que la matriz haga la alineación. Por lo tanto anchor=north coloca el ancla de cada nodo en el punto de alineación, pero eso solo funciona si el texto se vacía en la parte superior del nodo, y eso solo funciona si el nodo tiene el tamaño correcto para su texto. De ahí mi sugerencia (en los comentarios) de anchor=north no funcionó porque intentaba ser demasiado inteligente con las dimensiones de los nodos.

Así que dejamos que los nodos tengan su tamaño natural y pasamos el control del celda tamaño a la matriz. Hacemos esto usando el row sep key, con el between origins para que parezca que cada celda tiene la misma altura.

Esto estropea los tamaños de los nodos, pero para solucionarlo, podría usar mi matrixcells paquete (disponible en el paquete TeX-SX, consulte “De respuestas a paquetes” para obtener más detalles). Descargo de responsabilidad: No tengo idea de si funciona con TeX simple. Si conoce los tamaños exactos que deben tener los nodos, entonces no necesita usar ese paquete (sería excesivo). Lo que debe hacer en ese caso es asegurarse de que TikZ / TeX vea la texto como una caja de las dimensiones correctas (en este caso 3.5cm cuadrado) y coloque el texto dentro de esa caja como quieras. En LaTeX usaría una minipágina o parbox para esto, no sé cómo hacerlo en TeX simple.

input tikz
usetikzlibrarymatrix
$$hboxI'd like for the cells to be top-alignedcases
tikzpicture[
  a/.style=draw=green!50!black,text width=3.5cm,
    anchor=north,
    inner sep=0pt,outer sep=0pt,
  m/.style=matrix of nodes,inner sep=2pt,outer sep=0pt,nodes=a,
    ampersand replacement=&,row sep=3.5cm,between origins,column sep=0pt,draw=black!50
  ]
  parindent0pt
  matrix[m] (mx) 
    Hey, this is a node with a breakbreak and stuff&
    And another one with it. Milkshakes are yummy when the sun is shining\
    Let's see what happens; I'm trying to find the logic&
    Does it break when all these cells have different amount of text?\
  ;
  draw[very thick,red!50] (mx.north)--(mx.south) (mx.west)--(mx.east);
endtikzpicture
 hboxYes it does
$$
bye

Resultado:

nodos con alineación vertical

Oh, Dios mío, incluso lo dije en voz alta en un comentario, sin siquiera darme cuenta de que podría usarse dentro de un nodo:

input tikz
usetikzlibrarymatrix
tikzpicture
  parindent0pt
  matrix[matrix of nodes, inner sep=.5cm, nodes=text width=3cm] (mx) vtop to 3cm
      Does it break when all these cells have different amount of text?vfil\
  ;
  draw[very thick,red!50] (mx.north)--(mx.south) (mx.west)--(mx.east);
endtikzpicture
bye

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *