
Я хочу создать следующую фигуру с помощью 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}