%D \module
%D   [       file=font-run,
%D        version=1998.09.11, % (second)
%D        version=2001.02.20, % (third)
%D          title=\CONTEXT\ Font Macros,
%D       subtitle=Runtime Macros,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

%D [This code is hooked into the core macros and saves some format
%D space. It needs a cleanup as it's real old derioved \MKII\ code]
%D
%D Better use \type{\bTABLE...\eTABLE}.

\unprotect

\gdef\font_show_only_english#1%
  {\blank{\tttf \type {#1} is only available in the english interface}\blank}

\gdef\font_show_title#1%
  {\tabskip\zeropoint
   \parindent\zeropoint
   \setlocalhsize
   \doifelsenothing{#1}
     {\def\title{[\the\bodyfontsize]}}
     {\switchtobodyfont[#1]\def\title{[#1]}}
   \doifsomething\fontclass
     {\doifnot{[\fontclass]}\title
        {\edef\title{[\fontclass]\space\title}}}}

\unexpanded\gdef\showbodyfont
  {\dosingleempty\font_show_bodyfont}

\gdef\font_show_bodyfont[#1]%
  {\ifinsidefloat\else\startbaselinecorrection\fi
   \vbox
     {\font_show_title{#1}%
      \def\bigstrut##1##2%
        {\hbox{\vrule
           \s!height##1\strutht
           \s!depth ##2\strutdp
           \s!width \zeropoint}}
      \def\next##1##2##3%
        {&&##1&&##2\tf##3&&##2\sc##3%
         &&##2\sl##3&&##2\it##3&&##2\bf##3&&##2\bs##3&&##2\bi##3%
         &&##2\tfx##3&&##2\tfxx##3%
         &&##2\tfa##3&&##2\tfb##3&&##2\tfc##3&&##2\tfd##3&\cr}%
      \halign to \localhsize
        {\bigstrut{1.5}{2}##&\vrule##
         \tabskip\zeropoint \s!plus 1\s!fill
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
         \tabskip=\zeropoint\cr
         \noalign{\hrule}
         &\multispan{29}{\vrule\hfil\tttf\strut\title\hfil
          \llap{\string\mr\hpack to \emwidth{\hss:\hss}\normalstartimath\mr\languageparameter\c!text\normalstopimath\quad}\vrule}\cr
         \noalign{\hrule}\next{}{\tt\string}{}
         \noalign{\hrule}\next{\tt\string\rm}\rm{\languageparameter\c!text}
         \noalign{\hrule}\next{\tt\string\ss}\ss{\languageparameter\c!text}
         \noalign{\hrule}\next{\tt\string\tt}\tt{\languageparameter\c!text}
         \noalign{\hrule}}}
   \ifinsidefloat\else\stopbaselinecorrection\fi}

\unexpanded\gdef\showbodyfontenvironment
  {\dosingleempty\font_show_bodyfont_environment}

\gdef\font_show_bodyfont_environment[#1]%
  {\ifinsidefloat\else\startbaselinecorrection\fi
   \vbox
     {\font_show_title{#1}%
      \def\next##1%
        {&&\bodyfontsizevariable{##1}\s!text
         &&\bodyfontsizevariable{##1}\s!script
         &&\bodyfontsizevariable{##1}\s!scriptscript
         &&\bodyfontsizevariable{##1}\s!x
         &&\bodyfontsizevariable{##1}\s!xx
         &&\bodyfontsizevariable{##1}\v!small
         &&\bodyfontsizevariable{##1}\v!big
         &&\bodyfontsizevariable{##1}\c!interlinespace
         &\cr
         \noalign{\hrule}}
      \halign to \localhsize
        {##&\vrule##\strut
         \tabskip=\zeropoint \s!plus 1\s!fill
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##&\hfil##\hfil&\vrule##
         &\hfil##\hfil&\vrule##&\hfil##\hfil&##\vrule
         \tabskip\zeropoint\cr
         \noalign{\hrule}
         &\multispan{17}{\vrule\hfil\tttf\strut\title\hfil}\vrule\cr
         \noalign{\hrule}
         &&\tttf\tx\s!text&&\tttf\tx\s!script&&\tttf\tx\s!scriptscript
         &&\tttf\tx\s!x&&\tttf\tx\s!xx&&\tttf\tx\v!small&&\tttf\tx\v!big
         &&\tttf\tx\c!interlinespace&\cr
         \noalign{\hrule}%
         \processbodyfontenvironmentlist\next}}
   \ifinsidefloat\else\stopbaselinecorrection\fi}

\unexpanded\gdef\showfont
  {\dodoubleempty\font_show_font}

\gdef\font_show_font[#1][#2]% doing this in lua is much faster
  {\bgroup
   \iffirstargument
     \definefont[\s!dummy][#1]\dummy
   \fi
   \doifelsenothing{#2}
     {\font_show_font_indeed{#1}\zerocount}
     {\doifelse{#2}\v!all
        {\dostepwiserecurse\zerocount{255}\plusone
           {\scratchcounterone  \recurselevel
            \scratchcountertwo  \numexpr\scratchcounterone*256\relax
            \scratchcounterthree\numexpr\scratchcountertwo+255\relax
            \doloop
              {\iffontchar\font\scratchcountertwo
                 \font_show_font_indeed{#1}\scratchcounterone
                 \exitloop
               \else\ifnum\scratchcountertwo=\scratchcounterthree
                 \exitloop
               \else
                 \advance\scratchcountertwo\plusone
               \fi\fi}}}
        {\processcommalist[#2]{\font_show_font_indeed{#1}}}}%
   \egroup}

\gdef\font_show_font_indeed#1#2% made some 50% faster but still slow
  {\bgroup
   \iffirstargument
    % \definefont[\s!dummy][#1]\dummy
   \else\ifdim2.5\emwidth>.05\hsize \tx
        \ifdim2.5\emwidth>.05\hsize \txx
   \fi\fi\fi
   \ifinsidefloat\else\startbaselinecorrection\fi
   \vbox\bgroup
   \scratchdimenone  2.5\emwidth
   \scratchdimentwo  2.4\emwidth
   \scratchdimenthree2.3\emwidth
   \edef\charplane{\number#2}%
   \forgetall
   \startoverlay % easier in cld
     {\vbox
        {\tf
         \setstrut
         \dummy
         \offinterlineskip
         \unexpanded\def\wrapbox##1%
           {\vpack to \scratchdimenone
              {\vss
               \hpack to \scratchdimenone
                 {\dummy
                  \ifdim\interwordspace=\zeropoint
                    \setbox##1\hpack
                      {\raise.5\dp##1\hpack
                         {\lower.5\ht##1\copy##1}}%
                    \ht##1\zeropoint
                    \dp##1\zeropoint
                  \else
                    \ht##1\strutht
                    \dp##1\strutdp
                    \strut
                  \fi
                  \hss\copy##1\hss}
               \vss}}%
         \unexpanded\def\textbox##1%
           {\vpack to \scratchdimentwo
              {\hsize\scratchdimenthree
               ##1%
               \par}}%
         \unexpanded\def\scratchnum
           {\blue
            \tinyfont
            \hfill
            \number\scratchcounter
            \vfill
            \octnumber\scratchcounter
            \hfill
            \lchexnumbers\scratchcounter}%
         \setbox\scratchboxone\hpack{\tf\textbox{}}%
         \setbox\scratchboxtwo\hpack{\tf\gray\vrule\s!width\exheight\s!height.5\exheight\s!depth.5\exheight}%
         \setbox\scratchboxtwo\wrapbox\scratchboxtwo
         \setbox\scratchboxthree\hpack
           {\startoverlay
              {\box\scratchboxtwo}
              {\box\scratchboxone}
            \stopoverlay}%
         \dostepwiserecurse\zerocount{15}\plusone
           {\scratchcounterone\recurselevel
            \hpack
              {\dostepwiserecurse\zerocount{15}\plusone
                 {\scratchcountertwo  \recurselevel
                  \scratchcounter     \numexpr\scratchcounterone*16+\scratchcountertwo\relax
                  \scratchcounterthree\numexpr\charplane*256+\scratchcounter\relax
                  \iffontchar\font\scratchcounterthree
                    \setbox\scratchbox\ruledhpack{\char\scratchcounterthree}%
                    \tf
                    \startoverlay
                      {\wrapbox\scratchbox}
                      {\textbox\scratchnum}
                    \stopoverlay
                  \else
                    \copy\scratchboxthree
                  \fi}}}%
          \par}}
     {\tf\basegrid[\c!nx=16,\c!ny=16,\c!dx=2.5,\c!dy=2.5,\c!unit=em]}
   \stopoverlay
   \nointerlineskip
   \vskip2\points
   % the \noexpand before \blank is needed for non etex
   \edef\theshowfontspecs{name: {\noexpand\black\fontname\font}\quad plane: \charplane\enspace"\hexnumber\charplane}%
   \tf % also sets em
   \hbox to 40\emwidth{\blue\hfill\tinyfont\setstrut\strut\theshowfontspecs}
   \egroup
   \ifinsidefloat\else\stopbaselinecorrection\fi
   \egroup}

% \showfontstyle[modern][rm][tf][all] % #2, #3 and #4 can be 'all'

\unexpanded\gdef\showfontstyle    {\dodoubleempty   \font_show_style}
\unexpanded\gdef\font_show_style_a{\dotripleempty   \font_show_style_b}
\unexpanded\gdef\font_show_style_c{\doquadrupleempty\font_show_style_d}

% no lists any more, so no 'all' any longer

\gdef\font_show_style[#1][#2]%
  {\doifelsenothing{#2}
     {\font_show_style_a[#1][\s!rm,\s!ss,\s!tt,\s!mm]}
     {\font_show_style_a[#1][#2]}}

\gdef\font_show_style_b[#1][#2][#3]%
  {\doifelsenothing{#3}
     {\font_show_style_c[#1][#2][\s!tf,\s!bf,\s!it,\s!sl,\s!bs,\s!bi]}
     {\font_show_style_c[#1][#2][#3]}}

\gdef\font_show_style_d[#1][#2][#3][#4]%
  {\font_show_style_e[#1][#2][#3][#4]}

% so far

\gdef\font_show_style_e[#1][#2][#3][#4]%
  {\bgroup
   \raggedright
   \switchtobodyfont[#1]
   \def\dododocommand##1%
     {\dostepwiserecurse\zerocount{255}\plusone
        {\scratchcounter\numexpr##1*256+\recurselevel\relax
         \iffontchar\font\scratchcounter\relax
           \char\scratchcounter
           \space
         \fi}}%
   \def\dodocommand##1##2%
     {\starttextrule{\tttf #1 ##1 ##2}
      \nobreak\getvalue{##2}%
      \doifelsenothing{#4}
        {\dododocommand\zerocount}
        {\doifelse{#4}\v!all
           {\dostepwiserecurse\zerocount{255}\plusone{\expanded{\dododocommand{\recurselevel}}}}
           {\processcommalist[#4]{\dododocommand}}}%
      \par \nobreak
      \stoptextrule}
   \def\docommand##1%
     {\getvalue{##1}%
      \processcommacommand[#3]{\dodocommand{##1}}}
   \processcommalist[#2]\docommand
   \egroup}

\unexpanded\gdef\showligature#1%
  {\hbox{\type{#1}\enspace\red\ruledhbox{\black#1}}}

\unexpanded\gdef\showligatures[#1]% we keep it around for compatibility reasons
  {\ifx\starttabulate\undefined
     \font_show_only_english\showligatures
   \else
     \bgroup
     \def\font_show_ligature##1{\hbox{\red\ruledhbox{\black##1}}}%
     \definedfont[#1*default]%
     %starttabulate[|*{9}{c|}]
     \starttabulate[|*{7}{c|}]
     \NC\type{ff}
     \NC\type{fi}
     \NC\type{fl}
     \NC\type{ffi}
     \NC\type{ffl}
     %NC\type{``}
     %NC\type{''}
     \NC\type{--}
     \NC\type{---}
     \NC\NR
     \NC\font_show_ligature{ff}
     \NC\font_show_ligature{fi}
     \NC\font_show_ligature{fl}
     \NC\font_show_ligature{ffi}
     \NC\font_show_ligature{ffl}
     %NC\font_show_ligature{``}
     %NC\font_show_ligature{''}
     \NC\font_show_ligature{--}
     \NC\font_show_ligature{---}
     \NC\NR
     \stoptabulate
     \egroup
   \fi}

\unexpanded\gdef\showfontstrip
  {\dosingleempty\font_show_strip}

\gdef\font_show_strip[#1]%
  {\ifx\starttabulate\undefined
     \font_show_only_english\showfontstrip
   \else
     \bgroup
     \def\font_show_strip_a##1##2%
       {\tttf\string##1}
     \def\font_show_strip_b##1##2%
       {\ruledhbox{\switchtobodyfont[#1]##1{##2}}}
     \def\font_show_strip_c##1##2%
       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
        \tt\tfx\the\ht\scratchbox}%
     \def\font_show_strip_d##1##2%
       {\setbox\scratchbox\hbox{\switchtobodyfont[#1]##1{##2}}%
        \tt\tfx\the\wd\scratchbox}%
     \def\font_show_strip_indeed##1##2##3%
       {\NC##2\rm{##3}\NC
           ##2\ss{##3}\NC
           ##2\tt{##3}\NC
           ##2\mathematics{##3}\NC
           \tttf##1\NR}
     \starttabulate[|c|c|c|c|c|]
       \font_show_strip_indeed\relax\font_show_strip_a\empty
       \TB
       \font_show_strip_indeed\relax\font_show_strip_b{xxxx}
       \font_show_strip_indeed\relax\font_show_strip_b{12345}
       \font_show_strip_indeed\relax\font_show_strip_b{(Agw)}
       \TB
       \font_show_strip_indeed{(x height)}\font_show_strip_c{x}
       \font_show_strip_indeed{(m  width)}\font_show_strip_d{m}
     \stoptabulate
     \egroup
   \fi}

\ifdefined\databox \else \newbox\databox \fi

\unexpanded\gdef\testminimalbaseline#1% to be used in a 10 column tabulate
  {\setbox\databox\ruledhbox{#1}%
   \scratchdimen\htdp\databox
   \normalexpanded {
     \NC \ruledhbox{#1}%
     \NC ->
     \NC \the\htdp\databox
     \NC =
     \NC \the\ht\databox
     \NC +
     \NC \the\dp\databox
     \NC \ifdim\scratchdimen<\baselineskip <
         \else\ifdim\scratchdimen=\baselineskip =
         \else > \fi\fi
     \NC \the\baselineskip
     \NC (\ifdim\scratchdimen>\baselineskip not \fi ok)
     \NC \NR}
    }

\unexpanded\gdef\showminimalbaseline
  {\ifx\starttabulate\undefined
     \font_show_only_english\showminimalbaseline
   \else
     \starttabulate[|l|T|T|T|T|T|T|T|T|T|]
       \testminimalbaseline{\hbox to \emwidth{\hss\showstruts\strut\hss}}%
       \testminimalbaseline{(/)}%
       \testminimalbaseline{\normalstartimath\frac{1}{2}x\normalsuperscript2\normalsubscript3\normalstopimath}
     \stoptabulate
   \fi}

\unexpanded\gdef\showkerning#1%
  {\bgroup
   \let\MPfshowcommand\ruledhbox
   \setMPtext\s!dummy{#1}%
   \startMPcode draw textext(\MPstring\s!dummy);\stopMPcode
   \egroup}

\unexpanded\gdef\showcharratio
  {\dowithnextboxcontent
     {\switchtobodyfont[10pt]}%
     {(\withoutpt\the\nextboxht,\withoutpt\the\nextboxdp)}%
     \hbox}

\unexpanded\gdef\showfontparameters
  {\starttabulate[|tl|l|]
   \NC slantperpoint   \NC \the\fontslantperpoint   \font \NC\NR
   \NC interwordspace  \NC \the\fontinterwordspace  \font \NC\NR
   \NC interwordstretch\NC \the\fontinterwordstretch\font \NC\NR
   \NC interwordshrink \NC \the\fontinterwordshrink \font \NC\NR
   \NC exheight        \NC \the\fontexheight        \font \NC\NR
   \NC emwidth         \NC \the\fontemwidth         \font \NC\NR
   \NC extraspace      \NC \the\fontextraspace      \font \NC\NR
   \stoptabulate}

\protect \endinput
