TikZ 환경 내에서 확장 옵션에 액세스

TikZ 환경 내에서 확장 옵션에 액세스

등에서 스케일 옵션을 사용할 때 \tikz[xscale=2]TikZ 환경 내에서 스케일 설정에 액세스할 수 있는 방법이 있습니까?

답변1

Andrew가 말했듯이 현재 범위에 현재 적용된 모든 변환을 누적한 변환 매트릭스를 사용할 수 있습니다. 관련 세부 사항은 섹션 104.2.1 및 104.2.4에 나와 있습니다.PGF 매뉴얼(v3.0.0).

\getmytransformmatrix변환 행렬의 PGF 내부 표현을 매크로 \mya, \myb, \myc, \myd, \mys및 에 저장하는 명령을 정의했습니다 \myt. 이는 좌표 변환에 해당합니다 (x,y) --> (a*x + b*y + s, c*x + d*y +t). 따라서 누적된 xscaleyscale(글로벌 CS 기준)은 각각 \mya및 에 저장됩니다 \myd. 마찬가지로 차원 xshift및 는 각각 및 yshift에 저장됩니다 .\mys\myt

이는 범위 경계/수준 전체에 걸쳐 지속되지 않으므로 \getmytransformmatrix정보를 사용하려는 모든 범위에 명령이 나타나야 합니다.

코드(간략한 그림 포함)

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

출력

여기에 이미지 설명을 입력하세요

행렬은 범위 밖에서는 "기억"되지 않으며 이는 누적된 변환( xshift=2pt원래 환경에서 )을 보여줍니다.그리고 yshift=-5pt범위에서).

추가 변수 bc다른 계산에 사용될 수 있습니다. 예를 들어 유효 회전을 계산하려면 ( atan(\myd/\mya)(-90,90) 에서만 작동함)

답변2

이에 대한 대답은 xscale. 제가 생각할 수 있는 가능성은 두 가지입니다.

  1. 를 통해 전달된 내용을 알고 싶습니다 xscale.
  2. xscale현재 범위를 알고 싶습니다 .

첫 번째는 매우 쉽고, 두 번째는 의 의미에 따라 다릅니다 xscale.

첫 번째가 사소하지 않은 이유는 TikZ가 전달한 값을 저장하지 않고 단순히 적용한 다음 잊어버리기 때문입니다. 따라서 xscale나중에 사용할 수 있도록 값을 저장하는 래퍼를 키 주위에 추가해야 합니다 . 이에 대한 몇 가지 코드는 다음과 같습니다.

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

(이것은 이것을 달성하는 가장 우아한 방법이 아닐 수도 있습니다.)

두 번째의 어려움은 TikZ가 신청할 수 있기 때문입니다.어느도면의 일부에 대한 아핀 변환. 따라서 xscale임의의 아핀 변환에 대한 의미를 생각해 내야 합니다 . 다음 두 가지 시나리오를 고려하십시오.

  1. xscale=2π/2(시계 반대 방향)의 회전을 적용한 다음 적용합니다 . 결과 행렬은 다음과 같습니다.

    [0 -1]
    [2  0]
    
  2. 먼저 회전을 적용한 다음 을 수행합니다 yscale=2. 결과 행렬은 다음과 같습니다.

    [0 -1]
    [2  0]
    

따라서 이 두 가지 연산은 동일한 행렬로 이어집니다. 해당 행렬은 xscale와 같 2거나 yscale같 습니까 2? 아니면 둘 다인가요 0?

이제 회전을 수행한 다음 을 고려하십시오 xscale=2. 결과는 다음과 같습니다.

[0 -2]
[1  0]

xscale따라서 이러한 모든 시나리오에 대해 무엇이 되어야 하는지 결정해야 합니다 . 합리적인 정의가 있지만 정확히 무엇을 원하는지에 따라 달라집니다.

따라서 당신이 할 수 있는 최선의 방법은 행렬을 조사하는 것입니다.전체적으로그리고 당신이 원하는 것이 무엇이든 작동하는 숫자를 계산합니다. 그러나 이것이 질문에 지정되지 않았기 때문에 대답하는 것은 불가능합니다.

행렬 자체의 항목(행렬 및 변환)을 얻으려면 PGF 명령을 사용할 수 있습니다 \pgfgettransformentries. 그런 다음 그들과 함께 당신이 좋아하는 일을 하십시오. 예를 들어, 내용을 알고 싶다면전반적인규모, 행렬식의 절대값의 제곱근을 취할 수 있습니다. 최종적으로 벡터의 길이를 알고 싶다면 (1,0)이를 계산할 수 있습니다.

요약하자면:

  1. 에 전달된 누적 값을 저장하려면 xscale전달하기 전에 저장하면 됩니다.
  2. 변환 행렬에서 를 추출하려면 xscale행렬에 액세스하기 위한 PGF 명령을 사용하고 임의의 행렬이 무엇을 의미하는지 파악한 xscale다음 검색된 값에서 이를 계산합니다.

관련 정보