如果您知道如何回答我的问题,pstricks
我很乐意回答,但我现在正在做事情tikz
。我在 tikz 手册中找到了以下代码片段:http://pgf.sourceforge.net/pgf_CVS.pdf,第 737-8 页。
\documentclass[11pt]{article}
\usepackage{tikz}
\begin{tikzpicture}
\foreach \angle in {0,45,...,315}
\node[rectangle,draw=black!50] (\angle) at (\angle:2) {\angle};
\foreach \from/\to in {0/45,45/90,90/135,135/180,
180/225,225/270,270/315,315/0}
\path (\from) edge [->,bend right=22,looseness=0.8] (\to) edge [<-,bend left=22,looseness=0.8] (\to);
\end{tikzpicture}
\end{document}
它使得:
我想将其概括为允许更多顶点和边。给定n
顶点,我将绘制任意长度边的图形n-1
。我希望边是可区分的,并且支持标签 1、2、...
能提供以下三点帮助就太好了:
1) 如果我有 6 个顶点,我需要能够区分单个顶点上的 5 个循环。除了 、 等之外,我不知道如何进行above
循环right
。
2)如果两个顶点之间有多条边(箭头不必都指向同一个方向),我希望它们彼此之间弯曲均匀。
3)在边缘贴上标签(可能就在上面),标签要小巧、有品位且清晰易读。
因为我事先不知道要绘制多少个顶点,也不知道路径的实际形状,所以我需要相当笼统地表达事物。如果我能得到上述帮助,我可以为此编写代码。
答案1
您说您可以根据三个具体问题的答案编写通用食谱的代码。但是,如果您想要通用食谱,Ti钾Z 的图形绘制功能,特别是可用的各种算法,无疑是可行的。
我对此不太了解 - 感觉像是陌生的领域 - 但 LuaTeX 提供了强大的功能,文档和库也很丰富。如果你要绘制很多东西,花时间阅读手册中的文档是值得的。
circular
、、(对于诸如等标准图表)应该特别有趣。请注意routing
,介绍位于手册的主要部分,而详细信息位于图表绘制部分。graphs.standard
K_n
以下是根据您所述要求提供的一个小例子。(我不太清楚这些要求是什么,因此这实际上意味着我能理解的您所述要求。)
\RequirePackage{luatex85}
\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{graphs,graphdrawing,arrows.meta,quotes}
\usegdlibrary{circular}
\begin{document}
\tikz[>=Stealth]{%
\graph [simple necklace layout, grow'=down, node sep=20mm, nodes=draw, edge quotes center, edge quotes={fill=white, inner sep=1pt, font=\scriptsize}]
{
6 ->[bend left, "a"] {5, 4, 3, 2, 1};
5 ->[bend left, "b"] {6, 4, 3, 2, 1};
4 ->[bend left, "c"] {6, 5, 3, 2, 1};
3 ->[bend left, "d"] {6, 4, 5, 2, 1};
2 ->[bend left, "e"] {6, 4, 3, 5, 1};
1 ->[bend left, "f"] {6, 4, 3, 2, 5};
};
}
\end{document}
显然,如果每次都需要不同的标签,则需要单独创建边 - 或者创建一个循环,但在这种情况下这样做并不值得。这subgraph
是对节点进行布局。
您也可以使用例如subgraph C_n [n=6, ->]
,也许与necklace routing
(库:graphs.standard
,routing
)一起使用。这实际上取决于您要执行的操作的细节...
编辑
请注意,我只是提供了一个可能的示例。如果你使用它,显然你会想看看文档根据您的要求进行调整。
以下是使用标准图形绘制元素的 3 个示例。一个简单的计数器用于标记图形之间重置的边。使用edge counter
参数中的样式来标记edges
图形中要标记路径的部分。
\RequirePackage{luatex85}
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs,graphs.standard,graphdrawing,arrows.meta,quotes}
\usegdlibrary{circular}
\begin{document}
\newcounter{countme}
\setcounter{countme}{0}
\newcommand*\countup{\stepcounter{countme}\thecountme}
\newcommand*\countset{\setcounter{countme}{0}}
\tikzset{%
edge counter/.style={"\countup"},
}
\tikz[>=Stealth]{%
\graph [simple necklace layout, grow'=down, node sep=20mm, nodes=draw, edge quotes center, edge quotes={fill=white, inner sep=1pt, font=\scriptsize}]
{
subgraph C_n [n=6, -!-];
{ [edges={edge counter, bend left}]
6 -> 5 ->[loop below] 5 -> 2 -> 6 -> 3;
}
};
}
\countset
\tikz[>=Stealth]{%
\graph [simple necklace layout, grow'=down, node sep=20mm, nodes=draw, edge quotes center, edge quotes={fill=white, inner sep=1pt, font=\scriptsize}]
{
subgraph C_n [n=6, -!-];
{ [edges={edge counter, bend left}]
3 -> 4 ->3 -> 1 -> 2 -> 3;
};
};
}
\countset
\tikz[>=Stealth]{%
\graph [simple necklace layout, grow'=down, node sep=20mm, nodes=draw, edge quotes center, edge quotes={fill=white, inner sep=1pt, font=\scriptsize}]
{
subgraph C_n [n=6, -!-];
{ [edges={edge counter, bend right, blue}]
1 -> {2, 3, 4} -> 5;
}
};
}
\end{document}
请注意,旧版 TeX 安装没有luatex85
。如果你的系统没有,只需将其删除,它就可以正常工作。
答案2
这是 pstricks
OP 帖子中图形的代码。它使用包pst-poly
:\documentclass[12pt, x11names, border=10pt]{standalone} \usepackage[utf8]{inputenc} \usepackage{fourier} \usepackage{pst-poly} \usepackage{auto-pst-pdf}
\begin{document}
\psset{unit=2cm, dimen=m, arrowinset=0.15}
\begin{pspicture}%
\newcounter{angle}
%%%
\providecommand{\PstPolygonNode}{%
\psnode(1;\INode){B\INode}{\psframebox[fillstyle=solid, fillcolor=white, linestyle=solid, linecolor=LightSteelBlue3!50]{\theangle}}%
\addtocounter{angle}{45}} \psset{ linewidth=0.6pt, linecolor=LightSkyBlue3, arrows=->, arcangle=-20}
\rput{-22.50}(0,0){\PstOctogon[PolyName =A, linestyle=none]}
\multido{\ibeg=0+1, \iend=1+1}{7}{\ncarc{B\ibeg}{B\iend}\ncarc{B\iend}{B\ibeg}}
\everypsbox{\scriptsize}
\ncarc[shiftB = 15mm]{B7}{B0}\ncarc{B0}{B7}
\ncarc[angleB=-100]{B4}{B1}\ncput*{a}
\ncarc[angleA=20, angle=150,arrows=<-]{B6}{B4}\nbput[labelsep=1pt]{b}
\ncarc[linestyle=dashed, angleA=-30]{B7}{B3}\ncput*[framesep=1pt, npos=0.4]{c}
\uput{1.3em}[-150]{-150}(B5){\pscurve[unit=0.35](O)(0.75; -27)(1;0)(0.7; 30)(O)}%% loop
\end{pspicture}
\end{document}
参数angle
(\ncarc
= node connection arc
)表示圆弧与节点线所成的角度(angleA
表示圆弧的起点、angleB
终点或angle
两者)。