%PDF- %PDF-
| Direktori : /proc/self/root/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/ |
| Current File : //proc/self/root/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.tex |
% Copyright 2006 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 $Header: /cvsroot/pgf/pgf/generic/pgf/basiclayer/pgfcorescopes.code.tex,v 1.34 2010/09/08 15:07:18 tantau Exp $
% Globals
\newbox\pgfpic
\newbox\pgf@hbox
\newbox\pgf@layerbox@main
\newcount\pgf@picture@serial@count
% This if decides whether the position of pictures on the page is
% protocolled or not. Normally,
% this is switched off as it works only with certain drivers and it
% causes external files to be written. When switched on, the position
% of pgfpictures are protocolled and can be referenced using
% \pgfsys@getposition{XXX} where XXX is the value of \pgfpictureid
% inside the picture.
\newif\ifpgfrememberpicturepositiononpage
% Scopes
% Pgf scope environment. All changes of the graphic state are local to
% the scope.
%
% Example:
%
% \begin{pgfscope}
% \pgfsetlinewidth{3pt}
% \pgfline{\pgfxy(0,0)}{\pgfxy(3,3)}
% \end{pgfscope}
\def\pgfscope{%
\pgfsyssoftpath@setcurrentpath\pgfutil@empty%
\pgfsys@beginscope%
\pgf@resetpathsizes%
\edef\pgfscope@linewidth{\the\pgflinewidth}%
\begingroup}
\def\endpgfscope{%
\endgroup%
\global\pgflinewidth=\pgfscope@linewidth%
\pgfsys@endscope}
% Quickly insert a box can contain normal TeX text at the origin.
%
% #1 = box of width/height and depth 0pt
%
% Example:
%
% \pgfqbox{\mybox}
\def\pgfqbox#1{%
\pgfsys@hbox#1%
}
% Insert a box that can contain normal TeX text at the origin, but
% with the current coordinate transformation matrix synced with the
% low-level transformation matrix.
%
% #1 = box of width/height and depth 0pt
%
% In essence, this command does the same as if you first said
% \pgflowlevelsynccm and then \pgfqbox. However, pgf will use a
% ``TeX-translation'' for the translation part of the transformation
% cm. This will ensure that hyperlinks ``survive'' at least
% translations.
%
% Example:
%
% \pgfqboxsynced{\mybox}
\def\pgfqboxsynced#1{%
\pgfsys@hboxsynced#1%
}
% Puts some text in a box and inserts it with the current
% transformations applied.
%
% #1 = List of optional positioning. Possible values are ``left'', ``right'',
% ``top'', ``bottom'' and ``base''.
% #2 = TeX text. May contain verbatims.
%
% Example:
%
% \pgftransformshift{\pgfpoint{1cm}{0cm}}
% \pgftext{Hello World!}
\def\pgftext{\pgfutil@ifnextchar[\pgf@text{\pgf@text[]}}%
\def\pgf@text[#1]{%
\def\pgf@text@options{#1}%
\pgf@maketext\pgf@after@text}
\def\pgf@after@text{%
{%
\def\pgf@text@hshift{center}%
\def\pgf@text@vshift{center}%
\expandafter\pgf@text@setkeys\expandafter{\pgf@text@options}%
\csname pgf@halign\pgf@text@hshift\endcsname%
\csname pgf@valign\pgf@text@vshift\endcsname%
% Protocol sizes:
\pgf@process{\pgfpointtransformed{\pgfqpoint{0pt}{\dp\pgf@hbox}}}%
\pgf@protocolsizes{\pgf@x}{\pgf@y}%
\pgf@process{\pgfpointtransformed{\pgfqpoint{\wd\pgf@hbox}{\dp\pgf@hbox}}}%
\pgf@protocolsizes{\pgf@x}{\pgf@y}%
\pgf@process{\pgfpointtransformed{\pgfqpoint{0pt}{\ht\pgf@hbox}}}%
\pgf@protocolsizes{\pgf@x}{\pgf@y}%
\pgf@process{\pgfpointtransformed{\pgfqpoint{\wd\pgf@hbox}{\ht\pgf@hbox}}}%
\pgf@protocolsizes{\pgf@x}{\pgf@y}%
\pgfqboxsynced{\pgf@hbox}%
}%
}
\def\pgf@text@setkeys{\pgfqkeys{/pgf/text}}%
\pgfkeys{/pgf/text/left/.code=\def\pgf@text@hshift{left}}
\pgfkeys{/pgf/text/center/.code=}
\pgfkeys{/pgf/text/right/.code=\def\pgf@text@hshift{right}}
\pgfkeys{/pgf/text/top/.code=\def\pgf@text@vshift{top}}
\pgfkeys{/pgf/text/bottom/.code=\def\pgf@text@vshift{bottom}}
\pgfkeys{/pgf/text/base/.code=\def\pgf@text@vshift{base}}
\pgfkeys{/pgf/text/at/.cd,.code=\pgftransformshift{#1},.value required}
\pgfkeys{/pgf/text/x/.cd,.code=\pgftransformxshift{#1},.value required}
\pgfkeys{/pgf/text/y/.cd,.code=\pgftransformyshift{#1},.value required}
\pgfkeys{/pgf/text/rotate/.cd,.code=\pgftransformrotate{#1},.value required}
\def\pgf@halignleft{}% do nothing
\def\pgf@haligncenter{\pgftransformxshift{+-.5\wd\pgf@hbox}}
\def\pgf@halignright{\pgftransformxshift{+-\wd\pgf@hbox}}%
\def\pgf@valignbase{}% do nothing
\def\pgf@valignbottom{\pgftransformyshift{+\dp\pgf@hbox}}%
\def\pgf@valigncenter{\pgftransformyshift{+.5\dp\pgf@hbox}\pgftransformyshift{+-.5\ht\pgf@hbox}}%
\def\pgf@valigntop{\pgftransformyshift{+-\ht\pgf@hbox}}%
% Internal function for creating a hbox.
\def\pgf@maketext#1{%
\def\pgf@@maketextafter{#1}%
\setbox\pgf@hbox=\hbox\bgroup%
\pgfinterruptpicture%
\bgroup%
\aftergroup\pgf@collectresetcolor%
\let\next=%
}
\def\pgf@collectresetcolor{%
\pgfutil@ifnextchar\reset@color%
{\reset@color\afterassignment\pgf@collectresetcolor\let\pgf@temp=}%
{\pgf@textdone}%
}
\def\pgf@textdone{%
\endpgfinterruptpicture%
\egroup%
\pgf@@maketextafter%
}
\long\def\pgf@makehbox#1{%
\setbox\pgf@hbox=\hbox{{%
\pgfinterruptpicture%
#1%
\endpgfinterruptpicture%
}}}
% Picture environment
%
% Example:
%
% \begin{pgfpicture}
% \pgfsetendarrow{\pgfarrowto}
% \pgfpathmoveto{\pgfpointxy{-0.9}{0.2}}
% \pgfpathlineto{\pgfpointxy{0.9}{0.4}}
% \pgfusepath{stroke}
% \end{pgfpicture}
\newif\ifpgfpicture
\def\pgfresetboundingbox{%
\global\pgf@picmaxx=-16000pt\relax%
\global\pgf@picminx=16000pt\relax%
\global\pgf@picmaxy=-16000pt\relax%
\global\pgf@picminy=16000pt\relax%
}%
\def\pgfpicture{%
\begingroup%
\pgfpicturetrue%
\global\advance\pgf@picture@serial@count by1\relax%
\edef\pgfpictureid{pgfid\the\pgf@picture@serial@count}%
\let\pgf@nodecallback=\pgfutil@gobble%
\pgf@picmaxx=-16000pt\relax%
\pgf@picminx=16000pt\relax%
\pgf@picmaxy=-16000pt\relax%
\pgf@picminy=16000pt\relax%
\pgf@relevantforpicturesizetrue%
\pgf@resetpathsizes%
\pgfutil@ifnextchar\bgroup\pgf@oldpicture\pgf@picture}
\def\pgf@oldpicture#1#2#3#4{%
\pgfmathsetlength\pgf@picminx{#1}%
\pgfmathsetlength\pgf@picminy{#2}%
\pgfmathsetlength\pgf@picmaxx{#3}%
\pgfmathsetlength\pgf@picmaxy{#4}%
\pgf@relevantforpicturesizefalse%
\pgf@picture}
\def\pgf@picture{%
\setbox\pgfpic\hbox to0pt\bgroup%
\begingroup%
\pgfsys@beginpicture%
\pgfsys@beginscope%
\begingroup%
\pgfsetcolor{.}%
\pgfsetlinewidth{0.4pt}%
\pgftransformreset%
\pgfsyssoftpath@setcurrentpath\pgfutil@empty%
\begingroup%
\let\pgf@setlengthorig=\setlength%
\let\pgf@addtolengthorig=\addtolength%
\let\pgf@selectfontorig=\selectfont%
\let\setlength=\pgf@setlength%
\let\addtolength=\pgf@addtolength%
\let\selectfont=\pgf@selectfont%
\nullfont\spaceskip0pt\xspaceskip0pt%
\setbox\pgf@layerbox@main\hbox to0pt\bgroup%
\begingroup%
}
\def\endpgfpicture{%
\ifpgfrememberpicturepositiononpage%
\hbox to0pt{\pgfsys@markposition{\pgfpictureid}}%
\fi%
% ok, now let's position the box
\ifdim\pgf@picmaxx=-16000pt\relax%
% empty picture. make size 0.
\global\pgf@picmaxx=0pt\relax%
\global\pgf@picminx=0pt\relax%
\global\pgf@picmaxy=0pt\relax%
\global\pgf@picminy=0pt\relax%
\fi%
% Shift baseline outside:
\pgf@relevantforpicturesizefalse%
\pgf@process{\pgf@baseline}%
\xdef\pgf@shift@baseline{\the\pgf@y}%
%
\pgf@process{\pgf@trimleft}%
\global\advance\pgf@x by-\pgf@picminx
% prepare \hskip\pgf@trimleft@final.
% note that \pgf@trimleft@final is also queried
% by the pgf image externalization.
\xdef\pgf@trimleft@final{-\the\pgf@x}%
%
\pgf@process{\pgf@trimright}%
\global\advance\pgf@x by-\pgf@picmaxx
% prepare \hskip\pgf@trimright@final.
% note that \pgf@trimright@final is also queried
% by the pgf image externalization.
\xdef\pgf@trimright@final{\the\pgf@x}%
\endgroup%
\hss%
\egroup%
\pgf@insertlayers%
\endgroup%
\pgfsys@discardpath%
\endgroup%
\pgfsys@endscope%
\pgfsys@endpicture%
\endgroup%
\hss
\egroup%
\pgfsys@typesetpicturebox\pgfpic%
\endgroup%
}
\def\pgf@insertlayers{%
\box\pgf@layerbox@main%
}
\def\pgf@selectfont{\pgf@selectfontorig\nullfont}
\def\pgf@setlength#1#2{% these will be used only when \nullfont is active
\begingroup% keep font setting local
\pgfutil@selectfont% restore font
\pgf@setlengthorig#1{#2}% calculate dimension (possibly using calc)
\expandafter%
\endgroup%
\expandafter#1\expandafter=\the#1\relax}
\def\pgf@addtolength#1#2{%
\begingroup% keep font setting local
\pgfutil@selectfont% restore font
\pgf@addtolengthorig#1{#2}% calculate dimension (possibly using calc)
\expandafter%
\endgroup%
\expandafter#1\expandafter=\the#1\relax}
% Sets the baseline at the y-coordinate of a given point
%
% #1 = point
%
% Sets the baseline of the picture to the y-coordinate of a given
% point. However, the point will be evaluated *at the end of the
% picture*.
%
% Example:
%
% \pgfsetbaselinepointlater{\pgfpointanchor{mynode}{base}}
\def\pgfsetbaselinepointlater#1{\def\pgf@baseline{#1}}
% Sets the baseline at the y-coordinate of a given point, now
%
% #1 = point
%
% Sets the baseline of the picture to the y-coordinate of a given
% point.
%
% Example:
%
% \pgfsetbaselinepointnow{\pgfpoint{1cm}{2pt}}
\def\pgfsetbaselinepointnow#1{%
\pgf@process{#1}%
\edef\pgf@setter@baseline{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
\pgfsetbaselinepointlater{\pgf@setter@baseline}%
}
\def\pgf@default@text{default}%
% Sets the baseline
%
% #1 = baseline
%
% Sets the baseline of the picture. Default is the lower border, which
% is the same as \pgf@picminy
%
% Example:
%
% \pgfsetbaseline{1cm+2pt}
% \pgfsetbaseline{default}% resets to default value
\def\pgfsetbaseline#1{%
\def\pgf@temp{#1}%
\ifx\pgf@temp\pgf@default@text
\pgfsetbaseline{\pgf@picminy}%
\else
\pgfsetbaselinepointlater{\pgfpoint{0pt}{#1}}%
\fi
}
\pgfsetbaseline{\pgf@picminy}
% controls how the image externalization implements trim:
\newif\ifpgf@trim@lowlevel
\pgfkeys{
/pgf/trim lowlevel/.is if=pgf@trim@lowlevel,
/pgf/trim lowlevel/.default=true,
}
% Same as the y-baseline for horizontal alignment.
% The effect is different, though: it is some kind of trimming which
% leaves the bounding box intact.
\def\pgfsettrimleftpointlater#1{\def\pgf@trimleft{#1}}
\def\pgfsettrimleftpointnow#1{%
\pgf@process{#1}%
\edef\pgf@setter@baseline{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
\pgfsettrimleftpointlater{\pgf@setter@baseline}%
}
% \pgfsettrimleft{<x coord>}
% or
% \pgfsettrimleft{default}
\def\pgfsettrimleft#1{%
\def\pgf@temp{#1}%
\ifx\pgf@temp\pgf@default@text
\pgfsettrimleft{\pgf@picminx}
\else
\pgfsettrimleftpointlater{\pgfpoint{#1}{0pt}}%
\fi
}
\pgfsettrimleft{\pgf@picminx}
\def\pgfsettrimrightpointlater#1{\def\pgf@trimright{#1}}
\def\pgfsettrimrightpointnow#1{%
\pgf@process{#1}%
\edef\pgf@setter@baseline{\noexpand\pgfpoint{\the\pgf@x}{\the\pgf@y}}%
\pgfsettrimrightpointlater{\pgf@setter@baseline}%
}
% \pgfsettrimright{<x coord>}
% or
% \pgfsettrimright{default}
\def\pgfsettrimright#1{%
\def\pgf@temp{#1}%
\ifx\pgf@temp\pgf@default@text
\pgfsettrimright{\pgf@picmaxx}%
\else
\pgfsettrimrightpointlater{\pgfpoint{#1}{0pt}}%
\fi
}
\pgfsettrimright{\pgf@picmaxx}
% Interrupt path
%
% Description:
%
% The environment can be used to insert some drawing commands while
% constructing a path. The drawing commands inside the environment
% will not interfere with the path being constructed ``outside.''
% However, you must ward against graphic state changes using a scope.
%
% Example: Draw two parallel lines
%
% \pgfmoveto{\pgfpoint{0cm}{0cm}}
% \begin{pgfinterruptpath}
% \pgfmoveto{\pgfpoint{1cm}{0cm}}
% \pgfmoveto{\pgfpoint{1cm}{1cm}}
% \pgfusepath{stroke}
% \end{pgfinterruptpath}
% \pgflineto{\pgfpoint{0cm}{1cm}}
% \pgfusepath{stroke}
\def\pgfinterruptpath
{%
\begingroup%
% save all sorts of things...
\edef\pgf@interrupt@savex{\the\pgf@path@lastx}%
\edef\pgf@interrupt@savey{\the\pgf@path@lasty}%
\pgf@getpathsizes\pgf@interrupt@pathsizes%
\pgfsyssoftpath@getcurrentpath\pgf@interrupt@path%
\pgfsyssoftpath@setcurrentpath\pgfutil@empty%
\edef\pgfscope@linewidth{\the\pgflinewidth}%
\let\pgf@interrupt@lastmoveto=\pgfsyssoftpath@lastmoveto%
\begingroup%
}
\def\endpgfinterruptpath
{%
\endgroup%
\global\pgflinewidth=\pgfscope@linewidth%
\pgfsyssoftpath@setcurrentpath\pgf@interrupt@path%
\pgf@setpathsizes\pgf@interrupt@pathsizes%
\global\pgf@path@lastx=\pgf@interrupt@savex%
\global\pgf@path@lasty=\pgf@interrupt@savey%
\global\let\pgfsyssoftpath@lastmoveto=\pgf@interrupt@lastmoveto%
\endgroup%
}
% Interrupt bounding box
%
% Description:
%
% The environment can be used to temporarily setup a new bounding box
% computation. The bounding box will be made empty at the beginning of
% the environment and will be reset to its old value after the
% environment.
%
% Example:
%
% \begin{pgfinterruptboundinbox}
% \pgfmoveto{\pgfpoint{1cm}{0cm}}
% \pgfmoveto{\pgfpoint{1cm}{1cm}}
% \pgfusepath{stroke}
% \end{pgfinterruptboundinbox}
\def\pgfinterruptboundingbox
{%
\begingroup%
\edef\pgf@interrupt@savemaxx{\the\pgf@picmaxx}%
\edef\pgf@interrupt@saveminx{\the\pgf@picminx}%
\edef\pgf@interrupt@savemaxy{\the\pgf@picmaxy}%
\edef\pgf@interrupt@saveminy{\the\pgf@picminy}%
\pgf@picmaxx=-16000pt\relax%
\pgf@picminx=16000pt\relax%
\pgf@picmaxy=-16000pt\relax%
\pgf@picminy=16000pt\relax%
\pgf@size@hookedfalse%
\let\pgf@path@size@hook=\pgfutil@empty%
}
\def\endpgfinterruptboundingbox
{%
\global\pgf@picmaxx=\pgf@interrupt@savemaxx%
\global\pgf@picmaxy=\pgf@interrupt@savemaxy%
\global\pgf@picminx=\pgf@interrupt@saveminx%
\global\pgf@picminy=\pgf@interrupt@saveminy%
\endgroup%
}
% Interrupts a picture
%
% Description:
%
% This environment interrupts a picture and temporarily returns to
% normal TeX mode. All sorts of things are saved and restored by this
% environment.
%
% WARNING: Using this environment in conjuction with low level
% transformations can *strongly* upset the typesetting. Typically, the
% contents of this environment should have size/height/depth 0pt in
% the end.
%
% WARNING: This environment should only be used inside typesetting a
% box and this box must in turn be inserted using \pgfqbox.
%
% Example: Draw two parallel lines
%
% \pgfmoveto{\pgfpoint{0cm}{0cm}}
% \setbox\mybox=\hbox{
% \begin{pgfinterruptpicture}
% This is normal text.
% \begin{pgfpicture} % a subpicture
% \pgfmoveto{\pgfpoint{1cm}{0cm}}
% \pgfmoveto{\pgfpoint{1cm}{1cm}}
% \pgfusepath{stroke}
% \end{pgfpicture}
% More text.
% \end{pgfinterruptpicture}
% }
% \ht\mybox=0pt
% \wd\mybox=0pt
% \dp\mybox=0pt
% \pgfqbox{\mybox}%
% \pgfpathlineto{\pgfpoint{0cm}{1cm}}
% \pgfusepath{stroke}
\def\pgfinterruptpicture
{%
\begingroup%
\pgfinterruptboundingbox%
\pgftransformreset%
\pgfinterruptpath%
\ifx\pgf@selectfontorig\@undefined%
\else%
\let\setlength\pgf@setlengthorig%
\let\addtolength\pgf@addtolengthorig%
\let\selectfont\pgf@selectfontorig%
\fi%
\pgfutil@selectfont%
\pgfpicturefalse%
\let\pgf@positionnodelater@macro\relax%
\pgf@savelayers%
}
\def\endpgfinterruptpicture
{%
\pgf@restorelayers%
\endpgfinterruptpath%
\endpgfinterruptboundingbox%
\endgroup%
}
\let\pgf@savelayers=\relax
\let\pgf@restorelayers=\relax
\endinput