%D \module
%D   [       file=m-pictex,
%D        version=1997.01.15,
%D          title=\CONTEXT\ Extra Modules,
%D       subtitle=\PICTEX\ Loading Macros,
%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 This module is one big hack. This hack is not needed when
%D using \ETEX, so there we simply load \PICTEX\ and quit.

%D Not every package defines \type{\fiverm}, \PICTEX's pixel,
%D so let's take care of that omision here. The actual loading
%D of \PICTEX\ depends on the package. For \LATEX\ users we
%D take care of loading the auxiliary ones too.

\def\loadpictex
  {\ifx\grid\undefined \else \let\normalgrid\grid \fi
   \ifx\axis\undefined \else \let\normalaxis\axis \fi
   \ifx\undefined\fiverm
     \font\fiverm=cmr5
   \fi
   \ifx\beginpicture\undefined
     \ifx\newenvironment\undefined
       \readfile{thrd-pic.tex}{}{}
     \else
       \input prepictex.tex  \relax
       \input pictex.tex     \relax
       \input postpictex.tex \relax
     \fi
   \fi
   \ifx\normalgrid\undefined \else
     \let\pictexgrid\grid
     \let\grid\normalgrid
   \fi
   \ifx\normalaxis\undefined \else
     \let\pictexaxis\axis
     \let\axis\normalaxis
   \fi}

\ifx\eTeXversion\undefined \else \loadpictex \expandafter \endinput \fi

%D When not in \ETEX\ and not in \CONTEXT, we load a few
%D auxiliary macros.

\ifx \undefined \writestatus \input supp-mis.tex \relax \fi

\unprotect

%D \TEX\ provides 256 \DIMENSIONS\ and 256 \SKIPS. In \CONTEXT\
%D this is no problem, but in packages that have many
%D authors, one can be quite sure that a lot of \DIMENSIONS\ are
%D allocated. Packages that use \PICTEX\ can therefore run out
%D of \DIMENSIONS\ quite fast. This module was written as a
%D reaction to persistent problems with loading \PPCHTEX\ in
%D \LATEX\ and \PICTEX\ deserves a solution. I therefore
%D dedicate this module to Tobias Burnus and Dirk Kuypers, who
%D use \PPCHTEX\ in a \LATEX\ environment and suggested a lot
%D of extensions to the repertoire of \PPCHTEX\ commands.
%D
%D This module presents a solution that is quite effective: all
%D \DIMENSIONS\ are drawn from the pool of \DIMENSIONS\ and
%D \SKIPS, depending on the availability. This is possible
%D because \DIMENSIONS\ are \SKIPS\ without a glue component.
%D Therefore we can use \SKIPS\ as \DIMENSIONS. However, some
%D incompatibility can result from assignments that look like:
%D
%D \starttyping
%D \somedimen=\someskip
%D \stoptyping
%D
%D In such cases the \DIMENSION\ equals the fixed part of the
%D \SKIP\ or in other words: this assignment strips off the
%D glue. Because \PICTEX\ uses no glue components, I thought
%D I could interchange both register types without problems,
%D but alas, this didn't hold for all \DIMENSIONS.

%D In \PLAIN\ \TEX\ the allocation macros are defined with (as)
%D \type{\outer}. This means that they cannot appear inside
%D macros, not even in an indirect way. We therefore have to
%D redefine both \type{\newdimen} and \type{\newskip} to
%D non||\type{\outer} alternatives. In most macro packages this
%D redefinition already took place. We save the original
%D meanings, so we can restores them afterwards.

\let\normalnewdimen = \newdimen
\let\normalnewskip  = \newskip

\def\temporarynewdimen {\alloc@1\dimen\dimendef\insc@unt}
\def\temporarynewskip  {\alloc@2\skip \skipdef \insc@unt}

%D Here comes the trick. Depending on how many \DIMENSIONS\ and
%D \SKIPS\ are allocated, the \type{\newdimen} assigns a
%D \DIMENSIONS\ or \SKIP. \PLAIN\ \TEX\ allocates 15 \DIMENSIONS\
%D and 17 \SKIPS. After loading \PICTEX, 71 \DIMENSIONS\ and
%D and 71 \SKIPS\ are allocated. Indeed, \PICTEX\ needs 110
%D \DIMENSIONS !
%D
%D \starttyping
%D \def\newdimen
%D   {\ifnum\count11>\count12
%D      \let\next\temporarynewskip
%D    \else
%D      \let\next\temporarynewdimen
%D    \fi
%D    \next}
%D \stoptyping
%D
%D When I was testing a new version of \PPCHTEX\ in \PLAIN\
%D \TEX\ I had to find out that this exchange of registers
%D sometimes leads to unwanted results. It took me some hours
%D to find out that the source of errors originated in
%D constructions like:
%D
%D \starttyping
%D \ifdim\DimenOne<\DimenTwo whatever you want \else or not \fi
%D \stoptyping
%D
%D When \type{\DimenOne} is a \SKIP\ and \type{\DimenTwo} is a
%D \DIMENSION, \TEX\ scans for some optional glue component,
%D like in:
%D
%D \starttyping
%D \skip0=\dimen0 plus 10pt minus 5pt
%D \stoptyping
%D
%D The most robust solution to this problem is:
%D
%D \starttyping
%D \ifdim\DimenOne<\DimenTwo\relax right \else wrong \fi
%D \stoptyping
%D
%D Some close reading of the \PICTEX\ source however learned me
%D that this problem could be solved best by just honoring the
%D allocation of \DIMENSIONS\ when the name of the macro
%D explictly stated the character sequence \type{dimen}. A next
%D implementation therefore automatically declared all
%D \DIMENSIONS\ with this sequence in their names with
%D \type{\dimen}. Again I was too optimistic, so now we do it
%D this way (the comments are from \PICTEX, which like \TABLE,
%D is an example of a well documented package):

\temporarynewdimen\!dimenA       %.AW.X.DVEUL..OYQRST
\temporarynewdimen\!dimenB       %....X.DVEU...O.QRS.
\temporarynewdimen\!dimenC       %..W.X.DVEU......RS.
\temporarynewdimen\!dimenD       %..W.X.DVEU....Y.RS.
\temporarynewdimen\!dimenE       %..W........G..YQ.S.
\temporarynewdimen\!dimenF       %...........G..YQ.S.
\temporarynewdimen\!dimenG       %...........G..YQ.S.
\temporarynewdimen\!dimenH       %...........G..Y..S.
\temporarynewdimen\!dimenI       %...BX.........Y....
\temporarynewdimen\!dxpos        %..W......U..P....S.
\temporarynewdimen\!dypos        %..WB.....U..P......
\temporarynewdimen\!xloc         %..WB.....U.......S.
\temporarynewdimen\!xpos         %..........L.P..Q.ST
\temporarynewdimen\!yloc         %..WB.....U.......S.
\temporarynewdimen\!ypos         %..........L.P..Q.ST
\temporarynewdimen\!zpt          %.AWBX.DVEULGP.YQ.ST

%D Tobias tested this module in all kind of \LATEX\ dialects
%D so we were able to find out that we also needed to declare:

\temporarynewdimen\linethickness

%D After all, the new definition of \type{\newdimen} became:

\def\newdimen#1%
  {\ifx#1\undefined
     \ifnum\count11>\count12\relax
       \temporarynewskip#1\relax
     \else
       \temporarynewdimen#1\relax
     \fi
     %\edef\ascii{\meaning#1}%
     %\immediate\write20{\string#1 becomes \ascii}%
   \else
     %\edef\ascii{\meaning#1}%
     %\immediate\write20{\string#1 already is \ascii}%
   \fi}

% \def\newdimen#1%
%   {\bgroup
%    \escapechar=-1
%    \def\next##1##2%
%      {\def\next####1##1####2####3\next%
%         {\egroup
%          \if####2@
%            \temporarynewdimen#1\relax
%          \ifnum\count11>\count12
%            \temporarynewskip#1\relax
%          \else
%            \temporarynewdimen#1\relax
%          \fi\fi}%
%       \expandafter\next\string##2##1@@\next}%
%    \expandafter\next\expandafter{\string\dimen}#1}
%
% This macro is as unreadable, inefficient and as compact as
% can be, but uses no extra hash entries, which sometimes are
% scarce too. A more readable alternative, that also takes
% explicit \SKIPS\ into account, is included in the source.
%
% \def\doifregisterpreferenceelse#1#2#3#4%
%   {\def\dodoifregisterpreferenceelse##1#1##2##3\war{\if##2@}%
%    \expandafter\dodoifregisterpreferenceelse\string#2#1@@\war
%      #4%
%    \else
%      #3%
%    \fi}
%
% \def\newdimen#1%
%   {\bgroup
%    \escapechar=-1
%    \expandafter\doifregisterpreferenceelse\expandafter{\string\dimen}#1
%      {\egroup
%       \temporarynewdimen#1}
%      {\expandafter\doifregisterpreferenceelse\expandafter{\string\skip}#1
%         {\egroup
%          \temporarynewskip#1}
%         {\egroup
%          \ifnum\count11>\count12
%            \temporarynewskip#1\relax
%          \else
%            \temporarynewdimen#1\relax
%          \fi}}}

%D Curious readers can still find the previous solution in
%D the source. The next macro is used instead of
%D \type{\input}. This macro also reports some statistics.

\def\dimeninput#1 %
  {\message{[before: d=\the\count11,s=\the\count12]}%
   \input #1 \relax
   \message{[after: d=\the\count11,s=\the\count12]}}%

%D Now we can load \PICTEX:

\loadpictex

%D Finally we restore the old definitions of \type{\newdimen}
%D and \type{\newskip}:

\let\newdimen=\normalnewdimen
\let\newskip =\normalnewskip

%D and just hope for the best.

\protect \endinput
