
Quiero producir un árbol binario, donde en cada nodo ingresaré un par (por ejemplo, $(8,16)$ o $(S_2,M_2)$), y el segundo componente es de color rojo. ¿Cómo uso la \forestset
macro (de lapaquete forestal) para hacerlo automáticamente, de modo que cuando escriba un árbol pueda escribir en el nodo, por ejemplo {{S_2}{M_2}}}
(o similar), en lugar de {$(S_2,{\color{red} M_2})$ }
? En particular, ¿cómo consigo que el contenido de cada nodo esté automáticamente en modo matemático, sin tener que escribir $...$
cada vez?
Mejor aún si la macro también especifica eso,siIngreso 3 argumentos, luego el tercero es de color azul, para poder escribir por ejemplo {{S_2}{M_2}{A_2}}
(o similar) en lugar de{$(S_2,{\red M_2},{\color{blue} A_2})$ }
Respuesta1
Para tener un nodo escrito en modo matemático, use la clave math content
, como esta:
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
[2^{42}, math content
[A]
[A, math content]
]
\end{forest}
\end{document}
En realidad, math content
es sólo un envoltorio para content format
. Da \ensuremath
vueltas al contenido al componerlo. Pero se puede utilizar para disfrazar el contenido (sin cambiarlo) de cualquier forma:
\documentclass{article}
\usepackage{forest}
\forestset{
quote/.style={
content format={``\forestoption{content}''}
},
bold/.style={
content format={\noexpand\textbf{\forestoption{content}}}
},
}
\begin{document}
\begin{forest}
[A
[B, quote]
[C, bold]
]
\end{forest}
\end{document}
TenertodoLos nodos de un árbol se escriben automáticamente en modo matemático y se utilizan math content
dentro del propagador espacial for tree
. for tree
es en realidad un nombre un poco inapropiado, ya que en realidad aplica las opciones dadas a todos los nodos en unsubárbol, pero ahh bueno... es fiel a su nombre si se usa en el nodo raíz, o en el preámbulo del árbol, como a continuación.
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[S_1
[S_2]
[S_3]
]
\end{forest}
\end{document}
Hacer que sucedan diferentes cosas en diferentes partes del contenido es un poco más complicado, pero Forest viene equipado para el trabajo. La split
familia de claves toma algo de texto, lo divide en un separador determinado y aplica claves (posiblemente diferentes) a cada parte. Ilustraré esto en un momento, pero permítanme primero enumerar los miembros de la familia: split
se aplica al texto dado; split option
toma el texto de alguna opción (bosque); y split register
toma el texto de algún registro (bosque). A continuación, usaremos split option
y actuará sobre la opción content
, donde se almacena el contenido del nodo (lo que está entre corchetes hasta la primera coma).
Y ahora, sin más, la solución al problema de los OP.
\documentclass{article}
\usepackage{forest}
\forestset{
1st/.style={content'={#1}},
2nd/.style={content+'={,{\color{red}#1}}},
rest/.style={content+'={,{\color{blue}#1}}},
autocolored math/.style={
delay={
for tree={
math content,
split option={content}{;}{1st,2nd,rest},
content={(##1)},
}
}
}
}
\begin{document}
\begin{forest} autocolored math
[S_1;M_1
[S_2;M_2]
[S_3;M_3;A_3
[S_4;M_4;A_4]
[S_5;M_5;A_5;B_5]
]
]
\end{forest}
\end{document}
El núcleo del autocolored math
estilo es, por supuesto, la invocación de split option
. Toma el texto de la opción content
(el primer argumento) y lo divide cuando aparece ;
(el segundo argumento). Hasta ahora, todo bien. ¿Qué pasa con el tercer argumento 1st,2nd,rest
?
El tercer argumento enumera algunos nombres de estilos. El primer estilo ( 1st
) obtendrá la primera parte del contenido como argumento ( S_1
, S_2
, etc.). El segundo estilo ( 2nd
) obtendrá la primera parte del contenido como argumento ( M_1
, M_2
, etc.). El tercer estilo ( rest
) obtendrá... pero espera, ¿qué es lo que no hay un tercer argumento? No hay problema: en tal caso (1 y 2 en el árbol), rest
nunca se invoca. Y como su nombre rest
lo indica, puede haber más de tres argumentos y se llamará al último estilo para cada argumento adicional (5 en el árbol). (Por cierto, los nombres de los estilos obviamente pueden ser cualquier cosa).
Una palabra sobre content
(ver más abajo split option
) versus content'
(en la definición de 1st
). La content
clave es un poco especial. content=...
"envuelve automáticamente" el valor de la content
opción, es decir, ##1
en content={(##1)}
se refiere al valor actual de la opción content
(y luego lo rodea entre paréntesis). (El duplicado ##
está ahí porque estamos dentro de la definición de autocolored math
.) content'
se comporta "normalmente", por lo que en 1st/.style={content'={#1}}
, #1
se refiere al argumento de 1st
(en nuestro caso, esta será la primera parte de la expresión dividida).
content+
agrega el texto dado al valor actual de la opción. Bueno, en el código anterior, en realidad utilicé la versión sin ajuste automático content+'
.
Por último, señalar que lo he puesto math content
arriba split option
, aunque uno podría esperar que pertenezca después content={(##1)}
. Esto fue solo para demostrar que funcionaría en cualquier lugar (dentro for tree
). El caso es que math content
no afecta content
en absoluto el valor de la opción. Más bien determina (a través de content format
) cómo se utiliza este valor.
Por último, pero no menos importante, ¿por qué delay
? De forma predeterminada, las opciones del padre se procesan antes que las opciones de los hijos; esto incluye el contenido de configuración del nodo por [...]
. Entonces autocolored math
, lo que ocurre en el nodo raíz (bueno, en el preámbulo, que es ligeramente diferente en principio...), se aplica antes de que se establezca el contenido de cualquier nodo. Si no existiera delay
, no habría nada que dividir.