%D \module
%D   [       file=typo-txt,
%D        version=2011.10.27,
%D          title=\CONTEXT\ Typesetting Macros,
%D       subtitle=Text Hacks,
%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 module replaces the by now rather old supp-fun module.

\writestatus{loading}{ConTeXt Typesetting Macros / Text Hacks}

\unprotect

% registerctxluafile{typo-txt}{1.001}

%D \macros
%D   {normalizefontheight,normalizefontwidth,normalizedfontsize}
%D
%D Next we introduce some font manipulation macros. When we
%D want to typeset some text spread in a well defined area, it
%D can be considered bad practice to manipulate character and
%D word spacing. In such situations the next few macros can be
%D of help:
%D
%D \starttyping
%D \normalizefontheight \name {sample text} {height} {font}
%D \normalizefontwidth  \name {sample text} {width}  {font}
%D \stoptyping
%D
%D Consider for instance:
%D
%D \startbuffer[a]
%D \normalizefontheight \TempFont {X} {2\baselineskip} {Serif}
%D \stopbuffer
%D
%D \startbuffer[b]
%D \ruledhbox{\TempFont To Be Or Not To Be}
%D \stopbuffer
%D
%D \typebuffer[a,b] \getbuffer[a]
%D
%D This shows up as:
%D
%D \startlinecorrection
%D \ruledhbox{\getbuffer[b]}
%D \stoplinecorrection
%D
%D The horizontal counterpart is:
%D
%D \startbuffer[a]
%D \normalizefontwidth \TempFont {This Line Fits} {\hsize} {Serif}
%D \stopbuffer
%D
%D \startbuffer[b]
%D \ruledhbox{\TempFont This Line Fits}
%D \stopbuffer
%D
%D \typebuffer[a,b] \getbuffer[a]
%D
%D This gives:
%D
%D \startlinecorrection
%D \ruledhbox{\getbuffer[b]}
%D \stoplinecorrection
%D
%D The calculated font scale is avaliable in \type {\normalizedfontsize}.

\newbox\b_typo_normalizers

\def\typo_normalizers_size#axis#size%
  {\dimexpr\ifdim#1\b_typo_normalizers=\zeropoint
     \bodyfontsize
   \else
     \luaexpr{\number\dimexpr10pt\relax*\number\dimexpr#size\relax/\number#axis\b_typo_normalizers}\scaledpoint
   \fi\relax}

\def\typo_normalizers_font_at_size#axis#cs#text#size#font% avoid overflow by using lua
  {\begingroup
   \setbox\b_typo_normalizers\hbox{\definedfont[#font at 10pt]\settrialtypesetting#text}%
   \normalexpanded{\endgroup\edef\noexpand\normalizedfontsize{\the\typo_normalizers_size{#axis}{#size}}}%
   \definefont[\strippedcsname#cs][#font at \normalizedfontsize]}

\unexpanded\def\typo_normalizers_text_at_size#axis#font#size#text%
  {\dontleavehmode
   \begingroup
   \setbox\b_typo_normalizers\hbox{\definedfont[#font at 10pt]\settrialtypesetting#text}%
   \definedfont[#font at \the\typo_normalizers_size{#axis}{#size}]#text%
   \endgroup}

\def\normalizedfontsize{\bodyfontsize}

\unexpanded\def\normalizetextwidth {\typo_normalizers_text_at_size\wd}
\unexpanded\def\normalizetextheight{\typo_normalizers_text_at_size\ht}
\unexpanded\def\normalizetextdepth {\typo_normalizers_text_at_size\dp}
\unexpanded\def\normalizetextline  {\typo_normalizers_text_at_size\htdp}

\unexpanded\def\normalizefontwidth {\typo_normalizers_font_at_size\wd}
\unexpanded\def\normalizefontheight{\typo_normalizers_font_at_size\ht}
\unexpanded\def\normalizefontdepth {\typo_normalizers_font_at_size\dp}
\unexpanded\def\normalizefontline  {\typo_normalizers_font_at_size\htdp}

\unexpanded\def\widthspanningtext #text#size#specification{\hbox{\normalizefontwidth \temp{#text}{#size}{#specification}\temp#text}}
\unexpanded\def\heightspanningtext#text#size#specification{\hbox{\normalizefontheight\temp{#text}{#size}{#specification}\temp#text}}
\unexpanded\def\depthspanningtext #text#size#specification{\hbox{\normalizefontdepth \temp{#text}{#size}{#specification}\temp#text}}
\unexpanded\def\linespanningtext  #text#size#specification{\hbox{\normalizefontline  \temp{#text}{#size}{#specification}\temp#text}}

%D Traditionally we use UpperCasedNames for this kind of functionality.

\let\NormalizeFontHeight   \normalizefontheight
\let\NormalizeFontWidth    \normalizefontwidth
\let\NormalizeTextHeight   \normalizetextheight
\let\NormalizeTextWidth    \normalizetextwidth

\let\WidthSpanningText     \widthspanningtext

\def\TheNormalizedFontSize{\normalizedfontsize}

%D \macros
%D   {vulgarfraction}
%D
%D This code is moved from \type {cor-mis.mkiv}. We show three versions. First
%D the simple one using \type {\low} and \type {high}:
%D
%D \startbuffer
%D \def\vfrac#1#2%
%D   {\hbox{\high{\tx#1\kern-.25em}/\low{\kern-.25em\tx#2}}}
%D
%D test \vfrac{1}{2} test \vfrac{123}{456} test
%D \stopbuffer
%D
%D \typebuffer {\showmakeup\getbuffer}
%D
%D A better way to handle the kerning is the following, here we kind of assume
%D that tye slash is symmetrical and has nearly zero width.
%D
%D \startbuffer
%D \def\vfract#1#2%
%D   {\hbox{\high{\tx#1}\hbox to \zeropoint{\hss/\hss}\low{\tx#2}}}
%D \stopbuffer
%D
%D \typebuffer {\showmakeup\getbuffer}
%D
%D The third and best alternative is the following:
%D
%D {\showmakeup\getbuffer}\crlf\getbuffer
%D
%D This time we measure the height of the \type {/} and shift over the maximum
%D height and depths of this character and the fractional digits (we use 57 as
%D sample). Here we combine all methods in one macros.

\setnewconstant\vulgarfractionmethod\plusthree

\definehspace[\v!vulgarfraction][.25em] % [.15em]
\definesymbol[\v!vulgarfraction][/]     % [\raise.2ex\hbox{/}]

\unexpanded\def\vulgarfraction#1#2%
  {\dontleavehmode
   \hbox
     {\def\vulgarfraction{vulgarfraction}%
      \ifcase\vulgarfractionmethod
        #1\symbol[\v!vulgarfraction]#2%
      \or
        \high{\tx#1\kern-\hspaceamount\empty\v!vulgarfraction}%
        \symbol[\vulgarfraction]%
        \low {\kern-\hspaceamount\empty\v!vulgarfraction\tx#2}%
      \or
        \high{\tx#1}%
        \hbox to \zeropoint{\hss\symbol[\v!vulgarfraction]\hss}%
        \low{\tx#2}%
      \or
        \setbox0\hbox{\symbol[\vulgarfraction]}%
        \setbox2\hbox{\txx57}%
        \raise\ht0\hbox{\lower\ht2\hbox{\txx#1}}%
        \hbox to \zeropoint{\hss\symbol[\v!vulgarfraction]\hss}%
        \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
      \fi}}

\ifdefined\vfrac \else \let\vfrac\vulgarfraction \fi

%D \starttabulate[|l|l|]
%D \HL
%D \NC \bf method \NC \bf visualization \NC\NR
%D \HL
%D \NC 0 \NC \vulgarfractionmethod0 \vulgarfraction{1}{2} \NC\NR
%D \NC 1 \NC \vulgarfractionmethod1 \vulgarfraction{1}{2} \NC\NR
%D \NC 2 \NC \vulgarfractionmethod2 \vulgarfraction{1}{2} \NC\NR
%D \NC 3 \NC \vulgarfractionmethod3 \vulgarfraction{1}{2} \NC\NR
%D \HL
%D \stoptabulate

%D This is used in the beginners manual. One needs to set the font size to an
%D acceptable value for this to work.

\unexpanded\def\startnicelyfilledbox
  {\vbox\bgroup
   \forgetall
   \dosingleempty\dostartnicelyfilledbox}

\def\dostartnicelyfilledbox[#1]%
  {\letdummyparameter\c!width \hsize
   \letdummyparameter\c!height\vsize
   \letdummyparameter\c!offset\exheight % we obey to the outer exheight
   \letdummyparameter\c!strut \v!yes    % we obey to the inner strut !
   \getdummyparameters[#1]%
   \scratchoffset\dummyparameter\c!offset\relax
   \setbox\scratchbox\vbox to \dummyparameter\c!height \bgroup
   \hsize\dummyparameter\c!width\relax
   \emergencystretch10\scratchoffset
   \parfillskip\zeropoint
   \baselineskip\zeropoint plus \onepoint minus \onepoint
   \beginofshapebox
   \leftskip \scratchoffset
   \rightskip\scratchoffset}

\unexpanded\def\stopnicelyfilledbox
  {\doifelse{\dummyparameter\c!strut}\v!yes
     {\xdef\doflushnicelyfilledbox
        {\ht\shapebox\the\strutht
         \dp\shapebox\the\strutdp
         \box\shapebox}}%
     {\gdef\doflushnicelyfilledbox
        {\box\shapebox}}%
   \endofshapebox
   \doreshapebox
     {\doflushnicelyfilledbox}
     {\penalty\shapepenalty}
     {\kern\shapekern}
     {\vfil}%
   \kern\scratchoffset
   \vfilneg
   \flushshapebox
   \vfilneg
   \kern\scratchoffset
   \egroup
   \box\scratchbox
   \egroup}

\protect \endinput
