% $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 }