summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/ofs/ofs.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/ofs/ofs.tex')
-rw-r--r--Master/texmf-dist/tex/generic/ofs/ofs.tex1184
1 files changed, 1184 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/generic/ofs/ofs.tex b/Master/texmf-dist/tex/generic/ofs/ofs.tex
new file mode 100644
index 00000000000..e925feb0f97
--- /dev/null
+++ b/Master/texmf-dist/tex/generic/ofs/ofs.tex
@@ -0,0 +1,1184 @@
+%%%% 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
+%\def\OFSversion{Feb. 2004} % The encoding-dependend macros improved
+ % -- see new section 3.5 in ofsdoc.tex
+ % \bigsymbofont used for \fomenc PS in ofsdef.tex
+ % \ofshexbox introduced
+ % \registerenc introduced
+ % Fam-var: "var" can be in in arbitrary catcode
+ % \ofsremovefromlist introduced
+%\def\OFSversion{Mar. 2004} % \characterdef keeps sequences defined already
+ % \tryloadenc is called from \loadtextfam now
+ % \listfamilies re-implemented -> \ofslistfamilies
+\def\OFSversion{May 2004} % \ofscopyright defined in ofsdef.tex
+ % \plaincatcodes defined and used in \input ofs-*
+ % \safelet introduced
+ % space not required after <char> in \accentdef
+ % \showfonts lists only registered families
+ % \loadmathfam allows [-<variant>/] parameter
+ % \registertfm <name> - - introduced
+ % \lastfam + \mathencread + \mathencdef introduced
+ % \protectreading introduced
+
+%%%% Basic settings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newlinechar=`^^J
+\def\ofslistfamilies{}
+
+\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
+\def\extraenc{} % default extra encoding
+
+\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\tenbi=\relax
+\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
+|immediate|write16X%---------------------------------------------------
+\fontusage: ============== Olsak's Font System, usage: =================^^J
+\input ofs [sjannon, sdynamo, a35] \loadingenc=1 ... 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<dimen> ... the same as \font\something=file at<dimen>^^J
+ <dimen> ... the same as at<dimen>^^J
+ <number> ... the same as at<number>pt^^J
+ scaled<number> ... the same as \font\something=file scaled<number>^^J
+ mag<decimal-number> 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-bf/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<dec-number>.^^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
+
+\edef\tmpc{\the\catcode`\|}\catcode`\|=12 %% ConTeXt sets \catcode`\|=13
+% but we need it nonactive because of \if|#2| constructions below.
+
+%%%% The macros used in declaration files %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\ofsputfamlist #1{%
+ \expandafter \gdef\expandafter \ofslistfamilies
+ \expandafter{\ofslistfamilies \ofslisttext{#1}}%
+}
+\def\ofsdeclarefamily [#1] #2{%
+ \expandafter \ifx \csname fam!.#1\endcsname \relax \else
+ \ofsremovefromlist {#1}\fi
+ \expandafter \gdef \csname fam!.#1\endcsname {#2}%
+ \expandafter\expandafter\expandafter \gdef
+ \expandafter\expandafter\expandafter \ofslistfamilies
+ \expandafter\expandafter\expandafter {\expandafter\ofslistfamilies
+ \expandafter \ofslistfamily \csname fam!.#1\endcsname}%
+ \edef\declaredfamily{#1}%
+}
+% \ofslistfamilies includes (without spaces):
+% \ofslisttext {text1} \ofslistfamily \fam!.Family1 \ofslistfamily \fam!.Family2
+% ... etc. \ofslisttext {text2} \ofslistfamily \fam!.Family ... etc.
+
+\def\loadtextfam #1;#2;#3;#4;#5;{\tryloadenc{#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
+ \missingofsvariant #1;#2;#4;%
+ \else
+ \separeofsvariant #1;#2;#3;#4;#5;#6;%
+ \fi
+}
+\def\missingofsvariant #1-#2;#3;#4;{%
+ \expandafter\let \csname #3\expandafter \endcsname
+ \csname warn#4\endcsname
+ \expandafter\let \csname var!.the#4\endcsname = \relax
+ \expandafter\let \csname fm:-#2\endcsname = \relax
+}
+\def\separeofsvariant #1-#2;#3;#4#5;#6;#7;#8;{%
+ \if(#4%
+ \storeofsvariant #1-#2;#3;#4#5;#6;#7;%
+ \else
+ \expandafter \ifx \csname reg!.#4#5\endcsname \empty
+ \missingofsvariant #1-#2;#3;#6;%
+ \else
+ \ifx \userfontname#3\else
+ \edef\ofslistvariants {\ofslistvariants
+ \space \expandafter\string\csname#2\endcsname\space (#8)}%
+ \fi
+ \expandafter \def \csname fm:-#2\endcsname {#4#5}% formal metric
+ \ofsloadfontori {#1-#2}{#3}{#4#5}{#6}{#7}%
+ \fi\fi
+}
+\def\storeofsvariant #1-#2;#3;(#4) #5;#6;#7;{%
+ \expandafter \ifx \csname reg!.#5\endcsname \empty
+ \missingofsvariant #1-#2;#3;#6;%
+ \else
+ \ifx \userfontname#3\else
+ \edef\ofslistvariants{\ofslistvariants
+ \space \expandafter\string\csname#2\endcsname\space (#4)}%
+ \fi
+ \expandafter \def \csname fm:-#2\endcsname {#5}% formal metric
+ \ofsloadfontori {#1-#2}{#3}{#5}{#6}{#7}%
+ \fi
+}
+\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 \edef\fotenc{#5}%
+ \calculatemetricfile {#3}\fosize
+ \let\fotenc=\tmpa
+ \fontprefix \expandafter \edef
+ \csname eXfont!.\fontname \csname #2\endcsname\endcsname
+ {\metricfile\fosize}%
+ \fontprefix \expandafter \edef
+ \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 {%
+ \if -#4\relax
+ \expandafter \def \csname reg!.#1\endcsname {}%
+ \else
+ \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 }%
+ \fi
+}
+\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
+
+%%%% \showfonts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\showfonts{\bgroup \def\displaymessage{\immediate\write16 }%
+ \displaymessage{\ofsmessageheader
+ The list of known font families (encoding \fotenc):}\ofslistfamilies
+ \egroup
+}
+\def\ofslistfamily #1{%
+ \bgroup
+ \def\tmpa ##1!.##2/{##2}%
+ \edef\tmpa{\expandafter\tmpa\string #1/}%
+ \registeredfam\tmpa?\iftrue
+ \edef\tmpc {[\tmpa/]}%
+ \count2=21
+ \def\tmpa ##1{\if:##1\else\advance\count2 by-1 \expandafter\tmpa\fi}%
+ \expandafter\tmpa \tmpc:%
+ \def\tmpa {\ifnum\count2>0 \advance\count2 by-1 \edef\tmpc{\tmpc\space}%
+ \expandafter \tmpa\fi}\tmpa
+ \def\loadtextfam ##1;##2;##3;##4;##5;{%
+ \if|##1|\edef\tmpc{\tmpc\space\space- }%
+ \else \edef\tmpc{\tmpc\space\string\rm}\fi
+ \if|##2|\edef\tmpc{\tmpc, \space- }%
+ \else \edef\tmpc{\tmpc, \string\bf}\fi
+ \if|##3|\edef\tmpc{\tmpc, \space- }%
+ \else \edef\tmpc{\tmpc, \string\it}\fi
+ \if|##4|\edef\tmpc{\tmpc, \space- }%
+ \else \edef\tmpc{\tmpc, \string\bi}\fi}
+ \def\newvariant ##1 ##2(##3) ##4;##5;{\edef\tmpc{\tmpc, \string##2}}%
+ \def\modifyread ##1;{}
+ #1%
+ \displaymessage{ \space\space\tmpc}%
+ \fi
+ \egroup
+}
+\def\ofslisttext #1{\if^^J\readfirsttoken #1:\end
+ \immediate\write16{\readothertokens #1:\end}%
+ \else \displaymessage{#1}\fi}
+
+\def\ofsremovefromlist #1{% removes family #1 from \ofslistfamilies
+ \edef\act{\def\noexpand\tmpa
+ ####1\noexpand\ofslistfamily
+ \expandafter\noexpand\csname fam!.#1\endcsname
+ ####2^^X{\gdef\noexpand\ofslistfamilies{####1####2}}}\act
+ \expandafter \tmpa\ofslistfamilies^^X%
+ \expandafter \let \csname ffe?#1:\endcsname =\relax
+ \fontmessage{\ofsmessageheader The family [#1/] is redeclared.}%
+}
+
+%%%% Auxiliary macros %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\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{%
+ \edef\tmpa{\escapechar=\the\escapechar}%
+ \escapechar=-1
+ \edef#2{\string#1\expandafter}\tmpa \relax
+}
+\def\readfamvariant #1-#2-#3:{\def\tmpb{#1}\def\famvariant{#2}}
+\long\def\readfirsttoken #1#2:\end{#1}
+\long\def\readothertokens #1#2:\end{#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:\end
+ \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
+ \let\setfontsOK=\relax
+ \edef\tmpa{#1}\expandafter \readfamvariant\tmpa--:%
+ \ifx\famvariant\empty
+ \if|#1|\let\tmpa=\currentfamily \else\def\tmpa{#1}\fi
+ \registeredfam \tmpa?\iftrue
+ \def\newmodifylist{}%
+ \setfontfamily [#1/#2]%
+ \ifx\setfontsOK\relax \runmodifylist \fi
+ \else \warnunregistered\tmpa \let\setfontsOK=\undefined
+ \fi
+ \else
+ \if|#2|\ifx\tmpb\empty
+ \let\tmpb=\relax \csname\famvariant\endcsname
+ \fi\fi
+ \ifx\tmpb\relax \else
+ \registeredfam \tmpb?\iftrue
+ \def\newmodifylist{}%
+ \edef\userfontname{singlefont}%
+ \setsinglefont [\tmpb-\famvariant/#2]%
+ \ifx\setfontsOK\relax \runmodifylist \fi
+ \else \warnunregistered\tmpb \let\setfontsOK=\undefined
+ \fi\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:}\ofslistfamilies
+ \let\setfontsOK=\undefined
+ \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}%
+ \expandafter\savetokenname \csname#2\endcsname \sgvariant
+ \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:}\ofslistfamilies
+ \let\setfontsOK=\undefined
+ \else
+ \fontmessage{\ofsmessageheader Loading single font
+ \newfamily-#2 \fosize \space (enc=\fotenc).}%
+ \expandafter\savetokenname \csname rm\endcsname \tmpa
+ \ifx\sgvariant\tmpa
+ \def\loadtextfam ##1;##2;##3;##4;##5;{\tryloadenc{##5}%
+ \ofsloadfont {\newfamily-rm}{\userfontname}{##1}{M}{##5}{}}%
+ \fi
+ \expandafter\savetokenname \csname bf\endcsname \tmpa
+ \ifx\sgvariant\tmpa
+ \def\loadtextfam ##1;##2;##3;##4;##5;{\tryloadenc{##5}%
+ \ofsloadfont {\newfamily-bf}{\userfontname}{##2}{F}{##5}{}}%
+ \fi
+ \expandafter\savetokenname \csname it\endcsname \tmpa
+ \ifx\sgvariant\tmpa
+ \def\loadtextfam ##1;##2;##3;##4;##5;{\tryloadenc{##5}%
+ \ofsloadfont {\newfamily-it}{\userfontname}{##3}{T}{##5}{}}%
+ \fi
+ \expandafter\savetokenname \csname bi\endcsname \tmpa
+ \ifx\sgvariant\tmpa
+ \def\loadtextfam ##1;##2;##3;##4;##5;{\tryloadenc{##5}%
+ \ofsloadfont {\newfamily-bi}{\userfontname}{##4}{I}{##5}{}}%
+ \fi
+ \ifx\loadtextfam\oriloadfam
+ \def\loadtextfam ##1;##2;##3;##4;##5;{\tryloadenc{##5}}%
+ \def\newvariant ##1 ##2(##3) ##4;##5;{\savetokenname ##2\tmpa
+ \ifx \tmpa\sgvariant
+ \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.}%
+ \let\setfontsOK=\undefined
+ \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 m\expandafter \readfirsttoken \tmpa:\end
+ \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
+ \registeredfam \tmpb?\iftrue
+ \fontmessage{\ofsmessageheader Define \string#1
+ as fixed font [\tmpb-\famvariant/\tmpa].}%
+ {\let\fontprefix=\global \let\tmpc=\tmpa
+ \savetokenname #1\userfontname
+ \setsinglefont [\tmpb-\famvariant/\tmpc]}%
+ \else
+ \warnunregistered \tmpb
+ \displaymessage{ \space \string\fontdef\string#1
+ [#2/#3] ignored. \string#1=\string\nullfont}%
+ \global\let #1=\nullfont
+ \fi\fi\fi\fi
+}
+
+
+%%%% \knownfam \registeredfam \knownchar %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\knownfam #1?#2{% usage: \knownfam Times? \iftrue ...\else...\fi
+ \expandafter\ifx \csname fam!.#1\endcsname \relax
+ \csname iffalse\expandafter\endcsname
+ \else
+ \csname iftrue\expandafter\endcsname
+ \fi
+}
+\def\ifknownfam [#1]{\knownfam #1?!} % for bacward compatibility
+
+\def \registeredfam #1?#2{% usage: \registeredfam Times?\iftrue...\else...\fi
+ \expandafter \ifx\csname ffe?#1:\endcsname \relax
+ \def\tmpc{iftrue}%
+ \else \edef\act{\def\noexpand\tmpc####1 \fotenc,####2^^X%
+ {\def\noexpand\tmpc{####2}}}\act
+ \edef\act{\noexpand\tmpc \space
+ \csname ffe?#1:\expandafter\endcsname, \fotenc,^^X}\act
+ \ifx\tmpc\empty \def\tmpc{iffalse}%
+ \else \def\tmpc{iftrue}\fi
+ \fi \csname\tmpc\endcsname
+}
+\def\knownchar #1?#2{% usage: \knownchar \euro? \iftrue...\else...\fi
+ \if u\expandafter \readfirsttoken \meaning #1:\end % undefined
+ \let\tmpa=\relax \let\tmpb=\relax
+ \else
+ {\def\printcharacterwarn##1{\relax}\def\printcharacteraccent##1##2{\relax}%
+ \def\setextrafont{}\xdef\tmpa{#1}\gdef\tmpb{\relax}}%
+ \fi
+ \ifx \tmpa\tmpb \csname iffalse\expandafter\endcsname \else
+ \csname iftrue\expandafter\endcsname \fi
+}
+
+
+%%%% 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 \tmpb{\noexpand\printcharacter {\tmpa}}%
+ \expandafter \ifx \csname\tmpa\endcsname \relax \let#1=\tmpb \fi
+ \let\tmpc=\tmpa
+ \edef \tmpa {\tmpa:-#2#3}%
+ \ifx #1\tmpb \else
+ \expandafter \ifx \csname\tmpa\endcsname \relax
+ \fontmessage{\ofsmessageheader "\string#1" is
+ defined already, \noexpand\characterdef ignored.}%
+ \fi\fi
+ \futurelet \tmpb \docharacterdef
+}
+\def\characterdel #1#2#3 {\relax \savetokenname #1\tmpa
+ \ifx\tmpc\tmpa \else
+ \expandafter \let \csname\tmpa:-#2#3\endcsname =\relax \fi
+ \let\tmpc=\relax
+ \def \tmpa {tmpa}%
+ \futurelet \tmpb \docharacterdef
+}
+\def\characternodef #1#2#3 {\relax \savetokenname #1\tmpa
+ \edef \tmpb{\noexpand\printcharacter {\tmpa}}%
+ \expandafter \ifx \csname\tmpa\endcsname \relax \let#1=\tmpb \fi
+ \edef \tmpa {tmpa}%
+ \futurelet \tmpb \docharacterdef
+}
+\def\docharacterdef {%
+ \ifx\tmpb\bgroup
+ \afterassignment \ignorespaces
+ \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
+ \printcharacterwarn{#1}%
+ \else \csname #1:-*\endcsname
+ \fi
+ \else
+ \expandafter \ifx \csname
+ #1:-\csname eXenc!.\fontname\the\font\endcsname
+ \endcsname \relax
+ \expandafter\ifx\csname #1:-*\endcsname \relax
+ \printcharacterwarn{#1}%
+ \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\printcharacterwarn #1{%
+ \csname fragilecommand!\expandafter\endcsname
+ % \printcharacter may be first token in \halign data
+ \expandafter\def\expandafter\tmpa\expandafter{\currentfamily}%
+ \displaymessage{\ofsmessageheader WARNING.
+ Command \expandafter\noexpand\csname#1\endcsname
+ is unavailable in \tmpa.}%
+}
+
+\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}}%
+ \if *#2\edef \tmpa {\tmpa:#2--#3#4}%
+ \else \edef \tmpa {\tmpa:#2:-#3#4}%
+ \fi
+ \futurelet \tmpb \docharacterdef
+}
+\def\accentdel #1#2#3#4 {\relax \savetokenname #1\tmpa
+ \if *#2\expandafter \let \csname\tmpa:#2--#3#4\endcsname =\relax
+ \else \expandafter \let \csname\tmpa:#2:-#3#4\endcsname =\relax
+ \fi
+ \def \tmpa {tmpa}%
+ \futurelet \tmpb \docharacterdef
+}
+\def\accentnodef #1#2#3#4 {\relax \savetokenname #1\tmpa
+ \edef #1##1{\noexpand\printaccent {\tmpa}{##1}}%
+ \edef \tmpa {tmpa}%
+ \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
+ \printaccentwarn{#1}{#2}%
+ \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
+ \printaccentwarn{#1}{#2}%
+ \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\tmpb\endcsname
+ \endcsname \tmpb {}%
+ \else \expandafter \setextrafont \csname
+ #1:*--\csname eXenc!.\fontname\tmpb\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\printaccentwarn #1#2{%
+ \csname fragilecommand!\expandafter\endcsname
+ % \printaccent may be first token in \halign data
+ \expandafter\def\expandafter\tmpa\expandafter{\currentfamily}%
+ \displaymessage{\ofsmessageheader WARNING.
+ Accent \expandafter\string\csname#1\endcsname{#2}
+ is unavailable in \tmpa.}%
+}
+\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
+}
+
+%%%% \modifyenc, \modifydef, \tryloadenc, \registerenc %%%%%%%%%%%%%%
+ %% news in version Feb. 2004
+\newcount\loadingenc \loadingenc=0
+
+\def\modifyenc #1:#2;{\def\tmpa{#1}% encoding
+ \ifx\tmpa\fotenc \ofsaddenctolist #1:#2;\fi
+ \ifx\tmpa\extraenc \ofsaddenctolist #1:#2;\fi
+}
+\def\ofsaddenctolist #1;{\expandafter\expandafter\expandafter\def
+ \expandafter\expandafter\expandafter \newmodifylist
+ \expandafter\expandafter\expandafter {\expandafter \newmodifylist
+ \csname #1\expandafter\endcsname}}
+\def\modifylist{} \def\newmodifylist{}
+
+\def\modifydef #1;#2{%
+ \expandafter \def \csname#1\endcsname {#2}%
+ \let\characterdef=\characternodef \let\accentdef=\accentnodef
+ \let\characterdel=\characternodef \let\accentdel=\accentnodef
+ \def\skipfirststep##1\relax\empty\empty{}%
+ #2\relax\empty\empty
+ \let\characterdef=\characterdefori \let\accentdef=\accentdefori
+ \let\characterdel=\characterdelori \let\accentdel=\accentdelori
+ \let\skipfirststep=\relax
+ \ignorespaces
+}
+\def\modifyread #1;{%
+ \ifnum\loadingenc>0
+ \expandafter \ifx \csname m:>#1\endcsname \relax
+ \fontmessage{\ofsmessageheader \string\modifyread:
+ file read from \string\modifytext}%
+ {\plaincatcodes \catcode`@=11 \endlinechar=-1 \globaldefs=1
+ \def\tmpa ##1\modifytext{}%
+ \expandafter \tmpa \input #1
+ \expandafter \gdef \csname m:>#1\endcsname {}}%
+ \fi\fi
+}
+\def\tryloadenc #1{\edef\extraenc{#1}%
+ \ifnum\loadingenc>0
+ \ofsinput ofs-\fotenc.tex
+ \ifx\extraenc\empty \else \ofsinput ofs-\extraenc.tex \fi
+ \fi
+}
+\def\runmodifylist {%
+ \ifx \modifylist\relax \else
+ \ifx \modifylist\newmodifylist \else
+ \let\tmpc=\relax
+ \switchdeftodel \modifylist
+ \switchdeftodel \newmodifylist
+ \let \modifylist=\newmodifylist
+ \fi
+ \fi
+}
+\def\switchdeftodel{%
+ \let\tmpa=\characterdef \let\characterdef=\characterdel \let\characterdel=\tmpa
+ \let\tmpa=\accentdef \let\accentdef=\accentdel \let\accentdel=\tmpa
+}
+\let\characterdefori=\characterdef
+\let\characterdelori=\characterdel
+\let\accentdefori=\accentdef
+\let\accentdelori=\accentdel
+\let\skipfirststep=\relax
+
+\def\registerenc #1:#2#3 {%
+ \edef\tmpa{#1}\ifx\tmpa\empty \edef\tmpa{\declaredfamily}\fi
+ \if*#2\expandafter \let \csname ffe?\tmpa:\endcsname =\relax
+ \else \expandafter \edef \csname ffe?\tmpa:\endcsname {%
+ \expandafter\ifx \csname ffe?\tmpa:\endcsname\relax
+ \else \csname ffe?\tmpa:\endcsname, \fi#2#3}%
+ \fi
+}
+\def\warnunregistered #1{\displaymessage{\ofsmessageheader WARNING.
+ Unregistered enc \fotenc\space for #1. No font is set.^^J
+ \space Use \noexpand\registerenc #1: \fotenc\space\space
+ if you have got appropriate tfm's.}}
+
+%%%% \plaincatcodes, \safelet, \protectreading %%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\def\plaincatcodes {\catcode`\\0\catcode`\{1\catcode`\}2%
+ \catcode`\$3\catcode`\&4\catcode`\^^M5\catcode`\#6%
+ \catcode`\^7\catcode`\_8\catcode`\ 10\catcode`\~13%
+ \catcode`\^^I10\catcode`\%14\catcode`!12\catcode`"12%
+ \catcodesloop '.{12}\catcodesloop 0@{12}\catcodesloop AZ{11}%
+ \catcode`[12\catcode`]12\catcode``12\catcodesloop az{11}%
+ \catcode`|12\relax
+}
+\def\catcodesloop #1#2#3{\countdef\tmpa2 \chardef\tmpb\tmpa
+ \tmpa=`#1\relax
+ \loop
+ \catcode\tmpa=#3\relax
+ \ifnum\tmpa <`#2 \advance\tmpa by1
+ \repeat
+ \tmpa=\tmpb % original value of \count2
+}
+\def\safelet #1{\ifx#1\undefined
+ \expandafter \let \expandafter #1%
+ \else \ifx#1\relax
+ \expandafter\expandafter\expandafter \let
+ \expandafter\expandafter\expandafter #1%
+ \else
+ \def\tmpa{\let\tmpa}\safeletwarn#1%
+ \expandafter\expandafter\expandafter \tmpa
+ \fi\fi
+}
+\def\safeletwarn #1{\displaymessage{\ofsmessageheader WARNING.
+ \noexpand#1 is defined already, \noexpand \safelet does nothing.}}
+
+\def\protectreading #1 {\expandafter
+ \ifx \csname f:>#1\endcsname \relax
+ \expandafter \def \csname f:>#1\endcsname {}%
+ \else \expandafter \endinput
+ \fi
+}
+\def\ofsinput #1 {\expandafter
+ \ifx \csname f:>#1\endcsname \relax
+ {\plaincatcodes \catcode`@=11 \endlinechar=-1 \globaldefs=1 \input #1
+ \let\tmpa \relax
+ \expandafter \gdef \csname f:>#1\endcsname {}}\fi
+}
+
+%%%% 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.
+ \relax
+ \ifnum #1<16
+ \if |#2|\edef\tmpa{#3}\edef\tmpb{#3}%
+ \else
+ \edef\tmpb{#2}%
+ \edef \tmpa {\expandafter \readfirsttoken \tmpb:\end}%
+ \if -\tmpa
+ \expandafter \ifx \csname fm:\tmpb\endcsname \relax
+ \expandafter \ifx \csname fv:\tmpb\endcsname \empty % -bi => -bf
+ \displaymessage{\ofsmessageheader WARNING. loadmathfam:
+ no "\tmpb" in "\currentfamily", I try "-bf".}%
+ \def\tmpb{-bf}%
+ \fi\fi
+ \expandafter \ifx \csname fm:\tmpb\endcsname \relax
+ \ofsmissingmathfont {no "\tmpb" in "\currentfamily"}%
+ \else
+ \edef\tmpa {\csname fm:\tmpb\endcsname}%
+ \fi
+ \else
+ \if X\tmpa
+ \edef\tmpa {\expandafter\readothertokens\tmpb:\end}%
+ \if s\expandafter\expandafter\expandafter \readfirsttoken
+ \expandafter \meaning \csname \tmpa \endcsname:\end
+ \expandafter \ifx \csname eXfont!.\fontname
+ \csname\tmpa\endcsname \endcsname \relax
+ \ofsmissingmathfont {"\tmpa" has no extra metric}%
+ \else \edef \tmpa {\csname eXfont!.\fontname
+ \csname\tmpa\endcsname \endcsname \space}%
+ \edef\tmpa{\expandafter\singlefontname\tmpa:}% gobble at<dimen>
+ \fi
+ \else
+ \ofsmissingmathfont {"\tmpa" is no font selector}%
+ \fi
+ \else
+ \if s\expandafter\expandafter\expandafter \readfirsttoken
+ \expandafter \meaning \csname #2\endcsname:\end
+ \edef\tmpa{\expandafter\fontname\csname#2\endcsname\space}%
+ \edef\tmpa{\expandafter\singlefontname\tmpa:}% gobble at<dimen>
+ \else
+ \ofsmissingmathfont {"\tmpb" is no font selector}%
+ \fi\fi\fi\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\if#1\relax=\the#1\fi)}%
+ \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\if#1\relax=\the#1\fi)}%
+ \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\if#1\relax=\the#1\fi)}%
+ \fi
+ \textfont #1=\csname\tmpb-Mt\endcsname
+ \scriptfont #1=\csname\tmpb-Ms\endcsname
+ \scriptscriptfont #1=\csname\tmpb-Mss\endcsname
+ \else
+ \displaymessage{\ofsmessageheader WARNING.
+ \noexpand\loadmathfam \string#1[#2/#3] ignored (\string#1 >= 16).}%
+ \fi
+ \def\noindexsize {\let\noindexsize \relax}%
+}
+\def\ofsmissingmathfont #1{%
+ \displaymessage{\ofsmessageheader WARNING.
+ loadmathfam: #1, \csname fm:-rm\endcsname\space used.}%
+ \edef\tmpa{\csname fm:-rm\endcsname}%
+ \def\tmpb{-rm}%
+}
+\expandafter\def \csname fm:-rm\endcsname {cmr10}
+\expandafter\def \csname fv:-bi\endcsname {}
+
+\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\else0\fi}%
+\def\newmathfam #1{\advance\lastfam by1 \chardef #1=\lastfam\relax}
+\countdef\lastfam=18
+
+\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
+ \ifx \currentfomenc\fomenc \else
+ \mathcharsback \let\mathcharsback=\relax
+ \mathchars \let\currentfomenc=\fomenc
+ \fi
+ \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{\def\tmpa{\edef#1{\mathaccent\the\tmpb\space}}%
+ \afterassignment \tmpa \mathchardef\tmpb
+}
+
+
+\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}}}}%
+}
+\def\ofshexbox#1#2#3{%
+ \ifx\expandaction\noexpand
+ \noexpand \ofshexbox{#1}#2#3%
+ \else
+ \csname fragilecommand!\endcsname
+ {\ifx F\currentvariant \def\tmpa{#1:-bf!}%
+ \else \ifx T\currentvariant \def\tmpa{#1:-it!}%
+ \else \ifx I\currentvariant \def\tmpa{#1:-bi!}%
+ \else \def\tmpa{#1:-rm!}\fi\fi\fi
+ \expandafter \ifx \csname\tmpa\endcsname \relax
+ \displaymessage{\ofsmessageheader WARNING.
+ \string\ofsboxhex#1#2#3: fam#1 is undeclared,
+ use \string\ofshexboxdef}%
+ \else
+ \expandafter \calculatemetricfile \csname\tmpa\endcsname \fosize
+ \font\fn=\metricfile\fosize \relax
+ \fontloadmessage{fn}{\metricfile\fosize \space\space(ofshexbox)}%
+ \fn
+ \fi \char"#2#3}%
+ \fi}
+
+\def\ofshexboxdef #1#2#3#4#5{%
+ \expandafter\def\csname #1:-rm!\endcsname {#2}%
+ \expandafter\def\csname #1:-bf!\endcsname {#3}%
+ \expandafter\def\csname #1:-it!\endcsname {#4}%
+ \expandafter\def\csname #1:-bi!\endcsname {#5}%
+}
+\def\mathencread#1;{\ofsinput #1.tex \global \expandafter
+ \let \csname f:>#1.tex\endcsname=\relax}
+\def\mathencdef#1{\aftergroup\runplusforget \aftergroup#1\gdef#1}
+\def\runplusforget#1{#1\global\let#1=\relax}
+
+\catcode`\|=\tmpc\relax % original catcode of |
+
+%%% 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