我正在尝试以没有边交叉的方式绘制 Brujin 图 D(2,3),但 {0}{11}{22} 上的环路给我带来了麻烦。有没有办法用这种格式让环路变得非常小?此致。
\documentclass{article}
\usepackage{tikz}
\usepackage{tkz-graph}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\SetGraphUnit{4}
\GraphInit[vstyle=Normal]
\Vertices{circle}{00,01,11,12,22,20}
\Edges[style = ->](00,01,11,12,22,20,00)
\SetGraphUnit{1.5}
\Vertices{circle}{10,21,02}
\Edges[style = ->](10,02,21,10)
\tikzset{EdgeStyle/.style= {->, bend left}}
\Edges[style = ->](01,10,01)
\Edges[style = ->](02,20,02)
\Edges[style = ->](21,12,21)
\tikzset{EdgeStyle/.style= {->, bend right = 100}}
\Edges[style = ->](12,20,01,12)
\tikzset{EdgeStyle/.style= {->}}
\Edges[style = ->](21,11,10)
\Edges[style = ->](02,22,21)
\Edges[style = ->](10,00,02)
\Loop[style = {->}, dir = NO](00)
\Loop[style = {->}](11)
\Loop[style = {->}](22)
\end{tikzpicture}
\caption{De Brujin}
\end{figure}
\end{document}
答案1
loop
始终加载的默认topaths
图书馆在我看来,有相对较小的环,看起来很漂亮。
我已将其扩展为允许使用右上方、左上方、左下方和右下方四个缺失的罗盘方向。以及Loop
将方向作为角度的通用键(loop right
将是loop = 0
)。
为了放置节点,我使用了库,它提供了语法以及。graphs(.standard)
graph
subgraph C_n
节点的连接也是通过graphs
语法完成的。
对于 01、20 和 12 之间的大箭头,我将 设置looseness
为 2,将相对角度设置为50
。这样可以形成更锐利的曲线,使其恰好适合中间的节点。
这bbox
图书馆用于这些大曲线,以便正确评估边界框并且图片不会大于它需要的。
在这种情况下,这些循环本身已经足够小了,但我在可以放置这些循环的位置添加了虚线重复项。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{graphs.standard, arrows.meta, bending, bbox}
\tikzset{
Loop/.style={anchor={#1+180}, out={#1+15}, in={#1-15}, loop},
/utils/temp/.style args={#1:#2:#3}{loop #1/.style={#1,out={#2},in={#3},loop}},
/utils/temp/.list={above right:60:30, above left:150:120,
below left:240:210, below right:300:270},
every new ->/.append style={shorten >=+3\pgflinewidth},
every new <-/.append style={shorten <=+3\pgflinewidth}}
\begin{document}
\tikz[> = {Stealth[round]}]
\graph[
nodes = {draw, circle},
clockwise, phase = 0, radius = 1.5cm,
chain polar shift=(0:2cm)
]{% -!- makes it so that the second subgraph is considered a chain
subgraph C_n[->, V={10, 02, 21}] -!-
subgraph C_n[<-, V={00, 20, 22, 12, 11, 01}],
{[cycle, ->] 02, 22, 21, 11, 10, 00},
{[/tikz/bend left=15, ->, every group/.append style=cycle]
{10, 01}, {02, 20}, {12, 21}
},
00 ->[loop right ] 00,
11 ->[loop above left] 11,
22 ->[loop below left] 22,
{[edge=dashed] % as an option
00 ->[Loop = 150] 00,
11 ->[loop below] 11,
22 ->[Loop = 30 ] 22
},
{[/tikz/bend right=50, /tikz/looseness=2, /pgf/bezier bounding box, ->, cycle]
01, 12, 20
}
};
\end{document}