Uso de distancias relativas a fuentes en tikzpictures

Uso de distancias relativas a fuentes en tikzpictures

Cuando uso scaleen tikzpictures (sin transform shape), el tamaño del texto en los nodos no cambia (lo cual está muy bien). Supongamos ahora que quiero colocar algún nodo en un gráfico escalado usando una distancia proporcional a la fuente del nodo; Ingenuamente supuse que podía usar excoordenadas, pero ver más abajo...

También imprimí los valores de las coordenadas, y\pgf@yylo que debería dar el vector unitario, pero hay algo que extraño aquí...

¿Hay alguna manera de expresar una distancia que sea proporcional al tamaño de fuente (predeterminado), independientemente de la escala?

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\newdimen\mydimA\newdimen\mydimB
\makeatletter
\newcommand{\showat}[1]{%
    \pgfextracty\mydimA{\pgfpointanchor{A}{center}}
    \pgfextracty\mydimB{\pgfpointanchor{B}{center}}
    \node[red, font=\tiny,  align=left] at(#1) {Before \the\mydimA \\ After \the\mydimB \\
    Scale y \the\pgf@yy};
}
\makeatother
\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
    \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{0.5,-0.5}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
    \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{100,-100}
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Respuesta1

Su 1emse está convirtiendo en el momento de la lectura al sistema de coordenadas, que luego se ve afectado por la escala de la imagen. Puede utilizarlo reset cmpara restablecer localmente la matriz de transformación de coordenadas, cancelando localmente el efecto de escala de la imagen.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path (A) ++(0,1em) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
  \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
  \path[reset cm] (A) ++(0,1em) coordinate(B);
  \node [anchor=base] at (B) {$R_g$};
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
  \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
  \path[reset cm] (A) ++(0,1em) coordinate(B);
  \node [anchor=base] at (B) {$R_g$};
\end{tikzpicture}
\end{document}

Respuesta2

Restablecer la escala localmente es una opción (consulte la respuesta de Marsden), pero hay una mejor manera de hacer las cosas.

Con scale=factor,todolas coordenadas se escalan por factor, independientemente de su dimensión (mientras que los vectores unitarios no cambian, como descubrió). En su lugar, redefina la longitud de los vectores unitarios según la escala deseada. Por ejemplo, con y={(0cm,2cm)}, aunque (0,0) -- (1,0)será el doble de la distancia habitual, las coordenadas con dimensiones como (0,1ex), no cambiarán:

\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1cm}
\end{tikzpicture}
\begin{tikzpicture}[baseline, x={(2cm,0cm)},y={(0cm,2cm)}]
    % Identical code to previous picture:
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \path[scale=1] (A) ++(0,1ex) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1cm}
\end{tikzpicture}
\end{document}

Producción:

producción

Observe cómo la distancia entre Ay Bno cambia, mientras que \the\pgf@yyse ha duplicado, como se esperaba.

Respuesta3

¿Por qué no colocas B como nodo en sí mismo?(con ubicación relativa)?

Eso resolvería todos tus problemas.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{positioning}
\newdimen\mydimA\newdimen\mydimB
\makeatletter
\newcommand{\showat}[1]{%
    \pgfextracty\mydimA{\pgfpointanchor{A}{center}}
    \pgfextracty\mydimB{\pgfpointanchor{B}{center}}
    \node[red, font=\tiny,  align=left] at(#1) {Before \the\mydimA \\ After \the\mydimB \\
    Scale y \the\pgf@yy};
}
\makeatother
\begin{document}
\tikzset{node distance=1ex}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \node[above=of A,anchor=base](B){$R_g$};
    \showat{1,-1}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
    \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
    %\path (A) ++(0,1ex) coordinate(B)node{y};
    \node[above=of A,anchor=base] (B) {$R_g$};
    \showat{0.5,-0.5}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
    \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
    %\path (A) ++(0,1ex) coordinate(B)node{y};
    \node[above=of A,anchor=base] (B) {$R_g$};
    \showat{100,-100}
\end{tikzpicture}
\end{document}

captura de pantalla

Respuesta4

La respuesta de Eric Marsdenexplica muy bien lo que está pasando. Sin embargo, simplemente leería la entrada relevante de la matriz de transformación (es la entrada 22) y la "invertiría". Este es un truco que también usé (sin inversión, por supuesto) para escalar el ancho de la línea con una forma porque por defecto no escala.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\newdimen\mydimA\newdimen\mydimB
\makeatletter
\newcommand{\showat}[1]{%
    \pgfextracty\mydimA{\pgfpointanchor{A}{center}}
    \pgfextracty\mydimB{\pgfpointanchor{B}{center}}
    \node[red, font=\tiny,  align=left] at(#1) {Before \the\mydimA \\ After \the\mydimB \\
    Scale y \the\pgf@yy};
}
\makeatother
\begin{document}
\begin{tikzpicture}[baseline]
    \draw (0,0)  --(1,0) coordinate(A) -- (2,0);
    \pgfgettransformentries{\tmp}{\tmp}{\tmp}{\myscale}{\tmp}{\tmp}
    \path  (A) ++(0,1ex/\myscale) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{1,-1}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=2]
    \draw (0,0)  --(0.5,0) coordinate(A) -- (1,0);
    \pgfgettransformentries{\tmp}{\tmp}{\tmp}{\myscale}{\tmp}{\tmp}
    \path  (A) ++(0,1ex/\myscale) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{0.5,-0.5}
\end{tikzpicture}
\begin{tikzpicture}[baseline, scale=0.01]
    \draw (0,0)  --(100,0) coordinate(A) -- (200,0);
    \pgfgettransformentries{\tmp}{\tmp}{\tmp}{\myscale}{\tmp}{\tmp}
    \path  (A) ++(0,1ex/\myscale) coordinate(B);
    \node [anchor=base] at (B) {$R_g$};
    \showat{100,-100}
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada