我想生成一个二叉树,在每个节点上我将输入一对(例如(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
实际上有点用词不当,因为它实际上将给定的选项应用于子树,但是嗯...如果它在根节点或者树序中使用,它就符合它的名字,如下所示。
\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_1
、S_2
等)。第二个样式 ( 2nd
) 将获取内容的第一部分作为其参数(M_1
、M_2
等)。第三个样式 ( rest
) 将获取...但是,等等,如果没有第三个参数怎么办?没问题:在这种情况下(树中的 1 和 2),rest
永远不会被调用。顾名思义rest
,可能有三个以上的参数,最后一个样式将为每个额外的参数(树中的 5)调用。(顺便说一句,样式名称显然可以是任何名称。)
content
关于(见下文split option
)与content'
(在 的定义中)的说明1st
。content
关键是有点特殊。content=...
“自动换行”选项的值content
,即##1
中content={(##1)}
引用选项的当前值content
(然后将其括在括号中)。(之所以##
有双倍,是因为我们在 的定义中autocolored math
。)content'
表现为“正常”,因此 中1st/.style={content'={#1}}
引用#1
的参数1st
(在我们的例子中,这将是拆分表达式的第一部分)。
content+
将给定的文本附加到选项的当前值。好吧,在上面的代码中,我实际上使用了非自动换行版本content+'
。
最后,请注意,我将 放在math content
上方split option
,而有人可能认为它应该放在 之后content={(##1)}
。这只是为了证明它可以在任何地方(在 内for tree
)工作。重点是根本math content
不影响 option 的值。它反而决定(通过)如何使用该值。content
content format
最后但并非最不重要的一点是,为什么是delay
?默认情况下,父节点的选项在子节点的选项之前处理;这包括 通过 设置节点的内容[...]
。因此autocolored math
,发生在根节点的 (好吧,在序言中,原则上略有不同......) 在任何节点的内容设置之前适用!如果没有delay
,就没有什么可分割的。