
Gibt es bei Verwendung der Skalierungsoption in \tikz[xscale=2]
etc. eine Möglichkeit, innerhalb der TikZ-Umgebung auf die Skalierungseinstellung zuzugreifen?
Antwort1
Wie Andrew sagt, können Sie die Transformationsmatrix verwenden, die eine Ansammlung aller Transformationen ist, die derzeit auf den aktuellen Bereich angewendet werden. Die relevanten Details finden Sie in den Abschnitten 104.2.1 und 104.2.4 desPGF-Handbuch(v3.0.0).
Ich habe einen Befehl definiert \getmytransformmatrix
, der die interne Darstellung der Transformationsmatrix von PGF in den Makros \mya
, \myb
, \myc
, \myd
, \mys
, und speichert \myt
. Diese entsprechen der Koordinatentransformation (x,y) --> (a*x + b*y + s, c*x + d*y +t)
. Daher werden die akkumulierten xscale
und yscale
(globale CS-Basis) jeweils in \mya
und gespeichert \myd
. Ebenso werden die Dimensionen xshift
und jeweils in und yshift
gespeichert .\mys
\myt
Diese bleiben nicht über Bereichsgrenzen/-ebenen hinweg bestehen, daher \getmytransformmatrix
muss der Befehl in jedem Bereich erscheinen, in dem Sie die Informationen verwenden möchten.
Der Code (mit kurzer Illustration)
\documentclass{standalone}
\usepackage{tikz}
\newcommand\getmytransformmatrix{%
\pgfgettransformentries{\mya}{\myb}{\myc}{\myd}{\mys}{\myt}%
% coordinate (x,y) is transformed to (ax + by + s, cx + dy + t)
}
\newcommand\drawmyaxes[1][]{% just for convenience
\draw (0,0) -- ++(1,0) node[right] {$x#1$};
\draw (0,0) -- ++(0,1) node[above] {$y#1$};
}
\newcommand\myvar[2]{\texttt{#1~=~#2}} % just for convenience
\begin{document}
\begin{tikzpicture}[xshift=2pt]
\getmytransformmatrix
\drawmyaxes
\node[align=left] at (-5,0) {Outside the scope, we have\\
\myvar{xscale}{\mya}, \myvar{yscale}{\myd}.};
\begin{scope}[yshift=-5pt,rotate=45]
\getmytransformmatrix
\drawmyaxes[']
\node[align=left] at (-1,-1) {Inside the scope, we have\\
\myvar{xscale}{\mya}, \myvar{yscale}{\myd}.\\
We also see that \myvar{xshift}{\mys}\\
and \myvar{yshift}{\myt}.};
\end{scope}
\node[align=left] at (5,0) {Outside the scope again, we have\\
\myvar{xscale}{\mya}, \myvar{yscale}{\myd}.};
\end{tikzpicture}
\end{document}
Die Ausgabe
Beachten Sie, dass die Matrix außerhalb des Gültigkeitsbereichs nicht „gespeichert“ wird und dass dies die akkumulierte Transformation ( xshift=2pt
aus der ursprünglichen Umgebung ) zeigtUnd yshift=-5pt
aus dem Anwendungsbereich).
Die zusätzlichen Variablen b
und c
könnten für andere Berechnungen verwendet werden, beispielsweise um die effektive Rotation zu berechnen ( atan(\myd/\mya)
würde nur ab (-90,90) funktionieren).
Antwort2
Die Antwort darauf hängt davon ab, zu welchem Zweck Sie die speichern xscale
. Mir fallen da zwei Möglichkeiten ein:
- Sie möchten wissen, was über übergeben wurde
xscale
. - Sie möchten
xscale
den aktuellen Umfang erfahren.
Das Erste ist ganz einfach, das Zweite hängt davon ab, was Sie damit meinen xscale
.
Der Grund, warum das erste nicht trivial ist, liegt darin, dass TikZ sich nicht die Mühe macht, den von Ihnen eingegebenen Wert zu speichern, sondern ihn einfach anwendet und dann vergisst. Sie müssen also einen Wrapper um den xscale
Schlüssel hinzufügen, der den Wert für die spätere Verwendung speichert. Hier ist ein Code dafür:
\documentclass{article}
%\url{http://tex.stackexchange.com/q/151147/86}
\usepackage{tikz}
\tikzset{
saved xscale/.initial=1,
save xscale/.style={
xscale=#1,
save the xscale=#1
},
save the xscale/.code={%
\pgfmathparse{#1 * \pgfkeysvalueof{/tikz/saved xscale}}%
\pgfkeysalso{saved xscale/.expand once=\pgfmathresult}%
}
}
\begin{document}
\begin{tikzpicture}
\begin{scope}[save xscale=2]
\node at (0,0) {\pgfkeysvalueof{/tikz/saved xscale}};
\begin{scope}[save xscale=2]
\node at (1,0) {\pgfkeysvalueof{/tikz/saved xscale}};
\end{scope}
\end{scope}
\node at (2,0) {\pgfkeysvalueof{/tikz/saved xscale}};
\end{tikzpicture}
\end{document}
(Dies ist möglicherweise nicht die eleganteste Art, dies zu erreichen.)
Die Schwierigkeiten bei der zweiten Option liegen darin, dass TikZbeliebigaffine Transformation auf Teile einer Zeichnung. Sie müssen sich also eine Bedeutung für eine beliebige affine Transformation ausdenken xscale
. Betrachten Sie die beiden folgenden Szenarien:
Sie wenden
xscale=2
eine Drehung um π/2 (gegen den Uhrzeigersinn) an. Die resultierende Matrix ist[0 -1] [2 0]
Sie wenden zuerst die Rotation an und führen dann Folgendes aus
yscale=2
. Die resultierende Matrix ist[0 -1] [2 0]
Diese beiden Operationen führen also zur gleichen Matrix. Ist diese Matrix xscale
gleich 2
oder yscale
gleich 2
? Oder sind beide 0
?
Betrachten wir nun die Rotation und dann xscale=2
. Dies ergibt:
[0 -2]
[1 0]
Sie müssen also für alle diese Szenarien entscheiden, was xscale
sein soll. Es gibt sinnvolle Definitionen, aber was genau, hängt davon ab, was Sie damit machen möchten.
Das Beste, was Sie tun können, ist also, die Matrix zu untersuchenals Ganzesund berechnen Sie eine Zahl, die für das, was Sie tun möchten, funktioniert. Da dies in der Frage jedoch nicht angegeben ist, ist eine Beantwortung nicht möglich.
Um die Einträge der Matrix selbst (also die Matrix und die Übersetzung) zu erhalten, können Sie den PGF-Befehl verwenden \pgfgettransformentries
. Dann machen Sie damit, was Sie wollen. Wenn Sie zum Beispiel wissen möchten,gesamtSkala, Sie könnten die Quadratwurzel des Absolutwerts seiner Determinante ziehen. Wenn Sie die Länge des (1,0)
letztendlich resultierenden Vektors wissen möchten, könnten Sie diese berechnen.
In Summe:
- Um die an übergebenen kumulierten Werte zu speichern
xscale
, speichern Sie sie einfach, bevor Sie sie übergeben. - Um die
xscale
aus der Transformationsmatrix zu extrahieren, verwenden Sie die PGF-Befehle für den Zugriff auf die Matrix, finden Sie heraus, was Sie mitxscale
einer beliebigen Matrix meinen, und berechnen Sie sie dann aus den abgerufenen Werten.