Используя tkiz, я хотел бы автоматически размещать метки на концах строк.
К сожалению, «auto» центрирует метки по концам строки.
Пример
\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\newcommand\ua[6]{%
\draw (#1) -- (#4)
node[at start, auto=left]{#2}
node[at start, auto=right]{#3}
node[at end, auto=left]{#5}
node[at end, auto=right]{#6};
}
\begin{tikzpicture}[node distance=4cm]
\node(a)[draw, rectangle, align=left]{A\\head};
\node(b)[draw, rectangle, right=of a, align=left]{B\\head};
\node(c)[draw, rectangle, below=of b, align=left]{C\\head};
\node(d)[draw, rectangle, left=of c, align=left]{D\\head};
\ua{a}{a1 label}{a2 label}{b}{b1 label}{b2 label}
\ua{b}{b3 label}{b4 label}{c}{c1 label}{c2 label}
\ua{c}{c3 label}{c4 label}{d}{d1 label}{d2 label}
\ua{d}{d3 label}{d4 label}{a}{a3 label}{a4 label}
\end{tikzpicture}
\end{document}
Я ожидал чего-то вроде этого (и вы можете понять, почему я пытаюсь создать команду для строки с метками здесь)
\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[every node=./style={align=center}, node distance=4cm]
\node(a)[draw, rectangle, align=left]{A\\head};
\node(b)[draw, rectangle, right=of a, align=left]{B\\head};
\node(c)[draw, rectangle, below=of b, align=left]{C\\head};
\draw (a) -- (b)
node[at start, anchor=south west]{a1 label}
node[at start, anchor=north west]{a2 label}
node[at end, anchor=south east]{b1 label}
node[at end, anchor=north east]{b2 label};
\draw (b) -- (c)
node[at start, anchor=north east]{b1 label}
node[at start, anchor=north west]{b2 label}
node[at end, anchor=south east]{c1 label}
node[at end, anchor=south west]{c2 label};
% ... and so on...
\end{tikzpicture}
\end{document}
Примечание: я знаю о «pos», «near end», «near start» и т. д., но с короткими метками вы получите не очень хороший результат, а с длинными метками вы все равно будете пересекаться с основными узлами.
решение1
Метод с использованием let
, calc
и label
:
\documentclass[varwidth,border=50]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\begin{document}
\newcommand\ua[6]{
\draw (#1) -- (#4)
let
\p1=($(#4)-(#1)$),
\n1={atan2(\y1,\x1)} % for PGF < 3.0 atan2(\x1,\y1)
in
node[at start, label={\n1+45:#2}]{}
node[at start, label={\n1-45:#3}]{}
node[at end, label={\n1+135:#5}]{}
node[at end, label={\n1+225:#6}]{};
}
\begin{tikzpicture}[node distance=4cm, label distance=-2mm]
\node(a)[draw, rectangle, align=left]{A\\head};
\node(b)[draw, rectangle, right=of a, align=left]{B\\head};
\node(c)[draw, rectangle, below=of b, align=left]{C\\head};
\node(d)[draw, rectangle, left=of c, align=left]{D\\head};
\ua{a}{a1 label}{a2 label}{b}{b1 label}{b2 label}
\ua{b}{b3 label}{b4 label}{c}{c1 label}{c2 label}
\ua{c}{c3 label}{c4 label}{d}{d1 label}{d2 label}
\ua{d}{d3 label}{d4 label}{a}{a3 label}{a4 label}
\end{tikzpicture}
\end{document}
РЕДАКТИРОВАТЬ:После комментария wrobell я заменил \n1={90-scalar(atan2(\p1))}
на , \n1={atan2(\y1,\x1)}
чтобы сделать код более читабельным.
решение2
Просто предложение. Если ваш второй пример вам подходит, напишите команду, которая его реализует. Вам понадобятся две команды, одна для горизонтальных линий, а другая для вертикальных. Все горизонтальные пути будут идти слева направо, а вертикальные — сверху вниз. Вам придется исправить якоря из следующего кода, но это может помочь.
\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\newcommand\horzpath[6]{%
\draw (#1) -- (#4)
node[at start, anchor=south west]{#2}
node[at start, anchor=north west]{#3}
node[at end, anchor=south east]{#5}
node[at end, anchor=north east]{#6};
}
\newcommand\vertpath[6]{%
\draw (#1) -- (#4)
node[at start, anchor=north west]{#2}
node[at start, anchor=north east]{#3}
node[at end, anchor=south east]{#5}
node[at end, anchor=south west]{#6};
}
\begin{tikzpicture}[node distance=4cm]
\node(a)[draw, rectangle, align=left]{A\\head};
\node(b)[draw, rectangle, right=of a, align=left]{B\\head};
\node(c)[draw, rectangle, below=of b, align=left]{C\\head};
\node(d)[draw, rectangle, left=of c, align=left]{D\\head};
\horzpath{a}{a1 label}{a2 label}{b}{b1 label}{b2 label}
\vertpath{b}{b3 label}{b4 label}{c}{c1 label}{c2 label}
\horzpath{d}{d1 label}{d2 label}{c}{c3 label}{c4 label}
\vertpath{a}{a3 label}{a4 label}{d}{d3 label}{d4 label}
\end{tikzpicture}
\end{document}