Wie überspringe ich Zwischenknoten im Latex-Baum?

Wie überspringe ich Zwischenknoten im Latex-Baum?

Ich habe den folgenden LaTeX-Code für eine Zeitleiste (unter Verwendung von tree), möchte aber, dass die beiden leeren Kästchen nach dem „Nein“-Kästchen verschwinden und stattdessen nur ein gerader Pfeil zu Aktion3 angezeigt wird – etwa so:

yes -> action1 -> action2 -> action3
no  -----------------------> action3

Hier ist der Code:

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{trees,arrows}

\begin{document}

\begin{tikzpicture}[level distance=1in,sibling distance=.25in,scale=.65]
\tikzset{edge from parent/.style=
        {thick, draw, -latex,
            edge from parent fork right},
            every tree node/.style={draw,minimum width=0.7in,text width=0.7in, align=center},grow'=right}
\Tree
    [. {do?}
            [. {yes }
                [. {action1}
                   [. {action2}
                      [. {action3}
                      ]
                   ]
                ]
            ]
            [. {no }
               [. {}
                 [. {}
                   [. {action3}
                   ]
                 ]
                ]
            ]
    ]

\end{tikzpicture}
\end{document}

Antwort1

Mit tikz-qtreekönnen Sie Kanten entfernen und später den -Knoten und den -Knoten mit \edge[draw=none];verbinden .noaction3\draw

\Tree
    [. {do?}
            [. {yes }
                [. {action1}
                   [. {action2}
                      [. {action3}
                      ]
                   ]
                ]
            ]
            [.\node(no){no}; \edge[draw=none];
               [ \edge[draw=none];
                 [ \edge[draw=none];
                   [.\node(a3){action3};
                   ]
                 ]
                ]
            ]
    ]
\draw[-latex] (no)--(a3);

Bildbeschreibung hier eingeben

Antwort2

Vielen Dank euch beiden. Hier ist die Lösung, die mir nach dem Posten der Frage eingefallen ist: (Beachten Sie, dass der Code auch das Ja und Nein über die Pfeile verschiebt) (Beachten Sie auch den Befehl \edge[-], um die zusätzlichen Pfeilenden dazwischen zu vermeiden)

\documentclass[12pt]{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{trees,arrows}

\begin{document}

\begin{tikzpicture}[level distance=1.5in,sibling distance=.25in,scale=.65]
\tikzset{edge from parent/.style={thick, draw, -latex, edge from parent fork right},
     every tree node/.style={draw,minimum width=0.7in,minimum height=0.65in,text width=0.7in, align=center},grow'=right}
\Tree
[. \node {do?};
    \edge node[above, pos=0.7] {yes};
    [. {action1}
        [. {action2}
            [. {action3} ]
        ]
    ]
    \edge[-] node[below, pos=0.6] {no};
    [
     \edge[-] {};
        [
         \edge {};
            [. {action3} ]
        ]
     ]
]
\end{tikzpicture}

\end{document} 

So sieht es aus:Bildbeschreibung hier eingeben

Antwort3

Zweimal kommentieren . {}:

\Tree
    [. {do?}
            [. {yes }
                [. {action1}
                   [. {action2}
                      [. {action3}
                      ]
                   ]
                ]
            ]
            [. {no }
               [ %. {}
                 [ %. {}
                   [. {action3}
                   ]
                 ]
                ]
            ]
    ]

du erhältst:

Screenshot der Ausgabe

Dies könnte durch das Entfernen der beiden Pfeilspitzen weiter verbessert werden (und ich vermute, dies würde einige tiefer gehende Änderungen im Code erfordern).

Antwort4

Ein Vorteil vonWaldist, dass Sie dem Paket mitteilen können tier, dass bestimmte Knoten auf der gleichen Ebene des Baums liegen sollen, auch wenn einige mehr dazwischenliegende Knoten haben als andere.

Im folgenden Code beispielsweise

    if n children=0{tier=terminums}{},

besagt, dass Endknoten alle auf derselben Ebene des Baums platziert werden sollten. So können die 2 Aktionsknoten 3 platziert werden, ohne dass Dummyknoten für den Knoten mit weniger Vorgängern erstellt werden müssen.

Es wird ein Stil label me={}{}erstellt, um die Beschriftungen bequem an den Rändern zu platzieren yes. noDas erste Argument wird zu den Optionen des Beschriftungsknotens hinzugefügt und kann verwendet werden, um eine relative Position (z. B. above righteinen Anker (z. B.) anchor=north westoder etwas anderes) anzugeben. Das zweite Argument gibt den Inhalt der Beschriftung an.

Der große Vorteil des Pakets besteht darin, dass Sie, sobald Sie einen Stil konfiguriert haben, Bäume sehr präzise angeben können. Zum Beispiel:

  [do?
    [action 1, label me={above, anchor=south west}{yes}
      [action 2
        [action 3]
      ]
    ]
    [action 3, label me={below, anchor=north west}{no}]
  ]

produziert

Aktionsketten

Vollständiger Code:

\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
  label me/.style n args=2{
    delay={edge label/.wrap value={node [midway, #1, font=\scriptsize] {#2}}}
  },
  for tree={
    grow'=0,
    draw,
    text width=15mm,
    minimum height=7mm,
    parent anchor=east,
    child anchor=west,
    edge={->},
    text centered,
    edge path={
      \noexpand\path [\forestoption{edge}] (!u.parent anchor) -- +(3mm,0) |- (.child anchor)\forestoption{edge label};
    },
    if n children=0{tier=terminums}{},
    l sep+=5mm,
  }
  [do?
    [action 1, label me={above, anchor=south west}{yes}
      [action 2
        [action 3]
      ]
    ]
    [action 3, label me={below, anchor=north west}{no}]
  ]
\end{forest}
\end{document}

verwandte Informationen