Das Makro \forestset verwenden, um den Mathematikmodus in jedem Knoten automatisch zu aktivieren und die zweite Komponente jedes Paares einzufärben?

Das Makro \forestset verwenden, um den Mathematikmodus in jedem Knoten automatisch zu aktivieren und die zweite Komponente jedes Paares einzufärben?

Ich möchte einen binären Baum erstellen, bei dem ich an jedem Knoten ein Paar eingebe (z. B. $(8,16)$ oder $(S_2,M_2)$) und die zweite Komponente rot gefärbt ist. Wie verwende ich das \forestsetMakro (aus demWaldpaket), um das automatisch zu tun, sodass ich beim Schreiben eines Baums in den Knoten zB {{S_2}{M_2}}}(oder ähnlich) statt schreiben kann {$(S_2,{\color{red} M_2})$ }? Insbesondere, wie bekomme ich den Inhalt jedes Knotens automatisch in den mathematischen Modus, ohne $...$jedes Mal schreiben zu müssen?

Besser noch, wenn das Makro auch angibt, dassWennIch gebe 3 Argumente ein, dann wird das dritte blau gefärbt, so dass ich zB {{S_2}{M_2}{A_2}}(oder ähnlich) statt{$(S_2,{\red M_2},{\color{blue} A_2})$ }

Antwort1

Um einen Knoten im Mathematikmodus zu setzen, verwenden Sie die Taste math content, wie folgt:

\documentclass{article}
\usepackage{forest}

\begin{document}
\begin{forest}
  [2^{42}, math content
    [A]
    [A, math content]
  ]
\end{forest}
\end{document}

Eigentlich math contentist es nur ein Wrapper für content format. Es wird \ensuremathbeim Setzen um den Inhalt gelegt. Es kann aber verwendet werden, um den Inhalt auf jede Art und Weise aufzuhübschen (ohne ihn zu verändern):

\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}

Habenalledie Knoten in einem Baum werden im Mathematikmodus automatisch gesetzt, verwenden Sie sie math contentim räumlichen Propagator for tree. for treeist eigentlich ein bisschen irreführend, da es die angegebenen Optionen tatsächlich auf alle Knoten in einem anwendetunterBaum, aber na ja ... es macht seinem Namen alle Ehre, wenn es am Stammknoten oder in der Baumpräambel verwendet wird, wie unten.

\documentclass{article}
\usepackage{forest}

\begin{document}
\begin{forest}
  for tree={math content}
  [S_1
    [S_2]
    [S_3]
  ]
\end{forest}
\end{document}

Es ist etwas komplizierter, dafür zu sorgen, dass mit verschiedenen Teilen des Inhalts unterschiedliche Dinge passieren, aber Forest ist für diese Aufgabe gerüstet. Die splitSchlüsselfamilie nimmt einen Text, teilt ihn an einem gegebenen Trennzeichen und wendet (möglicherweise unterschiedliche) Schlüssel auf jeden Teil an. Ich werde das gleich veranschaulichen, aber lassen Sie mich zuerst die Familienmitglieder auflisten: splitgilt für den gegebenen Text; split optionnimmt den Text aus einer (Forest-)Option; und split registernimmt den Text aus einem (Forest-)Register. Im Folgenden werden wir verwenden split optionund es wird auf die Option wirken content, wo der Knoteninhalt (Sachen zwischen den Klammern bis zum ersten Komma) gespeichert ist.

Und jetzt, ohne weitere Umschweife, die Lösung für das OP-Problem.

\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}

Der Kern des autocolored mathStils ist natürlich der Aufruf von split option. Es nimmt den Text aus Option content(dem ersten Argument) und teilt ihn an den Stellen auf, an denen ;(das zweite Argument) vorkommt. So weit, so gut. Was ist mit dem dritten Argument, 1st,2nd,rest?

Das dritte Argument listet einige Stilnamen auf. Der erste Stil ( 1st) erhält den ersten Teil des Inhalts als Argument ( S_1, S_2usw.). Der zweite Stil ( 2nd) erhält den ersten Teil des Inhalts als Argument ( M_1, M_2usw.). Der dritte Stil ( rest) erhält ... aber Moment, was, wenn es kein drittes Argument gibt? Kein Problem: In einem solchen Fall (1 und 2 im Baum) restwird nie aufgerufen. Und wie der Name restschon sagt, kann es mehr als drei Argumente geben, und der letzte Stil wird für jedes zusätzliche Argument aufgerufen (5 im Baum). (Übrigens können die Stilnamen natürlich alles sein.)

Ein Wort zu content(siehe unten split option) vs. content'(in der Definition von 1st). Der contentSchlüssel ist etwas speziell. content=...„verpackt“ den Wert der contentOption automatisch, d. h. ##1in content={(##1)}bezieht sich auf den aktuellen Wert der Option content(und setzt ihn dann in Klammern). (Das Doppelte ##steht da, weil wir uns innerhalb der Definition von befinden autocolored math.) verhält sich „normal“, also bezieht sich content'in auf das Argument von (in unserem Fall ist dies der erste Teil des geteilten Ausdrucks).1st/.style={content'={#1}}#11st

content+hängt den angegebenen Text an den aktuellen Wert der Option an. Nun, im obigen Code habe ich tatsächlich die Version ohne automatisches Umbrechen verwendet content+'.

math contentBeachten Sie abschließend, dass ich oben eingefügt habe split option, obwohl man erwarten könnte, dass es nach gehört content={(##1)}. Dies diente nur dazu, zu demonstrieren, dass es überall (innerhalb) funktioniert for tree. Der Punkt ist, dass es den Wert der Option überhaupt math contentnicht beeinflusst . Es bestimmt vielmehr (über ), wie dieser Wert verwendet wird.contentcontent format

Und zu guter Letzt: Warum das delay? Standardmäßig werden die Optionen des übergeordneten Knotens vor den Optionen der untergeordneten Knoten verarbeitet; dazu gehört auch das Festlegen des Inhalts des Knotens durch [...]. Daher autocolored mathgilt , das am Stammknoten auftritt (also in der Präambel, die prinzipiell etwas anders ist ...), bevor der Inhalt eines beliebigen Knotens festgelegt wird! Wenn es kein gäbe delay, gäbe es nichts zu teilen.

verwandte Informationen