
Ich möchte label
einem Knoten eins hinzufügen, aber „innerhalb“ des Knotens. So etwas wie das hier:
Das Handbuch scheint darauf hinzuweisen, dass dies möglich sein könnte, obwohl kein tatsächlicher Schlüssel genannt wird.
Der ... Ankerpunkt für den Beschriftungsknoten ... wird so bestimmt, dass der Beschriftungsknoten vom Rand des Hauptknotens „abgewandt“ ist. Der gewählte Anker hängt von der Position des gewählten Randpunkts und seiner Position relativ zur Mitte des Hauptknotens ab und davon, ob die Option „Form transformieren“ aktiviert ist.Generell sollte die Auswahl Ihren Erwartungen entsprechen, in schwierigen Situationen müssen Sie den Anker aber unter Umständen selbst setzen.(Hervorhebung hinzugefügt)
Aber wenn ich ein Beispiel wie dieses versuche:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz \node [circle,draw,label={[red,anchor=north]above:X}] {my circle};
\end{document}
Ich sehe keine Änderung an der Position des Beschriftungsknotens. Er ist immer noch „draußen“.
Irgendwelche Ideen?
Antwort1
Das Problem hierbei besteht darin, dass TikZ eine gewisse Automatisierung (nämlich das \tikz@auto@anchor
Makro) anwendet, die Ihr Set überschreibt anchor
.
Wir können entweder einen Schlüssel kapern .code
, der ganz zuletzt im Knoten angewendet wird, der intern für das Label verwendet wird (ja, auch nach unseren eigenen Einstellungen red, anchor=north
) und der aufruft \tikz@auto@anchor
:
\tikzset{label anchor/.style={tikz@label@post/.append style={anchor=#1}}}
oder wir lassen das Makro, das die Berechnungen durchführt, etwas lockerer (kein zusätzlicher Schlüssel nötig):
\tikzset{anchor/.append code=\let\tikz@auto@anchor\relax}
Wenn der neue und verbesserte anchor
Schlüssel nun globaler verwendet wird (sagen wir \tikz[anchor=<dir>]
), wirkt sich dies auch auf die Knoten aus (und es gibt derzeit keine Möglichkeit, ihn zurückzubekommen).
Ich liefere auch einen Schlüssel inside
(Sie können ihn sogar zweimal verwenden, um den Effekt umzukehren).
Code
\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}
Ausgabe
Antwort2
Hier ist ein weiterer Ansatz, der diese Option nutzt append after command
. Der Punkt ist, dass \tikzlastnode.center
man durch Verweisen auf den Anker relativ zu dieser Position Beschriftungen hinzufügen kann.
Der neue Stil, der diese Aufgabe erfüllen kann, ist my label
:
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.center) node [#1] {#2}
}
}
}
Und ich:
\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}
was als Ergebnis ergibt:
Der Stil akzeptiert beim ersten Argument jede TikZ-Option, sodass Farben und Position einfach angepasst werden können: Tatsächlich ist es besser, den Versatz etwas anzupassen, damit sich der Text nicht überlappt.
Wenn man hingegen weiß, dass die Beschriftung immer unterhalb der „Nordgrenze“ platziert werden muss, dann ändert man den my label
Stil am besten wie folgt:
\tikzset{my label/.style args={#1:#2}{
append after command={
(\tikzlastnode.north) node [#1] {#2}
}
}
}
Stellen Sie dazu einfach Folgendes ein:
\tikz\node [circle,draw,my label={red,below:X}] {my circle};
ermöglicht es, das Ziel zu erreichen.
Und ich:
\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}
Das Ergebnis:
Revision
Die vorherige Methode leidet, wie in den Kommentaren erwähnt, wenn mehr als ein Label eingeführt werden soll. Dies ist jedoch durchaus machbar, wenn wir statt Knoten Koordinaten mit Labels einführen.
Der Code:
\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}
Das Ergebnis:
Hinweis: Durch die Verwendung label distance
innerhalb der Optionendefinition wird verhindert, dass sich der Beschriftungstext überlappt, wenn man nur sagt:
\tikz\node [circle,draw,my label={[red]below:X}] {my circle};
Antwort3
Sie können die Beschriftung auch verschieben:
\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}