No Tikz, como fazer com que o texto de uma borda tenha a mesma direção da borda?

No Tikz, como fazer com que o texto de uma borda tenha a mesma direção da borda?

Eu criei um gráfico simples de borda de nó no qual gostaria de ter os textos de cada borda alinhados à direção da borda.

\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}

Por exemplo, eu gostaria que o texto tbcgirasse -90graus automaticamente para ser alinhado à direção da borda que conecta o nó Bao nó C. Isso é possível?

Responder1

A resposta à questão de como fazer com que o texto vájuntoo caminho é usar a slopedchave. Isto gira o nó para coincidir com a tangente do caminho no ponto em que o nó seria colocado (ver Seção 16.8 do Manual PGF).

No entanto, conforme observado nos comentários, isso não funciona como desejado. Isto é por causa da autochave. Isso tira o nó do caminho. Isso é feito colocando uma das âncoras do nó no ponto de posicionamento, a âncora escolhida apropriadamente para a tangente do caminho (não olhei o código, então estou supondo como ele o escolhe). O problema surge com o fato de que a âncora é escolhida primeiro e depois o nó é girado. O que deveria acontecer é que o nó seja girado e então a âncora seja escolhida. Mas, na verdade, isso não precisa de nenhum código complicado, pois a âncora sempre será um northou south(se allow upside downestiver definido, sempre será south). Então, simplesmente definir anchor=southem vez de autobastará.

Aqui está um exemplo simples que demonstra a análise acima. Os três primeiros nós não são sloped, os três segundos são. A primeira das triplas não tem (outras) opções, a segunda é autoe a terceira é anchor=south. Fica claro a partir dos dias 2 e 5 que o nó foi efetivamente girado em torno de seu ponto de ancoragem.

nós girados para o caminho

Aqui está o seu código com esta alteração (além de algumas pequenas alterações estilísticas: tikzcarrega pgfautomaticamente e \tikzstyleé depreciado).

\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}

(Observação: auto=falsenão é necessário, pois anchor=southsubstitui a autochave)

E aqui está o resultado:

Imagem do questionador com texto ao longo das setas

informação relacionada