
Я создал простой граф «узлы-ребра», в котором мне хотелось бы, чтобы тексты на каждом ребре были выровнены по направлению ребра.
\documentclass[class=minimal,border=0pt]{standalone}
\usepackage{pgf}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\begin{tikzpicture}[->,>=stealth',shorten >=1pt,auto,node distance=2.8cm,
semithick]
\tikzstyle{every state}=[fill=red,draw=none,text=white]
\node[state] (D) {$D$};
\node[state] (C) [below right of=D] {$C$};
\node[state] (B) [above right of=D] {$B$};
\node[state] (A) [below right of=B] {$A$};
\path (D) edge node {tdc} (C)
(B) edge node {tbc} (C)
(C) edge node {tca} (A);
\end{tikzpicture}
\end{document}
Например, я хотел бы, чтобы текст автоматически tbc
поворачивался -90
на градусы, чтобы быть выровненным по направлению ребра, соединяющего узел B
с узлом C
. Это возможно?
решение1
Ответ на вопрос, как заставить текст уйтивдольпуть заключается в использовании sloped
ключа. Это поворачивает узел так, чтобы он соответствовал касательной пути в точке, в которой будет размещен узел (см. раздел 16.8 Руководства PGF).
Однако, как отмечено в комментариях, это не совсем работает так, как хотелось бы. Это из-за ключа auto
. Это смещает узел с пути. Это делается путем размещения одного из якорей узла в точке размещения, якорь выбирается соответствующим образом для касательной к пути (я не смотрел код, поэтому догадываюсь, как он его выбирает). Проблема возникает из-за того, что якорь выбирается первым, а затем узел поворачивается. Должно произойти то, что узел поворачивается, а затем выбирается якорь. Но на самом деле для этого не нужен никакой сложный код, поскольку якорь всегда будет одним из north
или south
(если allow upside down
задано, то он всегда будет south
). Так что просто установите anchor=south
вместо auto
будет достаточно.
Вот простой пример, демонстрирующий вышеприведенный анализ. Первые три узла не являются sloped
, вторые три являются. Первая из троек не имеет (других) вариантов, вторая является , auto
а третья является anchor=south
. Из 2-го и 5-го ясно, что узел фактически был повернут вокруг своей точки привязки.
Вот ваш код с этим изменением (плюс пара небольших стилистических изменений: tikz
загружается pgf
автоматически и \tikzstyle
обесценивается).
\documentclass{standalone}
%\url{http://tex.stackexchange.com/q/67552/86}
\usepackage{tikz}
\usetikzlibrary{arrows,automata}
\usepackage[latin1]{inputenc}
\begin{document}
\begin{tikzpicture}[
->,
>=stealth',
shorten >=1pt,
auto,
node distance=2.8cm,
semithick,
every state/.style={fill=red,draw=none,text=white},
]
\node[state] (D) {$D$};
\node[state] (C) [below right of=D] {$C$};
\node[state] (B) [above right of=D] {$B$};
\node[state] (A) [below right of=B] {$A$};
\path[every node/.style={sloped,anchor=south,auto=false}]
(D) edge node {tdc} (C)
(B) edge node {tbc} (C)
(C) edge node {tca} (A);
\end{tikzpicture}
\end{document}
(Примечание: auto=false
не обязательно, так как anchor=south
переопределяет auto
ключ)
И вот результат: