我想让圆圈周围的小环(上面的环)变得更圆、更漂亮。
下面是我的代码的一个简短示例:
\documentclass{scrbook}
\usepackage{tikz}
\usetikzlibrary{positioning,automata}
\begin{document}
\begin{tikzpicture}[shorten >=1pt,auto]
\tikzstyle{place}=[circle,thick,draw=blue!75,fill=blue!20,minimum
size=6mm]
\node[place] (foo) [label=above left:Foo] {$1$};
\path[->] (foo) edge [loop above] node {1} ();
\end{tikzpicture}
\end{document}
答案1
您可以使用四个参数来调整loop
大小和形状。您可以设置in
和out
角度,以及循环的最小长度及其looseness
。有关更多详细信息,请参阅 TikZ 文档的第 50.4 节:
\documentclass{scrbook}
\usepackage{tikz}
\usetikzlibrary{positioning,automata}
\begin{document}
\tikzset{every loop/.style={min distance=10mm,in=0,out=60,looseness=10}}
\tikzset{place/.style={circle,thick,draw=blue!75,fill=blue!20,minimum
size=6mm}}
\begin{tikzpicture}[shorten >=1pt,auto]
\node[place] (foo) [label=above left:Foo] {$1$};
\path[->] (foo) edge [loop above] node {1} ();
\end{tikzpicture}
\end{document}
在这个例子中,我习惯\tikzset
全局设置它们;您也可以.style
为个体添加规范tikzpicture
或为单个循环设置参数。
可以使用节点样式中的键来设置标签距离label distance
。要将标签移近节点,请使用负值。对于此示例,这-3pt
似乎效果很好。似乎没有办法为单个节点设置此键。因此,您可以
答案2
不久前,我尝试创建一个类似圆形的循环(确切地说是圆弧,但更圆一些,更美观一些)。我没有找到简单的方法来做到这一点,但这是我为此类循环编写的代码。
第一个代码:我只使用了 TikZ,但我使用经验法来计算一些长度。宏\tikzAngleOfLine
给了我一条线的角度。如果\AngleEnd
大于,\AngleSart
就会出现问题。在第二个代码示例中,我给出了解决方案。
\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}
\newcommand{\tikzAngleOfLine}{\tikz@AngleOfLine}
\def\tikz@AngleOfLine(#1)(#2)#3{%
\pgfmathanglebetweenpoints{%
\pgfpointanchor{#1}{center}}{%
\pgfpointanchor{#2}{center}}
\pgfmathsetmacro{#3}{\pgfmathresult}%
}
\begin{document}
\begin{tikzpicture}[scale=1.5,>=stealth']
\node [circle,draw,minimum size=2cm](A) {first node};
\node [circle,minimum size=3cm](B) at ([{shift=(60:1)}]A){};
\coordinate (C) at (intersection 2 of A and B);
\coordinate (D) at (intersection 1 of A and B);
\tikzAngleOfLine(B)(D){\AngleStart}
\tikzAngleOfLine(B)(C){\AngleEnd}
\draw[red,thick,->]%
let \p1 = ($ (B) - (D) $), \n2 = {veclen(\x1,\y1)}
in
(B) ++(60:\n2) node[fill=white]{$\alpha$}
(D) arc (\AngleStart-360:\AngleEnd:\n2); % -360 only if \AngleStart>\AngleEnd
\end{tikzpicture}
\end{document}
结果是
第二段代码:这里我使用了tkz-euclide
包中的一些宏。想法是建立一个与第一个节点正交的圆。
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usetikzlibrary{through}
\newcommand{\tikzAngleOfLine}{\tikz@AngleOfLine}
\def\tikz@AngleOfLine(#1)(#2)#3{%
\pgfmathanglebetweenpoints{%
\pgfpointanchor{#1}{center}}{%
\pgfpointanchor{#2}{center}}
\pgfmathsetmacro{#3}{\pgfmathresult}%
}
\def\roundloop[#1]#2#3{%
\coordinate (rla) at (#2.east);
\path (#2)--++(#1) coordinate (rlb);
\tkzTgtFromP(#2,rla)(rlb)
\node (rlb) at (rlb) [circle through={(tkzFirstPointResult)}] {};
\coordinate (rlc) at (intersection 2 of #2 and rlb);
\coordinate (rld) at (intersection 1 of #2 and rlb);
\tikzAngleOfLine(rlb)(rld){\AngleStart}
\tikzAngleOfLine(rlb)(rlc){\AngleEnd}
\tikzAngleOfLine(#2)(rlb){\AngleLabel}
\ifdim\AngleStart pt<\AngleEnd pt
\draw[red,thick,->]%
let \p1 = ($ (rlb) - (rld) $), \n2 = {veclen(\x1,\y1)}
in
(rlb) ++(\AngleLabel:\n2) node[fill=white]{#3}
(rld) arc (\AngleStart:\AngleEnd:\n2);
\else
\draw[red,thick,->]%
let \p1 = ($ (rlb) - (rld) $), \n2 = {veclen(\x1,\y1)}
in
(rlb) ++(\AngleLabel:\n2) node[fill=white]{#3}
(rld) arc (\AngleStart-360:\AngleEnd:\n2);
\fi
}
\begin{document}
\begin{tikzpicture}
\node[circle,draw] (O){first node};
\roundloop[180:2]{O}{$\alpha$}
\roundloop[0:1]{O}{$\beta$}
\roundloop[60:3]{O}{$\delta$}
\roundloop[-120:4]{O}{$\gamma$}
\end{tikzpicture}
\end{document}
答案3
您可以通过以下方式调整角度和松弛度:
\path[->,every loop/.style={looseness=10}] (foo)
edge [in=120,out=60,loop] node {1} ();