森林树超出 TeX 输入堆栈大小 = 5000

森林树超出 TeX 输入堆栈大小 = 5000

2015/07/15 v1.0.10我在 texlive-pictures 中使用森林2015.38755

下面的代码

\documentclass[oneside,12pt]{article}

\usepackage[a4paper]{geometry}
\usepackage{microtype}
\usepackage[T1]{fontenc}
\usepackage{amssymb}

\usepackage{forest}
% parsing tree
\forestset{
  parsing tree/.style={
    declare toks={wff}{},
    declare toks={connective}{},
    for tree={
      math content,
      parent anchor=south,
      child anchor=north,
      inner sep=0pt
    },
    where level=0{
      for children={no edge},
      phantom
    }{
      delay={
        content=\circ,
        insert before/.wrap pgfmath arg={[##1,no edge,math content]}{wff()},
        if={strequal(connective(),"")}{connective/.option=wff}{},
        insert after/.wrap pgfmath arg={[##1,no edge,math content]}{connective()}
      },
      if n children=1{calign=child edge}{}
    }
  }
}
\begin{document}
\begin{forest}
  parsing tree
  [
    [,wff=p_0]
  ]
\end{forest}
\end{document}

导致以下错误

ERROR: TeX capacity exceeded, sorry [input stack size=5000].

--- TeX said ---
\pgfmathresult ->{\pgfmathresult 
                                 }{}
l.65 \end{forest}

看起来,的存在if={strequal(connective(),"")}{connective/.option=wff}{}导致了错误。

我该如何诊断并修复错误?

更新 1:在采纳了 Sašo Živanović 的建议后,我得到了以下可运行的代码。

\documentclass[oneside,12pt]{article}
\usepackage[a4paper]{geometry}
\usepackage{microtype}
\usepackage[T1]{fontenc}
\usepackage{amssymb}

\usepackage{forest}
% parsing tree
\forestset{
  declare toks={wff}{},
  declare toks={connective}{},
  parsing tree/.style={
    for tree={
      math content,
      parent anchor=south,
      child anchor=north,
      inner sep=0pt
    },
    where level=0{
      for children={no edge},
      phantom
    }{
      delay={
        content=\circ,
        insert before/.wrap pgfmath arg={[##1,no edge,math content]}{wff()},
        if connective={}{connective/.pgfmath=wff()}{},
        insert after/.wrap pgfmath arg={[##1,no edge,math content]}{connective()}
      },
      if n children=1{calign=child edge}{}
    }
  }
}
\begin{document}
\begin{forest}
  parsing tree
  [
    [,wff=p_0]
  ]
\end{forest}
\end{document}

答案1

侦探故事。你说得对,这句话就是(最后的)罪魁祸首:

if={strequal(connective(),"")}{connective/.option=wff}{},

事件链(按相反顺序):

  • Pgfmath 进入无限递归,\pgfmathresult扩展到\pgfmathresult

  • 为什么?因为是\pgfmathresult。(我不知道 pgfmath 如何从 到无限递归。这与其内部有关。但似乎很明显,永远不应将 设置为 pgfmath 函数的返回值。)\let\relax\relax\pgfmathresult\relax

  • 那是谁干的?显然是 option 的 pgfmath 函数connective

  • 为什么?因为它的值未定义。

  • 为什么?因为该选项是在节点创建之后声明的。

这个故事的寓意是:在树之外声明选项。在本例中,在样式之外:

\forestset{
  declare toks={wff}{},
  declare toks={connective}{},
  parsing tree/.style={
   ...

顺便说一句,你可以使用专门的条件,if connective而不是通用的if。它执行速度更快(类型:)

if connective={}{connective/.option=wff}{},

相关内容