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
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:
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