% 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.48 2014/07/09 14:01:22 cfeuersaenger Exp $ % Load key mechanism \input pgfkeys.code.tex % "pgf" is a family \pgfkeys{/pgf/.is family} \def\pgfset{\pgfqkeys{/pgf}} % This is if is needed *very* early \newif\ifpgfpicture % % 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}% \pgfutil@toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}% \xdef\pgfsysprotocol@currentprotocol{\the\pgfutil@toks@}% }% } \def\pgf@sys@pt#1{% {% \pgf@x=#1\relax% \edef\temp{\expandafter\Pgf@geT\the\pgf@x\space}% \pgfutil@toks@\expandafter\expandafter\expandafter{\expandafter\pgfsysprotocol@currentprotocol\temp}% \xdef\pgfsysprotocol@currentprotocol{\the\pgfutil@toks@}% }% } % 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 \newwrite\w@pgf@writea \newread\r@pgf@reada \let\pgfutil@inputcheck=\r@pgf@reada % internal counters that are alwyas present when pgfsys is loaded \newcount\c@pgf@counta \newcount\c@pgf@countb \newcount\c@pgf@countc \newcount\c@pgf@countd \newtoks\t@pgf@toka \newtoks\t@pgf@tokb \newtoks\t@pgf@tokc % Ensure that math registers are the same (math is broken in case it % is loaded first) \let\pgfmath@x\pgf@x \let\pgfmath@xa\pgf@xa \let\pgfmath@xb\pgf@xb \let\pgfmath@xc\pgf@xc \let\pgfmath@y\pgf@y \let\pgfmath@ya\pgf@ya \let\pgfmath@yb\pgf@yb \let\pgfmath@yc\pgf@yc \let\c@pgfmath@counta\c@pgf@counta \let\c@pgfmath@countb\c@pgf@countb \let\c@pgfmath@countc\c@pgf@countc \let\c@pgfmath@countd\c@pgf@countd % 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\pgfutil@empty% \else% \expandafter\global\expandafter\let\csname pgf@sys@fail@#1\endcsname=\pgfutil@empty% \pgfwarning{Your graphic driver \pgfsysdriver\space does not support #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 (#1,#2) % or to move the current point of the current path to (#1,#2) % without drawing anything upon stroking (the current path is % `interrupted'). % % The arguments must be dimensions (like |10pt|). % % Example: % % \pgfsys@moveto{10pt}{10pt} % \pgfsys@lineto{0pt}{0pt} % \pgfsys@stroke % % This will draw a line from (10pt,10pt) to the origin of the picture. \def\pgfsys@lineto#1#2{\pgf@sys@fail{path constructions}} % Continue the current path to (#1,#2) 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 (#5,#6). The % control points of the curve are at (#1,#2) and (#3,#4). \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 % (#1,#2) and whose width/height is given by (#3,#4). % % 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 #1. \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 separated by % spaces. #2 should be a single dimension. % % 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 `3pt 4pt', then the dashing pattern is `3pt on followed by 4pt % off, followed by 3pt on, followed by 4pt off, and so on'. A pattern % of `.5pt 4pt 3pt 1.5pt' means `.5pt on, 4pt off, 3pt on, 1.5pt off, .5pt on, % ...'. If the number of entries is odd, the last one is used twice, % so `3pt' means `3pt on, 3pt off, 3pt on, 3pt off,...'. An empty list % means `always on'. % % The second argument determines the `phase' of the pattern. For % example, for a pattern of `3pt 4pt' and a phase of `1pt', the pattern % would start: `2pt on, 4pt off, 3pt on, 4pt off, 3pt on, 4pt off...'. % % % 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 \pgfutil@color command. Thus, each \pgfutil@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 \pgfutil@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 \pgfutil@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 \pgfutil@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. % % % Transparency % % \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. \def\pgfsys@transparencygroupfrombox#1{\pgf@sys@fail{transparency groups}} % This takes a TeX box and converts it into a transparency % group. This means that any transparency settings apply to the box as % a whole. For instance, if a box contains two overlapping black % circles and you draw them normally with 50% transparency, then the % overlap will be darker than the rest. By comparison, if the circles % are part of a transparency group, the overlap will get the same % color as the rest. % % The following settings modify the bevahiour of a transparency group: \newif\ifpgfsys@transparency@group@isolated \newif\ifpgfsys@transparency@group@knockout \def\pgfsys@blend@mode#1{\pgf@sys@fail{blend mode}} % Sets the current blend mode. See the PDF specification for details % on blend modes. \def\pgfsys@definemask{\pgf@sys@fail{image masks}} % 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. \def\pgfsys@fadingfrombox#1#2{\pgf@sys@fail{fadings}} % Declares an fading named #1. The parameter #2 must be a % box. Its contents luminosity determines the opacity of the resulting % mask. \def\pgfsys@usefading#1#2#3#4#5#6#7{\pgf@sys@fail{fadings}} % Installs a previously declared fading #1 in the current graphics % state. Parameters #2 to #7 specify a transformation cm that should % be applied to the mask before it is used. % % % Shading commands % % \def\pgfsys@horishading#1#2#3{\pgf@sys@fail{shadings}\pgf@sys@noshading{#1}} % 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}\pgf@sys@noshading{#1}} % 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}\pgf@sys@noshading{#1}} % 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. \def\pgfsys@functionalshading#1#2#3#4{\pgf@sys@fail{shadings (functional)}\pgf@sys@noshading{#1}} % Declares a shading using a PostScript-like function that provides a % color for each point. Like the previous macros, this command % should setup the macro `@pgfshading#1!' so that it will produce a % box containing the desired shading. % % Parameter #1 is the name of the shading. Parameter #4 is a % Postscript-like function (type 4 function of the PDF specification) % as described in Section 3.9.4 of the PDF Specification version 1.7. % Parameter #2 and #3 are pgf point specifications that specifies the % lower left and upper right coordinate. % % When function #4 is evaluated, the coordinate of the current % point will be on the (virtual) PostScript stack in bp units. After % the function has been evaluated, the stack should consist of three % numbers (not integers! - the Apple PDF renderer is broken in this % regard, so add cvr's at the end if needed) that represent the red, % green, and blue components of the color. % % A buggy #4 will result is *totally unpredictable chaos* during % rendering. \def\pgf@sys@noshading#1{\expandafter\global\expandafter\let\csname @pgfshading#1!\endcsname=\pgfutil@empty} % % % 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. It tries to do % so "locally" for the current page, but what really happens depends % strongly on the driver. For instance, dvips will use whatever is % used with the first call to this command that is part of the % shipped-out document and will ignore all other uses. In contrast, % pdftex will use the current value of the papersize for each page % and, additionally, setting the papersize is local to the current TeX % group. % #1 = width % #2 = height \def\pgfsys@global@papersize#1#2{\pgfsys@papersize{#1}{#2}} % This command does the same as the papersize command, only for % drivers that support this, \global is used to set the papersize. % #1 = width % #2 = height \def\pgfsys@prepare@papersize#1#2{\pgfsys@papersize{#1}{#2}} % Like \pgfsys@papersize, this prepares the paper size in a portable % way -- but it is supposed to be a preparation step before the % document has started. Drivers may decide to postpone the action % until the document has started. % % The root cause why I added this method is that image externalization % seems to suffer from the fact that some drivers need a "prepared" % routine whereas others must not have a prepared routine and have to % apply the action right-away. This method is the solution for image % externalization. % #1 = width % #2 = height \ifx\paperheight\@undefined \def\pgfsys@thepageheight{\the\vsize} % this is wrong, but I do not % know how to compute the page height % in plain tex. \def\pgfsys@thepagewidth{\the\hsize} \else \def\pgfsys@thepageheight{\paperheight} \def\pgfsys@thepagewidth{\paperwidth} \fi % % % 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 (#1,#2). \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% \setbox#1=\hbox{\box#1}% \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@pictureboxsynced#1{% {% \setbox0=\hbox{\pgfsys@beginpicture\box#1\pgfsys@endpicture}% \pgfsys@hboxsynced0% }% } % Basically, this should do the same as doing a (scoped) low level sync % followed by inserting the box #1 directly into the output % stream. However, the default implementation uses \pgfsys@hboxsynced % in conjunction with \pgfsys@beginpicture to ensure that, if % possible, hyperlinks survive in pdfs. Drivers that are sensitive to % picture-in-picture scopes shuold replace this implementation by % \pgfsys@beginscope\pgflowlevelsynccm\box#1\pgfsys@endscope \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{% \pgf@ya=\pgf@shift@baseline\relax% \advance\pgf@ya 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% \pgf@xa=\pgf@trimleft@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi \raise-\pgf@ya\box#1% \pgf@xa=\pgf@trimright@final\relax \ifdim\pgf@xa=0pt \else\kern\pgf@xa\fi } % 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\pgfutil@empty\else\edef\pgf@imagewidth{width=\pgf@imagewidth,}\fi% \ifx\pgf@imageheight\pgfutil@empty\else\edef\pgf@imageheight{height=\pgf@imageheight,}\fi% \ifx\pgf@imagepage\pgfutil@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\pgfutil@empty% \pgfsysprotocol@bufferedtrue% \pgfsys@beginscope% #4% \pgfsys@endscope% \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\pgfutil@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. % Discern the driver: % Default driver: \ifx\pgfsysdriver\@undefined \pgfutil@guessdriver \fi \input pgf.cfg \immediate\write-1{Driver file for pgf: \pgfsysdriver} \pgfutil@InputIfFileExists{\pgfsysdriver}{}{% \pgferror{Driver file ``\pgfsysdriver'' not found.}} % This will insert always-present-specials at the beginning of the % code. \AtBeginDocument{ \pgfsys@atbegindocument \let\pgfsys@atbegindocument=\pgfutil@empty } % Read aux file in plain and context mode: \pgfutil@aux@read@hook \endinput