行末にラベルを自動的に配置する

行末にラベルを自動的に配置する

tkiz を使用して、行末にラベルを自動的に配置したいと思います。

残念ながら、「自動」ではラベルが行の端の中央に配置されます。

\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

letcalcおよび を使用する方法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

単なる提案です。2 番目の例が適切であれば、それを実装するコマンドを記述してください。水平線用と垂直線用の 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}

ここに画像の説明を入力してください

関連情報