我正在使用该forest
包绘制形式语法的解析树,并希望将所有非 Epsilon 的终端复制到底部并用虚线连接到原始节点。通过阅读森林文档,我得到了一个有点实用的最小示例,但缺少两个基本的东西:首先,它不复制原始节点的内容并使用“x”作为占位符,并且它目前无法检测 Epsilon 节点并省略对这些节点的复制。
MWE.tex:
\documentclass[paper=a4, fontsize=11pt]{scrartcl}
\usepackage{forest}
\begin{document}
\begin{forest}
before typesetting nodes={
where n children=0{
append={
[x,tier=terminal,edge=dotted]
}
}{}
}
[\(S\)
[\(S_0\)
[\(0\)]
[\(S_0\)
[\(0\)]
[\(S_0\)
[\(0\)]
[\(S_0\)
[\(0\)]
[\(S_0\)
[\(0\)]
]
[\(1\)]
]
[\(1\)]
]
[\(1\)]
]
[\(1\)]
]
[\(S_1\)
[\(2\)]
[\(S_1\)
[\(\epsilon\)]
]
]
]
\end{forest}
\end{document}
MWE.tex 生产:
期望结果:
答案1
以下序言可以达到这一目的:
before typesetting nodes={
where n children=0{
if content={\(\epsilon\)}{}{
append={
[x,tier=terminal,edge=dotted,content/.pgfmath=content("!u")]
}
}
}{}
}
答案2
最初为版本 1 编写的代码森林但使用版本 2 可以编译成功。
作为补充Sašo Živanović 的回答,请注意,如果使用math content
,则不需要在树的每个节点内指定数学模式:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
before typesetting nodes={
where n children=0{
if content={\epsilon}{}{
append={
[,math content, tier=terminal, edge=dotted, content/.pgfmath=content("!u")]
}
}
}{}
},
for tree={
math content
}
[S
[S_0
[0]
[S_0
[0]
[S_0
[0]
[S_0
[0]
[S_0
[0]
]
[1]
]
[1]
]
[1]
]
[1]
]
[S_1
[2]
[S_1
[\epsilon]
]
]
]
\end{forest}
\end{document}