summaryrefslogtreecommitdiff
path: root/tex/context/base/mkii/type-ini.mkii
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkii/type-ini.mkii')
-rw-r--r--tex/context/base/mkii/type-ini.mkii726
1 files changed, 726 insertions, 0 deletions
diff --git a/tex/context/base/mkii/type-ini.mkii b/tex/context/base/mkii/type-ini.mkii
new file mode 100644
index 000000000..c6b0a8931
--- /dev/null
+++ b/tex/context/base/mkii/type-ini.mkii
@@ -0,0 +1,726 @@
+%D \module
+%D [ file=type-ini,
+%D version=2001.03.05,
+%D title=\CONTEXT\ Typescript Macros,
+%D subtitle=Initialization,
+%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.
+
+\writestatus{loading}{ConTeXt Typescript Macros / Initialization}
+
+%D The default fontclass is empty. We could demand always using fontclasses,
+%D and then make the calling macros simplier (always assume fontclass) but
+%D apart from downward compatibility issues, it would make global, class
+%D spanning definitions a pain. Some day we will introduce a default class.
+
+% torture test : proper typefaces (and namespace)
+%
+% \starttext
+% \usetypescript[modern][default] default: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][texnansi] texnansi: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][ec] ec: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][qx] qx: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \usetypescript[modern][t5] t5: \setupbodyfont[modern] \eacute \eogonek \zcaron \acircumflexgrave
+% \stoptext
+%
+% torture test : no typeface, just definitions
+%
+% \starttext
+% {\setupbodyfont[reset] \setupbodyfont[cmr] cmr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[plr] plr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[csr] csr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[vnr] vnr: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% {\setupbodyfont[reset] \setupbodyfont[aer] aer: \eacute \eogonek \zcaron \acircumflexgrave \endgraf}
+% \stoptext
+
+% \usetypescript [modern] [texnansi]
+%
+% normal : 1450 ms
+% exa quit : 1300 ms (150 ms)
+% preload : 825 ms (635 ms) (40-50%)
+%
+% \usetypescript [modern] [texnansi]
+% \usetypescript [palatino][texnansi]
+% \usetypescript [times] [texnansi]
+%
+% normal : 3200 ms
+% exa quit : 2700 ms ( 500 ms)
+% preload : 1300 ms (1900 ms) (60-70%)
+
+% \usetypescript [modern][\defaultencoding]
+% \usetypescript [map] [latin-modern-os] [\defaultencoding]
+% \setupbodyfont[modern]
+% test 1234 test
+
+\unprotect
+
+\def\starttypescriptcollection
+ {\dosingleempty\dostarttypescriptcollection}
+
+\def\dostarttypescriptcollection[#1]%
+ {}
+
+\def\stoptypescriptcollection
+ {}
+
+\let\typescriptfiles\empty
+
+\unexpanded\def\usetypescriptfile[#1]%
+ {\doifelse{#1}\v!reset
+ {\let\typescriptfiles\empty}
+ {\splitfiletype{#1}%
+ \addtocommalist\splitoffname\typescriptfiles}}
+
+% SO FAR
+
+\let\currenttypescripts\empty
+
+\newif\iftypescriptfound
+
+\let\@@typescriptone \empty \let\typescriptone \empty
+\let\@@typescripttwo \empty \let\typescripttwo \empty
+\let\@@typescriptthree\empty \let\typescriptthree\empty
+
+% method 2 is for Hans van der Meer
+
+\newtoks\documenttypescripts
+
+\chardef\typescriptmethod\plusone % 1: empty==all==true 2: empty==false
+\chardef\typescriptstate \plustwo % 1: process 2: store
+
+\unexpanded\def\usetypescript {\chardef\typescriptmethod\plusone\dotripleempty\dousetypescript}
+\unexpanded\def\usetypescriptexact{\chardef\typescriptmethod\plustwo\dotripleempty\dousetypescript}
+
+\def\dousetypescript[#1][#2][#3]%
+ {\expanded{\dodousetypescript[#1][#2][#3]}}
+
+\def\dodousetypescript[#1][#2][#3]% also loads type-loc, a user file
+ {\pushmacro\@@typescriptone \edef\@@typescriptone {\truetypescript{#1}}%
+ \pushmacro\@@typescripttwo \edef\@@typescripttwo {\truetypescript{#2}}%
+ \pushmacro\@@typescriptthree\edef\@@typescriptthree{\truetypescript{#3}}%
+ \pushmacro\typescriptone
+ \pushmacro\typescripttwo
+ \pushmacro\typescriptthree
+ \pushmacro\typescriptmethod
+ \pushmacro\typescriptstate \chardef\typescriptstate\plusone % process
+ \pushmacro\stoptypescript
+ \typescriptfoundfalse
+ \iftracetypescripts\writestatus\m!fonts{request: [\@@typescriptone] [\@@typescripttwo] [\@@typescriptthree]}\fi
+ \processcommacommand[\typescriptfiles]\dododousetypescript
+ \the\documenttypescripts
+ \firsttypescriptpassfalse % testen
+ \popmacro\stoptypescript
+ \popmacro\typescriptstate
+ \popmacro\typescriptmethod
+ \popmacro\typescriptthree
+ \popmacro\typescripttwo
+ \popmacro\typescriptone
+ \popmacro\@@typescriptthree
+ \popmacro\@@typescripttwo
+ \popmacro\@@typescriptone}
+
+% simple version:
+%
+% \def\dododousetypescript#1%
+% {\startreadingfile
+% \pushmacro\currenttypefile
+% \def\currenttypefile{#1}%
+% \def\currenttypefile{#1}%
+% \readfile\currenttypefile\donothing\donothing
+% \popmacro\currenttypefile
+% \stopreadingfile}
+%
+% tricky version:
+
+\newconditional\preloadingtypescripts
+
+\def\preloadtypescripts{\ifproductionrun\settrue\preloadingtypescripts\fi}
+
+\def\dododousetypescript#1%
+ {\setfalse\quittingtypescript
+ \pushmacro\currenttypefile
+ \def\currenttypefile{#1}%
+ \ifconditional\preloadingtypescripts
+ % load files once, and use saved data
+ \def\loadedtypescripts{\csname\??ts:\c!file:#1\endcsname}%
+ \@EAEAEA\ifx\loadedtypescripts\relax
+ \@EAEAEA\newtoks\loadedtypescripts
+ \bgroup
+ \long\def\starttypescript##1\stoptypescript
+ {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescript##1\stoptypescript}}%
+ \long\def\starttypescriptcollection##1\stoptypescriptcollection
+ {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescriptcollection##1\stoptypescriptcollection}}%
+ \startreadingfile
+ \pushendofline
+ \unprotect
+ \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}%
+ \protect
+ \popendofline
+ \stopreadingfile
+ \egroup
+ \fi
+ %\message{[\space\currenttypefile}%
+ \the\loadedtypescripts
+ %\message{\ifconditional\quittingtypescript quit\space\fi]}%
+ \else
+ % process files each time
+ \startreadingfile
+ \pushendofline
+ \unprotect
+ \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}%
+ \protect
+ \popendofline
+ \stopreadingfile
+ \fi
+ \popmacro\currenttypefile
+ \ifconditional\quittingtypescript
+ \quitcommalist
+ \setfalse\quittingtypescript
+ \fi}
+
+% % not faster, unless maybe toks
+%
+% \newcount\nofloadedtypescripts
+%
+% \def\startloadedtypescript
+% {\dotripleempty\dostartloadedtypescript}
+%
+% \let\stoploadedtypescript\relax
+%
+% \long\def\dostartloadedtypescript[#1][#2][#3]#4\stoptypescript
+% {\global\advance\nofloadedtypescripts\plusone
+% \long\setgvalue{\??ts=>\the\nofloadedtypescripts}{#4}%
+% \edef\temp%
+% {\iffirstargument [#1]\fi
+% \ifsecondargument[#2]\fi
+% \ifthirdargument [#3]\fi
+% \noexpand\csname\??ts=>\the\nofloadedtypescripts\noexpand\endcsname}%
+% \global\loadedtypescripts\@EA\@EA\@EA{\@EA\the\@EA\loadedtypescripts\@EA\starttypescript\temp\stoptypescript}}
+%
+% \def\startloadedtypescriptcollection
+% {\dosingleempty\dostartloadedtypescriptcollection}
+%
+% \def\dostartloadedtypescriptcollection[#1]{}
+% \def\stoploadedtypescriptcollection {}
+%
+% \def\dododousetypescript#1%
+% {\setfalse\quittingtypescript
+% \pushmacro\currenttypefile
+% \def\currenttypefile{#1}%
+% \ifconditional\preloadingtypescripts
+% % load files once, and use saved data
+% \def\loadedtypescripts{\csname\??ts:\c!file:#1\endcsname}%
+% \@EAEAEA\ifx\loadedtypescripts\relax
+% \@EAEAEA\newtoks\loadedtypescripts
+% \bgroup
+% %
+% \let\starttypescript \startloadedtypescript
+% \let\stoptypescript \stoploadedtypescript
+% \let\starttypescriptcollection\startloadedtypescriptcollection
+% \let\stoptypescriptcollection \stoploadedtypescriptcollection
+% %
+% \startreadingfile
+% \pushendofline
+% \unprotect
+% \readfile\currenttypefile\donothing\donothing
+% \protect
+% \popendofline
+% \stopreadingfile
+% \egroup
+% \fi
+% %\message{[\space\currenttypefile}%
+% \the\loadedtypescripts
+% %\message{\ifconditional\quittingtypescript quit\space\fi]}%
+% \else
+% % process files each time
+% \startreadingfile
+% \pushendofline
+% \unprotect
+% \readfile\currenttypefile\donothing\donothing
+% \protect
+% \popendofline
+% \stopreadingfile
+% \fi
+% \popmacro\currenttypefile
+% \ifconditional\quittingtypescript
+% \quitcommalist
+% \setfalse\quittingtypescript
+% \fi}
+
+\def\usetypescriptonce
+ {\dotripleempty\dousetypescriptonce}
+
+\def\dousetypescriptonce[#1][#2][#3]%
+ {\doifelseflagged{ts:#1:#2:#3}%
+ {\writestatus\m!fonts{once (#1) (#2) (#3)}}
+ {\setflag{ts:#1:#2:#3}%
+ \expanded{\dodousetypescript[#1][#2][#3]}}}
+
+% \definetypescriptsynonym[lbr][cmr]
+
+\def\definetypescriptsynonym
+ {\dodoubleempty\dodefinetypescriptsynonym}
+
+\def\dodefinetypescriptsynonym[#1][#2]%
+ {\ifsecondargument\setevalue{\??tm#1}{#2}\fi}
+
+\def\truetypescript#1%
+ {\ifcsname\??tm#1\endcsname
+ \@EA\truetypescript\csname\??tm#1\endcsname\else#1%
+ \fi}
+
+% script [serif] [default] [size]
+% script [serif] [computer-modern] [size]
+% script [serif] [computer-modern] [ec]
+% script [serif] [computer-modern] [name]
+% script [serif] [computer-modern] [special]
+
+% todo, make firsttypescriptpass conditional
+
+\newif\iffirsttypescriptpass \firsttypescriptpasstrue
+
+\prependtoks\firsttypescriptpasstrue\to\everyjob
+
+\def\typescript@@all{all}
+
+\newif\iftracetypescripts
+
+\def\starttypescript
+ {\ifcase\typescriptstate
+ % 0 = skip
+ \@EA\gobbleuntil\@EA\stoptypescript
+ \or
+ % 1 = process
+ \expandafter\dostarttypescript
+ \or
+ % 2 = store
+ \expandafter\nostarttypescript
+ \else
+ % ? = skip
+ \@EA\gobbleuntil\@EA\stoptypescript
+ \fi}
+
+\long\def\nostarttypescript#1\stoptypescript
+ {\appendtoks\starttypescript#1\stoptypescript\to\documenttypescripts}
+
+\def\dostarttypescript
+ {\let\typescriptone \@@typescriptone
+ \let\typescripttwo \@@typescripttwo
+ \let\typescriptthree\@@typescriptthree
+ \let\typescriptmatch\empty
+ \doifnextoptionalelse\dostarttypescriptone\dostarttypescriptall}
+
+\long\def\dostarttypescriptall
+ {\iffirsttypescriptpass
+ \expandafter\doprocesstypescript
+ \else
+ % skip this since it may do unwanted resets, like
+ % setting symbolic font names to unknown, especially
+ % in run time user type scripts
+ \expandafter\noprocesstypescript
+ \fi}
+
+\long\def\dostarttypescriptyes
+ {\ifdone
+ \typescriptfoundtrue
+ \iftracetypescripts\writestatus\m!fonts{match:\ifx\currenttypefile\relax\space *\fi \typescriptmatch}\fi
+ \expandafter\doprocesstypescript
+ \else
+ \expandafter\noprocesstypescript
+ \fi}
+
+\long\def\dostarttypescriptone
+ {\dochecktypescript\@@typescriptone\typescriptone\redostarttypescriptone}
+
+\long\def\dostarttypescripttwo
+ {\dochecktypescript\@@typescripttwo\typescripttwo\redostarttypescripttwo}
+
+\long\def\dostarttypescriptthree
+ {\dochecktypescript\@@typescriptthree\typescriptthree\redostarttypescriptthree}
+
+\long\def\redostarttypescriptone
+ {\doifnextoptionalelse\dostarttypescripttwo\dostarttypescriptyes}
+
+\long\def\redostarttypescripttwo
+ {\doifnextoptionalelse\dostarttypescriptthree\dostarttypescriptyes}
+
+\long\def\redostarttypescriptthree
+ {\dostarttypescriptyes}
+
+\def\doprocesstypescript
+ {\pushmacro\fontclass}
+
+\def\stoptypescript
+ {\popmacro\fontclass}
+
+\long\def\noprocesstypescript#1\stoptypescript
+ {}
+
+\let\typescriptmatch\empty
+
+\def\dochecktypescript#1#2#3[#4]% script use value next
+ {\donefalse
+ \def\@@typescriptcheck{#4}%
+ \ifx\@@typescriptcheck\empty % no longer needed / met
+ \ifcase\typescriptmethod\or\donetrue\else\donefalse\fi
+ \else\ifx#1\typescript@@all
+ \donetrue
+ \else\ifx\@@typescriptcheck\typescript@@all
+ \donetrue
+ \else\expanded{\doifcommonelse{\@@typescriptcheck}{#1}}\donetrue\donefalse\ifdone
+ \let#2\commalistelement
+ \fi\fi\fi\fi
+ \ifdone
+ \edef\typescriptmatch{\typescriptmatch\space[#4]}%
+ \expandafter#3%
+ \else
+ \expandafter\noprocesstypescript
+ \fi}
+
+%D Yet another speed up: when issued inside typescript, the call
+%D
+%D \starttyping
+%D \quittypescriptscanning
+%D \stoptyping
+%D
+%D quits further loading. For an example, see type-exa:
+
+\newconditional\quittingtypescript \setfalse\quittingtypescript
+
+\def\quittypescriptscanning{\settrue\quittingtypescript}
+
+% status
+%
+% 1 loaded
+% 2 reported
+% 3 preloaded
+
+% flags ipv \c!state, more flag values
+
+\def\dopreloadmapfile#1%
+ {\splitfiletype{#1}%
+ \writestatus\m!fonts{assuming map file: \splitoffname}%
+ \setxvalue{\splitoffname \c!state}{3}%
+ \doglobal\removefromcommalist\splitoffname\allfontmapsfiles}
+
+\def\preloadmapfile[#1]{\expanded{\processcommalist[#1]}\dopreloadmapfile}
+\def\loadmapfile [#1]{\expanded{\processcommalist[#1]}\loadthemapfile}
+\def\unloadmapfile [#1]{\expanded{\processcommalist[#1]}\unloadthemapfile}
+
+% too soon, no driver known, \ifproductionrun \loadallfontmapfiles \fi
+
+% temp hack, will become just \addto
+
+\ifx\pdftexversion\undefined
+
+ \def\loadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\addtocommalist\splitoffname\allfontmapsfiles}
+
+\else\ifnum\pdftexversion<120 % no overloading
+
+ \def\loadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\pretocommalist\splitoffname\allfontmapsfiles}
+
+\else
+
+ \def\loadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\addtocommalist\splitoffname\allfontmapsfiles}
+
+\fi \fi
+
+\def\unloadthemapfile#1%
+ {\splitfiletype{#1}%
+ \doglobal\removefromcommalist\splitoffname\allfontmapsfiles}
+
+\let\usedmapfile\gobbletwoarguments
+\let\usedmapline\gobbletwoarguments
+
+\def\doregisterloadedmapfile#1%
+ {\immediatewriteutilitycommand{\usedmapfile{=}{#1}}}
+
+\def\doloadfontmapfile#1%
+ {\ifundefined{#1\c!state}%
+ \writestatus\m!fonts{using map file: #1}%
+ \doregisterloadedmapfile{#1}%
+ \doloadmapfile{=}{#1.\f!fontmapextension}% +/add =/replace -/remove
+ \setxvalue{#1\c!state}{1}%
+ \fi}
+
+\def\doreportfontmapfile#1%
+ {\ifundefined{#1\c!state}%
+ \writestatus\m!fonts{needs map file: #1}%
+ \setxvalue{#1\c!state}{2}%
+ \fi}
+
+\def\loadallfontmapfiles
+ {%\message{[\allfontmapsfiles]}%
+ \ifconditional\resettingmapfile
+ \writestatus\m!fonts{resetting map file list}%
+ \doresetmapfilelist
+ \global\setfalse\resettingmapfile
+ \fi
+ \ifx\allfontmapsfiles\empty \else
+ \ifautoloadmapfiles
+ \processcommacommand[\allfontmapsfiles]\doloadfontmapfile
+ \else
+ \processcommacommand[\allfontmapsfiles]\doreportfontmapfile
+ \fi
+ \forgetmapfiles
+ \fi}
+
+\def\loadmapline
+ {\dodoubleempty\dodoloadmapline}
+
+\def\dodoloadmapline[#1][#2]%
+ {\loadallfontmapfiles % ! ! !
+ \ifsecondargument
+ \immediatewriteutilitycommand{\usedmapline{#1}{#2}}%
+ \doloadmapline{#1}{#2}% special
+ \else
+ \loadmapline[=][#1]%
+ %\immediatewriteutilitycommand{\usedmapline{=}{#2}}%
+ %\doloadmapline{=}{#1}% special
+ \fi}
+
+% since this is driver dependent, and since we may set map files
+% before an output format is defined, we need to postpone it; we
+% cannot use starttext as hook because an output switch can be part
+% of a style; an alternative is to no longer permit driver switching
+% after the first \starttext, but that will break compatibility
+% because \startcomponent ... \environment ... is pretty legal.
+
+% the map directives need to end up in the right place in the stream
+
+% hm, the timing of when pdftex needs the map file info keeps changing;
+% it's really time to move to map line support
+
+% \appendtoks \loadallfontmapfiles \to \everyPDFximage
+% \appendtoks \loadallfontmapfiles \to \everystarttext
+% \appendtoks \loadallfontmapfiles \to \everybeforepagebody
+
+\everybeforeshipout \expandafter
+ {\expandafter\appendtoks
+ \expandafter\loadallfontmapfiles
+ \expandafter\to
+ \expandafter\pageboundsettings
+ \the\everybeforeshipout}
+
+\newif\ifautoloadmapfiles
+
+\let\allfontmapsfiles\empty
+
+\def\forgetmapfiles
+ {\globallet\allfontmapsfiles\empty}
+
+\newconditional\resettingmapfile
+
+\def\resetmapfiles
+ {\global\settrue\resettingmapfile}
+
+\def\disablemapfiles
+ {\resetmapfiles
+ \forgetmapfiles}
+
+%D A handy shortcut:
+
+% \definetypescriptprefix[serif][Serif]
+% \definetypescriptprefix[sans] [Sans]
+% \definetypescriptprefix[mono] [Mono]
+%
+%\starttypescript [serif,sans,mono] [handling,hanging,hz] [pure,normal,hz,quality]
+% \setupfontsynonym [\typescriptprefix\typescriptone] [handling=\typescriptthree]
+% \stoptypescript
+
+\def\definetypescriptprefix
+ {\dodoubleargument\dodefinetypescriptprefix}
+
+\def\dodefinetypescriptprefix[#1][#2]%
+ {\setgvalue{\??ts::#1}{#2}} % made global
+
+% without testing:
+%
+% \def\typescriptprefix#1%
+% {\csname\??ts::#1\endcsname}
+%
+% with testing:
+
+\def\typescriptprefix#1%
+ {\executeifdefined{\??ts::#1}{#1}}
+
+% defining typefaces:
+%
+% \definetypeface [#1:joke] [#2:rm]
+% \definetypeface [#1:joke] [#2:rm] [#3:...]
+% \definetypeface [#1:joke] [#2:rm] [#3:serif] [#4:lucida] [#5:size] [#6:...]
+
+\def\definetypeface
+ {\dosixtupleargument\dodefinetypeface}
+
+\def\tsvar#1#2% \executeifdefined{\??ts#1}{#2}
+ {\@EA\ifx\csname\??ts#1\endcsname\empty
+ #2%
+ \else
+ \csname\??ts#1\endcsname
+ \fi}
+
+% #1=main #2=rm #3=serif #4=fontname #5=size #6=settings
+
+\def\typefaceencoding{\defaultencoding}
+
+% we can use \rawgetparameters or \rawgeteparameters
+
+\def\dodefinetypeface[#1][#2][#3][#4][#5][#6]%
+ {\dododefinetypeface[#1][#2]%
+ \iffifthargument % sixth is optional
+ % we need to expand since in #6 there can be a \typescripttwo
+% \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,\s!text=,#6]}% \geteparameters
+ \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!text=,#6]}% \geteparameters
+ \pushmacro\relativefontsize
+ \pushmacro\typefaceencoding
+ \pushmacro\fontclass
+ \let\relativefontsize\@@tsrscale
+ \let\typefaceencoding\@@tsencoding
+ \setcurrentfontclass{#1}%
+% \letvalue{\fontclass\s!features }\@@tsfeatures % new per 16/6/2007
+% \letvalue{\fontclass\s!fallbacks}\@@tsfallbacks % new per 12/10/2008
+ \saverelativefontsize{#2}\relativefontsize % fall back
+ \savemathtextstyle\@@tstext % math text style (new per 28/4/2006)
+ \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4] / \typefaceencoding}\fi
+ \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% map is needed for backward cmp
+ \usetypescript[#3][#5][\t!size]%
+ \popmacro\fontclass
+ \popmacro\typefaceencoding
+ \popmacro\relativefontsize
+ \else\iffourthargument
+ \definetypeface[#1][#2][#3][#4][\s!default]%
+ \else\ifthirdargument
+ \getparameters[\??tf#1#2][#3]%
+ \fi\fi\fi}
+
+\def\dododefinetypeface[#1][#2]% saveguard against redefinition
+ {\doifsomething{#1}
+ {\ifcsname\??tf#1\s!default\endcsname \else
+ \registerfontclass{#1}%
+ \setgvalue{\??tf#1\s!default}{#2}%
+ \fi
+ \ifcsname#1\endcsname \else
+ \unexpanded\setgvalue{#1}{\switchtotypeface[#1][#2]}%
+ \fi}}
+
+\def\setuptypeface% [class] [settings]
+ {\doquadrupleempty\doswitchtotypeface[\setupbodyfont][\fontclass]}
+
+\unexpanded\def\switchtotypeface% [class] [settings]
+ {\doquadrupleempty\doswitchtotypeface[\switchtobodyfont][\globalfontclass]}
+
+\def\doswitchtotypeface[#1][#2][#3][#4]%
+ {%\doifinsetelse{\s!default,\v!reset}{#3}
+ % {\setcurrentfontclass\empty}
+ % {\setcurrentfontclass{#3}}%
+ \setcurrentfontclass{#3}%
+ \let\globalfontclass#2%
+ \iffourthargument
+ #1[#4]%
+ \else\ifx\fontclass\empty
+ #1[\c!rm]%
+ \else
+ \doifdefinedelse{\??tf\fontclass\s!default}
+ {#1[\getvalue{\??tf\fontclass\s!default}]}
+ {#1[\c!rm]}%
+ \fi \fi
+ \ifmmode\mr\else\tf\fi} % needed ?
+
+\def\usetypefile[#1]% recurses on path ! ?
+ {\readfile{\f!typeprefix#1}\donothing\donothing}
+
+%D For Taco:
+%D
+%D \starttyping
+%D \inherittypeface[palatino][rm][postscript]
+%D \inherittypeface[palatino][rm][\fontclass]
+%D \inherittypeface[palatino][rm] % == \fontclass
+%D \inherittypeface[palatino] % == [rm,ss,tt,mm]
+%D \stoptyping
+
+\def\inherittypeface
+ {\dotripleempty\doinherittypeface}
+
+\def\doinherittypeface[#1][#2][#3]%
+ {\doifelsenothing{#2}
+ {\doinherittypeface[#1][\c!rm,\c!ss,\c!tt,\c!mm][\fontclass]}
+ {\doifnot{#1}{#3}
+ {\def\docommand##1{\setevalue{#1-##1}{#3}}%
+ \processcommalist[#2]\docommand}}}
+
+%D This hook sinto the font mechanism with:
+
+\def\checkfontclass#1%
+ {\edef\fontclass{\executeifdefined{\fontclass-#1}{\fontclass}}}
+
+%D For backward compatibility we reimplement the font file
+%D loading macro.
+
+\ifx\normaldoreadfontdefinitionfile\undefined
+ \let\normaldoreadfontdefinitionfile\doreadfontdefinitionfile
+\fi
+
+% old and obsolete
+%
+% \def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+% {\ifundefined{\??tf#2\c!default}%
+% \pushmacro\fontclass
+% \setcurrentfontclass\empty
+% \pushmacro\@@typescriptone \edef\@@typescriptone {\truetypescript{#2}}%
+% \pushmacro\@@typescripttwo \let\@@typescripttwo \empty
+% \pushmacro\@@typescriptthree\let\@@typescriptthree\empty
+% \typescriptfoundfalse
+% \dododousetypescript{\f!typeprefix pre}%
+% \popmacro\@@typescriptthree
+% \popmacro\@@typescripttwo
+% \popmacro\@@typescriptone
+% \iftypescriptfound \else
+% \normaldoreadfontdefinitionfile{#1}{#2}%
+% \fi
+% \setcurrentfontclass\empty
+% \popmacro\fontclass
+% \else\ifcase#1\relax
+% \switchtotypeface[#2]%
+% \else
+% \setuptypeface[#2]%
+% \fi\fi}
+%
+% new and obeying fontclasses (but still obsolete)
+
+\def\doreadfontdefinitionfile#1#2% #1 = set/switch state
+ {\ifcsname\??tf#2\c!default\endcsname
+ \ifcase#1\relax
+ \switchtotypeface[#2]%
+ \else
+ \setuptypeface[#2]%
+ \fi
+ \else
+ \pushmacro\starttypescript
+ \scratchtoks\emptytoks
+ % locate downward compatibility definitions, one argument !
+ \long\def\starttypescript[##1]##2\stoptypescript
+ {\doif{##1}{#2}{\scratchtoks{##2}}}
+ \startreadingfile
+ \readfile{\f!typeprefix pre}\donothing\donothing
+ \stopreadingfile
+ \popmacro\starttypescript
+ \the\scratchtoks
+ \fi}
+
+\fetchruntimecommand \typetypescript {\f!typeprefix\s!run}
+
+% \usetypescript [berry] [ec]
+
+\protect \endinput