syst-tex.mkii / last modification: 2020-01-30 14:15
%D \module
%D   [       file=syst-tex,
%D        version=1999.03.17,  % an oldie: 1995.10.10
%D          title=\CONTEXT\ System Macros,
%D       subtitle=Efficient \PLAIN\ \TEX\ loading,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%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 file is used by mptopdf.

%D We've build \CONTEXT\ on top of \PLAIN\ \TEX. Because we
%D want to make the format file as independant as possible of
%D machine dependant font encodings, we have to bypass the
%D loading of fonts.
%D Let's start at the beginning. Because \PLAIN\ is not yet
%D loaded we have to define some \CATCODES\ ourselves.

\catcode`\{=1 % left brace is begin-group character
\catcode`\}=2 % right brace is end-group character
\catcode`\#=6 % hash mark is macro parameter character
\catcode`\^=7 % circumflex is for superscripts

%D To prevent all kind of end||of||file problems, for the
%D moment we simply ignore the Control~Z token.


%D We are going to report to the user what we are skipping.

\def\skipmessage#1{\immediate\write16{skipping #1 in plain}}

%D We want to be able to use the \type{\newsomething}
%D declarations not only on the \type{\outer} level. This can
%D be done by redefining \type{\outer} so we have to save its
%D original meaning.

\let\normalouter = \outer
\let\outer       = \relax

%D We also want to postpone the loading of hyphenation patters,
%D so we redefine and therefore save \type{\input}.

\let\normalinput = \input
\def\input       #1 {\skipmessage{\string\input}}

%D Finaly are going to we redefine some font specification
%D commands and that's why we save them too. The redefinitions
%D are straightforward because the macros have to do nothing
%D but skipping.

\let\normalskewchar         = \skewchar
\def\skewchar               #1=#2 {\skipmessage{\string\skewchar}}

\let\normaltextfont         = \textfont
\let\normalscriptfont       = \scriptfont
\let\normalscriptscriptfont = \scriptscriptfont

\def\textfont               #1=#2{\skipmessage{\string\textfont}}
\def\scriptfont             #1=#2{\skipmessage{\string\scriptfont}}
\def\scriptscriptfont       #1=#2{\skipmessage{\string\scriptscriptfont}}

%D The redefinition of \type{\font} is a bit more complicated,
%D because in version 3.14159 a scaled specification was
%D introduced.

\let\normalfont = \font

\def\skipscaled scaled #1 {}

\long\def\font#1=#2 #3%
     \skipmessage{scaled \string\font}%

% or:
% \long\def\font#1=#2 #3%
%   {\ifx#3s%
%      \skipmessage{scaled \string\font}%
%      \expandafter\skipscaled
%    \else
%      \skipmessage{\string\font}%
%    \fi
%    #3}

%D Relaxing some font switching macros is needed because we
%D don't want any error messages during loading. These
%D unharmfull messages could be ingored.
%D The next substitution is needed for determining
%D \type{\p@renwd} in the macro \type{\bordermatrix}.

  {\skipmessage{used \string\tenex}\hskip8.75002pt}

%D We need to define \type{\tenrm} for switching to
%D \type{\rm}.


%D In \CONTEXT\ all \PLAIN\ \TEX\ fonts are available, just
%D like \type{\p@renwd}. We only postpone loading them until
%D they are actually needed.

%D By bypassing fonts, some definitions become less valid so
%D we have to redefine them afterwards.
%D \starttyping
%D \let\normalbordermatrix=\bordermatrix
%D \def\bordermatrix%
%D   {\bgroup
%D    \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}%
%D    \global\p@renwd=\wd0\relax
%D    \egroup
%D    \normalbordermatrix}
%D \stoptyping

%D Now we are ready for loading \PLAIN\ \TEX. Of couse we use
%D \type{\normalinput} and not \type{\input}.

\normalinput plain.tex \let\normalfmtversion\fmtversion

%D We have to take care of unwanted \PDFTEX\
%D initializations. We just want to default to \DVI\ output.


%D When applicable, we also load the \ETEX\ source and
%D definition files.

\bgroup \obeylines









%   \gdef\dobeginETEX#1
%     {\egroup\immediate\write16%
%        {system (E-TEX) : [line \the\inputlineno] \detokenize{#1}}}





% \ifx\eTeXversion\undefined
%   \long\def\onlyTEX #1{#1}
%   \long\def\onlyETEX#1{}
% \else
%   \long\def\only TEX#1{}
%   \long\def\onlyETEX#1{#1}
% \fi

%D Well, this redefintion of \type {\input} fails on \ETEX,
%D because of some \type {\cs\fi} constructs. So now we use:

% \beginETEX etex.src etexdefs.lib
%   \def\input#1%
%     {\bgroup
%      \skipmessage{\string\input}%
%      \expandafter\ifx\expandafter#1\csname l@ngdefnfile\endcsname
%        \let\input\egroup
%      \else
%        \def\input##1 {\egroup}%
%      \fi
%      \input}
%   \normalinput     etex.src \relax
%   \normalinput etexdefs.lib \relax
%   \let\fmtversion\normalfmtversion
%   \savinghyphcodes=1
% \endETEX
% \ifx\normalprotected \undefined \let\normalprotected \protected  \fi
% \ifx\normalunexpanded\undefined \let\normalunexpanded\unexpanded \fi
% \ifx\normalexpanded  \undefined \let\normalexpanded  \expanded   \fi

\beginETEX \savinghyphcodes



%D We restore some redefined primitives to their old meaning.

\let\font             = \normalfont
\let\skewchar         = \normalskewchar
\let\textfont         = \normaltextfont
\let\scriptfont       = \normalscriptfont
\let\scriptscriptfont = \normalscriptscriptfont
\let\input            = \normalinput
\let\outer            = \normalouter

%D We reset some of the used auxiliary macro's to
%D \type{\undefined}. One never knows what testing on them is
%D done elsewhere.

\let\skipmessage            = \undefined
\let\skipscaled             = \undefined
\let\normalfont             = \undefined
\let\normalskewchar         = \undefined
\let\normaltextfont         = \undefined
\let\normalscriptfont       = \undefined
\let\normalscriptscriptfont = \undefined

% \let\normalinput = \undefined
% \let\normalouter = \undefined

%D We want a bit more statistics and some less logging info
%D in the \type{log} file.


% \let\normalwlog\wlog
% \def\wlog#1{\normalwlog{system (\string\wlog) : #1}}

%D To prevent clashes, we slightly redefine the phantom
%D macros: we let them hide their behaviour by grouping.


%D Somehow this one does not work ok in math mode:


   \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
   \ifh@ \wd\tw@\wd\z@ \fi

%D But this one does work.


   \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi
   \ifh@ \wd\tw@\wd\z@ \fi


%D Just for tracing purposes wet set:


%D To circumvent dependencies, we can postpone certain
%D initializations to dumping time, by appending them to the
%D \type {\everydump} token register.

\newtoks \everydump

\let\normaldump \dump