
Quero produzir uma árvore binária, onde em cada nó inserirei um par (por exemplo, $(8,16)$ ou $(S_2,M_2)$), e o segundo componente será colorido em vermelho. Como faço para usar a \forestset
macro (dopacote florestal) para fazer isso automaticamente, para que quando eu escrever uma árvore eu possa escrever no nó, por exemplo {{S_2}{M_2}}}
(ou similar) em vez de {$(S_2,{\color{red} M_2})$ }
? Em particular, como faço para que o conteúdo de cada nó fique automaticamente no modo matemático, sem precisar escrever $...$
todas as vezes?
Melhor ainda se a macro também especificar isso,seEu insiro 3 argumentos, então o terceiro é colorido em azul, para que eu possa escrever, por exemplo {{S_2}{M_2}{A_2}}
(ou similar) em vez de{$(S_2,{\red M_2},{\color{blue} A_2})$ }
Responder1
Para ter um nó digitado no modo matemático, use key math content
, assim:
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
[2^{42}, math content
[A]
[A, math content]
]
\end{forest}
\end{document}
Na verdade, math content
é apenas um wrapper para content format
. Ele distribui \ensuremath
o conteúdo ao digitá-lo. Mas pode ser usado para enfeitar o conteúdo (sem alterá-lo) de qualquer 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}
Tertodosos nós em uma árvore são automaticamente digitados no modo matemático, usados math content
dentro do propagador espacial for tree
. for tree
é na verdade um nome um pouco impróprio, pois na verdade aplica as opções fornecidas a todos os nós em umsubárvore, mas ahh bem... faz jus ao seu nome se for usado no nó raiz, ou no preâmbulo da árvore, como abaixo.
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[S_1
[S_2]
[S_3]
]
\end{forest}
\end{document}
Fazer coisas diferentes acontecerem em diferentes partes do conteúdo é um pouco mais complicado, mas Forest vem equipado para o trabalho. A split
família de chaves pega algum texto, divide-o em um determinado separador e aplica chaves (possivelmente diferentes) a cada parte. Ilustrarei isso daqui a pouco, mas deixe-me primeiro listar os membros da família: split
aplica-se ao texto em questão; split option
pega o texto de alguma opção (floresta); e split register
pega o texto de algum registro (floresta). Abaixo usaremos split option
, e ele atuará na opção content
, onde fica armazenado o conteúdo do nó (coisas entre colchetes até a primeira vírgula).
E agora, sem mais delongas, a solução para o problema dos OPs.
\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}
O núcleo do autocolored math
estilo é, obviamente, a invocação de split option
. Ele pega o texto da opção content
(o primeiro argumento) e o divide nas ocorrências de ;
(o segundo argumento). Até agora tudo bem. E quanto ao terceiro argumento, 1st,2nd,rest
?
O terceiro argumento lista alguns nomes de estilos. O primeiro estilo ( 1st
) obterá a primeira parte do conteúdo como argumento ( S_1
, S_2
, etc.). O segundo estilo ( 2nd
) obterá a primeira parte do conteúdo como argumento ( M_1
, M_2
, etc.). O terceiro estilo ( rest
) vai ficar... mas espere, o que é que não existe um terceiro argumento? Não tem problema: nesse caso (1 e 2 na árvore), rest
nunca é invocado. E como o nome rest
indica, pode haver mais de três argumentos, e o último estilo será chamado para cada argumento extra (5 na árvore). (A propósito, os nomes dos estilos podem obviamente ser qualquer coisa.)
Uma palavra sobre content
(veja abaixo split option
) vs. content'
(na definição de 1st
). A content
chave é um pouco especial. content=...
"autowraps" o valor da content
opção, ou seja, ##1
in content={(##1)}
refere-se ao valor atual da opção content
(e depois coloca parênteses em torno dele). (O doubled ##
está aí porque estamos dentro da definição de autocolored math
.) content'
se comporta "normalmente", então in 1st/.style={content'={#1}}
, #1
refere-se ao argumento de 1st
(no nosso caso, esta será a primeira parte da expressão split).
content+
anexa o texto fornecido ao valor atual da opção. Bem, no código acima, na verdade usei a versão sem empacotamento automático content+'
.
Finalmente, observe o que coloquei math content
acima split option
, embora se pudesse esperar que ele pertencesse depois content={(##1)}
. Isso foi apenas para demonstrar que funcionaria em qualquer lugar (dentro de for tree
). A questão é que isso math content
não afeta content
em nada o valor da opção. Em vez disso, determina (via content format
) como esse valor é usado.
Por último, mas não menos importante, por que o delay
? Por padrão, as opções do pai são processadas antes das opções dos filhos; isso inclui a configuração do conteúdo do nó por [...]
. Então autocolored math
, o que ocorre no nó raiz (bem, no preâmbulo, que é um pouco diferente em princípio...), se aplica antes que o conteúdo de qualquer nó seja definido! Se não houvesse delay
, não haveria nada para dividir.