Как пропустить промежуточные узлы в дереве Latex?

Как пропустить промежуточные узлы в дереве Latex?

У меня есть следующий код LaTeX для временной шкалы (с использованием tree), но я бы хотел, чтобы два пустых поля, следующих за полем «нет», исчезли, и вместо этого была бы просто прямая стрелка к action3 — что-то вроде этого:

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

Вот код:

\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}

решение1

С помощью tikz-qtreeможно удалить ребра, используя \edge[draw=none];, а затем соединить no-узел и action3-узел с помощью \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);

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

решение2

Спасибо вам обоим. Вот решение, которое я придумал после того, как задал вопрос: (Обратите внимание, что код также перемещает «да» и «нет» над стрелками) (Также обратите внимание на команду \edge[-], чтобы избежать дополнительных промежуточных концов стрелок)

\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} 

Вот как это выглядит:введите описание изображения здесь

решение3

Комментирую . {}дважды:

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

Вы получаете:

снимок экрана вывода

Это следует улучшить, удалив два наконечника стрелок (и я полагаю, что это потребует более глубоких изменений в коде).

решение4

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

Например, в коде ниже

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

говорит, что все конечные узлы должны быть размещены на одном уровне дерева. Таким образом, узлы 2 действия 3 могут быть размещены без необходимости создания фиктивных узлов для того, у которого меньше предков.

Стиль label me={}{}создается для удобного размещения меток yesи noна краях. Первый аргумент добавляется к параметрам узла метки и может использоваться для указания относительного положения, например, above rightякоря, например, anchor=north westили чего-либо еще. Второй аргумент задает содержимое метки.

Большим преимуществом пакета является то, что после настройки стиля вы можете очень лаконично указать деревья. Например:

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

производит

цепочки действий

Полный код:

\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}

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