% 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 Free Documentation License.
%
% See the file doc/generic/pgf/licenses/LICENSE for more details.

\section{The Protocol Subsystem}

\label{section-protocols}

\makeatletter

This section describes commands for \emph{protocolling} literal text
created by \pgfname. The idea is that some literal text, like the string
of commands used to draw an arrow head, will be used over and over
again in a picture. It is then much more efficient to compute the
necessary literal text just once and to quickly insert it ``in a
single sweep.''

When protocolling is ``switched on,'' there is a ``current protocol''
to which literal text gets appended. Once all commands that needed to
be protocolled have been issued, the protocol can be obtained and
stored using |\pgfsysprotocol@getcurrentprotocol|. At any point, the
current protocol can be changed using a corresponding setting
command. Finally, |\pgfsysprotocol@invokecurrentprotocol| is used to
insert the protocolled commands into the |.pdf| or |.dvi| file.

Only those |\pgfsys@| commands can be protocolled that use the
command |\pgfsysprotocol@literal| internally. For example, the
definition of |\pgfsys@moveto| in |pgfsys-common-pdf.def| is
\begin{codeexample}[code only]
\def\pgfsys@moveto#1#2{\pgfsysprotocol@literal{#1 #2 m}}
\end{codeexample}
All ``normal'' system-level commands can be protocolled. However,
commands for creating or invoking shadings, images, or whole pictures
require special |\special|'s and cannot be protocolled.

\begin{command}{\pgfsysprotocol@literalbuffered\marg{literal text}}
  Adds the \meta{literal text} to the current protocol, after it has
  been ``|\edef|ed.'' This command will always be protocolled.
\end{command}

\begin{command}{\pgfsysprotocol@literal\marg{literal text}}
  First calls |\pgfsysprotocol@literalbuffered| on \meta{literal
    text}. Then, if protocolling is currently switched off, the
  \meta{literal text} is passed on to |\pgfsys@invoke|.
\end{command}

\begin{command}{\pgfsysprotocol@bufferedtrue}
  Turns on protocolling. All subsequent calls of
  |\pgfsysprotocol@literal| will append their argument to the current
  protocol.
\end{command}

\begin{command}{\pgfsysprotocol@bufferedfalse}
  Turns off protocolling. Subsequent calls of
  |\pgfsysprotocol@literal| directly insert their argument into the
  current |.pdf| or |.ps|.

  Note that if the current protocol is not empty when protocolling is
  switched off, the next call to |\pgfsysprotocol@literal| will first
  flush the current protocol, that is, insert it into the file.
\end{command}

\begin{command}{\pgfsysprotocol@getcurrentprotocol\marg{macro name}}
  Stores the current protocol in \meta{macro name} for later use.
\end{command}

\begin{command}{\pgfsysprotocol@setcurrentprotocol\marg{macro name}}
  Sets the current protocol to \meta{macro name}.
\end{command}

\begin{command}{\pgfsysprotocol@invokecurrentprotocol}
  Inserts the text stored in the current protocol into the |.pdf| or
  |.dvi| file. This does \emph{not} change the current protocol.
\end{command}

\begin{command}{\pgfsysprotocol@flushcurrentprotocol}
  First inserts the current protocol, then sets the current protocol
  to the empty string.
\end{command}


%%% Local Variables:
%%% mode: latex
%%% TeX-master: "pgfmanual"
%%% End:
