Wie kann ich den TikZ-Label-Anker explizit festlegen?

Wie kann ich den TikZ-Label-Anker explizit festlegen?

Ich möchte labeleinem Knoten eins hinzufügen, aber „innerhalb“ des Knotens. So etwas wie das hier:

gewünschte Ausgabe

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“.

tatsächliche Leistung

Irgendwelche Ideen?

Antwort1

Das Problem hierbei besteht darin, dass TikZ eine gewisse Automatisierung (nämlich das \tikz@auto@anchorMakro) 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 anchorSchlü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

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Antwort2

Hier ist ein weiterer Ansatz, der diese Option nutzt append after command. Der Punkt ist, dass \tikzlastnode.centerman 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:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

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 labelStil 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:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

Hinweis: Durch die Verwendung label distanceinnerhalb 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}

verwandte Informationen