Colocar etiquetas de forma automática al final de una línea.

Colocar etiquetas de forma automática al final de una línea.

Usando tkiz, me gustaría colocar etiquetas al final de las líneas de forma automática.

Desafortunadamente, las etiquetas se centran "automáticamente" en los extremos de la línea.

Ejemplo

\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}

Esperaría algo como esto (y puedes ver por qué estoy intentando tener un comando para una línea con etiquetas aquí)

\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}

Nota: Conozco "pos", "final cercano", "inicio cercano", etc., pero con etiquetas cortas no obtienes resultados muy buenos y con etiquetas largas aún se superpondrán con los nodos principales.

Respuesta1

Método usando let, calcy 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}

ingrese la descripción de la imagen aquí

EDITAR:Después del comentario de wrobell lo reemplacé \n1={90-scalar(atan2(\p1))}con \n1={atan2(\y1,\x1)}para que el código sea más legible.

Respuesta2

Sólo una sugerencia. Si su segundo ejemplo es bueno para usted, escriba un comando que lo implemente. Necesitarás dos comandos, uno para las líneas horizontales y otro para las verticales. Todos los caminos horizontales irán de izquierda a derecha y los verticales de arriba a abajo. Tendrás que corregir los anclajes del siguiente código, pero puede ayudar.

\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}

ingrese la descripción de la imagen aquí

información relacionada