Как в Tikz сделать так, чтобы текст на краю имел то же направление, что и край?

Как в Tikz сделать так, чтобы текст на краю имел то же направление, что и край?

Я создал простой граф «узлы-ребра», в котором мне хотелось бы, чтобы тексты на каждом ребре были выровнены по направлению ребра.

\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ключ)

И вот результат:

Фотография спрашивающего с текстом вдоль стрелок

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