我正在尝试定义一个宏,用于使用在二叉树中写入空节点tikz-qtree
。参考下面的代码,我希望将\missing
代码中的字符串替换为\edge[draw=none]; {}
原样(就像我在代码中简单地进行查找和替换一样)。
这可能吗?如何实现?我不想\edge[draw=none]; {}
每次二叉树中有空节点时都进行粘贴。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\newcommand{\missing}{ \edge[draw=none]; {} }
%intended usage inside tikzpicture enviornment:
%\Tree [.3 1
% \missing ]
%To producce the same result as code below but
%it gave me an error:
%! Undefined control sequence.
%\missing -> \edge
% [draw=none]; {}
\begin{document}
\begin{tikzpicture}
\Tree [.3 1
\edge[draw=none]; {} ]
\end{tikzpicture}
\end{document}
答案1
你需要\missing
在适当的时候鼓励扩张:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\makeatletter
\let\old@@children\@@children
\def\@@children{\futurelet\my@next\my@@children}
\def\my@@children{%
\ifx\my@next\missing\else
\expandafter\@gobble
\fi
\expandafter\old@@children}
\makeatother
\newcommand{\missing}{ \edge[draw=none]; {} }
%intended usage inside tikzpicture enviornment:
%\Tree [.3 1
% \missing ]
%To producce the same result as code below but
%it gave me an error:
%! Undefined control sequence.
%\missing -> \edge
% [draw=none]; {}
\begin{document}
\begin{tikzpicture}
\Tree [.3 1 \missing ]
\end{tikzpicture}
\end{document}
答案2
如果你正在绘制树,我建议你看一下forest
哪个非常强大并且使用与tikz-qtree
/类似的语法qtree
。它还具有缺失节点的内置样式:
\documentclass[tikz]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
[3
[1
]
[,phantom
]
]
\end{forest}
\end{document}
如果您只想将 a 传递missing
给相关节点并构造幻影,您可以执行如下操作,其输出与上面的代码相同:
\documentclass[tikz,multi,varwidth]{standalone}
\usepackage{forest}
\begin{document}
\forestset{
missing/.style={
before typesetting nodes={
append={[, phantom]},
},
},
}
\begin{forest}
[3, missing
[1
]
]
\end{forest}
\end{document}
这可用于节点可能有超过 2 个子节点的非二叉树。如果您有时想要在这样的树中将缺失节点添加到节点子节点的中间,则可以采用missing
等于节点之前出现的子节点数量的参数missing
。
例如:
\documentclass[tikz,multi,varwidth]{standalone}
\usepackage{forest}
\begin{document}
\forestset{
missing/.style={
for children={
if n=#1{
before typesetting nodes={
insert after={[, phantom]},
},
}{},
},
},
}
\begin{forest}
[3, missing=3
[1
]
[2
]
[3
]
[4
]
]
\end{forest}
\end{document}
如果您希望第一个孩子失踪,则需要一些稍微复杂一点的东西,即如果missing=0
有可能:
\documentclass[tikz,multi,varwidth]{standalone}
\usepackage{forest}
\begin{document}
\forestset{
missing/.style={
if={equal(#1,0)}{
before typesetting nodes={
prepend={[, phantom]},
},
}{
for children={
if n=#1{
before typesetting nodes={
insert after={[, phantom]},
},
}{},
},
},
},
}
\begin{forest}
[0
[1
]
[2, missing=0
[2
]
[3
]
]
[3, missing=1
[1
]
[3
]
]
[4
]
]
\end{forest}
\end{document}
这在二叉树中也可能有用,因为您可以将其用于0
左子树缺失和1
右子树缺失:
\documentclass[tikz,multi,varwidth]{standalone}
\usepackage{forest}
\begin{document}
\forestset{
missing/.style={
if={equal(#1,0)}{
before typesetting nodes={
prepend={[, phantom]},
},
}{
for children={
if n=#1{
before typesetting nodes={
insert after={[, phantom]},
},
}{},
},
},
},
}
\begin{forest}
[0
[1, missing=1
[1
]
]
[2, missing=0
[2
]
]
]
\end{forest}
\end{document}