Wenn ich scale
in tikzpictures (ohne transform shape
) verwende, wird die Textgröße in Knoten nicht geändert (was gut und schön ist). Nehmen wir nun an, ich möchte einen Knoten in ein skaliertes Diagramm einfügen, wobei ich einen Abstand verwende, der proportional zur Knotenschriftart ist. Ich habe naiv angenommen, dass ich ex
Koordinaten verwenden könnte, aber siehe unten ...
Ich habe auch die Werte der Koordinaten ausgedruckt und\pgf@yy
was den Einheitsvektor ergeben sollte, aber ich vermisse hier etwas ...
Gibt es eine Möglichkeit, einen Abstand auszudrücken, der unabhängig vom Maßstab zur (Standard-)Schriftgröße proportional ist?
\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}
Antwort1
Ihr 1em
wird beim Einlesen in das Koordinatensystem umgerechnet, das dann vom Bildmaßstab beeinflusst wird. Mit können Sie reset cm
die Koordinatentransformationsmatrix lokal zurücksetzen und so den Bildmaßstabseffekt lokal aufheben.
\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}
Antwort2
Das lokale Zurücksetzen der Waage ist eine Möglichkeit (siehe Marsdens Antwort), es gibt jedoch eine bessere Vorgehensweise.
Mit scale=factor
,alleKoordinaten werden mit skaliert factor
, unabhängig von ihrer Dimension (während die Einheitsvektoren unverändert bleiben, wie Sie festgestellt haben). Definieren Sie stattdessen die Länge der Einheitsvektoren entsprechend der gewünschten Skalierung neu. Beispielsweise bleiben bei , y={(0cm,2cm)}
während (0,0) -- (1,0)
die doppelte Entfernung die übliche ist, Koordinaten mit Dimensionen wie (0,1ex)
unverändert:
\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}
Ausgabe:
Beachten Sie, dass der Abstand zwischen A
und B
unverändert bleibt, während \the\pgf@yy
sich wie erwartet verdoppelt hat.
Antwort3
Warum platzieren Sie B nicht selbst als Knoten(mit relativer Platzierung)?
Das würde alle Ihre Probleme lösen.
\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}
Antwort4
Eric Marsdens Antworterklärt schön, was da passiert. Ich würde allerdings einfach den entsprechenden Eintrag der Transformationsmatrix auslesen (es ist der Eintrag 22) und diesen "invertieren". Das ist ein Trick, den ich auch verwendet habe (natürlich ohne Invertierung), um die Linienbreite bei einer Form zu skalieren, weil sie standardmäßig nicht skaliert.
\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}