%D \module
%D   [       file=hand-ini, % moved from enco-ini / pro
%D        version=2000.12.27, % 1998.12.03,
%D          title=\CONTEXT\ Handling Macros,
%D       subtitle=Initialization,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

\writestatus{loading}{Context Handling Macros (ini)}

% \pushmacro -> dedicated fast one

%D {\em This module is experimental and implements font
%D specific features, like hanging punctuation.}

\unprotect

\startmessages  dutch  library: handlings
  title: handling
      1: font afhandeling --
      2: font afhandeling -- wordt geladen
      3: onbekende font afhandeling --
\stopmessages

\startmessages  english  library: handlings
  title: handling
      1: font handling --
      2: font handling -- is loaded
      3: unknown font handling --
\stopmessages

\startmessages  german  library: handlings % to do
  title: handling
      1: font handling --
      2: font handling -- is loaded
      3: unknown font handling --
\stopmessages

\startmessages  czech  library: handlings % to do
  title: handling
      1: font handling --
      2: font handling -- is loaded
      3: unknown font handling --
\stopmessages

\startmessages  italian  library: handlings % to do
  title: handling
      1: font handling --
      2: font handling -- is loaded
      3: unknown font handling --
\stopmessages

\startmessages  norwegian  library: handlings % to do
  title: handling
      1: font handling --
      2: font handling -- is loaded
      3: unknown font handling --
\stopmessages

\startmessages  romanian  library: handlings % to do
  title: handling
      1: font handling --
      2: font handling -- is loaded
      3: unknown font handling --
\stopmessages

\newif\iftracefonthandling % \tracefonthandlingtrue

\newif\ifskiphandlingdef  \skiphandlingdeffalse

\newtoks\everyenablefonthandling

% much in common with hz/protruding defs
% todo: fix others

\let\normalchar\char % also done in enco-ini

\def\dosetsomehandling#1#2#3 #4 % no define since directly set
  {\ifskiphandlingdef \else
     \doifnumberelse{\string#2}
       {#1{#2#3}{#4}}
       {\doifelsenothing{#3}
          {#1{`#2}{#4}}
          {\let\char\empty
           \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}}\donothing
           \let\char\normalchar}}%
   \fi}

\def\dosetpairhandling#1#2#3 #4 #5 % no define since directly set
  {\ifskiphandlingdef \else
     \doifnumberelse{\string#2}
       {#1{#2#3}{#4}{#5}}
       {\doifelsenothing{#3}
          {#1{`#2}{#4}{#5}}
          {\let\char\empty
           \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}{#5}}\donothing
           \let\char\normalchar}}%
   \fi}

% \def\dosettriplethandling#1#2#3 #4 #5 #6 % no define since directly set
%   {\ifskiphandlingdef \else
%      \doifnumberelse{\string#2}
%        {#1{#2#3}{#4}{#5}{#6}}
%        {\doifelsenothing{#3}
%           {#1{`#2}{#4}{#5}{#6}}
%           {\let\char\empty
%            \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}{#5}{#6}}\donothing
%            \let\char\normalchar}}%
%    \fi}

\def\dosetquartethandling#1#2#3 #4 #5 #6 #7 % no define since directly set
  {\ifskiphandlingdef \else
     \doifnumberelse{\string#2}
       {#1{#2#3}{#4}{#5}{#6}{#7}}
       {\doifelsenothing{#3}
          {#1{`#2}{#4}{#5}{#6}{#7}}
          {\let\char\empty
           \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{#4}{#5}{#6}{#7}}\donothing
           \let\char\normalchar}}%
   \fi}


% \def\doinhsomehandling#1#2 #3 %
%   {\ifskiphandlingdef \else
%      \let\char\empty
%      \doifnumberelse{\csname#2\endcsname}{#1{\csname#2\endcsname}{`#3}}\donothing
%      \let\char\normalchar
%    \fi}

\def\doinhsomehandling#1#2#3 #4 % to be checked
  {\ifskiphandlingdef \else
     \if#3\relax\relax
       #1{`#2}{`#4}%
     \else
       \let\char\empty
       \doifnumberelse{\csname#2#3\endcsname}{#1{\csname#2#3\endcsname}{`#4}}\donothing
       \let\char\normalchar
     \fi
   \fi}

% adjustspacing

\newdimen\adjustdimen \let\handledfont\font

\ifx\undefined\pdfadjustspacing % we don't use pdftex

  \let\enableadjusting     \relax
  \let\disableadjusting    \relax
  \let\setadjusting        \gobbletwoarguments

  \def\defineadjustfactor  #1 #2 {}
  \def\inheritadjustfactor #1 #2 {}

  \let\setfontadjusting    \gobbleoneargument

\else

  \def\enableadjusting  {\pdfadjustspacing\plustwo}
  \def\disableadjusting {\pdfadjustspacing\zerocount}

  \appendtoks \disableadjusting \to \everyforgetall % Here or not here?

  \def\dododefineadjustfactor#1#2%
    {\adjustdimen#2pt\multiply\adjustdimen\plusthousand\divide\adjustdimen\maxcard\relax
     \efcode\handledfont#1\adjustdimen}

  \beginETEX

  \def\dododefineadjustfactor#1#2%
%     {\efcode\handledfont#1\dimexpr#2pt*\plusthousand/\maxcard\relax}
    {\efcode\handledfont#1\dimexpr#2\onepoint*\plusthousand/\maxcard\relax}

  \endETEX

  \def\dodoinheritadjustfactor#1#2%
    {\efcode\handledfont#1\efcode\handledfont#2\relax}

  \def\defineadjustfactor#1 #2 %
    {\setfonttoks
     \let\inherithandling\inheritadjustfactor
     \appendtoks\dosetsomehandling\dododefineadjustfactor#1 #2 \to\fonttoks}

  \def\inheritadjustfactor#1 #2 %
    {\setfonttoks
     \appendtoks\doinhsomehandling\dodoinheritadjustfactor#1 #2 \to\fonttoks}

  \ifnum\pdftexversion<120
    \let\@@pdfexpandbonus\plusthousand
  \else
    \def\@@pdfexpandbonus{autoexpand}%
  \fi

  \def\setfontadjusting#1%
    {\doifvalue{\@fha@\@fha@#1\c!type}\v!hz{\dosetfontadjusting{#1}}}

  \def\dosetfontadjusting#1%
    {\iftracefonthandling\showfontadjusting{#1}\fi
     \pdffontexpand\handledfont
       \csname\@fha@\@fha@#1\c!min \endcsname\space
       \csname\@fha@\@fha@#1\c!max \endcsname\space
       \csname\@fha@\@fha@#1\c!step\endcsname\space
       \@@pdfexpandbonus\relax}

  \def\showfontadjusting#1%
    {\writestatus\m!handlings{[adjust]\space#1\space
       \csname\@fha@\@fha@#1\c!min \endcsname/%
       \csname\@fha@\@fha@#1\c!max \endcsname/%
       \csname\@fha@\@fha@#1\c!step\endcsname\space
       \fontname\handledfont}}
\fi

\ifx\setfontadjusting\gobbleoneargument \else
  \appendtoks
    \setfontadjusting\askedfonthandling
  \to \everyenablefonthandling
\fi

% protruding

\newif\ifembasedprotruding \embasedprotrudingfalse

\newdimen\lproddimen \newdimen\rproddimen \let\handledfont\font

\ifx\undefined\pdfprotrudechars % we don't use pdftex

  \let\enableprotruding       \relax
  \let\disableprotruding      \relax
  \let\setprotrudingfactor    \gobbleoneargument

  \def\defineprotrudefactor   #1 #2 #3 {}
  \def\inheritprotrudefactor  #1 #2    {}

\else

  \def\enableprotruding {\pdfprotrudechars\plustwo}
  \def\disableprotruding{\pdfprotrudechars\zerocount}

  \appendtoks \disableprotruding \to \everyforgetall % Here or not here?

  \lproddimen1000\onepoint \divide\lproddimen\maxcard
  \rproddimen1000\onepoint \divide\rproddimen\maxcard

  \def\setprotrudingfactor#1%
    {\doifvalue{\@fha@\@fha@#1\c!type}\v!hanging{\dosetprotrudingfactor{#1}}}

  \beginTEX

  \def\dosetprotrudingfactor#1% no \onepoint instead of pt
    {\lproddimen\csname\@fha@\@fha@#1\c!left\endcsname\s!pt
     \multiply\lproddimen\plusthousand\divide\lproddimen\maxcard\relax
     \rproddimen\csname\@fha@\@fha@#1\c!right\endcsname\s!pt
     \multiply\rproddimen\plusthousand\divide\rproddimen\maxcard\relax
     \iftracefonthandling\showprotrudingfactor{#1}\fi}

  \endTEX

  \beginETEX \dimexpr

  \def\dosetprotrudingfactor#1% no \onepoint instead of pt
    {\lproddimen\dimexpr\csname\@fha@\@fha@#1\c!left \endcsname\onepoint*\plusthousand/\maxcard\relax
     \rproddimen\dimexpr\csname\@fha@\@fha@#1\c!right\endcsname\onepoint*\plusthousand/\maxcard\relax
     \iftracefonthandling\showprotrudingfactor{#1}\fi}

  \endETEX

  \def\showprotrudingfactor#1%
    {\writestatus\m!handlings{[protrude]\space#1\space
       \csname\@fha@\@fha@#1\c!left \endcsname\space
       \csname\@fha@\@fha@#1\c!right\endcsname\space
       \fontname\handledfont}}

  \beginETEX \fontcharwd

    % division before multiplication, else overflow with "sa>5"

    \newdimen\protrudethreshold \protrudethreshold=36pt

    % keep this

    % \def\redodefineprotrudefactor#1%
    %   {\ifdim\fontdimen6\font>\protrudethreshold
    %      \divide\scratchdimen\fontdimen6\font
    %      \multiply\scratchdimen\fontcharwd\handledfont#1\relax
    %    \else
    %      \multiply\scratchdimen\fontcharwd\handledfont#1\relax
    %      \divide\scratchdimen\fontdimen6\font
    %    \fi}

    % \def\dododefineprotrudefactor#1#2#3%
    %   {\scratchdimen#2\lproddimen
    %    \ifembasedprotruding \else
    %      \redodefineprotrudefactor{#1}%
    %    \fi
    %    \lpcode\handledfont#1\scratchdimen
    %    \scratchdimen#3\rproddimen
    %    \ifembasedprotruding \else
    %      \redodefineprotrudefactor{#1}%
    %    \fi
    %    \rpcode\handledfont#1\scratchdimen}

    \def\dododefineprotrudefactor#1#2#3%
      {\lpcode\handledfont#1\dimexpr#2\lproddimen
         \ifembasedprotruding \else
           \ifdim\fontdimen6\font>\protrudethreshold
             /\fontdimen6\font*\fontcharwd\handledfont#1%
           \else
             *\fontcharwd\handledfont#1/\fontdimen6\font
           \fi
         \fi
       \relax
       \rpcode\handledfont#1\dimexpr#3\rproddimen
         \ifembasedprotruding \else
           \ifdim\fontdimen6\font>\protrudethreshold
             /\fontdimen6\font*\fontcharwd\handledfont#1%
           \else
             *\fontcharwd\handledfont#1/\fontdimen6\font
           \fi
         \fi
       \relax}

  \endETEX

  \beginTEX

    \ifx\undefined\charbox \newbox\charbox \fi

    \def\protrudethreshold{36\onepoint}

    \def\redodefineprotrudefactor
      {\ifdim\fontdimen6\font>\protrudethreshold
         \divide\scratchdimen\fontdimen6\font
         \multiply\scratchdimen\wd\charbox
       \else
         \multiply\scratchdimen\wd\charbox
         \divide\scratchdimen\fontdimen6\font
       \fi}

    \def\dododefineprotrudefactor#1#2#3%
      {\setbox\charbox{\handledfont\char#1}% ! yet untested !
       \scratchdimen#2\lproddimen
       \ifembasedprotruding \else
         \redodefineprotrudefactor
       \fi
       \lpcode\handledfont#1\scratchdimen
       \scratchdimen#3\rproddimen
       \ifembasedprotruding \else
         \redodefineprotrudefactor
       \fi
       \rpcode\handledfont#1\scratchdimen}

  \endTEX

  \def\dodoinheritprotrudefactor#1#2%
    {\lpcode\handledfont#1\lpcode\handledfont#2\relax
     \rpcode\handledfont#1\rpcode\handledfont#2\relax}

  \def\defineprotrudefactor#1 #2 #3 %
    {\setfonttoks
     \let\inherithandling\inheritprotrudefactor
     \appendtoks\dosetpairhandling\dododefineprotrudefactor#1 #2 #3 \to\fonttoks}

  \def\inheritprotrudefactor#1 #2 %
    {\setfonttoks
     \appendtoks\doinhsomehandling\dodoinheritprotrudefactor#1 #2 \to\fonttoks}

\fi

\ifx\setprotrudingfactor\gobbleoneargument \else
  \appendtoks
     \setprotrudingfactor\askedfonthandling
  \to \everyenablefonthandling
\fi

% Basic support for a new pdftex feature: space factors
%
% \knbccode -- kern before char code
% \knbscode -- kern before space code
% \stbscode -- stretch before space code
% \shbscode -- shrink before space code
%
% Setting \knsbcode\font`\.=200 means that if a period sits before
% a interword space (glue), then the interword glue will be increased
% by an amount of 1em*200/1000, i.e. the value is given in thousandths
% of an em. (HTT)

\newdimen\spfacdimen

\ifx\undefined\pdfadjustinterwordglue % we don't use pdftex

  \let\enablespacehandling  \relax
  \let\disablespacehandling \relax

  \let\setspacehandling     \gobbleoneargument

  \def\definespacefactor    #1 #2 #3 #4 #5 {}
  \def\inheritspacefactor   #1 #2 {}

\else

  \def\enablespacehandling {\pdfadjustinterwordglue\plusone }
  \def\disablespacehandling{\pdfadjustinterwordglue\minusone}

  \appendtoks \disablespacehandling \to \everyforgetall % Here or not here?

  \def\dosetspacehandling#1%
    {\spfacdimen\csname\@fha@\@fha@#1\c!factor\endcsname\s!pt
     \multiply\spfacdimen\plusthousand\divide\spfacdimen\maxcard\relax}

  \def\setspacehandling#1%
    {\doifvalue{\@fha@\@fha@#1\c!type}\v!spacing{\dosetspacehandling{#1}}}

  \def\dododefinespacefactor#1#2#3#4#5%
    {\sfcode#1\plusthousand
     \knbccode\handledfont#1\dimexpr#2\spfacdimen\relax
     \knbscode\handledfont#1\dimexpr#3\spfacdimen\relax
     \stbscode\handledfont#1\dimexpr#4\spfacdimen\relax
     \shbscode\handledfont#1\dimexpr#5\spfacdimen\relax}

  \def\dodoinheritspacefactor#1#2%
    {\sfcode#1\plusthousand
     \knbccode\handledfont#1\knbccode\handledfont#2\relax
     \knbscode\handledfont#1\knbscode\handledfont#2\relax
     \stbscode\handledfont#1\stbscode\handledfont#2\relax
     \shbscode\handledfont#1\shbscode\handledfont#2\relax}

  \def\definespacefactor#1 #2 #3 #4 #5 %
    {\setfonttoks
     \let\inherithandling\inheritspacefactor
     \appendtoks\dosetquartethandling\dododefinespacefactor#1 #2 #3 #4 #5 \to\fonttoks}

  \def\inheritspacefactor#1 #2 %
    {\setfonttoks
     \appendtoks\doinhsomehandling\dodoinheritspacefactor#1 #2 \to\fonttoks}

\fi

\ifx\setspacehandling\gobbleoneargument \else
  \appendtoks
    \setspacehandling\askedfonthandling
  \to \everyenablefonthandling
\fi

% font attributes

\let\notagcode\minusone

\ifx\tagcode\undefined

  \def\settagcode #1 #2 {}

\else

  \def\dodosettagcode#1#2%
    {\tagcode\handledfont#1 #2\relax}

  \def\settagcode#1 #2 %
    {\setfonttoks
     \appendtoks\dosetsomehandling\dodosettagcode#1 #2 \to\fonttoks}

\fi

% hook into font mechanism

\let\fonthandling\empty

\beginTEX

  \def\startfonthandling[#1]%
    {\def\fonthandling{#1}%
     \expandafter\ifx\csname\@fha@\fonthandling\endcsname\relax
       \expandafter\newtoks\csname\@fha@\fonthandling\endcsname
     \fi
     \setfonttoks}

\endTEX

\beginETEX

  \def\startfonthandling[#1]%
    {\def\fonthandling{#1}%
     \ifcsname\@fha@\fonthandling\endcsname\else
       \expandafter\newtoks\csname\@fha@\fonthandling\endcsname
     \fi
     \setfonttoks}

\endETEX

\def\stopfonthandling
  {\let\fonthandling\empty}

\def\setfonttoks
  {\@EA\let\@EA\fonttoks\csname\@fha@\fonthandling\endcsname}

\def\definefonthandling
  {\dotripleempty\dodefinefonthandling}

\def\dodefinefonthandling[#1][#2][#3]%
  {\ifthirdargument
     \setvalue{\@fha@\@fha@#1}{#2}%
     \getparameters
       [\@fha@\@fha@#1]
       [\c!type=\v!hanging,%
        \c!left=1,\c!right=1,%
        \c!min=20,\c!max=20,\c!step=5,%
        \c!factor=1,%
        #3]%
   \else
     \setvalue{\@fha@\@fha@\@fha@#1}{#2}%
   \fi}

\def\setupfonthandling
  {\dodoubleempty\dosetupfonthandling}

\def\dosetupfonthandling[#1][#2]%
  {\getparameters[\@fha@\@fha@#1][#2]}

\def\enablehandling
  {\dodoubleempty\doenablehandling}

\def\doenablehandling[#1][#2]% handling / symbolic fontname
  {\fastenablehandling{#1}{#2}} % for the moment the same as:

\beginTEX

\def\fastenablehandling#1#2%
  {\edef\askedfonthandling{#1}%
   \edef\filoffonthandling{#2}%
   \@EA\ifx\csname\@fha@\@fha@\@fha@\askedfonthandling\endcsname\relax
     \@EA\ifx\csname\@fha@\@fha@\askedfonthandling\endcsname\relax
       \@EAEAEA\nofastenablehandling
     \else
       \@EAEAEA\dofastenablehandling
     \fi
   \else
     \@EA\redofastenablehandling
   \fi}

\def\xfastenablehandling#1%
  {\edef\askedfonthandling{#1}%
   \@EA\ifx\csname\@fha@\@fha@\askedfonthandling\endcsname
     \@EA\nofastenablehandling
   \else
     \@EA\dofastenablehandling
   \fi}

\endTEX

\beginETEX \ifcsname

\def\fastenablehandling#1#2% also gets #2 passed
  {\edef\askedfonthandling{#1}%
   \edef\filoffonthandling{#2}%
   \ifcsname\@fha@\@fha@\@fha@\askedfonthandling\endcsname
     \@EA\redofastenablehandling
   \else\ifcsname\@fha@\@fha@\askedfonthandling\endcsname
     \@EAEAEA\dofastenablehandling
   \else
     \@EAEAEA\nofastenablehandling
   \fi\fi}

\def\xfastenablehandling#1%
  {\edef\askedfonthandling{#1}%
   \ifcsname\@fha@\@fha@\askedfonthandling\endcsname
     \@EA\dofastenablehandling
   \else
     \@EA\nofastenablehandling
   \fi}

\endETEX

\def\redofastenablehandling
  {\edef\fonthandling{\csname\@fha@\@fha@\@fha@\askedfonthandling\endcsname}%
   \rawprocesscommacommand[\fonthandling]\xfastenablehandling}

\def\dofastenablehandling
  {\the\everyenablefonthandling
   \edef\fonthandling{\csname\@fha@\@fha@\askedfonthandling\endcsname}%
   \checkfonthandling\filoffonthandling
   \rawprocesscommacommand[\fonthandling]\dodoenablehandling
   \registerfonthandling\filoffonthandling}

\def\nofastenablehandling
  {\the\everyenablefonthandling
   \let\fonthandling\askedfonthandling
   \dodoenablehandling\fonthandling}

\beginTEX

\def\dodoenablehandling#1%
  {\@EA\ifx\csname\@fha@#1\endcsname\relax\else
     \the\csname\@fha@#1\endcsname
   \fi}

\endTEX

\beginETEX \ifcsname

\def\dodoenablehandling#1%
  {\ifcsname\@fha@#1\endcsname
     \the\csname\@fha@#1\endcsname
   \fi}

\endETEX

%D We must not use \type {\purefontname} here (was a bug)!

% not robust as long as tex reuses definitions internally
%
% \def\checkfonthandling#1% we need a fast compare
%   {\doifelsevalue{#1\s!handling\c!file}{\fontname\font}
%      \skiphandlingdeftrue\skiphandlingdeffalse}
%
% \def\registerfonthandling#1%
%   {\@EA\xdef\csname#1\s!handling\c!file\endcsname{\fontname\font}}

\def\checkfonthandling   #1{\skiphandlingdeffalse}
\let\registerfonthandling   \gobbleoneargument

%D This one makes live easier (less definitions):

\def\inherithandling      #1 #2 %
  {\inheritprotrudefactor #1 #2 %
   \inheritadjustfactor   #1 #2 }

%D \macros
%D   {usehandling}
%D
%D Handling definitions are collected in dedicated files and
%D loaded only once:
%D
%D % \showsetup{usehandling}

\def\dousehandling#1% is the same as encoding
  {\doifundefined{\c!file\f!handlingprefix#1}%
     {\letvalueempty{\c!file\f!handlingprefix#1}%
      \makeshortfilename[\f!handlingprefix#1]%
      \startreadingfile
      \readsysfile\shortfilename
        {\showmessage\m!handlings2{#1}}
        {\showmessage\m!handlings3{#1}}%
      \stopreadingfile}}

\def\usehandling[#1]%
  {\processcommalist[#1]\dousehandling}

%D New:

\def\overloadcharacter#1 #2 %
  {\setfonttoks
   \doifnumberelse{\string#2}
     {\appendtoks\dooverloadcharacter{#1}{\char#2 }\to\fonttoks}
     {\appendtoks\dooverloadcharacter{#1}{#2}\to\fonttoks}}

\def\dooverloadcharacter#1%
  {\setvalue{\characterencoding\string#1}}

%D Let's now see if this macro works:

% \setupfonthandling
%   [\s!default]
%   [\c!links=1,\c!rechts=1,\c!min=20,\c!max=20,\c!stap=5]

\usehandling [def]

\protect \endinput
