我目前正在开展一个项目,旨在创建一个翻译器Frank Drewes 的图表风格进入 TikZ。
举个例子,我尝试将下图从图形样式手册重新创建为 TikZ 图。
(看图形样式图示例)
上述代码的图形样式如下:
\begin{graph}(4,4)(-2,0)
\squarenode{Sq}(-1.5,3.5)
\textnode{Te}(1.5,3.5){abc}
\roundnode{Ro}(0,.5)
\diredge{Sq}{Te}
\edge{Sq}{Ro} \diredge{Ro}{Te}
\dirbow{Ro}{Sq}{-.2}
\dirbow{Ro}{Te}{.2}
\dirloopedge{Ro}(-.8,-.2)(-1.2,.4)
\dirloopedge{Ro}(.8,-.2)(1.2,.4)
\loopedge{Ro}{15}(0,-.5)
\end{graph}
大多数命令都很容易翻译;然而,我在使用“loopedge”和“dirloopedge”命令时遇到了很多麻烦。
手册中对“loopedge”命令的描述如下:
\loopedge{名称}(x1,y1)(x2,y2)
节点 name 处的循环。坐标 (x1,y1) 和 (x2,y2) 被解释为以 name 为起点的两个边的端点的相对坐标。在绘制过程中,它们通过曲线连接起来以获得循环。
TikZ 中似乎没有这样的命令,事实上,绘制循环似乎真的很难。图形样式手册中缺少关于连接曲线实际生成方式的文档,这进一步加剧了我的问题。
谁能帮我?
答案1
我不确定具体用什么方法获得绘制的曲线\dirloopedge
(出于某种原因,您示例中的不对称支撑点似乎产生了对称曲线)。下面是一个与“图形样式”中的形式相同的宏。
它从起始节点到第一个支撑点绘制一条直线,从第二个支撑曲线到起始节点绘制一条直线,两个支撑点之间的曲线的out
和in
角度等于直线段的角度。您可能需要调整looseness
确定曲线半径的参数。
\documentclass{article}
\usepackage{tikz}
\def\dirloopedge#1(#2,#3)(#4,#5){
\pgfpointxy{#2}{#3}
\pgfgetlastxy{\ax}{\ay}
\pgfmathsetmacro\outangle{atan2(#2,#3)}
\pgfmathsetmacro\inangle{atan2(#4,#5)}
\draw [-latex] (#1) -- +(#2,#3) to [out=\outangle,in=\inangle,looseness=5] +(#4,#5) -- (Ro);
}
\begin{document}
\begin{tikzpicture}
\node (Ro) at (0,0.5) [fill,circle,inner sep=2pt] {};
\dirloopedge{Ro}(0.8,-0.2)(0.8,0.2)
\end{tikzpicture}
\end{document}