编辑

编辑

如果您知道如何回答我的问题,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

您说您可以根据三个具体问题的答案编写通用食谱的代码。但是,如果您想要通用食谱,TiZ 的图形绘制功能,特别是可用的各种算法,无疑是可行的。

我对此不太了解 - 感觉像是陌生的领域 - 但 LuaTeX 提供了强大的功能,文档和库也很丰富。如果你要绘制很多东西,花时间阅读手册中的文档是值得的。

circular、、(对于诸如等标准图表)应该特别有趣。请注意routing,介绍位于手册的主要部分,而详细信息位于图表绘制部分。graphs.standardK_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.standardrouting)一起使用。这实际上取决于您要执行的操作的细节...

编辑

请注意,我只是提供了一个可能的示例。如果你使用它,显然你会想看看文档根据您的要求进行调整。

以下是使用标准图形绘制元素的 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

这是 pstricksOP 帖子中图形的代码。它使用包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两者)。

在此处输入图片描述

相关内容