如何在森林中定义宏(例如标记边缘)

如何在森林中定义宏(例如标记边缘)

我想用某种风格来标记单边和分支边: 在此处输入图片描述

例如,

edge label={node[right,midway,font=\scriptsize]{9}}

我想要的\labelA[right]{\scriptsize}{9}

node options={label={[label distance=7pt,font=\scriptsize]-90:0}}

\labelB[7pt]{\scriptsize}{0}

我尝试了包中有关决策树的示例,但是我没有完全理解并且我不想致力于决策树。

梅威瑟:

\documentclass[10pt,a4paper]{article}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{forest}
\begin{document}

\begin{forest}
%  decision edge label/.style n args=3{
%    edge label/.expanded={node[midway,auto=#1,anchor=#2,\forestoption{elo}]{\strut$\unexpanded{#3}$}}
%  },
for tree={  align=center, 
            parent anchor=south, 
            child anchor=north, 
            l sep=10mm,
            s sep=10mm}         
[A\\B\rule{0mm}{4mm}
 ,baseline
 [C\\D
  ,edge label={node[right,midway,font=\scriptsize]{9}}
  ,node options={label={[label distance=7pt,font=\scriptsize]-90:0}}
  [E
   [F
    ,edge label={node[left,midway,font=\scriptsize]{3}}
   ]
  ]
  [M
   [P
    ,edge label={node[left,midway,font=\scriptsize]{1}} 
   ]
  ]
 ]
]  
\end{forest}

\end{document}

答案1

首先请注意,这node options很少需要。

label={[label distance=7pt,font=\scriptsize]-90:0} 

node options是等效的。如果您需要多个labels,则仅需要在这里。

我认为,宏不是实现此目的的最佳方法。特别是,带有您所考虑的标准可选参数的宏肯定不会起作用,因为方括号会使解析器感到困惑,因此您至少必须保护它们。

但还有一个更基本的问题。到底会去哪里\labelA\labelB考虑一下

[node text \labelA...
]

在这里,标签规范将作为节点内容的一部分进行解析。Forest 不会介意这一点,但它不会给出您想要的结果,所以这没什么用。

或者

[node text, \labelA...
]

在这里,\labelA...将被读作一个键值选项,但事实并非如此。Forest 不会高兴的。TikZ 也不会高兴,Forest 会试图将责任推给 TikZ,如果它能解析出一些东西的话。

唯一剩下的位置是

[node text
]\labelA...

我认为这会导致宏被完全忽略。

因此,即使是没有可选参数的简单宏在这里也无法起作用。

相反,您应该使用您引用的示例所建议的自定义样式。但是,您不需要任何像手册中给出的样式那么复杂的样式,因为您不是想自动执行自定义或标签的放置和/或内容。

您可能想要类似下面的东西。

我们定义了 2 种样式,labelAlabelB。每种样式都需要 3 个参数。

  • \labelA={<direction>}{<font>}{<content>}在包含指定<direction>(例如left, )的right相关<font>(例如,\scriptsize)中创建由(例如, )给出的边标签。\sffamily<content>9exotic paper towels

  • labelB={<distance>}{<font>}{<content>}在包含指定(例如 、 )的相关(例如 、 )中,在距离(例如 、 )的主<distance>节点下方创建一个标签。7pt3mm<font>\large\bfseries<content>0tranquil Malteasers

例如,

    labelA={right}{\scriptsize}{9},
    labelB={7pt}{\scriptsize}{0},

为节点重新创建原始示例中的标签C\\D

带样式的标签

代碼:

\documentclass[tikz, border=5pt, multi]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
  labelA/.style n args=3{%
    edge label/.expanded={%
      node [midway, auto=#1, font=\unexpanded{#2}] {#3}%
    },
  },
  labelB/.style n args=3{%
    label={%
      [label distance=#1, font=\unexpanded{#2}]-90:{#3}%
    },
  },
  for tree={
    align=center,
    parent anchor=children,
    child anchor=parent,
    l sep'=10mm,
    s sep'=10mm,
  }
  [A\\B\rule{0mm}{4mm},
   baseline
   [C\\D,
    labelA={right}{\scriptsize}{9},
    labelB={7pt}{\scriptsize}{0},
    [E
     [F,
       labelA={left}{\scriptsize}{3}
     ]
    ]
    [M
     [P,
       labelA={left}{\scriptsize}{1}
     ]
    ]
   ]
  ]
\end{forest}
\end{document}

相关内容