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}{},