使用 \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实际上有点用词不当,因为它实际上将给定的选项应用于树,但是嗯...如果它在根节点或者树序中使用,它就符合它的名字,如下所示。

\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,其中存储节点内容(括号之间直到第一个逗号的内容)。

现在,不用多说,我们来解决这个问题。

\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当然是 的调用。它从 option (第一个参数)split option中获取文本,并在 出现时将其拆分(第二个参数)。到目前为止,一切顺利。那么第三个参数呢?content;1st,2nd,rest

第三个参数列出了一些样式名称。第一个样式 ( 1st) 将获取内容的第一部分作为其参数(S_1S_2等)。第二个样式 ( 2nd) 将获取内容的第一部分作为其参数(M_1M_2等)。第三个样式 ( rest) 将获取...但是,等等,如果没有第三个参数怎么办?没问题:在这种情况下(树中的 1 和 2),rest永远不会被调用。顾名思义rest,可能有三个以上的参数,最后一个样式将为每个额外的参数(树中的 5)调用。(顺便说一句,样式名称显然可以是任何名称。)

content关于(见下文split option)与content'(在 的定义中)的说明1stcontent关键是有点特殊。content=...“自动换行”选项的值content,即##1content={(##1)}引用选项的当前值content(然后将其括在括号中)。(之所以##有双倍,是因为我们在 的定义中autocolored math。)content'表现为“正常”,因此 中1st/.style={content'={#1}}引用#1的参数1st(在我们的例子中,这将是拆分表达式的第一部分)。

content+将给定的文本附加到选项的当前值。好吧,在上面的代码中,我实际上使用了非自动换行版本content+'

最后,请注意,我将 放在math content上方split option,而有人可能认为它应该放在 之后content={(##1)}。这只是为了证明它可以在任何地方(在 内for tree)工作。重点是根本math content不影响 option 的值。它反而决定(通过)如何使用该值。contentcontent format

最后但并非最不重要的一点是,为什么是delay?默认情况下,父节点的选项在子节点的选项之前处理;这包括 通过 设置节点的内容[...]。因此autocolored math,发生在根节点的 (好吧,在序言中,原则上略有不同......) 在任何节点的内容设置之前适用!如果没有delay,就没有什么可分割的。

相关内容