我正在尝试修改forest
手动的。但是,模板的设置方式使得我无法输入更“高级”的数学内容,例如\nicefrac
或\underset
。例如,在下面的 MWE 中,我想a/b
用\nicefrac{a}{b}
和c/d
替换\underset{d}{c}
。但是我在尝试这样做时出现错误。有什么想法吗?
平均能量损失
\documentclass{article}
\usepackage{mathtools,nicefrac}
\usepackage{forest}
\begin{document}
\def\getfirst#1;#2\endget{#1}
\def\getsecond#1;#2\endget{#2}
\forestset{declare toks={elo}{}} % edge label options
\begin{forest}
anchors/.style={anchor=#1,child anchor=#1,parent anchor=#1},
for tree={
font=\footnotesize,
s sep=0.5em,l+=8mm,
if n children=0{anchors=north}{
if n=1{anchors=south east}{anchors=south west}},
content format={$\forestoption{content}$}
},
anchors=south, outer sep=2pt,
dot/.style={tikz+={\fill (.child anchor) circle[radius=2pt];}},
for descendants=dot,
decision edge label/.style n args=3{
edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$#3$}}
},
decision/.style={if n=1
{decision edge label={left}{east}{#1}}
{decision edge label={right}{west}{#1}}
},
delay={for descendants={
decision/.expanded/.wrap pgfmath arg={\getsecond#1\endget}{content},
content/.expanded/.wrap pgfmath arg={\getfirst#1\endget}{content},
}},
[N
[;{a/b}[{2,3};m][{2,3};n]] % \nicefrac{a}{b} doesn't work
[;{c/d}[{2,3};m][{2,3};n]] % \underset{d}{c} doesn't work
]
\end{forest}
\end{document}
电流输出
答案1
该forest
包\edef
在应该使用的地方使用了\protected@edef
。
因此,使用 来\nicefrac
定义 并\DeclareRobustCommand
没有帮助。该\underset
命令从一开始就很脆弱,因此无论如何它都会失败,但\protect
由于开头提到的问题,在其前面加上 的标准方法不起作用。
解决方案:
\documentclass{article}
\usepackage{mathtools,nicefrac,etoolbox}
\usepackage{forest}
\robustify{\nicefrac}
\robustify{\underset}
现在\nicefrac
(名字选得不好,应该是\uglyfrac
)就\underset
可以使用了。
另一种方法是
\newcommand{\extraprotect}1{% \unexpanded{\unexpanded{#1}}% }
如果是
\newcommand{\payoff}[1]{\begin{pmatrix}#1\end{pmatrix}}
您可以使用
\extraprotect{\payoff{a & b \\ c & d}}
在论证中forest
,说
[;{\extraprotect{\payoff{a & b \\ c & d}}}[{2,3};m][{2,3};n]]
完整示例:
\documentclass{article}
\usepackage{mathtools,nicefrac,etoolbox}
\usepackage{forest}
\robustify{\nicefrac}
\robustify{\underset}
\newcommand{\extraprotect}[1]{\unexpanded{\unexpanded{#1}}}
\newcommand{\payoff}[1]{\begin{pmatrix}#1\end{pmatrix}}
\begin{document}
\def\getfirst#1;#2\endget{#1}
\def\getsecond#1;#2\endget{#2}
\forestset{declare toks={elo}{}} % edge label options
\begin{forest}
anchors/.style={anchor=#1,child anchor=#1,parent anchor=#1},
for tree={
font=\footnotesize,
s sep=0.5em,l+=8mm,
if n children=0{anchors=north}{
if n=1{anchors=south east}{anchors=south west}},
content format={$\forestoption{content}$}
},
anchors=south, outer sep=2pt,
dot/.style={tikz+={\fill (.child anchor) circle[radius=2pt];}},
for descendants=dot,
decision edge label/.style n args=3{
edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$#3$}}
},
decision/.style={if n=1
{decision edge label={left}{east}{#1}}
{decision edge label={right}{west}{#1}}
},
delay={for descendants={
decision/.expanded/.wrap pgfmath arg={\getsecond#1\endget}{content},
content/.expanded/.wrap pgfmath arg={\getfirst#1\endget}{content},
}},
[N
[;{\nicefrac{a}{b}}[{2,3};m][{2,3};n]] % \nicefrac{a}{b} doesn't work
[;{\extraprotect{\payoff{c\\d}}}[{2,3};m][{2,3};n]] % \underset{d}{c} doesn't work
]
\end{forest}
\end{document}
答案2
问题不在于forest
包本身,而在于决策树样式(诚然,可以在手册中找到),它有两次扩展\nicefrac
或的机会\underset
。
edge label
与处理程序一起使用.expanded
,以扩展。解决方案:通过\forestoption{elo}
保护边缘节点的内容。#3
\unexpanded
decision
并由处理器content
供给.expanded
,以便扩展\getfirst
和getsecond
。解决方案:.expand once
足够了。
代码:
% bad line
edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$#3$}}
% good line
edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$\unexpanded{#3}$}}
% bad line
decision/.expanded/.wrap pgfmath arg={\getsecond#1\endget}{content},
% good line
decision/.expand once/.wrap pgfmath arg={\getsecond#1\endget}{content},
% bad line
content/.expanded/.wrap pgfmath arg={\getfirst#1\endget}{content},
% good line
content/.expand once/.wrap pgfmath arg={\getfirst#1\endget}{content},