Добавление спецификации относительно двух дочерей, одна из которых имеет особый статус, в лесу

Добавление спецификации относительно двух дочерей, одна из которых имеет особый статус, в лесу

Я хочу создать следующую фигуру с помощью forest:

Тесниерейская стемма

Итак, я ищу спецификацию стиля, в которой говорится, что дочь 1 (frapp) и дочь 2 (ant) вместе относятся к A. Дочь 2 (ant) более важна, что отмечено на рисунке нисходящей линией, изгибающейся вправо внизу ant.

Есть ли способ интегрировать это в пример ниже?

\documentclass{article}

\usepackage{forest}


\begin{document}

\begin{forest}
[un exemple
  [A
    [frapp]
     [ant] ] ]
\end{forest}


\end{document}

Это два отношения, включающие три элемента: A — мать frapp и ant. И ant — голова (самый важный элемент) внутри A. Есть ли хороший способ сделать это со forestстилями?

Редактировать:

Я последовал совету и немного поэкспериментировал с edge path. Вот что у меня получилось:

\documentclass{article}

\usepackage{forest}

\forestset{
dg translation/.style={edge path={\noexpand\path[\forestoption{edge}]
(!u.parent anchor)-- +(0,-l)
(!p.north west)--(.north east)\forestoption{edge label};}}
}

\begin{document}

\begin{forest}
[un example
  [A
    [frapp, no edge]
     [ant, dg translation] ] ]
\end{forest}


\end{document}

Это производит:

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

Прямая линия длиной lна юг и линия, которая охватывает двух дочерей. Затем мне пришлось бы поднять линию так, чтобы она снова оказалась на уровне A (и добавить немного кривизны). Но я не знаю, как получить расстояние. Оно не равно, lно немного меньше. В качестве альтернативы я мог бы провести линию снизу от A, но я не знаю, насколько далеко влево и вправо идти, так как это зависит от размера дочерей.

Мне также пришлось указать no edgeна другую дочь. Если бы этого можно было как-то избежать, это было бы здорово.

Редактировать 2:

Хорошо, следуя комментарию cfr, я избавился от no edgeспецификации в дереве:

\documentclass{article}

\usepackage{forest}

\forestset{
dg translation/.style={edge path={\noexpand\path[\forestoption{edge}]
(!u.parent anchor)-- +(0,-l)
(!p.north west)--(.north east)\forestoption{edge label};},!p.edge'={}}
}

\begin{document}

\begin{forest}
[un example
  [A
    [frapp]
     [ant, dg translation] ] ]
\end{forest}


\end{document}

Но я все еще не знаю, как нарисовать изогнутую линию под буквой А. Комментарий мне здесь не поможет.

Редактировать 3:

Хорошо. Я дошел до этого:

\documentclass{article}

\usepackage{forest}
\usetikzlibrary{calc}


\forestset{
dg translation/.style={edge path={\noexpand\path[\forestoption{edge}, rounded corners=3pt]
% the line downwards
(!u.parent anchor)-- +($(0,-l)-(0,12pt)$)-- +($(12pt,-l)-(0,12pt)$)
% the horizontal line
($(!p.north west)+(0,l)-(0,14pt)$)--($(.north east)+(0,l)-(0,14pt)$)\forestoption{edge label};},!p.edge'={}}
}

\begin{document}

\begin{forest}
[un exemple
  [A
    [frapp]
     [ant, dg translation] ] ]
\end{forest}


\end{document}

Получается следующая картина:

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

Есть несколько вещей, которыми я не доволен: Код содержит ручной сдвиг вверх на 14pt. Это не работает с другими размерами шрифта.

Другой вопрос, как сделать горизонтальную линию изогнутой. Я нашел несколько способов повлиять на линию в tikz, но это параметры пути, и кажется, что невозможно иметь два разных пути ребер в forest. Так что если я укажу параметры, как rounded cornersэто повлияет на все части пути, но я хочу иметь два отдельных пути. Есть ли способ сделать это?

решение1

РЕДАКТИРОВАТЬМой первоначальный ответ работает только слесверсия 1. Приведенный ниже код не только проще, но и одинаково хорошо работает как с версией 1, так и с версией 2.


Это было мое решение. Обратите внимание, что решение Стефана Мюллера для установки no edgeна сестре было намного аккуратнее, чем мое явное использование node walkв оригинальной версии этого кода, хотя обновленная версия ниже еще проще.

Я использую tikzключ, чтобы нарисовать кривую горизонтальную линию, а не пытаюсь вставить ее в путь edge. Это позволяет легко убедиться, что узлы, на которые я ссылаюсь, существуют, хотя это можно включить в рисунок edgeс небольшой осторожностью.

«VIN» — это, конечно, эквивалент «VIP» для пользователей.

\documentclass[tikz,border=10pt]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
  for tree={
    parent anchor=south,
    child anchor=north,
  },
  vin/.style={
    child anchor=south west,
    edge path={
      \noexpand\path [draw, \forestoption{edge}]
      (!u.parent anchor) -- (!u.parent anchor |- .west) [out=-90, in=180] to (.child anchor)\forestoption{edge label};
    },
    for parent={
      before packing={
        tikz={
          \draw (!1.north west |- .parent anchor) [out=30, in=170] to (.parent anchor) [out=-10, in=-150] to (!l.north east |- .parent anchor);
        },
      },
    },
    before typesetting nodes={
     !p.no edge,
    },
  }
  [un exemple
    [A
      [frapp
      ]
      [ant, vin
      ]
    ]
  ]
\end{forest}
\end{document}

извилистые пути

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