
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 \forestset
Makro (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 content
ist es nur ein Wrapper für content format
. Es wird \ensuremath
beim 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 content
im räumlichen Propagator for tree
. for tree
ist 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 split
Schlü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: split
gilt für den gegebenen Text; split option
nimmt den Text aus einer (Forest-)Option; und split register
nimmt den Text aus einem (Forest-)Register. Im Folgenden werden wir verwenden split option
und 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 math
Stils 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_2
usw.). Der zweite Stil ( 2nd
) erhält den ersten Teil des Inhalts als Argument ( M_1
, M_2
usw.). 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) rest
wird nie aufgerufen. Und wie der Name rest
schon 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 content
Schlüssel ist etwas speziell. content=...
„verpackt“ den Wert der content
Option automatisch, d. h. ##1
in 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}}
#1
1st
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 content
Beachten 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 content
nicht beeinflusst . Es bestimmt vielmehr (über ), wie dieser Wert verwendet wird.content
content 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 math
gilt , 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.