Current File : //usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformations.code.tex |
% Copyright 2018 by Till Tantau
%
% This file may be distributed and/or modified
%
% 1. under the LaTeX Project Public License and/or
% 2. under the GNU Public License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.
\ProvidesFileRCS{pgfcoretransformations.code.tex}
% Position transformations
\newdimen\pgf@pt@x
\newdimen\pgf@pt@y
\newdimen\pgf@pt@temp
\newif\ifpgf@pt@identity
\pgf@pt@identitytrue
\def\pgf@pt@aa{1.0} \def\pgf@pt@ab{0.0}
\def\pgf@pt@ba{0.0} \def\pgf@pt@bb{1.0}
% Store the current transformation matrix in a macro.
%
% #1 = macro name
%
% Example:
%
% \pgfgettransform\mytransform
\def\pgfgettransform#1{%
\edef#1{{\pgf@pt@aa}{\pgf@pt@ab}{\pgf@pt@ba}{\pgf@pt@bb}{\the\pgf@pt@x}{\the\pgf@pt@y}}%
}
% Store the current transformation matrix in a set of macros, one for
% each single entry.
%
% #1-#4 are macro which store the matrix entries (0,0), (0,1), (1,0),
% (1,1) (in this order). It is the same order as for \pgftransformcm.
%
% #5 is a macro which will be filled with the x shift and
% #6 is a macro which will be filled with the y shift.
%
% Example:
% \pgfgettransform\aa\ab\ba\bb\shiftx\shifty
%
% ->
%
% \pgftransformcm\aa\ab\ba\bb{\pgfqpoint{\shiftx}{\shifty}}
%
% or
%
% \pgfsettransformentries\aa\ab\ba\bb\shiftx\shifty
\def\pgfgettransformentries#1#2#3#4#5#6{%
\edef#1{\pgf@pt@aa}%
\edef#2{\pgf@pt@ab}% attention: this is (1,0), i.e. the point which is usually labelled 'ba'!
\edef#3{\pgf@pt@ba}% attention: this is (0,1), i.e. the point which is usually labelled 'ab'!
\edef#4{\pgf@pt@bb}%
\edef#5{\the\pgf@pt@x}%
\edef#6{\the\pgf@pt@y}%
}%
\def\pgfsettransformentries#1#2#3#4#5#6{%
\pgfsettransform{{#1}{#2}{#3}{#4}{#5}{#6}}%
}%
% Restore the current transformation matrix from a macro.
%
% #1 = macro name, previously used with \pgfgettransform
%
% Example:
%
% \pgfsettransform\mytransform
\def\pgfsettransform#1{%
\edef\pgf@temp{#1}%
\expandafter\pgf@settransform\pgf@temp%
}
\def\pgf@settransform#1#2#3#4#5#6{%
\def\pgf@pt@aa{#1}%
\def\pgf@pt@ab{#2}%
\def\pgf@pt@ba{#3}%
\def\pgf@pt@bb{#4}%
\pgf@pt@x=#5%
\pgf@pt@y=#6%
\edef\pgf@idtest{#1,#2,#3,#4}%
\ifx\pgf@idtest\pgf@idmatrixtext%
\pgf@pt@identitytrue%
\else%
\pgf@pt@identityfalse%
\fi%
}
\def\pgf@idmatrixtext{1.0,0.0,0.0,1.0}
\def\pgf@zerozerotext{0.0,0.0}
\def\pgf@one@text{1.0}
\def\pgf@zero@text{0.0}
% Transformation command
%
% #1 = x dimension
% #2 = y dimension
%
% Description:
%
% Applies the pgfs transformation matrix to the point (#1,#2). The
% result is once more stored in the point.
%
%
% Example:
%
% \pgf@pos@transform{\pgf@x}{\pgf@y}
\def\pgf@pos@transform#1#2{%
\ifpgf@pt@identity%
\else%
\pgf@pt@temp=#1%
#1=\pgf@pt@aa#1%
\advance#1 by\pgf@pt@ba#2%
#2=\pgf@pt@bb#2%
\advance#2 by\pgf@pt@ab\pgf@pt@temp%
\fi%
\advance#1 by\pgf@pt@x%
\advance#2 by\pgf@pt@y%
}
\def\pgf@pos@transform@glob{%
\ifpgf@pt@identity%
\else%
\pgf@pt@temp=\pgf@x%
\global\pgf@x=\pgf@pt@aa\pgf@x%
\global\advance\pgf@x by\pgf@pt@ba\pgf@y%
\global\pgf@y=\pgf@pt@bb\pgf@y%
\global\advance\pgf@y by\pgf@pt@ab\pgf@pt@temp%
\fi%
\global\advance\pgf@x by\pgf@pt@x%
\global\advance\pgf@y by\pgf@pt@y%
}
% Invert the current transformation matrix
%
% Description:
%
% This command replaces the current transformation matrix by its
% inverse. The inversion is not very exact if the matrix is nearly
% singular.
%
% Example:
%
% \pgftransforminvert
\def\pgftransforminvert{%
% First, invert the shift. That's easy
\pgf@pt@x=-\pgf@pt@x
\pgf@pt@y=-\pgf@pt@y
\ifpgf@pt@identity%
\else%
% Sigh. Have to calculate the inverse of the matrix.
% Perhaps we are lucky and ba and bb are zero?
\edef\pgf@zerotest{\pgf@pt@ab,\pgf@pt@ba}%
\ifx\pgf@zerotest\pgf@zerozerotext%
% Ha! Just invert aa and bb
\pgfmathreciprocal@{\pgf@pt@aa}%
\let\pgf@pt@aa\pgfmathresult%
\pgfmathreciprocal@{\pgf@pt@bb}%
\let\pgf@pt@bb\pgfmathresult%
\else%
% Start with determinant
% Matrix = (aa ab
% ba bb)
{%
\pgfutil@tempdima=\pgf@pt@aa pt%
\pgfutil@tempdima=\pgf@pt@bb\pgfutil@tempdima% aa * bb
\pgfutil@tempdimb=\pgf@pt@ba pt%
\pgfutil@tempdimb=\pgf@pt@ab\pgfutil@tempdimb% ba * ab
\advance\pgfutil@tempdima by -\pgfutil@tempdimb% aa*bb - ba*ab
% Invert
\pgfmathreciprocal@{\pgf@sys@tonumber{\pgfutil@tempdima}}%
\pgfutil@tempdima=\pgfmathresult pt%
\pgf@x=\pgf@pt@bb\pgfutil@tempdima% bb/(det A)
\xdef\pgf@new@pt@aa{\pgf@sys@tonumber{\pgf@x}}%
\pgf@x=\pgf@pt@aa\pgfutil@tempdima% aa/(det A)
\xdef\pgf@new@pt@bb{\pgf@sys@tonumber{\pgf@x}}%
\pgfutil@tempdima=-\pgfutil@tempdima%
\pgf@x=\pgf@pt@ba\pgfutil@tempdima% -ba/(det A)
\xdef\pgf@new@pt@ba{\pgf@sys@tonumber{\pgf@x}}%
\pgf@x=\pgf@pt@ab\pgfutil@tempdima% -ab/(det A)
\xdef\pgf@new@pt@ab{\pgf@sys@tonumber{\pgf@x}}%
}%
\let\pgf@pt@aa\pgf@new@pt@aa%
\let\pgf@pt@ab\pgf@new@pt@ab%
\let\pgf@pt@ba\pgf@new@pt@ba%
\let\pgf@pt@bb\pgf@new@pt@bb%
\fi%
\pgf@pt@temp=\pgf@pt@x%
\pgf@pt@x=\pgf@pt@aa\pgf@pt@x%
\advance\pgf@pt@x by\pgf@pt@ba\pgf@pt@y%
\pgf@pt@y=\pgf@pt@bb\pgf@pt@y%
\advance\pgf@pt@y by\pgf@pt@ab\pgf@pt@temp%
\fi%
}
% PGF-Level concatenation of the transformation matrix with a given
% matrix.
%
% #1 - #5 = a concatenation matrix (see pdf spec). Entry #5 is a
% translation point.
%
% Description:
%
% All coordinates given to subsequent path construction commands will
% be transformed additionally by the given transformation matrix. If
% the command is followed by a 6th argument, the transformation is
% only applied to this argument.
%
%
% Example:
%
% \pgftransformcm{1}{0}{0}{1}{\pgfpoint{100pt}{0pt}} % 100pt to the right.
%
% \pgftransformcm{2}{0}{0}{2}{\pgfpointorigin} % double in size
% \pgfpathmoveto{\pgfpoint{0cm}{0cm}}
% \pgfpathlineto{\pgflineto{1cm}{1cm}} % actually 2cm/2cm
\def\pgftransformcm#1#2#3#4#5{%
\edef\pgf@marshal{\noexpand\pgf@transformcm{#1}{#2}{#3}{#4}}%
\pgf@marshal{#5}%
}
\def\pgf@transformcm#1#2#3#4#5{%
{%
\pgf@process{#5}%
\pgf@xc=\pgf@x%
\pgf@yc=\pgf@y%
%
\pgfmathsetlength\pgf@x{#1}%
\pgfmathsetlength\pgf@y{#2}%
%
\pgf@xa=\pgf@pt@aa\pgf@x%
\advance\pgf@xa by \pgf@pt@ba\pgf@y%
%
\pgf@ya=\pgf@pt@ab\pgf@x%
\advance\pgf@ya by \pgf@pt@bb\pgf@y%
%
\pgfmathsetlength\pgf@x{#3}%
\pgfmathsetlength\pgf@y{#4}%
%
\pgf@xb=\pgf@pt@aa\pgf@x%
\advance\pgf@xb by \pgf@pt@ba\pgf@y%
%
\pgf@yb=\pgf@pt@ab\pgf@x%
\advance\pgf@yb by \pgf@pt@bb\pgf@y%
%
\pgf@x=\pgf@pt@aa\pgf@xc%
\advance\pgf@x by\pgf@pt@ba\pgf@yc%
\advance\pgf@x by\pgf@pt@x%
%
\pgf@y=\pgf@pt@ab\pgf@xc%
\advance\pgf@y by\pgf@pt@bb\pgf@yc%
\advance\pgf@y by\pgf@pt@y%
%
\global\pgf@x=\pgf@x%
\global\pgf@y=\pgf@y%
\xdef\pgf@tempaa{\pgf@sys@tonumber{\pgf@xa}}%
\xdef\pgf@tempab{\pgf@sys@tonumber{\pgf@ya}}%
\xdef\pgf@tempba{\pgf@sys@tonumber{\pgf@xb}}%
\xdef\pgf@tempbb{\pgf@sys@tonumber{\pgf@yb}}%
}%
\pgf@pt@x=\pgf@x%
\pgf@pt@y=\pgf@y%
\let\pgf@pt@aa=\pgf@tempaa%
\let\pgf@pt@ba=\pgf@tempba%
\let\pgf@pt@ab=\pgf@tempab%
\let\pgf@pt@bb=\pgf@tempbb%
\edef\pgf@idtest{\pgf@pt@aa,\pgf@pt@ba,\pgf@pt@ab,\pgf@pt@bb}%
\ifx\pgf@idtest\pgf@idmatrixtext%
\pgf@pt@identitytrue%
\else%
\pgf@pt@identityfalse%
\fi%
}
% Transformation into a given triangle. The three corners of the
% triangle are called "origin", "x" and "y" are given. After this
% transformation has been applied, the canvas origin is at "origin",
% the vector (1pt,0pt) lies at "x" and the vector (0pt,1pt) lies at
% "y".
%
% #1 = origin
% #2 = x
% #3 = y
%
% Example:
%
% \pgftransformtriangle{\pgfpointorigin}{\pgfpoint{1cm}{1cm}}{\pgfpoint{-1cm}{1cm}}
\def\pgftransformtriangle#1#2#3{%
\pgf@process{#2}%
\pgf@xa=\pgf@x%
\pgf@ya=\pgf@y%
\pgf@process{#3}%
\pgf@xb=\pgf@x%
\pgf@yb=\pgf@y%
\pgf@process{#1}%
\advance\pgf@xa by-\pgf@x%
\advance\pgf@ya by-\pgf@y%
\advance\pgf@xb by-\pgf@x%
\advance\pgf@yb by-\pgf@y%
\pgftransformcm%
{\pgf@sys@tonumber\pgf@xa}{\pgf@sys@tonumber\pgf@ya}%
{\pgf@sys@tonumber\pgf@xb}{\pgf@sys@tonumber\pgf@yb}%
{\pgfpoint{\pgf@x}{\pgf@y}}%
}
% Undo all transformations
%
% Example:
%
% \pgftansformreset
\def\pgftransformreset{%
\pgf@pt@x=0pt%
\pgf@pt@y=0pt%
\let\pgf@pt@aa\pgf@one@text%
\let\pgf@pt@ba\pgf@zero@text%
\let\pgf@pt@ab\pgf@zero@text%
\let\pgf@pt@bb\pgf@one@text%
\pgf@pt@identitytrue%
}
% Undo all slanting/rotation, but not translations
%
% Example:
%
% \pgftansformreset
\def\pgftransformresetnontranslations{%
\let\pgf@pt@aa\pgf@one@text%
\let\pgf@pt@ba\pgf@zero@text%
\let\pgf@pt@ab\pgf@zero@text%
\let\pgf@pt@bb\pgf@one@text%
\pgf@pt@identitytrue%
}
% Shifting command and environment
%
% #1 = vector by which all subsequent points should be moved.
%
% Example:
%
% \pgftansformshift{\pgfpoint{1cm}{1cm}}
\def\pgftransformshift#1{\pgftransformcm{1}{0}{0}{1}{#1}}
\def\pgftransformxshift#1{\pgftransformcm{1}{0}{0}{1}{\pgfpoint{#1}{+0pt}}}
\def\pgftransformyshift#1{\pgftransformcm{1}{0}{0}{1}{\pgfpoint{+0pt}{#1}}}
% Scaling commands
%
% #1 = scaling for all subsequent points.
%
% Example:
%
% \pgftransformscale{2}
% \pgftransformxscale{2}
% \pgftransformyscale{2}
\def\pgftransformscale#1{\pgftransformcm{#1}{0}{0}{#1}{\pgfpointorigin}}
\def\pgftransformxscale#1{\pgftransformcm{#1}{0}{0}{1.0}{\pgfpointorigin}}
\def\pgftransformyscale#1{\pgftransformcm{1.0}{0}{0}{#1}{\pgfpointorigin}}
% Slanting commands
%
% #1 = slanting in x-direction. 1 means 45 degrees.
%
% Example:
%
% \pgftransformxslant{2}
% \pgftransformyslant{2}
\def\pgftransformxslant#1{\pgftransformcm{1.0}{0}{#1}{1.0}{\pgfpointorigin}}
\def\pgftransformyslant#1{\pgftransformcm{1.0}{#1}{0}{1.0}{\pgfpointorigin}}
% Rotation commands
%
% #1 = degrees for the rotation
%
% Example:
%
% \pgftransformrotate{30}
\def\pgftransformrotate#1{%
\pgfmathparse{#1}%
\let\pgftransform@angle=\pgfmathresult%
\pgfmathsin@{\pgftransform@angle}%
\let\pgftransform@sin=\pgfmathresult%
\pgfmathcos@{\pgftransform@angle}%
\let\pgftransform@cos=\pgfmathresult%
\pgf@x=\pgftransform@sin pt%
\pgf@xa=-\pgf@x%
\pgftransformcm{\pgftransform@cos}{\pgftransform@sin}{\pgf@sys@tonumber{\pgf@xa}}{\pgftransform@cos}{\pgfpointorigin}%
}
% The following if's have the following effect:
%
% \ifpgfslopedattime decides whether the coordinate system of an
% xxxattime transformation command should be rotated such that text
% drawn on the line should be tangent to the line
%
% \ifpgfallowupsidedowattime decides whether the transformation should
% be done in such a way that the text is always ``upright,'' that is,
% text drawn in this coordinate system is never upside-down.
%
% \ifpgfresetnontranslationattime decides whether the coordinate
% system of an xxxattime transformation command should be reset
% (concerning the non-translations) before a possible rotation is
% applied. This is useful, for example, if the main coordinate system
% is scaled by, say, a factor of 2 and you do not want that to apply
% to the text, but you do want the rotation to apply.
\newif\ifpgfslopedattime
\newif\ifpgfallowupsidedownattime
\newif\ifpgfresetnontranslationattime
% Transform to the coordinate system of a point on a line
%
% #1 = a time fraction of line where to put the label, where 0 means start,
% 1 means end, and for example 0.5 means the middle.
% #2 = start of line
% #3 = end of line
%
% Example:
%
% {
% \pgftransformlineattime{.5}{\pgfxy(0,0)}{\pgfxy(3,2)}
% \pgftext{Hi!}
% }
%
% {
% \pgftransformlineattime{.75}{\pgfxy(0,0)}{\pgfxy(3,2)}
% \pgftransformresetnontranslations
% \pgftext{Hi!}
% }
%
\def\pgftransformlineattime#1#2#3{%
\pgf@process{#2}%
\pgf@xb=\pgf@x% xb/yb = start point
\pgf@yb=\pgf@y%
\pgf@process{#3}%
\pgf@xc=\pgf@x% xc/yc = end point
\pgf@yc=\pgf@y%
\pgftransformshift{\pgfpointlineattime{#1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}%
\ifpgfresetnontranslationattime%
\pgftransformresetnontranslations%
\fi%
\ifpgfslopedattime%
\advance\pgf@xc by-\pgf@xb%
\advance\pgf@yc by-\pgf@yb%
\ifpgfallowupsidedownattime%
\else%
\ifdim\pgf@xc<0pt%
\pgf@xc=-\pgf@xc%
\pgf@yc=-\pgf@yc%
\fi%
\fi%
\pgf@x=\pgf@xc%
\pgf@y=\pgf@yc%
\pgfpointnormalised{}% x/y = normalised vector
\pgf@ya=-\pgf@y%
\pgftransformcm%
{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
\fi%
}
% Transform to the coordinate system of a point on an arc
%
% #1 = a time fraction of line where to put the label, where 0 means start,
% 1 means end, and for example 0.5 means the middle.
% #2 = center of an ellipse
% #3 = 0-degree axis of the ellipse
% #4 = 90-degree axis of the ellipse
% #4 = start angle of the arc on this ellipse
% #5 = end angle of the arc on this ellipse
%
% Example:
%
% {
% \pgftransformlineattime{.5}{\pgfpoint{1cm}{1cm}}{\pgfpoint{1cm}{0cm}}{\pgfpoint{0cm}{1cm}}{30}{40}
% \pgftext{Hi!}
% }
\def\pgftransformarcaxesattime#1#2#3#4#5#6{%
\pgfpointarcaxesattime{#1}{#2}{#3}{#4}{#5}{#6}%
\pgftransformshift{\pgfqpoint{\pgf@x}{\pgf@y}}%
\ifpgfresetnontranslationattime%
\pgftransformresetnontranslations%
\fi%
\ifpgfslopedattime%
\pgf@x=\pgf@xa%
\pgf@y=\pgf@ya%
\pgf@process{\pgfpointnormalised{}}%
\ifpgfallowupsidedownattime%
\else%
\ifdim\pgf@x<0pt%
\pgf@x=-\pgf@x%
\pgf@y=-\pgf@y%
\fi%
\fi%
\pgf@ya=-\pgf@y%
\pgftransformcm%
{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
\fi%
}
% Transform to the coordinate system of a point on a curve
%
% #1 = a time fraction of line where to put the label, where 0 means start,
% 1 means end, and for example 0.5 means the middle.
% #2 = start of line
% #3 = first control
% #4 = second control
% #5 = end of line
%
% Example:
%
% {
% \pgftransformcurveattime{.5}{\pgfxy(0,0)}{\pgfxy(3,2)}
% \pgftext{Hi!}
% }
%
% {
% \pgftransformcurveattime{.75}{\pgfxy(0,0)}{\pgfxy(3,2)}
% \pgftransformresetnontranslations
% \pgftext{Hi!}
% }
%
\def\pgftransformcurveattime#1#2#3#4#5{%
\pgfpointcurveattime{#1}{#2}{#3}{#4}{#5}%
\pgftransformshift{\pgfqpoint{\pgf@x}{\pgf@y}}%
\ifpgfresetnontranslationattime%
\pgftransformresetnontranslations%
\fi%
\ifpgfslopedattime%
\pgf@x=\pgf@xa%
\pgf@y=\pgf@ya%
\advance\pgf@x by-\pgf@xb%
\advance\pgf@y by-\pgf@yb%
\ifpgfallowupsidedownattime%
\else%
\ifdim\pgf@x<0pt%
\pgf@x=-\pgf@x%
\pgf@y=-\pgf@y%
\fi%
\fi%
\pgfpointnormalised{}% x/y = normalised vector
\pgf@ya=-\pgf@y%
\pgftransformcm%
{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
\fi%
}
% Transform to the coordinate system of an arrow at the end of the
% line going from point #1 to point #2 with the correct rotation.
%
% #1 = a start point an (invisible) line
% #2 = an end point an (invisible) line
%
% Example:
%
% \pgftransformarrow{\pgfpointorigin}{\pgfpoint{1cm}{0cm}}
\def\pgftransformarrow#1#2{%
\pgf@process{#2}%
\pgftransformshift{}%
\pgf@xa=\pgf@x%
\pgf@ya=\pgf@y%
\pgf@process{#1}%
\advance\pgf@xa by-\pgf@x%
\advance\pgf@ya by-\pgf@y%
\pgf@x=\pgf@xa%
\pgf@y=\pgf@ya%
\pgfpointnormalised{}%
\pgf@ya=-\pgf@y%
\pgftransformcm%
{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfqpoint{0pt}{0pt}}%
}
% Computes transformations adjustments for the current transformation
% matrix
%
% Description:
%
% This command is used when you install a transformation matrix that
% scales everything by a certain factor, but you still wish to draw
% something with "an absolute size". Suppose for instance that you
% install a transformation matrix that scales everything by a factor
% of 4 and you now wish to draw a horizontal line of length 1cm. Then,
% if you do not reset the transformation matrix, you can draw a line
% of logical length 2.5mm, which will then get scaled to a line of
% 1cm.
%
% Things get more difficult in case you scale things only, say,
% vertically. In this case, the adjustment necessary for horizontal
% lines is different from the one needed for vertical lines.
%
% This function computes the necessary scaling factors and puts them
% in the macros \pgfhorizontaltransformationadjustment and
% \pgfverticaltransformationadjustment.
%
% Note that the "right" way to draw a line of absolute length 1cm in a
% transformed coordinate system is to first compute the start point
% and to then reset the transformation matrix. The transformation
% adjustments computed here are important only in situations where you
% cannot do this, for instance when an "outer xsep" must be set.
\def\pgftransformationadjustments{%
\ifpgf@pt@identity%
\let\pgfhorizontaltransformationadjustment\pgf@one@text%
\let\pgfverticaltransformationadjustment\pgf@one@text%
\else%
{%
\pgf@pt@x0pt%
\pgf@pt@y0pt%
\pgfpointtransformed{\pgfqpoint{1pt}{0pt}}%
\pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
\pgfmathreciprocal@{\pgfmathresult}%
\global\let\pgf@temp@hori\pgfmathresult
\pgfpointtransformed{\pgfqpoint{0pt}{1pt}}%
\pgfmathveclen@{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}%
\pgfmathreciprocal@{\pgfmathresult}%
\global\let\pgf@temp@vert\pgfmathresult
\xdef\pgf@marshal@b{\def\noexpand\pgfverticaltransformationadjustment{\pgfmathresult}}
}%
\let\pgfhorizontaltransformationadjustment\pgf@temp@hori%
\let\pgfverticaltransformationadjustment\pgf@temp@vert%
\fi%
}
\let\pgfhorizontaltransformationadjustment\pgf@one@text
\let\pgfverticaltransformationadjustment\pgf@one@text
% Low-level transformations
% Causes the current high-level transformation command to be applied
% to the low-level.
%
% Description:
%
% All subsequent drawing will be transformed additionally by the
% current high-level transformation. Thus, the high-level
% transformation becomes the low-level transformation. The high-level
% transformation is reset at this point.
\def\pgflowlevelsynccm{%
\pgfsys@transformcm%
{\pgf@pt@aa}{\pgf@pt@ab}%
{\pgf@pt@ba}{\pgf@pt@bb}%
{\pgf@pt@x}{\pgf@pt@y}%
\pgftransformreset%
\pgf@relevantforpicturesizefalse%
}
% Causes a transformation command to be applied to the ``lowlevel''
% transformation matrix.
%
% #1 - a high-level transformation command
%
% Description:
%
% All subsequent drawing will be transformed additionally by the given
% transformation matrix. Note that PGF will no longer be able to
% ``keep track'' of the coordinates. Also, transformations are applied
% to *everything*, including line thickness and line endings. Most
% often, this is not desirable.
%
% Example:
%
% \pgflowlevel{\pgftransformcm{1}{0}{0}{1}{\pgfpoint{100pt}{0pt}}} % 100bp to the right.
%
% \begin{pgflowlevelscope}{\pgftransformcm{2}{0}{0}{2}{\pgfpointorigin}} % double in size
% \pgfmoveto{\pgfpoint{0cm}{0cm}}
% \pgflineto{\pgflineto{1cm}{1cm}} % actually 2cm/2cm
% \end{pgflowlevelscope}
\def\pgflowlevel#1{%
{%
\pgftransformreset%
#1%
\pgflowlevelsynccm%
}%
\pgf@relevantforpicturesizefalse%
}
\def\pgflowlevelscope#1{\pgfscope\pgflowlevel{#1}}
\def\endpgflowlevelscope{\endpgfscope}
\long\def\pgflowlevelobj#1#2{\pgfscope{\pgflowlevel{#1}#2}\endpgfscope}
% View boxes
% Establishes a view box scope
%
% #1 and #2 = two opposite corners of the source rectangle
% #3 and #4 = two opposite corners of the target rectangle
% #5 = "meet" or "slice"
%
% Description:
%
% Inside the viewbox scope, the source rectangle will be translated
% and scaled so that it becomes centered on the target rectangle and
% will, for "meet", be as large as possible so that it fits inside the
% target and, for "slice", be as small as possible so that it
% encompasses the target.
\def\pgfviewboxscope#1#2#3#4#5{%
{% Compute rectangle corners
\pgf@process{#1}%
\pgf@pos@transform@glob
\pgf@xa=\pgf@x%
\pgf@ya=\pgf@y%
\pgf@process{#2}%
\pgf@pos@transform@glob
\ifdim\pgf@x<\pgf@xa%
\pgf@xb\pgf@x%
\pgf@xc\pgf@xa%
\else%
\pgf@xb\pgf@xa%
\pgf@xc\pgf@x%
\fi%
\ifdim\pgf@y<\pgf@ya%
\pgf@yb\pgf@y%
\pgf@yc\pgf@ya%
\else%
\pgf@yb\pgf@ya%
\pgf@yc\pgf@y%
\fi%
\pgf@process{#3}%
\pgf@pos@transform@glob
\pgf@xa=\pgf@x%
\pgf@ya=\pgf@y%
\pgf@process{#4}%
\pgf@pos@transform@glob
\ifdim\pgf@x<\pgf@xa%
\else%
\pgfutil@tempdima\pgf@x
\pgf@x\pgf@xa%
\pgf@xa\pgfutil@tempdima%
\fi%
\ifdim\pgf@y<\pgf@ya%
\else%
\pgfutil@tempdima\pgf@y
\pgf@y\pgf@ya%
\pgf@ya\pgfutil@tempdima%
\fi%
\pgfusetype{.view}%
\edef\pgf@marshal{\expandafter\noexpand\csname pgfsys@viewbox#5\endcsname{\the\pgf@x}{\the\pgf@y}{\the\pgf@xa}{\the\pgf@ya}{\the\pgf@xb}{\the\pgf@yb}{\the\pgf@xc}{\the\pgf@yc}}%
\pgf@marshal%
}%
\pgf@relevantforpicturesizefalse%
}
\def\endpgfviewboxscope{\pgfsys@endviewbox}
\let\startpgfviewboxscope=\pgfviewboxscope
\let\stoppgfviewboxscope=\endpgfviewboxscope
% Forward declarations for nonlinear stuff (have no effect till module
% nonlineartransformations is loaded)
\let\pgfapproximatenonlineartranslation\relax
\let\pgfapproximatenonlineartransformation\relax
\def\pgftransformnonlinear#1{\pgferror{You need to say
\string\usepgfmodule{nonlineartransformations} to use nonlinear transformations}}
\endinput