%D \module
%D   [       file=core-fnt,
%D        version=1995.10.10,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Font Support,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 
%C details. 

\writestatus{loading}{Context Core Macros / Font Support}

\unprotect

%D \macros
%D   {kap,KAP,Kap,Kaps,nokap,userealcaps,usepseudocaps}
%D
%D We already introduced \type{\kap} as way to capitalize
%D words. This command comes in several versions:
%D
%D \startbuffer
%D \kap {let's put on a \kap{cap}}
%D \kap {let's put on a \nokap{cap}}
%D \KAP {let's put on a \\{cap}}
%D \Kap {let's put on a \\{cap}}
%D \Kaps{let's put on a cap}
%D \stopbuffer
%D
%D \typebuffer
%D
%D Note the use of \type{\nokap}, \type{\\} and the nested
%D \type{\kap}.
%D
%D \startvoorbeeld
%D \startregels
%D \haalbuffer
%D \stopregels
%D \stopvoorbeeld
%D
%D These macros show te main reason why we introduced the
%D smaller \type{\tx} and \type{\txx}.
%D
%D \starttypen
%D \kap\romeins{1995}
%D \stoptypen
%D
%D This at first sight unusual capitilization is completely
%D legal.
%D 
%D \showsetup{\y!kap}
%D \showsetup{\y!Kap}
%D \showsetup{\y!KAP}
%D \showsetup{\y!Kaps}
%D \showsetup{\y!nokap}
%D
%D The difference between pseudo and real caps is demonstrated 
%D below:
%D
%D \startbuffer
%D \usepseudocaps \kap{Hans Hagen}
%D \userealcaps   \kap{Hans Hagen}
%D \stopbuffer
%D
%D \typebuffer
%D 
%D \haalbuffer
%D
%D The \type {\bgroup} trickery below is needed because of 
%D \type {\groupedcommand}. 

\def\usepseudocaps%
  {\def\cap@@uppercase{\the\everyuppercase\uppercase}%
   \def\cap@@lowercase{\the\everylowercase\lowercase}%
   \def\cap@@visualize{\tx}}

\def\userealcaps%
  {\let\cap@@uppercase=\relax
  %\let\cap@@lowercase=\relax % Definitely not!
   \def\cap@@visualize{\sc}}

\usepseudocaps

\def\dodokap#1#2%
  {\ifmmode\hbox\fi
   \bgroup
   \cap@@visualize
   \cap@@uppercase{#1{#2}}%
   \egroup}

\def\nokap#1%
  {\cap@@lowercase{#1}}

\unexpanded\def\kap%
  {\futurelet\next\dokap}

\def\dokap%
  {\ifx\next\bgroup
     \expandafter\dodokap\expandafter\relax
   \else
     \expandafter\dodokap
   \fi}

\unexpanded\def\KAP#1%
  {{\def\\##1{\kap{##1}}#1}}

\unexpanded\def\Kap#1%
  {\KAP{\\#1}}

\unexpanded\def\Kaps%
  {\let\processword=\Kap   
   \processwords}

%D Sure:

\let\normalkap\kap

%D Some precautions for a \PLAIN\ \TEX\ definition. 

\let\normalcap\cap

\def\cap%
  {\ifmmode
     \expandafter\normalcap
   \else
     \expandafter\kap
   \fi}

%D \macros 
%D   {setupcapitals}
%D
%D By default we use pseudo small caps in titles. This can be
%D set up with:
%D 
%D \showsetup{setupcapitals}

\def\setupcapitals%
  {\dosingleempty\dosetupcapitals}

\def\dosetupcapitals[#1]%
  {\getparameters[\??kk][#1]%
   \doifelse{\@@kktitel}{\v!ja}
     {\definealternativestyle[\v!kapitaal][\normalkap][\normalkap]%
      \definealternativestyle[\v!smallcaps][\sc][\sc]%
      \let\kap\normalkap}
     {\definealternativestyle[\v!kapitaal][\normalkap][\uppercase]%
      \definealternativestyle[\v!smallcaps][\sc][\uppercase]%
      \def\kap{\doconvertfont{\v!kapitaal}}}% 
   \doifelse{\@@kksc}{\v!ja}
     {\userealcaps}
     {\usepseudocaps}}

\setupcapitals
  [\c!titel=\v!ja,
   \c!sc=\v!nee]

%D \macros
%D   {Word, Words, WORD, WORDS, doprocesswords}
%D
%D This is probably not the right place to present the next set
%D of macros.
%D
%D \starttypen
%D \Word {far too many words}
%D \Words{far too many words}
%D \WORD {far too many words}
%D \WORDS{far too many words}
%D \stoptypen
%D
%D \typebuffer
%D
%D This calls result in:
%D
%D \startvoorbeeld
%D \startregels
%D \haalbuffer
%D \stopregels
%D \stopvoorbeeld
%D
%D \showsetup{\y!Word}
%D \showsetup{\y!Words}
%D \showsetup{\y!WORD}
%D \showsetup{\y!WORDS}

\def\doWord#1%
  {\bgroup
   \the\everyuppercase
   \uppercase{#1}%
   \egroup}

\unexpanded\def\Word#1%
  {\doWord#1}

\def\doprocesswords#1 #2\od%
  {\ConvertToConstant\doifnot{#1}{}
     {\processword{#1} %
      \doprocesswords#2 \od}}

\def\processwords#1%
  {\doprocesswords#1 \od\unskip}

\unexpanded\def\Words%
  {\let\processwords=\Word 
   \processwords}

\unexpanded\def\WORD#1%
  {\bgroup
   \the\everyuppercase
   \def\kap##1{##1}%
   \def\WORD##1{##1}%
   \uppercase{#1}% No expansion here, otherwise \getvalue problems!
%   \edef\next{#1}%
%   \uppercase\expandafter{\next}%
   \egroup}       

\unexpanded\def\WORDS#1%
  {\WORD{#1}}

%D \macros
%D   {stretched}
%D
%D Stretching characters in a word is a sort of typographical
%D murder. Nevertheless we support this manipulation for use in
%D for instance titles.
%D
%D \starttypen
%D \hbox to 5cm{\stretched{murder}}
%D \stoptypen
%D
%D \typebuffer
%D
%D or
%D
%D \startvoorbeeld
%D \haalbuffer
%D \stopvoorbeeld
%D
%D \showsetup{\y!stretched}

\def\stretched%
  {\ifvmode\hbox to \hsize\else\ifinner\else\hbox\fi\fi
   \processtokens\relax\hss\relax\normalspace}

%D \startbuffer
%D \stretched{Unknown Box}
%D \hbox to .5\hsize{\stretched{A Horizontal Box}}
%D \vbox to 2cm{\stretched{A Vertical Box}}
%D \hbox to 3cm{\stretched{sp{\'e}c{\`\i}{\"a}l}}
%D \stopbuffer
%D 
%D \haalbuffer 
%D 
%D The first line of this macros takes care of boxing. Normally
%D one will use an \type{\hbox} specification. The last line
%D shows how special characters should be passed. 
%D 
%D \typebuffer

%D \macros
%D   {underbar,underbars,
%D    overbar,overbars,
%D    overstrike,overstrikes,
%D    setupunderbar} 
%D
%D In the rare case that we need undelined words, for instance
%D because all font alternatives are already in use, one can
%D use \type{\underbar} and \type{\overstrike} and their plural
%D forms. 
%D 
%D \startbuffer
%D \underbars{drawing \underbar{bars} under words is a typewriter leftover}
%D \overstrikes{striking words makes them \overstrike{unreadable} but 
%D sometimes even \overbar{top lines} come into view.}
%D \stopbuffer
%D 
%D \typebuffer
%D 
%D \startvoorbeeld
%D \startregels
%D \haalbuffer
%D \stopregels
%D \stopvoorbeeld
%D 
%D The next macros are derived from the \PLAIN\ \TEX\ one, but 
%D also supports nesting. The \type{$} keeps us in horizontal 
%D mode and at the same time applies grouping. 
%D
%D \showsetup{\y!underbar}
%D \showsetup{\y!underbars}
%D \showsetup{\y!overbar}
%D \showsetup{\y!overbars}
%D \showsetup{\y!overstrike}
%D \showsetup{\y!overstrikes} 
%D
%D Although underlining is ill advised, we permit some 
%D alternatives, that can be set up by: 
%D
%D \showsetup{\y!setupunderbar}
%D
%D The alternatives show up as 
%D   {\setupunderbar [variant=a]\underbar{alternative a}},
%D   {\setupunderbar [variant=b]\underbar{alternative b}},
%D   {\setupunderbar [variant=c]\underbar{alternative c}}
%D and 
%D   {\setupunderbar [lijndikte=1pt]\underbar{1pt width}},
%D   {\setupunderbar [lijndikte=2pt]\underbar{2pt width}}, 
%D or whatever. Because \type{\overstrike} uses the same 
%D method, the settings also apply to that macro. 

\newcounter\underbarlevel

\def\underbarmethoda#1#2#3% RULE 
  {\hbox to #1{\vrule\!!width#1\!!height#2\!!depth#3}}

\def\underbarmethodb#1#2#3% DASH 
  {\hbox to #1
     {\hskip-.25em 
      \xleaders
        \hbox{\hskip.25em\vrule\!!width.25em\!!height#2\!!depth#3}
        \hfil}}

\def\underbarmethodc#1#2#3% PERIOD
  {\hbox to #1
     {\dimen4=#3
      \advance\dimen4 by .2ex 
      \hskip-.25em 
      \xleaders
        \hbox{\hskip.25em\lower\dimen4\hbox{.}}
        \hfil}}

\def\dododounderbar#1#2#3% 
  {\startmathmode
   \setbox0=\hbox{#3}%
   \setbox2=\getvalue{underbarmethod\@@onvariant}{\wd0}{#1}{#2}%
   \wd0=\!!zeropoint
   \ht2=\ht0 
   \dp2=\dp0 
   \box0\box2
   \stopmathmode}

\unexpanded\def\dodounderbar#1%
  {\bgroup
   \dimen0=1.5\normallineskip  
   \dimen0=\underbarlevel\dimen0
   \ifdone \else
     \advance\dimen0 by -\normallineskip
     \advance\dimen0 by -\ht\strutbox 
   \fi
   \dimen2=\dimen0
   \advance\dimen2 by \@@onlijndikte
   \dododounderbar{-\dimen0}{\dimen2}{#1}%
   \egroup}

\def\betweenunderbarwords%
  {\bgroup
   \setbox0=\hbox
     {\dodounderbar{\hskip\fontdimen2\font}}%
   \nobreak
   \hskip\!!zeropoint\!!minus\fontdimen4\font
   \discretionary{}{}{\box0}%
   \egroup}

\def\betweenunderbarspaces%
  {\hskip\currentspaceskip}

\unexpanded\def\dounderbar#1#2%
  {\let\betweenisolatedwords#1%
   \processisolatedwords{#2}\dodounderbar
   \egroup}

\unexpanded\def\underbar%
  {\bgroup
   \increment\underbarlevel
   \donetrue
   \dounderbar\betweenunderbarwords}

\unexpanded\def\underbars%
  {\bgroup
   \increment\underbarlevel
   \donetrue
   \dounderbar\betweenunderbarspaces}

\unexpanded\def\overbar%
  {\bgroup
   \decrement\underbarlevel
   \donefalse
   \dounderbar\betweenunderbarwords}

\unexpanded\def\overbars%
  {\bgroup
   \decrement\underbarlevel
   \donefalse
   \dounderbar\betweenunderbarspaces}

\def\dooverstrike#1%
  {\bgroup
   \dimen0=2.5\normallineskip
   \dimen2=\dimen0
   \advance\dimen2 by \@@onlijndikte
   \dododounderbar{\dimen2}{-\dimen0}{#1}%
   \egroup}

\def\betweenoverstrikewords%
  {\bgroup
   \setbox0=\hbox
     {\dooverstrike{\hskip\fontdimen2\font}}%
   \nobreak
   \hskip\!!zeropoint\!!minus\fontdimen4\font
   \discretionary{}{}{\box0}%
   \egroup}

\unexpanded\def\overstrike#1%
  {\bgroup
   \let\betweenisolatedwords\betweenoverstrikewords
   \processisolatedwords{#1}\dooverstrike
   \egroup}

\unexpanded\def\overstrikes#1%
  {\bgroup
   \processisolatedwords{#1}\dooverstrike
   \egroup}

\def\setupunderbar%
  {\dodoubleargument\getparameters[\??on]}

%D \macros
%D   {low, high, lohi}
%D 
%D Although \TEX\ is pretty well aware of super- and
%D subscripts, its mechanism is mainly tuned for math mode. 
%D The next few commands take care of script texts both modes. 
%D 
%D \startbuffer
%D The higher\high{one goes} the lower\low{one drops}, or\lohi{yes}{no}?
%D \stopbuffer
%D 
%D \typebuffer
%D 
%D \getbuffer
%D
%D Note the different placement of \type {\lohi}, where we 
%D need a bit more space. The implementation looks a bit 
%D fuzzy, since some \type {\fontdimen}'s are involved to 
%D determine the optimal placement. 

\def\dodohighlow%
  {\ifx\fontsize\empty
     \ifmmode
       \ifnum\fam<0 \tx \else \holamathfont \fi
     \else
       \tx 
     \fi
   \else
     \tx 
   \fi}

\def\dohighlow#1#2#3#4#5%
  {\bgroup
   \scratchdimen= 
     \ifdim\fontdimen5\textfont2=1ex\fontdimen#2\textfont2\else#3ex\fi
   \advance\scratchdimen by #4ex
   \kern.1ex
   \setbox\scratchbox=\hbox{#1\scratchdimen\hbox{\dodohighlow#5}}%
   \ht\scratchbox\strutheight
   \dp\scratchbox\strutdepth
   \box\scratchbox
   \egroup}

\unexpanded\def\high{\dohighlow\raise{14}{.86}{0}}
\unexpanded\def\low {\dohighlow\lower{16}{.48}{0}}

\unexpanded\def\lohi#1#2%
  {\hbox
     {\setbox4=\hbox{\dohighlow\lower{16}{.48}{.1}{#1}}%
      \setbox6=\hbox{\dohighlow\raise{14}{.86}{.1}{#2}}%
      \ifdim\wd4<\wd6
        \wd4=\!!zeropoint\box4\box6
      \else
        \wd6=\!!zeropoint\box6\box4
      \fi}}

%D This module has only a few setups:

\setupunderbar
  [\c!variant=a,
   \c!lijndikte=\linewidth]
  
\protect 

\endinput
