![Tikz-Beschriftungen werden abhängig von der Buchstabengröße verschoben](https://rvso.com/image/281567/Tikz-Beschriftungen%20werden%20abh%C3%A4ngig%20von%20der%20Buchstabengr%C3%B6%C3%9Fe%20verschoben.png)
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).
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}
\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}
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 depth
Lä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}
Antwort2
Hier ist eine allgemeine Lösung mit zwei Varianten: \strut
oder \vphantom
. Diese Lösung kann mit mehrzeiligen Knoten oder unterschiedlichen Schriftgrößen verwendet werden.
\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=base
die 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=blue
um 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 \standardisebox
und 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 \setboxdeterminingsymbol
und 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.