Usar a macro \forestset para ativar automaticamente o modo matemático em cada nó e colorir o segundo componente de cada casal?

Usar a macro \forestset para ativar automaticamente o modo matemático em cada nó e colorir o segundo componente de cada casal?

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 \forestsetmacro (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 \ensurematho 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 splitfamí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: splitaplica-se ao texto em questão; split optionpega o texto de alguma opção (floresta); e split registerpega 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 mathestilo é, 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), restnunca é invocado. E como o nome restindica, 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 contentchave é um pouco especial. content=..."autowraps" o valor da contentopção, ou seja, ##1in 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}}, #1refere-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 contentacima 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 contentnão afeta contentem 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.

informação relacionada