Tikz-Beschriftungen werden abhängig von der Buchstabengröße verschoben

Tikz-Beschriftungen werden abhängig von der Buchstabengröße verschoben

Allgemeine Beschreibung des intrinsischen Verhaltens

Die Beschriftungen in einem Tikz-Bild werden (z. B. nach oben) genau an das Ende der Buchstaben in den Beschriftungen verschoben, d. h. es wird die Unterlänge (sieheWikipedia-Eintrag für Abseilgerät) der Buchstaben zu berücksichtigen wie beim Buchstaben „g“ (bzw. dem „p“ von Sphinx).

Bildbeschreibung hier eingeben

Anderer Aspekt (warum diese Frage)

Allerdings sehen die folgenden Beispiele dann nicht mehr symmetrisch aus.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (leadl) at (1,0);
\coordinate (leadr) at (2,0);
\fill (leadl)  circle[radius=2pt];
\fill (leadr)  circle[radius=2pt];
\node[above] at (leadl) {left};
\node[above] at (leadr) {right};
\end{tikzpicture}
\end{document}

Beispiel mit Beschriftungen oben

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate (leadl) at (1,0);
\coordinate (leadr) at (2,0);
\fill (leadl)  circle[radius=2pt];
\fill (leadr)  circle[radius=2pt];
\node[below] at (leadl) {lelele};
\node[below] at (leadr) {rerere};
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Zu lösendes Problem

Wie kann ich diese (in manchen Fällen gewünschte) Funktion am einfachsten umgehen? Ich möchte nicht jedes Zeichen in den Beschriftungen aller Knoten analysieren, die ich eingebe.

Antwort1

TikZ versteht dieses Problem bereits und bietet text depthLänge an. Sie können es entweder auf Null setzen oder allen Knoten die feste Tiefe hinzufügen. Beispiel (ich mag irgendwie beengtes Design)

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}[scale=1.5]
\coordinate (leadl) at (3,0);
\coordinate (leadr) at (5,0);
\fill (leadr)  circle[radius=2pt];
\fill (leadl)  circle[radius=2pt];
\node[above] at (leadl) {left circle};
\node[above,text depth=0pt] at (leadr) {right circle};
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine allgemeine Lösung mit zwei Varianten: \strutoder \vphantom. Diese Lösung kann mit mehrzeiligen Knoten oder unterschiedlichen Schriftgrößen verwendet werden.

Bildbeschreibung hier eingeben

\documentclass{standalone}
\usepackage{tikz}
\tikzset{
  fix node via strut/.style={
    execute at begin node={\strut},
    execute at end node={\strut},
  },
  fix node via vphantom/.style={
    execute at begin node={\vphantom{Ag}},
    execute at end node={\vphantom{Ag}},
  },
}
\begin{document}
\begin{tikzpicture}
  \coordinate (leadl) at (1,0);
  \coordinate (leadr) at (2,0);
  \fill (leadl)  circle[radius=2pt];
  \fill (leadr)  circle[radius=2pt];
  \node[fix node via strut,above,align=center] at (leadl) {left\\left};
  \node[fix node via strut,above,align=center] at (leadr) {right\\right};
  \node[fix node via strut,below,font=\large] at (leadl) {lelele};
  \node[fix node via strut,below,font=\large] at (leadr) {rerere};
  \node[blue,above] at (current bounding box.north){via strut};
\end{tikzpicture}
\begin{tikzpicture}
  \coordinate (leadl) at (1,0);
  \coordinate (leadr) at (2,0);
  \fill (leadl)  circle[radius=2pt];
  \fill (leadr)  circle[radius=2pt];
  \node[fix node via vphantom,above,align=center] at (leadl) {left\\left};
  \node[fix node via vphantom,above,align=center] at (leadr) {right\\right};
  \node[fix node via vphantom,below,font=\large] at (leadl) {lelele};
  \node[fix node via vphantom,below,font=\large] at (leadr) {rerere};
  \node[red,above] at (current bounding box.north){via vphantom};
