
TL; DR Resumen:
¿Hay alguna forma de medir el ancho de un nodo de hoja y pasar esta medida al árbol para usarla en la configuración sibling distance
? (Es posible que level distance
también desee hacer algo similar ).
Ejemplo:
Supongamos que tengo un árbol simple donde cada nodo de hoja contiene la misma imagen:
\documentclass{standalone}
\usepackage{tikz}
\pgfdeclareimage{image}{fptp-ballot}
\begin{document}
\begin{tikzpicture}
\node {root} [level/.append style={level distance=4cm}]
child foreach \c in {1,2} {
node [fill=red!10] {\pgfuseimage{image}}};
\end{tikzpicture}
\end{document}
Con la configuración predeterminada para sibling distance
, las hojas se superponen:
Una forma en que podríamos medir el ancho de la hoja es crear una hoja temporal invisible tmp
y usar la let
operación para rutas para calcular su ancho:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\pgfdeclareimage{image}{fptp-ballot}
\begin{document}
\begin{tikzpicture}
\node (tmp) [fill=red!10, transparent, overlay] {\pgfuseimage{image}};
\path let \p{leafwidth} = ($(tmp.east)-(tmp.west)$) in
node {root} [level/.append style={level distance=4cm, sibling distance=\x{leafwidth}}]
child foreach \c in {1,2} {
node [fill=red!10] {\pgfuseimage{image}}};
\end{tikzpicture}
\end{document}
El problema con este enfoque es: parece complicado tener que crear una hoja temporal, tmp
cuando las hojas que realmente quiero medir ya existen más adelante en el código. Esto hace que las cosas sean menos modulares. Si cambio las hojas, entonces necesito cambiar el tmp
nodo correspondientemente (o factorizar el código de la hoja con una macro y un estilo).
En otras palabras, me gustaría una solución que funcione.en la zonaindependientemente de lo que ponga dentro de las hojas: una sola imagen, una matriz con contenido de celda arbitrario, etc.
Pregunta:
¿Hay alguna manera de medir directamente el ancho de unactualnodo de hoja y pasar esta medida nuevamente al árbol para usarla en la configuración sibling distance
?
Me gustaría escribir algo como lo siguiente:
\begin{tikzpicture}
\node {root} [level/.append style={level distance=4cm, sibling distance=\x{leaf1width}}]
child foreach \c in {1,2} {
node (leaf\c)
[fill=red!10] {\pgfuseimage{image}}
let \p{leaf\c width} = ($(leaf\c.east)-(leaf\c.west)$) in};
\end{tikzpicture}
Aquí estoy midiendo directamente los anchos de laactualse va y estoy tratando de usar esto para configurar sibling distance
en el nodo raíz. Desafortunadamente, esto genera el error "Secuencia de control no definida <argument> \x{leaf1width}
", probablemente porque \p{leaf\c width}
no está definida hasta que se alcanzan las hojas. ¿Hay alguna manera de arreglar este código?
Pensé en usar la late options
llave, peromanual de tikzEstablece que
Se determina un nodo ya existente [...] y, luego, las opciones se ejecutan en un ámbito local. La mayoría de estas opciones no tendrán ningún efecto ya queno se puede cambiar la apariencia del nodo, es decir, no se puede cambiar un nodo rojo a un nodo verde usando opciones tardías.
De hecho, lo siguiente se compila sin errores, pero sibling distance
no se ve afectado.
\begin{tikzpicture}
\node (root) {root} [level/.append style={level distance=4cm}]
child foreach \c in {1,2} {
node (leaf\c)
[fill=red!10] {\pgfuseimage{image}}
let \p{leaf\c width} = ($(leaf\c.east)-(leaf\c.west)$) in
(root) [late options={level/.append style={sibling distance=\x{leaf1width}}}]};
\end{tikzpicture}
Respuesta1
Como se vincula en los comentarios, colocar primero las imágenes en un cuadro hace que sea muy fácil medir el tamaño de la imagen. No estoy seguro de entender la complicación, pero si tiene pocas imágenes que entrarían en el árbol, puede tomar el máximo de esas medidas desde max(x,y)
la biblioteca de matemáticas. Aquí eliminé las macros y utilicé la solución de Yiannis sin ninguna automatización.
\documentclass{standalone}
\usepackage{tikz}
\newsavebox{\Image}
\savebox{\Image}{\includegraphics[scale=0.05]{DSOTM}}
\newlength{\imageh}
\newlength{\imagew}
\settoheight{\imageh}{\usebox{\Image}}
\settowidth{\imagew}{\usebox{\Image}}
\begin{document}
\begin{tikzpicture}
\node {root} [level/.append style={
level distance=1.5\imageh, sibling distance=1.1\imagew
}
]
child foreach \c in {1,2} {
node [fill=red!10,inner sep=1pt] {\includegraphics[scale=0.05]{DSOTM}}};
\end{tikzpicture}
\end{document}