
Cuando se utiliza la opción de escala en \tikz[xscale=2]
etc., ¿hay alguna forma de acceder a la configuración de escala desde el entorno TikZ?
Respuesta1
Como dice Andrew, puede usar la matriz de transformación, que es una acumulación de todas las transformaciones aplicadas actualmente al alcance actual. Los detalles relevantes se encuentran en las Secciones 104.2.1 y 104.2.4 de laManual PGF(v3.0.0).
Definí un comando que almacena la \getmytransformmatrix
representación interna de PGF de la matriz de transformación en las macros \mya
,,,,, y . Estos corresponden a la transformación de coordenadas . Entonces, el acumulado y (base CS global) se almacenan en y , respectivamente. De manera similar, las dimensiones y se almacenan en y , respectivamente.\myb
\myc
\myd
\mys
\myt
(x,y) --> (a*x + b*y + s, c*x + d*y +t)
xscale
yscale
\mya
\myd
xshift
yshift
\mys
\myt
Estos no son persistentes a través de los límites/niveles del ámbito, por lo que el comando \getmytransformmatrix
debe aparecer en cada ámbito en el que desee utilizar la información.
El Código (con breve ilustración)
\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}
La salida
Tenga en cuenta que la matriz no se "recuerda" fuera del alcance y que esto muestra la transformación acumulada ( xshift=2pt
del entorno originaly yshift=-5pt
del alcance).
Las variables adicionales b
y c
podrían usarse para otros cálculos; por ejemplo, para calcular la rotación efectiva ( atan(\myd/\mya)
solo funcionaría desde (-90,90)).
Respuesta2
La respuesta a esto depende de cuál sea su propósito al guardar el archivo xscale
. Hay dos posibilidades que se me ocurren:
- Quiere saber qué se pasó a través de
xscale
. - Quiere conocer
xscale
el alcance actual.
Lo primero es bastante fácil, lo segundo depende de lo que quieras decir con xscale
.
La razón por la que lo primero no es trivial es porque TikZ no se molesta en guardar el valor que pasas, simplemente lo aplica y luego lo olvida. Por lo tanto, debe agregar un contenedor alrededor de la xscale
clave que guarde el valor para su uso posterior. Aquí hay un código para eso:
\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}
(Puede que esta no sea la forma más elegante de lograrlo).
Las dificultades con el segundo se deben a que TikZ puede aplicarsecualquiertransformación afín a partes de un dibujo. Por lo tanto, debes encontrar un significado para xscale
una transformación afín arbitraria. Considere los dos escenarios siguientes:
Aplica
xscale=2
y luego aplica una rotación de π/2 (en sentido antihorario). La matriz resultante es[0 -1] [2 0]
Primero aplicas la rotación y luego lo haces
yscale=2
. La matriz resultante es[0 -1] [2 0]
Entonces estas dos operaciones conducen a la misma matriz. ¿Esa matriz tiene xscale
igual 2
o yscale
igual a 2
? ¿O son ambos 0
?
Ahora considere hacer la rotación y luego xscale=2
. Esto produce:
[0 -2]
[1 0]
Entonces, para todos estos escenarios debes decidir cuál xscale
debería ser. Existen definiciones razonables, pero exactamente cuál dependerá de lo que quieras hacer con ellas.
Por lo tanto, lo mejor que puedes hacer es examinar la matriz.como un todoy calcule algún número que funcione para lo que sea que desee hacer, pero como esto no se especifica en la pregunta, no es factible responderlo.
Para obtener las entradas de la propia matriz (bueno, la matriz y la traducción), puede utilizar el comando PGF\pgfgettransformentries
. Luego haz lo que quieras con ellos. Por ejemplo, si quieres saber elen generalescala, podrías tomar la raíz cuadrada del valor absoluto de su determinante. Si quieres saber la longitud del vector que (1,0)
finalmente se convierte, puedes calcularla.
En resumen:
- Para almacenar los valores acumulados pasados a
xscale
, simplemente guárdelos antes de pasarlos, - Para extraer
xscale
de la matriz de transformación, use los comandos PGF para acceder a la matriz, averigüe qué quiere decir conxscale
una matriz arbitraria y luego calcule a partir de los valores recuperados.