\end{tikzpicture}
\end{document}

Antwort3

Was Sie tun müssen, ist, anchor=basedie Optionen der beiden Knoten zu ergänzen. Dadurch werden die beiden Beschriftungen an ihren Grundlinien ausgerichtet. Vermutlich wollten Sie schreiben:

\node[above of=leadl, anchor=base] {left circle};

Um am Auf- oder Abstieg zu verankern, würden Sie beispielsweise verwenden anchor=north. Dadurch wird der Knoten in der Mitte der oberen Kante des Knotens verankert. Innerhalb des Knotens befindet sich jedoch eine unsichtbare Polsterung (versuchen Sie, beispielsweise hinzuzufügen, fill=blueum die Polsterung anzuzeigen). Um die Polsterung zu entfernen, verwenden Sie inner sep=0pt. Andere Auswahlmöglichkeiten für die Ankerposition sind north east, north west, south east, usw.

Antwort4

Ich habe so etwas für einen ähnlichen Zweck geschrieben. Es ist wohl ein bisschen sperrig für das, was es leistet, aber vielleicht finden Sie es nützlich.

\usepackage{xparse}
\makeatletter
\newcommand{\standardisebox}[1]{%
    \smash{#1}\vphantom{\strpeters@box@determining@symbol}%
}
\let\standardizebox\standardisebox
\NewDocumentCommand{\setboxdeterminingsymbol}{sm}{%
    \IfBooleanTF {#1}%
                 {\gdef\strpeters@box@determining@symbol{#2}}%
                 {\def\strpeters@box@determining@symbol{#2}}%
}
\NewDocumentCommand{\resetboxdeterminingsymbol}{s}{%
    \IfBooleanTF {#1}%
                 {\setboxdeterminingsymbol*{0}}%
                 {\setboxdeterminingsymbol{0}}%
}
\resetboxdeterminingsymbol
\makeatother

Dies funktioniert folgendermaßen: Sie umschließen den Knotentext in \standardiseboxund er wird so gesetzt, als hätte er die Höhe und Tiefe einer Ziffer 0 statt seiner tatsächlichen Höhe und Tiefe. Sie können das Zeichen, das zur Bestimmung der Höhe und Tiefe verwendet wird, mit dem Makro ändern \setboxdeterminingsymbolund es mit auf den Normalwert zurücksetzen \resetboxdeterminingsymbol. Verwenden Sie die mit Sternchen versehenen Formulare für globale Änderungen.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{xparse}
\makeatletter
\newcommand{\standardisebox}[1]{%
    \smash{#1}\vphantom{\strpeters@box@determining@symbol}%
}
\let\standardizebox\standardisebox
\NewDocumentCommand{\setboxdeterminingsymbol}{sm}{%
    \IfBooleanTF {#1}%
                 {\gdef\strpeters@box@determining@symbol{#2}}%
                 {\def\strpeters@box@determining@symbol{#2}}%
}
\NewDocumentCommand{\resetboxdeterminingsymbol}{s}{%
    \IfBooleanTF {#1}%
                 {\setboxdeterminingsymbol*{0}}%
                 {\setboxdeterminingsymbol{0}}%
}
\resetboxdeterminingsymbol
\makeatother
\begin{document}
\begin{tikzpicture}
\coordinate (leadl) at (1,0);
\coordinate (leadr) at (2,0);
\fill (leadr)  circle[radius=2pt];
\fill (leadl)  circle[radius=2pt];
\node[above] at (leadl) {\standardisebox{left}};
\node[above] at (leadr) {\standardisebox{right}};
\end{tikzpicture}
\end{document}

In meinem Fall habe ich Knoten (eigentlich Knotenbeschriftungen) systematisch in ein anderes Makro eingefügt, sodass es keine große Arbeit war, alle Felder mit dem Makro zurückzusetzen. Wenn Sie viele Knoten manuell festlegen, kann es sich als mühsam erweisen, jeden einzelnen davon in das Makro einzuschließen.

verwandte Informationen