Las etiquetas de Tikz se desplazan según el tamaño de las letras.

Las etiquetas de Tikz se desplazan según el tamaño de las letras.

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

ingrese la descripción de la imagen aquí

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}

Ejemplo con etiquetas arriba

\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}

ingrese la descripción de la imagen aquí

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 depthextensió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}

ingrese la descripción de la imagen aquí

Respuesta2

Aquí hay una solución general con dos variantes: \struto \vphantom. Esta solución se puede utilizar con nodos de varias líneas o diferentes tamaños de fuente.

ingrese la descripción de la imagen aquí

\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=baseopciones 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=bluepara 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 \standardiseboxy 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 \setboxdeterminingsymboly 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.

información relacionada