Descripción general del comportamiento intrínseco.
Las etiquetas en una imagen tikz se desplazan (por ejemplo, arriba) exactamente al extremo de las letras en las etiquetas, es decir, toma el descendente (verEntrada de Wikipedia para descendente) de las letras en cuenta como en la letra "g" (o la "p" de Sphinx).
Aspecto diferente (por qué esa pregunta)
Pero los siguientes ejemplos ya no parecen simétricos.
\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}
Problema por resolver
¿Cuál es la forma más sencilla de solucionar esta característica (en algunos casos deseada)? No quiero analizar cada carácter en las etiquetas de todos los nodos que estoy escribiendo.
Respuesta1
TikZ ya comprende este problema y ofrece text depth
extensión. Puede ponerlo a cero o agregar la cantidad fija de profundidad a todos los nodos. Ejemplo (de alguna manera me gusta el diseño estrecho)
\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}
Respuesta2
Aquí hay una solución general con dos variantes: \strut
o \vphantom
. Esta solución se puede utilizar con nodos de varias líneas o diferentes tamaños de fuente.
\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}
Respuesta3
Lo que debes hacer es agregar anchor=base
opciones a los dos nodos. Alineará las dos etiquetas por sus líneas base. Probablemente quisiste escribir:
\node[above of=leadl, anchor=base] {left circle};
Para anclar al ascenso o descenso, usarías, por ejemplo anchor=north
, . Esto anclará el nodo en el medio del borde superior del nodo. Sin embargo, hay algo de relleno invisible dentro del nodo (intente agregar, por ejemplo, fill=blue
para ver el relleno). Para quitar el acolchado, utilice inner sep=0pt
. Otras opciones para la posición del ancla incluyen north east
, north west
, south east
, etc.
Respuesta4
Escribí algo como esto con un propósito similar. Podría decirse que es un poco voluminoso para lo que logra, pero quizás le resulte útil.
\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
La forma en que esto funciona es que envuelve el texto del nodo \standardisebox
y se compone como si tuviera la altura y profundidad de un dígito 0 en lugar de su altura y profundidad verdaderas. Puede cambiar el carácter utilizado para determinar la altura y la profundidad usando la macro \setboxdeterminingsymbol
y restablecerlo a la normalidad usando \resetboxdeterminingsymbol
. Utilice los formularios destacados para cambios globales.
\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}
En mi caso, estaba colocando nodos (en realidad, etiquetas de nodos) sistemáticamente dentro de otra macro, por lo que usar la macro para restablecer todas sus casillas no fue un trabajo difícil. Si configura muchos nodos manualmente, envolver cada uno de ellos en la macro puede resultar arduo.