Пересечение ветвей в tikz-qtree

Пересечение ветвей в tikz-qtree

Я перевожу руководство по синтаксису, и там есть несколько примеров недопустимых структур. Первый я смог воспроизвести, но второй нет.

Вот что я пытаюсь воспроизвести:

введите описание изображения здесь

Мой текущий код следующий:

\documentclass{article}
\usepackage{tikz-qtree}

\begin{document}

\begin{figure}[h]
\centering

\textbf{a}) \begin{tikzpicture}[level distance=30pt,sibling distance=5mm] 
\tikzset{every tree node/.style={align=center,anchor=base}}
\tikzset{level 1+/.style={level distance=2\baselineskip}}
\tikzset{frontier/.style={distance from root=6\baselineskip}}
\Tree [.a [.b ] [.c ] ]
\begin{scope}[grow'=up,yshift=-1.7cm]
\Tree [.d [.b ] [.c ] ]
\end{scope}
\end{tikzpicture}\qquad

\textbf{b}) \begin{tikzpicture}[level distance=30pt,sibling distance=5mm] 
\Tree ??????????????????
\end{figure}

\end{document}

решение1

Они не обязательно похожи на деревья, поэтому я бы не рекомендовал использовать для этого библиотеку, специализирующуюся на деревьях.

\documentclass{article}
\usepackage{subfig}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}

\begin{figure}[h]
\centering
\subfloat[][]{\begin{tikzpicture}
\matrix (mat) [matrix of nodes,column sep=1em,row sep=1em,
 nodes={align=center,inner sep=2pt},ampersand replacement=\&]
 {
 \& a \& \\
 b \& \& c\\
 \& d \&\\
 };
 \draw (mat-2-1.north) -- (mat-1-2.south) -- (mat-2-3.north)
 (mat-2-1.south) -- (mat-3-2.north) -- (mat-2-3.south);
\end{tikzpicture}}
\qquad
\subfloat[][]{\begin{tikzpicture}
\matrix (mat) [matrix of nodes,column sep=1em,row sep=1em,
 nodes={align=center},ampersand replacement=\&]
 {
 \& a \& \\
 b \& \& c\\
 e \&  \& d\\
 };
 \draw (mat-2-1.north) -- (mat-1-2.south) -- (mat-2-3.north)
 (mat-2-1) -- (mat-3-3) (mat-2-3) -- (mat-3-1);
\end{tikzpicture}}
\end{figure}
\end{document}

введите описание изображения здесь

решение2

Даже если это не деревья, вы все равно можете получить эффект, tikz-qtreeесли хотите. Вот как. Я не обязательно рекомендую это, но для одноразового примера это работает отлично. Я использовал немного другой метод для первого дерева; ваш метод соединения двух деревьев с помощью, scopeвероятно, проще для этого случая.

\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\begin{document}
\begin{tikzpicture}
[every tree node/.style={align=center,anchor=base}]
\Tree [.a [.\node(b) {\strut b}; ] \edge[draw=none]; [.\node(x) {};  ] [.\node(c) {\strut c}; ]]
\node (d) [below of=x] {d};
\draw (d.north) -- (b.south);
\draw (d.north) -- (c.south);
\end{tikzpicture}

\bigskip
\begin{tikzpicture}
[every tree node/.style={align=center,anchor=base},sibling distance=.5cm]
\Tree [.a [.\node(b) {\strut b}; \edge[draw=none]; [.\node(e) {\strut e}; ]]  [.\node(c) {\strut c}; \edge[draw=none]; [.\node(d){\strut d}; ]]]
\draw (e.north) -- (c.south);
\draw (d.north) -- (b.south);
\end{tikzpicture}

\end{document}

вывод кода

решение3

Альтернатива хорошему ответу сурка:

\documentclass{article}
\usepackage{tikz}
\usepackage{subcaption}
\begin{document}
\begin{figure}
    \centering
    \begin{subfigure}[t]{0.5\textwidth}
        \centering
        \begin{tikzpicture}[y=1.5cm]
            \node (a) at (0,0) {a};
            \node (b) at (-1,-1) {b};
            \node (c) at (1,-1) {c};
            \node (d) at (0,-2) {d};
            \draw (b.north)--(a.south)--(c.north);
            \draw (b.south)--(d.north)--(c.south);
        \end{tikzpicture}  
        \caption{}
    \end{subfigure}%
    \begin{subfigure}[t]{0.5\textwidth}
        \centering
        \begin{tikzpicture}[y=1.5cm]
            \node (a) at (0,0) {a};
            \node (b) at (-1,-1) {b};
            \node (c) at (1,-1) {c};
            \node (d) at (1,-2) {d};
            \node (e) at (-1,-2) {e};
            \draw (b.north)--(a.south)--(c.north);
            \draw (b.south)--(d.north);
            \draw (c.south)--(e.north);
        \end{tikzpicture}  
        \caption{}
    \end{subfigure}
\end{figure}
\end{document}

введите описание изображения здесь

Но я предпочитаю это

\documentclass{article}
\usepackage{tikz}
\usepackage{subcaption}
\begin{document}
\begin{figure}
    \centering
    \begin{subfigure}[t]{0.5\textwidth}
        \centering
        \begin{tikzpicture}[y=1.5cm,every node/.style={circle,draw,minimum size=0.75cm}]
            \node (a) at (0,0) {a};
            \node (b) at (-1,-1) {b};
            \node (c) at (1,-1) {c};
            \node (d) at (0,-2) {d};
            \draw (b)--(a)--(c)--(d)--(b);
        \end{tikzpicture}  
        \caption{}
    \end{subfigure}%
    \begin{subfigure}[t]{0.5\textwidth}
        \centering
        \begin{tikzpicture}[y=1.5cm,every node/.style={circle,draw,minimum size=0.75cm}]
            \node (a) at (0,0) {a};
            \node (b) at (-1,-1) {b};
            \node (c) at (1,-1) {c};
            \node (d) at (1,-2) {d};
            \node (e) at (-1,-2) {e};
            \draw (d)--(b)--(a)--(c)--(e);
        \end{tikzpicture}  
        \caption{}
    \end{subfigure}
\end{figure}
\end{document}

введите описание изображения здесь

решение4

Другая альтернатива, воспроизводящая рисунок с помощью tikz-cdpackage. Используя column sep= ...или row sep= ..., можно изменить конфигурацию дерева.

введите описание изображения здесь

\documentclass[a4paper,12pt]{article}
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}[column sep= 1cm]
& a \arrow[ld, no head] \arrow[rd, no head] & & & a \arrow[ld, no head] \arrow[rd, no head] & \\
b \arrow[rd, no head] & & c \arrow[ld, no head] & b \arrow[rrd, no head] &  & c \\
 & d &  & e \arrow[rru, no head] & & d
\end{tikzcd}
\end{document}

Связанный контент