% $Id: protcode.tex 883 2022-06-08 17:30:43Z karl $
% Public domain. Originally written by Han The THanh.
% Example \lpcode and \rpcode ("left/right protrusion code") settings
% for per-glyph tuning of protrusion, and a macro to execute them
% 
% As written, this file does nothing but make definitions.
% Adapt and adjust for your needs.
%
% Much more in the LaTeX microtype package (https://ctan.org/pkg/microtype).

\def\setprotcode#1{%
  % this macro works with OT1 encoding only -- mostly ASCII,
  % but assumes OT1 for quotes and dashes.
    \rpcode#1`\!=200
    \rpcode#1`\,=700
    \rpcode#1`\-=700
    \rpcode#1`\.=700
    \rpcode#1`\;=500
    \rpcode#1`\:=500
    \rpcode#1`\?=200
    \lpcode#1`\`=700
    \rpcode#1`\'=700
    \lpcode#1 92=500  % ``
    \rpcode#1 34=500  % ''
    \rpcode#1 123=300 % --
    \rpcode#1 124=200 % ---
    \rpcode#1`\)=50
    \rpcode#1`\A=50
    \rpcode#1`\F=50
    \rpcode#1`\K=50
    \rpcode#1`\L=50
    \rpcode#1`\T=50
    \rpcode#1`\V=50
    \rpcode#1`\W=50
    \rpcode#1`\X=50
    \rpcode#1`\Y=50
    \rpcode#1`\k=50
    \rpcode#1`\r=50
    \rpcode#1`\t=50
    \rpcode#1`\v=50
    \rpcode#1`\w=50
    \rpcode#1`\x=50
    \rpcode#1`\y=50
    \lpcode#1`\(=50
    \lpcode#1`\A=50
    \lpcode#1`\J=50
    \lpcode#1`\T=50
    \lpcode#1`\V=50
    \lpcode#1`\W=50
    \lpcode#1`\X=50
    \lpcode#1`\Y=50
    \lpcode#1`\v=50
    \lpcode#1`\w=50
    \lpcode#1`\x=50
    \lpcode#1`\y=0
    \adjustprotcode#1\relax
}

\newif\ifneedadjustprotcode
\newbox\boxA
\newcount\countA
\newcount\countB
\def\adjustprotcode#1{%
    \needadjustprotcodefalse
    \ifnum\pdftexversion = 14
        \ifnum \expandafter`\pdftexrevision > `g
            \needadjustprotcodetrue
        \fi
    \else\ifnum\pdftexversion > 14
        \needadjustprotcodetrue
    \fi \fi 
    \ifneedadjustprotcode
        \countA=0
        \loop
            \ifcase\lpcode#1\countA\else
                \adjustcp\lpcode#1\countA
            \fi
            \ifcase\rpcode#1\countA\else
                \adjustcp\rpcode#1\countA
            \fi
            \advance\countA 1
        \ifnum\countA < 256 \repeat
    \fi
}
\def\adjustcp#1#2#3{%
    \setbox\boxA=\hbox{%
        \ifx#2\font\else#2\fi
        \char#3}%
    \countB=\wd\boxA
    \multiply\countB #1#2#3\relax
    \divide\countB \fontdimen6 #2\relax
    #1#2#3=\countB\relax
}
