例如,
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
是等效的。如果您需要多个label
s,则仅需要在这里。
我认为,宏不是实现此目的的最佳方法。特别是,带有您所考虑的标准可选参数的宏肯定不会起作用,因为方括号会使解析器感到困惑,因此您至少必须保护它们。
但还有一个更基本的问题。到底会去哪里\labelA
?\labelB
考虑一下
[node text \labelA...
]
在这里,标签规范将作为节点内容的一部分进行解析。Forest 不会介意这一点,但它不会给出您想要的结果,所以这没什么用。
或者
[node text, \labelA...
]
在这里,\labelA...
将被读作一个键值选项,但事实并非如此。Forest 不会高兴的。TikZ 也不会高兴,Forest 会试图将责任推给 TikZ,如果它能解析出一些东西的话。
唯一剩下的位置是
[node text
]\labelA...
我认为这会导致宏被完全忽略。
因此,即使是没有可选参数的简单宏在这里也无法起作用。
相反,您应该使用您引用的示例所建议的自定义样式。但是,您不需要任何像手册中给出的样式那么复杂的样式,因为您不是想自动执行自定义或标签的放置和/或内容。
您可能想要类似下面的东西。
我们定义了 2 种样式,labelA
和labelB
。每种样式都需要 3 个参数。
\labelA={<direction>}{<font>}{<content>}
在包含指定<direction>
(例如left
, )的right
相关<font>
(例如,\scriptsize
)中创建由(例如, )给出的边标签。\sffamily
<content>
9
exotic paper towels
labelB={<distance>}{<font>}{<content>}
在包含指定(例如 、 )的相关(例如 、 )中,在距离(例如 、 )的主<distance>
节点下方创建一个标签。7pt
3mm
<font>
\large
\bfseries
<content>
0
tranquil 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}