%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 %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 %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. \catcode`\^^Z=9 %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% {\ifx#3s% \skipmessage{scaled \string\font}% \let\next\skipscaled \else \skipmessage{\string\font}% \let\next\relax \fi \next#3} % 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 %D The next substitution is needed for determining %D \type{\p@renwd} in the macro \type{\bordermatrix}. \def\tenex#1% {\skipmessage{used \string\tenex}\hskip8.75002pt} %D We need to define \type{\tenrm} for switching to %D \type{\rm}. \def\tenrm% {\skipmessage{\string\tenrm}} %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 %D \starttyping %D \let\normalbordermatrix=\bordermatrix %D %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. \ifx\pdftexversion\undefined \chardef\pdfoutput=0 \else \pdfoutput=0 \fi %D When applicable, we also load the \ETEX\ source and %D definition files. \bgroup \obeylines \ifx\eTeXversion\undefined \long\gdef\beginETEX#1\endETEX% {} \gdef\beginTEX% {\bgroup\obeylines\dobeginTEX} \gdef\dobeginTEX#1 {\egroup} \global\let\endTEX\relax \else \long\gdef\beginTEX#1\endTEX% {} \gdef\beginETEX% {\bgroup\obeylines\dobeginETEX} % \gdef\dobeginETEX#1 % {\egroup\immediate\write16% % {system (E-TEX) : [line \the\inputlineno] \detokenize{#1}}} \gdef\dobeginETEX#1 {\egroup} \global\let\endETEX\relax \fi \egroup % \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 \savinghyphcodes=1 \endETEX %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. \def\wlog#1{} % \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. \catcode`@=11 %D Somehow this one does not work ok in math mode: \def\ph@nt% {\bgroup \ifmmode \expandafter\mathpalette\expandafter\mathph@nt \else \expandafter\makeph@nt \fi} \def\finph@nt% {\setbox\tw@\null \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi \ifh@ \wd\tw@\wd\z@ \fi \box\tw@ \egroup} %D But this one does work. \def\ph@nt% {\ifmmode \expandafter\mathpalette\expandafter\mathph@nt \else \bgroup\expandafter\makeph@nt \fi} \def\finph@nt% {\setbox\tw@\null \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@ \fi \ifh@ \wd\tw@\wd\z@ \fi \box\tw@ \ifmmode\else\egroup\fi} \catcode`@=12 %D Just for tracing purposes wet set: \tracingstats=1 %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 \def\dump{\the\everydump\normaldump} \endinput