tikz-qtree 中空节点的宏

tikz-qtree 中空节点的宏

我正在尝试定义一个宏,用于使用在二叉树中写入空节点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}

二元缺失

相关内容