Как с помощью TikZ расположить грузы по диагоналям так, чтобы было понятно, к какому краю относится груз?
\begin{tikzpicture}[
> = stealth, % arrow head style
shorten > = 1pt, % don't touch arrow head to node
auto,
node distance = 3cm, % distance between nodes
semithick % line style
]
\tikzstyle{every state}=[
draw = black,
thick,
fill = white,
minimum size = 1mm
]
\node[state] (y1) {$y_1$};
\node[state] (y2) [right of=y1] {$y_2$};
\node[state] (y3) [right of=y2] {$y_3$};
\node[state] (x1) [above of=y1]{$x_1$};
\node[state] (x2) [above of=y2] {$x_2$};
\node[state] (x3) [above of=y3] {$x_3$};
\path[->] (x1) edge node {5} (y1);
\path[->] (y1) edge node {-8} (x2);
\path[->] (x1) edge node {4} (y2);
\path[->] (x2) edge node {3} (y2);
\path[->] (x2) edge node {3} (y3);
\path[->] (y2) edge node {-6} (x3);
\path[->] (x3) edge node {3} (y3);
\end{tikzpicture}
решение1
Вы можете использовать клавишу позиционирования метки pos=
вместе с опцией размещения ( above
, above left
, above right
, below
, below left
, below right
) для дальнейшей настройки ее размещения. pos
означает определенное расстояние между координатами, соединенными краем. Я использовал и опции размещения, которые хорошо выровняли метки. Более подробную информацию pos=0.25
см. в разделах 2.21 и 17.5.2 руководства .TikZ
Это дает одно из возможных решений. Ниже приведено MWE, дающее этот результат.
\documentclass[border=5pt,tikz]{standalone}
\usetikzlibrary{arrows.meta,automata,positioning}
\begin{document}
\begin{tikzpicture}[
> = stealth, % arrow head style
shorten > = 1pt, % don't touch arrow head to node
auto,
node distance = 3cm, % distance between nodes
semithick % line style
]
\tikzset{every state}=[
draw = black,
thick,
fill = white,
minimum size = 1mm
]
\node[state] (y1) {$y_1$};
\node[state] (y2) [right=of y1] {$y_2$};
\node[state] (y3) [right=of y2] {$y_3$};
\node[state] (x1) [above=of y1]{$x_1$};
\node[state] (x2) [above=of y2] {$x_2$};
\node[state] (x3) [above=of y3] {$x_3$};
\path[->] (x1) edge node[] {5} (y1);
\path[->] (y1) edge node[pos=0.25,below right] {-8} (x2);
\path[->] (x1) edge node[pos=0.25,above right] {4} (y2);
\path[->] (x2) edge node[] {3} (y2);
\path[->] (x2) edge node[pos=0.25,above right] {3} (y3);
\path[->] (y2) edge node[pos=0.25,below right] {-6} (x3);
\path[->] (x3) edge node[] {3} (y3);
\end{tikzpicture}
\end{document}
Пожалуйста, всегда публикуйте полный MWE, начинающийся с \documentclass
и заканчивающийся на \end{document}
. Добро пожаловать в TeX.SE.
решение2
Вы также можете использовать near start
или near end
.
КСТАТИ,использовать \tikzset
, а не\tikzstyle
, но в вашем случае это не обязательно и также below/above of
устарело, см. ответ Зарко.
Для позиционирования узла вы также можете использовать tikz matrix
.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{automata, matrix}
\begin{document}
\begin{tikzpicture}[
> = stealth, % arrow head style
shorten > = 1pt, % don't touch arrow head to node
auto,
node distance = 3cm, % distance between nodes
semithick % line style
]
every state/.style={%
draw = black,
thick,
fill = white,
minimum size = 1mm
}
\matrix[%
matrix of math nodes,
column sep = 2.1cm,
row sep = 2.1cm,
inner sep = 0pt,
nodes={state}
] (m) {%
x_1 & x_2 & x_3 \\
y_1 & y_2 & y_3 \\
};
\path[->] (m-1-1) edge node {5} (m-2-1)
(m-2-1) edge node[near start, swap] {-8} (m-1-2)
(m-1-1) edge node[near start] {4} (m-2-2)
(m-1-2) edge node {3} (m-2-2)
(m-1-2) edge node[near end, swap] {3} (m-2-3)
(m-2-2) edge node[near end] {-6} (m-1-3)
(m-1-3) edge node {3} (m-2-3);
\end{tikzpicture}
\end{document}
решение3
При правильном использовании библиотеки TikZ positioning
right of = ...
неправильно, правильно — right=of ...
), добавлена библиотека quotes
и все определения стилей определены как опции tikzpicture
, код может стать понятным, без всякого беспорядка, как странные определения state
стилей и т. д., т. е. лаконичным:
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{automata,
positioning, quotes}% <-- added libraries
\begin{document}
\begin{tikzpicture}[
> = stealth, % arrow head style
shorten > = 1pt, % don't touch arrow head to node
auto,
node distance = 3cm,% distance between nodes
semithick, % edge thick
]
\node[state] (y1) {$y_1$};
\node[state] (y2) [right=of y1] {$y_2$};
\node[state] (y3) [right=of y2] {$y_3$};
\node[state] (x1) [above=of y1] {$x_1$};
\node[state] (x2) [above=of y2] {$x_2$};
\node[state] (x3) [above=of y3] {$x_3$};
\path[->] (x1) edge ["$5$"] (y1)
(y1) edge [pos=0.3, "$-8$"] (x2)
(x1) edge [pos=0.3, "$ 4$"] (y2)
(x2) edge ["$3$"] (y2)
(x2) edge [pos=0.3, "$ 3$"] (y3)
(y2) edge [pos=0.3, "$-6$"] (x3)
(x3) edge ["$3$"] (y3);
\end{tikzpicture}
\end{document}
Редактировать:
В случае, если вы хотите иметь более мелкие метки краев, более близкие к краям, то добавьте между tikzpicture
опциями, например
every edge quotes/.append style = {font=\footnotesize, inner sep=2pt}
решение4
Используйте опцию sloped
, чтобы расположить текст по диагонали
\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows.meta, calc, chains, positioning, shapes, shapes.arrows}
\usepackage{enumitem}
\newlist{tikzitemize}{itemize}{1}% <-- defined new list
\setlist[tikzitemize]{nosep, % <-- new list setup
topsep = 0pt ,
partopsep = 0pt ,
leftmargin = * ,
label = $\bullet$ ,
before = \vspace{-1.5ex},
}
\begin{document}
\begin{tikzpicture}[
> = stealth, % arrow head style
shorten > = 1pt, % don't touch arrow head to node
auto,
node distance = 3cm, % distance between nodes
semithick % line style
]
\tikzstyle{state}=[
draw = black,
thick,
fill = white,
minimum size = 1mm,
circle,
]
\node[state] (y1) {$y_1$};
\node[state] (y2) [right of=y1] {$y_2$};
\node[state] (y3) [right of=y2] {$y_3$};
\node[state] (x1) [above of=y1]{$x_1$};
\node[state] (x2) [above of=y2] {$x_2$};
\node[state] (x3) [above of=y3] {$x_3$};
\path[->] (x1) edge node[sloped,above] {5} (y1);
\path[->] (y1) edge node[sloped] {-8} (x2);
\path[->] (x1) edge node[sloped] {4} (y2);
\path[->] (x2) edge node[sloped,above] {3} (y2);
\path[->] (x2) edge node[sloped] {3} (y3);
\path[->] (y2) edge node[sloped] {-6} (x3);
\path[->] (x3) edge node[sloped,above] {3} (y3);
\end{tikzpicture}
\end{document}