为什么声明的节点选项要经过延迟后才可用?

为什么声明的节点选项要经过延迟后才可用?

我安装了 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

似乎声明的节点选项只有在延迟后才可用。我说得对吗?

这取决于你的意思。

  1. 如果你的意思是声明的节点选项有一些特殊之处 - 例如与 Forest 提供的选项或节点内容相反 - 那么答案是否定的。没有区别。

  2. 如果你的意思是声明选项的值只有在延迟时才能正确处理,那么答案是否定的。不完全是。这取决于你想如何处理它们以及你想在何时何地指定它们。

  3. 如果您的意思是,依赖于 Forest 解析树的括号规范的值在解析树(即在第一个循环期间)之前不可用,那么是的。这是真的。但这适用于树规范中提供的所有值 - 而不仅仅是选项或声明的选项。

由于原作者没有注明代码来源,我只能猜测这是我发布的代码的后代这里。但是,如果这是正确的,我可以说以下内容。

我这样设计样式的原因是,对于树中的每个节点,connectivecyswllt)的最终值取决于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ć 表示,这就像contentsForest 版本 1(和 2)中的行为。如果您想在树规范中未指定内容时(且仅当)更改其值,或者如果内容为蓝色节点,则希望其为绿色节点abc,则必须确保测试此情况的条件仅在第一个循环之后执行。

相关内容