Есть ли более короткий код для рисования этого в tikz?

Есть ли более короткий код для рисования этого в tikz?

Есть ли какие-либо возможные более короткие коды рисования этой диаграммы, возможно, используя, graphsно это не правильный многоугольник, или сократив повторяющиеся элементы \drawв моем коде:

%% filename henry3.pgf
\begin{tikzpicture}
%%styles and libraries
\usetikzlibrary{decorations.markings, arrows}
\tikzstyle{mdar}=[decoration={markings, mark=at position 0.45 with {\arrow{stealth}}}, postaction={decorate}]
\tikzstyle{mdad}=[decoration={markings, mark=at position 0.3 with {\arrow{stealth}}}, postaction={decorate}]
\tikzstyle{point}=[node distance=2cm, inner sep=0pt, fill=black, circle]
%nodes
\node[point] (p1) {.} ;
\node[point, below of = p1] (p2) {.}; 
\node[point, below of = p2, yshift=0.7cm](p3){.};
\node[point, below of = p3, yshift=0.4cm](p4){.};
\node[point, below of = p4, yshift=0.7cm](p5){.}; 
%%
\node[point, right of=p1, yshift=-1.4cm](p10){.};
\node[point, left of=p1, yshift=-1.4cm](p11){.};
\node[point, right of=p4,  xshift=-0.3cm] (p40) {.};
\node[point,left of=p4, xshift=0.3cm] (p41) {.};
%% there is a way of importing tikz's graph library and making things
%%easier and compressed but importing this does not work on my
 %%computer
%joining nodes
\draw[mdar](p1) -- (p11) ;\draw[mdar](p1) -- (p10);\draw[mdar] (p1) -- (p41);\draw[mdar] (p1) -- (p40);\draw[mdar](p1) -- (p2);
\draw[mdar](p2) -- (p11); \draw[mdar](p2) -- (p3);\draw[mdar](p2) -- (p10); \draw[mdar](p2) -- (p40); \draw[mdar](p2) -- (p41);
\draw[mdad](p11) -- (p3); \draw[mdad](p11) -- (p4); \draw[mdad](p11) -- (p5); \draw[mdar](p11) -- (p41);
\draw[mdar] (p10) -- (p3); \draw[mdad] (p10) -- (p4); \draw[mdad] (p10) -- (p5); \draw[mdar] (p10) -- (p40);
\draw[mdar](p3) -- (p4); \draw[mdar](p3) -- (p41); \draw[mdar](p3) -- (p40);
\draw[mdar](p4) -- (p41); \draw[mdar](p4) -- (p40); \draw[mdar](p4) -- (p5);
\draw[mdar](p40) -- (p5); \draw[mdar](p41) -- (p5);
\end{tikzpicture}

Выход: введите описание изображения здесь

решение1

Я не очень разбираюсь в графах, поэтому не буду пытаться использовать библиотеки графов, но вы можете перенумеровать узлы более осмысленно, а затем применить типичный подход матрицы смежности.

\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.markings, arrows}
\begin{document}    
\begin{tikzpicture}[mdar/.style={
    decoration={markings, mark=at position 0.45 with {\arrow{stealth}}},
    postaction={decorate}
    },
mdad/.style={decoration={markings, mark=at position 0.3 with {\arrow{stealth}}}, 
             postaction={decorate}},
point/.style={node distance=2cm, inner sep=0pt, fill=black, circle}]

\node[point] (p1) {.} ;
\node[point, left of=p1, yshift=-1.4cm](p2){.};
\node[point, below of = p1] (p3) {.}; 
\node[point, right of=p1, yshift=-1.4cm](p4){.};
\node[point, below of = p3, yshift=0.7cm](p5){.};
\node[point, below of = p5, yshift=0.4cm](p7){.};
\node[point,left of=p7, xshift=0.3cm] (p6) {.};
\node[point, right of=p7,  xshift=-0.3cm] (p8) {.};
\node[point, below of = p7, yshift=0.7cm](p9){.}; 
\def\myadjmat{%
{0,1,1,1,0,1,0,1,0},
{0,0,0,0,1,1,1,0,1},
{0,1,0,1,1,1,0,1,1},
{0,0,0,0,1,0,1,1,1},
{0,0,0,0,0,1,0,1,0},
}

