From d66c6c7f5bf3b189c2b194ba167fb39f548742e5 Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 20 Dec 2002 00:00:00 +0100 Subject: stable 2002.12.20 --- tex/context/base/font-ini.tex | 614 +++++++++++++++++++++++++----------------- 1 file changed, 374 insertions(+), 240 deletions(-) (limited to 'tex/context/base/font-ini.tex') diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex index 4af5532ee..3e7534bdc 100644 --- a/tex/context/base/font-ini.tex +++ b/tex/context/base/font-ini.tex @@ -18,7 +18,7 @@ % adapted, else wrong interlinespace -\def\setfontparameters% +\def\setfontparameters {\synchronizefontsfalse \the\everybodyfont \synchronizefontstrue} @@ -57,15 +57,21 @@ % new -\newevery \everydefinedfont \relax +\newevery \everydefinedfont \relax \def\dodefinedfont[#1]% {\iffirstargument\definefont[\string\definedfont][#1]\fi \csname\string\definedfont\endcsname \the\everydefinedfont} -\unexpanded\def\definedfont% +\unexpanded\def\definedfont {\dosingleempty\dodefinedfont} + +\unexpanded\def\startfont + {\bgroup\definedfont} + +\def\stopfont + {\egroup} %%% message 14 added @@ -489,7 +495,7 @@ %D \type{\bf}, \type{\sl} etc. but by default it equals %D \type{\tf}: -\unexpanded\def\mf% +\unexpanded\def\mf {\dodosetmathfont\fontalternative \csname\fontalternative\endcsname} @@ -539,7 +545,7 @@ \let\normalmathop=\mathop -\def\mathop% +\def\mathop {\normalmathop \bgroup \let\rm\mf @@ -589,19 +595,19 @@ %D although for instance unboxing goes ok. Therefore we %D introduce: -\def\normalmbox% +\def\normalmbox {\normalhbox\bgroup\mf \dowithnextbox{\box\nextbox\egroup}\normalhbox} % to test: % -% \def\normalmbox% -% {\dowithnextboxcontent{\mf}{\box\nextbox}\normalhbox} +% \def\normalmbox +% {\dowithnextboxcontent\mf\flushnextbox\normalhbox} -\def\mbox% +\def\mbox {\ifmmode\normalmbox\else\normalhbox\fi} -\def\enablembox% +\def\enablembox {\appendtoks \ifx\normalhbox\undefined\let\normalhbox\hbox\fi \let\hbox\mbox @@ -767,7 +773,7 @@ \dosettextfamily\c!sc \to \textstrategies -\def\dosettextfamily#1% +\def\dosettextfamily#1% better pass fontbody to dodoset {\let\savedfontbody\fontbody \let\fontfamily#1% \let\fontbody\scriptscriptface\dodosettextfamily\scriptscriptfont @@ -1059,13 +1065,13 @@ \def\magstep#1% \relax removed, otherwise space after it sticks, else added {\ifcase#1 \@m\or1200\or1440\or1728\or2074\or2488\or\@m\fi} -\def\magstephalf% +\def\magstephalf {1095} \def\magfactor#1% {\ifcase#1 1.000\or1.200\or1.440\or1.728\or2.074\or2.488\or1\fi} -\def\magfactorhalf% +\def\magfactorhalf {1.095} %D These macros enable the use of definitions like \type{sa @@ -1080,50 +1086,53 @@ %D We could instead have used dirty grouping tricks, but this %D one works too. -\def\norelativefontsize{1} -\def\dorelativefontsize{1} -\def\relativefontsize {1} +\def\defaultrelativefontsize{1} +\def\localrelativefontsize {1} +\def\localabsolutefontsize {\fontbody} -\def\s!rscale{rscale} +\let\relativefontsize \defaultrelativefontsize -\def\dostorerelativefontsize#1% - {\ifx\fontclass\empty\else\global\fi - \letvalue{#1\s!rscale}\relativefontsize} +\def\saverelativefontsize#1#2% #1=rm|ss|.. #2=waarde + {\setxvalue{\fontclass#1\s!rscale}{#2}} -\beginTEX +\beginTEX -\def\dosetrelativefontsize#1% - {\expandafter\ifx\csname#1\s!rscale\endcsname\relax - \let\dorelativefontsize\norelativefontsize - \else - %\edef\dorelativefontsize{\csname#1\s!rscale\endcsname}% - \@EA\let\@EA\dorelativefontsize\csname#1\s!rscale\endcsname - \fi} +\def\checkrelativefontsize#1% + {\edef\relativefontsize + {\@EA\ifx\csname\fontclass#1\s!rscale\endcsname\relax + \defaultrelativefontsize + \else + \csname\fontclass#1\s!rscale\endcsname + \fi}} \endTEX \beginETEX \ifcsname -\def\dosetrelativefontsize#1% - {\ifcsname#1\s!rscale\endcsname - %\edef\dorelativefontsize{\csname#1\s!rscale\endcsname}% - \@EA\let\@EA\dorelativefontsize\csname#1\s!rscale\endcsname - \else - \let\dorelativefontsize\norelativefontsize - \fi} +\def\checkrelativefontsize#1% + {\edef\relativefontsize + {\ifcsname\fontclass#1\s!rscale\endcsname + \csname\fontclass#1\s!rscale\endcsname + \else + \defaultrelativefontsize + \fi}} \endETEX -\def\doresetrelativefontsize% - {\let\dorelativefontsize\norelativefontsize} - \newdimen\scaledfont \def\@fs@{@fs@} +% \def\parsefontspec#1% +% {\edef\somefontspec{#1\space\relax}% +% \@EA\doparsefontspec\somefontspec]% =>#1 \relax] +% \donoparsefontspec} +% +% but, better: + \def\parsefontspec#1% - {\edef\somefontspec{#1\space\relax}% - \@EA\doparsefontspec\somefontspec]% + {\edef\somefontspec{#1\space}% + \@EA\doparsefontspec\somefontspec\relax]% =>#1 \relax] \donoparsefontspec} \def\doparsefontspec#1 #2% @@ -1138,44 +1147,49 @@ #2} \def\setnaturalfontspec#1]% - {\@fs@scaled\!!thousand} + {\@fs@scaled\!!thousand\relax} \def\setforcedfontspec#1 #2\relax]% - {\csname\@fs@#1\endcsname{#2}} + {\csname\@fs@#1\endcsname#2\relax} + +\def\@fs@scaled + {\afterassignment\do@fs@scaled\scratchcounter} -\def\@fs@scaled#1% - {\scaledfont#1pt% - \scaledfont\dorelativefontsize\scaledfont +\def\do@fs@scaled#1\relax + {\scaledfont\number\scratchcounter\s!pt + \scaledfont\localrelativefontsize\scaledfont \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi \scratchcounter\scaledfont % \scaledfont is now pretty large \advance\scratchcounter \medcard \divide\scratchcounter \maxcard \edef\somefontspec{ scaled \the\scratchcounter}} -\def\@fs@at#1% - {\scaledfont#1% - \scaledfont\dorelativefontsize\scaledfont +\def\@fs@at + {\afterassignment\do@fs@at\scaledfont} + +\def\do@fs@at#1\relax + {\scaledfont\localrelativefontsize\scaledfont \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi - \def\somefontspec{ at \scaledfont}} + \edef\somefontspec{ at \the\scaledfont}} -\def\@fs@sa% - {\scaledfont\fontbody +\def\@fs@sa + {\scaledfont\localabsolutefontsize \setsamofontspec} -\def\@fs@mo% - {\scaledfont\setmappedfontsize\fontbody +\def\@fs@mo + {\scaledfont\setmappedfontsize\localabsolutefontsize \setsamofontspec} -\def\setsamofontspec#1% +\def\setsamofontspec#1\relax {\checkfontscale#1\end\scaledfont - \scaledfont\dorelativefontsize\scaledfont - \edef\somefontspec - { at \ifautofontsize\currentfontbodyscale\fi\scaledfont}} + \scaledfont\localrelativefontsize\scaledfont + \ifautofontsize\scaledfont\currentfontbodyscale\scaledfont\fi + \edef\somefontspec{ at \the\scaledfont}} -\def\getfontparameters% +\def\getfontparameters {\expandafter\setfontparameter\@@fontdata,]=,} -\def\getglobalfontparameters% +\def\getglobalfontparameters {\expandafter\setglobalfontparameter\@@fontdata,]=,} \def\setfontparameter#1=#2,% @@ -1201,14 +1215,52 @@ \newif\ifskipfontcharacteristics \skipfontcharacteristicstrue -\def\donoparsefontspec#1% +%D When fontclasses are used, we define the font global, +%D since namespaces are used. Otherwise we parse the specs +%D each time. + +% wrong: this way we cannot set encoding etc +% +% \def\donoparsefontspec#1% +% {\edef\fontfile{\truefontname\somefontname}% +% \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi +% \edef\lastfontname{\fontfile\somefontspec}% +% \ifx\fontclass\empty\else\global\fi +% \expandafter\font\csname#1\endcsname\lastfontname\relax +% \relax} + +\def\donoparsefontspec % #1 == \cs {\edef\fontfile{\truefontname\somefontname}% \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi \edef\lastfontname{\fontfile\somefontspec}% - \ifx\fontclass\empty\else\global\fi - \expandafter\font\csname#1\endcsname\lastfontname\relax - %\the\everyfont - \relax} + \ifx\fontclass\empty + \expandafter\definefontlocal + \else + \expandafter\definefontglobal + \fi} % #1 == \cs + +\def\definefontlocal#1% + {\expandafter\font\csname#1\endcsname\lastfontname\relax} + +\def\definefontglobal#1% stores \somefontname=Mono and \fontfile=cmtt10 + {\expandafter\xdef\csname#1\endcsname + {\noexpand\csname#1:\endcsname + \noexpand\reactivatefont{\somefontname}{\fontfile}}% + \global\expandafter\font\csname#1:\endcsname\lastfontname} + +\def\reactivatefont#1%#2% + {\def\somefontname{#1}\def\fontfile}%{#2}} + +% can be handy for tracing purposes +% +% \def\reportfontdefinition +% {\bgroup +% \expanded{\infofont +% [\lastfontidentifier +% ->\newfontidentifier +% ->\fontname\csname\newfontidentifier\endcsname]}% +% \endgraf +% \egroup} %D An additional the second \type {\font} definition can %D prevent fuzzy font refs @@ -1291,7 +1343,7 @@ %D data: \type {\truefontdata{\truefontname{Lucida-Bright}}} %D \stopregels -\def\definefontsynonym% +\def\definefontsynonym {\dotripleempty\dodefinefontsynonym} \def\dodefinefontsynonym[#1][#2][#3]% @@ -1308,9 +1360,9 @@ \fi \fi} -\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater +\let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater -\def\setupfontsynonym% +\def\setupfontsynonym {\dodoubleempty\dosetupfontsynonym} \def\dosetupfontsynonym[#1][#2]% @@ -1326,11 +1378,11 @@ \beginTEX -\def\truefontdata#1#2% +\def\truefontdata#1#2% {\expandafter\ifx\csname\??ff#1#2\endcsname\relax \expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax \expandafter\ifx\csname\??ff#1\endcsname\relax - \expandafter\ifx\csname\??ff#2\endcsname\relax + \expandafter\ifx\csname\??ff#2\endcsname\relax \else % raw(key) \csname\??ff#2\endcsname @@ -1340,11 +1392,11 @@ \expandafter\truefontdata\csname\??ff#1\endcsname#2% \fi \else - % exp(palatino Regular) raw(key) + % exp(palatino Regular) raw(key) \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2% \fi \else - % raw(Regular) raw(key) + % raw(Regular) raw(key) \csname\??ff#1#2\endcsname \fi} @@ -1365,10 +1417,10 @@ \def\truefontdata#1#2% {\ifcsname\??ff#1#2\endcsname - % raw(Regular) raw(key) + % raw(Regular) raw(key) \csname\??ff#1#2\endcsname \else\ifcsname\??ff\fontclass#1\endcsname - % exp(palatino Regular) raw(key) + % exp(palatino Regular) raw(key) \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2% \else\ifcsname\??ff#1\endcsname % exp(Regular) raw(key) @@ -1479,13 +1531,55 @@ %D %D The implementation one looks familiar: -\def\definefont% - {\dodoubleargument\dodefinefont} - -\def\dodefinefont[#1][#2]% +% The simple implementation is: +% +% \def\definefont +% {\dodoubleargument\dodefinefont} +% +% \def\dodefinefont[#1][#2]% +% {\doifinstringelse{ }{#2} +% {\unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}} +% {\dodefinefont[#1][#2 sa 1]}} + +\def\definefont + {\dotripleempty\dodefinefont} + +\def\dodefinefont[#1][#2][#3]% [name][spec][1.6 | line=10pt | setup_id] {\doifinstringelse{ }{#2} - {\unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}} - {\dodefinefont[#1][#2 sa 1]}} + {\ifthirdargument + \unexpanded\setvalue{#1}{\redodefinefont{#1}{#2}{#3}}% + \else + \unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}% + \fi} +% {\definefont[#1][#2 sa 1][#3]}} + {\definefont[#1][#2 sa *][#3]}} + +%\def\redodefinefont#1#2#3% +% {\dododefinefont{#1}{#2}% +% \doifnumberelse{#3} +% {\stelinterliniein[#3]\stelspatieringin} +% {\doifassignmentelse{#3} +% {\stelinterliniein[#3]\stelspatieringin} +% {\setups[#3]}}} % so, we can have setups associated to fonts ! + +\def\redodefinefont#1#2#3% + {\dododefinefont{#1}{#2}% + \doifsetupselse{#3} + {\setups[#3]} % don't forget to document this ! + {\setuplocalinterlinespace[#3]% + \stelspatieringin}} % needed ? + +% \def\defineclassfont +% {\doquadrupleempty\dodefineclassfont} +% +% \def\dodefineclassfont[#1][#2][#3][#4]% #2 = class +% {\iffourthargument +% \definefont[#1][#2#3][#4]% +% %\else\ifthirdargument +% % \definefont[#1][#2#3]% +% \else +% \definefont[#1][#2]% +% \fi} %D The \type {*} makes the switch local, so that we can redefine a %D logical name and/or change the size in between. @@ -1499,9 +1593,10 @@ \def\dododefinefont#1#2% {\edef\lastfontidentifier{#1}% - \dosetrelativefontsize\lastfontidentifier + \let\localrelativefontsize\defaultrelativefontsize + \let\localabsolutefontsize\fontbody \parsefontspec{#2}\rawfontidentifier - \doresetrelativefontsize + \let\localrelativefontsize\defaultrelativefontsize % not needed \csname\rawfontidentifier\endcsname \autofontsizefalse \setfontcharacteristics @@ -1509,34 +1604,37 @@ \beginTEX -\def\xxdododefinefont#1#2% \autofontsizetrue is set by calling routine - {\edef\lastfontidentifier{#1}% +\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine + {\edef\lastfontidentifier{#3}% \@EA\ifx\csname\newfontidentifier\endcsname\relax - \dosetrelativefontsize{\fontclass\lastfontidentifier}% dangerous with fallback - \parsefontspec{#2}\newfontidentifier - \doresetrelativefontsize + \def\localrelativefontsize{#1}% + \def\localabsolutefontsize{#2}% + \parsefontspec{#4}\newfontidentifier + \let\localrelativefontsize\defaultrelativefontsize % not needed \fi \csname\newfontidentifier\endcsname \autofontsizefalse - %\edef\lastfontidentifier{#1}% + %\edef\lastfontidentifier{#3}% \ifskipfontcharacteristics \else \setfontcharacteristics \the\everyfontswitch \fi} + \endTEX \beginETEX \ifcsname -\def\xxdododefinefont#1#2% \autofontsizetrue is set by calling routine - {\edef\lastfontidentifier{#1}% +\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine + {\edef\lastfontidentifier{#3}% \ifcsname\newfontidentifier\endcsname\else - \dosetrelativefontsize{\fontclass\lastfontidentifier}% dangerous with fallback - \parsefontspec{#2}\newfontidentifier - \doresetrelativefontsize + \def\localrelativefontsize{#1}% + \def\localabsolutefontsize{#2}% + \parsefontspec{#4}\newfontidentifier + \let\localrelativefontsize\defaultrelativefontsize % not needed \fi \csname\newfontidentifier\endcsname \autofontsizefalse - %\edef\lastfontidentifier{#1}% + %\edef\lastfontidentifier{#3}% \ifskipfontcharacteristics \else \setfontcharacteristics \the\everyfontswitch @@ -1577,7 +1675,7 @@ %D \haalbuffer %D \stopopelkaar -\def\mapfontsize% +\def\mapfontsize {\dodoubleargument\domapfontsize} \def\domapfontsize[#1][#2]% @@ -1620,7 +1718,7 @@ \let\sizelist\empty -\def\definefontsize[#1]% +\def\definefontsize[#1]% sneller met toks {\addtocommalist{#1}\sizelist \def\docommando##1% {\def\dodocommando####1% @@ -1764,17 +1862,17 @@ \newcount\@@fontdefhack -\def\@@beginfontdef% +\def\@@beginfontdef {\ifcase\@@fontdefhack \let\k!savedtext \k!text \let\k!text \s!text - \let\k!k!savedtext \k!k!text \def\k!k!text {1}% + \let\k!k!savedtext \k!k!text \let\k!k!text \!!plusone \let\k!saveddefault \k!default \let\k!default \s!default - \let\k!k!saveddefault\k!k!default \def\k!k!default {1}% + \let\k!k!saveddefault\k!k!default \let\k!k!default \!!plusone \fi - \advance\@@fontdefhack 1 } + \advance\@@fontdefhack \plusone } -\def\@@endfontdef% - {\advance\@@fontdefhack -1 +\def\@@endfontdef + {\advance\@@fontdefhack \minusone \ifcase\@@fontdefhack \let\k!k!default\k!k!saveddefault \let\k!default \k!saveddefault @@ -1782,13 +1880,13 @@ \let\k!text \k!savedtext \fi} -\def\definebodyfontenvironment% +\def\definebodyfontenvironment {\dotripleempty\dodefinebodyfontenvironment} \def\dodefinebodyfontenvironment[#1][#2][#3]% class size settings {\ifthirdargument \@@beginfontdef - \doifelse{#2}{\s!default} + \doifelse{#2}\s!default {\getparameters[\??ft\s!default][#3]} {\normalizebodyfontsize#2\to\tempbodyfontsize \addtocommalist\tempbodyfontsize\bodyfontenvironmentlist @@ -1802,8 +1900,8 @@ {\@@beginfontdef \doifundefined{\??ft#2#1\c!em} % \s!text goes wrong in testing because {\def\docommando##1% % the 12pt alternative will called when - {\scratchdimen=#1\relax % typesetting the test (or so) - \scratchdimen=\csname\??ft\s!default##1\endcsname\scratchdimen + {\scratchdimen#1\relax % typesetting the test (or so) + \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen \normalizebodyfontsize\scratchdimen\to\tempbodyfontsize \setevalue{\??ft#2#1##1}{\tempbodyfontsize}}% \processcommalist @@ -1962,7 +2060,7 @@ %D user definitions like \type{\tfw} or \type{\bfq} for real %D large alternatives. -\def\definebodyfont% +\def\definebodyfont {\doquadrupleempty\redefinebodyfont} \def\redefinebodyfont[#1][#2][#3][#4]% @@ -1974,7 +2072,7 @@ \def\reredefinebodyfont[#1][#2][#3]#4% {\pushmacro\fontclass - \doifelse{#4}{\s!default} + \doifelse{#4}\s!default {\let\fontclass\empty} {\def\fontclass{#4}}% \definebodyfont[#1][#2][#3]% @@ -2000,26 +2098,12 @@ {\definebodyfont[#1][\c!rm][]}% make sure some basics are set up. \fi\fi} -% nested -% -% \def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier -% {%\writestatus{[#1]}{[#2][#3]}% -% \doifnumberelse{#1} -% {\doifassignmentelse{#3} -% {% [12pt] [style] [settings] -% \doifundefined{#2}{\expanded{\definefontstyle[#2][#2]}}% new -% \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}} -% {% [12pt] [style] [identifier] -% \dodefinedefaultbodyfont[#1][#2][#3]}} % body style identifier -% {% [identifier] [style] [settings] -% \setvalue{\s!default#1#2}##1##2{\expanded{\xdodefinebodyfont[##1][##2][#3]}}}} -% -% faster - \def\xdodefinebodyfont[#1][#2][#3]% body|identifier style defs|identifier {%\writestatus{[#1]}{[#2][#3]}% + \checkrelativefontsize{#2}% rather new, inherit from other defs \ifundefined{#2}\expanded{\definefontstyle[#2][#2]}\fi % new - \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}} + \processcommalist[#1]{\dododefinebodyfont{#2}{#3}}% + \let\relativefontsize\defaultrelativefontsize} \def\dododefinebodyfont#1#2#3% style defs body {\checkbodyfontenvironment[#3]% just to be sure. @@ -2034,29 +2118,28 @@ \def\iflocalclassfonts{\ifx\fontclass\empty} -% \let\iflocalclassfonts\iffalse - \def\dododododefinebodyfont#1#2[#3#4#5=#6]% style body def {\ifundefined{#1#3#4#5}% \checkbodyfont{#2}{#1}{#3#4}{#5}% not \definefontsize[#5] \fi - \dostorerelativefontsize{\fontclass#2#1#3#4#5}% \iflocalclassfonts \letbeundefined{*\fontclass#2#1#3#4#5*}% - \unexpanded - \setvalue{#2#1#3#4#5}{\xxdododefinefont - {#2#1#3#4#5}{#6}}% + \scratchtoks{#6}% + \expanded{\unexpanded\noexpand\setvalue{#2#1#3#4#5}% + {\noexpand\xxdododefinefont{\relativefontsize}{#2}% + {#2#1#3#4#5}{\the\scratchtoks}}}% \else %\expanded{\writestatus{defining}{[\fontclass][#2#1#3#4#5] \resolvefontname#6 }}% \global\letbeundefined{*\fontclass#2#1#3#4#5*}% \ifresolvefontfile - \unexpanded - \setxvalue{\fontclass#2#1#3#4#5}{\noexpand\xxdododefinefont - {#2#1#3#4#5}{\resolvefontname#6 }}% + \unexpanded\setxvalue{\fontclass#2#1#3#4#5}% + {\noexpand\xxdododefinefont{\relativefontsize}{#2}% + {#2#1#3#4#5}{\resolvefontname#6 }}% \else - \unexpanded - \setgvalue{\fontclass#2#1#3#4#5}{\xxdododefinefont - {#2#1#3#4#5}{#6}}% + \scratchtoks{#6}% + \expanded{\unexpanded\noexpand\setgvalue{\fontclass#2#1#3#4#5}% + {\noexpand\xxdododefinefont{\relativefontsize}{#2}% + {#2#1#3#4#5}{\the\scratchtoks}}}% \fi \fi} @@ -2103,8 +2186,8 @@ \def\docommando##1% {\doifdefined{\??ft\s!default##1} {\donetrue - \scratchdimen=#1\relax - \scratchdimen=\csname\??ft\s!default##1\endcsname\scratchdimen + \scratchdimen#1\relax + \scratchdimen\csname\??ft\s!default##1\endcsname\scratchdimen \normalizebodyfontsize\scratchdimen\to\!!stringa \letvalue{\??ft#1##1}\!!stringa}}% \processcommalist @@ -2135,7 +2218,7 @@ \fi \fi \ifdone - \showmessage{\m!fonts}{14}{#1}% + \showmessage\m!fonts{14}{#1}% \fi \fi} @@ -2237,22 +2320,38 @@ \chardef\fontdigits=1 +% \def\donormalizedbodyfontsize#1.#2#3#4\to#5% +% {\edef#5% +% {#1% +% \ifcase\fontdigits\space +% \or +% \ifcase#2 \else.#2\fi % and not: \ifcase#2\else ... +% \else +% \ifcase#2#3 \else.#2\ifcase#3 \else#3\fi\fi % not: \ifcase#2#3\else ... +% \fi +% pt}} +% +% \def\normalizebodyfontsize#1\to#2% +% {\scratchdimen#1\relax +% \@EA\@EA\@EA\donormalizedbodyfontsize +% \@EA\WITHOUTPT\the\scratchdimen00\to#2} + +\def\normalizebodyfontsize#1\to#2% + {\scratchdimen#1\relax + \ifcase\fontdigits\advance\scratchdimen.5\s!pt\fi + \@EA\@EA\@EA\donormalizedbodyfontsize + \@EA\WITHOUTPT\the\scratchdimen00\to#2} + \def\donormalizedbodyfontsize#1.#2#3#4\to#5% {\edef#5% {#1% - \ifcase\fontdigits\space - \or + \ifcase\fontdigits\or \ifcase#2 \else.#2\fi % and not: \ifcase#2\else ... \else \ifcase#2#3 \else.#2\ifcase#3 \else#3\fi\fi % not: \ifcase#2#3\else ... \fi - pt}} - -\def\normalizebodyfontsize#1\to#2% - {\scratchdimen=#1\relax - \@EA\@EA\@EA\donormalizedbodyfontsize - \@EA\WITHOUTPT\the\scratchdimen00\to#2} - + \s!pt}} + \normalizebodyfontsize\bodyfontsize\to\normalizedglobalbodyfontsize \normalizebodyfontsize\bodyfontsize\to\normalizedlocalbodyfontsize \normalizebodyfontsize\bodyfontsize\to\normalizedbodyfontsize @@ -2277,9 +2376,13 @@ %D etc. is also available in a macro in \type{rm}, \type{ss} %D etc. form: -\let\fontalternative = \c!tf -\let\fontstyle = \empty -\let\fontsize = \empty +\let\defaultfontalternative = \c!tf +\let\defaultfontstyle = \empty +\let\defaultfontsize = \empty + +\let\fontalternative = \defaultfontalternative +\let\fontstyle = \defaultfontstyle +\let\fontsize = \defaultfontsize %D All things related to fonts are grouped into files with %D names like \type{font-cmr}. These files are loaded by: @@ -2296,11 +2399,11 @@ \fi \startreadingfile \readsysfile{\truefilename{\f!fontprefix#2}} - {\showmessage{\m!fonts}{2}{#2}} + {\showmessage\m!fonts2{#2}} {\makeshortfilename[\truefilename{\f!fontprefix#2}]% \readsysfile{\shortfilename} - {\showmessage{\m!fonts}{2}{#2}} - {\showmessage{\m!fonts}{3}{#2}}}% + {\showmessage\m!fonts2{#2}} + {\showmessage\m!fonts3{#2}}}% \stopreadingfile}} %D When \type {\loadfontfileoncetrue}, such files are @@ -2315,15 +2418,15 @@ {\expanded{\dodoswitchpoints{#1}}} \def\dodoswitchpoints#1% - {\doifundefined{\@size@#1} - {\defineunknownfont{#1}}% + {\doifundefined{\@size@#1} + {\defineunknownfont{#1}}% %\defineunknownfontstyles{#1}% \doifdefinedelse{\@size@#1} {\getvalue{\@size@#1}% \localbodyfontsize#1\relax \normalizebodyfontsize\localbodyfontsize\to\normalizedbodyfontsize \checkbodyfontenvironment[\normalizedbodyfontsize]} - {\showmessage{\m!fonts}{4}{#1}}} + {\showmessage\m!fonts4{#1}}} \unprotected \def\doswitchstyle[#1]% {\doifdefinedelse{\@style@#1} @@ -2331,7 +2434,7 @@ \edef\fontstyle{#1}% \ifmmode\mr\fi % in order to be compatible with \rm in math mode }% \the\everybodyfont} % cleaner, in setting size as well as style - {\showmessage{\m!fonts}{5}{#1}}} + {\showmessage\m!fonts5{#1}}} %D \TEX\ loads font metric files like \type{cmr10.tfm} and %D \type{tir.tfm} only once. In \PLAIN\ \TEX\ some font files @@ -2385,45 +2488,51 @@ %D macro relaxes itself and reset the signal. \def\preloadfonts% - {\showmessage{\m!fonts}{6}{\normalizedbodyfontsize\normalspace\fontstyle}% + {\showmessage\m!fonts6{\normalizedbodyfontsize\normalspace\fontstyle}% \global\loadingfontsfalse \doswitchpoints[\normalizedbodyfontsize]% \doswitchstyle[\fontstyle]% -\the\everybodyfont - \global\let\preloadfonts=\relax} + \the\everybodyfont + \global\let\preloadfonts\relax} %D Here comes the main font switching macros. These macros %D handle changes in size as well as returning to the global %D bodyfont size. \def\dosetfont#1#2% #1 = set/switch state - {\doifelse{#2}{\v!globaal} + {\doifelse{#2}\v!globaal {\restoreglobalbodyfont} {\processcommacommand[#2]{\dodosetfont{#1}}% ##1 get also passed \ifloadingfonts\else \doswitchpoints[\normalizedbodyfontsize]% \doswitchstyle[\fontstyle]% \fi}% - \chardef\currentxfontsize0\relax} + \chardef\currentxfontsize\zerocount} \def\dodosetfont#1#2% #1 = set/switch state - {\dododosetfont{#1}{#2}{\showmessage{\m!fonts}{4}{#2}}} + {\dododosetfont{#1}{#2}{\showmessage\m!fonts4{#2}}} \def\dododosetfont#1#2#3% #1 = set/switch state {\doifnumberelse{#2} - {\scratchdimen=#2\relax - \normalizebodyfontsize\scratchdimen\to\normalizedsetfont - \doifundefined{\@size@\normalizedsetfont} - {\defineunknownfont{#2}}% - \doifdefinedelse{\@size@\normalizedsetfont} - {\localbodyfontsize\normalizedsetfont - \let\normalizedbodyfontsize\normalizedsetfont} - {#3\dosetsubstitutefont{#1}{#2}}} - {\doifelse{#2}{\v!reset} - {\let\fontsize\empty} - {\doifdefinedelse{\@style@#2} - {\edef\fontstyle{#2}} - {\doreadfontdefinitionfile{#1}{#2}}}}} + {\dodododosetfont{#1}{#2}{#3}} + {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#2}} + {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced{#2}\endcsname}% + \expanded{\dodododosetfont{#1}{\fontstep}}{#3}} + {\doifelse{#2}\v!reset + {\let\fontsize\empty} + {\doifdefinedelse{\@style@#2} + {\edef\fontstyle{#2}} + {\doreadfontdefinitionfile{#1}{#2}}}}}} + +\def\dodododosetfont#1#2#3% #1 = set/switch state + {\scratchdimen#2\relax + \normalizebodyfontsize\scratchdimen\to\normalizedsetfont + \doifundefined{\@size@\normalizedsetfont} + {\defineunknownfont{#2}}% + \doifdefinedelse{\@size@\normalizedsetfont} + {\localbodyfontsize\normalizedsetfont + \let\normalizedbodyfontsize\normalizedsetfont} + {#3\dosetsubstitutefont{#1}{#2}}} %D In the previous macros we use \type{\currentxfontsize} to %D hold the current x||size of the font. This enables us to @@ -2440,10 +2549,10 @@ %D smaller than half a point, we can use the next method. \def\dosetsubstitutefont#1#2% #1 = set/switch state - {\scratchdimen=#2\relax - \advance\scratchdimen by .499pt + {\scratchdimen#2\relax + \advance\scratchdimen .499pt \dimensiontocount\scratchdimen\scratchcounter - \advance\scratchcounter by -1 + \advance\scratchcounter -1 \ifnum\scratchcounter>3 \dododosetfont{#1}{\the\scratchcounter pt}{}% \fi} @@ -2457,14 +2566,15 @@ % \let\fontalternative\empty % tf bf sl it bs bi sc ... % \let\fontsize \empty % xy-abcd ... -\def\fontbody{\normalizedbodyfontsize} +\def\defaultfontbody{\normalizedbodyfontsize} + +\let\fontbody\defaultfontbody \let\fontclass\empty \let\globalfontclass\fontclass \def\setcurrentfontclass#1% {\edef\fontclass{#1}} -\let\defaultfontbody \!!twelvepoint \let\defaultfontstyle \c!rm \let\defaultfontalternative \c!tf \let\defaultfontsize \empty @@ -2490,8 +2600,8 @@ \fi \to \everymath -\def\nobigmath{\chardef\synchronizebigmathflag =0 } -\def\bigmath {\chardef\synchronizebigmathflag =2 \synchronizebigmath} +\def\nobigmath{\chardef\synchronizebigmathflag 0 } +\def\bigmath {\chardef\synchronizebigmathflag 2 \synchronizebigmath} \let\bigmathfontsize\empty @@ -2677,7 +2787,7 @@ \beginTEX \def\dosetcurrentfontxxxalternative#1#2#3#4% - {\chardef\currentxfontsize#2 + {\chardef\currentxfontsize#2\relax \ifmmode #4% \else\expandafter\ifx\csname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname\relax\else @@ -2689,7 +2799,7 @@ \beginETEX \ifcsname \def\dosetcurrentfontxxxalternative#1#2#3#4% - {\chardef\currentxfontsize#2 + {\chardef\currentxfontsize#2\relax \ifmmode #4% \else\ifcsname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname @@ -2756,29 +2866,29 @@ \def\dodefinefontstyle[#1][#2]% {\rawdoifinsetelse{#2}{\stylelist} - {}%\debuggerinfo{\m!fonts}{unknown style #2}} + {}%\debuggerinfo\m!fonts{unknown style #2}} {\addtocommalist{#2}\stylelist - \showmessage{\m!fonts}{8}{#2 (#1)}}% + \showmessage\m!fonts8{#2 (#1)}}% % check kan hier \def\docommando##1% {\setvalue{\@shortstyle@##1}{#2}% \setvalue{\@style@##1}{\csname#2\endcsname}}% \processcommalist[#1]\docommando} -\def\definefontstyle% +\def\definefontstyle {\dodoubleargument\dodefinefontstyle} \def\setfontstyle#1#2% #1:name (roman, romaan) #2:style (rm) {\edef\fontstyle{#1}% - \setcurrentfontstyle{\normalizedbodyfontsize}} + \setcurrentfontstyle\normalizedbodyfontsize} \chardef\defaultskewcharmi='177 \chardef\defaultskewcharsy='60 \def\dosetskewchar#1% - %{\skewchar\font=\ifundefined{\purefontname\font\s!skewchar}% + %{\skewchar\font\ifundefined{\purefontname\font\s!skewchar}% % #1\else\csname\purefontname\font\s!skewchar\endcsname\fi} - {\skewchar\font=\ifx\@@fontskewchar\empty#1\else\@@fontskewchar\fi} + {\skewchar\font\ifx\@@fontskewchar\empty#1\else\@@fontskewchar\fi} %D The previous macros show that it's is not always %D neccessary to define the whole bunch of fonts, take for @@ -2871,8 +2981,7 @@ \unexpanded\def\switchtobodyfont[#1]% {\doifsomething{#1} {\doifdefinedelse{\??ft\normalizedbodyfontsize\interfaced{#1}} - {\doswitchpoints[\getvalue{\??ft\normalizedbodyfontsize\interfaced{#1}}]% - \doswitchstyle[\fontstyle]} + {\setbodyfontstep{#1}} % so we have a fast [small] switch {\dosetfont0{#1}}% \the\everybodyfont}} % indeed needed in case nothing is executed @@ -2882,10 +2991,10 @@ \beginTEX \def\fastswitchtobodyfont#1% - {\ifcsname\??ft\normalizedbodyfontsize#1\endcsname + {\@EA\ifx\csname\??ft\normalizedbodyfontsize#1\endcsname\else \edef\futurebodyfontsize {\csname\??ft\normalizedbodyfontsize#1\endcsname}% - \ifcsname\@size@\futurebodyfontsize\endcsname + \@EA\ifx\csname\@size@\futurebodyfontsize\endcsname\else \csname\@size@\futurebodyfontsize\endcsname \localbodyfontsize\futurebodyfontsize\relax \fi @@ -2926,21 +3035,21 @@ \def\domffam#1% {\csname\ifundefined{#1\s!fam}\c!nn\else#1\fi\s!fam\endcsname} -\def\mffam% +\def\mffam {\domffam\fontalternative} -\def\dosetmathfont% +\def\dosetmathfont {\def\rm{\fam\mrfam}\dodosetmathfont} %D The font specific features are bound to the filename. -\def\updatefontparameters% +\def\updatefontparameters {\edef\@@fontencoding{\truefontdata\fontfile \s!encoding}% \edef\@@fontmapping {\truefontdata\fontfile \s!mapping }% \edef\@@fonthandling{\truefontdata\somefontname\s!handling}% \edef\@@fontskewchar{\truefontdata\fontfile \s!skewchar}} -\def\setfontcharacteristics% +\def\setfontcharacteristics {\updatefontparameters \fastenableencoding {\ifx\@@fontencoding\empty @@ -3006,26 +3115,35 @@ %D {frak, goth, cal} %D %D On behalf of {\frac Tobias Burnus}, we define some more of -%D these: +%D these. Later we will link these names to real file names. -\definefont [frak] [Fraktur sa *] % \currentfontscale] -\definefont [goth] [Gothic sa *] % \currentfontscale] -\definefont [cal] [Calligraphic sa *] % \currentfontscale] +\definefont [frak] [Fraktur sa *] +\definefont [goth] [Gothic sa *] +\definefont [cal] [Calligraphic sa *] +\definefont [bbd] [Blackboard sa *] \definefontsynonym [Fraktur] [Serif] \definefontsynonym [Gothic] [Serif] \definefontsynonym [Calligraphic] [Serif] +\definefontsynonym [Blackboard] [Serif] %D \macros -%D {fraktur, gothic, calligraphic} +%D {fraktur, gothic, calligraphic, blackboard} %D -%D For Tobias and friends: +%D These macros assume that we use text fonts, and not math +%D families. + +% \def\fraktur #1{\mathematics{\frak#1}} +% \def\gothic #1{\mathematics{\goth#1}} +% \def\calligraphic#1{\mathematics{\cal #1}} +% \def\blackboard #1{\mathematics{\bbd #1}} -\def\fraktur #1{\ifmmode\hbox\fi{\frak#1}} -\def\gothic #1{\ifmmode\hbox\fi{\goth#1}} -\def\calligraphic#1{\ifmmode\hbox\fi{\cal #1}} +\ifx\mathtext\undefined \let\mathtext\hbox \fi -%D In \type {font-cmr} we will link these to real file names. +\def\fraktur #1{\mathortext\mathtext\donothing{\frak#1}} +\def\gothic #1{\mathortext\mathtext\donothing{\goth#1}} +\def\caligraphic#1{\mathortext\mathtext\donothing{\cal #1}} +\def\blackboard #1{\mathortext\mathtext\donothing{\bbd #1}} %D \macros %D {definebodyfontswitch} @@ -3058,16 +3176,15 @@ %D The three alternatives can be activated by the next three %D system calls and are defined by the bodyfontenvironment. -\let\fontstep\empty +\let\fontstep\empty % we can use \fontstep for tracing purposes \def\setbodyfontstep#1% - {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced#1\endcsname}% + {\edef\fontstep{\bodyfontcsname\normalizedbodyfontsize\interfaced{#1}\endcsname}% \doswitchpoints[\fontstep]% - \doswitchstyle[\fontstyle]% - \the\everybodyfont} + \doswitchstyle[\fontstyle]} -\unexpanded\def\setsmallbodyfont{\setbodyfontstep\v!klein} -\unexpanded\def\setbigbodyfont {\setbodyfontstep\v!groot} +\unexpanded\def\setsmallbodyfont{\setbodyfontstep\v!klein\the\everybodyfont} +\unexpanded\def\setbigbodyfont {\setbodyfontstep\v!groot\the\everybodyfont} \unexpanded\def\setmainbodyfont% {\doswitchpoints[\normalizedbodyfontsize]% @@ -3085,7 +3202,9 @@ \let\mainfontclass\empty \def\fullrestoreglobalbodyfont - {\let\fontsize\empty + {\let\fontsize\defaultfontsize + \let\fontbody\defaultfontbody + \chardef\currentxfontsize\zerocount \let\fontclass\globalfontclass \doswitchpoints[\normalizedglobalbodyfontsize]% \doswitchstyle[\globalfontstyle]% @@ -3093,7 +3212,9 @@ \tf \the\everybodyfont} \def\partialrestoreglobalbodyfont - {\let\fontsize\empty + {\let\fontsize\defaultfontsize + \let\fontbody\defaultfontbody + \chardef\currentxfontsize\zerocount \redoconvertfont \tf} @@ -3255,10 +3376,10 @@ %D Extras: -\unexpanded\def\dontconvertfont% +\unexpanded\def\dontconvertfont {\let\doconvertfont\noconvertfont} -\unexpanded\def\redoconvertfont% +\unexpanded\def\redoconvertfont {\let\doconvertfont\dodoconvertfont} %D These commands are not grouped! Grouping is most probably @@ -3302,7 +3423,7 @@ \newconditional\emneeded -\unexpanded\def\em% +\unexpanded\def\em {\relax \ifdim\fontdimen1\font>\zeropoint \settrue\emneeded @@ -3332,10 +3453,10 @@ %D The next feature was not present in previous versions. It %D takes care of \type {\em \bf ...} sitiations. -\def\setemphasisboldface% +\def\setemphasisboldface {\let\normalbf\bf \let\setemphasisboldface\relax - \unexpanded\def\bf% + \unexpanded\def\bf {%\relax \let\bf\relax % new \ifx\fontalternative\c!it % \ifnum\fam=\itfam @@ -3352,36 +3473,36 @@ %D look for something that looks like a dash, in which case we %D don't correct. -\def\emphasiscorrection% +\def\emphasiscorrection {\ifhmode \expandafter\emphasislook \fi} -\def\emphasislook% +\def\emphasislook {\begingroup \beginrobusttest \futurelet\next\emphasistest} -\def\emphasistest% +\def\emphasistest {\normalifcat\noexpand\next,% \endrobusttest\expandafter\doemphasiscorrection \normalelse \endrobusttest\expandafter\dododoemphasiscorrection \normalfi} -\def\doemphasiscorrection% +\def\doemphasiscorrection {\futurelet\next\dodoemphasiscorrection} -\def\dodoemphasiscorrection% - {\setbox\scratchbox=\hbox{\next}% +\def\dodoemphasiscorrection + {\setbox\scratchbox\hbox{\next}% \ifdim\ht\scratchbox<.3ex \expandafter\endgroup \else \expandafter\dododoemphasiscorrection \fi} -\def\dododoemphasiscorrection% - {\scratchskip=\lastskip +\def\dododoemphasiscorrection + {\scratchskip\lastskip \ifdim\scratchskip=\zeropoint\relax \/\relax \else @@ -3481,7 +3602,20 @@ %D The implementation is rather straightforward in using %D \type{\halign}. -\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run} +\fetchruntimecommand \showbodyfont {\f!fontprefix\s!run} + +%D \macros +%D {showfontstrip, testminimalbaseline, showminimalbaseline} +%D +%D The next command can come in handy when combining +%D different fonts into a collection (typeface) and +%D determining optimal baseline distances. +%D +%D \showfontstrip \blank \showminimalbaseline + +\fetchruntimecommand \showfontstrip {\f!fontprefix\s!run} +\fetchruntimecommand \testminimalbaseline {\f!fontprefix\s!run} +\fetchruntimecommand \showminimalbaseline {\f!fontprefix\s!run} %D \macros %D {showbodyfontenvironment} @@ -3607,12 +3741,12 @@ \currentfontbodyscale\scaledfont \definedfont} -\def\getglyph#1#2% slow, faster, much faster +\unexpanded\def\getglyph#1#2% slow, faster, much faster %{{\definefont[\s!dummy][\glyphfontfile{#1} sa \currentfontscale]\dummy#2}} %{{\definefont[\s!dummy][\glyphfontfile{#1} sa *]\dummy#2}} {{\symbolicfont{#1}#2}} -\def\getrawglyph#1#2% for simple symbols +\unexpanded\def\getrawglyph#1#2% for simple symbols {{\scaledfont\fontbody \font\definedfont=#1 at \currentfontbodyscale\scaledfont \definedfont#2}} @@ -3660,8 +3794,8 @@ \def\bordermatrix% {\bgroup - \setbox0=\hbox{\getvalue{\textface\c!mm\c!ex}B}% - \global\p@renwd=\wd0\relax + \setbox0\hbox{\getvalue{\textface\c!mm\c!ex}B}% + \global\p@renwd\wd0\relax \egroup \normalbordermatrix} @@ -3722,8 +3856,8 @@ {\dontleavehmode \bgroup \setbox\scratchbox\hbox{#1}% - \ifdim\ht\scratchbox>\strutheight \ht\scratchbox\strutheight \fi - \ifdim\dp\scratchbox>\strutdepth \dp\scratchbox\strutdepth \fi + \ifdim\ht\scratchbox>\strutheight\relax\ht\scratchbox\strutheight\fi + \ifdim\dp\scratchbox>\strutdepth \relax\dp\scratchbox\strutdepth \fi \box\scratchbox \egroup} @@ -3760,8 +3894,8 @@ \def\moveaccent#1#2% {\smashaccent - {\dimen0=\fontdimen5\font - \dimen2=\dimen0 + {\dimen0\fontdimen5\font + \dimen2\dimen0 \advance\dimen2 -#1% \fontdimen5\font\dimen2 #2\relax -- cgit v1.2.3