
ノードに を追加したいのです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}