%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 / 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. \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 \unexpanded\def\starttypescriptcollection {\dosingleempty\dostarttypescriptcollection} \def\dostarttypescriptcollection[#1]% {} \unexpanded\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 {\let\typescriptmethod\plusone\dotripleempty\dousetypescript} \unexpanded\def\usetypescriptexact{\let\typescriptmethod\plustwo\dotripleempty\dousetypescript} \def\dousetypescript[#1][#2][#3]% {\normalexpanded{\noexpand\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 \let\typescriptstate\plusone % process \pushmacro\stoptypescript \typescriptfoundfalse \iftracetypescripts\writestatus\m!fonts{request: [\@@typescriptone] [\@@typescripttwo] [\@@typescriptthree]}\fi \processcommacommand[\typescriptfiles]\dododousetypescriptfile \the\documenttypescripts \firsttypescriptpassfalse % testen \popmacro\stoptypescript \popmacro\typescriptstate \popmacro\typescriptmethod \popmacro\typescriptthree \popmacro\typescripttwo \popmacro\typescriptone \popmacro\@@typescriptthree \popmacro\@@typescripttwo \popmacro\@@typescriptone} \newconditional\preloadingtypescripts \def\preloadtypescripts{\ifproductionrun\settrue\preloadingtypescripts\fi} \long\def\xxstarttypescript#1\stoptypescript {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescript#1\stoptypescript}} \long\def\xxstarttypescriptcollection#1\stoptypescriptcollection {\global\loadedtypescripts\@EA{\the\loadedtypescripts\starttypescriptcollection#1\stoptypescriptcollection}} \def\dododousetypescriptfile#1% {\setfalse\quittingtypescript \pushmacro\currenttypefile \def\currenttypefile{#1}% \ifconditional\preloadingtypescripts \doprocessandbuffertypescriptfile \else \doprocesstypescriptfile \fi \popmacro\currenttypefile \ifconditional\quittingtypescript \quitcommalist \setfalse\quittingtypescript \fi} \def\doprocessandbuffertypescriptfile {\expandafter\let\expandafter\loadedtypescripts\csname\??ts:\c!file:\currenttypefile\endcsname \ifx\loadedtypescripts\relax \dobuffertypescriptfile \fi \the\loadedtypescripts} \def\dobuffertypescriptfile {\newtoks\loadedtypescripts \bgroup \let\starttypescript\xxstarttypescript \let\starttypescriptcollection\xxstarttypescriptcollection \doprocesstypescriptfile \egroup \expandafter\let\csname\??ts:\c!file:\currenttypefile\endcsname\loadedtypescripts} \def\doprocesstypescriptfile {\startreadingfile \pushendofline \unprotect % we could have something readfilewithMKfallback \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\donothing\donothing}% \protect \popendofline \stopreadingfile} \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}% \normalexpanded{\noexpand\dodousetypescript[#1][#2][#3]}}} % \definetypescriptsynonym[lbr][cmr] \unexpanded\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 \let\stoptypescript\relax \unexpanded\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} \def\typescriptwritestatus {\writestatus\m!fonts{match:\ifx\currenttypefile\relax\space *\fi \typescriptmatch}} \long\def\dostarttypescriptyes {\ifdone \typescriptfoundtrue \iftracetypescripts\typescriptwritestatus\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} \unexpanded\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\fi \else\ifx#1\typescript@@all \donetrue \else\ifx\@@typescriptcheck\typescript@@all \donetrue \else\ifx#1\@@typescriptcheck % saves 10% trace so probably faster too \donetrue \let#2\@@typescriptcheck \else \normalexpanded{\noexpand\doifcommonelse{\@@typescriptcheck}{#1}}\donetrue\donefalse \ifdone \let#2\commalistelement \fi \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} %D Map files will go away in \LUATEX, but till that happens we %D use stripped down support for loading them. \def\loadmapfile{\dosingleempty\doloadmapfile} \def\loadmapline{\dodoubleempty\doloadmapline} \def\doloadmapfile [#1]{\ctxlua{fonts.map.loadfile("#1")}} \def\doloadmapline [#1][#2]{\ctxlua{fonts.map.loadline("#1","#2")}} \def\forgetmapfiles {\ctxlua{fonts.map.reset()}} \let\loadallfontmapfiles\relax \let\allfontmapsfiles \empty \let\preloadmapfile \loadmapfile \let\resetmapfiles \forgetmapfiles \let\disablemapfiles \forgetmapfiles \newif\ifautoloadmapfiles % \appendtoks % \pdfmapfile{}% somehow does not work at the lua end % \to \everyjob \prependtoks \loadmapfile[mkiv-base.map]% \to \everystarttext %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 \unexpanded\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:...] \unexpanded\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 % we can use \rawgetparameters or \rawgeteparameters \def\typefaceencoding{\defaultencoding} % we need to keep typefaceencoding for a while as it can still be used to filter % old scripts as we just strip the texnansi- prefix % \def\dostarttypefacedefining#1#2% % {\pushmacro\fontclass % \setcurrentfontclass{#1}% % \pushmacro\relativefontsize % \let\relativefontsize\@@tsrscale % still needed ? % \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks} % % \def\dostoptypefacedefining % {\popmacro\relativefontsize % \popmacro\fontclass} % % \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 % % \normalexpanded{\noexpand\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,#6]}% \geteparameters % \geteparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!fallbacks=,#6]% % \dostarttypefacedefining{#1}{#2}% % \pushmacro\typefaceencoding % \let\typefaceencoding\@@tsencoding % \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi % \ifx\typefaceencoding\t!default % \usetypescript[#3][#4][\t!name,\t!default]% will be default some day % \else % \usetypescript[#3][#4][\t!name,\t!default,\typefaceencoding]% % \fi % \usetypescript[#3][#5][\t!size]% % % % \dostoptypefacedefining % % % \popmacro\typefaceencoding % \else\iffourthargument % \definetypeface[#1][#2][#3][#4][\s!default]% % \else\ifthirdargument % \getparameters[\??tf#1#2][#3]% % \fi\fi\fi} \def\dostarttypefacedefining#1#2#3% {\geteparameters[\??ts][\s!rscale=\plusone,\s!features=,\s!fallbacks=,#3]% \pushmacro\fontclass \setcurrentfontclass{#1}% \pushmacro\relativefontsize \let\relativefontsize\@@tsrscale % still needed ? \savefontclassparameters{#2}\@@tsrscale\@@tsfeatures\@@tsfallbacks} \def\dostoptypefacedefining {\popmacro\relativefontsize \popmacro\fontclass} \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 \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4]}\fi \dostarttypefacedefining{#1}{#2}{#6}% \usetypescript[#3][#4][\t!name,\t!default]% \usetypescript[#3][#5][\t!size]% \dostoptypefacedefining \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 \setugvalue{#1}{\switchtotypeface[#1][#2]}% \fi}} \unexpanded\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\ifcsname\??tf\fontclass\s!default\endcsname #1[\csname\??tf\fontclass\s!default\endcsname]% \else #1[\c!rm]% \fi \fi \fi \ifmmode\mr\else\tf\fi} % needed ? \def\usetypefile[#1]% recurses on path ! {\edef\currenttypefile{\f!typeprefix#1}% \readfile{\currenttypefile.\mksuffix}\donothing{\readfile\currenttypefile\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} {\global\let\checkfontclass\docheckfontclass \def\docommand##1{\setevalue{#1-##1}{#3}}% \processcommalist[#2]\docommand}}} %D This hooks into the font mechanism with: % \def\checkfontclass#1% called often % {\edef\fontclass{\executeifdefined{\fontclass-#1}{\fontclass}}} % \def\checkfontclass#1% called often % {\edef\fontclass{\ifcsname\fontclass-#1\endcsname\csname\fontclass-#1\endcsname\else\fontclass\fi}} \def\docheckfontclass#1% called often {\ifcsname\fontclass-#1\endcsname \expandafter\let\expandafter\fontclass\csname\fontclass-#1\endcsname \fi} \let\checkfontclass\gobbleoneargument \fetchruntimecommand \typetypescript {\f!typeprefix\s!run.mkiv} % will become module \protect \endinput % Computer Modern Roman : Donald Knuth % Latin Modern: LM Font Revision Team % LM math vs CM math (analysis by Taco): % % lmex10.tfm % identical % lmmi5.tfm % identical % lmmi6.tfm % identical % lmmi7.tfm % identical % lmmi8.tfm % identical % lmmi9.tfm % identical % lmmi10.tfm % identical % lmmi12.tfm % identical % lmmib10.tfm % identical % lmsy5.tfm % extra chars: 254,255 (octal) % lmsy6.tfm % extra chars: 254,255 (octal) % lmsy7.tfm % extra chars: 254,255 (octal) % lmsy8.tfm % extra chars: 254,255 (octal) % lmsy9.tfm % extra chars: 254,255 (octal) % lmsy10.tfm % extra chars: 254,255 (octal) % lmbsy10.tfm % extra chars: 254,255 (octal) % % From the 'AMS' set: % % lmmib5.tfm % identical % lmmib7.tfm % identical % lmbsy5.tfm % extra chars: 254,255 (octal) % lmbsy7.tfm % extra chars: 254,255 (octal) % % The two extra characters are: % % /lessorequalslant % /greaterorequalslant