\foreach \x[count=\xi] in \myadjmat{
  \foreach \y[count=\yi] in \x{
    \ifnum1=\y\relax\draw[mdar] (p\xi) -- (p\yi);\fi
  }
}

\end{tikzpicture}
\end{document}

введите описание изображения здесь

Мне стало скучно после пятого, но вы поняли. Также не оставляйте команды \usetikzlibrary{...}на картинке. Вместо этого перенесите их в преамбулу. Наконец, вы можете рассмотреть возможность пропуска\tikzstyle поскольку она устарела согласноСледует ли использовать \tikzset или \tikzstyle для определения стилей TikZ?

решение2

Вот пример с графическим рисованием. Расположение узлов не впечатляет, но его можно довольно легко изменить. Его можно выполнить "как обычно" с помощью pdflatex(или xelatex, или latex -> dvipdfm, и т. д.).

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{graphs,decorations.markings}
\tikzgraphsset{on edge arrow/.style={/tikz/every edge/.append style={
  -, draw, postaction={
  decoration={markings, mark=at position \arrowpos with {\arrow{stealth}}},
  decorate}}}, > pos/.store in=\arrowpos, > pos=0.5}
\begin{document}
\begin{tikzpicture}[x=0.75cm,y=0.75cm]
\foreach \p [count=\i] in {(0,0),(-2,-1),(0,-1.75),(2,-1),(0,-3),
    (-1.5,-4.5),(0,-4.5),(1.5,-4.5),(0,-6.25)}
  \node [shape=circle, inner sep=0, minimum size=2,fill] (\i) at \p {};
\graph [use existing nodes, on edge arrow]{
    1 -> {2, 3, 4};
    2 -> {5 -> {6, 7, 8}, 6, 7 -> 9};
    3 -> {2, 4 -> {5, 7, 8}, 5};
    1 ->[> pos=.45] {6, 8};
    3 ->[> pos=.45] {6, 8};
    {2, 4} ->[> pos=0.66] 9;
};
\end{tikzpicture}
\end{document}

введите описание изображения здесь

решение3

Поскольку у ваших стрелок нет регулярного шаблона, сложно сделать действительно лаконичный код, потому что нет фактического правила, которое бы управляло тем, куда должны направляться стрелки и т. д. Так что это немного длиннее кода, чем я хотел написать, но он все равно довольно короткий.

Выход

введите описание изображения здесь

Код

\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.markings, arrows}

\tikzset{
    %mdar/.style={very thin,decoration={markings, mark=at position 0.45 with {\arrow{stealth reversed}}}, postaction={decorate}},
    mdad/.style={very thin,decoration={markings, mark=at position 0.45 with {\arrow[scale=.8]{stealth}}}, postaction={decorate}},
    point/.style={inner sep=.5pt, fill=black, circle}
}

\begin{document}
\begin{tikzpicture}

% Nodes
\foreach \points [count=\xi] in {
        (0,0),
        (-1,1),(0,1),(1,1),
        (0,2),
        (-1.2,3.3),(0,3),(1.2,3.3),
        (0,4)}{
    \node[point] (p\xi) at \points {};
}

% Arrows
\foreach \name/\dest in {%  
    2/{1},
    3/{1,2,4},
    4/{1},
    5/{2,3,4},
    6/{1,2,3,5},
    7/{2,4,5,6,8},
    8/{1,3,4,5},
    9/{2,4,6,7,8},
    }{%
    \foreach \ppp in \dest{
        \draw[very thin, mdad] (p\name) -- (p\ppp);
    }
}
\end{tikzpicture}
\end{document}

Связанный контент