% 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. \ProvidesPackageRCS[v\pgfversion] $Header: /cvsroot/pgf/pgf/generic/pgf/systemlayer/pgfsys.code.tex,v 1.18 2006/10/11 15:22:26 tantau Exp $ % % The following conversion functions are used to convert from TeX % dimensions to postscript/pdf points. % {\catcode`\p=12\catcode`\t=12\gdef\Pgf@geT#1pt{#1}} \def\pgf@sys@tonumber#1{\expandafter\Pgf@geT\the#1} \def\pgf@sys@bp@correct#1{#1=0.99627#1} \def\pgf@sys@bp#1{% {% \pgf@x=#1\relax% \pgf@x=0.99627\pgf@x% \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}% \toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}% \xdef\pgfsysprotocol@currentprotocol{\the\toks@}% }% } \def\pgf@sys@pt#1{% {% \pgf@x=#1\relax% \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}% \toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}% \xdef\pgfsysprotocol@currentprotocol{\the\toks@}% }% } % % Useful commands that are used throughout pgf. The corresponding % latex commands are not used because a) latex might not be in use and % b) the latex commands are redefined by some *very vile and evil* % packages. % \long\def\pgf@ifundefined#1{% \expandafter\ifx\csname#1\endcsname\relax \expandafter\pgf@firstoftwo \else \expandafter\pgf@secondoftwo \fi} \def\pgf@firstoftwo#1#2{#1} \def\pgf@secondoftwo#1#2{#2} \def\pgf@empty{} \def\pgf@gobble#1{} \def\pgf@gobbletwo#1#2{} \long\def\pgf@ifnextchar#1#2#3{% \let\reserved@d=#1% \def\reserved@a{#2}% \def\reserved@b{#3}% \futurelet\pgf@let@token\pgf@ifnch} \def\pgf@ifnch{% \ifx\pgf@let@token\pgf@sptoken \let\reserved@c\pgf@xifnch \else \ifx\pgf@let@token\reserved@d \let\reserved@c\reserved@a \else \let\reserved@c\reserved@b \fi \fi \reserved@c} \def\:{\global\let\pgf@sptoken= } \: \def\:{\pgf@xifnch} \expandafter\def\: {\futurelet\pgf@let@token\pgf@ifnch} \def\pgf@namedef#1{\expandafter\def\csname #1\endcsname} \long\def\pgf@g@addto@macro#1#2{% \begingroup \toks@\expandafter{#1#2}% \xdef#1{\the\toks@}% \endgroup} % internal dimensions that are always present when pgsys is loaded. \newdimen\pgf@x \newdimen\pgf@y \newdimen\pgf@xa \newdimen\pgf@ya \newdimen\pgf@xb \newdimen\pgf@yb \newdimen\pgf@xc \newdimen\pgf@yc % The following \if decides, whether even-odd filling and clipping is % to be used or normal the non-zero winding number rule. See the % pdf-documentation for details on what these rules are. \newif\ifpgfsys@eorule % In the following dummy definitions of the pgf system commands are % given. The individual drivers must overwrite these definitions, % preferably all of them. If some system command is used that has not % been overwritten, the command fails with a warning. % % In some cases, some pgf system commands are just shorthands for a % series of more complicated commands. In this case, a default % implementation is given in this file, but a driver may choose to % overwrite this default implementation with a more effecient % version. For example, a closestroke is the same as a closepath % followed by a stroking, but in pdf there is a special shorthand for % this. So, the pdf driver overwrites \pgfsys@closestroke, while the % postscript driver does not. % % The commands for which default implementations are available are % given at the end. \def\pgf@sys@fail#1{% \expandafter\ifx\csname pgf@sys@fail@#1\endcsname\pgf@empty% \else% \expandafter\global\expandafter\let\csname pgf@sys@fail@#1\endcsname=\pgf@empty% \PackageWarning{pgf}{% Your graphic driver \pgfsysdriver\space does not supported #1. This warning is given only once}% \fi% } \def\pgfsys@invoke{\pgf@sys@fail{invoking specials}} % This command is used whenever some literal text needs to be inserted % into the resulting .pdf, .ps, or .dvi file. Note that most % \pgfsys@xxxx commands will not directly call this command, but, % rather, use the protocolling mechanism to record their literal % text. It is then left to the discretion of the protocolling % mechansim to insert the literal text at some appropriate, later % time. % % This command should only be called when \pgfsys@beginpicture has % been called previously and when the picture has not been suspended % using \pgfsys@beginhbox. \def\pgfsys@outerinvoke{\pgfsys@invoke} % This command can be used to insert protocolled graphic commands % outside any picture. This is extremely dangerous, but sometimes % useful. By default, this command does the same as inside pictures. % % % Path construction commands % % \def\pgfsys@moveto#1#2{\pgf@sys@fail{path constructions}} % This command is used to start a path at a specific point (#1bp,#2bp) % or to move the current point of the current path to (#1bp,#2bp) % without drawing anything upon stroking (the current path is % `interrupted'). % % Here (and in the following) the coordinates are in TeX's big points % (bp), unless the coordinate system has been scaled. A big point is % 1/72 inches. Note that TeX's point pt is 1/72.27 inches. % % Example: % % \pgfsys@moveto{10}{10} % \pgfsys@lineto{0}{0} % \pgfsys@stroke % % This will draw a line from (10bp,10bp) to the origin of the picture. \def\pgfsys@lineto#1#2{\pgf@sys@fail{path constructions}} % Continue the current path to (#1bp,#2bp) with a line. \def\pgfsys@curveto#1#2#3#4#5#6{\pgf@sys@fail{path constructions}} % Continue the current path with a bezier curver to (#5bp,#6bp). The % control points of the curve are at (#1bp,#2bp) and (#3bp,#4bp). \def\pgfsys@rect#1#2#3#4{\pgf@sys@fail{path constructions}} % Append a rectangle to the current path whose lower left corner is at % (#1bp,#2bp) and whose width/height is given by (#3bp,#4bp). % % This command can be `mapped back' to moveto and lineto commands, but % it is included since pdf has a special, quick version of this command. \def\pgfsys@closepath{\pgf@sys@fail{path constructions}} % Close the current path. This results in joining the current point of % the path with the point specified by the last moveto % operation. Typically, this is preferable over using lineto to the % last point specified by a moveto, since the line starting at this % point and the line ending at this point will be smoothly joined by % closepath. % % Example: % % \pgfsys@moveto{0}{0} % \pgfsys@lineto{10}{10} % \pgfsys@lineto{0}{10} % \pgfsys@closepath % \pgfsys@stroke % % versus % % \pgfsys@moveto{0}{0} % \pgfsys@lineto{10}{10} % \pgfsys@lineto{0}{10} % \pgfsys@lineto{0}{0} % \pgfsys@stroke % % The difference between the above will be that in the second triangle % the corner at the origin will be wrong; it will just be the overlay % of two lines going in different directions, not a sharp pointed % corner. % % % Stroking and filling commands % % \def\pgfsys@stroke{\pgf@sys@fail{path usage}} % Stroke the current path (as if it were drawn with a pen). A number % of so-called graphic state parameters influence this, which can be % set in different ways: % % - linewidth % The `thickness' of the line. A width of 0 is the thinnest width % renderable on the device. On a high-resolution printer this may % become invisible and should be avoided. A good choice is 0.4pt, % which is the default. % % - stroke color % This special color is used for stroking. If it is not set, the % current color is used. % % - cap % The cap describes how the endings of lines a drawn. A round cap % adds a little half circle to these endings. A butt cap ends the % lines exactly at the end (or start) point without anything % added. A rectangular cap ends the lines like the butt cap, but the % lines protrude over the endpoint by the line thickness. (See also % the pdf or postscript manual). If the path has been closed, no cap % is drawn. % % - join % This describes how a bend (a join) in a path is rendered. A round % join draws bends using small arcs. A bevel join just draws the two % lines and then fills the join minimally so that it becomes % convex. A miter join extends the lines so that they form a single % sharp corner, but only up to a certain miter limit. (See the pdf % or postscript manual once more). % % - dash % The line may be dashed according to a dashing pattern. % % - clipping area % If a clipping area is established, only those parts of the path % that are inside the clipping area will be drawn. % % In addition to stroking a path, the path may also be used for % clipping after it has been stroked. This will happen if the % \pgfsys@clipnext is used prior to this command, see there for % details. \def\pgfsys@fill{\pgf@sys@fail{path usage}} % This command fills the area surrounded by the current path. If the % path has not yet been closed, it is closed prior to filling. The % path itself is not stroked. For self-intersecting paths or paths % consisting of multiple parts, the nonzero winding number rule is % used to determine whether a point is inside or outside the % path, except if \ifpgfsys@eorule holds -- in which case the even-odd % rule should be used. (See the pdf or postscript manual for details.) % % The following graphic state parameters influence the filling: % % - fill color % If the fill color is not especially set, the current color is % used. % % - clipping area % If a clipping area is established, only those parts of the filling % area that are inside the clipping area will be drawn. % % In addition to filling the path, the path will also be used for % clipping if \pgfsys@clipnext is used prior to this command. \def\pgfsys@fillstroke{\pgf@sys@fail{path usage}} % First, the path is filled, then the path is stroked. If the fill and % stroke colors are the same (or if they are not specified and the % current color is used), this yields almost the same as a % \pgfsys@fill. However, due to the line thickness of the stroked % path, the fillstroked area will be slightly larger. % % In addition to stroking and filling the path, the path will also be % used for clipping if \pgfsys@clipnext is used prior to this command. \def\pgfsys@clipnext{\pgf@sys@fail{path usage}} % This command should be issued after a path has been constructed, but % before it has been stroked and/or filled or discarded. When the % command is used, the next stroking/filling/discarding command will % first be executed normally. Then, afterwards, the just-used path % will be used for subsequent clipping. If there has already been a % clipping region, this region is intersected with the new clipping % path (the clipping cannot get bigger). The nonzero winding number % rule is used to determine whether a point is inside or outside the % clipping area or the even-odd rule, depending on whether % \ifpgfsys@eorule holds. \def\pgfsys@discardpath{\pgf@sys@fail{path usage}} % Normally, this command should `throw away' the current path. % However, after \pgfsys@clipnext has been called, the current path % should subsequently be used for clipping. See \pgfsys@clipnext for % details. % % % Stroking options % % \def\pgfsys@setlinewidth#1{\pgf@sys@fail{setting the line width}} % Sets the width of lines, when stroked, to #1bp. \def\pgfsys@buttcap{\pgf@sys@fail{setting the line cap}} % Sets the cap to a butt cap. See \pgfsys@stroke. \def\pgfsys@roundcap{\pgf@sys@fail{setting the line cap}} % Sets the cap to a round cap. See \pgfsys@stroke. \def\pgfsys@rectcap{\pgf@sys@fail{setting the line cap}} % Sets the cap to a rectangular cap. See \pgfsys@stroke. \def\pgfsys@miterjoin{\pgf@sys@fail{setting the line join}} % Sets the join to a miter join. See \pgfsys@stroke. \def\pgfsys@setmiterlimit#1{\pgf@sys@fail{setting the line cap}} % Sets the miter limit of lines to #1. See the pdf or postscript % documentation. \def\pgfsys@roundjoin{\pgf@sys@fail{setting the line cap}} % Sets the join to a round join. See \pgfsys@stroke. \def\pgfsys@beveljoin{\pgf@sys@fail{setting the line cap}} % Sets the join to a bevel join. See \pgfsys@stroke. \def\pgfsys@setdash#1#2{\pgf@sys@fail{setting the dashing pattern}} % Sets the dashing patter. #1 should be a list of lengths given in big % points (bp) separated by spaces. #2 should be a single value given % in bp. % % The list of values in #1 is used to determine the lengths of the % `on' phases of the dashing and of the `off' phases. For example, if % #1 is `3 4', then the dashing pattern is `3bp on followed by 4bp % off, followed by 3bp on, followed by 4bp off, and so on'. A pattern % of `.5 4 3 1.5' means `.5bp on, 4bp off, 3bp on, 1.5bp off, .5bp on, % ...'. If the number of entries is odd, the last one is used twice, % so `3' means `3bp on, 3bp off, 3bp on, 3bp off,...'. An empty list % means `always on'. % % The second argument determines the `phase' of the pattern. For % example, for a pattern of `3 4' and a phase of `1', the pattern % would start: `2bp on, 4bp off, 3bp on, 4bp off, 3bp on, 4bp off...'. % % % Opacity stuff % % \def\pgfsys@stroke@opacity#1{\pgf@sys@fail{opacity}} % Sets the opacity of stroking operations. 1 means fully opaque, 0 % means fully transparent. \def\pgfsys@fill@opacity#1{\pgf@sys@fail{opacity}} % Sets the opacity of filling operations. 1 means fully opaque, 0 % means fully transparent. % % % Color stuff % % \def\pgfsys@color@rgb@stroke#1#2#3{\pgf@sys@fail{color}} % Sets the color used for stroking operations to the given rgb tuple % (numbers between 0 and 1). % % Example: Make stroked text dark red: \pgfsys@color@rgb@stroke{0.5}{0}{0} % % The special stroking color is only used if the stroking color has % been set since the last \color command. Thus, each \color command % should reset both the stroking and filling colors. \def\pgfsys@color@rgb@fill#1#2#3{\pgf@sys@fail{color}} % Sets the color used for filling operations to the given rgb tuple % (numbers between 0 and 1). This color may be different from the % stroking color. \def\pgfsys@color@rgb#1#2#3{\pgfsys@color@rgb@stroke{#1}{#2}{#3}\pgfsys@color@rgb@fill{#1}{#2}{#3}} % Sets the color used for filling and stroking operations. This is a % ``low-level'' version of the \color command. It is currently only % used by the plain tex version to support colors. \def\pgfsys@color@cmyk@stroke#1#2#3#4{\pgf@sys@fail{color}} % Sets the color used for stroking operations to the given cymk tuple % (numbers between 0 and 1). \def\pgfsys@color@cmyk@fill#1#2#3#4{\pgf@sys@fail{color}} % Sets the color used for filling operations to the given cymk tuple % (numbers between 0 and 1). \def\pgfsys@color@cmyk#1#2#3#4{\pgfsys@color@cmyk@stroke{#1}{#2}{#3}{#4}\pgfsys@color@cmyk@fill{#1}{#2}{#3}{#4}} % Sets the color used for filling and stroking operations. \def\pgfsys@color@cmy@stroke#1#2#3{\pgf@sys@fail{color}} % Sets the color used for stroking operations to the given cym tuple % (numbers between 0 and 1). \def\pgfsys@color@cmy@fill#1#2#3{\pgf@sys@fail{color}} % Sets the color used for filling operations to the given cym tuple % (numbers between 0 and 1). \def\pgfsys@color@cmy#1#2#3{\pgfsys@color@cmy@stroke{#1}{#2}{#3}\pgfsys@color@cmy@fill{#1}{#2}{#3}} % Sets the color used for filling and stroking operations. \def\pgfsys@color@gray@stroke#1{\pgf@sys@fail{color}} % Sets the color used for stroking operations to the given gray level % (number between 0 and 1). \def\pgfsys@color@gray@fill#1{\pgf@sys@fail{color}} % Sets the color used for filling operations to the given gray level % (number between 0 and 1). \def\pgfsys@color@gray#1{\pgfsys@color@gray@stroke{#1}\pgfsys@color@gray@fill{#1}} % Sets the color used for filling and stroking operations. \newif\ifpgfsys@color@reset@inorder % This if decides whether the color resetting of the % \pgfsys@color@reset command may assume that all color commands are % given ``in order.'' This means that this command will not be called, % say, at the beginning of a box that is later inserted at a point % where a fill color was actively set. This may allow the command to % produce more compact code when it ``knows'' that no special fill or % stroke color has been set. \pgfsys@color@reset@inordertrue \def\pgfsys@color@reset{} % This command will be called when the \color command is used. It % should purge any internal settings of stroking and filling % color. After this call, till the next use of a command like % \pgfsys@color@rgb@fill, the current color installed by the \color % command should be used. \def\pgfsys@color@unstacked#1{} % This slightly obscure command causes the color stack to be % tricked. When called, this command should set the current color to % #1 without causing any change in the color stack. % % % Coordinate system transformations % % \def\pgfsys@transformcm#1#2#3#4#5#6{\pgf@sys@fail{transformations}} % Perform a concatenation of the low-level current transformation % matrix with the matrix given by the values #1 to #6. The % transformation matrix is a transformation on a homogeneous % 2D-coordinate system. See the pdf or postscript manual for details. % % % Graphic state saving and restoring. % % \def\pgfsys@beginscope{\pgf@sys@fail{scoping}} % Saves the current graphic state on a graphic state stack. All % changes to the graphic state parameters mentioned for \pgfsys@stroke % and \pgfsys@fill will be local to the current graphic state and will % the old values will be restored after endscope is used. % % WARNING: pdf and postscript differ with respect to the question of % whether the current path is part of the graphic state or not. For % this reason, you should never use this command unless the path is % currently empty. For example, it might be a good idea to use % discardpath prior to calling this command. \def\pgfsys@endscope{\pgf@sys@fail{scoping}} % Restores the last saved graphic state. % % % Special commands % % \def\pgfsys@imagesuffixlist{} % A list of suffixes, separated by `:', that will be tried when % searching for an image. % % % Special commands % % \def\pgfsys@definemask{\pgf@sys@fail{masking}} % This command declares a mask for usage with images. It works similar % to \pgfsys@defineimage: Certain macros are set when the command is % called. The result should be to set the macro \pgf@mask to a pdf % object count that can subsequently be used as a soft mask. The % following macros will be set when this command is invoked: % % - \pgf@filename % File name of the mask to be defined. % % - \pgf@maskmatte % The so-called matte of the mask (see the pdf documentation for % details). The matte is a color specification consisting of 1, 3 or % 4 numbers between 0 and 1. The number of numbers depends on the % number of color channels in the image (not in the mask!). It will % be assumed that the image has been preblended with this color. % % % Shading commands % % \def\pgfsys@horishading#1#2#3{\pgf@sys@fail{shadings}} % Declares a horizontal shading for later use. The effect of this % command should be the definition of a macro called `@pgfshading#1!' % (or \csname @pdfshading#1!\endcsname, to be precise). When invoked, % this new macro should insert a shading at the current position. % % #1 is the name of the shading, which is also used in the output % macro name. #2 is the height of the shading and must be given as a % TeX dimension like `2cm' or `10pt'. #3 is a shading color % specification as specified in the pgfuserguide. The shading % specification implicitly fixes the width of the shading. % % When `@pgfshading#1!' is invoked, it should insert a box of height % #2 and the width implicit in the shading declaration. \def\pgfsys@vertshading#1#2#3{\pgf@sys@fail{shadings}} % Like horishading, only for vertical shadings. This time, the height % of the shading is implicit in #3 and the width is given as #2. \def\pgfsys@radialshading#1#2#3{\pgf@sys@fail{shadings}} % Declares a radial shading. Like the previous macros, this command % should setup the macro `@pgfshading#1!', which upon invocation % should insert a radial shading whose size is implicit in #3. % % The parameter #2 is a pgf point specification if the starting point % of the shading. See the pgfuserguide for details. % % % Pattern stuff % % \def\pgfsys@declarepattern#1#2#3#4#5#6#7#8#9{\pgf@sys@fail{patterns}} % This command declares a new colored or uncolored pattern. Uncolored % patterns have no inherent color, the color is provided when they are % set. Colored patters have an inherent color. % #1 = name of the pattern (must be a plain suffix for use in % postscript/pdf/etc.) % #2 to #5 = four coordinates describing the corners of a bounding box % of pattern cells % #6 = x-step % #7 = y-step % #8 = pattern code % #9 = 0 if uncolored patter, 1 if colored pattern. \def\pgfsys@setpatternuncolored#1#2#3#4{\pgf@sys@fail{patterns}} % Sets an uncolored pattern #1 as filling color. The numbers #2, #3, % #4 must be an rgb-value to be used as the color of the pattern. \def\pgfsys@setpatterncolored#1{\pgf@sys@fail{patterns}} % Sets an colored pattern #1 as filling color. % % % Page size stuff % % \def\pgfsys@papersize#1#2{\pgf@sys@fail{papersize}} % This command sets the paper size in a portable way. % #1 = width % #2 = height % % % Position tracking commands % % % Marks the current position on the page. This position can later be % referenced using \pgfsys@getposition \def\pgfsys@markposition#1{\pgf@sys@fail{marking the current position}} % Sets #2 to a pgfpoint macro that returns the position #1 is % returned in a coordinate system where the x-axis goes right and the % y-axis goes up. The origin of this coordinate system may or may not % lie in the lower left corner; you should shift the coordinate system % to the position "pgfpageorigin" to make sure that the origin is at % the lower left corner. Typically, getting this position % requires two runs of TeX. On the first run, the macro will be set to % \relax, indicating that the position is not available. % % If #1 is set to the special position "pgfpageorigin", the position % of the the lower left page corner is returned. \def\pgfsys@getposition#1#2{\let#2=\relax} % % % Commands having a default implementation. These commands only need % not be implemented by drivers if this results in a better % preformance. % % \def\pgfsys@shadingoutsidepgfpicture#1{% #1% } % This command gets the definition of a shading (@pgfshadingxxxx!) as % an argument and should insert this shading into the normal text. % % This command has a default implementation. \def\pgfsys@shadinginsidepgfpicture#1{% \pgf@makehbox{#1}% \setbox\pgf@hbox=\hbox{\hskip-.5\wd\pgf@hbox\lower.5\ht\pgf@hbox\hbox{\box\pgf@hbox}}% \pgfqbox{\pgf@hbox}% } % This command works like \pgfsys@shadingoutsidepgfpicture, only it is % called when a shading should be inserted inside a picture. This % command should insert the shading centered on the origin (which will % typically have been low-level translated somewhere else.) % % This command has a default implementation. \def\pgfsys@closestroke{\pgfsys@closepath\pgfsys@stroke} % This command should have the same effect as first closing the path % and then stroking it. \def\pgfsys@transformshift#1#2{\pgfsys@transformcm{1}{0}{0}{1}{#1}{#2}} % This command will change the origin of the low-level coordinate % system to (#1bp,#2bp). \def\pgfsys@transformxyscale#1#2{\pgfsys@transformcm{#1}{0}{0}{#2}{0bp}{0bp}} % This command will scale the low-level coordinate system (and % everything that is drawn) by a factor of #1 in x-directed and #2 in % y-direction. Note that this applies to everything, including % lines. So a scaled line will have a different width and may even % have a different width when going along the x-axis and when going % along the y-axis, if the scaling is different in these directions. \def\pgfsys@hbox#1{% \pgfsys@beginscope% \wd#1=0pt% \ht#1=0pt% \dp#1=0pt% \box#1% \pgfsys@endscope% } % Called to insert a TeX hbox into a pgfpicture. \def\pgfsys@hboxsynced#1{% {\pgfsys@beginscope\pgflowlevelsynccm\pgfsys@hbox#1\pgfsys@endscope}% } % Called to insert a TeX hbox into a pgfpicture, but with the current % coordinate transformation matrix synced with the canvas % transformation matrix. % % In essence, this command does the same as if you first said % \pgflowlevelsynccm and then \pgfsys@hbox. However, a driver may % choose to use a ``TeX-translation'' for the translation part of the % transformation cm. This will ensure that hyperlinks ``survive'' at % least translations. \def\pgfsys@beginpicture{} % Called at the beginning of a pgfpicture. Used to setup things. \def\pgfsys@endpicture{} % Called at the end of a pgfpicture. \def\pgfsys@typesetpicturebox#1{% \setlength\pgf@x{\pgf@shift@baseline}% \advance\pgf@x by-\pgf@picminy\relax% \advance\pgf@picmaxy by-\pgf@picminy\relax% maxy is now the height \advance\pgf@picmaxx by-\pgf@picminx\relax% maxx is now the width \setbox#1=\hbox{\hskip-\pgf@picminx\lower\pgf@picminy\box#1}% \ht#1=\pgf@picmaxy% \wd#1=\pgf@picmaxx% \dp#1=0pt% \leavevmode\raise-\pgf@x\box#1% } % Called after a picture has been typeset in box #1. This % command should insert the box into the normal TeX code. The box #1 % will still be a ``raw'' box that contains only the \special's. The % job of this command is to resize and shift this box according to the % baseline shift and the size of the box. % % This command has a default implementation. \def\pgfsys@beginpurepicture{\pgfsys@beginpicture} % This version of the beginpicture command can be used for pictures % that are guaranteed not to contain any hboxes. In this case, a % driver might provide a more compact version of the command. \def\pgfsys@endpurepicture{\pgfsys@endpicture} % Called at the end of a ``pure'' pgfpicture. \def\pgfsys@defineimage{% \ifx\pgf@imagewidth\pgf@empty\else\edef\pgf@imagewidth{width=\pgf@imagewidth,}\fi% \ifx\pgf@imageheight\pgf@empty\else\edef\pgf@imageheight{height=\pgf@imageheight,}\fi% \ifx\pgf@imagepage\pgf@empty\else\edef\pgf@imagepage{page=\pgf@imagepage,}\fi% \edef\pgf@image{\noexpand\includegraphics[\pgf@imageheight\pgf@imagewidth]{\pgf@filename}}% } % Called, when an image should be defined. % % This command does not take any parameters. Instead, certain macros % will be preinstalled with appropriate values when this command is % invoked. These are: % % - \pgf@filename % File name of the image to be defined. % % - \pgf@imagewidth % Will be set to the desired (scaled) width of the image. % % - \pgf@imageheight % Will be set to the desired (scaled) height of the image. % % If this macro and also the height macro are empty, the image % should have its `natural' size. % % If exactly only of them is specified, the undefined value the % image is scaled so that the aspect ratio is kept. % % If both are set, the image is scaled in both directions % independently, possibly changing the aspect ratio. % % % The following macros presumable mostly make sense for drivers that % can handle pdf: % % - \pgf@imagepage % The desired page number to be extracted from a multi-page % `image'. % % - \pgf@imagemask % If set, it will be set to `/SMask x 0 R', where x is the pdf % object number of a soft mask to be applied to the image. % % - \pgf@imageinterpolate % If set, it will be set to `/Interpolate true' or `/Interpolate % false', indicating whether the image should be interpolated in % pdf. % % % The command should now setup the macro \pgf@image such that calling % this macro will result in typesetting the image. Thus, \pgf@image is % the `return value' of the command. \def\pgfsys@defobject#1#2#3#4{% \pgfsysprotocol@getcurrentprotocol\pgfsys@temp% {% \pgfsysprotocol@setcurrentprotocol\pgf@empty% \pgfsysprotocol@bufferedtrue% #4% \pgfsysprotocol@getcurrentprotocol\pgfsys@@temp% \expandafter\global\expandafter\let\csname #1\endcsname=\pgfsys@@temp% }% \pgfsysprotocol@setcurrentprotocol\pgfsys@temp% } % Declares an object for later use. The idea is that the object can be % precached in some way and then be rendered more quickly when used % several times. For example, an arrow head might be defined and % prerendered in this way. % % The parameter #1 is the name for later use. #2 and #3 are pgf points % specifying a bounding box for the object. #4 is the code for the % object. The code may only contain protocollable code. \def\pgfsys@useobject#1#2{% \pgfsysprotocol@getcurrentprotocol\pgfsys@temp% {% \pgfsysprotocol@setcurrentprotocol\pgf@empty% \pgfsysprotocol@bufferedfalse% #2% \expandafter\pgfsysprotocol@setcurrentprotocol\csname #1\endcsname% \pgfsysprotocol@invokecurrentprotocol% }% \pgfsysprotocol@setcurrentprotocol\pgfsys@temp% } % Renders a previously declared object. The first parameter is the % name of the the object. The second parameter is extra code that % should be executed right *before* the object is rendered. Typically, % this will be some transformation code. \def\pgfsys@begininvisible{\pgfsys@transformcm{1}{0}{0}{1}{2000bp}{2000bp}} % Between this command and the closing endinvisible, all output should % be suppressed. Nothing should be drawn at all, which includes all % paths, images and shadings. \def\pgfsys@endinvisible{\pgfsys@transformcm{1}{0}{0}{1}{-2000bp}{-2000bp}} % Ends the invisibilty section, unless invisibility blocks have been % nested. In this case, only the `last' one restores visibility. \def\pgfsys@atbegindocument{} % This command will be executed at the begin of the document. If for % whatever reason this is not done, you may wish to execute this % command yourself. It will setup certain specials that need to be % inserted into the resulting .pdf/.ps/.xxx file. \AtBeginDocument{ \pgfsys@atbegindocument \let\pgfsys@atbegindocument=\relax } % Discern the driver: \input pgf.cfg \PackageInfo{pgfsys}{Driver file for pgf: \pgfsysdriver} \InputIfFileExists{\pgfsysdriver}{}{% \PackageError{pgfsys}{Driver file ``\pgfsysdriver'' not found.}{}} \endinput