TikZ ラベル アンカーを明示的に設定するにはどうすればよいですか?

TikZ ラベル アンカーを明示的に設定するにはどうすればよいですか?

ノードに を追加したいのですlabelが、ノードの「内部」に追加したいのです。次のようになります:

望ましい出力

実際のキー名は指定されていないものの、マニュアルにはそれが可能である可能性が示されているようです。

ラベル ノードのアンカー ポイントは、ラベル ノードがメイン ノードの境界から「離れる」ように決定されます。選択されるアンカーは、選択された境界ポイントの位置と、メイン ノードの中心に対するその位置、および変換シェイプ オプションが設定されているかどうかによって異なります。一般的に、選択は予想どおりになるはずですが、困難な状況では自分でアンカーを設定する必要がある場合があります。(強調追加)

しかし、次のような例を試してみます:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,anchor=north]above:X}] {my circle};
\end{document}

ラベル ノードの位置は変わりません。まだ「外側」のままです。

実際の出力

何か案は?

答え1

ここでの問題は、TikZ が何らかの自動化 (つまり\tikz@auto@anchorマクロ) を適用し、セットが上書きされることですanchor

.codeラベルに内部的に使用されるノードの最後に適用されるキーをハイジャックして (はい、独自の設定の後でもred, anchor=north)、以下を呼び出すことができます\tikz@auto@anchor

\tikzset{label anchor/.style={tikz@label@post/.append style={anchor=#1}}}

または、計算を実行するマクロを少し緩めます (追加のキーは必要ありません)。

\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}

新しい改良されたanchorキーがよりグローバルに使用されるようになった場合 (たとえば\tikz[anchor=<dir>])、ノードにも影響が及びます (現在のところ、それを元に戻す方法はありません)。

キーも提供しますinside(効果を反転するために 2 回使用することもできます)。

コード

\documentclass[tikz]{standalone}
\usepackage{etoolbox}
\makeatletter
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}
\tikzset{inside/.code=\preto\tikz@auto@anchor{\pgf@x-\pgf@x\pgf@y-\pgf@y}}
\makeatother
\begin{document}
\tikz\node [anchor=west, circle,draw,label={[red, anchor=north]above:X}] {my circle};
\tikz\node [anchor=west, circle,draw,label={[red, inside]below:X}] {my circle};
\end{document}

出力

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

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

答え2

これは、オプションを活用する別のアプローチですappend after command。ポイントは、アンカーを参照することで\tikzlastnode.center、その位置を基準にしてラベルを追加できるということです。

このタスクを達成できる新しいスタイルは次のとおりですmy label

\tikzset{my label/.style args={#1:#2}{
  append after command={
    (\tikzlastnode.center) node [#1] {#2}
    }
  }
}

もう少し:

\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
    append after command={
       (\tikzlastnode.center) node [#1] {#2}
    }
  }
}
\begin{document}
\tikz \node [circle,draw,my label={red,above=0.15cm:X}] {my circle};
\tikz \node [circle,draw,my label={red,below=0.15cm:X}] {my circle};
\end{document}

結果は次のようになります:

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

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

このスタイルは最初の引数で任意の TikZ オプションを受け入れるため、色や位置を簡単にカスタマイズできます。実際、テキストが重ならないようにオフセットを少し調整する方がよいでしょう。

代わりに、ラベルは常に「北の境界」の下に配置する必要があることがわかっている場合は、スタイルを次のように変更するのが最善ですmy label

\tikzset{my label/.style args={#1:#2}{
    append after command={
       (\tikzlastnode.north) node [#1] {#2}
    }
  }
}

このように設定するだけで、

\tikz\node [circle,draw,my label={red,below:X}] {my circle};

目標を達成することができます。

もう少し:

\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={#1:#2}{
    append after command={
       (\tikzlastnode.north) node [#1] {#2}
    }
  }
}
\begin{document}
\begin{tikzpicture}
\node [circle,draw,my label={red,below:X}] {my circle};
\node [circle,draw,my label={red,below=0.15cm:X},xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}

結果:

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

リビジョン

前の方法は、コメントで述べたように、複数のラベルを導入する必要がある場合に問題があります。ただし、ノードを導入するのではなく、ラベル付きの座標を導入すれば、これは完全に実行可能です。

コード:

\documentclass[tikz,png,border=10pt]{standalone}
\usepackage{tikz}
\tikzset{my label/.style args={[#1]#2:#3}{
    append after command={
       (\tikzlastnode.center) coordinate[label={[label distance=0.1cm,#1]#2:#3}]
    }
  },
}
\begin{document}
\begin{tikzpicture}
\node [circle,
  draw,
  my label={[red]above:X},
  my label={[green!70!blue]below:Y},
  my label={[blue,yshift=0.3cm]above:Z}] {my circle};
\node [circle,
  draw,
  my label={[blue,yshift=-0.15cm]below:X},
  my label={[green!70!blue]70:Z},
  my label={[orange!80!red]130:Y},
  xshift=2cm] {my circle};
\end{tikzpicture}
\end{document}

結果:

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

注意: オプション定義内で を使用するとlabel distance、次のように記述したときにラベル テキストが重ならなくなります。

\tikz\node [circle,draw,my label={[red]below:X}] {my circle};

答え3

ラベルをシフトすることもできます:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,yshift=-0.5cm]above:X}] {my circle};

\tikz \node [circle,draw,label={[red,label distance=-0.5cm]above:X}] {my circle};
\end{document}

関連情報