我安装了 forest 2016/03/04 v2.0.2
,并通过修改源代码开始尝试最新的 forest 功能https://tex.stackexchange.com/a/302713/82730。
使用以下代码,
\documentclass[convert={size=640}]{standalone}
\usepackage{microtype}
\usepackage[T1]{fontenc}
% forest
\usepackage{forest}
% parsing tree
\forestset{
declare toks={wff}{},
declare toks={connective}{},
parsing tree/.style={
declare dimen register={parsing tree sep},
parsing tree sep=5pt,
% Append the current root to a new phantom root.
for root'={
replace by={[,phantom,append=!last dynamic node]}
},
% `for tree` applies only to the subtree of the new phantom root.
for tree={
math content,
parent anchor=children,
child anchor=parent,
inner sep=0pt,
if n children=1{!first.calign with current edge}{},
delay={
content=\circ,
insert before/.wrap pgfmath arg={
[##1,no edge,math content,anchor=base east,
before computing xy={
s/.pgfmath={s("!n")-\forestregister{parsing tree sep}}
}]
}{wff},
if connective={}{connective/.option=wff}{},
insert after/.wrap pgfmath arg={
[##1,no edge,math content,anchor=base west,
before computing xy={
s/.pgfmath={s("!p")+\forestregister{parsing tree sep}}
}]
}{connective},
}
}
}
}
\begin{document}
\begin{forest}
parsing tree
[,wff=p_0\wedge q_0,connective=\wedge
[,wff=p_0] [,wff=q_0 []]]
\end{forest}
\end{document}
來
如果我取出if connective={}{connective/.option=wff}{}
如下delay
内容,
\documentclass[convert={size=640}]{standalone}
\usepackage{microtype}
\usepackage[T1]{fontenc}
% forest
\usepackage{forest}
% parsing tree
\forestset{
declare toks={wff}{},
declare toks={connective}{},
parsing tree/.style={
declare dimen register={parsing tree sep},
parsing tree sep=5pt,
% Append the current root to a new phantom root.
for root'={
replace by={[,phantom,append=!last dynamic node]}
},
% `for tree` applies only to the subtree of the new phantom root.
for tree={
math content,
parent anchor=children,
child anchor=parent,
inner sep=0pt,
if n children=1{!first.calign with current edge}{},
if connective={}{connective/.option=wff}{},
delay={
content=\circ,
insert before/.wrap pgfmath arg={
[##1,no edge,math content,anchor=base east,
before computing xy={
s/.pgfmath={s("!n")-\forestregister{parsing tree sep}}
}]
}{wff},
insert after/.wrap pgfmath arg={
[##1,no edge,math content,anchor=base west,
before computing xy={
s/.pgfmath={s("!p")+\forestregister{parsing tree sep}}
}]
}{connective},
}
}
}
}
\begin{document}
\begin{forest}
parsing tree
[,wff=p_0\wedge q_0,connective=\wedge
[,wff=p_0] [,wff=q_0 []]]
\end{forest}
\end{document}
我懂了
似乎声明的节点选项只有在延迟后才可用。我说得对吗?
答案1
你是对的。
树前导(在您的情况下为parsing tree
)在分配给各个节点的键之前执行(更准确地说,在根节点的键之前)。那时,所有选项(包括content
和任何使用声明的选项)仍具有默认值。所以是的,要访问括号规范中给出的值,我们需要使用delay
(当然,假设相关选项本身未嵌入某个时间传播器中。)
另请参阅:教程中的示例 (11)、content
参考中的选项以及节点键部分的介绍。
答案2
似乎声明的节点选项只有在延迟后才可用。我说得对吗?
这取决于你的意思。
如果你的意思是声明的节点选项有一些特殊之处 - 例如与 Forest 提供的选项或节点内容相反 - 那么答案是否定的。没有区别。
如果你的意思是声明选项的值只有在延迟时才能正确处理,那么答案是否定的。不完全是。这取决于你想如何处理它们以及你想在何时何地指定它们。
如果您的意思是,依赖于 Forest 解析树的括号规范的值在解析树(即在第一个循环期间)之前不可用,那么是的。这是真的。但这适用于树规范中提供的所有值 - 而不仅仅是选项或声明的选项。
由于原作者没有注明代码来源,我只能猜测这是我发布的代码的后代这里。但是,如果这是正确的,我可以说以下内容。
我这样设计样式的原因是,对于树中的每个节点,connective
(cyswllt
)的最终值取决于connective
该节点的括号规范中赋予的值(如果有)。当且仅当树规范中未指定时,才会更改值connective
。因此,是否更改它都需要树规范中指定的值可用。并且那要求在第一个周期内对规范进行解析。
注意当前值声明选项的始终可用。在第一个周期内,这通常是默认值。
\documentclass[border=5pt,tikz,multi]{standalone}
\usepackage{forest}
\forestset{%
declare toks={cyswllt}{blue},
dosbarthu/.style={%
for tree={
color/.option=cyswllt,
},
}
}
\begin{document}
\begin{forest}
dosbarthu
[a
[b]
[c]
]
\end{forest}
\end{document}
然而,如果你想改变默认值 - 通常情况下是这样的,否则为什么要使用选项? - 那么你需要延迟。例如:
\documentclass[border=5pt,tikz,multi]{standalone}
\usepackage{forest}
\forestset{%
declare toks={cyswllt}{blue},
dosbarthu/.style={%
for tree={
color/.option=cyswllt,
},
}
}
\begin{document}
\begin{forest}
dosbarthu,
[a, cyswllt=green,
[b]
[c]
]
\end{forest}
\forestset{%
dosbarthu/.style={%
for tree={
delay={color/.option=cyswllt,},
},
}
}
\begin{forest}
dosbarthu,
[a, cyswllt=green,
[b]
[c]
]
\end{forest}
\end{document}
产量
作为Sašo Živanović 表示,这就像contents
Forest 版本 1(和 2)中的行为。如果您想在树规范中未指定内容时(且仅当)更改其值,或者如果内容为蓝色节点,则希望其为绿色节点abc
,则必须确保测试此情况的条件仅在第一个循环之后执行。