我创建了一个简单的节点边图,其中我希望每个边上的文本与边的方向对齐。
\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
键。这会旋转节点以匹配放置节点的路径的切线(请参阅 PGF 手册第 16.8 节)。
但是,正如评论中所述,这并不能完全按照预期工作。这是因为键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
密钥)
结果如下: