%%%% OFS: Olsak's Font System based on plain macros %%%% Jun 2001 Petr Olsak %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% See the ofsdoc.tex for more details \ifx\setfonts\undefined\else \expandafter\endOFSmacro \fi %\def\OFSversion{Nov. 2001} % First version released %\def\OFSversion{Jun. 2002} % The \savefontid \restorefontid added \def\OFSversion{Oct. 2002} % The (Variant) in \loadtextfam introduced % \addcmd introduced % \def\relax{} in \setfosize macro added % \ifx\sgfamily\newfamily added in \setfontfamily %%%% Basic settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newlinechar=`^^J \def\listfamilies{} \message{OFS (Olsak's Font System) based on plain initialized. <\OFSversion>} \def\fosize{at10pt} % default font size \def\currentfamily{CMRoman} % default font family \ifx\fotenc\undefined \def\fotenc{8z}\fi % default font encoding \let\origTeX=\TeX \chardef\bifam=5 % \slfam=5, but it is not usuall math. family \def\rm {\fam0 \let\currentvariant M\tenrm} \def\bf {\fam\bffam \let\currentvariant F\tenbf} \def\it {\fam\itfam \let\currentvariant T\tenit} \def\bi {\fam\bifam \let\currentvariant I\tenbi} \let\currentvariant=M %%%% The \fontusage macro %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \bgroup \catcode`\#=12 \catcode`\{=12 \catcode`}=12 \catcode`\X=1 \catcode`\Z=2 \catcode`\^^M=14 \catcode`\ =12 \catcode`\|=0\catcode`\\=12% |gdef|fontusageX |begingroup |displaymessageX%----------------------------------------------------- \fontusage: ============== Olsak's Font System, usage: =================^^J \input ofs [sjannon, sdynamo, a35] ... for example^^J \showfonts ... shows all loaded font families (by previous \input)^^J \setfonts [Family/] ... local switch to the new family, after this, the^^J \rm, \bf, \it, bi will switch to the variants. The current size is used.^^J \setfonts [/size] ... local switch to the new size of fonts, the family is^^J not changed. The "size" has the following possible formats:^^J at ... the same as \font\something=file at^^J ... the same as at^^J ... the same as atpt^^J scaled ... the same as \font\something=file scaled^^J mag fonts will be magnified by given coefficient^^J depend on current size of the fonts.^^J \setfonts [Family/size] ... switch to the new family at given size^^J \setfonts [Family-vr/] ... switch to the specified font, the current size^^J is used. The "vr" is acronym for variant (bf for example).^^J \setfonts [Family-vr/size] ... switch to the specified font.^^J \fontdef\name [Family/size] ... same as \gdef\name{\setfonts[Family/size]}^^J The "Family" or "size" parameter may be empty.^^J \fontdef\name [Family-vr/size] ... \name is fixed-font switch iff:^^J "size" is no empty and no mag.^^J Fixed-font switch "\name" is implemented as \global\font\name=file.^^J \setmath [size/size/size] ... set math it/rm as current it/rm + use PS Symbol^^J \nofontmessages, \logfontmessages, \displayfontmessages, \detailfontmessages^^J ... the levels of log. Z%----------------------------------------------------------------------- |endgroup Z |egroup %%%% The fragile/robust story %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \bgroup \catcode`\#=12 \catcode`\|=0 \catcode`\\=12 |gdef|fragilecommand{% |begingroup |def|spc{|space|space|space|space|space}% |message { ERROR !! The fragile command in the toc/ind/aux or similar file.^^J You can solve this problem by the following steps:^^J 1. Remove the auxiliary file with this command.^^J 2. Include the following macro code into your document header:^^J |spc \let\orishipout=\shipout^^J |spc \def\shipout#1#2{\setbox0=#1{#2}\bgroup^^J |spc |spc \let\expandaction=\noexpand \orishipout\box0 \egroup}^^J 3. TeX your document again and again...^^J See the OFS documentation for more info.^^J}% |errmessage{The fragile command in auxiliary file}% |endgroup } |egroup %%%% The macros used in declaration files %%%%%%%%%%%%%%%%%%%%%%%%%%% \def\ofsputfamlist #1{% \xdef\listfamilies {\listfamilies#1}% } \def\ofsdeclarefamily [#1] #2{% \ofsputfamlist {^^J \space\space[#1/]}% \expandafter \gdef \csname fam!.#1\endcsname {#2}% \bgroup \count2=18 \def\tmpa ##1{\if:##1\let\tmpa=\relax \else\advance\count2 by-1 \fi\tmpa}\tmpa #1:% \def\tmpa {\ifnum\count2>0 \advance\count2 by-1 \ofsputfamlist{ }% \else\let\tmpa=\relax \fi\tmpa}\tmpa \def\loadtextfam ##1;##2;##3;##4;##5;{% \if|##1|\ofsputfamlist{ \space- ,}% \else \ofsputfamlist{ \string\rm,}\fi \if|##2|\ofsputfamlist{ \space- ,}% \else \ofsputfamlist{ \string\bf,}\fi \if|##3|\ofsputfamlist{ \space- ,}% \else \ofsputfamlist{ \string\it,}\fi \if|##4|\ofsputfamlist{ \space- }% \else \ofsputfamlist{ \string\bi}\fi} \def\newvariant ##1 ##2(##3) ##4;##5;{\ofsputfamlist{, \string##2}}% #2% \egroup } \def\loadtextfam #1;#2;#3;#4;#5;{% \def\ofslistvariants{}% \ofsloadfont {\currentfamily-rm}{tenrm}{#1}{M}{#5}{}% \ofsloadfont {\currentfamily-bf}{tenbf}{#2}{F}{#5}{Bold}% \ofsloadfont {\currentfamily-it}{tenit}{#3}{T}{#5}{Italic}% \ofsloadfont {\currentfamily-bi}{tenbi}{#4}{I}{#5}{BoldItalic}% \fontmessage{\ofsmessageheader\ofslistvariants}% \def\ofslistvariants{}% } \def\savefontid #1{% % The font identifier is stored in TeX by % the last \font primitive used for this font \expandafter \gdef % but I need to store the first one. \csname fn:\expandafter\fontname\csname#1\endcsname\endcsname{#1}% } \def\restorefontid #1{\expandafter \ifx \csname fn:\expandafter\fontname\csname#1\endcsname\endcsname \relax \else {\expandafter \font \csname \csname fn:\expandafter\fontname\csname#1\endcsname\endcsname \endcsname =\fontname\csname#1\endcsname\relax}% \fi } \def\ofsloadfont #1#2#3#4#5#6{% #1:famname #2:seqname, #3:(variant) file, \if|#3|\fontprefix % #4:variant, #5:extraenc, #6: defaultvar \expandafter\let \csname #2\expandafter \endcsname \csname warn#4\endcsname \expandafter\let \csname var!.the#4\endcsname = \relax \else \separeofsvariant #1;#2;#3;#4;#5;#6;% \fi } \def\separeofsvariant #1;#2;#3#4;#5;#6;#7;{\if(#3% \storeofsvariant #1;#2;#3#4;#5;#6;% \else \ifx \userfontname#2\else \def\tmpc ten##1;{##1}% \edef\ofslistvariants {\ofslistvariants \space \expandafter\string\csname\tmpc#2;\endcsname\space (#7)}% \fi \ofsloadfontori {#1}{#2}{#3#4}{#5}{#6}% \fi } \def\storeofsvariant #1;#2;(#3) #4;#5;#6;{\ifx \userfontname#2\else \def\tmpc ten##1;{##1}% \edef\ofslistvariants{\ofslistvariants \space \expandafter\string\csname\tmpc#2;\endcsname\space (#3)}% \fi \ofsloadfontori {#1}{#2}{#4}{#5}{#6}% } \def\ofsloadfontori #1#2#3#4#5{% #1:famname #2:seqname, #3:file, % #4: variant-letter #5: extraenc \calculatemetricfile {#3}\fosize \fontprefix \expandafter\font\csname #1/\fosize\endcsname =\metricfile\fosize\relax \savefontid{#1/\fosize}% \fontprefix \expandafter \let \csname #2\expandafter\endcsname \csname #1/\fosize\endcsname \fontloadmessage{#2}{\metricfile\fosize}% \expandafter\edef \csname var!.the#4\endcsname {% \csname #2\endcsname}% \if|#5|\else \let\tmpa=\fotenc \def\fotenc{#5}% \calculatemetricfile {#3}\fosize \let\fotenc=\tmpa \expandafter \xdef \csname eXfont!.\fontname \csname #2\endcsname\endcsname {\metricfile\fosize}% \expandafter \xdef \csname eXenc!.\fontname \csname #2\endcsname\endcsname {#5}% \fi } \def\fontprefix{} % on another place will be: \let\fontprefix=\global \def\newvariant #1 #2(#3) #4;#5;{% #1:number #2:\sequence, #3:comment \savetokenname #2\tmpb % #4:file, #5:extraenc \edef\ofslistvariants {\ofslistvariants \space \string#2 (#3)}% \ofsloadfontori {\currentfamily-\tmpb}{ten\tmpb}{#4}{#1}{#5}% \edef #2{\let\currentvariant #1% \expandafter\noexpand \csname ten\tmpb\endcsname}% \expandafter\let \csname var!.the#1\endcsname =#2% } \def\registertfm #1 #2-#3 #4 {% \expandafter \ifx \csname reg!.#1\endcsname \relax \expandafter \def \csname reg!.#1\endcsname {}\fi \let\testtfmsize=\relax \def\tmpa{*}\def\tmpb{#3}% \ifx \tmpa\tmpb \def\tmpb{\maxdimen}\fi \expandafter \edef \csname reg!.#1\endcsname {% \csname reg!.#1\endcsname \testtfmsize #2-\tmpb:#4 }% } \def\addcmd #1#2{\expandafter\def\expandafter\tmpa\expandafter{#1}% \def\tmpb{#1}% \ifx\tmpa\tmpb % the #1 is not a macro \expandafter\let\csname \string#1-original\endcsname =#1% \expandafter\def\expandafter #1\expandafter{% \csname\string#1-original\endcsname #2}% \else % the #1 is a macro \expandafter\def\expandafter #1\expandafter{#1#2}% \fi } %%%% Logging %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\displaymessage{\immediate\write16 } \def\ofsmessageheader{OFS (l.\the\inputlineno): } \def\displayfontmessages{\let\fontmessage=\displaymessage \def\fontloadmessage##1##2{}} \def\logfontmessages{\let\fontmessage=\wlog \def\fontloadmessage##1##2{}} \def\nofontmessages{\def\fontmessage##1{}\def\fontloadmessage##1##2{}} \def\detailfontmessages{\displayfontmessages \def\fontloadmessage##1##2{\displaymessage{\ofsmessageheader \space\space \ifx\fontprefix\global\string\global\fi\string\font \csname##1\endcsname= ##2}}} \logfontmessages % default ofs logging %%%% Auxiliary macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\showfonts{\displaymessage{\ofsmessageheader The list of known font families:\listfamilies}} \def\warnmissingfont #1#2{% \ifx\expandaction\noexpand \expandafter \noexpand \csname ten#1\endcsname \else \csname fragilecommand!\endcsname \displaymessage{\ofsmessageheader WARNING. Variant #2-#1 is unknown. No font is set.}% \fi } \def\warnM{\warnmissingfont {rm}\currentfamily} \def\warnT{\warnmissingfont {it}\currentfamily} \def\warnF{\warnmissingfont {bf}\currentfamily} \def\warnI{\warnmissingfont {bi}\currentfamily} \def\setfosize #1#2#3:{\if a#2\def#1{#2#3}% \else\if s#2\let\tmpc=\relax \def\relax{}\edef#1{#2#3}\let\relax=\tmpc% \else\if m#2\expandafter\readfosize\fosize:% \readmag #2#3..:#1% \else\isunitpresent #2#3.?\edef#1{at#2#3\tmpa}% \fi \fi \fi} \def\readfosize #1{% \if a#1\def\tmpc t##1:{\dimen0=##1\relax}% \else \if s#1\def\tmpc caled##1:{\dimen0=.01pt {\def\relax{}\xdef\tmpc{##1}}\dimen0=\tmpc\dimen0\relax}% \else \errmessage{OFS: readfosize: something wrong??}% \fi\fi \tmpc } \def\readmag mag#1.#2.#3:#4{% \if|#2|\if|#3|% \errmessage{OFS: "mag" needs the decimal parameter with decimal point}% \fi\fi \dimen0 =#1.#2 \dimen0 \advance\dimen0 by7sp % rounding to three digits after decimal point \ifdim\dimen0<10pt \edef\tmpa{+\the\dimen0}\else \edef\tmpa{\the\dimen0}\fi \dimen0 =\expandafter \readsixdigits \tmpa :::::|pt \edef#4{at\the\dimen0}% } \def\readsixdigits #1#2#3#4#5#6#7#8#9|{% \if:#5#1#2\else\if:#6#1#2#3\else\if:#7#1#2#3#4\else \if:#8#1#2#3#4#5\else#1#2#3#4#5#6\fi\fi\fi\fi } \def\isunitpresent #1.#2?{\bgroup \if |#2|\afterassignment\defpttotmpa \count2=#1.:% \else \afterassignment\defpttotmpa \count2=0#2:\fi } \def\defpttotmpa #1.:{\if|#1|\gdef\tmpa{pt}\else\gdef\tmpa{}\fi\egroup} \def\savetokenname #1#2{% {\escapechar=-1 \xdef\tmpa{\string#1}}% \edef#2{\tmpa}% } \def\readfamvariant #1-#2-#3:{\def\tmpb{#1}\def\famvariant{#2}} \def\readfirsttoken #1#2:{#1} \def\readothertokens #1#2:{#2} % TBN, page 80 {\catcode`p=12 \catcode`t=12 \gdef\noPT #1pt{#1}} \def\calculatemetricfile #1#2{% #1: name or metric file, #2: fosize \expandafter \ifx \csname reg!.#1\endcsname \relax \edef\metricfile{#1 }% \else \let\metricfile=\empty \expandafter \readfosize #2:% \dimen0 = fosize \if s\expandafter \readfirsttoken #2:% \let\testtfmsize=\testtfmsizescaled \else \let\testtfmsize=\testtfmsizeat \fi \csname reg!.#1\endcsname \ifx \metricfile\empty \let\testtfmsize=\testtfmsizescaled \csname reg!.#1\endcsname \ifx \metricfile\empty \displaymessage {\ofsmessageheader WARNING. The name "#1" is not registered for size #2.}% \edef\metricfile{#110 }% \fi\fi\fi } \def\testtfmsizeat #1-#2:#3 {% \if|#1|\else \ifdim #1>\dimen0 \else\ifdim #2<\dimen0 \else \def\metricfile{#3 }% \fi\fi\fi } \def\testtfmsizescaled #1-#2:#3 {% \if|#1|\def\metricfile{#3 }\fi } \def\metrictmpa{\expandafter\singlefontname \fontname\expandafter\tmpa\space:} \def\singlefontname #1 #2:{#1} \def\ofsmeaning #1 #2 {the} %%%% The \setfonts macro %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\setfonts [#1/#2]{% \ifx\expandaction\noexpand \noexpand\setfonts [#1/#2]% \else \csname fragilecommand!\endcsname \edef\tmpa{#1}\expandafter \readfamvariant\tmpa--:% \ifx\famvariant\empty \setfontfamily [#1/#2]% \else \if|#2|\ifx\tmpb\empty \let\tmpb=\relax \csname\famvariant\endcsname \fi\fi \ifx\tmpb\relax \else \edef\userfontname{singlefont}% \setsinglefont [\tmpb-\famvariant/#2]% \fi\fi \ignorespaces \fi } \def\setfontfamily [#1/#2]{% \if|#1|\let\newfamily=\currentfamily \else \edef\newfamily{#1}\fi \if|#2|\else \setfosize\fosize #2:\fi \expandafter\ifx \csname fam!.\newfamily\endcsname \relax \displaymessage{\ofsmessageheader WARNING. No font family is set.^^J% The family name [\newfamily/] is not known in the list: \listfamilies}% \else \let\currentfamily=\newfamily \fontmessage{\ofsmessageheader Font family \currentfamily\space\fosize \space (enc=\fotenc) activated:}% \def\tmpa##1{\expandafter \let \csname var!.the##1\endcsname \relax}% \tmpa0\tmpa1\tmpa2\tmpa3\tmpa4\tmpa5\tmpa6\tmpa7\tmpa8\tmpa9% \setfontshook \csname fam!.\newfamily\endcsname \ifx \ofslistvariants \empty \else \fontmessage{\ofsmessageheader\ofslistvariants}\fi % restoring current variant: \ifx G\currentvariant \ifx \sgfamily\newfamily \if |#2|\else \setsinglefont[\sgfamily-\sgvariant/#2]% \fi \else \tenrm \fi \else \expandafter \ifx \csname var!.\expandafter\ofsmeaning\meaning \currentvariant\endcsname \relax \tenrm \else \csname var!.\expandafter\ofsmeaning\meaning \currentvariant\endcsname \fi\fi\fi } \def\setsinglefont [#1-#2/#3]{% \edef\newfamily{#1}\edef\sgvariant{#2}% \ifx\newfamily\empty \let\newfamily=\currentfamily \fi \edef\tmpa{#3}% \let\orifosize=\fosize \let\oriloadfam=\loadtextfam \let\orinewvariant=\newvariant \ifx\tmpa\empty \let\tmpa=\fosize \else \expandafter\setfosize\expandafter\fosize\tmpa:% \fi \expandafter\ifx \csname fam!.\newfamily\endcsname \relax \displaymessage{\ofsmessageheader WARNING. No font is set.^^J% The family name [\newfamily/] is not known in the list: \listfamilies}% \else \fontmessage{\ofsmessageheader Loading single font \newfamily-#2 \fosize \space (enc=\fotenc).}% \def\tmpa{rm}\ifx\sgvariant\tmpa \def\loadtextfam ##1;##2;##3;##4;##5;{% \ofsloadfont {\newfamily-rm}{\userfontname}{##1}{M}{##5}{}}% \fi \def\tmpa{bf}\ifx\sgvariant\tmpa \def\loadtextfam ##1;##2;##3;##4;##5;{% \ofsloadfont {\newfamily-bf}{\userfontname}{##2}{F}{##5}{}}% \fi \def\tmpa{it}\ifx\sgvariant\tmpa \def\loadtextfam ##1;##2;##3;##4;##5;{% \ofsloadfont {\newfamily-it}{\userfontname}{##3}{T}{##5}{}}% \fi \def\tmpa{bi}\ifx\sgvariant\tmpa \def\loadtextfam ##1;##2;##3;##4;##5;{% \ofsloadfont {\newfamily-bi}{\userfontname}{##4}{I}{##5}{}}% \fi \ifx\loadtextfam\oriloadfam \def\loadtextfam ##1;##2;##3;##4;##5;{}% \expandafter \savetokenname \csname \sgvariant\endcsname \tmpb \def\newvariant ##1 ##2(##3) ##4;##5;{\savetokenname ##2\tmpa \ifx \tmpa\tmpb \ofsloadfont {\newfamily-\tmpa}{\userfontname}{##4}{##1}{##5}{}% \fi}% \else \def\newvariant ##1 ##2(##3) ##4;##5;{}% \fi \fontprefix \expandafter \let \csname \userfontname \endcsname =\relax \setfontshook \csname fam!.\newfamily\endcsname \expandafter \ifx \csname \userfontname \endcsname \relax \displaymessage{\ofsmessageheader WARNING. Variant \newfamily-\sgvariant\space is unknown. No font is set.}% \else \csname \userfontname \endcsname \let\sgfamily=\newfamily \let\currentvariant=G% \fi \fi \let\fosize=\orifosize \let\loadtextfam=\oriloadfam \let\orinewvariant=\newvariant } \let\orifosize=\relax \let\oriloadfam=\relax \let\orinewvariant=\relax \let\newfamily=\relax \let\sgfamily=\relax \let\sgvariant=\relax \def\fontdef #1[#2/#3]{\def\tmpc{!}% \edef\tmpa{#3}% \ifx\tmpa\tmpc \let\tmpa=\fosize \fi \edef\tmpb{#2}\expandafter \readfamvariant\tmpb--:% \ifx\tmpb\tmpc \let\tmpb=\currentfamily \fi \ifx\famvariant\empty \fontmessage{\ofsmessageheader Define \string#1 as \noexpand\setfonts[\tmpb/\tmpa].}% \xdef #1{\noexpand\setfonts [\tmpb/\tmpa]}% \else \ifx\tmpa\empty \def\tmpa{mag1.0}\fi \expandafter \if \expandafter \readfirsttoken \tmpa:m% \fontmessage{\ofsmessageheader Define \string#1 as \noexpand\setfonts[\tmpb-\famvariant/\tmpa].}% \xdef #1{\noexpand\setfonts [\tmpb-\famvariant/\tmpa]}% \else \ifx\tmpb\empty \fontmessage{\ofsmessageheader Define \string#1 as \noexpand\setfonts[-\famvariant/\tmpa].}% \xdef #1{\noexpand\setfonts [-\famvariant/\tmpa]}% \else \fontmessage{\ofsmessageheader Define \string#1 as fixed font [\tmpb-\famvariant/\tmpa].}% {\let\fontprefix=\global \let\tmpc=\tmpa \savetokenname #1\userfontname \setsinglefont [\tmpb-\famvariant/\tmpc]}% \fi\fi\fi } %%%% \ifknownfam %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newif \ifisfamilypresent \def\ifknownfam [#1]{% \expandafter\ifx \csname fam!.#1\endcsname \relax \expandafter \isfamilypresentfalse \else \expandafter \isfamilypresenttrue \fi \ifisfamilypresent } %%%% Extra encodings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\setextrafont{% \ifx\expandaction\noexpand \noexpand\setextrafont \else \csname fragilecommand!\endcsname \expandafter \ifx \csname eXfont!.\fontname\the\font\endcsname \relax \expandafter\let\expandafter\tmpa \the\font \displaymessage{\ofsmessageheader WARNING. \string\setextrafont: No extra metric for \metrictmpa.}% \else \font\extrafont=\csname eXfont!.\fontname\the\font\endcsname \relax \fontloadmessage{extrafont}% {\csname eXfont!.\fontname\the\font\endcsname}% \extrafont \fi \fi } \let\currentextrafont=\relax \def\characterdef #1#2#3 {\relax \savetokenname #1\tmpa \edef #1{\noexpand\printcharacter {\tmpa}}% \edef \tmpa {\tmpa:-#2#3}% \futurelet \tmpb \docharacterdef } \def\docharacterdef {% \ifx\tmpb\bgroup \expandafter \def \csname \tmpa \expandafter\endcsname \else \afterassignment \donumbercharacterdef \uccode`\^^@= \fi } {\catcode`\^^@=12 \gdef\donumbercharacterdef {% \uppercase{\expandafter \def\csname \tmpa\endcsname {^^@}}% \uccode`\^^@=0 }} \def\printcharacter #1{% \ifx\expandaction\noexpand \expandafter\noexpand \csname #1\endcsname \else \expandafter\ifx\csname #1:-\fotenc\endcsname \relax \expandafter \ifx \csname eXfont!.\fontname\the\font\endcsname \relax \expandafter\ifx\csname #1:-*\endcsname \relax \csname fragilecommand!\expandafter\endcsname % \printcharacter may be first token in \halign data \expandafter\let\expandafter\tmpa \the\font \displaymessage{\ofsmessageheader WARNING. No character \expandafter\noexpand\csname#1\endcsname in \metrictmpa.}% \displaymessage{\ofsmessageheader \space\space\space No extra metric defined for \metrictmpa.}% \else \csname #1:-*\endcsname \fi \else \expandafter \ifx \csname #1:-\csname eXenc!.\fontname\the\font\endcsname \endcsname \relax \expandafter\ifx\csname #1:-*\endcsname \relax \csname fragilecommand!\expandafter\endcsname % \printcharacter may be first token in \halign data \expandafter\let\expandafter\tmpa \the\font \displaymessage{\ofsmessageheader WARNING. No character \expandafter\noexpand\csname#1\endcsname in \metrictmpa\space + \csname eXfont!.\fontname\the\font\endcsname\space.}% \else \csname #1:-*\endcsname \fi \else {\expandafter \setextrafont \csname #1:-\csname eXenc!.\fontname\the\font\endcsname \endcsname}% \fi \fi \else \csname #1:-\fotenc\endcsname \fi \fi } \def\extchar{\afterassignment\doextchar \chardef\tmpc=} \def\doextchar{{\setextrafont\tmpc}} \def\accentdef #1#2#3 #4 {\relax \savetokenname #1\tmpa \edef #1##1{\noexpand\printaccent {\tmpa}{##1}}% \edef \tmpa {\tmpa:#2:-#4}% \futurelet \tmpb \docharacterdef } \def\printaccent #1#2{% \ifx\expandaction\noexpand \expandafter\noexpand \csname #1\endcsname {#2}% \else \expandafter \ifx \csname #1:#2:-\fotenc\endcsname \relax \expandafter \ifx \csname eXfont!.\fontname\the\font\endcsname\relax \expandafter \ifx \csname #1:*:-\fotenc\endcsname \relax \expandafter \ifx \csname #1:#2:-*\endcsname \relax \expandafter \ifx \csname #1:*:-*\endcsname \relax \csname fragilecommand!\expandafter\endcsname % \printaccent may be first token in \halign data \expandafter\let\expandafter\tmpa \the\font \displaymessage{\ofsmessageheader WARNING. No accent \expandafter\noexpand\csname#1\endcsname#2 in \metrictmpa.}% \displaymessage{\ofsmessageheader \space\space\space No extra metric defined for \metrictmpa.}% \else \if ^^X#2^^X\csname #1:*:-*\endcsname {}% \else \csname #1:*:-*\endcsname #2% \fi \fi \else \csname #1:#2:-*\endcsname \fi \else \if ^^X#2^^X\csname #1:*:-\fotenc\endcsname {}% \else \csname #1:*:-\fotenc\endcsname #2% \fi \fi \else \expandafter \ifx \csname #1:#2:-\csname eXenc!.\fontname\the\font\endcsname \endcsname \relax \expandafter \ifx \csname #1:*:-\fotenc\endcsname \relax \expandafter \ifx \csname #1:*:-\csname eXenc!.\fontname\the\font\endcsname \endcsname \relax \expandafter \ifx \csname #1:#2:-*\endcsname \relax \expandafter \ifx \csname #1:*:-*\endcsname \relax \csname fragilecommand!\expandafter\endcsname % \printcharacter may be first in \halign data \expandafter\let\expandafter\tmpa \the\font \displaymessage{\ofsmessageheader WARNING. No accent \expandafter\noexpand\csname#1\endcsname #2 in \metrictmpa\space + \csname eXfont!.\fontname\the\font\endcsname.}% \else \if ^^X#2^^X\csname #1:*:-*\endcsname {}% \else \csname #1:*:-*\endcsname #2% \fi \fi \else \csname #1:#2:-*\endcsname \fi \else \expandafter \let \expandafter \tmpb \the\font {\if ^^X#2^^X\expandafter \setextrafont \csname #1:*:-\csname eXenc!.\fontname\the\font\endcsname \endcsname \tmpb {}% \else \expandafter \setextrafont \csname #1:*:-\csname eXenc!.\fontname\the\font\endcsname \endcsname \tmpb #2% \fi}% \fi \else \if ^^X#2^^X\csname #1:*:-\fotenc\endcsname {}% \else \csname #1:*:-\fotenc\endcsname #2% \fi \fi \else {\expandafter \setextrafont \csname #1:#2:-\csname eXenc!.\fontname\the\font\endcsname \endcsname}% \fi \fi \else \csname #1:#2:-\fotenc\endcsname \fi \fi } \def\accentabove #1#2#3{% \ifx\expandaction\noexpand \noexpand\accentabove {#1}{#2}{#3}% \else \csname fragilecommand!\endcsname \if ^^X#3^^X#1\else \leavevmode\vbox{% \setbox0=\hbox{#3}\setbox2=\hbox{#1}% \dimen0=\ht0 \advance\dimen0 by\dp2 \advance\dimen0 by#2\relax \offinterlineskip \halign {##\cr \hidewidth\slantcorrection{\dimen0}\box2 \hidewidth\cr \noalign{\kern#2}\box0 \cr}}% \fi\fi } \def\accentbelow #1#2#3{% \ifx\expandaction\noexpand \noexpand\accentbelow {#1}{#2}{#3}% \else \csname fragilecommand!\endcsname \if ^^X#3^^X#1\else \leavevmode\vtop{% \setbox0=\hbox{#3}\setbox2=\hbox{#1}% \dimen0=-\dp0 \advance\dimen0 by-\ht2 \advance\dimen0 by-#2\relax \offinterlineskip \halign {##\cr \box0 \cr\noalign{\kern#2}% \hidewidth \slantcorrection{\dimen0}% \dimen0=\dp2 \ifdim\dimen0<.2ex \dimen0=.2ex \fi \vbox to\dimen0{\hbox{\box2}\vss}\hidewidth\cr}}% \fi\fi } \def\slantcorrection #1{\dimen0=#1\relax \dimen0 =\expandafter \noPT\the\fontdimen1\the\font \dimen0 \kern 2\dimen0 } %%%% Math %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\loadmathfam #1[#2/#3]{% #1: fam, [#2/#3]: basic font [switch/file] % basic font is used in three sizes: \textfosize, \scriptfosize, % \scsriptscriptfosize. The basic font is given by its font-switch % (control sequence without backslash) XOR its filename. \if |#2|\edef\tmpa{#3}\edef\tmpb{#3}% \else \edef\tmpb{#2}% \edef \tmpa {\expandafter \readfirsttoken \tmpb:}% \if X\tmpa \expandafter \ifx \csname eXfont!.\fontname \expandafter \csname \expandafter \readothertokens\tmpb:\endcsname \endcsname \relax \displaymessage{\ofsmessageheader WARNING. loadmathfam: the current "\expandafter\readothertokens\tmpb:" has no extra metric}% \def\tmpa{cmr10 }% \else \edef \tmpa {\csname eXfont!.\fontname \expandafter \csname \expandafter \readothertokens\tmpb:\endcsname \endcsname \space}% \fi \else \expandafter \ifx \csname #2\endcsname \relax \displaymessage{\ofsmessageheader WARNING. loadmathfam: the "#2" is not known font}% \def\tmpa{cmr10 }% \else \edef\tmpa{\expandafter\fontname\csname#2\endcsname\space}% \fi \fi \edef\tmpa{\expandafter\singlefontname\tmpa:}% gobble at \fi \calculatemetricfile \tmpa \textfosize \expandafter\font \csname\tmpb-Mt\endcsname =\metricfile\textfosize \relax \restorefontid{\tmpb-Mt}% \fontloadmessage{\tmpb-Mt}{\metricfile\textfosize \space\space (fam:\string#1)}% \ifx \noindexsize \relax \expandafter \let \csname\tmpb-Mss\expandafter\endcsname \csname\tmpb-Mt\endcsname \expandafter \let \csname\tmpb-Ms\expandafter\endcsname \csname\tmpb-Mt\endcsname \else \calculatemetricfile \tmpa \scriptfosize \expandafter\font \csname\tmpb-Ms\endcsname =\metricfile\scriptfosize \relax \restorefontid{\tmpb-Ms}% \fontloadmessage{\tmpb-Ms}{\metricfile\scriptfosize \space\space (fam:\string#1)}% \calculatemetricfile \tmpa \scriptscriptfosize \expandafter\font \csname\tmpb-Mss\endcsname =\metricfile\scriptscriptfosize \relax \restorefontid{\tmpb-Mss}% \fontloadmessage{\tmpb-Mss}{\metricfile\scriptscriptfosize \space\space (fam:\string#1)}% \fi \textfont #1=\csname\tmpb-Mt\endcsname \scriptfont #1=\csname\tmpb-Ms\endcsname \scriptscriptfont #1=\csname\tmpb-Mss\endcsname \def\noindexsize {\let\noindexsize \relax}% } \def\noindexsize {\let\noindexsize \relax} \def\hex#1{\ifcase#10\or1\or2\or3\or4\or5\or6\or7\or8\or9\or A\or B\or C\or D\or E\or F\else?\fi}% \def\newmathfam #1{\ifx #1\undefined \csname newfam\endcsname #1\fi} %% \newfam is \outer macro :-( \def\setmath [#1/#2/#3]{% \ifx\expandaction\noexpand \noexpand\setmath [#1/#2/#3]% \else \csname fragilecommand!\endcsname \if|#1|\def\tmpa{mag1.0}\else\edef\tmpa{#1}\fi \expandafter \setfosize \expandafter \textfosize \tmpa:% \if|#2|\def\tmpa{mag0.7}\else\edef\tmpa{#2}\fi \expandafter \setfosize \expandafter \scriptfosize \tmpa:% \if|#3|\def\tmpa{mag0.5}\else\edef\tmpa{#3}\fi \expandafter \setfosize \expandafter \scriptscriptfosize \tmpa:% \fontmessage{\ofsmessageheader \noexpand\setmath [\textfosize/\scriptfosize/\scriptscriptfosize] (enc=\fomenc, version=\mathversion)}% \mathfonts \mathchars \ignorespaces \fi } \def\setsimplemath{\setmath[//]} % for backward compatibility \def\safemathchardef{\dosafemathdef\mathchardef} \def\safemathaccentdef{\dosafemathdef\mathaccentdef} \def\dosafemathdef #1#2{\relax \ifx #2\undefined \expandafter #1\expandafter#2% \else \savetokenname #2\tmpb \expandafter \ifx \csname M\tmpb\endcsname \relax \expandafter \let \csname T\tmpb\endcsname =#2% \edef #2{\noexpand\ifmmode \noexpand\expandafter \expandafter\noexpand \csname M\tmpb\endcsname \noexpand\else \noexpand\expandafter \expandafter\noexpand \csname T\tmpb\endcsname \noexpand\fi}% \expandafter #1\csname M\tmpb \expandafter\expandafter\expandafter\endcsname \else \mathchardef \tmpb \fi\fi } \def\mathaccentdef #1#2 {\edef#1{\mathaccent#2 }} \def\pickmathfont #1#2{% We need "=" in \Long/right/left/arrow macros \mathchoice % but we need not allocate new mathfam {\hbox{\calculatemetricfile{#1}\textfosize \font\tmpa=\metricfile \textfosize \tmpa#2% \fontloadmessage{tmpa}{\metricfile\textfosize \space\space\space T: {\noexpand\tmpa#2}}}}% {\hbox{\calculatemetricfile{#1}\textfosize \font\tmpa=\metricfile \textfosize \tmpa#2% \fontloadmessage{tmpa}{\metricfile\textfosize \space\space\space D: {\noexpand\tmpa#2}}}}% {\hbox{\calculatemetricfile{#1}\scriptfosize \font\tmpa=\metricfile \scriptfosize \tmpa#2% \fontloadmessage{tmpa}{\metricfile\scriptfosize \space\space\space S: {\noexpand\tmpa#2}}}}% {\hbox{\calculatemetricfile{#1}\scriptscriptfosize \font\tmpa=\metricfile \scriptscriptfosize \tmpa#2% \fontloadmessage{tmpa}{\metricfile\scriptscriptfosize \space\space\space SS: {\noexpand\tmpa#2}}}}% } %%% default math sizes: \def\textfosize{at10pt} \def\scriptfosize{at7pt} \def\scriptscriptfosize{at5pt} %%%% \endOFSmacro : reads [options] after \input ofs %%%%%%%%%%%%%%%% \def\endOFSmacro {\expandafter \futurelet \expandafter \tmpa \expandafter \testOFSoptions \endinput} \def\testOFSoptions {\ifx [\tmpa \expandafter \readOFSoptions \fi} \def\readOFSoptions [#1]{\let\next=\processOFSoption \next #1,^^X,} \def\processOFSoption #1,{\if ^^X#1\let\next=\relax \else \input #1 \fi \next} %%%% Default text + math families %%%%%%%%%%%%%%%%%%%%%%%%%%% \input ofsdef %%%% End of OFS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \endOFSmacro