diff options
Diffstat (limited to 'Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex')
-rw-r--r-- | Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex | 236 |
1 files changed, 220 insertions, 16 deletions
diff --git a/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex index 63f6bf5be9b..da75b3e2e43 100644 --- a/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +++ b/Master/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex @@ -7,7 +7,7 @@ % % See the file doc/generic/pgf/licenses/LICENSE for more details. -\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/modules/pgfmoduleshapes.code.tex,v 1.4 2008/02/13 15:10:06 tantau Exp $ +\ProvidesFileRCS $Header: /cvsroot/pgf/pgf/generic/pgf/modules/pgfmoduleshapes.code.tex,v 1.13 2010/09/09 13:52:57 cjorssen Exp $ @@ -43,6 +43,7 @@ {% \let\pgf@sh@savedmacros=\pgfutil@empty% MW \let\pgf@sh@savedpoints=\pgfutil@empty% + \def\shape@name{#1}% CJ \csname pgf@sh@s@#1\endcsname% \pgf@sh@savedpoints% \pgf@sh@savedmacros% MW @@ -52,20 +53,30 @@ \pgf@y=-\pgf@y% }% \expandafter\pgfsavepgf@process\csname pgf@sh@sa@#3\endcsname{% - \pgf@sh@reanchor{#1}{#2}% + \pgf@sh@reanchor{#1}{#2}% FIXME : this is double work! }% % Save the saved points and the transformation matrix - \edef\pgf@test{#3}% - \ifx\pgf@test\pgfutil@empty% + \edef\pgf@node@name{#3}% + \ifx\pgf@positionnodelater@macro\relax% \else% - \expandafter\xdef\csname pgf@sh@ns@#3\endcsname{#1}% - \edef\pgf@sh@@temp{\noexpand\gdef\expandafter\noexpand\csname pgf@sh@np@#3\endcsname}% + % Rename node + \edef\pgf@node@name{not yet positioned@\pgf@node@name}% + % Interrupt bounding box! + \pgfinterruptboundingbox% + % Put everything in our box: + \setbox\pgfpositionnodelaterbox=\hbox\bgroup% + % + \fi% + \ifx\pgf@node@name\pgfutil@empty% + \else% + \expandafter\xdef\csname pgf@sh@ns@\pgf@node@name\endcsname{#1}% + \edef\pgf@sh@@temp{\noexpand\gdef\expandafter\noexpand\csname pgf@sh@np@\pgf@node@name\endcsname}% \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@savedpoints}% - \edef\pgf@sh@@temp{\noexpand\gdef\expandafter\noexpand\csname pgf@sh@ma@#3\endcsname}% MW + \edef\pgf@sh@@temp{\noexpand\gdef\expandafter\noexpand\csname pgf@sh@ma@\pgf@node@name\endcsname}% MW \expandafter\pgf@sh@@temp\expandafter{\pgf@sh@savedmacros}% MW \pgfgettransform\pgf@temp - \expandafter\xdef\csname pgf@sh@nt@#3\endcsname{\pgf@temp}% - \expandafter\xdef\csname pgf@sh@pi@#3\endcsname{\pgfpictureid}% + \expandafter\xdef\csname pgf@sh@nt@\pgf@node@name\endcsname{\pgf@temp}% + \expandafter\xdef\csname pgf@sh@pi@\pgf@node@name\endcsname{\pgfpictureid}% \fi% \pgfutil@ifundefined{pgf@sh@bbg@#1}{} {{\pgfscope\csname pgf@sh@bbg@#1\endcsname\endpgfscope}}% @@ -87,7 +98,18 @@ {\csname pgf@sh@fg@#1\endcsname#4}% \pgfutil@ifundefined{pgf@sh@ffg@#1}{}% {{\pgfscope\csname pgf@sh@ffg@#1\endcsname\endpgfscope}}% - \pgf@nodecallback{#3}% + \ifx\pgf@positionnodelater@macro\relax% + \expandafter\pgf@nodecallback\expandafter{\pgf@node@name}% + \else% + \egroup% Close box + \edef\pgfpositionnodelaterminx{\the\pgf@picminx}% + \edef\pgfpositionnodelaterminy{\the\pgf@picminy}% + \edef\pgfpositionnodelatermaxx{\the\pgf@picmaxx}% + \edef\pgfpositionnodelatermaxy{\the\pgf@picmaxy}% + \let\pgfpositionnodelatername=\pgf@node@name% + \pgf@positionnodelater@macro% + \endpgfinterruptboundingbox% + \fi% }% }% } @@ -144,6 +166,109 @@ } } + + +% Create a node that is positioned later +% +% #1 = macro to be called after the next node has been created +% +% Description: +% +% You can use this command to create a node that is "positioned +% later". The idea is the following: Normally, when a node is created +% using a command like \pgfnode, the node is immediately inserted into +% the current picture. In particular, you have no chance to change the +% position of a created node after it has been create. +% +% Using \pgfpositionnodelater, you can change the default +% behaviour. This command is not a replacement for \pgfnode, but is +% called before such a command and will cause the following to happen: +% The node is created, but not inserted into the picture. Instead, it +% is stored in the box \pgfpositionnodelaterbox. Furthermore, the node +% is not relevant for the picture's bounding box, but a bounding box +% for the node is computed and stored in the macros +% \pgfpositionnodelaterboundboxminx to +% \pgfpositionnodelaterboundboxmaxy. Finally, the +% macro #1 is called with the following macros setup: +% +% \pgfpositionnodelaterbox +% A box register (box 0 by default) that stores the node's paths and +% texts. You should move the contents of this box to a box of your +% choice. +% +% \pgfpositionnodelatername +% The name of the just-created-node. This name will be the +% originally "desired" name of the box plus the prefix "not yet +% positioned box@". +% +% \pgfpositionnodelaterminx +% \pgfpositionnodelatermaxx +% \pgfpositionnodelaterminy +% \pgfpositionnodelatermaxy +% These four macros store the bounding box as dimensions that are +% guarenteed to end with "pt". +% +% By setting #1 to \relax (which is the default), you can switch off +% the whole mechanism +% +% Once a late node has been created, you can add arbitrary code in the +% same picture. Then, at some later point, you call +% \pgfpositionnodenow to finally position the node at a given position. +% +% When \pgfpositionnodenow is called, the macros mentioned above +% should have the exact same values they had when #1 is called. + +\def\pgfpositionnodelater#1{\let\pgf@positionnodelater@macro=#1\relax} +\pgfpositionnodelater{\relax} +\def\pgfpositionnodelaterbox{0} + + +% Position a node that has been scheduled for later insertion +% +% #1 = position in the picture, where the original anchor should go, +% now +% +% Description: +% +% This command works in concert with \pgfpositionnodelater, see the +% description there. When \pgfpositionnodenow is called, the macros +% \pgfpositionnodelaterbox and so one should be set to the values they +% had when the macro given to \pgfpositionnodelater was called. Then, +% the box described by these macros will be inserted into the picture +% at the position given #1. More precisely, the original node will +% have been positioned such that the anchor given upon invocation is +% at (0,0) and the node is now shifted by #1 before being inserted +% into the actual picture. + +\def\pgfpositionnodenow#1{% + {% + \pgfpointtransformed{#1}% + \edef\pgf@temp@shift{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}} + \pgftransformreset% + \pgftransformshift{\pgf@temp@shift}% + \setbox\pgfpositionnodelaterbox=\hbox{\pgfsys@beginpicture\box\pgfpositionnodelaterbox\pgfsys@endpicture}% + \pgfqboxsynced{\pgfpositionnodelaterbox}% + \pgf@shift@node{\pgfpositionnodelatername}{\pgf@temp@shift}% + % Bounding box update... + \pgfpointtransformed{\pgfqpoint{\pgfpositionnodelaterminx}{\pgfpositionnodelaterminy}}% + \pgf@protocolsizes{\pgf@x}{\pgf@y} + \pgfpointtransformed{\pgfqpoint{\pgfpositionnodelatermaxx}{\pgfpositionnodelatermaxy}}% + \pgf@protocolsizes{\pgf@x}{\pgf@y} + % Naming and callbacks + \expandafter\pgfpositionnodenow@rename\pgfpositionnodelatername\relax% + }% +} + +\def\pgfpositionnodenow@rename not yet positioned@#1\relax{% + \pgfnoderename{#1}{not yet positioned@#1} + \pgf@nodecallback{#1}% +} + + + + + + % Alias a node % % #1 = new node name @@ -165,12 +290,68 @@ \pgf@node@gnamelet{pgf@sh@nt@#1}{pgf@sh@nt@#2}% \pgf@node@gnamelet{pgf@sh@pi@#1}{pgf@sh@pi@#2}% \pgf@node@gnamelet{pgf@sh@ma@#1}{pgf@sh@ma@#2}% + \pgf@nodecallback{#1}% } \def\pgf@node@gnamelet#1#2{% \expandafter\let\expandafter\pgf@temp\csname #2\endcsname% \expandafter\global\expandafter\let\csname #1\endcsname=\pgf@temp% } +% Rename a node +% +% #1 = new name +% #2 = old name +% +% Description: +% +% Renames a node. This is like an alias, only the memory used for the +% old name is freed. + +\def\pgfnoderename#1#2{% + \pgfnodealias{#1}{#2}% + \expandafter\global\expandafter\let\csname pgf@sh@ns@#2\endcsname\relax + \expandafter\global\expandafter\let\csname pgf@sh@np@#2\endcsname\relax + \expandafter\global\expandafter\let\csname pgf@sh@nt@#2\endcsname\relax + \expandafter\global\expandafter\let\csname pgf@sh@pi@#2\endcsname\relax + \expandafter\global\expandafter\let\csname pgf@sh@ma@#2\endcsname\relax +} + + +% Quickly create a coordinate node +% +% #1 = name +% #2 = coordinate +% +% Description: +% +% Creates a node of shape coordinate. The following have the same +% effect, only the second is much faster: +% +% { \pgftransformshift{\pgfpoint{1cm}{2cm} \pgfnode{coordinate}{center}{}{foo}{} } +% \pgfcoordinate{foo}{\pgfpoint{1cm}{2cm}} + +\def\pgfcoordinate#1#2{% + \edef\pgf@temp{#1}% + \ifx\pgf@temp\pgfutil@empty% do nothing + \else% + \pgf@process{\pgfpointtransformed{#2}}% + \expandafter\gdef\csname pgf@sh@ns@#1\endcsname{coordinate}% + \expandafter\xdef\csname pgf@sh@np@#1\endcsname{% + \noexpand\def\noexpand\centerpoint{\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + } + \expandafter\gdef\csname pgf@sh@nt@#1\endcsname{{1}{0}{0}{1}{0pt}{0pt}}% + \expandafter\global\expandafter\let\csname pgf@sh@ma@#1\endcsname\pgfutil@empty% + \expandafter\gdef\csname pgf@sh@pi@#1\endcsname{\pgfpictureid}% + \fi% +} + +\def\pgf@sh@redeferredanchor#1#2{% CJ + \expandafter\gdef\csname pgf@anchor@\shape@name @#1\endcsname{#2}}% CJ + + + + + \def\pgf@sh@resavedanchor#1#2{% \pgf@process{#2}% @@ -191,14 +372,12 @@ \pgf@sh@marshal% } -% MW -\newtoks\toks@savedmacro \def\pgf@sh@resavedmacro#1#2{% \let#1\pgfutil@empty% \def\addtosavedmacro##1{% \expandafter\def\expandafter\pgf@sh@addtomacro@temp\expandafter{#1\noexpand\def\noexpand##1{##1}}% - \expandafter\toks@savedmacro\expandafter{\pgf@sh@addtomacro@temp}% - \expandafter\def\expandafter#1\expandafter{\the\toks@savedmacro}% + {\expandafter\pgfutil@toks@\expandafter{\pgf@sh@addtomacro@temp}\expandafter}% + \expandafter\def\expandafter#1\expandafter{\the\pgfutil@toks@}% }% #2\relax% \edef\pgf@sh@marshal{% @@ -212,12 +391,31 @@ \def\pgf@sh@reanchor#1#2{% \pgfutil@ifundefined{pgf@anchor@#1@#2}% {% - \pgfmathsetcounter{pgf@counta}{#2}% - \csname pgf@anchor@#1@border\endcsname{\pgfqpointpolar{\c@pgf@counta}{1pt}}% + \pgfutil@ifundefined{pgf@anchor@generic@#2}{% + \pgfmathsetcounter{pgf@counta}{#2}% + \csname pgf@anchor@#1@border\endcsname{\pgfqpointpolar{\c@pgf@counta}{1pt}}% + }{% + \csname pgf@anchor@generic@#2\endcsname{#1}% + }% }% {\csname pgf@anchor@#1@#2\endcsname}% } +% Defines a generic anchor, i.e. one which gets the associated shape +% as first argument. +% +% #1: the anchor name. +% #2: the code of the anchor. It may depend upon '##1', the shape's +% name. +% +% The anchor will be defined locally in the current TeX scope. +% +% If the anchor will be referenced later by \pgfpointanchor, the macro \pgfreferencednodename +% can be used to query the referenced node's name. +% This macro is not defined during node creation. +\def\pgfdeclaregenericanchor#1#2{% + \expandafter\def\csname pgf@anchor@generic@#1\endcsname##1{#2}% +}% % Retrieves an anchor of a shape @@ -241,6 +439,7 @@ \pgfpointorigin}% {% \pgf@process{% + \edef\pgfreferencednodename{#1}% for use inside of anchors. % MW install special macros \csname pgf@sh@ma@#1\endcsname% MW % install special coordinates @@ -305,6 +504,7 @@ \pgfpointorigin}% {% \pgf@process{% + \edef\pgfreferencednodename{#1}% for use inside of anchors. % MW install special macros \csname pgf@sh@ma@#1\endcsname% MW % install special coordinates @@ -409,6 +609,7 @@ \let\savedanchor=\pgf@sh@savedanchor \let\saveddimen=\pgf@sh@saveddimen \let\savedmacro=\pgf@sh@savedmacro% MW + \let\deferredanchor=\pgf@sh@deferredanchor% CJ \let\anchor=\pgf@sh@anchor \let\anchorborder=\pgf@sh@anchorborder \let\behindbackgroundpath=\pgf@sh@behindbgpath @@ -443,6 +644,9 @@ \def\pgf@sh@savedmacro#1#2{% MW \expandafter\pgfutil@g@addto@macro\csname pgf@sh@s@\shape@name\endcsname{\pgf@sh@resavedmacro{#1}{#2}}}% MW \def\pgf@sh@anchor#1#2{\expandafter\gdef\csname pgf@anchor@\shape@name @#1\endcsname{#2}} +\def\pgf@sh@deferredanchor#1#2{% CJ + \expandafter\pgfutil@g@addto@macro + \csname pgf@sh@s@\shape@name\endcsname{\pgf@sh@redeferredanchor{#1}{#2}}}% CJ \def\pgf@sh@anchorborder#1{\expandafter\gdef\csname pgf@anchor@\shape@name @border\endcsname##1{\pgf@process{##1}#1}} \long\def\pgf@sh@behindbgpath#1{\expandafter\gdef\csname pgf@sh@bbg@\shape@name\endcsname{#1}} \long\def\pgf@sh@bgpath#1{\expandafter\gdef\csname pgf@sh@bg@\shape@name\endcsname{#1}} |