You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
769 lines
20 KiB
769 lines
20 KiB
% 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{pgfcorescopes.code.tex}
|
|
|
|
% 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}%
|
|
\let\pgfscope@stroke@color=\pgf@strokecolor@global%
|
|
\let\pgfscope@fill@color=\pgf@fillcolor@global%
|
|
\begingroup}
|
|
\def\endpgfscope{%
|
|
\endgroup%
|
|
\global\pgflinewidth=\pgfscope@linewidth%
|
|
\global\let\pgf@strokecolor@global=\pgfscope@stroke@color%
|
|
\global\let\pgf@fillcolor@global=\pgfscope@fill@color%
|
|
\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%
|
|
%
|
|
\pgfapproximatenonlineartransformation%
|
|
% 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}
|
|
|
|
\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}%
|
|
%
|
|
\pgf@remember@layerlist@globally
|
|
\endgroup%
|
|
\hss%
|
|
\egroup%
|
|
\pgf@restore@layerlist@from@global
|
|
\pgf@insertlayers%
|
|
\endgroup%
|
|
\pgfsys@discardpath%
|
|
\endgroup%
|
|
\pgfsys@endscope%
|
|
\pgfsys@endpicture%
|
|
\endgroup%
|
|
\hss
|
|
\egroup%
|
|
\pgfsys@typesetpicturebox\pgfpic%
|
|
\endgroup%
|
|
}
|
|
|
|
\def\pgf@remember@layerlist@globally{%
|
|
\global\let\pgf@layerlist@=\pgf@layerlist
|
|
}%
|
|
\def\pgf@restore@layerlist@from@global{%
|
|
\let\pgf@layerlist=\pgf@layerlist@
|
|
}%
|
|
\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%
|
|
\let\pgf@interrupt@lastmoveto=\pgfsyssoftpath@lastmoveto%
|
|
\begingroup%
|
|
}
|
|
\def\endpgfinterruptpath
|
|
{%
|
|
\endgroup%
|
|
\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%
|
|
}
|
|
|
|
|
|
|
|
|
|
% Creates an id scope.
|
|
%
|
|
% Description:
|
|
%
|
|
% An id scope is not (conceptually) a graphic scope, but a scope that
|
|
% has a unique name or "id". This id can be used as a reference point
|
|
% for instance for a hyperlink or for an animation (currently, only
|
|
% SVG supports ids, all other drivers ignore id scopes).
|
|
%
|
|
% Prior to using \pgfidscope, call \pgfuseid to install an
|
|
% id (and possibly \pgfusetype). The scope will then get this id and,
|
|
% likely, a graphic scope is installed. If \pgfuseid has not been
|
|
% called or if you try to call \pgfidscope again for the same id,
|
|
% nothing happens (except for a \TeX\ group being established).
|
|
|
|
\def\pgfidscope{\pgfsys@begin@idscope}
|
|
\def\endpgfidscope{\pgfsys@end@idscope}
|
|
|
|
\let\startpgfidscope\pgfidscope
|
|
\let\stoppgfidscope\pgfendidscope
|
|
|
|
|
|
|
|
|
|
% Use an id on the next graphic object
|
|
%
|
|
% #1 = a name
|
|
%
|
|
% The next scope or path can be the target of an animation command or
|
|
% a hyperlink.
|
|
|
|
\def\pgfuseid#1{%
|
|
\edef\pgf@temp{#1}%
|
|
\ifx\pgf@temp\pgfutil@empty%
|
|
\else%
|
|
\pgf@lookup@id{#1}%
|
|
\pgfsys@use@id{\pgf@next@id}%
|
|
\expandafter\xdef\csname pgf@id@names@#1\endcsname{{\pgf@next@id}{}}%
|
|
\fi%
|
|
}
|
|
|
|
\def\pgf@lookup@id#1{%
|
|
\expandafter\let\expandafter\pgf@id@name\csname pgf@id@names@#1\endcsname%
|
|
\ifx\pgf@id@name\relax%
|
|
\let\pgf@prev@id\pgfutil@empty%
|
|
\let\pgf@next@id\pgfutil@empty%
|
|
\else%
|
|
\expandafter\pgf@id@parse\pgf@id@name%
|
|
\fi%
|
|
\ifx\pgf@next@id\pgfutil@empty%
|
|
\pgfsys@new@id\pgf@next@id%
|
|
\expandafter\xdef\csname pgf@id@names@#1\endcsname{{\pgf@prev@id}{\pgf@next@id}}%
|
|
\fi%
|
|
}
|
|
\def\pgf@id@parse#1#2{%
|
|
\def\pgf@prev@id{#1}%
|
|
\def\pgf@next@id{#2}%
|
|
}
|
|
|
|
|
|
|
|
% Clear the current id
|
|
%
|
|
% Description:
|
|
%
|
|
% Sets the current id to be empty so that it cannot be referenced.
|
|
|
|
\def\pgfclearid{%
|
|
\pgfsys@clear@id%
|
|
}
|
|
|
|
|
|
% Get the id that will be given to a name upon the next use
|
|
%
|
|
% #1 = a macro
|
|
% #2 = a name
|
|
%
|
|
% Description:
|
|
%
|
|
% #1 will get the id that will be used by \pgfuseid next time for the
|
|
% given name.
|
|
|
|
\def\pgfidrefnextuse#1#2{%
|
|
\edef\pgf@temp{#2}\ifx\pgf@temp\pgfutil@empty\pgferror{Missing name reference for ``\string#1''}\fi%
|
|
\pgf@lookup@id{#2}%
|
|
\let#1\pgf@next@id%
|
|
}
|
|
|
|
|
|
% Get the id was last used
|
|
%
|
|
% #1 = a macro
|
|
% #2 = a name
|
|
%
|
|
% Description:
|
|
%
|
|
% #1 will get the id that was last used by \pgfuseid for #2.
|
|
|
|
\def\pgfidrefprevuse#1#2{%
|
|
\edef\pgf@temp{#2}\ifx\pgf@temp\pgfutil@empty\pgferror{Missing name reference for ``\string#1''}\fi%
|
|
\pgf@lookup@id{#2}%
|
|
\let#1\pgf@prev@id%
|
|
}
|
|
|
|
|
|
% Use a type
|
|
%
|
|
% #1 = an id type; when starting with a dot, it is added to the
|
|
% current type.
|
|
%
|
|
% The next scope or path can be the target of an animation command or
|
|
% a hyperlink.
|
|
|
|
\def\pgfusetype#1{%
|
|
\edef\pgf@temp{#1}%
|
|
\expandafter\pgfutil@ifnextchar\expandafter.\expandafter\pgf@id@use@type@add\expandafter\pgf@id@use@type@replace\pgf@temp\pgf@stop
|
|
}
|
|
\def\pgf@id@use@type@add.#1\pgf@stop{\pgfsys@append@type{#1}}
|
|
\def\pgf@id@use@type@replace#1\pgf@stop{\pgfsys@use@type{#1}}
|
|
|
|
% Push the current type on a global stack
|
|
%
|
|
% Description:
|
|
%
|
|
% The current type is pushed onto a global type stack. It can be
|
|
% restored using \pgfpoptype.
|
|
|
|
\def\pgfpushtype{\pgfsys@push@type}
|
|
|
|
|
|
% Pop a type from the type stack
|
|
%
|
|
% Description:
|
|
%
|
|
% Restores the most current value from the type stack.
|
|
|
|
\def\pgfpoptype{\pgfsys@pop@type}
|
|
|
|
|
|
|
|
|
|
% Alias an id locally or globally
|
|
%
|
|
% #1 = the alias name
|
|
% #2 = a existing id name
|
|
%
|
|
% Description:
|
|
%
|
|
% Creates an alias of a name
|
|
|
|
\def\pgfaliasid#1#2{%
|
|
\expandafter\let\expandafter\pgf@temp\csname pgf@id@names@#2\endcsname%
|
|
\expandafter\let\csname pgf@id@names@#1\endcsname\pgf@temp%
|
|
}
|
|
\def\pgfgaliasid#1#2{%
|
|
\expandafter\let\expandafter\pgf@temp\csname pgf@id@names@#2\endcsname%
|
|
\expandafter\global\expandafter\let\csname pgf@id@names@#1\endcsname\pgf@temp%
|
|
}
|
|
|
|
|
|
% Check whether a name has been forward-referenced
|
|
%
|
|
% #1 = a name
|
|
% #2 = what to do, when has been forward-referenced
|
|
% #3 = what to do otherwise
|
|
%
|
|
% Description:
|
|
%
|
|
% Depending on whether #1 has been forward-referenced, #2 or #3 will be executed.
|
|
|
|
\def\pgfifidreferenced#1#2#3{%
|
|
\expandafter\let\expandafter\pgf@id@name\csname pgf@id@names@#1\endcsname%
|
|
\ifx\pgf@id@name\relax%
|
|
#3%
|
|
\else
|
|
\expandafter\pgf@id@parse\pgf@id@name%
|
|
\ifx\pgf@next@id\pgfutil@empty%
|
|
#3%
|
|
\else%
|
|
#2%
|
|
\fi%
|
|
\fi%
|
|
}
|
|
|
|
|
|
% 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 conjunction 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%
|
|
\csname tikz@inside@picturefalse\endcsname%
|
|
\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
|
|
|