平均能量损失

平均能量损失

我正在尝试修改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

  1. edge label与处理程序一起使用.expanded,以扩展。解决方案:通过\forestoption{elo}保护边缘节点的内容。#3\unexpanded
  2. decision并由处理器content供给.expanded,以便扩展\getfirstgetsecond。解决方案:.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},

相关内容