Зачеркнутые линии на фонологическом дереве

Зачеркнутые линии на фонологическом дереве

Мне интересно, как добавить несколько зачеркнутых линий в фонологическое дерево. Вот мой код:

\documentclass{article}

\usepackage{tikz}
\usepackage{tikz-qtree}
\usepackage{tipa}

\begin{document}

\begin{tikzpicture}[baseline]
\tikzset{frontier/.style={distance from root=85pt}}
\Tree
[.$\omega$
[.$\sigma$ \textipa{P} [.$\mu$ e ] [.$\mu$ \node(a){t}; ] ] [.\node(x){$\sigma$}; [.$\mu$ e ] ]
[.\node(b){$\sigma$};  n [.$\mu$ \node(c){e}; ] [.\node(d){$\mu$};  ] ] [.$\sigma$ h [.$\mu$ \node(f){u};  ] [.\node(e){$\mu$}; ] ] ]


\draw (d.south) -- (c.north);
\draw (e.south) -- (f.north);
\draw (x.south) -- (a.north);

\end{tikzpicture}
\end{document}



\end{document}

Вот что получается:

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

Я видел в статье похожее фонологическое дерево с некоторыми зачеркнутыми линиями, которые символизировали, что определенные черты не проявились в фонетической реализации слова. Выглядело это примерно так:

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

На этом изображении они находятся над буквами «b» и «i».

Есть ли какой-нибудь подобный код, который я мог бы вставить в свое фонологическое дерево? Я бы хотел добавить его в строку между сигмой и "t" и между той же сигмой и мю, которая находится чуть ниже.

Любая помощь будет очень ценна.

Спасибо!

решение1

ПРАВКА: Следуя предложению Алана Манна, \tinyзнак равенства выглядит лучше и снижает необходимость смещения узлов.


Вы можете разместить узел с символом =на краях дерева, чтобы имитировать зачеркивание.

Для ручных линий (например, между узлом xи a) можно добавить узел в средней точке в операторе рисования линии. Для автоматических линий (например, между σ и μ) можно добавить отдельный узел в средней точке. Обратите внимание, что вы должны дать узлам дерева имя, чтобы иметь возможность вычислить среднюю позицию. Обратите внимание также, что вам нужна tikzlibrary calc.

Если вы хотите, чтобы зачеркивание было повернуто (как в примере), вы можете добавить rotate=к узлу. Вы также можете автоматически рассчитать угол, используя , \pgfmathanglebetweenpointsесли вы не хотите вручную оценивать значение. Однако некоторая ручная настройка все еще может быть необходима. IMHO, зачеркивание без вращения тоже выглядит хорошо.

Вы можете сместить вертикальное положение зачеркивания, изменив соотношение, например, на 0.6, а горизонтальное положение — добавив небольшое значение к координате, например, +(0.05,0)(или сместить оба значения с помощью ненулевого компонента y).

МВЭ:

\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usepackage{tipa}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}[baseline]
\tikzset{frontier/.style={distance from root=85pt}}
\Tree
[.$\omega$
[.$\sigma$ \textipa{P} [.$\mu$ e ] [.$\mu$ \node(a){t}; ] ] [.\node(x){$\sigma$}; [.\node(y){$\mu$}; e ] ]
[.\node(b){$\sigma$};  n [.$\mu$ \node(c){e}; ] [.\node(d){$\mu$};  ] ] [.$\sigma$ h [.$\mu$ \node(f){u};  ] [.\node(e){$\mu$}; ] ] ]

% compute angle between nodes
\pgfmathanglebetweenpoints{\pgfpointanchor{x}{center}}{\pgfpointanchor{a}{center}}
\edef\angleXA{\pgfmathresult}

\draw (d.south) -- (c.north);
\draw (e.south) -- (f.north);
\draw (x.south) -- (a.north) node[rotate=60-\angleXA,pos=.5,font=\tiny] (st1) {=};
% alternative, not rotated
%\draw (x.south) -- (a.north) node[pos=.5,font=\tiny] (st1) {=};

% shifted node, normal size
% \node at ($(x)!0.6!(y)+(0.04,0)$) (st2) {=};
% alternative, not shifted, font=\tiny:
\node[font=\tiny] at ($(x)!0.5!(y)$) (st2) {=};

\end{tikzpicture}
\end{document}

Результат:

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

решение2

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

\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usepackage{tipa}
\usetikzlibrary{decorations,decorations.text}
\tikzset{delink/.style={
    decorate,
    postaction={decorate,
    decoration={text along path,
        text align=center,
        text={|\tiny|=},
        transform={rotate=90}}}}}


\begin{document}

\begin{tikzpicture}[baseline]
\tikzset{frontier/.style={distance from root=85pt}}
\Tree
[.$\omega$ \edge[delink];
[.$\sigma$ \textipa{P}  [.$\mu$ e ] [.$\mu$ \node(a){t}; ] ]
[.\node(x){$\sigma$}; [.\node(y){$\mu$}; e ] ]
[.\node(b){$\sigma$}; \edge[delink];  n [.$\mu$ \node(c){e}; ] [.\node(d){$\mu$};  ] ]
[.$\sigma$ h [.$\mu$ \node(f){u};  ] [.\node(e){$\mu$}; ] ]
]

\draw[delink] (d.south) -- (c.north);
\draw[delink] (e.south) -- (f.north);
\draw[delink] (x.south) -- (a.north);

\end{tikzpicture}
\end{document}

вывод кода

Решениеforest

Пакет forestпредоставляет более простой способ добавления именованных узлов в деревья, поэтому лично я бы использовал forestдля создания таких деревьев. Тот же delinkстиль можно использовать и с ним. Вот тот же код с использованием forest. Я добавил код для автоматического форматирования сегментного уровня с использованием tipa(чтобы вам не нужно было заключать их в \textipa), и тогда каждый сегмент будет иметь тот же шрифт. Чтобы это работало, если узел mora не имеет прямой сегментной зависимости (т. е. он связан с сегментом, который уже доминирует над узлом mora), вам нужно явно указать, что узел находится на уровне mora.

\documentclass{article}
\usepackage{tikz}
\usepackage[linguistics]{forest}
\usepackage{tipa}
\usetikzlibrary{decorations,decorations.text}
\tikzset{delink/.style={
    decorate,
    postaction={decorate,
    decoration={text along path,
        text align=center,
        text={|\tiny|=},
        transform={rotate=90}}}}}

\newcommand{\syl}{$\sigma$}
\newcommand{\mor}{$\mu$}
\newcommand{\word}{$\omega$}
\forestset{prosodic tree/.style=
   {for tree={if n children=0{tier=seg,font=\tipaencoding}{},inner sep=0pt,s sep=1em}}}
\begin{document}
\begin{forest}prosodic tree
[\word 
[\syl,edge=delink [P]  [\mor [e] ] [\mor [t,name=a ] ] ]
[\syl,name=x  [\mor,name=y  [e] ] ]
[\syl,name=b [n] [\mor [e,name=c ] ]  [\mor,name=d,tier=mora ] ]
[\syl [h] [\mor  [u,name=f ] ]  [\mor,name=e,tier=mora ] ]
]
{\draw[delink] (d.south) -- (c.north);
\draw[delink] (e.south) -- (f.north);
\draw[delink] (x.south) -- (a.north);}
\end{forest}
\end{document}

выход лесного кодекса

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