
我想產生一個二元樹,在每個節點上我將輸入一對(例如 $(8,16)$ 或 $(S_2,M_2)$),第二個元件為紅色。我如何使用\forestset
巨集(從森林包)自動執行此操作,這樣當我編寫樹時,我可以在節點中寫入例如{{S_2}{M_2}}}
(或類似的)而不是{$(S_2,{\color{red} M_2})$ }
?特別是,如何讓每個節點的內容自動處於數學模式,而不必$...$
每次都寫入?
如果巨集還指定了,那就更好了,如果我輸入 3 個參數,然後第三個參數是藍色,這樣我就可以寫eg {{S_2}{M_2}{A_2}}
(或類似的)而不是{$(S_2,{\red M_2},{\color{blue} A_2})$ }
答案1
若要在數學模式下排版節點,請使用 key math content
,如下所示:
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
[2^{42}, math content
[A]
[A, math content]
]
\end{forest}
\end{document}
實際上,math content
它只是 的一個包裝content format
。它\ensuremath
在排版時將內容放在周圍。但它可以用來以任何方式裝飾內容(不改變它):
\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}
具有全部樹中的節點自動以數學模式排版,math content
在空間傳播器中使用for tree
。for tree
實際上有點用詞不當,因為它實際上將給定的選項應用於 a 中的所有節點子樹,但是啊,好吧……如果它用在根節點或樹序言中,那就名副其實,如下所示。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[S_1
[S_2]
[S_3]
]
\end{forest}
\end{document}
讓內容的不同部分發生不同的事情有點複雜,但 Forest 已經做好了這項工作的準備。鍵系列split
採用一些文本,在給定的分隔符號處將其分割,並將(可能不同的)鍵應用於每個部分。我稍後會對此進行說明,但首先讓我列出家庭成員:split
適用於給定的文字;split option
從某些(森林)選項中獲取文本;並split register
從某些(森林)登記冊中取得文字。下面,我們將使用split option
,它將作用於選項content
,其中儲存節點內容(括號之間到第一個逗號的內容)。
現在,言歸正傳,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}
風格的核心autocolored math
當然是調用split option
。它從選項(第一個參數)中獲取文本content
,並在出現;
(第二個參數)時將其拆分。到目前為止,一切都很好。那麼第三個參數呢1st,2nd,rest
?
第三個參數列出了一些樣式名稱。第一個樣式 ( 1st
) 將取得內容的第一部分作為其參數(S_1
、S_2
等)。第二種樣式 ( 2nd
) 將取得內容的第一部分作為其參數(M_1
、M_2
等)。第三種風格 ( rest
) 將會得到...但等等,沒有第三個參數是什麼?沒問題:在這種情況下(樹中的 1 和 2),rest
永遠不會被調用。顧名思義rest
,可能有三個以上的參數,每個額外的參數(樹中的 5 個)都會呼叫最後一個樣式。 (順便說一句,樣式名稱顯然可以是任何名稱。)
content
關於(見下文split option
)與content'
(在 的定義中)的一個字1st
。關鍵content
是有點特別。content=...
「autowraps」選項的值content
,即##1
incontent={(##1)}
指選項的目前值content
(然後用括號括起來)。 (加倍##
是因為我們在 的定義範圍內autocolored math
。)content'
表現得“正常”,所以在1st/.style={content'={#1}}
,#1
中指的是 的參數1st
(在我們的例子中,這將是 split 表達式的第一部分)。
content+
將給定文字附加到選項的目前值。嗯,在上面的程式碼中,我實際上使用了非自動換行版本content+'
。
最後,請注意,我已將 放在math content
上面split option
,而人們可能會認為它屬於 後面content={(##1)}
。這只是為了證明它可以在任何地方(在for tree
)內工作。關鍵是這根本math content
不影響選擇權的價值。content
它而是決定(通過content format
)如何使用該值。
最後但並非最不重要的一點是,為什麼delay
?預設情況下,父級的選項先於子級的選項處理;其中包括節點的設定內容[...]
。因此autocolored math
,發生在根節點(嗯,在前言中,原則上略有不同......),在設定任何節點的內容之前應用!如果沒有delay
,就沒有什麼可以分割的。