\forestset マクロを使用して、各ノードで数式モードを自動的にオンにし、すべてのカップルの 2 番目のコンポーネントに色を付けますか?

\forestset マクロを使用して、各ノードで数式モードを自動的にオンにし、すべてのカップルの 2 番目のコンポーネントに色を付けますか?

バイナリツリーを作成し、各ノードに2つの要素(たとえば$(8,16)$または$(S_2,M_2)$)を入力し、2番目の要素を赤色にします。マクロ\forestset森林パッケージ) を使用すると、ツリーを書き込むときに、{{S_2}{M_2}}}の代わりにノード eg (または同様のもの)を書き込むことができるようになります。特に、毎回{$(S_2,{\color{red} M_2})$ }書き込まなくても、各ノードの内容を自動的に数式モードにするにはどうすればよいでしょうか。$...$

さらに良いのは、マクロで次のように指定することです。もし3つの引数を入力すると、3番目は青色で表示されるので、eg {{S_2}{M_2}{A_2}}(または同様のもの) の代わりに次のように記述できます。{$(S_2,{\red M_2},{\color{blue} A_2})$ }

答え1

ノードを数式モードでタイプセットするには、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これは実際には少し誤った名称であり、指定されたオプションをツリー内のすべてのノードに適用します。サブツリーですが、まあ...ルート ノードで使用される場合、または以下のようにツリーのプリアンブルで使用される場合は、その名前に忠実です。

\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からテキストを取得し、 の出現箇所(2 番目の引数) で分割します。ここまでは順調です。3 番目の引数 はどうでしょうか。content;1st,2nd,rest

3 番目の引数には、いくつかのスタイル名がリストされます。最初のスタイル ( 1st) は、コンテンツの最初の部分を引数として取得します ( S_1S_2など)。2 番目のスタイル ( 2nd) は、コンテンツの最初の部分を引数として取得します ( M_1M_2など)。3 番目のスタイル ( rest) は... でも、3 番目の引数がない場合はどうなるでしょうか? 問題ありません。そのような場合 (ツリーの 1 と 2) はrest呼び出されません。また、名前restが示すように、引数が 3 つより多い場合があり、最後のスタイルは余分な引数ごとに呼び出されます (ツリーの 5)。 (ちなみに、スタイル名は当然何でもかまいません。)

content(下記参照split option) とcontent'( の定義内1st)について一言。contentキーは少し特殊です。オプションcontent=...の値を「自動ラップ」します。つまり、ではcontent、オプションの現在の値を参照します(そして、その周囲に括弧を配置します)。( の定義内にあるため、二重になっています。)は「通常どおり」動作するため、 では、は の引数を参照します(この場合、これが分割式の最初の部分になります)。##1content={(##1)}content##autocolored mathcontent'1st/.style={content'={#1}}#11st

content+指定されたテキストをオプションの現在の値に追加します。さて、上記のコードでは、実際には自動ラップされないバージョンを使用していますcontent+'

math content最後に、 をの上に置いたことに注意してくださいsplit option。 は の後に置くべきであると思われるかもしれませんcontent={(##1)}。 これは、 がどこでも ( 内) 機能することを示すためだけに行われましたfor tree。 重要なのは、 はオプションの値にまったくmath content影響しないということです。 むしろ、 によってこの値がどのように使用されるかを決定します。contentcontent format

最後になりましたが、なぜ なのでしょうかdelay。デフォルトでは、親のオプションは子のオプションの前に処理されます。これには、 によるノードの設定コンテンツが含まれます[...]。したがってautocolored math、ルートノードで発生する (正確には、プリアンブルで発生しますが、これは原理的には少し異なります...)は、どのノードのコンテンツも設定されない前に適用されます。 がなければdelay、分割するものが何もないことになります。

関連情報