使用 \forestset 巨集自動開啟每個節點中的數學模式,並為每對的第二個元件著色?

使用 \forestset 巨集自動開啟每個節點中的數學模式,並為每對的第二個元件著色?

我想產生一個二元樹,在每個節點上我將輸入一對(例如 $(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 treefor 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_1S_2等)。第二種樣式 ( 2nd) 將取得內容的第一部分作為其參數(M_1M_2等)。第三種風格 ( rest) 將會得到...但等等,沒有第三個參數是什麼?沒問題:在這種情況下(樹中的 1 和 2),rest永遠不會被調用。顧名思義rest,可能有三個以上的參數,每個額外的參數(樹中的 5 個)都會呼叫最後一個樣式。 (順便說一句,樣式名稱顯然可以是任何名稱。)

content關於(見下文split option)與content'(在 的定義中)的一個字1st。關鍵content是有點特別。content=...「autowraps」選項的值content,即##1incontent={(##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,就沒有什麼可以分割的。

相關內容