%D \module
%D   [       file=spec-ini,
%D        version=1996.01.25,
%D          title=\CONTEXT\ Special Macros,
%D       subtitle=Initialization,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
%C details. 

%D Specials are \TEX's channel to the outside world. They make
%D \TEX\ even more platform independant and permit easy
%D adaption to new developments. One major drawback of specials
%D is that they have to be supported by printer drivers. We've
%D tried to overcome this problem by implementing specials as
%D a sort of drivers themselves.

\writestatus{loading}{Context Special Macros / Initialization}

\unprotect

\startmessages  dutch  library: specials
  title: specials
      1: -- geladen
      2: verdere nesting is niet toegestaan --
      3: -- gereset
      4: commando -- bestaat niet
      5: definitiefile -- wordt geladen
      6: nesting is niet toegestaan
      7: onbekende driver --
\stopmessages

\startmessages  english  library: specials
  title: specials
      1: -- loaded
      2: no deeper nesting is permitted --
      3: -- is reset
      4: command -- does not exist
      5: loading definition file --
      6: nesting is not permitted
      7: unknown driver --
\stopmessages

\startmessages  german  library: specials
  title: spezielles
      1: -- geladen
      2: keine tiefere Verschachtelung erlaubt --
      3: -- ist zurueckgesetzt
      4: Befehl -- existiert nicht
      5: lade Definitionsdatei --
      6: Verschachtelung nicht erlaubt
      7: unbekante Driver --
\stopmessages

\startmessages  czech  library: specials
  title: speciality
      1: -- nacteno
      2: neni dovoleno hlubsi zanoreni --
      3: -- je resetovano
      4: prikaz -- neexistuje
      5: nacita se definicni soubor --
      6: zanoreni neni dovoleno
      7: neznamy ovladac (driver) --
\stopmessages

\startmessages  italian  library: specials
  title: specialità
      1: -- caricato
      2: non è permesso un annidamento maggiore --
      3: -- reimpostato
      4: il comando -- non esiste
      5: caricamento del file di definizione --
      6: annidamento non permesso
      7: driver sconosciuto --
\stopmessages

\startmessages  norwegian  library: specials
  title: specials
      1: -- er lest inn
      2: dypere 'nesting' er ikke tillatt --
      3: -- er tilbakestilt
      4: kommando -- eksisterer ikke
      5: leser inn definisjonsfil for --
      6: 'nesting' er ikke tillatt
      7: ukjent driver --
\stopmessages

\startmessages  dutch  library: interactions
     21: -- code tussengevoegd
\stopmessages

\startmessages  english  library: interactions
     21: -- code inserted
\stopmessages

\startmessages  german  library: interactions
     21: -- Code eingefuegt
\stopmessages

\startmessages  czech  library: interactions
     21: -- kod vlozen
\stopmessages

\startmessages  italian  library: interactions
     21: codice -- inserito
\stopmessages

\startmessages  norwegian  library: interactions
     21: -- kode satt inn / tilføyd
\stopmessages

%D \TEX\ produces files in the \DVI\ format. This format is
%D well defined and stable. In this format one||byte commands
%D are used which can optionally be followed by length
%D specifiers and arguments. The \DVI||format incorporates a
%D channel to the outside world. This channel is activated by
%D the \TEX\ primitive \type {\special}. The sequence 
%D 
%D \starttypen
%D \special{Hello here I am.}
%D \stoptypen
%D
%D results in \DVI||codes:
%D
%D \starttypen
%D xxx1 16 Hello here I am.
%D \stoptypen
%D
%D The \type {xxx1} is represented in byte code 239 and the
%D number of following bytes in a~1, 2, 3 or~4 byte number. So
%D here we get $1+1+16$ bytes of code.
%D 
%D Translating these codes is upto the \DVI\ driver. It's
%D common use to ignore specials that cannot be interpreted, so
%D the example string should have no consequences for the
%D output. 

%D \macros 
%D   {everyresetspecials}
%D
%D Now what will this one do? We'll see in a few lines. 

\newevery \everyresetspecials \relax

%D \macros
%D   {jobsuffix}
%D
%D By default, \TEX\ produces \DVI\ files which can be 
%D converted to other filetypes. Sometimes it is handy to 
%D know what the target file will be. In other driver 
%D modules we wil set \type {\jobsuffix} to \type {pdf}.  

\def\jobsuffix{dvi}

\appendtoks \def\jobsuffix{dvi} \to \everyresetspecials

%D A rather fundamental difference between special and direct
%D settings is that the latter don't interfere with typesetting
%D but must be set before the first shipout, while the specials
%D must be packaged in the shipped out box in such a way that
%D they don't interfere. 

\newif\ifspecialbasedsettings \specialbasedsettingstrue

\appendtoks \specialbasedsettingstrue \to \everyresetspecials

%D Because there is no standardization in the use of specials,
%D more than one driver or program can be supported. The
%D specials are grouped in libraries. Some of these are
%D general, such as the \type{postscript} library, some are
%D tuned to a special kind of program, like the \type{pdf}
%D ones, and some support a specific driver, as we can see in
%D the \type{yandy} library. A library is build with the
%D commands:
%D
%D \starttypen
%D \startspecials[name][inheritance]
%D
%D \definespecial\none{...}
%D \definespecial\onlyone#1{...}
%D \definespecial\alot#1#2#3#4{...}
%D
%D \stopspecials
%D \stoptypen
%D
%D Because drivers can have overlap in low level macros, a 
%D mechanism of inheritance is implemented. The libraries 
%D defined as second argument are loaded first. 
%D
%D Every special has to be predefined first. We  do this with
%D the command:
%D
%D \starttypen
%D \installspecial [\none]    [and] [0]
%D \installspecial [\onlyone] [and] [1]
%D \installspecial [\alot]    [or]  [4]
%D \stoptypen
%D
%D This means as much as: there is a special names
%D \type{\none} which has no arguments and has more than one
%D appearance. The special \type{\alot} on the other hand has
%D four arguments and is only defined once. Every instance in
%D the libraries of a special of category \type{and} is
%D executed when called upon, but only one special of
%D category \type{or} can be active. Most of the
%D \type{postscript}||specials are of category \type{or},
%D because they tend to interfere with driver specific ones.
%D The interactive specials of \type{dviwindo} and \type{pdf}
%D are an example of specials that can be called both.
%D
%D A library is defined in a file with the name
%D \type{spec-...}. We load a library with the command:
%D
%D \starttypen
%D \usespecials [list]
%D \stoptypen
%D
%D where the list can contain one or more file tags, the
%D \type{...} in the filename. The keyword \type{reset}
%D resets all loaded specials. This is equivalent to
%D \type{\resetspecials}.

%D Although a mechanism of nesting can be implemented, we
%D prefer to use a inheritance mechanism as mentioned. Calls
%D upon \type{\usespecials} within a \type{\startspecials}
%D would lead to confusion and errors.

\newif\ifinheritspecials

%D We define some local constants and variables. They look a
%D bit horrible but we don't want conflicts.

\def\@@specfil@@{@@specfil@@}
\def\@@speclst@@{@@speclst@@}
\def\@@speccat@@{@@speccat@@}
\def\@@specarg@@{@@specarg@@}
\def\@@specexc@@{@@specexc@@}

\let\currentspecial    =\empty
\let\currentspecialfile=\empty
\let\preloadedspecials =\empty

%D \macros
%D   {preloadspecials}
%D
%D The following command can be used to show the loaded list
%D of specials.

\def\preloadspecials%
  {\doifsomething{\preloadedspecials}
     {\showmessage{\m!specials}{1}{\preloadedspecials}}}

%D \macros
%D   {startspecials}
%D
%D Every library has a unique name, which is given as the first
%D argument to \type{\startspecials}. When another library is
%D defined with the same name, previous specials can be
%D overruled. The name may differ from the file||tag.
%D
%D The optional second argument can consist of a list of
%D libraries that are to be loaded first. 

% to fuzzy and error prone 
%
% \def\dostartspecials[#1][#2]%
%   {\let\mainspecialfile=\currentspecialfile
%    \doifelsenothing{#2}
%      {\inheritspecialsfalse}
%      {\ifinheritspecials
%         \showmessage{\m!specials}{2}{(#2)}%
%       \else
%         \inheritspecialstrue
%         \processcommalist[#2]\dousespecials
%         \inheritspecialsfalse
%       \fi}%
%    \doifelsenothing{#1}
%      {\let\currentspecial\s!unknown}
%      {\def\currentspecial{#1}}%
%    \let\currentspecialfile=\mainspecialfile
%    \setevalue{\@@specfil@@\currentspecial}{\currentspecialfile}%
%    \unprotect
%    \addtocommalist{\currentspecial}\preloadedspecials}
% 
% \def\startspecials%
%   {\dodoubleempty\dostartspecials}
% 
% \def\stopspecials%
%   {\def\currentspecial{}%
%    \protect}

\def\dostartspecials[#1][#2]%
  {\doifsomething{#2}
     {\processcommalist[#2]\dousespecials}%
   \doifelsenothing{#1}
     {\let\currentspecial\s!unknown}
     {\def\currentspecial{#1}}%
   \unprotect
   \addtocommalist\currentspecial\preloadedspecials}

\def\startspecials%
  {\localpushmacro\currentspecial
   \dodoubleempty\dostartspecials}

\def\stopspecials%
  {\localpopmacro\currentspecial
   \protect}
 
%D \macros
%D   {installspecial,
%D    resetspecials}
%D
%D We have to install specials before we can define and use
%D them. The command itself is defined as a call to another
%D command that executes one or more user||defined specials,
%D depending of it's category: \type{or} versus \type{and}.
%D
%D The command \type{\installspecial} takes three
%D (non||optional) arguments: the name of the command, the
%D category it belongs to and the number of arguments it
%D takes.
%D
%D With \type{\resetspecials} we can unload the predefined
%D specials. Special reset actions |<|look in \type{spec-mis}
%D for an example|>| can be assigned to the token register 
%D \type{\everyresetspecials}.

\let\@@allspecials=\empty

\def\doinstallspecial[#1][#2][#3]%
  {\setvalue{\@@speclst@@\string#1}{}%
   \setvalue{\@@speccat@@\string#1}{#2}%
   \setvalue{\@@specarg@@\string#1}{#3}%
   \addtocommalist{\string#1}\@@allspecials
   \def#1{\executespecial#1}}

\def\installspecial%
  {\dotripleargument\doinstallspecial}

\def\resetspecials%
  {\the\everyresetspecials
   \def\docommando##1%
     {\letvalue{\@@speclst@@##1}\empty}%
   \processcommacommand[\@@allspecials]\docommando
   \ifx\preloadedspecials\empty \else
     \showmessage{\m!specials}{3}{\preloadedspecials}%
     \let\preloadedspecials\empty
   \fi}

%D \macros
%D   {definespecial}
%D
%D The command \type{\definespecial} take the place of
%D \type{\def} in the definition of a special. Just to be
%D sure, we first check if the command is permitted, i.e.
%D installed. If not, we give a warning and gobble the
%D illegal command in an quite elegant way.
%D
%D If the command can be combined (\type{and}) with others,
%D we append it to a list, otherwise (\type{or}) it becomes
%D the only item in the list.

\def\definespecial#1%
  {\ifx#1\undefined
     \showmessage{\m!specials}{4}{\string#1}%
     \def\next%
       {\def\@@illegalspecial@@}%
   \else
     \def\next%
       {\doifelse{\getvalue{\@@speccat@@\string#1}}{or}
          {\edef\@@newspeclst@@{\currentspecial}}
          {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}%
           \addtocommalist{\currentspecial}\@@newspeclst@@}%
        \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}%
        \setvalue{\currentspecial\string#1}}%
   \fi
   \next}

%D \macros
%D   {usespecials}
%D
%D We use \type{\usespecials} to load a specific library.
%D This command is only permitted outside de definition part.

\def\dousespecials#1%
  {\doifelse{#1}{\v!reset}
     {\resetspecials}
     {\doifdefinedelse{\@@specfil@@#1}
        {\edef\currentspecialfile{\getvalue{\@@specfil@@#1}}}
        {\edef\currentspecialfile{#1}}%
      \makeshortfilename[\f!specialprefix\currentspecialfile]%
      \showmessage{\m!specials}{5}{\currentspecialfile}%
      \startreadingfile
      \readsysfile{\shortfilename}{}{}%
      \stopreadingfile
      \showmessage{\m!specials}{1}{\preloadedspecials}}}

\def\usespecials[#1]%
  {\doifelsenothing{\currentspecial}
     {\processcommalist[#1]\dousespecials}
     {\showmessage{\m!specials}{6}{}}}

%D \macros
%D   {executespecials}
%D
%D The command \type{\executespecials} is used to execute the
%D defined specials. Once a special is installed, the special
%D itself calls for this command, so it's not needed outside
%D this module. One can use it if wanted.
%D 
%D A former implementation grouped the execution. Recent 
%D additions however |<|like the specials that implement object 
%D handling|>| asked for non||grouped execution. 

\def\executespecials#1#2%
  {\def\doonespecial##1%
     {\getvalue{##1\string#1}#2\relax}%
   \processcommacommand
     [\getvalue{\@@speclst@@\string#1}]\doonespecial}

\def\executespecial#1%
  {\expandafter\ifcase\getvalue{\@@specarg@@\string#1}\relax
     \def\next%
       {\executespecials#1{}}%
   \or
     \def\next##1%
       {\executespecials#1{{##1}}}%
   \or
     \def\next##1##2%
       {\executespecials#1{{##1}{##2}}}%
   \or
     \def\next##1##2##3%
       {\executespecials#1{{##1}{##2}{##3}}}%
   \or
     \def\next##1##2##3##4%
       {\executespecials#1{{##1}{##2}{##3}{##4}}}%
   \or
     \def\next##1##2##3##4##5%
       {\executespecials#1{{##1}{##2}{##3}{##4}{##5}}}%
   \or
     \def\next##1##2##3##4##5##6%
       {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}}}%
   \or
     \def\next##1##2##3##4##5##6##7%
       {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}}}%
   \or
     \def\next##1##2##3##4##5##6##7##8%
       {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}}}%
   \or
     \def\next##1##2##3##4##5##6##7##8##9%
       {\executespecials#1{{##1}{##2}{##3}{##4}{##5}{##6}{##7}{##8}{##9}}}% 
   \else
     \def\next%
       {\message{illegal special: \string#1}}%
   \fi
   \next}

%D The \type{{{...}}} are needed because we pass all those 
%D arguments to the specials support macro. 

\let\openspecialfile  = \relax
\let\closespecialfile = \relax

%D \macros
%D   {doifspecialavailableelse}
%D 
%D For testing purposes (this was first needed when object 
%D support was implemented) we have: 
%D 
%D \starttypen
%D \doifspecialavailableelse\specialcommand{true}{false}
%D \stoptypen
%D 
%D e.g: 
%D 
%D \starttypen
%D \doifspecialavailableelse\doinsertobject{...}{...}
%D \stoptypen

\def\doifspecialavailableelse#1#2#3%
  {\doifelsevaluenothing{\@@speclst@@\string#1}{#3}{#2}}

% %D This is some new, experimental code, used for testing some 
% %D proposals of Laurent Siebenmann on behalf of the 
% %D \kap{EMJ} discussionlist. 
% 
% \newif\ifexternalspecials  \externalspecialsfalse
% \newif\ifspecialstatus     \specialstatustrue
% 
% \newwrite\specialfile
% 
% \def\openspecialfile%
%   {\immediate\openout\specialfile=\jobname.etc\relax}
% 
% \def\closespecialfile%
%   {\immediate\closeout\specialfile}
% 
% \let\internalspecial=\special
% 
% \def\externalspecial#1%
%   {\internalspecial{}%
%    \immediate\write\specialfile{\currentspecialdriver\space: #1}}
% 
% \def\doinstallspecial[#1][#2][#3]%
%   {\setvalue{\@@specexc@@\string#1}{}%
%    \setvalue{\@@speclst@@\string#1}{}%
%    \setvalue{\@@speccat@@\string#1}{#2}%
%    \setvalue{\@@specarg@@\string#1}{#3}%
%    \addtocommalist{\string#1}\@@allspecials
%    \def#1{\executespecial#1}}
% 
% \def\resetspecials%
%   {\def\docommando##1%
%      {\setvalue{\@@specexc@@##1}{}%
%       \setvalue{\@@speclst@@##1}{}}%
%    \processcommacommand[\@@allspecials]\docommando
%    \showmessage{\m!specials}{3}{\preloadedspecials}}
% 
% \def\executespecials#1#2%
%   {\edef\supportedspecials{\getvalue{\@@speclst@@\string#1}}%
%    \def\doonespecial##1%
%      {\doifdefined{##1\string#1}
%         {\def\currentspecialdriver{##1}%
%          \getvalue{##1\string#1}#2\relax}}%
%    \ifexternalspecials
%      \let\special=\externalspecial
%      \doifelse{\supportedspecials}{}
%        {\ifspecialstatus
%           \immediate\write\specialfile{}%
%           \immediate\write\specialfile{skipping  : \string#1}
%           \immediate\write\specialfile{}%
%         \fi}
%        {\ifspecialstatus
%           \immediate\write\specialfile{}%
%           \immediate\write\specialfile{executing : \string#1}%
%           \immediate\write\specialfile{supported : \supportedspecials}%
%         \fi
%         \immediate\write\specialfile{}%
%         \processcommacommand[\supportedspecials]\doonespecial}%
%    \else
%      \let\special=\internalspecial
%      \doifelse{\getvalue{\@@speccat@@\string#1}}{or}
%        {\doonespecial{\getvalue{\@@specexc@@\string#1}}}
%        {\processcommacommand[\supportedspecials]\doonespecial}%
%    \fi}
% 
% \def\definespecial#1%
%   {\ifx#1\undefined
%      \showmessage{\m!specials}{4}{\string#1}%
%      \def\next%
%        {\def\@@illegalspecial@@}%
%    \else
%      \def\next%
%        {\edef\@@newspeclst@@{\getvalue{\@@speclst@@\string#1}}%
%         \addtocommalist{\currentspecial}\@@newspeclst@@
%         \setevalue{\@@speclst@@\string#1}{\@@newspeclst@@}%
%         \setevalue{\@@specexc@@\string#1}{\currentspecial}%
%         \setvalue{\currentspecial\string#1}}%
%    \fi
%    \next}
% 
% %D So far for the experiment. 

%D The following libraries are defined. Two postscript
%D drivers are supported, as well as two mechanisms for
%D interactive texts.
%D
%D \startregelcorrectie
%D \starttabel[|l|l|l|l|l|]
%D \HL
%D \NC \bf file             \NC
%D     \bf name             \NC
%D     \bf calls            \NC
%D     \bf support          \NC
%D     \bf program / driver \NC\SR
%D \HL
%D \NC \tttf spec-tex       \NC
%D     \tttf tex            \NC
%D                          \NC
%D     Generic \TEX\ (\DVI) \NC
%D     (default)            \NC\FR
%D \NC \tttf spec-tpd       \NC
%D     \tttf \PDF           \NC
%D                          \NC
%D     Han The Thanh        \NC
%D     (pdftex)             \NC\MR
%D \NC \tttf spec-ps        \NC
%D     \tttf postscript     \NC
%D                          \NC
%D     Adobe PostScript     \NC
%D     (default)            \NC\MR
%D \NC \tttf spec-tr        \NC
%D     \tttf rokicki        \NC
%D     \tttf postscript     \NC
%D     Thomas Rokicki       \NC
%D     (dvips)              \NC\MR
%D \NC \tttf spec-yy        \NC
%D     \tttf yandy          \NC
%D     \tttf postscript     \NC
%D     YandY                \NC
%D     (dvipsone, dviwindo) \NC\MR
%D \NC \tttf spec-pdf       \NC
%D     \tttf pdf            \NC
%D                          \NC
%D     Adobe PDF V2.1       \NC
%D     (Acrobat)            \NC\MR
%D \NC \tttf spec-win       \NC
%D     \tttf dviwindo       \NC
%D     YandY                \NC
%D     (dviwindo)           \NC\MR
%D \NC \tttf spec-1p0       \NC
%D     \tttf pdf            \NC
%D                          \NC
%D     Adobe PDF V 1.0      \NC
%D     (Acrobat)            \NC\MR
%D \NC \tttf spec-2p0       \NC
%D     \tttf pdf            \NC
%D                          \NC
%D     Adobe PDF V 2.0      \NC
%D     (Acrobat)            \NC\MR
%D \NC \tttf spec-htm       \NC
%D     \tttf html           \NC
%D                          \NC
%D     HTML V 2.0           \NC
%D     (dvips)              \NC\LR
%D \HL
%D \stoptabel
%D \stopregelcorrectie

%D \macros
%D   {dostartgraymode,dostopgraymode,
%D    dostartrgbcolormode,dostartcmykcolormode,dostartgraycolormode,dostopcolormode}
%D
%D Switching to and from color can be done in two ways:
%D
%D \startopsomming[opelkaar,n]
%D \som  insert driver specific commands
%D \som  pass instructions to the output device
%D \stopopsomming
%D
%D The first approach is more general and lays the
%D responsibility at the driver side. Probably due to the fact
%D that \TEX\ does not directly support color, we have been
%D confronted for the last few years with changing special
%D definitions. The need for support depends on how a macro
%D package handles colored text that crosses the page boundary.
%D Again, there are two approaches.
%D
%D \startopsomming[opelkaar,n]
%D \som  let \TEX\ do the job
%D \som  let the driver handle things
%D \stopopsomming
%D
%D The first approach is as driver independant as possible and
%D can easily be accomplished by using \TEX's mark mechanism.
%D In \CONTEXT\ we follow this approach. More and more, drivers
%D are starting to support color, including stacking them.
%D 
%D Colors as well as grayscales can be represented in scales
%D from~0 to~1. When drivers use values in the range 0..255,
%D this value has to be adapted in the translation process.
%D Technically it's possible to get a grayscale from combining
%D colors. In the \kap{RGB} color system, a color with Red,
%D Green and Blue components of 0.80 show the same gray as a
%D Gray Scale specified 0.80. The \kap{CMYK} color system
%D supports a Black component apart from Cyan, Magenta and
%D Yellow. 
%D 
%D Depending on the target format, color support differs from
%D gray support. PostScript for example offers different
%D operators for setting gray and color. This is because
%D printing something using three colors is someting else than
%D printing with just black.
%D
%D In \CONTEXT\ we have implemented a color subsystem that
%D supports the use of well defined colors that, when printed
%D in black and white, still can be distinguished. This
%D approach enables us to serve both printed and electronic
%D versions, using colored text and illustrations. More on the
%D fundamentals of this topic can be found in the \kap{MAPS} of
%D the Dutch User Group, 14 (95.1).
%D
%D To satisfy all those needs, we define four specials which
%D supply enough information for drivers to act upon. We
%D could have used more general commands with the keywords
%D 'rgb' and 'gray', but because these specials are used often,
%D we prefer the more direct and shorter alternative.
%D
%D We start with the installation of color and grayscale
%D specials. The values are in the range 0..1 (e.g. 0.25).
%D
%D \starttypen
%D \dostartgraymode      {gray} ... \dostopgraymode
%D \dostartrgbcolormode  {red} {green} {blue} ... \dostopcolormode
%D \dostartcmykcolormode {cyan} {magenta} {yellow} {black} ... \dostopcolormode
%D \dostartgraycolormode {gray} ... \dostopcolormode
%D \stoptypen
%D
%D Because we can expect conflicts between drivers, we
%D implement them as category \type{or}. In previous versions
%D of \DVIPSONE\ the use of their color||specials did not
%D interfere with the PostScript ones, but recent versions do.

\installspecial [\dostartgraymode]      [or] [1]
\installspecial [\dostopgraymode]       [or] [0]

\installspecial [\dostartrgbcolormode]  [or] [3]
\installspecial [\dostartcmykcolormode] [or] [4]
\installspecial [\dostartgraycolormode] [or] [1]
\installspecial [\dostopcolormode]      [or] [0]

%D For some drivers, the stop special is of no use and can
%D simply call the start one with zero arguments.

%D \macros
%D   {doinsertfile}
%D
%D Probably the most problematic special is the following
%D one. Because we want to be able to support different
%D schemes, we pass a lot of data to it.
%D 
%D The support of inserting files (like illustrations) comes in
%D many flavors. Some drivers use scales, some take dimensions.
%D Some need offsets and others act on stored characteristics.
%D They need one thing in common: a filename. Although separate
%D specials for different formats sometimes are more clear, we
%D decided to combine them all in one: 
%D 
%D \starttypen
%D \doinsertfile {type,method} {file,label} 
%D               {xscale} {yscale} {x} {y} {w} {h} 
%D               {options}
%D \stoptypen
%D
%D The scale is given percents, the other values are base 
%D points.
%D 
%D The special is implemented as \type{or}. Because \DVIPSONE\
%D understands them all, a chain of alternatives would generate
%D multiple occurrences of the same illustration. 
%D 
%D When option 1 is passed, the viewers is asked to present a
%D preview, like the first frame of a movie. 

\installspecial [\doinsertfile] [or] [9]

%D No start||stop construction is needed here, because there in
%D no further interference of \TEX. All dimensions are output
%D as scaled points and scales as a number, where 100 equal
%D 100\%. 

%D \macros
%D   {doinsertsoundtrack}
%D
%D Sounds are (for the moment) just files with 
%D associated options. 
%D
%D \starttypen
%D \doinsertsoundtrack {file} {label} {options} 
%D \stoptypen

\installspecial [\doinsertsoundtrack] [or] [3]

%D \macros
%D   {dogetnofinsertpages}
%D
%D Some file formats support more than one page, like \PDF, 
%D and for special applications, one may want to have access 
%D to the total number of pages. 
%D
%D \starttyping
%D \dogetnofinsertpages{filename}
%D \stoptyping
%D
%D The number is also available after the insert is placed, 
%D since inclusion may take place immediate when an insert is 
%D called upon. 

\def\nofinsertpages{1} % one of the few 'talk backs' 

\installspecial [\dogetnofinsertpages] [or] [1] 

%D \macros
%D   {dostartrotation,
%D    dostoprotation}
%D
%D We support rotation with the special:
%D
%D \starttypen
%D \dostartrotation {angle} ... \dostoprotation
%D \stoptypen
%D
%D For the moment these specials are installed as
%D category \type{or}.

\installspecial [\dostartrotation] [or] [1]
\installspecial [\dostoprotation]  [or] [0]

%D \macros
%D   {dostartscaling,
%D    dostopscaling}
%D
%D Scaling is also supported:
%D
%D \starttypen
%D \dostartscaling {x} {y} ... \dostopscaling
%D \stoptypen
%D
%D Like the previous one, these specials are of category 
%D \type{or}.

\installspecial [\dostartscaling] [or] [2]
\installspecial [\dostopscaling]  [or] [0]

%D \macros
%D   {dostartmirroring,
%D    dostopmirroring}
%D
%D And indeed, mirroring is there too:
%D
%D \starttypen
%D \dostartmirroring {x} {y} ... \dostopmirroring
%D \stoptypen
%D
%D Again these specials are installed as category \type{or}.

\installspecial [\dostartmirroring] [or] [0]
\installspecial [\dostopmirroring]  [or] [0]

%D \macros
%D   {dostartnegative,
%D    dostopnegative}
%D
%D When producing output for an image setter, negating the 
%D page comes into view. Here are the tools:

\installspecial [\dostartnegative] [or] [0]
\installspecial [\dostopnegative]  [or] [0]

%D \macros
%D   {doselectfirstpaperbin,
%D    doselectsecondpaperbin}
%D
%D Here are some very printer||specific ones. No further
%D comment.

\installspecial [\doselectfirstpaperbin]  [or]  [0]
\installspecial [\doselectsecondpaperbin] [or]  [0]

%D \macros
%D   {doovalbox}
%D
%D When we look at the implementation, this is a complicated
%D one. There are seven arguments.
%D
%D \starttypen
%D \doovalbox {w} {h} {d} {linewidth} {radius} {stroke} {fill}
%D \stoptypen
%D
%D This command has to return a \type{\vbox} which can be used
%D to lay over another one (with text). The radius is in
%D degrees, the stroke and fill are~\type{1} (true) of~\type{0}
%D (false). 

\installspecial [\doovalbox] [or] [7]

%D \macros 
%D   {dostartclipping,dostopclipping}
%D 
%D Clipping is implemented in such a way that an arbitrary 
%D can be fed. 
%D 
%D \starttypen 
%D \dostartclipping {pathname}{width} {height} 
%D \dostopclipping 
%D \stoptyping
%D
%D 

\installspecial [\dostartclipping] [or] [3]
\installspecial [\dostopclipping]  [or] [0]

%D \macros
%D   {dosetupidentity}
%D
%D We can declare some characteristics of the document with
%D
%D \starttypen 
%D \dosetupidentity {title} {subject} {author} {creator} {date} 
%D \stoptypen
%D
%D All data is in string format. 

\installspecial [\dosetupidentity] [and] [5]

%D \macros
%D   {dosetuppaper}
%D
%D This special can be used to tell the driver what page size
%D to use. The special takes three arguments. 
%D
%D \starttypen
%D \dosetuppaper {type} {width} {height}
%D \stoptypen
%D
%D The type is one of the common identifiers, like A4, A5 or 
%D B2. 

\installspecial [\dosetuppaper] [and] [3]

%D \macros
%D   {dosetupprinter}
%D
%D Some drivers enable the user to specify the paper type 
%D used and/or page dimensions to be taken into account. 
%D
%D \starttypen
%D \dosetupprinter {type} {hoffset} {voffset} {width} {height}
%D \stoptypen
%D
%D The first argument is one of \type{letter}, \type{legal}, 
%D \type{A4}, \type{A5} etc. The dimensions are in 
%D basepoints. 

\installspecial [\dosetupprinter] [and] [5]

%D \macros
%D   {% dosetuppage,
%D    dosetupopenaction, dosetupclosaction,
%D    dosetupopenpageaction, dosetupclospageaction,
%D    dosetupinteraction,
%D    dosetupscreen,
%D    dosetupviewmode}
%D
%D Here come some obscure interactive commands. Probably the
%D specs will change with the development of the macros that
%D use them.
%D
%D The first ones can be used to set up the interaction.
%D
%D \starttypen
%D \dosetupinteraction
%D \stoptypen
%D
%D Normally this command does nothing but giving a message
%D that some scheme is supported. 
%D
%D \starttypen
%D \dosetupstartaction
%D \dosetupstopaction
%D \stoptypen
%D
%D These two setup the actions to be executed when the document
%D is opened and closed. 
%D
%D The next command sets up the screen. It takes five 
%D arguments:
%D
%D \starttypen
%D \dosetupscreen {hoffset} {voffset} {width} {height} {options}
%D \stoptypen
%D
%D The first four arguments are in scaled points. Option~1 
%D results in a full screen launch.
%D
%D \starttypen
%D \dosetuppageview {keyword}
%D \stoptypen
%D
%D For the moment we only support \type{fit}. 

\installspecial [\dosetupinteraction]     [and] [0]
\installspecial [\dosetupopenaction]      [and] [0]
\installspecial [\dosetupcloseaction]     [and] [0]
\installspecial [\dosetupopenpageaction]  [and] [0]
\installspecial [\dosetupclosepageaction] [and] [0]
\installspecial [\dosetupscreen]          [and] [5]
\installspecial [\dosetuppageview]        [and] [1]

%D \macros
%D   {dostarthide,
%D    dostophide}
%D
%D Not every part of the screen is suitable for paper. Menus
%D for instance have no meaning on an non||interactive medium.
%D These elements are hidden by means of:
%D
%D \starttypen
%D \dostarthide
%D \dostophide
%D \stoptypen

\installspecial [\dostarthide] [or] [0]
\installspecial [\dostophide]  [or] [0]

%D \macros
%D   {dostartgotolocation, dostopgotolocation,
%D    dostartgotorealpage, dostopgotorealpage}
%D
%D When we want to support hypertext buttons, again we have 
%D to deal with two concepts.
%D
%D \startopsomming[opelkaar,n]
%D \som let \TEX\ highlight the text
%D \som let the driver show us where to click
%D \stopopsomming
%D 
%D The first approach is the most secure one. It gives us
%D complete control over the visual appearance of hyper
%D buttons. The second alternative lets the driver guess what
%D part of the text needs highlighting. As long as we deal with
%D not too complicated textual buttons, this is no problem.
%D It's even a bit more efficient when we take long mid
%D paragraph active regions into account. When we let \TEX\
%D handle active sentences {\em for instance marked like this
%D one}, we have to take care of line- and pagebreaks ourselve.
%D However, it's no trivial matter to let a driver find out
%D where things begin and end. Because most hyperlinks can be
%D found in tables of contents and registers, the saving in
%D terms of bytes can be neglected and the first approach is a 
%D clear winner. 
%D 
%D The most convenient way of cross||referencing is using named
%D destinations. A more simple scheme is using page numbers as
%D destinations. Because the latter alternative can often be
%D implemented more efficient, and because we cannot be sure
%D what scheme a driver supports, we always have to supply a
%D pagenumber, even when we use named destinations.
%D
%D To enable a driver to find out what to make active, we have
%D to provide begin and endpoints, so like with color, we use
%D pairs of specials. The first scheme can be satisfied with
%D proper dimensions of the areas to be made active.
%D
%D The interactive real work is done by the following four
%D specials. The reason for providing the first one with both
%D a label and a number, is a result of the quite poor
%D implementation of \type{pdfmarks} in version 1.0 of
%D Acrobat. Because only pagenumbers were supported as
%D destination, we had to provide both labels (\DVIWINDO) and
%D pagenumbers (\PDF). Some drivers use start stop pairs. 
%D
%D \starttypen
%D \dostartgotolocation {w} {h} {url} {file} {label} {page}
%D \dostartgotorealpage {w} {h} {url} {file}         {page}
%D \stoptypen
%D
%D Their counterparts are:
%D
%D \starttypen
%D \dostopgotolocation  
%D \dostopgotorealpage  
%D \stoptypen
%D
%D The internal alternative is used for system||generated
%D links, the external one for user||generated links. The 
%D Uniform Resource Locator can be used to let the reader 
%D surf the net. 

\installspecial [\dostartgotolocation] [and] [6]
\installspecial [\dostopgotolocation]  [and] [0]
\installspecial [\dostartgotorealpage] [and] [5]
\installspecial [\dostopgotorealpage]  [and] [0]

%D One may wonder why jumps to page and location are not
%D combined. By splitting them, we enable macro||packages to
%D force the prefered alternative, while on the other hand
%D drivers can pick up the alternative desired most.

%D \macros
%D  {dostartgotoJS, doflushJSpreamble}
%D   
%D Rather special is the option to include and execute 
%D JavaScript code. This is a typical \PDF\ option.
%D
%D \starttypen
%D \dostartgotoJS {w} {h} {script}
%D \stoptypen
%D
%D This not so standard \TEX\ feature should be used with 
%D care. Preamble scripts are flushed by
%D
%D \doflushJSpreamble {script}

\installspecial [\dostartgotoJS]    [and] [3]
\installspecial [\dostopgotoJS]     [and] [0]
\installspecial [\doflushJSpreamble][and] [1]

%D \macros
%D   {dostartthisislocation, dostopthisislocation,
%D    dostartthisisrealpage, dostopthisisrealpage}
%D
%D Before we can goto some location or page, we have to tell
%D the system where it can be found. Because some drivers
%D follow the \SGML\ approach of begin||end tags, we have to
%D support pairs. A possible extension to this scheme is
%D supplying coordinates for viewing the text.
%D
%D The opposite commands of \type{\dogotosomething} have only
%D one argument:
%D
%D \starttypen
%D \dostartthisislocation {label}
%D \dostartthisisrealpage {page}
%D \stoptypen
%D
%D These commands are accompanied by: 
%D
%D \starttypen
%D \dostopthisislocation  
%D \dostopthisisrealpage 
%D \stoptypen
%D
%D As with all interactive commands's they are installed as
%D \type{and} category specials.

\installspecial [\dostartthisislocation] [and] [1]
\installspecial [\dostopthisislocation]  [and] [0]
\installspecial [\dostartthisisrealpage] [and] [1]
\installspecial [\dostopthisisrealpage]  [and] [0]

%D In \CONTEXT\ we don't use the \type{\stopsomething} 
%D macros because we let \TEX\ take care of typographic 
%D issues.  

%D \macros
%D   {doresetgotowhereever}
%D 
%D These and others need:

\installspecial [\doresetgotowhereever] [and] [0]

%D \macros
%D   {dostartexecutecommand, dostopexecutecommand}
%D
%D The actual behavior of the next pair of commands depends 
%D much on the viewing engine. Therefore one cannot depend 
%D too much on their support. 
%D
%D \starttypen
%D \dostartexecutecommand {w} {h} {command} {options} 
%D \stoptypen
%D
%D At least the next commands are supported (more examples 
%D can be found in \type {spec-fdf.tex}: 
%D
%D \startregelcorrectie\steluitlijnenin[midden]\leavevmode
%D \starttabel[|l|l|] 
%D \HL
%D \NC \bf command  \NC \bf action                  \NC\SR 
%D \HL
%D \NC first        \NC go to the first page        \NC\FR
%D \NC previous     \NC go to the previous page     \NC\MR
%D \NC next         \NC go to the next page         \NC\MR
%D \NC last         \NC go to the last page         \NC\MR
%D \NC backward     \NC go back to the  link list   \NC\MR
%D \NC forward      \NC go forward in the link list \NC\MR
%D \NC print        \NC enter print mode            \NC\MR
%D \NC exit         \NC exit viewer                 \NC\MR
%D \NC close        \NC close document              \NC\MR
%D \NC enter        \NC enter viewer                \NC\MR
%D \NC help         \NC show help on the viewer     \NC\LR
%D \HL
%D \stoptabel
%D \stopregelcorrectie
%D
%D Options are to be passed as a comma separated list of 
%D assignments.

\installspecial [\dostartexecutecommand] [and] [4]
\installspecial [\dostopexecutecommand]  [and] [0]

%D \macros
%D   {dostartobject, 
%D    dostopobject,
%D    doinsertobject}
%D
%D Reuse of object can reduce the output filesize 
%D considerably. Reusable objects are implemented with: 
%D
%D \starttypen
%D \dostartobject{class}{name}{width}{height}{depth}
%D some typeset material
%D \dostopobject
%D \stoptypen
%D
%D \starttypen
%D \doinsertobject{class}{name}
%D \stoptypen
%D
%D The savings can be huge in interactive texts. 

\installspecial [\dostartobject]  [or] [5]
\installspecial [\dostopobject]   [or] [0]
\installspecial [\doinsertobject] [or] [2]

%D \macros
%D   {doregisterfigure}
%D 
%D Images can be objects as well and it's up to the driver to
%D handle this. Alternative images are also up to the driver,
%D and the next macro tells the driver that the previous image
%D is somehow followed by another and that both have to be
%D handled together. This is a rather fuzzy model, but for the 
%D moment it suits its purpose: low res screen versions combined
%D with high res printable ones. 

\installspecial [\doregisterfigure][or] [2]

% %D \macros
% %D   {dogetobjectreference} 
% %D
% %D For very special purposes, one can ask for the internal 
% %D reference to the object. Beware!
% 
% \installspecial [\dogetobjectreference] [or] [3]
% 
% %D The first argument is the name, the second a macro that 
% %D gets the assiciated value.

%D \macros
%D   {dostartrunprogram, dostoprunprogram,
%D    dostartgotoprofile, dostopgotoprofile,
%D    dobeginofprofile,
%D    doendofprofile}
%D
%D These specials are still experimental. They are not yet
%D supported by the programs the way they should be.
%D
%D {\em --- still undocumented ---}

\installspecial [\dostartrunprogram]  [and] [3]
\installspecial [\dostoprunprogram]   [and] [0]
\installspecial [\dostartgotoprofile] [and] [3]
\installspecial [\dostopgotoprofile]  [and] [0]
\installspecial [\dobeginofprofile]   [and] [4]
\installspecial [\doendofprofile]     [and] [0]

%D \macros
%D   {doinsertbookmark}
%D 
%D Bookmarks, that is viewer generated tables of contents, are
%D a strange phenomena, mainly because \TEX\ can provide
%D whatever kind of table in much better quality. 

\installspecial [\doinsertbookmark] [and] [5]

%D This special is called as:
%D 
%D \starttypen
%D \doinstallbookmark {level} {nofsubentries} {text} {page} {open}
%D \stoptypen
%D
%D This definition is very \PDF\ oriented, so for more 
%D information we kindly refer to the \PDF\ manuals. 

%D \macros
%D   {dosetpagetransition}
%D
%D In presentations, fancy page transitions can, at least for a
%D short moment, let the audience focus at the screen. Like the
%D previous one, this special is very \PDF. 
%D
%D \starttypen
%D \dosetpagetransition{dissolve}{0}
%D \stoptypen
%D
%D Transitions have symbolic names, like dissolve, box, split,
%D blinds, wipe and glitter. The second argument determines 
%D the wait time (unless zero). 

\installspecial [\dosetpagetransition] [or] [2]

%D \macros
%D   {dopresettextfield,dopresetlinefield,
%D    dopresetchoicefield,dopresetpopupfield,dopresetcombofield,
%D    dopresetbuttonfield,dopresetcheckfield,
%D    dopresetradiofield,dopresetradiorecord}
%D
%D The special drivers are programmed independant from their
%D calling macros are thereby use the standard \TEX\ way of
%D passing parameters. Unfortunately fields often have more
%D than nine characteristics, so we pack some arguments in one. 
%D 
%D \starttypen
%D \dopresettextfield / \dopresetlinefield
%D   {name} {width} {height} {default} {length} 
%D   {style,color} {options} {alignment} {actions}
%D 
%D \dopresetchoicefield / \dopresetpopupfield / \dopresetcombofield
%D   {name} {width} {height} {default} 
%D   {style,color} {options} {values} {actions}
%D 
%D \dopresetpushfield 
%D   {name} {width} {height} {default}
%D   {options} {values} {actions}
%D 
%D \dopresetcheckfield 
%D   {name} {width} {height} {default} 
%D   {options} {values} {actions}
%D 
%D \dopresetradiofield
%D   {name} {width} {height} 
%D   {options} {parent} {values} {actions}
%D 
%D \dopresetradiorecord
%D   {name} {top} {options} {kids} {actions}
%D \stoptypen

\installspecial [\dopresetlinefield]   [or] [9]
\installspecial [\dopresettextfield]   [or] [9]
\installspecial [\dopresetchoicefield] [or] [8]
\installspecial [\dopresetpopupfield]  [or] [8]
\installspecial [\dopresetcombofield]  [or] [8]
\installspecial [\dopresetpushfield]   [or] [7]
\installspecial [\dopresetcheckfield]  [or] [7]
\installspecial [\dopresetradiofield]  [or] [7]
\installspecial [\dopresetradiorecord] [or] [5]

%D \macros
%D   {dodefinefieldset,dogetfieldset,doiffieldset}
%D 
%D Field sets, used in resetting and submitting, are handled
%D by:

\installspecial [\dodefinefieldset] [or] [2]
\installspecial [\dogetfieldset]    [or] [1]
\installspecial [\doiffieldset]     [or] [2]

%D \macros 
%D   {dosetfieldstatus}
%D
%D For practical reasons we set some field characteristics 
%D using: 
%D
%D \starttypen
%D \dosetfieldstatus {mode} {parent} {kids} {root}
%D \stoptypen

\installspecial [\dosetfieldstatus] [or] [4]

%D with:

\def\fieldlonermode {0} % no \chardef here
\def\fieldparentmode{1} % no \chardef here
\def\fieldchildmode {2} % no \chardef here
\def\fieldcopymode  {3} % no \chardef here

%D \macros 
%D   {doregistercalculationset}
%D
%D We can define a calculation order list with:
%D
%D \starttypen
%D \doregistercalculationset {set identifier}
%D \stoptypen

\installspecial [\doregistercalculationset] [or] [1]

%D \macros 
%D   {doinsertcomment}
%D
%D Not so much out of need, but to be complete, we also 
%D implement text annotations, so called  comment:
%D 
%D \starttypen
%D \doinsertcomment
%D   {title} {width} {height} {color} {open} {symbol} {data} 
%D \stoptypen

\installspecial[\doinsertcomment] [and] [7]

%D \macros
%D   {dosetposition, dosetpositionwhd, dosetpositionpapersize}
%D
%D Not natural to \TEX, but available in \PDFTEX, and by 
%D means of postprocessed \DVI, we can save and call upon 
%D positions. 
%D
%D \starttypen
%D \dosetposition          {identifier}
%D \dosetpositionwhd       {identifier} {width} {height} {depth}
%D \dosetpositionpapersize {width} {height} 
%D \stoptypen
%D
%D This is one of the few specials where when using \PDFTEX\ 
%D the driver directly deals with the utility file. 

\installspecial [\dosetposition]          [or] [1] 
\installspecial [\dosetpositionwhd]       [or] [4] 
\installspecial [\dosetpositionpapersize] [or] [2] 

%D So far for the installation. For quite some time the 
%D \CONTEXT\ way of specifying the output format has been: 
%D
%D \starttypen
%D \usespecials[ps,yy,win,pdf]
%D \stoptypen
%D
%D Because at \PRAGMA\ we use \DVIPSONE, this was a suitable 
%D setting, but with \CONTEXT\ going public, the next sequence 
%D is more suitable for \DVIPS\ users: 
%D 
%D \starttypen
%D \usespecials[reset,ps,tr,pdf]
%D \stoptypen
%D
%D On the other hand, for \PDFTEX\ we needed: 
%D
%D \starttypen
%D \usespecials[tpd]
%D \stoptypen
%D
%D To simplify things, I decided to provide a higher level 
%D command. 
%D
%D \starttypen
%D \defineoutput[name][specials]
%D \setupoutput[name,...]
%D \stoptypen
%D
%D In a few lines, we will see some examples. 

\def\defineoutput%
  {\dodoubleargument\dodefineoutput}

\def\dodefineoutput[#1][#2]%
  {\setvalue{\??ui#1}{#2}} 

\def\dosetupoutput#1%
  {\doifdefinedelse{\??ui#1}
     {\processcommacommand[\getvalue{\??ui#1}]\dousespecials}
     {\doifdefinedelse{\@@specfil@@#1}
        {\dousespecials{#1}}
        {\showmessage{\m!specials}{7}{#1}}}}

\def\setupoutput[#1]%
  {\resetspecials\processcommacommand[#1]\dosetupoutput}

%D Some suitable definitions are: 

\defineoutput [dvipsone] [dvi,ps,yy]
\defineoutput [dviwindo] [dvi,ps,yy,win]
\defineoutput [dvips]    [dvi,ps,tr]
\defineoutput [dviview]  [dvi,ps,tr,dv]
\defineoutput [dvipdfm]  [dpm]
\defineoutput [pdftex]   [tpd]   
\defineoutput [pdf]      [tpd]   
\defineoutput [acrobat]  [pdf,ps,tr] % use: [acrobat,dvipsone]   

%D Please let me know if we need more. From now on we default
%D to:

\setupoutput [dvips]

%D We don't enable \ACROBAT, because pure \POSTSCRIPT\ is not
%D that strong on objects and \PDFTEX\ does a better job. 
%D Some reasonable alternatives are:
%D 
%D \starttypen
%D \setupoutput [dvipsone,acrobat]
%D \setupoutput [dviwindo,acrobat]
%D \stoptypen
%D 
%D Although, better is:
%D 
%D \starttypen
%D \setupoutput [pdftex]
%D \stoptypen

\protect

\endinput
