% \iffalse meta comment
% File: kerntest.dtx Copyright (C) 2004 Harald Harders
% \fi
%
% \iffalse
%
%<*driver>
\listfiles
\documentclass[ngerman,english,a4paper]{ltxdoc}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\IfFileExists{fix-cm.sty}{\usepackage{fix-cm}}{}
\usepackage{longtable}
\usepackage{graphicx}
\let\origverbatim\verbatim
\let\endorigverbatim\endverbatim
\usepackage{verbatim}
\usepackage{babel}
\usepackage{calc}
\usepackage{url}
\IfFileExists{booktabs.sty}{\usepackage{booktabs}}{%
  \GenericWarning{kerntest.dtx}{Package file booktabs.sty not
    found. Documentation formatting will be poor}%
  \def\toprule\hline
  \def\midrule\hline
  \def\bottomrule\hline
}
\IfFileExists{krntst-v.tex}{%
  \input{krntst-v.tex}
  \GetFileInfo{krntst-v.tex}
}{%
  \ClassError{kerntest}{File krntst-v.tex not found, please run `latex
    kerntest.ins' first.}{No additional help}%
  \def\fileversion{\textbf{??}}%
  \def\filedate{\textbf{??}}%
}
\title{The \texttt{kerntest} package}
\author{Harald Harders\\\texttt{h.harders@tu-bs.de}}
\date{Version \fileversion\ (\filedate), printed \today}
\makeatletter
\newlength\tempdima
\newlength\tempdimb
\renewenvironment{table}[1][]{%
  \@float{table}[#1]%
  \centering%
  \setlength{\tempdima}{\abovecaptionskip}%
  \setlength{\abovecaptionskip}{\belowcaptionskip}%
  \setlength{\belowcaptionskip}{\tempdima}%
}{%
  \end@float
}
\def\meta@font@select{\normalfont\itshape}
%%
\def\DescribeOpt{\leavevmode\@bsphack\begingroup\MakePrivateLetters
  \Describe@Opt}
\def\Describe@Opt#1{\endgroup
              \marginpar{\raggedleft\PrintDescribeOpt{#1}}%
              \SpecialOptIndex{#1}\@esphack\ignorespaces}
\def\SpecialOptIndex#1{\@bsphack
    \index{#1\actualchar{\protect\ttfamily#1}
           (class option)\encapchar usage}%
    \index{class options:\levelchar{\protect\ttfamily#1}\encapchar
           usage}\@esphack}
\@ifundefined{PrintDescribeOpt}
   {\def\PrintDescribeOpt#1{\strut \MacroFont #1\ }}{}
\@ifundefined{PrintOptName}
   {\def\PrintOptName#1{\strut \MacroFont #1\ }}{}
%%
\makeatother
%%
\newenvironment{fontbox}{%
  \begin{quote}
    \usefont{T1}{ptm}{m}{n}\fontsize{25}{12}\selectfont
    \fboxsep-0.5\fboxrule
}{%
  \end{quote}
  \ignorespacesafterend
}
\newcommand\timesfont[1]{{\usefont{T1}{ptm}{m}{n}#1}}
%%
\newcommand\getkern[2]{%
  \settowidth\tempdima{#1#2}%
  \settowidth\tempdimb{#1\kern0pt#2}%
  \setlength\tempdima{\tempdima-\tempdimb-\fboxrule}%
}
%%
\EnableCrossrefs
\CodelineIndex
\DoNotIndex{\def,\edef,\let,\newcommand,\newenvironment,\newcounter}
\DoNotIndex{\setcounter,\space,\if,\else,\fi,\empty,\@empty,\ifx,\fi}
\DoNotIndex{\ifnum,\fi,\expandafter,\csname,\endcsname,\the}
\DoNotIndex{\MessageBreak,\message,\newlength,\newif,\xdef,\newcount}
\DoNotIndex{\begingroup,\endgroup,\,,\@tempcnta,\@tempdima,\advance}
\DoNotIndex{\ensuremath,\filedate,\fileversion,\docdate}
\DoNotIndex{\mathit,\mathrm,\mathsf,\nprt@tmp,\nprt@tmpnum,\relax}
\DoNotIndex{\protect,\renewcommand,\setlength,\settowidth,\stepcounter}
\DoNotIndex{\string}
\CodelineNumbered
\RecordChanges
\CheckSum{6031}
\begin{document}
 \DocInput{kerntest.dtx}
\end{document}
%</driver>
% \fi
%
% \changes{1.00}{2004/04/01}{Total new implementation}%
% \changes{1.10}{2004/04/06}{Add option `writeall'}%
% \changes{1.11}{2004/04/06}{Added more literature to bibliography}%
% \changes{1.20}{2004/04/11}{Allow to give glyphs by number (decimal,
%   hex, octal) or by PostScript name}%
% \changes{1.20}{2004/04/11}{Write glyph name to table}%
% \changes{1.20}{2004/04/11}{Find and complain inconsistent kerning
%   data}%
% \changes{1.20}{2004/04/11}{Introduce glyph classes to set the
%   kerning for similar glyph shapes by once}%
% \changes{1.20}{2004/04/11}{Reduce left margin}%
% \changes{1.30}{2004/04/12}{Add encodings OT1, T2A, T2B, and LY1}%
% \changes{1.30}{2004/04/12}{Template for OT1 encoding}%
% \changes{1.30}{2004/04/12}{Parameter-dependent encodings (for
%   example with or without ligatures)}%
% \changes{1.30}{2004/04/12}{New option |designsize| for giving the
% design size of the font explicitely}%
% \changes{1.31}{2004/04/13}{Use \cs{setleftkerning} and
%   \cs{setrightkerning} instead of writing every kerning pair}%
% \changes{1.32}{2004/04/14}{Allow to set relative kerning widths in
%   glyph classes}%
%
% \maketitle
% \begin{abstract}
% \noindent
% This class makes it easy to generate tables that show many different
% kerning pairs of an arbitrary font, usable by \LaTeX.
% It shows the kerning values that are used by the the font by default.
%
% In addition, this class enables the user to alternate the kernings
% and to observe the results.
% Kerning pairs can be defined for groups of similar glyphs at once.
% Automatically, an |mtx| file is generated that can be loaded by
% |fontinst| to introduce the user-made kernings into the virtual font
% for \LaTeX.
% \end{abstract}
%
% \tableofcontents
%
% \section*{Copyright}
% Copyright 2004 Harald Harders.
%
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1.3 of the License, or any later version.
%
% \section{Introduction}
%
% Every glyph of a font is surrounded by a bouding box.
% Have a look at these glyphs:
% \begin{fontbox}
% ^^A  \fbox{\raisebox{0pt}[\fontdimen12\font][\fontdimen11\font]{A}}
%   \fbox{A} \fbox{m} \fbox{f}
%   \itshape\fbox{A} \fbox{m} \fbox{f}
% \end{fontbox}
% As can be seen in this example, the glyphs may extend the bounding
% box.
%
% Normally, one character is placed after the other by simply putting
% the bounding boxes directly after each other:
% \begin{fontbox}
%   \fbox{A}\kern-\fboxrule
%   \fbox{H}\kern-\fboxrule\fbox{V}\kern-\fboxrule
%   \fbox{A}\kern-\fboxrule\fbox{m}\kern-\fboxrule
%   \fbox{f}\kern-\fboxrule\fbox{T}
%
%   \itshape
%   \fbox{A}\kern-\fboxrule
%   \fbox{H}\kern-\fboxrule\fbox{V}\kern-\fboxrule
%   \fbox{A}\kern-\fboxrule\fbox{m}\kern-\fboxrule
%   \fbox{f}\kern-\fboxrule\fbox{T}
% \end{fontbox}
% In most cases, this works great, but sometimes the distance between
% two glyphs is ugly then.
% Here, for instance, have a look at
% ``\timesfont{V\kern0pt A}'', ``\timesfont{f\kern0pt T}'',
% ``\timesfont{\itshape V\kern0pt A}'', and
% ``\timesfont{\itshape f\kern0pt T}''.
% To improve these cases, the bounding boxes are moved together or
% away from another, as shown in the next example.
% This is called kerning.
% To be able to do the kerning, the font contains a table of pairs of
% glyphs and the distance to move the second one.
% \begin{fontbox}
%   \fbox{A}\getkern{A}{H}\kern\tempdima
%   \fbox{H}\getkern{H}{V}\kern\tempdima
%   \fbox{V}\getkern{V}{A}\kern\tempdima
%   \fbox{A}\getkern{A}{m}\kern\tempdima
%   \fbox{m}\getkern{m}{f}\kern\tempdima
%   \fbox{f}\getkern{f}{T}\kern\tempdima
%   \fbox{T}
%
%   \itshape
%   \fbox{A}\getkern{A}{H}\kern\tempdima
%   \fbox{H}\getkern{H}{V}\kern\tempdima
%   \fbox{V}\getkern{V}{A}\kern\tempdima
%   \fbox{A}\getkern{A}{m}\kern\tempdima
%   \fbox{m}\getkern{m}{f}\kern\tempdima
%   \fbox{f}\getkern{f}{T}\kern\tempdima
%   \fbox{T}
% \end{fontbox}
% What you see here is the original kerning of the Times Roman
% installed in your \TeX\ system.
% The V--A pairs are improved; but the f still touches the T which is
% not wanted.
% The Times Roman font misses this kerning pair.
% Better were this:
% \begin{fontbox}
%   \fbox{A}\getkern{A}{H}\kern\tempdima
%   \fbox{H}\getkern{H}{V}\kern\tempdima
%   \fbox{V}\getkern{V}{A}\kern\tempdima
%   \fbox{A}\getkern{A}{m}\kern\tempdima
%   \fbox{m}\getkern{m}{f}\kern\tempdima
%   \fbox{f}\kern0.06em
%   \fbox{T}
%
%   \itshape
%   \fbox{A}\getkern{A}{H}\kern\tempdima
%   \fbox{H}\getkern{H}{V}\kern\tempdima
%   \fbox{V}\getkern{V}{A}\kern\tempdima
%   \fbox{A}\getkern{A}{m}\kern\tempdima
%   \fbox{m}\getkern{m}{f}\kern\tempdima
%   \fbox{f}\kern0.07em
%   \fbox{T}
% \end{fontbox}
% 
% Most fonts are missing many of these kerning pairs that are
% necessary for a good typography.
% Especially if you are writing in a language other than English, many
% kernig pairs are missing.
% Have a look at this example with quotation marks used in German,
% with the original kerning of the Times:
% \begin{fontbox}
%   \fbox{,,}\getkern{,,}{T}\kern\tempdima
%   \fbox{T}\getkern{T}{A}\kern\tempdima
%   \fbox{A}\getkern{A}{``}\kern\tempdima
%   \fbox{``}
%   \fbox{>>}\getkern{>>}{V}\kern\tempdima
%   \fbox{V}\getkern{V}{a}\kern\tempdima
%   \fbox{a}\getkern{a}{V}\kern\tempdima
%   \fbox{V}\getkern{V}{<<}\kern\tempdima
%   \fbox{<<}
% \end{fontbox}
% As you can see, there is no kerning at all.
%
% And here comes, what this class is intended to do:
% It is difficult to calculate the necessary kerning automatically.
% Thus, it can be helpful to generate some kerning pairs and to try
% different amounts of kernings. 
% Compare the different kernings in this example (this time without
% the bounding boxes):
% \begin{fontbox}
%   A``
%   A\kern-0.04em``
%   A\kern-0.08em``
%   A\kern-0.12em``
%   A\kern-0.16em``
%   A\kern-0.20em``
%   A\kern-0.24em``
%   A\kern-0.28em``
%   A\kern-0.32em``
%   A\kern-0.36em``
% \end{fontbox}
% The first one is without kerning.
% The kerning in the last one ($-0.35\,\mathrm{em}$) is surely too
% much since both glyphs touch each other.
% It really isn't easy to find the ``perfect'' kerning.
% One remark here: It is worse to have a too tight kerning than too
% less kerning. Thus please do as little kerning as you think can work
% well.
%
% With the |kerntest| class, it is easy to try out different values.
% How this can be done is described in the next section.
%
%
% \section{Usage of the class}
%
% \subsection{Introduction}
%
% In the simplest case, you can use the package like this:
% \verbatiminput{t1-ptm-m-n-shortexample.tex}
% You have to define the font family to be tested in the optional
% argument of the \cs{documentclass} command.
% The syntax is |family=|\meta{font family}, while \meta{font
% family} is the typical abbreviation according to Karl Berry's name
% scheme~\cite{berry1999a}, e.g., |cmr| for Computer Modern Roman,
% |ptm| for Times Roman, |phv| for Helvetica, |pmnj| for Adobe Minion
% with old-style numbers, |pmnx| for Adobe Minion with expert
% characters.
%
% The options |extraname=shortexample| and |footer=false| are not so
% important and described later.
%
% \DescribeEnv{kerntable}%
% The kerning table is generated by the |kerntable| environment which
% is represented by a |longtable| environment internally.
% \DescribeMacro{\testkern}%
% Each line of this environment has to contain one \cs{testkern}
% command with five arguments:
% \begin{enumerate}
% \item The first one contains the name or character number of the
%   left character in the table (see Fig.~\ref{fig:shortexample}).
%   Which glyph corresponds to a given value depends on the used
%   encoding, default is the cork encoding |T1|.
%   The glyph can be specified by giving a decimal number (|0| to
%   |255|), a hexadecimal number (|"0| to |"FF|), an octal
%   number (|'0| to |'377|), or by giving the PostScript glyph
%   name, e.g., |grave|, |guillemotright|, |A|, |Aring|.
%   It does not work to give \LaTeX\ sequences as |<<|,
%   |\guillemotright|, etc.
% \item The second argument gives the kerning of the characters
%   defined in the first and in the third argument.
%   The used unit are Postscript Type\,1 font units which have the
%   length of 0.001\,em.
%   It is not allowed to specify another unit.
%
%   If the second argument is ``|-|'' the original kerning of the
%   font is shown (first line of the example).
%
%   If a value is given (second line) the original kerning is
%   overwritten by the given value.
%   Negative values reduce the distance of the glyphs, positive values
%   increase it.
% \item The third argument specifies the second glyph.
% \item The fourth argument is the kerning between the second and the
%   third glyph and works exactly as the second argument.
% \item The fifth argument specifies the third glyph.
% \end{enumerate}
% After the \cs{testkern} command, an arbitrary (but short) comment
% may be added.
% Often, it is good to write the name of the glyph here.
% With |t1-XXX-m-n.tex| and |ts1-XXX-m-n.tex|, two templates are given
% that contains all glyph names for the |T1| and |TS1| encodings.
%
% Each line in the |kerntable| environment (even the last one) has to
% end with a |\\| or \cs{tabularnewline}.
% 
% The output of this file is shown in Fig.~\ref{fig:shortexample}.
% \begin{figure}
%   \centering
%   \fboxsep=1mm
%   \makebox[\textwidth][c]{%
%     \fbox{\includegraphics[scale=0.8]{t1-ptm-m-n-shortexample}}}
%   \caption{Example for a part of a kerning table (explanations in the
%     text)}
%   \label{fig:shortexample}
% \end{figure}
% In the first column, the number of the middle character (argument
% |#3| of the \cs{testkern} command is listed, followed by the
% PostScript glyph name. 
% In the third column, the combination of characters is printed with
% original kerning for both pairs, while the forth column shows the
% newly suggested kerning.
% In the fifth column, both variants are printed over each other (the
% old one grey, the new one black).
% The next two columns show the values of the two kerning pairs in
% Postscript font units (normally, 0.001\,em).
% If the user has not given a new kerning the original value is
% printed in grey.
% If the user has defined a new kerning, this new value is printed in
% black.
% If, in this case, the old kerning is unequal zero, it is printed in
% parentheses before the new value (second line of the example).
% The rest of each line are examples and comments.
%
%
% \subsection{Most features by example}
%
% The next example shows some more switches that can be defined by the
% user:\label{page:example}
% \verbatiminput{t1-ptm-bx-n-example.tex}
% Have a look at the results in Fig~\ref{fig:example} before the
% switches are explained.
% \begin{figure}
%   \centering
%   \fboxsep=1mm
%   \makebox[\textwidth][c]{%
%     \fbox{\includegraphics[scale=0.8]{t1-ptm-bx-n-example}}}
%   \caption{Example for a part of a kerning table (explanations in the
%     text).
%     The labels marked with a star are described in
%     Section~\ref{sec:advanced}.}%
%   \label{fig:example}
% \end{figure}
%
% \DescribeMacro{\kernsetup}%
% All class options except |family| can either be given as class
% option in the optional argument of the \cs{documentclass} command or
% as argument of the \cs{kernsetup} command.
% The |family| class option has to be given in the \cs{documentclass}
% command.
% Here comes a list of all class options:
% \begin{description}
% \item [|encoding=|\meta{font encoding}:] 
% \DescribeOpt{encoding}%
%   Font encoding (default: |T1|).
%   Currently, |OT1|, |T1|, |TS1|, |T2A|, |T2B|, and
%   |LY1|\footnote{While the other encodings are generated starting
%   from |.etx| files, the LY1 encoding has been extracted from
%   |texnansi.enc|. Some glyphs may have incorrect names.} are
%   supported.
% \item [|family=|\meta{font family}:]
% \DescribeOpt{family}%
%   Abbreviation of the font-family name according to Karl Berry's
%   scheme~\cite{berry1999a}.
%   This option is mandatory in the optional argument of the
%   \cs{documentclass} command.
% \item [|series=|\meta{font series}:]
% \DescribeOpt{series}%
%   Abbreviation for the series of the font (default: |m|), e.g., |m|
%   for medium, |sb| for semibold, |b| for bold, |bx| for bold
%   extended.
% \item [|shape=|\meta{font shape}:]
% \DescribeOpt{shape}%
%   Abbreviation for the font shape (default: |n|), e.g., |n| for
%   upright, |it| for italic, |sl| for slanted, |sc| for small caps,
%   |scit| for italic small caps.
% \item [|size=|\meta{font size}:]
% \DescribeOpt{size}%
%   Size of the tested font (default: |17.28pt|) in arbitrary units. 
%   This sets the \cs{baselineskip} to 1.2 times the given value.
%   The |size| option does not change the size of the legend text
%   which is fixed to 10\,pt.
% \item [|baselineskip=|\meta{baselineskip}:]
% \DescribeOpt{baselineskip}%
%   Sets the \cs{baselineskip} explicitly.
%   To take effect, it has to be given after the option |size|
%   (default: |1.2*17.28pt|).
% \item [|designsize=|\meta{design size}:]
% \DescribeOpt{designsize}%
%   For calculating the kerning data, a PostScript font unit is used
%   which is 1/1000 of the font's design size.
%   Unfortunately, it is not possible to get this size reliably in
%   \LaTeX.
%   For most fonts, 1\,em corresponds to the design size.
%   But in some cases, it is not true:
%   \begin{enumerate}
%   \item Some fonts have a different em length, for example, the
%     Computer Modern fonts.
%     Then, the size given by the option |size| corresponds to the
%     design size, but 1\,em does not.
%   \item If the font is scaled by the |.fd| file, 1\,em is also
%     scaled and may correspond to the design size while the size
%     given with |size| does not.
%   \end{enumerate}
%   Since in most cases, 1\,em is the correct design size, this is the
%   default.
%   If it is not, you can give the correct design size by using the
%   option |designsize|, for example, |designsize=0.9em|,
%   |designsize=17pt|.
% \item [|example=|\meta{text}:]
% \DescribeOpt{example}%
%   Alters the example text for columns 5 and 6 (default: |example|).
% \item [|papersize=|\meta{papersize}]
% \DescribeOpt{papersize}%
%   Tells the |geometry| package which pagesize to use.
%   Supported are all pagesizes handled by |geometry|, e.g.,
%   |a4paper|, |letter|, |legal| (no default).
% \item [|extraname=|\meta{fontname extension}:]
% \DescribeOpt{extraname}%
%   Normally, the heading of each page of output as well as the
%   filename of the |mtx| file are generated automatically by appending
%   encoding, font family, font series, and font shape, e.g.,
%   |t1-cmr-m-n.mtx|.
%   If you use this option, |-|\meta{fontname extension} is added both
%   to the headings and to the filename.
%   For example, |extraname=test1| leads to |t1-cmr-m-n-test1.mtx|.
%   This is useful if you want to generate different |mtx| files that
%   normally got the same name.\footnote{This is why the first example
%     used this option.}
% \item [|color=|{\ensuremath\langle}|true|/|false|{\ensuremath\rangle}:]
% \DescribeOpt{color}%
%   Switches on color output (default: |false|).
%   New values are printed in red, while the old ones are printed
%   black instead of black/grey.
% \item [|copyquotation=|{\ensuremath
%\langle}|true|/|false|{\ensuremath\rangle}:]
% \DescribeOpt{copyquotation}%
%   If a kerning pair containing a double quotation mark, including
%   guillemots, is set, write also the corresponding single one to the
%   |mtx| file.
% \item [|writeall=|{\ensuremath
%\langle}|true|/|false|{\ensuremath\rangle}:]
% \DescribeOpt{writeall}%
%   Write also the original kerning data to the |mtx| file.
% \item [|footer=|{\ensuremath
%\langle}|true|/|false|{\ensuremath\rangle}:]
% \DescribeOpt{footer}%
%   Switch on or off the footline.\footnote{This option seems only to
%   work in the \cs{documentclass} options. Don't ask me why.}
% \end{description}
%
% It has been mentioned some times that an |mtx| file is generated
% automatically.
% |mtx| files contain the font metrics during the fontinst process.
% Amongst other things, they contain the kerning data.
% For example, the |mtx| file generated by the last example looks like this:
% \verbatiminput{t1-ptm-bx-n-example.mtx}
% Only new or changed kerning values are inserted (e.g.,
% |quotedblleft|--|A| is not included).
%
% \DescribeMacro{\mtxcomment}
% Using the \cs{mtxcomment}\marg{comment} command, you can write the
% given argument as comment into the |mtx| file.
%
%
% \subsection{Encoding-dependent parameters}%
%
% Some encodings may have slight differences depending on the used
% shape.
% For example, typewriter fonts may have ligatures but they are
% normally not used.
% Thus, the encodings do not have some glyphs when used with
% typewriter fonts (e.g., |ff|, |fi|, |ffi|, |fl|, |ffl| are
% missing).
%
% \DescribeMacro{\encodingsetup}%
% The class provides an interface to give the necessary parameters to
% these encodings.
% Use the command \cs{encodingsetup} that takes a comma-separated list
% of options as argument (as \cs{kernsetup}).
%
% Here are the encoding-specific options:
% \begin{description}
% \item [T1 encoding:]\strut
%   \begin{description}
%   \item [|ligaturing=|\meta{number}:]
%   \DescribeOpt{ligaturing}%
%     Level of how many ligatures are used (|-2|, |-1|, |0|, or |1|,
%     default |1|).
%     Here is the description from |t1.etx| (version 1.923, 2002/10/29):
%     \begin{enumerate}
%       \item[$1$]
%         All the standard ligature glyphs (\texttt{fi}, \texttt{fl}, 
%         \texttt{ff}, \texttt{ffi}, \texttt{ffl}, \texttt{IJ}, and 
%         \texttt{ij}) are included and the normal ligaturing instructions 
%         (those for the \texttt{f}-ligatures) are included.
%       \item[$0$]
%         All the standard ligature glyphs are included, but none of their 
%         ligaturing instructions.
%       \item[$-1$]
%         The seven slots normally used for ligatures are left empty.
%       \item[$-2$]
%         The seven slots normally used for ligatures are left empty, as 
%         are the slots normally used for \texttt{c}, \texttt{f}, 
%         \texttt{s}, \texttt{i}, and \texttt{I}.
%     \end{enumerate}
%   \end{description}
% \item [OT1 encoding:]\strut
%   \begin{description}
%   \item [|ligaturing=|\meta{number}:]
%   \DescribeOpt{ligaturing}%
%     Level of how many ligatures are used (|0|, |1|, or |2|,
%     default |2|).
%     Please refer to |ot1.etx| for more details.
%   \item [|italicizing=|{\ensuremath
%\langle}|true|/|false|{\ensuremath\rangle}:]
%   \DescribeOpt{italicizing}%
%     Use |dollar| when |false| and |sterling| when |true| (default:
%     |false|).
%   \end{description}
% \end{description}
%
%
% \subsection{Advanced features}%
% \label{sec:advanced}%
%
% In most fonts, different glyphs need the same kerning because their
% left or right edges are very similar, for example, the kerning on
% the left sides of 
% \symbol{66}, \symbol{68}, \symbol{132}, \symbol{208}, \symbol{69},
% \symbol{133}, \symbol{134}, \symbol{200}, \symbol{201}, \symbol{202},
% \symbol{203}, \symbol{070}, \symbol{072}, \symbol{073},
% \symbol{157}, \symbol{204}, \symbol{205}, \symbol{206},
% \symbol{207}, \symbol{156}, \symbol{074}, \symbol{075},
% \symbol{076}, \symbol{136}, \symbol{137}, \symbol{138},
% \symbol{078}, \symbol{139}, \symbol{140}, \symbol{209},
% \symbol{080}, \symbol{082}, \symbol{143}, \symbol{144},
% \symbol{141}, and \symbol{222}
% should be equal.
%
% \DescribeMacro{\defglyphclass}%
% \DescribeMacro{\newglyphclass}%
% \DescribeMacro{\renewglyphclass}%
% \DescribeMacro{\provideglyphclass}%
% This can be reached by using so called ``glyph classes''.
% A new glyph class can be defined using one of the commands
% \cs{defglyphclass}, \cs{newglyphclass}, \cs{renewglyphclass}, and
% \cs{provideglyphclass}.
% The differences are similar to these of the commands
% \cs{newcommand}, \cs{renewcommand}, etc.
% They all have the syntax
% \cs{defglyphclass}\marg{side}\marg{name}\marg{glyphlist}.
% \meta{side} specifies the side of the glyphs on which the kerning
% shall be equal (|left| or |right|). 
% The parameter \meta{name} specifies the name of the glyph list, the
% list above could be named ``|H|'' because they all have a similar
% shape as the H.
% The third argument, \meta{glyphlist}, contains a comma-separated
% list of all glyphs (PostScript names or numbers---as usual).
% For example, the above list is build by this command:\footnote{Due
%   to a problem between the |ltxdoc| and |verbatim| packages, the
%   \texttt{\%} signs appear at the beginning of each line. Just
%   delete them in mind.}
%\begin{verbatim}
%\newglyphclass{left}{H}{B,D,Dcaron,Eth,E,Ecaron,Eogonek,Egrave,%
%  Eacute,Ecircumflex,Edieresis,F,H,I,Idotaccent,Igrave,Iacute,%
%  Icircumflex,Idieresis,IJ,J,K,L,Lacute,Lcaron,Lslash,N,Nacute,%
%  Ncaron,Ntilde,P,R,Racute,Rcaron,Ng,Thorn}\end{verbatim}
%
% You can specify arbitrary glyph classes.
% If you, for example, use the |copyquotation| option glyph classes
% are made containing one double and one single quotation mark each.
%
% When you write a kerning table using the |kerntable| environment and
% it happens that you change the kerning for a glyph that is member of
% a glyph class, the kernings for all other glyphs of the same glyph
% class are automatically changed on the specific side.
% This can be seen in the example on Page~\pageref{page:example} and
% in Figure~\ref{fig:example}:
%
% |period| and |comma| build a glyph pair on both sides.
% In the first line of the table, left and right kerning between the
% period and the quotation marks are changed by the user.
% The kerning between the comma and quotation marks is then set
% automatically; the user does not have to specify them again (the
% kerning data contain a simple |-| in the second line).
% If you specify the same value explicitly, a warning is generated.
% If you specify conflicting values, the programme generates an error
% message (not shown).
% 
% Automatically generated kerning pairs are marked by $\ast$ behind
% the value (as can be seen in the second and 12th line of the
% example).
% Repeated values are marked by $^\dagger$.
%
% There is one shortcoming:
% If you don't specify the kerning for a glyph class at the first
% occurance of this glyph, the correct kerning data are not shown for
% the occurances before the position you have specified the kerning.
% In the example, the kerning between the members of the glyph class
% ``A'' (A, \"A, and \AA) and the right German quotation mark
% (\textquotedblleft), is not specified for the first char of the
% glyph class, \"A, but for the second one, A.
% Thus, the kerning of $-150$ is shown for ``A'' and for ``\AA'', but
% not for ``\"A''.
% But nevertheless, the kerning data written to the |mtx| files are
% correct.
%
% All glyphs, given by \cs{defglyphclass} get the same kerning by
% default.
% You can specify different scale factors by appending
% |[|\meta{scale}|]| to each glyph name; while a factor of |1000| is
% the default and means ``the same kerningn width''.
%
% For example,
%\begin{verbatim}
%\defglyphclass{right}{A}{A,Aring[800],Adieresis[1200],Abreve}\end{verbatim}
% defines a glyph class containing ``A'', ``\AA'', ``\"A'', and ``\u A''.
% All kernings on the right side of ``\AA'' have a width of 80\,%\ of
% these ``A'' has.
% ``\"A'' is kerned 120\,\% of ``A''.
% ``\u A'' is again kerned as ``A''.
%
% You can also specify a different scaling for the first glyph in the
% glyph class.
% But then, all values are scaled in order to reach a factor of |1000|
% for the first entry.
% For example,
%\begin{verbatim}
%\defglyphclass{right}{A}{A[500],Aring[400],Adieresis[600],Abreve[500]}\end{verbatim}
% is identical to the example above.
%
% The effect of scaled kernings can be seen in the example on
% Page~\pageref{page:example} and in Figure~\ref{fig:example} where
% ``\u A'' has half the scaling of ``A'' and ``\AA''.
%
% If two glyphs with scalings different from |1000| meet each other
% both scaling factors are multiplicated.
%
% There are some interesting commands to handle these glyph classes.
% Please have a look in Section~\ref{sec:glyphclasses} for their
% description.
%
%
% \section{Configuration file}
%
% If you are too lazy to put the same options into every source file
% you may write all options except |family| into the configuration
% file |kerntest.cfg| and put it into the \LaTeX\ path.
% If it is present, it is loaded automatically.
%
%
%
% \section{Kerning pairs that are often missing}
%
% This section shows some kerning pairs that are often missing, even
% in expensive fonts. 
% This problem arises since most fonts are merely designed for the
% English language.
%
% \subsection{Character combinations}
%
% Some glyphs need a kerning to many other glyphs, including ``A'',
% ``T'', ``V'', ``W'', and ``Y''.
% For the ordinary lowercase letters, these kernings are included in
% most fonts (if the lowercase letter is on the right of the capital).
% But often, glyphs of other Languages than English are forgotten,
% e.g., ``T\c c'', ``V\'e'', etc. 
% But you may not simply copy all kernings of, for instance, ``Ta'' to
% ``T\"a'', ``T\'a'', ``T\aa'', ``T\c a'' etc.
% Often, these glyphs have parts that force the kerning to be reduced
% or even deleted.
%
% Most character pairs with the uppercase letters (``A'', ``T'',
% ``V'', ``W'', ``Y'') after a lowercase letters are not kerned in the
% fonts.
% In most cases, this should not be a problem because these
% combinations are never printed. (Nowadays, its getting more and more
% important to have these kernings since it is a fashion to use
% uppercase letters within words, e.g., ``ServicePoint''.\footnote{The
% German railway company really uses this term!})
% But some combinations really should be kerned: ``eV''
% (electronvolt), ``mV'' (millivolt).
%
% \subsection{Quotation marks}
%
% Most fonts don't provide kerning for quotation marks other than the
% English ones.
% In English, ``Hello'' is used (``66--99'').
% French uses << and >>: <<Bonjour>>.
% In German, the three possibilities ,,Hallo`` (``99--66''),
% >>Hallo<<, and >>Hallo<< are used.
% In Italian, <<Ciao>> or ``Ciao,, are possible.
% Swedish uses >>Hi>> or ''Hi''~\cite{forssman2002a}.
% For all non-English possibilities, most fonts have no kerning
% information.
% Thus, you should generate five tables for every font, hopefully
% containing all possibilities (\char019H\char020,
% \char020H\char019, \char016H\char017, \char018H\char016,
% \char017H\char018):
% |\testkern{019}{-}{|\meta{glyph}|}{-}{020}|,
% |\testkern{020}{-}{|\meta{glyph}|}{-}{019}|,
% |\testkern{016}{-}{|\meta{glyph}|}{-}{017}|,
% |\testkern{018}{-}{|\meta{glyph}|}{-}{016}|,
% |\testkern{017}{-}{|\meta{glyph}|}{-}{018}|, 
% where \meta{glyph} stands for all 256 glyphs contained in a T1
% encoded font.
%
% All problems mentioned for the double quotation marks apply also for
% their single variants (\glq, \grq, ', \flq, and \frq). 
% In most cases, they need the same kerning as their double
% counterparts.
%
% There are two templates enclosed to build these kerning tables:
% |t1-XXX-m-n.tex| and |ts1-XXX-m-n.tex|.
% Hopefully, the names tell you which one to use.
% They contain some comments that should help to use them.
%
% One (repeated) remark:
% Please don't overdo the kerning if you adjust it.
% In most cases, good is less than you think on first sight.
% You can also orientate on predefined kernings. 
% For example, the kerning for A`` should be similar to A''.
%
% But you are still not save to get the correct kerning when your font
% knows them.
% This is due to the fact that there are multiple possibilities to
% access the quotation marks.
% For example, << can be produced by |<<|, \cs{guillemotleft}, and
% even by \cs{symbol\{19\}} (if you are using T1 encoding).
% If you use |inputenc.sty| you may use the characters directly,
% e.g.,~|«|.
% And after loading |babel.sty|, you can use \cs{flqq} and when writing
% German |"<|.
%
% These possibilities are not equivalent.
%
% \begin{sloppypar}
% The direct commands \cs{textquotedblleft}, \cs{textquotedblright},
% \cs{quotedblbase}, \cs{guillemotleft}, \cs{guillemotright},
% \cs{textquoteleft}, \cs{textquoteright}, \cs{quotesinglbase},
% \cs{guilsinglleft}, and \cs{guilsinglright} work properly; they kern
% on their left and their right side.
% \end{sloppypar}
% The directly written quotation marks (|«|, |»|, etc.) also work
% correctly because the corresponding encoding file (e.g.,
% |latin1.def|) translates them to the direct commands.
%
% The ligatures |``| and |''| seem also to work correctly.
% But the ligature |,,| kerns correctly on its right side, but on its
% left side, it kerns as a comma.
% This may also be correct but it needn't be always the case.
% |<<| and |>>| do not kern at all on their left side.\footnote{I
%   believe they kern as |<| reps.\ |>|. But these characters don't
%   have any kerning information in most cases.}
%
% Looking at the |babel| commands, only \cs{grqq} and \cs{grq} surely
% work correct.
% The others (\cs{glqq}, \cs{glq}, \cs{flqq}, \cs{flq}, \cs{frqq},
% \cs{frq}) are defined differently and thus do not guarantee to kern
% correctly.
% On 2003/04/01, I have posted a bug report.
% Let's see what happens.
%
% The |babel| shortcuts |"`|, |"'|, |"<|, and |">| work as good as the
% corresponding commands.
%
% If you want a correct behaviour of all |babel| quotation marks, just
% copy the definition of \cs{grqq} (it contains of three command
% definitions!) from |babel.def| into your code and change it
% according to produce the other quotation marks.
%
% 
% \section{An example of how to optimize a font}
%
% In this section, a very simple example is shown how to install a
% single font shape with fontinst~\cite{fontinst1998a} and how to
% change kernings for it. 
% If you really want to understand what happens read the fontinst
% manual~\cite{fontinst1998a}, ``\TeX\ Unbound'' by Alan
% Hoenig~\cite{hoenig1998a}, or ``The Font Installation Guide'' by
% Philipp Lehman~\cite{lehman2003a}.
%
% Ghostscript contains the font ``Century Schoolbook~L Roman'' which
% is shipped as files |c059013l.afm| and |c059013l.pfb|.
% Please copy these files into a temporary directory.
%
% According to Karl Berry's scheme, the fontname is |uncr8a|.
% But this font is already prepared on most \TeX\ systems.
% Thus we take the fontname |9ncr8a| here.
% This will be the name for the result file.
%
% Then, run \TeX\ (not \LaTeX) on the script |schoolb1.tex| which does
% most work to install a new font:
% \verbatiminput{schoolb1.tex}
% This run creates some files with the extensions |.pl| and |.vpl|.
% They have to be converted to |tfm| and |vf| files as follows:
% \verbatiminput{convert.sh}
% Now, you can delete the temporary files with the extensions |.mtx|,
% |.pl|, and |.vpl|.
% 
% The new font is ready for use with \LaTeX, now (only for T1 and TS1
% encoding, OT1 encoding has been left out).
% Just run \LaTeX\ on the test file |testschoolb.tex|.
% But you are not yet able to use dvips or \textsc{pdf}\LaTeX\
% because they need a |map| file.
% The corresponding one, |schoolb.map| looks like this:
% \verbatiminput{schoolb.map}
% With help of this map file, the |dvi| file can be converted to
% Postscript using dvips:
% |dvips -u +./schoolb.map -o testeschoolb-1.ps testschoolb|
% Unfortunately, you cannot use \textsc{pdf}\LaTeX\ without adding the
% contents of |schoolb.map| to the global |map| file.
%
% When viewing the result in |testschoolb-1.ps|
% (Fig.~\ref{fig:centuryschool1}), you see that this specific font
% already has most kernings that are missing in other fonts.
% \begin{figure}
%   \centering
%   \fboxsep=1mm
%   \makebox[\textwidth][c]{%
%     \fbox{\includegraphics[scale=1.0]{testschoolb-1}}}
%   \caption{Font example for Century Schoolbook L with original kerning}
%   \label{fig:centuryschool1}
% \end{figure}
% The only really forgotten kernings are A``, A`, \u A``, and
% \quotesinglbase V.
%
% Emagine that many kernings were unsatisfactory.
% Then, we generate a kerning table containing the glyph combinations
% we do not like:
% \verbatiminput{t1-9nc-m-n-1.tex}
% \begin{figure}
%   \centering
%   \fboxsep=1mm
%   \makebox[\textwidth][c]{%
%     \fbox{\includegraphics[scale=0.8]{t1-9nc-m-n-1}}}
%   \caption{Kerning table for Century Schoolbook L}
%   \label{fig:centuryschool1-table}
% \end{figure}
% This leads to the output shown in
% Fig.~\ref{fig:centuryschool1-table} and to the |mtx| file
% |t1-9nc-m-n-1.mtx|:
% \verbatiminput{t1-9nc-m-n-1.mtx}
% Using this file, you can repeat the |fontinst| run with a slightly
% changed script |schoolb2.tex|:
% \verbatiminput{schoolb2.tex}
% The only change amongst |schoolb1.tex| is the added entry
% |t1-9nc-m-n-1,| at the beginning of the second argument of the
% \cs{installfont\{9ncr8t\}} command.
% This includes the new kernings into the generated font.
% After repeating also the |pltotf| and |vptovf| calls, you can use
% the font with the new kernings.
% Running \LaTeX\ and dvips again on |testschoolb.tex| gives the
% output of Fig.~\ref{fig:centuryschool2}.
% \begin{figure}
%   \centering
%   \fboxsep=1mm
%   \makebox[\textwidth][c]{%
%     \fbox{\includegraphics[scale=1.0]{testschoolb-1}}}\\[\medskipamount]
%   \makebox[\textwidth][c]{%
%     \fbox{\includegraphics[scale=1.0]{testschoolb-2}}}
%   \caption{Font example for Century Schoolbook L with original (top)
%     and modified (bottom) kerning.
%     The kerning is much too strong.
%     Here, it only shows the effect of altering the kerning.}
%   \label{fig:centuryschool2}
% \end{figure}
% Here, the kerning values are much too strong.
% The only aim of this was to show a clear difference between original
% and modified kerning.
% Have a look at the \u A kernings.
% They have been set to be half as large as the A kernings on both
% sides.
%
% The last thing to do is to install the font files into the
% corresponding paths of your \TeX\ distribution and to append the map
% information to the global map files (normally by using |updmap|).
%
%
% \begin{thebibliography}{9}
%
% \newcommand\ctanurl[1]{\url{ftp://ftp.dante.de/tex-archive/#1}}%
%
% \bibitem{berry1999a}
% Karl Berry.
% \newblock Fontname, May 2003.
% \newblock \ctanurl{info/fontname/}.
%
% \bibitem{forssman2002a}
% Friedrich Forssman, Ralf de Jong.
% \newblock Detailtypografie, Verlag Hermann Schmidt, Mainz, Germany,
% 2002.
%
% \bibitem{hoenig1998a}
% Alan Hoenig.
% \newblock \TeX\ Unbound---\LaTeX\ \&\ \TeX\ Strategies for Fonts,
% Graphics, \&\ More, Oxford University Press, 1998.
%
% \bibitem{fontinst1998a}
% Alan Jeffry, Rowland McDonnell.
% \newblock fontinst---Font installation software for \TeX, June 1998.
% \newblock \ctanurl{fonts/utilities/fontinst/}.
%
% \bibitem{lehman2003a}
% Philipp Lehman.
% \newblock The Font Installation Guide, August 2003.
% \newblock \ctanurl{info/Type1fonts/fontinstallationguide.pdf}.
%
%\end{thebibliography}
%
% \StopEventually{\PrintChanges \PrintIndex}
%
% \section{The implementation}
%
% Heading of all files.
%    \begin{macrocode}
%<class>\ProvidesClass{kerntest}
%<mtx&t1>\ProvidesFile{t1mtx.clo}
%<mtx&ts1>\ProvidesFile{ts1mtx.clo}
%<mtx&ot1>\ProvidesFile{ot1mtx.clo}
%<mtx&t2a>\ProvidesFile{t2amtx.clo}
%<mtx&t2b>\ProvidesFile{t2bmtx.clo}
%<mtx&ly1>\ProvidesFile{ly1mtx.clo}
%<version>\ProvidesFile{krntst-v.tex}
%<class|mtx|version>  [2004/04/14  v1.32  Generate kerning tables]
%    \end{macrocode}
%
% \subsection{Class file}
%
% Use a standard class as base.
%    \begin{macrocode}
%<*class>
\LoadClass[10pt]{article}
%    \end{macrocode}
% Use most of the space on the paper.
%    \begin{macrocode}
\RequirePackage[top=18mm,left=15mm,right=15mm,bottom=20mm]{geometry}
%    \end{macrocode}
% \changes{1.32}{2004/04/14}{Do not scale Helvetica by default because
%   this breaks testing Helvetica}%
% Font for the legends.
%    \begin{macrocode}
\renewcommand*\familydefault{\sfdefault}
\RequirePackage{helvet}
%    \end{macrocode}
% More required packages.
%    \begin{macrocode}
\RequirePackage{calc}
\RequirePackage{longtable}
\RequirePackage{array}
\RequirePackage{color}
\RequirePackage{ifthen}
\RequirePackage{keyval}
%    \end{macrocode}
% Layout settings.
%    \begin{macrocode}
\pagestyle{myheadings}
\def\@oddfoot{Kerning data, marked with $\ast$, are automatically reused
  from values given before.
  Repeated values are marked by $\dagger$.\hfill}
\def\@evenfoot{\@oddfoot}
\setlength{\parindent}{0mm}
%    \end{macrocode}
% Declare lengths for the font size and the baselineskip.
%    \begin{macrocode}
\newlength\krntst@size
\newlength\krntst@baselineskip
%    \end{macrocode}
% Set the default values for the class options.
%    \begin{macrocode}
\def\krntst@encoding{T1}
\def\krntst@series{m}
\def\krntst@shape{n}
\setlength\krntst@size{17.28pt}
\setlength\krntst@baselineskip{1.2\krntst@size}
\def\krntst@example{example}
\def\krntst@extraname{}
\definecolor{oldcolor}{gray}{0.5}
\definecolor{newcolor}{gray}{0}
\newboolean{krntst@writeall}
%    \end{macrocode}
% The design size is given as command rather than as length because it
% shall not be calculated to a real length (in pt), but it shall scale
% with the chosen font.
%    \begin{macrocode}
\newcommand\krntst@designsize{1em}
%    \end{macrocode}
% Process the class options using the |keyval| package.
%    \begin{macrocode}
\def\ProcessOptionsWithKV#1{%
  \let\@tempc\relax
  \let\KVo@tempa\@empty
  \edef\KVo@tempa{%
    \noexpand\setkeys{#1}{%
      \@ptionlist{\@currname.\@currext}%
    }%
  }%
  \KVo@tempa
  \let\CurrentOption\@empty
}
%    \end{macrocode}
% Define the keys for the class options and the \cs{kernsetup}
% command.
%    \begin{macrocode}
\define@key{krntst}{encoding}{\def\krntst@encoding{#1}}
\define@key{krntst}{family}{\def\krntst@family{#1}}
\define@key{krntst}{series}{\def\krntst@series{#1}}
\define@key{krntst}{shape}{\def\krntst@shape{#1}}
\define@key{krntst}{size}{%
  \setlength\krntst@size{#1}%
  \setlength\krntst@baselineskip{1.2\krntst@size}%
}
\define@key{krntst}{baselineskip}{\setlength\krntst@baselineskip{#1}}
\define@key{krntst}{designsize}{\def\krntst@designsize{#1}}%
\define@key{krntst}{example}{\def\krntst@example{#1}}
\define@key{krntst}{papersize}{\geometry{#1}}
\define@key{krntst}{extraname}{\def\krntst@extraname{-#1}}
\define@key{krntst}{color}[true]{%
  \csname if#1\endcsname
    \definecolor{oldcolor}{gray}{0}%
    \definecolor{newcolor}{rgb}{1,0,0}%
  \else
    \definecolor{oldcolor}{gray}{0.5}%
    \definecolor{newcolor}{gray}{0}%
  \fi
}
%    \end{macrocode}
% Do the copying of quotation marks by introducing glyph classes.
%    \begin{macrocode}
\define@key{krntst}{copyquotation}[true]{%
  \csname if#1\endcsname
    \newglyphclass{left}{leftguillemots}{guillemotleft,guilsinglleft}%
    \newglyphclass{right}{leftguillemots}{guillemotleft,guilsinglleft}%
    \newglyphclass{left}{rightguillemots}{guillemotright,guilsinglright}%
    \newglyphclass{right}{rightguillemots}{guillemotright,guilsinglright}%
    \newglyphclass{left}{leftquotes}{quotedblleft,quoteleft}%
    \newglyphclass{right}{leftquotes}{quotedblleft,quoteleft}%
    \newglyphclass{left}{rightquotes}{quotedblright,quoteright}%
    \newglyphclass{right}{rightquotes}{quotedblright,quoteright}%
    \newglyphclass{left}{basequotes}{quotedblbase,quotesinglbase}%
    \newglyphclass{right}{basequotes}{quotedblbase,quotesinglbase}%
  \fi
}
\define@key{krntst}{writeall}[true]{%
  \setboolean{krntst@writeall}{#1}%
  \ClassWarningNoLine{kerntest}{You are writing the new and the
    original kerning data\MessageBreak
    to the mtx file (option `writeall'). Normally, it is\MessageBreak
    not necessary to write original data}%
}
\define@key{krntst}{footer}[true]{%
  \csname if#1\endcsname
  \else
    \def\@oddfoot{}%
    \def\@evenfoot{\@oddfoot}%
  \fi
}
%    \end{macrocode}
% \begin{macro}{\kernsetup}
% Define the macro \cs{kernsetup} and make it available only in the
% preamble.
%    \begin{macrocode}
\newcommand\kernsetup{\setkeys{krntst}}
\@onlypreamble\kernsetup
%    \end{macrocode}
% \end{macro}
% \changes{1.10}{2004/04/06}{Load configuration file if available}%
% Read in the configuration file if available.
% Do it before processing the options to allow the options to
% overwrite the configuration file entries.
%    \begin{macrocode}
\AtEndOfClass{%
  \InputIfFileExists{kerntest.cfg}{%
    \message{Configuration file `kerntest.cfg' loaded.}%
  }{%
    \message{No configuration file `kerntest.cfg' found.}%
  }
%    \end{macrocode}
% Now, process the class options.
%    \begin{macrocode}
  \ProcessOptionsWithKV{krntst}
%    \end{macrocode}
% This has to do something with a problem in |keyval.sty|.
% I do not really know what it does exactly.
%    \begin{macrocode}
  \let\@unprocessedoptions\relax
}
%    \end{macrocode}
% Generate an error message if the class option |family| has not been
% given in the \cs{documentclass} command.
%    \begin{macrocode}
\ifx\krntst@family\relax
  \ClassError{kerntest}{Class option family not or incorrect
    given\@gobble}{%
    You have to specify the font family by using the
    class\MessageBreak
    option family=<fontfamily>}%
  \stop
\fi
%    \end{macrocode}
% Redefine the |family| option to be unusable in the \cs{kernsetup}
% command.
%    \begin{macrocode}
\AtEndOfClass{%
  \define@key{krntst}{family}{%
    \ClassError{kerntest}{Option `family' used outside
      \string\documentclass\space command}{%
      The option `family=<fontfamily>' has to be specified in the
      optional argument\MessageBreak
      of the \string\documentclass\space command.}%
  }
}
%    \end{macrocode}
% \begin{macro}{\mtxcomment}
% Define a command that writes a comment to the |mtx| file.
%    \begin{macrocode}
\newcommand\mtxcomment[1]{%
  \protected@write\mtxfile{}{\@percentchar\space #1}%
}
%    \end{macrocode}
% \end{macro}
% Define a command that is used to access the font for the legends.
%    \begin{macrocode}
\newcommand\krntst@helpfont{\normalfont\normalsize}
%    \end{macrocode}
% An internal counter that stores the slot of a glyph.
%    \begin{macrocode}
\newcounter{@glyphslot}%
%    \end{macrocode}
% The following commands have to be done at \cs{begin\{document\}} to
% ensure that all \cs{kernsetup} calls have been made before.
%    \begin{macrocode}
\AtBeginDocument{%
%    \end{macrocode}
% Load all used encodings and |T1| for the legends.
% If |T1| is used, it is loaded twice; it does not seem to be bad.
%    \begin{macrocode}
  \RequirePackage[\krntst@encoding,T1]{fontenc}
%    \end{macrocode}
% Load the file that provides the Postscript glyph names.
% The trick to make it lowercase ist stolen from the |fontenc|
% package.
%    \begin{macrocode}
  \edef\reserved@f{%
    \lowercase{\def\noexpand\reserved@f{\krntst@encoding mtx.clo}}}%
  \reserved@f
  \InputIfFileExists\reserved@f{}{%
    \ClassWarningNoLine{kerntest}{Postscript name file `\reserved@f'
      not found.\MessageBreak 
      The kerning table will be okay, but the generated mtx file will
      not be usable}%
    \newcommand\getpsname[1]{unknown character `##1'}%
  }%
%    \end{macrocode}
% \changes{1.32}{2004/04/14}{Direct access on glyph names instead of
%   parsing \cs{getpsname}}%
% Generate macros of the form \cs{slotnumber@glyph@\meta{glyphname}}
% that return the slot number for each glyph.
% This is faster than parsing \cs{getpsname} for the searched glyph
% (on the cost of memory).
%    \begin{macrocode}
  \setcounter{@glyphslot}{0}%
  \whiledo{\the\c@@glyphslot<256}{%
    \expandafter\edef
    \csname slotnumber@glyph@\getpsname{\the\c@@glyphslot}\endcsname{%
      \the\c@@glyphslot}%
    \stepcounter{@glyphslot}%
  }%
%    \end{macrocode}
% Initialise some font-specific things.
% This is done in a group to save the normal legend font outside the
% kerning table. 
%    \begin{macrocode}
  \begingroup
%    \end{macrocode}
% Switch to the font that shall be tested to see if the desired font
% size is possible etc.
%    \begin{macrocode}
    \usefont{\krntst@encoding}{\krntst@family}{\krntst@series}{\krntst@shape}%
    \fontsize{\krntst@size}{\krntst@baselineskip}\selectfont%
%    \end{macrocode}
% Set the Postscript font unit to 0.001 of the design size which is
% 1\,em, normally.
%    \begin{macrocode}
    \psunit=\krntst@designsize\relax
    \global\psunit=0.001\psunit
%    \end{macrocode}
% Give some feedback.
%    \begin{macrocode}
    \typeout{Requested: \krntst@encoding-\krntst@family-%
      \krntst@series-\krntst@shape, size \the\krntst@size}%
    \typeout{Using:\space\space\space\space\space \f@encoding-\f@family-%
      \f@series-\f@shape, size \f@size pt}%
    \expandafter\ifdim\the\krntst@size=\f@size pt\relax
    \else
      \ClassWarningNoLine{kerntest}{Using different font size than
        requested}%
    \fi
    \setlength{\@tempdima}{\krntst@designsize}%
    \typeout{Postscript font unit for design size \the\@tempdima:
      \the\psunit}%
    \expandafter\ifdim\the\@tempdima=\f@size pt\relax
    \else
      \ClassWarningNoLine{kerntest}{The design size (\the\@tempdima,
        1em by default,\MessageBreak
        or given value from option `designsize') of the
        font\MessageBreak
        is not equal to the LaTeX font size (\f@size pt).\MessageBreak
        This can have two reasons:\MessageBreak
        1. The font does not define 1em to be the design
        size\MessageBreak
        \space\space\space (for example, Computer
        Modern).\MessageBreak
        2. The font is implicitely scaled by the fd-file\MessageBreak
        \space\space\space (for example, when using
        helvet.sty).\MessageBreak
        This can cause the PostScript font unit length to
        be\MessageBreak 
        incorrect.
        You may set the design size for calculation\MessageBreak
        of the font unit explicitely by using the class\MessageBreak
        option `designsize'}%
    \fi
%    \end{macrocode}
% Define the name for the headings and the |mtx| file (lowercase trick
% again taken from |fontenc.sty|).
%    \begin{macrocode}
    \edef\mtxfilename{%
      \lowercase{\gdef\noexpand\mtxfilename{%
          \f@encoding-\f@family-\f@series-\f@shape\krntst@extraname}}}%
    \mtxfilename
%    \end{macrocode}
% Set the page headings.
%    \begin{macrocode}
    \markboth{\upshape Font \mtxfilename}{\upshape Font \mtxfilename}%
%    \end{macrocode}
% Don't change the page headings by \cs{section} etc.
%    \begin{macrocode}
%    \global\def\markboth#1#2{}%
%    \global\def\markright#1{}%
%    \end{macrocode}
% Open the |mtx| file.
%    \begin{macrocode}
    \typeout{^^JWriting mtx file `\mtxfilename.mtx'^^J}%
    \immediate\openout\mtxfile\mtxfilename.mtx
%    \end{macrocode}
% Write a nice header to the |mtx| file.
%    \begin{macrocode}
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      This is file `\mtxfilename.mtx',}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      generated on \number\year/\number\month/\number\day\space
      by kerntest.cls, (c) 2004 Harald Harders.}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      The original source file was:}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      \jobname\space (.tex?) with these font options:}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      Encoding: \f@encoding}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      Family: \space\space\f@family}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      Series: \space\space\f@series}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      Shape: \space\space\space\f@shape}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      User-defined name: \krntst@extraname}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
    \protected@write\mtxfile{}{\string\relax}%
    \protected@write\mtxfile{}{\string\metrics}%
    \protected@write\mtxfile{}{\string\needsfontinstversion{1.926}}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      Kerning data for single characters and}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      the first members of the glyph classes.}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      After each \string\setkern\space entry, the glyph classes}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar\space
      for both glyphs are given (./. means no class).}%
    \protected@write\mtxfile{}{\@percentchar\@percentchar}%
  \endgroup
}
%    \end{macrocode}
% Declare the output handle for the |mtx| file.
%    \begin{macrocode}
\newwrite\mtxfile
%    \end{macrocode}
% Round a length to an integer value. 
% I am sure this can be done easier, but it works.
%    \begin{macrocode}
\def\krntst@round#1.#2#3#4\@empty{%
  \setlength\@tempdimc{#1pt}%
  \if#2.%
  \else
    \ifnum#2>4
      \ifnum#1#2<0
        \addtolength\@tempdimc{-1.1pt}%
      \else
        \addtolength\@tempdimc{1.1pt}%
      \fi
    \fi
  \fi
  \edef\rnd@tempa{\strip@pt\@tempdimc}%
  \expandafter\krntst@@round\rnd@tempa.000\@empty
}
%    \end{macrocode}
% Calculate the rounded length.
%    \begin{macrocode}
\def\krntst@@round#1.#2#3\@empty{\def\kernlen{#1}}
%    \end{macrocode}
% \begin{macro}{\round}
% The user routine for rounding lengths.
% The rounded length is \emph{not} returned but saved in the macro
% \cs{kernlen}.
%    \begin{macrocode}
\newcommand*\round[1]{%
  \setlength\@tempdimc{#1}%
  \edef\rnd@tempa{\strip@pt\@tempdimc}%
  \expandafter\krntst@round\rnd@tempa.000\@empty
}
%    \end{macrocode}
% \end{macro}
% Define the Postscript font length.
%    \begin{macrocode}
\newlength\psunit
%    \end{macrocode}
% \begin{macro}{\getpsunit}
% Saves the rounded length of arbitrary unit in Postscript font units
% in the dimension \cs{@tempdima}.
% It has to be used with \cs{strip@pt} to get rid of the unit ``pt''
% which is wrong of course.
%    \begin{macrocode}
\newcommand\getpsunit[1]{%
  \setlength\@tempdima{1pt*\ratio{#1}{\psunit}}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\getkern}
% Get the kerning between the arguments |#1| and |#2|.
% This is done by typesetting |#1#2| with the natural kerning and with
% supressed kerning (|#1\kern 0pt#2|).
% The difference of the box widths is the kerning.
% Return an integer value in Postscript font units.
%    \begin{macrocode}
\newcommand\getkern[2]{%
  \settowidth\@tempdima{#1#2}%
  \settowidth\@tempdimb{#1\kern0pt#2}%
%    \end{macrocode}
% The next line works better than deviding |\@tempdima-\@tempdimb| by
% |0.001em| because rounding errors are avoided.
%    \begin{macrocode}
  \setlength\@tempdima{1pt*\ratio{(\@tempdima-\@tempdimb)*1000}{1em}}%
  \round{\@tempdima}%
}
%    \end{macrocode}
% \end{macro}
% The internal routine for \cs{saveslotnumber}.
% Finds out if a slot number or the Postscript name is given and saves
% the slot number in the counter |@glyphslot|.
%    \begin{macrocode}
\def\@saveslotnumber#1#2\@empty{%
  \if#1"\relax
    \setcounter{@glyphslot}{#1#2}%
  \else
    \if#1'\relax
      \setcounter{@glyphslot}{#1#2}%
    \else
      \ifnum9<1#1\relax
        \setcounter{@glyphslot}{#1#2}%
      \else
        \begingroup\expandafter\expandafter\expandafter\endgroup
        \expandafter\ifx\csname slotnumber@glyph@#1#2\endcsname\relax
          \setcounter{@glyphslot}{-1}%
        \else
          \setcounter{@glyphslot}{\csname slotnumber@glyph@#1#2\endcsname}%
        \fi
      \fi
    \fi
  \fi
  \ifnum\the\c@@glyphslot>255\relax
    \setcounter{@glyphslot}{-1}%
  \fi
}
%    \end{macrocode}
% \begin{macro}{\saveslotnumber}
% Saves the slot number of a glyph given as second argument (by
% PostScript name or its slot number in decimals, octal, or
% hexadecimals) in the counter specified in the first argument.
%    \begin{macrocode}
\DeclareRobustCommand*\saveslotnumber[2]{%
  \expandafter\@saveslotnumber#2\@empty
  \setcounter{#1}{\the\c@@glyphslot}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\getslotnumber}
% Returns the slot number of a given glyph (by PostScript name or its
% slot number in decimals, octal, or hexadecimals) in a decimal number.
%    \begin{macrocode}
\newcommand\getslotnumber[1]{%
  \expandafter\@saveslotnumber#1\@empty
  \ifnum\the\c@@glyphslot<0\relax
    \textbf{???}%
  \else
    \ifnum\c@@glyphslot<100\relax0\fi
    \ifnum\c@@glyphslot<10\relax0\fi
    \the\c@@glyphslot
  \fi
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\printglyph}
% Print the glyph with the given PostScript name or slot number (in
% decimals, octal, or hexadecimals; as usual in \LaTeX).
% Unfortunately, no kerning appears on the left side of the printed
% glyph.
% For example, |\printglyph{A}V| is kerned, but |A\printglyph{V}|
% isn't.
% You can solve this by saving the slot number first and by using it
% later, for example:
%\begin{verbatim}
%\newcounter{slotV}%
%\saveslotnumber{slotV}{V}%
%A\char\arabic{slotV}
%\end{verbatim}
%    \begin{macrocode}
\newcommand*\printglyph[1]{%
  \expandafter\@saveslotnumber#1\@empty
  \char\the\c@@glyphslot
}
%    \end{macrocode}
% \end{macro}
% A help macro for comparing arguments with ``|-|''.
%    \begin{macrocode}
\edef\@minussign{-}%
%    \end{macrocode}
% Counters storing the slot numbers for the three glyphs used within
% one line of the |kerntable| environment.
%    \begin{macrocode}
\newcounter{@slota}
\newcounter{@slotb}
\newcounter{@slotc}
%    \end{macrocode}
% \begin{macro}{\testkern}
% The main macro of the class.
% It takes 5 arguments:\\
% \marg{glyph 1}\marg{kerning 1--2}\marg{glyph 2}\marg{kerning
% 2--3}\marg{glyph 3}.\\
% The glyphs are given by their number, not the glyphs itself.
%    \begin{macrocode}
\newcommand\testkern[5]{%
%    \end{macrocode}
% Save the kerning arguments globally because otherwise they got lost
% from tabular cell to tabular cell.
%    \begin{macrocode}
  \xdef\@kernlena{#2}%
  \xdef\@kernlenb{#4}%
%    \end{macrocode}
% Get the slot numbers for the three characters and save them in the
% counters |@slota|, |@slotb|, and |@slotc|.
%    \begin{macrocode}
  \saveslotnumber{@slota}{#1}%
  \ifnum\the\c@@slota<0%
    \ClassError{kerntest}{Used unknown glyph `#1'}{%
      You may have misspelled the glyph or you have taken an invalid
      number.}%
    \setcounter{@slota}{0}%
  \fi
  \saveslotnumber{@slotb}{#3}%
  \ifnum\the\c@@slotb<0%
    \ClassError{kerntest}{Used unknown glyph `#3'}{%
      You may have misspelled the glyph or you have taken an invalid
      number.}%
    \setcounter{@slotb}{0}%
  \fi
  \saveslotnumber{@slotc}{#5}%
  \ifnum\the\c@@slotc<0%
    \ClassError{kerntest}{Used unknown glyph `#5'}{%
      You may have misspelled the glyph or you have taken an invalid
      number.}%
    \setcounter{@slotc}{0}%
  \fi
%    \end{macrocode}
% Find out if there are old kerning data for one of the two glyph
% pairs.
%
% First pair.
%
% The better form of \cs{@ifundefined} that does not define its
% argument as side-effect.
%    \begin{macrocode}
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname kt@kerning@\getpsname{\the\c@@slota}@%
  \getpsname{\the\c@@slotb}\endcsname\relax
%    \end{macrocode}
% No old kerning.
% Thus don't do any kerning later.
%    \begin{macrocode}
    \gdef\oldkerna{}%
  \else
%    \end{macrocode}
% Old kerning exists.
% Save the old kerning to apply it later.
%    \begin{macrocode}
    \gdef\oldkerna{%
      \kern
      \csname kt@kerning@\getpsname{\the\c@@slota}@%
      \getpsname{\the\c@@slotb}\endcsname
      \psunit
    }%
%    \end{macrocode}
% If no new kerning ist given just tell the user that he reuses a
% kerning.
%    \begin{macrocode}
    \ifx\@kernlena\@minussign
      \typeout{Kerning pair for \getpsname{\the\c@@slota}-%
        \getpsname{\the\c@@slotb} reused (value
        \csname kt@kerning@\getpsname{\the\c@@slota}@%
        \getpsname{\the\c@@slotb}\endcsname).}%
    \else
%    \end{macrocode}
% Old kerning exists and new kerning, too.
% Test if the old and new kernings are identical.
%    \begin{macrocode}
      \ifnum\@kernlena=\csname kt@kerning@\getpsname{\the\c@@slota}@%
      \getpsname{\the\c@@slotb}\endcsname\relax
%    \end{macrocode}
% Yes.
% Nevertheless, generate a warning.
%    \begin{macrocode}
        \ClassWarning{kerntest}{Kerning for
          \getpsname{\the\c@@slota}-\getpsname{\the\c@@slotb}\MessageBreak
          repeated (value #2)}% 
      \else
%    \end{macrocode}
% No.
% Produce an erroe message.
%    \begin{macrocode}
        \ClassError{kerntest}{Conflicting kerning for
          \getpsname{\the\c@@slota}-\getpsname{\the\c@@slotb}\MessageBreak
          (new value #2 != old value
          \csname kt@kerning@\getpsname{\the\c@@slota}@%
          \getpsname{\the\c@@slotb}\endcsname)%
        }{% 
          You have given the kerning for the specified glyph pair
          twice with different\MessageBreak
          values. This may also appear when using glyph classes.
          You have to give the\MessageBreak
          kerning only once per glyph class.\MessageBreak
          You may leave out the second kerning pair, or you may
          give\MessageBreak
          the kerning `-'. Then, the old value is reused.
        }%
      \fi
    \fi
  \fi
%    \end{macrocode}
% Second pair.
%    \begin{macrocode}
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname kt@kerning@\getpsname{\the\c@@slotb}@%
  \getpsname{\the\c@@slotc}\endcsname\relax
    \gdef\oldkernb{}%
  \else
    \gdef\oldkernb{%
      \kern
      \csname kt@kerning@\getpsname{\the\c@@slotb}@%
      \getpsname{\the\c@@slotc}\endcsname
      \psunit
    }%
%
    \ifx\@kernlenb\@minussign
      \typeout{Kerning pair for \getpsname{\the\c@@slotb}-%
        \getpsname{\the\c@@slotc} reused (value
        \csname kt@kerning@\getpsname{\the\c@@slotb}@%
        \getpsname{\the\c@@slotc}\endcsname).}%
    \else
      \ifnum\@kernlenb=\csname kt@kerning@\getpsname{\the\c@@slotb}@%
      \getpsname{\the\c@@slotc}\endcsname\relax
        \ClassWarning{kerntest}{Kerning for
          \getpsname{\the\c@@slotb}-\getpsname{\the\c@@slotc}\MessageBreak
          repeated (value #4)}% 
      \else
        \ClassError{kerntest}{Conflicting kerning for
          \getpsname{\the\c@@slotb}-\getpsname{\the\c@@slotc}\MessageBreak
          (new value #4 != old value
          \csname kt@kerning@\getpsname{\the\c@@slotb}@%
          \getpsname{\the\c@@slotc}\endcsname)%
        }{% 
          You have given the kerning for the specified glyph pair
          twice with different\MessageBreak
          values. This may also appear when using glyph classes.
          You have to give the\MessageBreak
          kerning only once per glyph class.\MessageBreak
          You may leave out the second kerning pair, or you may
          give\MessageBreak
          the kerning `-'. Then, the old value is reused.
        }%
      \fi
    \fi
  \fi
%    \end{macrocode}
% First, type the slot number of glyph~2.
%    \begin{macrocode}
  \krntst@helpfont\getslotnumber{#3}%
  &
%    \end{macrocode}
% Type the postscript name of glyph~2.
%    \begin{macrocode}
  \krntst@helpfont\getpsname{\the\c@@slotb}%
  &
%    \end{macrocode}
% Print the three glyphs with original kerning.
%    \begin{macrocode}
  \char\the\c@@slota\char\c@@slotb\char\c@@slotc%
  &
%    \end{macrocode}
% Print glyph~1.
%    \begin{macrocode}
  \char\the\c@@slota%
%    \end{macrocode}
% If a kerning is given, apply it; otherwise do nothing.
%    \begin{macrocode}
  \ifx\@kernlena\@minussign
    \oldkerna
  \else
    \kern#2\psunit
  \fi
%    \end{macrocode}
% Print glyph~2.
%    \begin{macrocode}
  \char\the\c@@slotb%
%    \end{macrocode}
% If a kerning is given, apply it; otherwise do nothing.
%    \begin{macrocode}
  \ifx\@kernlenb\@minussign
    \oldkernb
  \else
    \kern#4\psunit
  \fi
%    \end{macrocode}
% Print glyph~3.
%    \begin{macrocode}
  \char\the\c@@slotc%
  &
%    \end{macrocode}
% Do the same as in columns 2 and 3, but twice at the same place.
% First, natural kerning.
%    \begin{macrocode}
  \color{oldcolor}%
  \makebox[0pt][l]{\char\the\c@@slota\char\the\c@@slotb\char\the\c@@slotc}%
%    \end{macrocode}
% Second, newly given kerning.
% Switch the color depending if a kerning has been given.
%    \begin{macrocode}
  \ifx\@kernlena\@minussign
    \ifthenelse{\equal{\oldkerna}{}}{}{\color{newcolor}}%
  \else
    \color{newcolor}%
  \fi
  \ifx\@kernlenb\@minussign
    \ifthenelse{\equal{\oldkernb}{}}{}{\color{newcolor}}%
  \else
    \color{newcolor}%
  \fi
  \char\the\c@@slota%
  \ifx\@kernlena\@minussign
    \oldkerna
  \else
    \kern#2\psunit
  \fi
  \char\the\c@@slotb%
  \ifx\@kernlenb\@minussign
    \oldkernb
  \else
    \kern#4\psunit
  \fi
  \char\the\c@@slotc%
  &
%    \end{macrocode}
% Get the value of the natural kerning.
% This has to be done with the tested font switched on to get the
% right values.
% This value is saved in \cs{kernlen} for later use.
%    \begin{macrocode}
  \getkern{\char\the\c@@slota}{\char\the\c@@slotb}%
%    \end{macrocode}
% Switch to the legend font.
%    \begin{macrocode}
  \krntst@helpfont
%    \end{macrocode}
% If no kerning is given (\marg{kerning 1--2}|=-|) print out the
% original kerning.
% The part \cs{ifdim}\ldots\cs{fi} adds a |-| if the kerning is
% negative.
% Together with the negative kerning, this gives a ``--'' instead of a
% ``-''.
%    \begin{macrocode}
  \ifx\@kernlena\@minussign
    \ifthenelse{\equal{\oldkerna}{}}{%
      \textcolor{oldcolor}{\small
        \ifdim\kernlen pt<0pt-\fi
        \ifdim\kernlen pt>0pt+\fi
        \kernlen}%
    }{%
      \ifnum\kernlen=0\relax
      \else
        \textcolor{oldcolor}{\small(%
          \ifdim\kernlen pt<0pt-\fi
          \ifdim\kernlen pt>0pt+\fi
          \kernlen)}%
      \fi
      ~\textcolor{newcolor}{\large
        \ifnum
        \csname kt@kerning@\getpsname{\the\c@@slota}@%
        \getpsname{\the\c@@slotb}\endcsname<0-\fi
        \csname kt@kerning@\getpsname{\the\c@@slota}@%
        \getpsname{\the\c@@slotb}\endcsname
        \makebox[0pt][l]{$^\ast$}%
      }%
    }%
%    \end{macrocode}
% Write old kerning to |mtx| file.
%    \begin{macrocode}
    \ifthenelse{\boolean{krntst@writeall}\and\not\equal{\kernlen}{0}}{%
      \writemtxkern[original kerning]{\the\c@@slota}{%
        \ifdim\kernlen pt>0pt+\fi\kernlen}{\the\c@@slotb}%
      }{}%
%    \end{macrocode}
% If a kerning is given print the new kerning (same trick with
% negative numbers).
%    \begin{macrocode}
  \else
%    \end{macrocode}
% If there were original kerning data, print the in parenthesis first.
%    \begin{macrocode}
    \ifdim\kernlen pt=0pt
    \else
      \textcolor{oldcolor}{\small(%
        \ifdim\kernlen pt<0pt-\fi
        \ifdim\kernlen pt>0pt+\fi
        \kernlen)}
    \fi
    \textcolor{newcolor}{\large
      \ifnum#2<0-\fi#2%
      \ifthenelse{\equal{\oldkerna}{}}{%
      }{\makebox[0mm][l]{$^\dagger$}}%
    }%
%    \end{macrocode}
% Write the new kerning information into the |mtx| file.
%    \begin{macrocode}
    \ifthenelse{\equal{\oldkerna}{}}{%
      \writemtxkern{\the\c@@slota}{#2}{\the\c@@slotb}%
    }{}%
  \fi
  &
%    \end{macrocode}
% Do the same for the second kerning pair.
%    \begin{macrocode}
  \getkern{\char\the\c@@slotb}{\char\the\c@@slotc}%
  \krntst@helpfont
  \ifx\@kernlenb\@minussign
    \ifthenelse{\equal{\oldkernb}{}}{%
      \textcolor{oldcolor}{\small
        \ifdim\kernlen pt<0pt-\fi
        \ifdim\kernlen pt>0pt+\fi
        \kernlen}%
    }{%
      \ifnum\kernlen=0\relax
      \else
        \textcolor{oldcolor}{\small(%
          \ifdim\kernlen pt<0pt-\fi
          \ifdim\kernlen pt>0pt+\fi
          \kernlen)}%
      \fi
      ~\textcolor{newcolor}{\large
        \ifnum
        \csname kt@kerning@\getpsname{\the\c@@slotb}@%
        \getpsname{\the\c@@slotc}\endcsname<0-\fi
        \csname kt@kerning@\getpsname{\the\c@@slotb}@%
        \getpsname{\the\c@@slotc}\endcsname
        \makebox[0pt][l]{$^\ast$}%
      }%
    }%
    \ifthenelse{\boolean{krntst@writeall}\and\not\equal{\kernlen}{0}}{%
      \writemtxkern[original kerning]{\the\c@@slotb}{%
        \ifdim\kernlen pt>0pt+\fi\kernlen}{\the\c@@slotc}%
    }{}%
  \else
    \ifdim\kernlen pt=0pt
    \else
      \textcolor{oldcolor}{\small(%
        \ifdim\kernlen pt<0pt-\fi
        \ifdim\kernlen pt>0pt+\fi
        \kernlen)}
    \fi
    \textcolor{newcolor}{\large
      \ifnum#4<0-\fi#4%
      \ifthenelse{\equal{\oldkernb}{}}{%
        }{\makebox[0mm][l]{$^\dagger$}}%
    }%
    \ifthenelse{\equal{\oldkernb}{}}{%
      \writemtxkern{\the\c@@slotb}{#4}{\the\c@@slotc}%
    }{}%
  \fi
  &
%    \end{macrocode}
% Print the example with natural kerning.
%    \begin{macrocode}
  \char\the\c@@slota\char\the\c@@slotb
  \krntst@example
  \char\the\c@@slotb\char\the\c@@slotc
  &
%    \end{macrocode}
% Print the example with new kerning.
%    \begin{macrocode}
  \char\the\c@@slota%
  \ifx\@kernlena\@minussign
  \else
    \kern#2\psunit
  \fi
  \char\the\c@@slotb\krntst@example\char\the\c@@slotb
  \ifx\@kernlenb\@minussign
  \else
    \kern#4\psunit
  \fi
  \char\the\c@@slotc%
  &
%    \end{macrocode}
% Switch to legend font for the comments that may appear.
%    \begin{macrocode}
  \krntst@helpfont\ignorespaces
}
%    \end{macrocode}
% \end{macro}
% \begin{environment}{kerntable}
% The kerning table environment.
%    \begin{macrocode}
\newenvironment{kerntable}{%
%    \end{macrocode}
% Switch to the tested font.
%    \begin{macrocode}
  \usefont{\krntst@encoding}{\krntst@family}{\krntst@series}{\krntst@shape}%
  \fontsize{\krntst@size}{\krntst@baselineskip}\selectfont%
%    \end{macrocode}
% Start a |longtable| environment for the kerning samples.
%    \begin{macrocode}
  \begin{longtable}[l]{@{}lll@{~}l@{~}l@{~}rrlll@{}}
%    \end{macrocode}
% Type the header of the table.
%    \begin{macrocode}
    \krntst@helpfont slot& 
    \krntst@helpfont name& 
    \krntst@helpfont orig&
    \krntst@helpfont new&
    \krntst@helpfont both&
    \krntst@helpfont k.\,1&
    \krntst@helpfont k.\,2&
    \krntst@helpfont orig.&
    \krntst@helpfont new&
    \krntst@helpfont comment\\
    \endhead
%    \end{macrocode}
% Repeat it as footer.
%    \begin{macrocode}
    \krntst@helpfont slot& 
    \krntst@helpfont name& 
    \krntst@helpfont orig&
    \krntst@helpfont new&
    \krntst@helpfont both&
    \krntst@helpfont k.\,1&
    \krntst@helpfont k.\,2&
    \krntst@helpfont orig.&
    \krntst@helpfont new&
    \krntst@helpfont comment\\
    \endfoot
  }{%
%    \end{macrocode}
% And now the end of the table.
%    \begin{macrocode}
  \end{longtable}%
  \ignorespacesafterend
}
%    \end{macrocode}
% \end{environment}
% \begin{macro}{\writemtxkern}
% \changes{1.32}{2004/04/14}{Speed up \cs{writemtxkern}}%
% \changes{1.10}{2004/04/06}{Handle optional comment}%
% Write an entry into the |mtx| file.
% This command copies double quotes to single quotes if requested
% (only if no optional argument is given).
%    \begin{macrocode}
\newif\if@tempswb
\newcommand\writemtxkern[4][\@empty]{%
%    \end{macrocode}
% Store the glyph names of both glyphs in \cs{@firstglyphname} and
% \cs{@secondglyphname}.
%    \begin{macrocode}
  \expandafter\@saveslotnumber#2\@empty
  \edef\@firstglyphname{\getpsname{\c@@glyphslot}}%
  \expandafter\@saveslotnumber#4\@empty
  \edef\@secondglyphname{\getpsname{\c@@glyphslot}}%
%    \end{macrocode}
% Test if a comment has been given. 
%    \begin{macrocode}
  \ifthenelse{\equal{#1}{\@empty}}{%
%    \end{macrocode}
% Get the corresponding glyph class for the first character and save
% it in \cs{rightkern}.
% If none, \cs{rightkern} is set to \cs{@empty}.
%    \begin{macrocode}
    \edef\rightkern{\getclassofglyph{right}{\@firstglyphname}}%
%    \end{macrocode}
% If the glyph is in no glyph class, make a temporary glyph class
% \cs{rightkern} which contains only this glyph.
% Define the comment \cs{textright} for the |mtx| file.
%    \begin{macrocode}
    \ifthenelse{\equal{\rightkern}{\@empty}}{%
      \edef\textright{./.}%
      \def\rightkern{@firstglyphname}%
    }{%
      \edef\textright{\expandafter\@getclassname\rightkern\@empty}%
    }%
%    \end{macrocode}
% Get the corresponding glyph class for the second character and save
% it in \cs{leftkern}.
% If none, \cs{leftkern} is set to \cs{@empty}.
%    \begin{macrocode}
    \edef\leftkern{\getclassofglyph{left}{\@secondglyphname}}%
%    \end{macrocode}
% If the glyph is in no glyph class, make a temporary glyph class
% \cs{leftkern} which contains only this glyph.
% Define the comment \cs{leftright} for the |mtx| file.
%    \begin{macrocode}
    \ifthenelse{\equal{\leftkern}{\@empty}}{%
      \edef\textleft{./.}%
      \def\leftkern{@secondglyphname}%
    }{%
      \edef\textleft{\expandafter\@getclassname\leftkern\@empty}%
    }%
%    \end{macrocode}
% Set the kernig data for all kerning pairs that can be found in both
% glyph classes \cs{rightkern} and \cs{leftkern}.
%    \begin{macrocode}
    \@tempswbtrue
    \@forallinclass{\rightkern}{first}{%
      \@forallinclass{\leftkern}{second}{%
%    \end{macrocode}
% Write the kerning data to the |mtx| file, but only for the first
% members of the glyph classes. 
% The others are set in the |mtx| file by \cs{setrightkerning} and
% \cs{setleftkerning}.
%    \begin{macrocode}
        \if@tempswb
          \protected@write\mtxfile{}{%
            \string\setkern
            {\first}{\second}{#3}%
            \@percentchar\space\space\textright\space-- \textleft
          }% protected@write
          \@tempswbfalse
        \fi
%    \end{macrocode}
% Define a command \cs{kt@kerning@\meta{first glyph}@\meta{second
% glyph}} that contains the kerning for later testing on conflicting
% values.
% Scale the kerning data according to the given values in
% \cs{defglyphclass}.
%    \begin{macrocode}
        \setcounter{@tmpscale}{#3*\first@scaling*\second@scaling/1000000}%
        \typeout{\first-\second: \the@tmpscale}%
        \expandafter\xdef\csname kt@kerning@\first @\second\endcsname{%
          \the@tmpscale}%
%        \expandafter\xdef\csname kt@kerning@\first @\second\endcsname{#3}%
      }% forallinclass second
    }% forallinclass first
  }{%
%    \end{macrocode}
% If an optional argument has been given, just write this kerning pair
% without any tests.
%    \begin{macrocode}
    \protected@write\mtxfile{}{%
      \string\setkern
      {\@firstglyphname}{\@secondglyphname}{#3}%
      \@percentchar\space\space #1%
    }%
%    \end{macrocode}
% Nevertheless, generate the command for testing on conflicting values.
%    \begin{macrocode}
    \expandafter\xdef
      \csname kt@kerning@\@firstglyphname@\@secondglyphname\endcsname{#3}%
  }%
}%
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Glyph classes}%
% \label{sec:glyphclasses}%
%
% \begin{macro}{\defglyphclass}
% The macro
% \cs{defglyphclass}\marg{side}\marg{name}\marg{glyphlist}
% defines a class of glyphs that have the same kerning on the same
% \meta{side} which has to be ``|left|'' or ``|right|''.
% \meta{name} is the name of the glyph class while \meta{glyphlist} is
% a comma-separated list of all glyphs that have the same kerning on
% their \meta{side} side.
%    \begin{macrocode}
\newcounter{@tmpscale}
\newcounter{@firstscale}
\newcommand\defglyphclass[3]{%
%    \end{macrocode}
% Do it at \cs{begin\{document\}} because otherwise it is not clear
% which encoding is used and thus the glyphs are not yet known.
%    \begin{macrocode}
  \AtBeginDocument{%
%    \end{macrocode}
% Test if a list of glyph classes exists for the chosen \meta{side}.
%    \begin{macrocode}
    \@ifundefined{glyphclasslist@#1}{%
%    \end{macrocode}
% No glyph class of the current \meta{side} has been defined, yet.
% Install a new one.
%    \begin{macrocode}
      \expandafter\def\csname glyphclasslist@#1\endcsname{%
        glyphclass@#1@#2}%
    }{%
%    \end{macrocode}
% The needed glyph-class list exists.
% Test if there is an old glyph class with the same name (\meta{side}
% and \meta{name}).
%    \begin{macrocode}
      \begingroup
      \@tempswatrue
      \forallclasses{#1}{@tmpcls}{%
        \ifthenelse{\equal{\@tmpcls}{glyphclass@#1@#2}}{%
          \@tempswafalse
        }{}%
      }%
%    \end{macrocode}
% If this is not the case, append the new glyph class to the glyph
% class list.
%    \begin{macrocode}
      \if@tempswa
        \expandafter\xdef\csname glyphclasslist@#1\endcsname{%
          \csname glyphclasslist@#1\endcsname,glyphclass@#1@#2}%
      \fi
      \endgroup
    }%
%    \end{macrocode}
% Define the macro \cs{glyphclass@\meta{side}@\meta{name}} that stores
% the \meta{glyphlist} for this glyph class.
% At this stage it is defined empty in order to avoid that error
% messages are generated for ``already used glyphs''.
%    \begin{macrocode}
    \expandafter\def\csname glyphclass@#1@#2\endcsname{}%
%    \end{macrocode}
% Store the new \meta{glyphlist} in a temporary variable
% \cs{tmpglyphclass}.
% To do this, all glyphs of the list are converted to Postscript glyph
% names and tested if they are valid.
% Also, it is tested if a glyph is contained double.
% \changes{1.32}{2004/04/14}{Speed up \cs{defglyphclass}}%
%    \begin{macrocode}
    \edef\@tempa{#3}%
    \@tempswbtrue
    \@forallinclass{@tempa}{@tmpglyph}{%
      \saveslotnumber{@glyphslot}{\@tmpglyph}%
      \ifnum\the\c@@glyphslot<0%
        \ClassError{kerntest}{Used unknown glyph `\@tmpglyph'}{%
          You may have misspelled the glyph or you have taken an invalid
          number.
          This incorrect glyph is ignored.}%
        \edef\thisglyphname{???}%
      \else
        \edef\thisglyphname{\getpsname{\the\c@@glyphslot}}%
        \if@tempswb
          \global\@tempswbfalse
          \setcounter{@firstscale}{\@tmpglyph@scaling}%
        \fi
        \setcounter{@tmpscale}{1000*\@tmpglyph@scaling/\the@firstscale}%
%    \end{macrocode}
% Now, it has to be tested if none of the glyphs of the new glyph list
% are in this or another list already.
% If so, generate an error message.
% Save the error state in \cs{@tempswa} to be able to add the glyph
% only if it is in no other glyph class.
%    \begin{macrocode}
        \@tempswatrue
        \forallclasses{#1}{@tmpcls}{%
          \@ifglyphinclass{\@tmpcls}{\@tmpglyph}{%
            \@tempswafalse
            \ClassError{kerntest}{Glyph `\@tmpglyph'
              (`\thisglyphname',\MessageBreak
              glyph class #1/#2) already\MessageBreak
              in glyph
              class (\expandafter\@getclassname\@tmpcls\@empty)%
            }{%
              Each glyph may only be once in one glyph class for
              each side.
            }%
          }{}%
        }%
%    \end{macrocode}
% Append this glyph to the current glyph list.
%    \begin{macrocode}
        \if@tempswa
          \ifthenelse{\equal{\csname glyphclass@#1@#2\endcsname}{}}{%
            \expandafter\edef\csname glyphclass@#1@#2\endcsname{%
              \thisglyphname[\the@tmpscale]}%
            \edef\firstglyphinclass{\thisglyphname}%
          }{%
            \expandafter\edef\csname glyphclass@#1@#2\endcsname{%
              \csname glyphclass@#1@#2\endcsname,%
              \thisglyphname[\the@tmpscale]}%
          }%
%    \end{macrocode}
% Generate a macro \cs{glyphclass@glyph@}\meta{glyphname} which saves
% the corresponding glyph class for each glyph for faster access.
%    \begin{macrocode}
          \expandafter\edef
          \csname glyphclass@glyph@#1@\thisglyphname\endcsname{%
            glyphclass@#1@#2}%
        \fi
      \fi
    }%
%    \end{macrocode}
% Some feedback.
%    \begin{macrocode}
    \typeout{Glyph class `#1/#2' (\csname glyphclass@#1@#2\endcsname)
      defined.}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\newglyphclass}
% The macro
% \cs{newglyphclass} works as \cs{defglyphclass} but defines a new
% glyph class.
% It produces an error if the class already exists.
%    \begin{macrocode}
\newcommand\newglyphclass[3]{%
%    \end{macrocode}
% Test if this glyph class already exists and generate an error
% message if so.
% If not, call \cs{defglyphclass} to save the new glyph class.
%    \begin{macrocode}
  \AtBeginDocument{%
    \@tempswatrue
    \forallclasses{#1}{@tmpcls}{%
      \ifthenelse{\equal{\@tmpcls}{glyphclass@#1@#2}}{%
        \ClassError{kerntest}{Class `#1/#2' already exists}{%
          The command is ignored.}%
        \@tempswafalse
      }{}%
    }%
    \if@tempswa
      \defglyphclass{#1}{#2}{#3}%
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\renewglyphclass}
% The macro
% \cs{renewglyphclass} works as \cs{newglyphclass} but redefines an
% existing one.
%    \begin{macrocode}
\newcommand\renewglyphclass[3]{%
%    \end{macrocode}
% Test if this glyph class does not exist and generate an error
% message if so.
% If it exists, call \cs{defglyphclass} to redefine the glyph class.
%    \begin{macrocode}
  \AtBeginDocument{%
    \@tempswafalse
    \forallclasses{#1}{@tmpcls}{%
      \ifthenelse{\equal{\@tmpcls}{glyphclass@#1@#2}}{%
        \@tempswatrue
      }{}%
    }%
    \if@tempswa
      \defglyphclass{#1}{#2}{#3}%
    \else
      \ClassError{kerntest}{Class `#1/#2' does not exists}{%
        The command is ignored.}%
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\provideglyphclass}
% The macro
% \cs{provideglyphclass} works as \cs{newglyphclass} but does only do
% its job if the glyph class does not exist right now.
%    \begin{macrocode}
\newcommand\provideglyphclass[3]{%
%    \end{macrocode}
% Test if this glyph class already exists.
% If not, call \cs{defglyphclass} to save the new glyph class.
%    \begin{macrocode}
  \AtBeginDocument{%
    \@tempswatrue
    \forallclasses{#1}{@tmpcls}{%
      \ifthenelse{\equal{\@tmpcls}{glyphclass@#1@#2}}{%
        \@tempswafalse
      }{}%
    }%
    \if@tempswa
      \defglyphclass{#1}{#2}{#3}%
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
% Type out the human readable name \meta{side}/\meta{name} for a glyph
% class, giving the name of the corresponding macro.
% No test on a correct name is made.
%    \begin{macrocode}
\def\@getclassname#1@#2@#3\@empty{#2/#3}
%    \end{macrocode}
% \begin{macro}{\getclassofglyph}
% Syntax: \cs{getclassofglyph}\marg{side}\marg{glyph name}.
%
% Return the name of the glyph class, that contains the argument.
% If it is not contained in any class, \cs{@empty} is returned.
% The glyph name has to be given as argument.
%    \begin{macrocode}
\newcommand*\getclassofglyph[2]{%
  \expandafter\ifx\csname glyphclass@glyph@#1@#2\endcsname\relax
    \@empty
  \else
    \csname glyphclass@glyph@#1@#2\endcsname
  \fi
}
%    \end{macrocode}
% \end{macro}
% An internal boolean for searching glyph classes.
%    \begin{macrocode}
\newif\if@glyphfound
%    \end{macrocode}
% \begin{macro}{\ifglyphinclass}
% \changes{1.32}{2004/04/14}{Speed up \cs{ifglyphinclass}}%
% Syntax:
% \cs{ifglyphinclass\marg{side}\marg{name}\marg{glyph}\marg{yes}\marg{no}}.
% Tests if the glyph \meta{glyph} is contained in the glyph class
% \meta{side}/\meta{name}.
% Depending on that, \meta{yes} or \meta{no} are executed.
% The work is done by \cs{@ifglyphinclass} described later.
%    \begin{macrocode}
\newcommand\ifglyphinclass[5]{%
  \@ifundefined{glyphclass@#1@#2}{%
    \ClassError{kerntest}{Glyph class #1/#2 not available}{}%
  }{%
    \edef\@tempa{#3}%
    \saveslotnumber{@tempcnta}{\@tempa}%
    \ifnum\the\c@@tempcnta<0%
      \ClassError{kerntest}{Used unknown glyph `#2'}{%
        You may have misspelled the glyph or you have taken an invalid
        number.}%
    \else
      \ifthenelse{\equal{glyphclass@#1@#2}{%
          \getclassofglyph{#1}{\getpsname{\the\c@@tempcnta}}}}{%
        #4%
      }{%
        #5%
      }%
    \fi
%    \@ifglyphinclass{glyphclass@#1@#2}{#3}{#4}{#5}%
  }%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@ifglyphinclass}
% \changes{1.32}{2004/04/14}{Speed up \cs{@ifglyphinclass}}%
% Syntax:
% \cs{@ifglyphinclass\marg{macro}\marg{glyph}\marg{yes}\marg{no}}.
% Tests if the glyph \meta{glyph} is contained in the glyph class
% with the macro name \cs{\meta{macro}}.
% Depending on that, \meta{yes} or \meta{no} are executed.
%    \begin{macrocode}
\newcounter{@tempcnta}
\newcommand\@ifglyphinclass[4]{%
  \@ifundefined{#1}{%
    \ClassError{kerntest}{Glyph class #1 not available}{}%
  }{%
%    \end{macrocode}
% Extract the name of the side from the class macro name.
%    \begin{macrocode}
    \def\krntst@side##1@##2@##3\@empty{\edef\krntst@side{##2}}%
    \expandafter\krntst@side#1\@empty
%    \end{macrocode}
% Extract the name of the side from the class macro name.
%    \begin{macrocode}
    \edef\@tempa{#2}%
%    \end{macrocode}
% Find out if the glyph is valid.
%    \begin{macrocode}
    \saveslotnumber{@tempcnta}{\@tempa}%
    \ifnum\the\c@@tempcnta<0\relax
      \ClassError{kerntest}{Used unknown glyph `#2'}{%
        You may have misspelled the glyph or you have taken an invalid
        number.}%
    \else
%    \end{macrocode}
% Test if the corrosponding class to the glyph is the requested one.
%    \begin{macrocode}
      \ifthenelse{\equal{#1}{%
          \getclassofglyph{\krntst@side}{\getpsname{\the\c@@tempcnta}}}}{%
        #3%
      }{%
        #4%
      }%
    \fi
  }%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\forallinclasses}
% Syntax:
% \cs{forallinclass\marg{side}\marg{name}\marg{glyph}\marg{action}}
%
% The commands in \meta{action} are executed once for every glyph of
% the glyph class \meta{side}/\meta{name}.
% In each run, the specific glyph is stored in the macro
% \cs{\meta{glyph}} which has to be given without leading backslash.
% This routine can be nested if \meta{glyph} is different for both
% layers, e.g.,
%\begin{verbatim}
%\forallinclass{left}{H}{outer}{%
%  \forallinclass{left}{H}{inner}{%
%    glyph pair: ``\outer''--``\inner''\\
%  }%
%}
%\end{verbatim}
%    \begin{macrocode}
\newcommand\forallinclass[4]{%
  \@forallinclass{glyphclass@#1@#2}{#3}{#4}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@forallinclasses}
% Syntax:
% \cs{@forallinclass\marg{macro}\marg{glyph}\marg{action}}
%
% The internal command for \cs{forallinclasses}.
% Takes the macro name for the glyph class instead of the side and the
% name.
%    \begin{macrocode}
\newcommand\@forallinclass[3]{%
%    \end{macrocode}
% Redefine \cs{stoploop} to use the current glyph variable as default.
%    \begin{macrocode}
  \renewcommand\stoploop[1][#2]{%
    \expandafter\edef\csname ##1\endcsname{}%
  }%
%    \end{macrocode}
% Get the first glyph of the glyph list. 
% It is stored in \cs{\meta{glyph}}.
%    \begin{macrocode}
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname #1\endcsname\relax
    \edef\kt@tempa{}%
  \else
    \edef\kt@tempa{\csname #1\endcsname}%
  \fi
  \expandafter\@nextglyphinclass\kt@tempa,\@empty{#2}%
%    \end{macrocode}
% If this glyph is not empty, the end of the glyph class has not been
% reached.
% Then, enter the loop.
%    \begin{macrocode}
  \whiledo{\not\equal{\csname #2\endcsname}{}}{%
%    \end{macrocode}
% Execute the loop commands.
%    \begin{macrocode}
    #3%
%    \end{macrocode}
% Get the next glyph of the glyph list. 
% It is stored in \cs{\meta{glyph}}.
% The if clause is necessary to handle \cs{stoploop}.
%    \begin{macrocode}
    \ifthenelse{\equal{\csname #2\endcsname}{}}{%
    }{%
      \edef\kt@tempa{\csname #2@rest\endcsname}%
      \expandafter\@nextglyphinclass\kt@tempa,\@empty{#2}%
    }%
  }%
}  
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@nextglyphinclass}
% Everything before the first comma in the list is the next glyph in
% the glyph class.
% Store it in the macro given at the end of the argument list
% (\cs{\meta{\#3}}.
% Store the rest of the glyph class in \cs{\meta{\#3}@rest} for later
% work on it.
%    \begin{macrocode}
\def\@@parseglyphname#1[#2]#3\@empty#4{%
  \expandafter\edef\csname#4\endcsname{#1}%
  \expandafter\xdef\csname#4@scaling\endcsname{#2}%
%  \typeout{--> `#1' mit [\csname #4@scaling\endcsname], ignoriert: `#3', Name: `#4'}%
}
\def\@nextglyphinclass#1,#2\@empty#3{%
  \expandafter\edef\csname#3@rest\endcsname{#2}%
  \expandafter\@@parseglyphname#1[1000]\@empty{#3}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\forallclasses}
% Syntax:
% \cs{forallclasses\marg{side}\marg{glyph class}\marg{action}}
%
% The commands in \meta{action} are executed once for every glyph
% class of the glyph-class list \meta{side}.
% In each run, the specific glyph class is stored in the macro
% \cs{\meta{glyph class}} which has to be given without leading
% backslash.
% This routine can be nested if \meta{glyph class} is different for both
% layers.
% (Same as \cs{forallinclass}).
%    \begin{macrocode}
\newcommand\forallclasses[3]{%
  \renewcommand\stoploop[1][#2]{%
    \expandafter\edef\csname ##1\endcsname{}%
  }%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname glyphclasslist@#1\endcsname\relax
  \edef\kt@tempa{}%
  \else
    \edef\kt@tempa{\csname glyphclasslist@#1\endcsname}%
  \fi
  \expandafter\@nextclass\kt@tempa,\@empty{#2}%
  \whiledo{\not\equal{\csname #2\endcsname}{}}{%
    #3%
    \ifthenelse{\equal{\csname #2\endcsname}{}}{%
    }{%
      \edef\kt@tempa{\csname #2@rest\endcsname}%
      \expandafter\@nextclass\kt@tempa,\@empty{#2}%
    }%
  }%
}  
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\stoploop}
% Stops the execution of \cs{forallclasses} or \cs{forallinclass}.
% The optional argument gives the stop variable.
% By this, also the outer loop can be stopped from the inner one.
%    \begin{macrocode}
\newcommand\stoploop[1][]{%
  \expandafter\edef\csname #1\endcsname{}%
}
%    \end{macrocode}
% \end{macro}
% \begin{macro}{\@nextglyphinclass}
% Everything before the first comma in the list is the next glyph
% class in the glyph-class list.
% Store it in the macro given at the end of the argument list
% (\cs{\meta{\#3}}.
% Store the rest of the glyph-class list in \cs{\meta{\#3}@rest} for
% later work on it.
%    \begin{macrocode}
\def\@nextclass#1,#2\@empty#3{%
  \expandafter\edef\csname #3@rest\endcsname{#2}%
  \expandafter\edef\csname #3\endcsname{#1}%
}
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{Extra commands for special encodings}
%
% Setup command for the different encodings.
%    \begin{macrocode}
\newcommand\encodingsetup[1]{%
  \AtBeginDocument{%
    \typeout{Setup for font encoding. 
      This differs from encoding to encoding.}%
    \setkeys{krnenc}{#1}%
  }%
}
\@onlypreamble\encodingsetup
%    \end{macrocode}
%
% \subsection{Footer of \texttt{mtx} file}
%
%
% Write a footer to the |mtx| file.
% This is done as last action of the class in order to ensure that all
% other things have been done before.
%    \begin{macrocode}
\AtEndDocument{%
%    \end{macrocode}
% First, write the kerning data for the glyph classes.
%    \begin{macrocode}
  \typeout{Writing kerning factors for glyph classes to mtx file}%
  \protected@write\mtxfile{}{\@percentchar\@percentchar}%
  \protected@write\mtxfile{}{\@percentchar\@percentchar\space
    Kerning factors for the different glyph classes.}%
  \protected@write\mtxfile{}{\@percentchar\@percentchar}%
%    \end{macrocode}
% Define a command that does the output for the different sides.
%    \begin{macrocode}
  \def\@writeclass#1{%
    \forallclasses{#1}{@tmpcls}{%
      \typeout{\space\space for class 
        \expandafter\@getclassname\@tmpcls\@empty}%
%    \end{macrocode}
% The first glyph is the referent glyph of the class.
% If the inner loop is executed the first time, set
% \cs{firstglyphinclass} to this value.
%    \begin{macrocode}
      \@tempswatrue
      \@forallinclass{\@tmpcls}{@tmpglyph}{%
        \if@tempswa
          \edef\firstglyphinclass{\@tmpglyph}%
          \@tempswafalse
        \else
%    \end{macrocode}
% For the other members of this class, write the
% \cs{set\meta{side}kerning} commands to the |mtx| file.
%    \begin{macrocode}
          \protected@write\mtxfile{}{%
            \string\set#1kerning%
            {\@tmpglyph}{\firstglyphinclass}{\@tmpglyph@scaling}%
            \@percentchar\space\space 
            \expandafter\@getclassname\@tmpcls\@empty
          }%
        \fi
      }%
    }%
  }%
%    \end{macrocode}
% The sides |left| and |right| are defined.
%    \begin{macrocode}
  \@writeclass{left}%
  \protected@write\mtxfile{}{\@percentchar\@percentchar}%
  \@writeclass{right}%
%    \end{macrocode}
% Write a real footer.
%    \begin{macrocode}
  \protected@write\mtxfile{}{\@percentchar\@percentchar}%
  \protected@write\mtxfile{}{\string\endmetrics}%
  \protected@write\mtxfile{}{\@percentchar\@percentchar}%
  \protected@write\mtxfile{}{\@percentchar\@percentchar\space
    End of file `\mtxfilename.mtx'.}%
  \closeout\mtxfile
  \typeout{^^JWritten mtx file `\mtxfilename.mtx'^^J}%
}
%</class>
%    \end{macrocode}
%
%
% \subsection{Class option files}
%
% To be able to write correct |mtx| files, the class has to know which
% glyph number has which Postscript name.
% This is done by the \cs{getpsname} macro which depends on the used
% encoding.
% This is done by loading different class option files.
% 
% \subsubsection{T1 encoding}
%
% The |T1| encoding.
% The data are taken from |t1.etx|.
%    \begin{macrocode}
%<*mtx&t1>
\makeatletter
%    \end{macrocode}
% Set options to switch to other font shapes.
%    \begin{macrocode}
\define@key{krnenc}{ligaturing}[1]{%
  \typeout{T1 encoding: ligaturing = #1}%
  \ifnum#1<0\relax
    \expandafter\def\csname krntst@T1@027\endcsname{.notdef.027}%
    \expandafter\def\csname krntst@T1@028\endcsname{.notdef.028}%
    \expandafter\def\csname krntst@T1@029\endcsname{.notdef.029}%
    \expandafter\def\csname krntst@T1@030\endcsname{.notdef.030}%
    \expandafter\def\csname krntst@T1@031\endcsname{.notdef.031}%
    \expandafter\def\csname krntst@T1@156\endcsname{.notdef.156}%
    \expandafter\def\csname krntst@T1@188\endcsname{.notdef.188}%
  \else
    \expandafter\def\csname krntst@T1@027\endcsname{ff}%
    \expandafter\def\csname krntst@T1@028\endcsname{fi}%
    \expandafter\def\csname krntst@T1@029\endcsname{fl}%
    \expandafter\def\csname krntst@T1@030\endcsname{ffi}%
    \expandafter\def\csname krntst@T1@031\endcsname{ffl}%
    \expandafter\def\csname krntst@T1@156\endcsname{IJ}%
    \expandafter\def\csname krntst@T1@188\endcsname{ij}%
  \fi
  \ifnum#1<-1\relax
    \expandafter\def\csname krntst@T1@073\endcsname{.notdef.073}%
    \expandafter\def\csname krntst@T1@099\endcsname{.notdef.099}%
    \expandafter\def\csname krntst@T1@102\endcsname{.notdef.102}%
    \expandafter\def\csname krntst@T1@105\endcsname{.notdef.105}%
    \expandafter\def\csname krntst@T1@115\endcsname{.notdef.115}%
  \else
    \expandafter\def\csname krntst@T1@073\endcsname{I}%
    \expandafter\def\csname krntst@T1@099\endcsname{c}%
    \expandafter\def\csname krntst@T1@102\endcsname{f}%
    \expandafter\def\csname krntst@T1@105\endcsname{i}%
    \expandafter\def\csname krntst@T1@115\endcsname{s}%
  \fi
}
\typeout{^^JValid values for T1 encoding:}%
\typeout{ligaturing: -2, -1, 0, 1}%
\typeout{Defaults for T1 encoding:}%
\setkeys{krnenc}{ligaturing=1}%
\typeout{}%
\makeatother
%    \end{macrocode}
% Now, set \cs{getpsname}.
%    \begin{macrocode}
\newcommand\getpsname[1]{%
  \ifcase#1%
  grave\or% 000
  acute\or% 001
  circumflex\or% 002
  tilde\or% 003
  dieresis\or% 004
  hungarumlaut\or% 005
  ring\or% 006
  caron\or% 007
  breve\or% 008
  macron\or% 009
  dotaccent\or% 010
  cedilla\or% 011
  ogonek\or% 012
  quotesinglbase\or% 013
  guilsinglleft\or% 014
  guilsinglright\or% 015
  quotedblleft\or% 016
  quotedblright\or% 017
  quotedblbase\or% 018
  guillemotleft\or% 019
  guillemotright\or% 020
  rangedash\or% 021
  punctdash\or% 022
  compwordmark\or% 023
  perthousandzero\or% 024
  dotlessi\or% 025
  dotlessj\or% 026
  \csname krntst@T1@027\endcsname\or % 027
  \csname krntst@T1@028\endcsname\or % 028
  \csname krntst@T1@029\endcsname\or % 029
  \csname krntst@T1@030\endcsname\or % 030
  \csname krntst@T1@031\endcsname\or % 031
  visiblespace\or% 032
  exclam\or% 033
  quotedbl\or% 034
  numbersign\or% 035
  dollar\or% 036
  percent\or% 037
  ampersand\or% 038
  quoteright\or% 039
  parenleft\or% 040
  parenright\or% 041
  asterisk\or% 042
  plus\or% 043
  comma\or% 044
  hyphen\or% 045
  period\or% 046
  slash\or% 047
  zero\or% 048
  one\or% 049
  two\or% 050
  three\or% 051
  four\or% 052
  five\or% 053
  six\or% 054
  seven\or% 055
  eight\or% 056
  nine\or% 057
  colon\or% 058
  semicolon\or% 059
  less\or% 060
  equal\or% 061
  greater\or% 062
  question\or% 063
  at\or% 064
  A\or% 065
  B\or% 066
  C\or% 067
  D\or% 068
  E\or% 069
  F\or% 070
  G\or% 071
  H\or% 072
  \csname krntst@T1@073\endcsname\or % 073
  J\or% 074
  K\or% 075
  L\or% 076
  M\or% 077
  N\or% 078
  O\or% 079
  P\or% 080
  Q\or% 081
  R\or% 082
  S\or% 083
  T\or% 084
  U\or% 085
  V\or% 086
  W\or% 087
  X\or% 088
  Y\or% 089
  Z\or% 090
  bracketleft\or% 091
  backslash\or% 092
  bracketright\or% 093
  asciicircum\or% 094
  underscore\or% 095
  quoteleft\or% 096
  a\or% 097
  b\or% 098
  \csname krntst@T1@099\endcsname\or % 099
  d\or% 100
  e\or% 101
  \csname krntst@T1@102\endcsname\or % 102
  g\or% 103
  h\or% 104
  \csname krntst@T1@105\endcsname\or % 105
  j\or% 106
  k\or% 107
  l\or% 108
  m\or% 109
  n\or% 110
  o\or% 111
  p\or% 112
  q\or% 113
  r\or% 114
  \csname krntst@T1@115\endcsname\or % 115
  t\or% 116
  u\or% 117
  v\or% 118
  w\or% 119
  x\or% 120
  y\or% 121
  z\or% 122
  braceleft\or% 123
  bar\or% 124
  braceright\or% 125
  asciitilde\or% 126
  hyphenchar\or% 127
  Abreve\or% 128
  Aogonek\or% 129
  Cacute\or% 130
  Ccaron\or% 131
  Dcaron\or% 132
  Ecaron\or% 133
  Eogonek\or% 134
  Gbreve\or% 135
  Lacute\or% 136
  Lcaron\or% 137
  Lslash\or% 138
  Nacute\or% 139
  Ncaron\or% 140
  Ng\or% 141
  Ohungarumlaut\or% 142
  Racute\or% 143
  Rcaron\or% 144
  Sacute\or% 145
  Scaron\or% 146
  Scedilla\or% 147
  Tcaron\or% 148
  Tcedilla\or% 149
  Uhungarumlaut\or% 150
  Uring\or% 151
  Ydieresis\or% 152
  Zacute\or% 153
  Zcaron\or% 154
  Zdotaccent\or% 155
  \csname krntst@T1@156\endcsname\or % 156
  Idotaccent\or% 157
  dbar\or% 158
  section\or% 159
  abreve\or% 160
  aogonek\or% 161
  cacute\or% 162
  ccaron\or% 163
  dcaron\or% 164
  ecaron\or% 165
  eogonek\or% 166
  gbreve\or% 167
  lacute\or% 168
  lcaron\or% 169
  lslash\or% 170
  nacute\or% 171
  ncaron\or% 172
  ng\or% 173
  ohungarumlaut\or% 174
  racute\or% 175
  rcaron\or% 176
  sacute\or% 177
  scaron\or% 178
  scedilla\or% 179
  tcaron\or% 180
  tcedilla\or% 181
  uhungarumlaut\or% 182
  uring\or% 183
  ydieresis\or% 184
  zacute\or% 185
  zcaron\or% 186
  zdotaccent\or% 187
  \csname krntst@T1@188\endcsname\or % 188
  exclamdown\or% 189
  questiondown\or% 190
  sterling\or% 191
  Agrave\or% 192
  Aacute\or% 193
  Acircumflex\or% 194
  Atilde\or% 195
  Adieresis\or% 196
  Aring\or% 197
  AE\or% 198
  Ccedilla\or% 199
  Egrave\or% 200
  Eacute\or% 201
  Ecircumflex\or% 202
  Edieresis\or% 203
  Igrave\or% 204
  Iacute\or% 205
  Icircumflex\or% 206
  Idieresis\or% 207
  Eth\or% 208
  Ntilde\or% 209
  Ograve\or% 210
  Oacute\or% 211
  Ocircumflex\or% 212
  Otilde\or% 213
  Odieresis\or% 214
  OE\or% 215
  Oslash\or% 216
  Ugrave\or% 217
  Uacute\or% 218
  Ucircumflex\or% 219
  Udieresis\or% 220
  Yacute\or% 221
  Thorn\or% 222
  SS\or% 223
  agrave\or% 224
  aacute\or% 225
  acircumflex\or% 226
  atilde\or% 227
  adieresis\or% 228
  aring\or% 229
  ae\or% 230
  ccedilla\or% 231
  egrave\or% 232
  eacute\or% 233
  ecircumflex\or% 234
  edieresis\or% 235
  igrave\or% 236
  iacute\or% 237
  icircumflex\or% 238
  idieresis\or% 239
  eth\or% 240
  ntilde\or% 241
  ograve\or% 242
  oacute\or% 243
  ocircumflex\or% 244
  otilde\or% 245
  odieresis\or% 246
  oe\or% 247
  oslash\or% 248
  ugrave\or% 249
  uacute\or% 250
  ucircumflex\or% 251
  udieresis\or% 252
  yacute\or% 253
  thorn\or% 254
  germandbls\fi% 255
}
%</mtx&t1>
%    \end{macrocode}
%
% \subsubsection{TS1 encoding}
%
% The |TS1| encoding.
% The data are taken from |ts1.etx|.
%
% For unknown slots, a strange Postscript name is returned, but no
% warning is generated.
%    \begin{macrocode}
%<*mtx&ts1>
\newcommand\getpsname[1]{%
  \ifcase#1%
  capitalgrave\or% 000
  capitalacute\or% 001
  capitalcircumflex\or% 002
  capitaltilde\or% 003
  capitaldieresis\or% 004
  capitalhungarumlaut\or% 005
  capitalring\or% 006
  capitalcaron\or% 007
  capitalbreve\or% 008
  capitalmacron\or% 009
  capitaldotaccent\or% 010
  cedilla\or% 011
  ogonek\or% 012
  quotesinglbase\or% 013
  .notdef.014\or% 014
  .notdef.015\or% 015
  .notdef.016\or% 016
  .notdef.017\or% 017
  quotedblbase\or% 018
  .notdef.019\or% 019
  .notdef.020\or% 020
  twelveudash\or% 021
  threequartersemdash\or% 022
  capitalcompwordmark\or% 023
  arrowleft\or% 024
  arrowright\or% 025
  tieaccentlowercase\or% 026
  tieaccentcapital\or% 027
  newtieaccentlowercase\or% 028
  newtieaccentcapital\or% 029
  ascendercompwordmark\or% 030
  blank\or% 031
  .notdef.032\or% 032
  .notdef.033\or% 033
  .notdef.034\or% 034
  .notdef.035\or% 035
  dollar\or% 036
  .notdef.037\or% 037
  .notdef.038\or% 038
  quotesingle\or% 039
  .notdef.040\or% 040
  .notdef.041\or% 041
  asteriskcentered\or% 042
  .notdef.043\or% 043
  comma\or% 044
  hyphendbl\or% 045
  period\or% 046
  fraction\or% 047
  zerooldstyle\or% 048
  oneoldstyle\or% 049
  twooldstyle\or% 050
  threeoldstyle\or% 051
  fouroldstyle\or% 052
  fiveoldstyle\or% 053
  sixoldstyle\or% 054
  sevenoldstyle\or% 055
  eightoldstyle\or% 056
  nineoldstyle\or% 057
  .notdef.058\or% 058
  .notdef.059\or% 059
  angbracketleft\or% 060
  minus\or% 061
  angbracketright\or% 062
  .notdef.063\or% 063
  .notdef.064\or% 064
  .notdef.065\or% 065
  .notdef.066\or% 066
  .notdef.067\or% 067
  .notdef.068\or% 068
  .notdef.069\or% 069
  .notdef.070\or% 070
  .notdef.071\or% 071
  .notdef.072\or% 072
  .notdef.073\or% 073
  .notdef.074\or% 074
  .notdef.075\or% 075
  .notdef.076\or% 076
  Omegainv\or% 077
  .notdef.078\or% 078
  bigcircle\or% 079
  .notdef.080\or% 080
  .notdef.081\or% 081
  .notdef.082\or% 082
  .notdef.083\or% 083
  .notdef.084\or% 084
  .notdef.085\or% 085
  .notdef.086\or% 086
  Omega\or% 087
  .notdef.088\or% 088
  .notdef.089\or% 089
  .notdef.090\or% 090
  openbracketleft\or% 091
  .notdef.092\or% 092
  openbracketright\or% 093
  arrowup\or% 094
  arrowdown\or% 095
  asciigrave\or% 096
  .notdef.097\or% 097
  born\or% 098
  divorced\or% 099
  died\or% 100
  .notdef.101\or% 101
  .notdef.102\or% 102
  .notdef.103\or% 103
  .notdef.104\or% 104
  .notdef.105\or% 105
  .notdef.106\or% 106
  .notdef.107\or% 107
  leaf\or% 108
  married\or% 109
  musicalnote\or% 110
  .notdef.111\or% 111
  .notdef.112\or% 112
  .notdef.113\or% 113
  .notdef.114\or% 114
  .notdef.115\or% 115
  .notdef.116\or% 116
  .notdef.117\or% 117
  .notdef.118\or% 118
  .notdef.119\or% 119
  .notdef.120\or% 120
  .notdef.121\or% 121
  .notdef.122\or% 122
  .notdef.123\or% 123
  .notdef.124\or% 124
  .notdef.125\or% 125
  tildelow\or% 126
  hyphendblchar\or% 127
  asciibreve\or% 128
  asciicaron\or% 129
  asciiacutedbl\or% 130
  asciigravedbl\or% 131
  dagger\or% 132
  daggerdbl\or% 133
  bardbl\or% 134
  perthousand\or% 135
  bullet\or% 136
  centigrade\or% 137
  dollaroldstyle\or% 138
  centoldstyle\or% 139
  florin\or% 140
  colonmonetary\or% 141
  won\or% 142
  naira\or% 143
  guarani\or% 144
  peso\or% 145
  lira\or% 146
  recipe\or% 147
  interrobang\or% 148
  interrobangdown\or% 149
  dong\or% 150
  trademark\or% 151
  pertenthousand\or% 152
  pilcrow\or% 153
  baht\or% 154
  numero\or% 155
  discount\or% 156
  estimated\or% 157
  openbullet\or% 158
  servicemark\or% 159
  quillbracketleft\or% 160
  quillbracketright\or% 161
  cent\or% 162
  sterling\or% 163
  currency\or% 164
  yen\or% 165
  brokenbar\or% 166
  section\or% 167
  asciidieresis\or% 168
  copyright\or% 169
  ordfeminine\or% 170
  copyleft\or% 171
  logicalnot\or% 172
  circledP\or% 173
  registered\or% 174
  asciimacron\or% 175
  degree\or% 176
  plusminus\or% 177
  twosuperior\or% 178
  threesuperior\or% 179
  asciiacute\or% 180
  mu\or% 181
  paragraph\or% 182
  periodcentered\or% 183
  referencemark\or% 184
  onesuperior\or% 185
  ordmasculine\or% 186
  radical\or% 187
  onequarter\or% 188
  onehalf\or% 189
  threequarters\or% 190
  euro\or% 191
  .notdef.192\or% 192
  .notdef.193\or% 193
  .notdef.194\or% 194
  .notdef.195\or% 195
  .notdef.196\or% 196
  .notdef.197\or% 197
  .notdef.198\or% 198
  .notdef.199\or% 199
  .notdef.200\or% 200
  .notdef.201\or% 201
  .notdef.202\or% 202
  .notdef.203\or% 203
  .notdef.204\or% 204
  .notdef.205\or% 205
  .notdef.206\or% 206
  .notdef.207\or% 207
  .notdef.208\or% 208
  .notdef.209\or% 209
  .notdef.210\or% 210
  .notdef.211\or% 211
  .notdef.212\or% 212
  .notdef.213\or% 213
  multiply\or% 214
  .notdef.215\or% 215
  .notdef.216\or% 216
  .notdef.217\or% 217
  .notdef.218\or% 218
  .notdef.219\or% 219
  .notdef.220\or% 220
  .notdef.221\or% 221
  .notdef.222\or% 222
  .notdef.223\or% 223
  .notdef.224\or% 224
  .notdef.225\or% 225
  .notdef.226\or% 226
  .notdef.227\or% 227
  .notdef.228\or% 228
  .notdef.229\or% 229
  .notdef.230\or% 230
  .notdef.231\or% 231
  .notdef.232\or% 232
  .notdef.233\or% 233
  .notdef.234\or% 234
  .notdef.235\or% 235
  .notdef.236\or% 236
  .notdef.237\or% 237
  .notdef.238\or% 238
  .notdef.239\or% 239
  .notdef.240\or% 240
  .notdef.241\or% 241
  .notdef.242\or% 242
  .notdef.243\or% 243
  .notdef.244\or% 244
  .notdef.245\or% 245
  divide\or% 246
  .notdef.247\or% 247
  .notdef.248\or% 248
  .notdef.249\or% 249
  .notdef.250\or% 250
  .notdef.251\or% 251
  .notdef.252\or% 252
  .notdef.253\or% 253
  .notdef.254\or% 254
  .notdef.255\fi% 255
}
%</mtx&ts1>
%    \end{macrocode}
%
% \subsubsection{OT1 encoding}
%
% The |OT1| encoding.
% The data are taken from |ot1.etx|.
%
% For unknown slots, a strange Postscript name is returned, but no
% warning is generated.
%
% The OT1 encoding uses different font names depending on
% upright/italic and ligatures.
% This is handled using the \cs{OT1@}\meta{slot} commands that are set
% for an upright roman font by default.
%
% Set the default glyph names.
%    \begin{macrocode}
%<*mtx&ot1>
\makeatletter
%    \end{macrocode}
% Set options to switch to other font shapes.
%    \begin{macrocode}
\define@key{krnenc}{ligaturing}[2]{%
  \typeout{OT1 encoding: ligaturing = #1}%
  \ifnum#1=2\relax
    \expandafter\def\csname krntst@OT1@011\endcsname{ff}%
    \expandafter\def\csname krntst@OT1@012\endcsname{fi}%
    \expandafter\def\csname krntst@OT1@013\endcsname{fl}%
    \expandafter\def\csname krntst@OT1@014\endcsname{ffi}%
    \expandafter\def\csname krntst@OT1@015\endcsname{ffl}%
    \expandafter\def\csname krntst@OT1@060\endcsname{exclamdown}%
    \expandafter\def\csname krntst@OT1@062\endcsname{questiondown}%
  \else
    \expandafter\def\csname krntst@OT1@011\endcsname{arrowup}%
    \expandafter\def\csname krntst@OT1@012\endcsname{arrowdown}%
    \expandafter\def\csname krntst@OT1@013\endcsname{quotesingle}%
    \expandafter\def\csname krntst@OT1@014\endcsname{exclamdown}%
    \expandafter\def\csname krntst@OT1@015\endcsname{questiondown}%
    \expandafter\def\csname krntst@OT1@060\endcsname{less}%
    \expandafter\def\csname krntst@OT1@062\endcsname{greater}%
  \fi
  \ifnum#1=0\relax
    \expandafter\def\csname krntst@OT1@032\endcsname{visiblespace}%
    \expandafter\def\csname krntst@OT1@034\endcsname{quotedbl}%
    \expandafter\def\csname krntst@OT1@092\endcsname{backslash}%
    \expandafter\def\csname krntst@OT1@095\endcsname{underscore}%
    \expandafter\def\csname krntst@OT1@123\endcsname{braceleft}%
    \expandafter\def\csname krntst@OT1@124\endcsname{bar}%
    \expandafter\def\csname krntst@OT1@125\endcsname{braceright}%
  \else
    \expandafter\def\csname krntst@OT1@032\endcsname{lslashslash}%
    \expandafter\def\csname krntst@OT1@034\endcsname{quotedblright}%
    \expandafter\def\csname krntst@OT1@092\endcsname{quotedblleft}%
    \expandafter\def\csname krntst@OT1@095\endcsname{dotaccent}%
    \expandafter\def\csname krntst@OT1@123\endcsname{rangedash}%
    \expandafter\def\csname krntst@OT1@124\endcsname{punctdash}%
    \expandafter\def\csname krntst@OT1@125\endcsname{hungarumlaut}%
  \fi
}
\define@key{krnenc}{italicizing}[true]{%
  \typeout{OT1 encoding: italicizing = #1}%
  \csname if#1\endcsname
    \expandafter\def\csname krntst@OT1@036\endcsname{sterling}%
  \else
    \expandafter\def\csname krntst@OT1@036\endcsname{dollar}
  \fi
}
\typeout{^^JValid values for OT1 encoding:}%
\typeout{ligaturing: 0, 1, 2}%
\typeout{italicizing: false, true}%
\typeout{Defaults for OT1 encoding:}%
\setkeys{krnenc}{ligaturing=2,italicizing=false}%
\typeout{}%
\makeatother
%    \end{macrocode}
% Now, set \cs{getpsname}.
%    \begin{macrocode}
\newcommand\getpsname[1]{%
  \ifcase#1%
  Gamma\or % 000
  Delta\or % 001
  Theta\or % 002
  Lambda\or % 003
  Xi\or % 004
  Pi\or % 005
  Sigma\or % 006
  Upsilon\or % 007
  Phi\or % 008
  Psi\or % 009
  Omega\or % 010
  \csname krntst@OT1@011\endcsname\or % 011
  \csname krntst@OT1@012\endcsname\or % 012
  \csname krntst@OT1@013\endcsname\or % 013
  \csname krntst@OT1@014\endcsname\or % 014
  \csname krntst@OT1@015\endcsname\or % 015
  dotlessi\or % 016
  dotlessj\or % 017
  grave\or % 018
  acute\or % 019
  caron\or % 020
  breve\or % 021
  macron\or % 022
  ringfitted\or % 023
  cedilla\or % 024
  germandbls\or % 025
  ae\or % 026
  oe\or % 027
  oslash\or % 028
  AE\or % 029
  OE\or % 030
  Oslash\or % 031
  \csname krntst@OT1@032\endcsname\or % 032
  exclam\or % 033
  \csname krntst@OT1@034\endcsname\or % 034
  numbersign\or % 035
  \csname krntst@OT1@036\endcsname\or % 036
  percent\or % 037
  ampersand\or % 038
  quoteright\or % 039
  parenleft\or % 040
  parenright\or % 041
  asterisk\or % 042
  plus\or % 043
  comma\or % 044
  hyphen\or % 045
  period\or % 046
  slash\or % 047
  zero\or % 048
  one\or % 049
  two\or % 050
  three\or % 051
  four\or % 052
  five\or % 053
  six\or % 054
  seven\or % 055
  eight\or % 056
  nine\or % 057
  colon\or % 058
  semicolon\or % 059
  \csname krntst@OT1@060\endcsname\or % 060
  equal\or % 061
  \csname krntst@OT1@062\endcsname\or % 062
  question\or % 063
  at\or % 064
  A\or % 065
  B\or % 066
  C\or % 067
  D\or % 068
  E\or % 069
  F\or % 070
  G\or % 071
  H\or % 072
  I\or % 073
  J\or % 074
  K\or % 075
  L\or % 076
  M\or % 077
  N\or % 078
  O\or % 079
  P\or % 080
  Q\or % 081
  R\or % 082
  S\or % 083
  T\or % 084
  U\or % 085
  V\or % 086
  W\or % 087
  X\or % 088
  Y\or % 089
  Z\or % 090
  bracketleft\or % 091
  \csname krntst@OT1@092\endcsname\or % 092
  bracketright\or % 093
  circumflex\or % 094
  \csname krntst@OT1@095\endcsname\or % 095
  quoteleft\or % 096
  a\or % 097
  b\or % 098
  c\or % 099
  d\or % 100
  e\or % 101
  f\or % 102
  g\or % 103
  h\or % 104
  i\or % 105
  j\or % 106
  k\or % 107
  l\or % 108
  m\or % 109
  n\or % 110
  o\or % 111
  p\or % 112
  q\or % 113
  r\or % 114
  s\or % 115
  t\or % 116
  u\or % 117
  v\or % 118
  w\or % 119
  x\or % 120
  y\or % 121
  z\or % 122
  \csname krntst@OT1@123\endcsname\or % 123
  \csname krntst@OT1@124\endcsname\or % 124
  \csname krntst@OT1@125\endcsname\or % 125
  tilde\or % 126
  dieresis\or % 127
  .notdef.128\or % 128
  .notdef.129\or % 129
  .notdef.130\or % 130
  .notdef.131\or % 131
  .notdef.132\or % 132
  .notdef.133\or % 133
  .notdef.134\or % 134
  .notdef.135\or % 135
  .notdef.136\or % 136
  .notdef.137\or % 137
  Lslash\or % 138
  .notdef.139\or % 139
  .notdef.140\or % 140
  .notdef.141\or % 141
  .notdef.142\or % 142
  .notdef.143\or % 143
  .notdef.144\or % 144
  .notdef.145\or % 145
  .notdef.146\or % 146
  .notdef.147\or % 147
  .notdef.148\or % 148
  .notdef.149\or % 149
  .notdef.150\or % 150
  .notdef.151\or % 151
  .notdef.152\or % 152
  .notdef.153\or % 153
  .notdef.154\or % 154
  .notdef.155\or % 155
  .notdef.156\or % 156
  .notdef.157\or % 157
  .notdef.158\or % 158
  .notdef.159\or % 159
  .notdef.160\or % 160
  .notdef.161\or % 161
  .notdef.162\or % 162
  .notdef.163\or % 163
  .notdef.164\or % 164
  .notdef.165\or % 165
  .notdef.166\or % 166
  .notdef.167\or % 167
  .notdef.168\or % 168
  .notdef.169\or % 169
  lslash\or % 170
  .notdef.171\or % 171
  .notdef.172\or % 172
  .notdef.173\or % 173
  .notdef.174\or % 174
  .notdef.175\or % 175
  .notdef.176\or % 176
  .notdef.177\or % 177
  .notdef.178\or % 178
  .notdef.179\or % 179
  .notdef.180\or % 180
  .notdef.181\or % 181
  .notdef.182\or % 182
  .notdef.183\or % 183
  .notdef.184\or % 184
  .notdef.185\or % 185
  .notdef.186\or % 186
  .notdef.187\or % 187
  .notdef.188\or % 188
  .notdef.189\or % 189
  .notdef.190\or % 190
  .notdef.191\or % 191
  .notdef.192\or % 192
  .notdef.193\or % 193
  .notdef.194\or % 194
  .notdef.195\or % 195
  .notdef.196\or % 196
  .notdef.197\or % 197
  .notdef.198\or % 198
  .notdef.199\or % 199
  .notdef.200\or % 200
  .notdef.201\or % 201
  .notdef.202\or % 202
  .notdef.203\or % 203
  .notdef.204\or % 204
  .notdef.205\or % 205
  .notdef.206\or % 206
  .notdef.207\or % 207
  .notdef.208\or % 208
  .notdef.209\or % 209
  .notdef.210\or % 210
  .notdef.211\or % 211
  .notdef.212\or % 212
  .notdef.213\or % 213
  .notdef.214\or % 214
  .notdef.215\or % 215
  .notdef.216\or % 216
  .notdef.217\or % 217
  .notdef.218\or % 218
  .notdef.219\or % 219
  .notdef.220\or % 220
  .notdef.221\or % 221
  .notdef.222\or % 222
  .notdef.223\or % 223
  .notdef.224\or % 224
  .notdef.225\or % 225
  .notdef.226\or % 226
  .notdef.227\or % 227
  .notdef.228\or % 228
  .notdef.229\or % 229
  .notdef.230\or % 230
  .notdef.231\or % 231
  .notdef.232\or % 232
  .notdef.233\or % 233
  .notdef.234\or % 234
  .notdef.235\or % 235
  .notdef.236\or % 236
  .notdef.237\or % 237
  .notdef.238\or % 238
  .notdef.239\or % 239
  .notdef.240\or % 240
  .notdef.241\or % 241
  .notdef.242\or % 242
  .notdef.243\or % 243
  .notdef.244\or % 244
  .notdef.245\or % 245
  .notdef.246\or % 246
  .notdef.247\or % 247
  .notdef.248\or % 248
  .notdef.249\or % 249
  .notdef.250\or % 250
  .notdef.251\or % 251
  .notdef.252\or % 252
  .notdef.253\or % 253
  .notdef.254\or % 254
  .notdef.255\fi % 255
}
%</mtx&ot1>
%    \end{macrocode}
%
% \subsubsection{T2A encoding}
%
% The |T2A| encoding.
% The data are taken from |t2a.etx|.
%
% For unknown slots, a strange Postscript name is returned, but no
% warning is generated.
%    \begin{macrocode}
%<*mtx&t2a>
\newcommand\getpsname[1]{%
  \ifcase#1%
  grave\or% 000
  acute\or% 001
  circumflex\or% 002
  tilde\or% 003
  dieresis\or% 004
  hungarumlaut\or% 005
  ring\or% 006
  caron\or% 007
  breve\or% 008
  macron\or% 009
  dotaccent\or% 010
  cedilla\or% 011
  ogonek\or% 012
  CYRpalochka\or% 013
  angleleft\or% 014
  angleright\or% 015
  quotedblleft\or% 016
  quotedblright\or% 017
  cyrflex\or% 018
  dblgrave\or% 019
  cyrbreve\or% 020
  rangedash\or% 021
  cyrdash\or% 022
  compwordmark\or% 023
  perthousandzero\or% 024
  dotlessi\or% 025
  dotlessj\or% 026
  ff\or% 027
  fi\or% 028
  fl\or% 029
  ffi\or% 030
  ffl\or% 031
  visiblespace\or% 032
  exclam\or% 033
  quotedbl\or% 034
  numbersign\or% 035
  dollar\or% 036
  percent\or% 037
  ampersand\or% 038
  quoteright\or% 039
  parenleft\or% 040
  parenright\or% 041
  asterisk\or% 042
  plus\or% 043
  comma\or% 044
  hyphen\or% 045
  period\or% 046
  slash\or% 047
  zero\or% 048
  one\or% 049
  two\or% 050
  three\or% 051
  four\or% 052
  five\or% 053
  six\or% 054
  seven\or% 055
  eight\or% 056
  nine\or% 057
  colon\or% 058
  semicolon\or% 059
  less\or% 060
  equal\or% 061
  greater\or% 062
  question\or% 063
  at\or% 064
  A\or% 065
  B\or% 066
  C\or% 067
  D\or% 068
  E\or% 069
  F\or% 070
  G\or% 071
  H\or% 072
  I\or% 073
  J\or% 074
  K\or% 075
  L\or% 076
  M\or% 077
  N\or% 078
  O\or% 079
  P\or% 080
  Q\or% 081
  R\or% 082
  S\or% 083
  T\or% 084
  U\or% 085
  V\or% 086
  W\or% 087
  X\or% 088
  Y\or% 089
  Z\or% 090
  bracketleft\or% 091
  backslash\or% 092
  bracketright\or% 093
  asciicircum\or% 094
  underscore\or% 095
  quoteleft\or% 096
  a\or% 097
  b\or% 098
  c\or% 099
  d\or% 100
  e\or% 101
  f\or% 102
  g\or% 103
  h\or% 104
  i\or% 105
  j\or% 106
  k\or% 107
  l\or% 108
  m\or% 109
  n\or% 110
  o\or% 111
  p\or% 112
  q\or% 113
  r\or% 114
  s\or% 115
  t\or% 116
  u\or% 117
  v\or% 118
  w\or% 119
  x\or% 120
  y\or% 121
  z\or% 122
  braceleft\or% 123
  bar\or% 124
  braceright\or% 125
  asciitilde\or% 126
  hyphenchar\or% 127
  CYRGUP\or% 128
  CYRGHCRS\or% 129
  CYRDJE\or% 130
  CYRTSHE\or% 131
  CYRSHHA\or% 132
  CYRZHDSC\or% 133
  CYRZDSC\or% 134
  CYRLJE\or% 135
  CYRYI\or% 136
  CYRKDSC\or% 137
  CYRKBEAK\or% 138
  CYRKVCRS\or% 139
  CYRAE\or% 140
  CYRNDSC\or% 141
  CYRNG\or% 142
  CYRDZE\or% 143
  CYROTLD\or% 144
  CYRSDSC\or% 145
  CYRUSHRT\or% 146
  CYRY\or% 147
  CYRYHCRS\or% 148
  CYRHDSC\or% 149
  CYRDZHE\or% 150
  CYRCHVCRS\or% 151
  CYRCHRDSC\or% 152
  CYRIE\or% 153
  CYRSCHWA\or% 154
  CYRNJE\or% 155
  CYRYO\or% 156
  numero\or% 157
  currency\or% 158
  section\or% 159
  cyrgup\or% 160
  cyrghcrs\or% 161
  cyrdje\or% 162
  cyrtshe\or% 163
  cyrshha\or% 164
  cyrzhdsc\or% 165
  cyrzdsc\or% 166
  cyrlje\or% 167
  cyryi\or% 168
  cyrkdsc\or% 169
  cyrkbeak\or% 170
  cyrkvcrs\or% 171
  cyrae\or% 172
  cyrndsc\or% 173
  cyrng\or% 174
  cyrdze\or% 175
  cyrotld\or% 176
  cyrsdsc\or% 177
  cyrushrt\or% 178
  cyry\or% 179
  cyryhcrs\or% 180
  cyrhdsc\or% 181
  cyrdzhe\or% 182
  cyrchvcrs\or% 183
  cyrchrdsc\or% 184
  cyrie\or% 185
  cyrschwa\or% 186
  cyrnje\or% 187
  cyryo\or% 188
  quotedblbase\or% 189
  guillemotleft\or% 190
  guillemotright\or% 191
  CYRA\or% 192
  CYRB\or% 193
  CYRV\or% 194
  CYRG\or% 195
  CYRD\or% 196
  CYRE\or% 197
  CYRZH\or% 198
  CYRZ\or% 199
  CYRI\or% 200
  CYRISHRT\or% 201
  CYRK\or% 202
  CYRL\or% 203
  CYRM\or% 204
  CYRN\or% 205
  CYRO\or% 206
  CYRP\or% 207
  CYRR\or% 208
  CYRS\or% 209
  CYRT\or% 210
  CYRU\or% 211
  CYRF\or% 212
  CYRH\or% 213
  CYRC\or% 214
  CYRCH\or% 215
  CYRSH\or% 216
  CYRSHCH\or% 217
  CYRHRDSN\or% 218
  CYRERY\or% 219
  CYRSFTSN\or% 220
  CYREREV\or% 221
  CYRYU\or% 222
  CYRYA\or% 223
  cyra\or% 224
  cyrb\or% 225
  cyrv\or% 226
  cyrg\or% 227
  cyrd\or% 228
  cyre\or% 229
  cyrzh\or% 230
  cyrz\or% 231
  cyri\or% 232
  cyrishrt\or% 233
  cyrk\or% 234
  cyrl\or% 235
  cyrm\or% 236
  cyrn\or% 237
  cyro\or% 238
  cyrp\or% 239
  cyrr\or% 240
  cyrs\or% 241
  cyrt\or% 242
  cyru\or% 243
  cyrf\or% 244
  cyrh\or% 245
  cyrc\or% 246
  cyrch\or% 247
  cyrsh\or% 248
  cyrshch\or% 249
  cyrhrdsn\or% 250
  cyrery\or% 251
  cyrsftsn\or% 252
  cyrerev\or% 253
  cyryu\or% 254
  cyrya\fi% 255
}
%</mtx&t2a>
%    \end{macrocode}
%
% \subsubsection{T2A encoding}
%
% The |T2B| encoding.
% The data are taken from |t2b.etx|.
%
% For unknown slots, a strange Postscript name is returned, but no
% warning is generated.
%    \begin{macrocode}
%<*mtx&t2b>
\newcommand\getpsname[1]{%
  \ifcase#1%
  grave\or% 000
  acute\or% 001
  circumflex\or% 002
  tilde\or% 003
  dieresis\or% 004
  hungarumlaut\or% 005
  ring\or% 006
  caron\or% 007
  breve\or% 008
  macron\or% 009
  dotaccent\or% 010
  cedilla\or% 011
  ogonek\or% 012
  CYRpalochka\or% 013
  angleleft\or% 014
  angleright\or% 015
  quotedblleft\or% 016
  quotedblright\or% 017
  cyrflex\or% 018
  dblgrave\or% 019
  cyrbreve\or% 020
  rangedash\or% 021
  cyrdash\or% 022
  compwordmark\or% 023
  perthousandzero\or% 024
  dotlessi\or% 025
  dotlessj\or% 026
  ff\or% 027
  fi\or% 028
  fl\or% 029
  ffi\or% 030
  ffl\or% 031
  visiblespace\or% 032
  exclam\or% 033
  quotedbl\or% 034
  numbersign\or% 035
  dollar\or% 036
  percent\or% 037
  ampersand\or% 038
  quoteright\or% 039
  parenleft\or% 040
  parenright\or% 041
  asterisk\or% 042
  plus\or% 043
  comma\or% 044
  hyphen\or% 045
  period\or% 046
  slash\or% 047
  zero\or% 048
  one\or% 049
  two\or% 050
  three\or% 051
  four\or% 052
  five\or% 053
  six\or% 054
  seven\or% 055
  eight\or% 056
  nine\or% 057
  colon\or% 058
  semicolon\or% 059
  less\or% 060
  equal\or% 061
  greater\or% 062
  question\or% 063
  at\or% 064
  A\or% 065
  B\or% 066
  C\or% 067
  D\or% 068
  E\or% 069
  F\or% 070
  G\or% 071
  H\or% 072
  I\or% 073
  J\or% 074
  K\or% 075
  L\or% 076
  M\or% 077
  N\or% 078
  O\or% 079
  P\or% 080
  Q\or% 081
  R\or% 082
  S\or% 083
  T\or% 084
  U\or% 085
  V\or% 086
  W\or% 087
  X\or% 088
  Y\or% 089
  Z\or% 090
  bracketleft\or% 091
  backslash\or% 092
  bracketright\or% 093
  asciicircum\or% 094
  underscore\or% 095
  quoteleft\or% 096
  a\or% 097
  b\or% 098
  c\or% 099
  d\or% 100
  e\or% 101
  f\or% 102
  g\or% 103
  h\or% 104
  i\or% 105
  j\or% 106
  k\or% 107
  l\or% 108
  m\or% 109
  n\or% 110
  o\or% 111
  p\or% 112
  q\or% 113
  r\or% 114
  s\or% 115
  t\or% 116
  u\or% 117
  v\or% 118
  w\or% 119
  x\or% 120
  y\or% 121
  z\or% 122
  braceleft\or% 123
  bar\or% 124
  braceright\or% 125
  asciitilde\or% 126
  hyphenchar\or% 127
  CYRGDSCHCRS\or% 128
  CYRGHCRS\or% 129
  CYRGDSC\or% 130
  CYRGHK\or% 131
  CYRSHHA\or% 132
  CYRZHDSC\or% 133
  CYRDELTA\or% 134
  CYRABHDZE\or% 135
  CYRLJE\or% 136
  CYRKDSC\or% 137
  CYRLDSC\or% 138
  CYRKHK\or% 139
  CYRLHK\or% 140
  CYRNDSC\or% 141
  CYRNG\or% 142
  CYRNHK\or% 143
  CYROTLD\or% 144
  CYRSACRS\or% 145
  CYRUSHRT\or% 146
  CYRY\or% 147
  CYRHHCRS\or% 148
  CYRHDSC\or% 149
  CYRHHK\or% 150
  CYRCHLDSC\or% 151
  CYRCHRDSC\or% 152
  CYRNJE\or% 153
  CYRSCHWA\or% 154
  CYREPS\or% 155
  CYRYO\or% 156
  numero\or% 157
  currency\or% 158
  section\or% 159
  cyrgdschcrs\or% 160
  cyrghcrs\or% 161
  cyrgdsc\or% 162
  cyrghk\or% 163
  cyrshha\or% 164
  cyrzhdsc\or% 165
  cyrdelta\or% 166
  cyrabhdze\or% 167
  cyrlje\or% 168
  cyrkdsc\or% 169
  cyrldsc\or% 170
  cyrkhk\or% 171
  cyrlhk\or% 172
  cyrndsc\or% 173
  cyrng\or% 174
  cyrnhk\or% 175
  cyrotld\or% 176
  cyrsacrs\or% 177
  cyrushrt\or% 178
  cyry\or% 179
  cyrhhcrs\or% 180
  cyrhdsc\or% 181
  cyrhhk\or% 182
  cyrchldsc\or% 183
  cyrchrdsc\or% 184
  cyrnje\or% 185
  cyrschwa\or% 186
  cyreps\or% 187
  cyryo\or% 188
  quotedblbase\or% 189
  guillemotleft\or% 190
  guillemotright\or% 191
  CYRA\or% 192
  CYRB\or% 193
  CYRV\or% 194
  CYRG\or% 195
  CYRD\or% 196
  CYRE\or% 197
  CYRZH\or% 198
  CYRZ\or% 199
  CYRI\or% 200
  CYRISHRT\or% 201
  CYRK\or% 202
  CYRL\or% 203
  CYRM\or% 204
  CYRN\or% 205
  CYRO\or% 206
  CYRP\or% 207
  CYRR\or% 208
  CYRS\or% 209
  CYRT\or% 210
  CYRU\or% 211
  CYRF\or% 212
  CYRH\or% 213
  CYRC\or% 214
  CYRCH\or% 215
  CYRSH\or% 216
  CYRSHCH\or% 217
  CYRHRDSN\or% 218
  CYRERY\or% 219
  CYRSFTSN\or% 220
  CYREREV\or% 221
  CYRYU\or% 222
  CYRYA\or% 223
  cyra\or% 224
  cyrb\or% 225
  cyrv\or% 226
  cyrg\or% 227
  cyrd\or% 228
  cyre\or% 229
  cyrzh\or% 230
  cyrz\or% 231
  cyri\or% 232
  cyrishrt\or% 233
  cyrk\or% 234
  cyrl\or% 235
  cyrm\or% 236
  cyrn\or% 237
  cyro\or% 238
  cyrp\or% 239
  cyrr\or% 240
  cyrs\or% 241
  cyrt\or% 242
  cyru\or% 243
  cyrf\or% 244
  cyrh\or% 245
  cyrc\or% 246
  cyrch\or% 247
  cyrsh\or% 248
  cyrshch\or% 249
  cyrhrdsn\or% 250
  cyrery\or% 251
  cyrsftsn\or% 252
  cyrerev\or% 253
  cyryu\or% 254
  cyrya\fi% 255
}
%</mtx&t2b>
%    \end{macrocode}
%
% \subsubsection{LY1 encoding}
%
% The |LY1| encoding.
% The data are taken from |texnansi.enc|.
%
% For unknown slots, a strange Postscript name is returned, but no
% warning is generated.
%    \begin{macrocode}
%<*mtx&ly1>
\newcommand\getpsname[1]{%
  \ifcase#1%
  .notdef.000\or % 000
  Euro\or % 001
  .notdef.002\or % 002
  .notdef.003\or % 003
  fraction\or % 004
  dotaccent\or % 005
  hungarumlaut\or % 006
  ogonek\or % 007
  fl\or % 008
  .notdef.009\or % 009
  cwm\or % 010
  ff\or % 011
  fi\or % 012
  .notdef.013\or % 013
  ffi\or % 014
  ffl\or % 015
  dotlessi\or % 016
  dotlessj\or % 017
  grave\or % 018
  acute\or % 019
  caron\or % 020
  breve\or % 021
  macron\or % 022
  ring\or % 023
  cedilla\or % 024
  germandbls\or % 025
  ae\or % 026
  oe\or % 027
  oslash\or % 028
  AE\or % 029
  OE\or % 030
  Oslash\or % 031
  space\or % 032
  exclam\or % 033
  quotedbl\or % 034
  numbersign\or % 035
  dollar\or % 036
  percent\or % 037
  ampersand\or % 038
  quoteright\or % 039
  parenleft\or % 040
  parenright\or % 041
  asterisk\or % 042
  plus\or % 043
  comma\or % 044
  hyphen\or % 045
  period\or % 046
  slash\or % 047
  zero\or % 048
  one\or % 049
  two\or % 050
  three\or % 051
  four\or % 052
  five\or % 053
  six\or % 054
  seven\or % 055
  eight\or % 056
  nine\or % 057
  colon\or % 058
  semicolon\or % 059
  less\or % 060
  equal\or % 061
  greater\or % 062
  question\or % 063
  at\or % 064
  A\or % 065
  B\or % 066
  C\or % 067
  D\or % 068
  E\or % 069
  F\or % 070
  G\or % 071
  H\or % 072
  I\or % 073
  J\or % 074
  K\or % 075
  L\or % 076
  M\or % 077
  N\or % 078
  O\or % 079
  P\or % 080
  Q\or % 081
  R\or % 082
  S\or % 083
  T\or % 084
  U\or % 085
  V\or % 086
  W\or % 087
  X\or % 088
  Y\or % 089
  Z\or % 090
  bracketleft\or % 091
  backslash\or % 092
  bracketright\or % 093
  circumflex\or % 094
  underscore\or % 095
  quoteleft\or % 096
  a\or % 097
  b\or % 098
  c\or % 099
  d\or % 100
  e\or % 101
  f\or % 102
  g\or % 103
  h\or % 104
  i\or % 105
  j\or % 106
  k\or % 107
  l\or % 108
  m\or % 109
  n\or % 110
  o\or % 111
  p\or % 112
  q\or % 113
  r\or % 114
  s\or % 115
  t\or % 116
  u\or % 117
  v\or % 118
  w\or % 119
  x\or % 120
  y\or % 121
  z\or % 122
  braceleft\or % 123
  bar\or % 124
  braceright\or % 125
  tilde\or % 126
  dieresis\or % 127
  Lslash\or % 128
  quotesingle\or % 129
  quotesinglbase\or % 130
  florin\or % 131
  quotedblbase\or % 132
  ellipsis\or % 133
  dagger\or % 134
  daggerdbl\or % 135
  circumflex\or % 136
  perthousand\or % 137
  Scaron\or % 138
  guilsinglleft\or % 139
  OE\or % 140
  Zcaron\or % 141
  asciicircum\or % 142
  minus\or % 143
  lslash\or % 144
  quoteleft\or % 145
  quoteright\or % 146
  quotedblleft\or % 147
  quotedblright\or % 148
  bullet\or % 149
  endash\or % 150
  emdash\or % 151
  tilde\or % 152
  trademark\or % 153
  scaron\or % 154
  guilsinglright\or % 155
  oe\or % 156
  zcaron\or % 157
  asciitilde\or % 158
  Ydieresis\or % 159
  nbspace\or % 160
  exclamdown\or % 161
  cent\or % 162
  sterling\or % 163
  currency\or % 164
  yen\or % 165
  brokenbar\or % 166
  section\or % 167
  dieresis\or % 168
  copyright\or % 169
  ordfeminine\or % 170
  guillemotleft\or % 171
  logicalnot\or % 172
  sfthyphen\or % 173
  registered\or % 174
  macron\or % 175
  degree\or % 176
  plusminus\or % 177
  twosuperior\or % 178
  threesuperior\or % 179
  acute\or % 180
  mu\or % 181
  paragraph\or % 182
  periodcentered\or % 183
  cedilla\or % 184
  onesuperior\or % 185
  ordmasculine\or % 186
  guillemotright\or % 187
  onequarter\or % 188
  onehalf\or % 189
  threequarters\or % 190
  questiondown\or % 191
  Agrave\or % 192
  Aacute\or % 193
  Acircumflex\or % 194
  Atilde\or % 195
  Adieresis\or % 196
  Aring\or % 197
  AE\or % 198
  Ccedilla\or % 199
  Egrave\or % 200
  Eacute\or % 201
  Ecircumflex\or % 202
  Edieresis\or % 203
  Igrave\or % 204
  Iacute\or % 205
  Icircumflex\or % 206
  Idieresis\or % 207
  Eth\or % 208
  Ntilde\or % 209
  Ograve\or % 210
  Oacute\or % 211
  Ocircumflex\or % 212
  Otilde\or % 213
  Odieresis\or % 214
  multiply\or % 215
  Oslash\or % 216
  Ugrave\or % 217
  Uacute\or % 218
  Ucircumflex\or % 219
  Udieresis\or % 220
  Yacute\or % 221
  Thorn\or % 222
  germandbls\or % 223
  agrave\or % 224
  aacute\or % 225
  acircumflex\or % 226
  atilde\or % 227
  adieresis\or % 228
  aring\or % 229
  ae\or % 230
  ccedilla\or % 231
  egrave\or % 232
  eacute\or % 233
  ecircumflex\or % 234
  edieresis\or % 235
  igrave\or % 236
  iacute\or % 237
  icircumflex\or % 238
  idieresis\or % 239
  eth\or % 240
  ntilde\or % 241
  ograve\or % 242
  oacute\or % 243
  ocircumflex\or % 244
  otilde\or % 245
  odieresis\or % 246
  divide\or % 247
  oslash\or % 248
  ugrave\or % 249
  uacute\or % 250
  ucircumflex\or % 251
  udieresis\or % 252
  yacute\or % 253
  thorn\or % 254
  ydieresis\fi % 255
}
%</mtx&ly1>
%    \end{macrocode}
%
%
% \subsection{Templates}
%
% Generate template files for T1 and TS1 encoding.
% They should be self-describing.
%
% \subsubsection{T1 encoding}
%
%    \begin{macrocode}
%<*template&t1>
\listfiles
%% Replace the `XXX' in the next line by the 3- or 4-character long
%% abbreviation for your font.
\documentclass[family=XXX]{kerntest}

%% Replace the settings by these you want to test.
\kernsetup{encoding=T1,series=m,shape=n,example=hello}
\kernsetup{size=14.40pt,baselineskip=16.5pt,papersize=a4paper}

%% The next line can be used to add a name suffix to the output |mtx| file.
%% \kernsetup{extraname=normal}

%% Set encoding parameters.
%% Set ligaturing: 1=all, 0=all, -1=some, -2=none
%% \encodingsetup{ligaturing=1}

%% If you are using a font with different design sizes and if you want
%% to test one design size scaled to another one, you may input a
%% modified fd file for your font. To generate this new fd file, just
%% copy the original one, rename it, and modify the entries for the
%% font shapes to use the design size you want to test.
%% \input{t1XXX-1200.fd}

%% The following lines show some possible glyph classes. You should
%% add all classes you need. 
\newglyphclass{right}{A}{A,Aogonek}
\newglyphclass{right}{Abreve}{Abreve,Aacute,Acircumflex,%
  Atilde,Adieresis}
\newglyphclass{right}{Aring}{Agrave,Aring}

\newglyphclass{left}{A}{A,Aogonek}
\newglyphclass{left}{Abreve}{Abreve,Agrave,Acircumflex,%
  Atilde,Adieresis}
\newglyphclass{left}{Aring}{Aacute,Aring}

\newglyphclass{right}{C}{C,Cacute,Ccaron,Ccedilla}
\newglyphclass{left}{C}{C,Cacute,Ccaron,Ccedilla}

\newglyphclass{right}{D}{D,Dcaron,Eth}

\newglyphclass{right}{E}{E,Ecaron,Eogonek,Egrave,Eacute,Ecircumflex,%
  Edieresis,AE,OE}

\newglyphclass{right}{G}{G,Gbreve}
\newglyphclass{left}{G}{G,Gbreve}

\newglyphclass{left}{H}{B,D,Dcaron,Eth,E,Ecaron,Eogonek,Egrave,%
  Eacute,Ecircumflex,Edieresis,F,H,I,Idotaccent,Igrave,Iacute,%
  Icircumflex,Idieresis,IJ,J,K,L,Lacute,Lcaron,N,Nacute,Ncaron,%
  Ntilde,P,R,Racute,Rcaron,Ng,Thorn}

\newglyphclass{right}{H}{H,I,Idotaccent,Igrave,Iacute,%
  Icircumflex,Idieresis,IJ,J,N,Nacute,Ncaron,Ntilde}

\newglyphclass{right}{O}{O,Ohungarumlaut,Ograve,Oacute,Ocircumflex,%
  Otilde,Odieresis,Oslash}
\newglyphclass{left}{O}{O,Ohungarumlaut,Ograve,Oacute,Ocircumflex,%
  Otilde,Odieresis,OE,Oslash}

\newglyphclass{right}{R}{R,Racute,Rcaron}

\newglyphclass{right}{S}{S,Sacute,Scaron,Scedilla,SS,dollar}
\newglyphclass{left}{S}{S,Sacute,Scaron,Scedilla,SS,dollar}

\newglyphclass{right}{T}{T,Tcaron,Tcedilla}
\newglyphclass{left}{T}{T,Tcaron,Tcedilla}

\newglyphclass{right}{U}{U,Uhungarumlaut,Uring,Ugrave,Uacute,%
  Ucircumflex,Udieresis}
\newglyphclass{left}{U}{U,Uhungarumlaut,Uring,Ugrave,Uacute,%
  Ucircumflex,Udieresis}

\newglyphclass{right}{Y}{Y,Yacute,Ydieresis}%
\newglyphclass{left}{Y}{Y,Yacute,Ydieresis}%

\newglyphclass{left}{Z}{Z,Zacute,Zcaron,Zdotaccent}
\newglyphclass{right}{Z}{Z,Zacute,Zcaron,Zdotaccent}

\newglyphclass{left}{a}{a,aogonek,ae}
\newglyphclass{left}{abreve}{abreve,agrave,acircumflex,atilde,adieresis,aring}
\newglyphclass{right}{a}{a,aogonek}
\newglyphclass{right}{abreve}{abreve,aacute,acircumflex,atilde,adieresis,aring}

\newglyphclass{left}{c}{c,ccedilla}
\newglyphclass{right}{c}{c,ccedilla}

\newglyphclass{left}{d}{d,dbar,dcaron}

\newglyphclass{left}{e}{e,eogonek}
\newglyphclass{left}{egrave}{ecaron,ecircumflex}
\newglyphclass{right}{e}{e,eogonek,ae,oe}
\newglyphclass{right}{egrave}{ecaron,ecircumflex}

\newglyphclass{left}{f}{f,ff,fi,fl,ffi,ffl}
\newglyphclass{right}{f}{f,ff}

\newglyphclass{right}{i}{i,fi,ffi,dotlessi}
\newglyphclass{left}{i}{i,ij,dotlessi}

\newglyphclass{right}{l}{fl,ffl,l,lacute}
\newglyphclass{left}{l}{l,lacute,lcaron}

\newglyphclass{right}{m}{m,n}
\newglyphclass{left}{m}{m,n}
\newglyphclass{right}{nacute}{nacute,ncaron}
\newglyphclass{left}{nacute}{nacute,ncaron}

\newglyphclass{right}{ograve}{ograve,ocircumflex}
\newglyphclass{right}{ohungarumlaut}{ohungarumlaut,oacute,otilde,%
  odieresis}
\newglyphclass{left}{oacute}{oacute,ocircumflex,oe}
\newglyphclass{left}{ohungarumlaut}{ohungarumlaut,ograve,otilde,%
  odieresis}

\newglyphclass{left}{t}{t,tcaron,tcedilla}


\begin{document}

%% This table of characters is sorted by similar glyphs, not by the
%% encoding.
%% Replace `{LLL}' and `{RRR}' in columns 1 resp. 5 by these glyphs
%% that shall be tested.
%% Good pairs to use for LLL and RRR test are 016, 017 (English
%% quotation marks `` and ''); 018, 016 (German quotation marks ,, and
%% ``); 019, 020 (French Guillemets << and >>); 020, 019 (French
%% Guillemets in German notation >> and <<).
%% You may also take the Postscript names for all glyphs.
\begin{kerntable}
  \testkern{LLL}{-}{000}{-}{RRR} \\ % grave
  \testkern{LLL}{-}{001}{-}{RRR} \\ % acute
  \testkern{LLL}{-}{002}{-}{RRR} \\ % circumflex
  \testkern{LLL}{-}{003}{-}{RRR} \\ % tilde
  \testkern{LLL}{-}{004}{-}{RRR} \\ % dieresis
  \testkern{LLL}{-}{005}{-}{RRR} \\ % hungarumlaut
  \testkern{LLL}{-}{006}{-}{RRR} \\ % ring
  \testkern{LLL}{-}{007}{-}{RRR} \\ % caron
  \testkern{LLL}{-}{008}{-}{RRR} \\ % breve
  \testkern{LLL}{-}{009}{-}{RRR} \\ % macron
  \testkern{LLL}{-}{010}{-}{RRR} \\ % dotaccent
  \testkern{LLL}{-}{011}{-}{RRR} \\ % cedilla
  \testkern{LLL}{-}{012}{-}{RRR} \\ % ogonek
  \testkern{LLL}{-}{126}{-}{RRR} \\ % asciitilde
  \testkern{LLL}{-}{094}{-}{RRR} \\ % asciicircum
  \testkern{LLL}{-}{042}{-}{RRR} \\ % asterisk
  \testkern{LLL}{-}{023}{-}{RRR} \\ % compwordmark
  \testkern{LLL}{-}{032}{-}{RRR} \\ % visiblespace
  \testkern{LLL}{-}{014}{-}{RRR} \\ % guilsinglleft
  \testkern{LLL}{-}{015}{-}{RRR} \\ % guilsinglright
  \testkern{LLL}{-}{019}{-}{RRR} \\ % guillemotleft
  \testkern{LLL}{-}{020}{-}{RRR} \\ % guillemotright
  \testkern{LLL}{-}{096}{-}{RRR} \\ % quoteleft
  \testkern{LLL}{-}{039}{-}{RRR} \\ % quoteright
  \testkern{LLL}{-}{013}{-}{RRR} \\ % quotesinglbase
  \testkern{LLL}{-}{016}{-}{RRR} \\ % quotedblleft
  \testkern{LLL}{-}{017}{-}{RRR} \\ % quotedblright
  \testkern{LLL}{-}{018}{-}{RRR} \\ % quotedblbase
  \testkern{LLL}{-}{034}{-}{RRR} \\ % quotedbl
  \testkern{LLL}{-}{046}{-}{RRR} \\ % period
  \testkern{LLL}{-}{044}{-}{RRR} \\ % comma
  \testkern{LLL}{-}{058}{-}{RRR} \\ % colon
  \testkern{LLL}{-}{059}{-}{RRR} \\ % semicolon
  \testkern{LLL}{-}{033}{-}{RRR} \\ % exclam
  \testkern{LLL}{-}{063}{-}{RRR} \\ % question
  \testkern{LLL}{-}{189}{-}{RRR} \\ % exclamdown
  \testkern{LLL}{-}{190}{-}{RRR} \\ % questiondown
  \testkern{LLL}{-}{045}{-}{RRR} \\ % hyphen
  \testkern{LLL}{-}{127}{-}{RRR} \\ % hyphenchar
  \testkern{LLL}{-}{021}{-}{RRR} \\ % rangedash
  \testkern{LLL}{-}{022}{-}{RRR} \\ % punctdash
  \testkern{LLL}{-}{095}{-}{RRR} \\ % underscore
  \testkern{LLL}{-}{043}{-}{RRR} \\ % plus
  \testkern{LLL}{-}{061}{-}{RRR} \\ % equal
  \testkern{LLL}{-}{060}{-}{RRR} \\ % less
  \testkern{LLL}{-}{062}{-}{RRR} \\ % greater
  \testkern{LLL}{-}{047}{-}{RRR} \\ % slash
  \testkern{LLL}{-}{092}{-}{RRR} \\ % backslash
  \testkern{LLL}{-}{040}{-}{RRR} \\ % parenleft
  \testkern{LLL}{-}{041}{-}{RRR} \\ % parenright
  \testkern{LLL}{-}{091}{-}{RRR} \\ % bracketleft
  \testkern{LLL}{-}{093}{-}{RRR} \\ % bracketright
  \testkern{LLL}{-}{123}{-}{RRR} \\ % braceleft
  \testkern{LLL}{-}{125}{-}{RRR} \\ % braceright
  \testkern{LLL}{-}{124}{-}{RRR} \\ % bar
  \testkern{LLL}{-}{035}{-}{RRR} \\ % numbersign
  \testkern{LLL}{-}{037}{-}{RRR} \\ % percent
  \testkern{LLL}{-}{024}{-}{RRR} \\ % perthousandzero
  \testkern{LLL}{-}{038}{-}{RRR} \\ % ampersand
  \testkern{LLL}{-}{159}{-}{RRR} \\ % section
  \testkern{LLL}{-}{064}{-}{RRR} \\ % at
  \testkern{LLL}{-}{191}{-}{RRR} \\ % sterling
  \testkern{LLL}{-}{048}{-}{RRR} \\ % zero
  \testkern{LLL}{-}{049}{-}{RRR} \\ % one
  \testkern{LLL}{-}{050}{-}{RRR} \\ % two
  \testkern{LLL}{-}{051}{-}{RRR} \\ % three
  \testkern{LLL}{-}{052}{-}{RRR} \\ % four
  \testkern{LLL}{-}{053}{-}{RRR} \\ % five
  \testkern{LLL}{-}{054}{-}{RRR} \\ % six
  \testkern{LLL}{-}{055}{-}{RRR} \\ % seven
  \testkern{LLL}{-}{056}{-}{RRR} \\ % eight
  \testkern{LLL}{-}{057}{-}{RRR} \\ % nine
  \testkern{LLL}{-}{065}{-}{RRR} \\ % A
  \testkern{LLL}{-}{128}{-}{RRR} \\ % Abreve
  \testkern{LLL}{-}{129}{-}{RRR} \\ % Aogonek
  \testkern{LLL}{-}{192}{-}{RRR} \\ % Agrave
  \testkern{LLL}{-}{193}{-}{RRR} \\ % Aacute
  \testkern{LLL}{-}{194}{-}{RRR} \\ % Acircumflex
  \testkern{LLL}{-}{195}{-}{RRR} \\ % Atilde
  \testkern{LLL}{-}{196}{-}{RRR} \\ % Adieresis
  \testkern{LLL}{-}{197}{-}{RRR} \\ % Aring
  \testkern{LLL}{-}{198}{-}{RRR} \\ % AE
  \testkern{LLL}{-}{066}{-}{RRR} \\ % B
  \testkern{LLL}{-}{067}{-}{RRR} \\ % C
  \testkern{LLL}{-}{130}{-}{RRR} \\ % Cacute
  \testkern{LLL}{-}{131}{-}{RRR} \\ % Ccaron
  \testkern{LLL}{-}{199}{-}{RRR} \\ % Ccedilla
  \testkern{LLL}{-}{068}{-}{RRR} \\ % D
  \testkern{LLL}{-}{132}{-}{RRR} \\ % Dcaron
  \testkern{LLL}{-}{208}{-}{RRR} \\ % Eth
  \testkern{LLL}{-}{069}{-}{RRR} \\ % E
  \testkern{LLL}{-}{133}{-}{RRR} \\ % Ecaron
  \testkern{LLL}{-}{134}{-}{RRR} \\ % Eogonek
  \testkern{LLL}{-}{200}{-}{RRR} \\ % Egrave
  \testkern{LLL}{-}{201}{-}{RRR} \\ % Eacute
  \testkern{LLL}{-}{202}{-}{RRR} \\ % Ecircumflex
  \testkern{LLL}{-}{203}{-}{RRR} \\ % Edieresis
  \testkern{LLL}{-}{070}{-}{RRR} \\ % F
  \testkern{LLL}{-}{071}{-}{RRR} \\ % G
  \testkern{LLL}{-}{135}{-}{RRR} \\ % Gbreve
  \testkern{LLL}{-}{072}{-}{RRR} \\ % H
  \testkern{LLL}{-}{073}{-}{RRR} \\ % I
  \testkern{LLL}{-}{157}{-}{RRR} \\ % Idotaccent
  \testkern{LLL}{-}{204}{-}{RRR} \\ % Igrave
  \testkern{LLL}{-}{205}{-}{RRR} \\ % Iacute
  \testkern{LLL}{-}{206}{-}{RRR} \\ % Icircumflex
  \testkern{LLL}{-}{207}{-}{RRR} \\ % Idieresis
  \testkern{LLL}{-}{156}{-}{RRR} \\ % IJ
  \testkern{LLL}{-}{074}{-}{RRR} \\ % J
  \testkern{LLL}{-}{075}{-}{RRR} \\ % K
  \testkern{LLL}{-}{076}{-}{RRR} \\ % L
  \testkern{LLL}{-}{136}{-}{RRR} \\ % Lacute
  \testkern{LLL}{-}{137}{-}{RRR} \\ % Lcaron
  \testkern{LLL}{-}{138}{-}{RRR} \\ % Lslash
  \testkern{LLL}{-}{077}{-}{RRR} \\ % M
  \testkern{LLL}{-}{078}{-}{RRR} \\ % N
  \testkern{LLL}{-}{139}{-}{RRR} \\ % Nacute
  \testkern{LLL}{-}{140}{-}{RRR} \\ % Ncaron
  \testkern{LLL}{-}{209}{-}{RRR} \\ % Ntilde
  \testkern{LLL}{-}{079}{-}{RRR} \\ % O
  \testkern{LLL}{-}{142}{-}{RRR} \\ % Ohungarumlaut
  \testkern{LLL}{-}{210}{-}{RRR} \\ % Ograve
  \testkern{LLL}{-}{211}{-}{RRR} \\ % Oacute
  \testkern{LLL}{-}{212}{-}{RRR} \\ % Ocircumflex
  \testkern{LLL}{-}{213}{-}{RRR} \\ % Otilde
  \testkern{LLL}{-}{214}{-}{RRR} \\ % Odieresis
  \testkern{LLL}{-}{215}{-}{RRR} \\ % OE
  \testkern{LLL}{-}{216}{-}{RRR} \\ % Oslash
  \testkern{LLL}{-}{080}{-}{RRR} \\ % P
  \testkern{LLL}{-}{081}{-}{RRR} \\ % Q
  \testkern{LLL}{-}{082}{-}{RRR} \\ % R
  \testkern{LLL}{-}{143}{-}{RRR} \\ % Racute
  \testkern{LLL}{-}{144}{-}{RRR} \\ % Rcaron
  \testkern{LLL}{-}{083}{-}{RRR} \\ % S
  \testkern{LLL}{-}{145}{-}{RRR} \\ % Sacute
  \testkern{LLL}{-}{146}{-}{RRR} \\ % Scaron
  \testkern{LLL}{-}{147}{-}{RRR} \\ % Scedilla
  \testkern{LLL}{-}{223}{-}{RRR} \\ % SS
  \testkern{LLL}{-}{036}{-}{RRR} \\ % dollar
  \testkern{LLL}{-}{084}{-}{RRR} \\ % T
  \testkern{LLL}{-}{148}{-}{RRR} \\ % Tcaron
  \testkern{LLL}{-}{149}{-}{RRR} \\ % Tcedilla
  \testkern{LLL}{-}{085}{-}{RRR} \\ % U
  \testkern{LLL}{-}{150}{-}{RRR} \\ % Uhungarumlaut
  \testkern{LLL}{-}{151}{-}{RRR} \\ % Uring
  \testkern{LLL}{-}{217}{-}{RRR} \\ % Ugrave
  \testkern{LLL}{-}{218}{-}{RRR} \\ % Uacute
  \testkern{LLL}{-}{219}{-}{RRR} \\ % Ucircumflex
  \testkern{LLL}{-}{220}{-}{RRR} \\ % Udieresis
  \testkern{LLL}{-}{086}{-}{RRR} \\ % V
  \testkern{LLL}{-}{087}{-}{RRR} \\ % W
  \testkern{LLL}{-}{088}{-}{RRR} \\ % X
  \testkern{LLL}{-}{089}{-}{RRR} \\ % Y
  \testkern{LLL}{-}{152}{-}{RRR} \\ % Ydieresis
  \testkern{LLL}{-}{221}{-}{RRR} \\ % Yacute
  \testkern{LLL}{-}{090}{-}{RRR} \\ % Z
  \testkern{LLL}{-}{153}{-}{RRR} \\ % Zacute
  \testkern{LLL}{-}{154}{-}{RRR} \\ % Zcaron
  \testkern{LLL}{-}{155}{-}{RRR} \\ % Zdotaccent
  \testkern{LLL}{-}{141}{-}{RRR} \\ % Ng
  \testkern{LLL}{-}{222}{-}{RRR} \\ % Thorn
  \testkern{LLL}{-}{097}{-}{RRR} \\ % a
  \testkern{LLL}{-}{160}{-}{RRR} \\ % abreve
  \testkern{LLL}{-}{161}{-}{RRR} \\ % aogonek
  \testkern{LLL}{-}{224}{-}{RRR} \\ % agrave
  \testkern{LLL}{-}{225}{-}{RRR} \\ % aacute
  \testkern{LLL}{-}{226}{-}{RRR} \\ % acircumflex
  \testkern{LLL}{-}{227}{-}{RRR} \\ % atilde
  \testkern{LLL}{-}{228}{-}{RRR} \\ % adieresis
  \testkern{LLL}{-}{229}{-}{RRR} \\ % aring
  \testkern{LLL}{-}{230}{-}{RRR} \\ % ae
  \testkern{LLL}{-}{098}{-}{RRR} \\ % b
  \testkern{LLL}{-}{099}{-}{RRR} \\ % c
  \testkern{LLL}{-}{162}{-}{RRR} \\ % cacute
  \testkern{LLL}{-}{163}{-}{RRR} \\ % ccaron
  \testkern{LLL}{-}{231}{-}{RRR} \\ % ccedilla
  \testkern{LLL}{-}{100}{-}{RRR} \\ % d
  \testkern{LLL}{-}{158}{-}{RRR} \\ % dbar
  \testkern{LLL}{-}{164}{-}{RRR} \\ % dcaron
  \testkern{LLL}{-}{101}{-}{RRR} \\ % e
  \testkern{LLL}{-}{165}{-}{RRR} \\ % ecaron
  \testkern{LLL}{-}{166}{-}{RRR} \\ % eogonek
  \testkern{LLL}{-}{232}{-}{RRR} \\ % egrave
  \testkern{LLL}{-}{233}{-}{RRR} \\ % eacute
  \testkern{LLL}{-}{234}{-}{RRR} \\ % ecircumflex
  \testkern{LLL}{-}{235}{-}{RRR} \\ % edieresis
  \testkern{LLL}{-}{102}{-}{RRR} \\ % f
  \testkern{LLL}{-}{027}{-}{RRR} \\ % ff
  \testkern{LLL}{-}{028}{-}{RRR} \\ % fi
  \testkern{LLL}{-}{029}{-}{RRR} \\ % fl
  \testkern{LLL}{-}{030}{-}{RRR} \\ % ffi
  \testkern{LLL}{-}{031}{-}{RRR} \\ % ffl
  \testkern{LLL}{-}{103}{-}{RRR} \\ % g
  \testkern{LLL}{-}{167}{-}{RRR} \\ % gbreve
  \testkern{LLL}{-}{104}{-}{RRR} \\ % h
  \testkern{LLL}{-}{105}{-}{RRR} \\ % i
  \testkern{LLL}{-}{025}{-}{RRR} \\ % dotlessi
  \testkern{LLL}{-}{236}{-}{RRR} \\ % igrave
  \testkern{LLL}{-}{237}{-}{RRR} \\ % iacute
  \testkern{LLL}{-}{238}{-}{RRR} \\ % icircumflex
  \testkern{LLL}{-}{239}{-}{RRR} \\ % idieresis
  \testkern{LLL}{-}{188}{-}{RRR} \\ % ij
  \testkern{LLL}{-}{106}{-}{RRR} \\ % j
  \testkern{LLL}{-}{026}{-}{RRR} \\ % dotlessj
  \testkern{LLL}{-}{107}{-}{RRR} \\ % k
  \testkern{LLL}{-}{108}{-}{RRR} \\ % l
  \testkern{LLL}{-}{168}{-}{RRR} \\ % lacute
  \testkern{LLL}{-}{169}{-}{RRR} \\ % lcaron
  \testkern{LLL}{-}{170}{-}{RRR} \\ % lslash
  \testkern{LLL}{-}{109}{-}{RRR} \\ % m
  \testkern{LLL}{-}{110}{-}{RRR} \\ % n
  \testkern{LLL}{-}{171}{-}{RRR} \\ % nacute
  \testkern{LLL}{-}{172}{-}{RRR} \\ % ncaron
  \testkern{LLL}{-}{241}{-}{RRR} \\ % ntilde
  \testkern{LLL}{-}{111}{-}{RRR} \\ % o
  \testkern{LLL}{-}{174}{-}{RRR} \\ % ohungarumlaut
  \testkern{LLL}{-}{242}{-}{RRR} \\ % ograve
  \testkern{LLL}{-}{243}{-}{RRR} \\ % oacute
  \testkern{LLL}{-}{244}{-}{RRR} \\ % ocircumflex
  \testkern{LLL}{-}{245}{-}{RRR} \\ % otilde
  \testkern{LLL}{-}{246}{-}{RRR} \\ % odieresis
  \testkern{LLL}{-}{247}{-}{RRR} \\ % oe
  \testkern{LLL}{-}{248}{-}{RRR} \\ % oslash
  \testkern{LLL}{-}{112}{-}{RRR} \\ % p
  \testkern{LLL}{-}{113}{-}{RRR} \\ % q
  \testkern{LLL}{-}{114}{-}{RRR} \\ % r
  \testkern{LLL}{-}{175}{-}{RRR} \\ % racute
  \testkern{LLL}{-}{176}{-}{RRR} \\ % rcaron
  \testkern{LLL}{-}{115}{-}{RRR} \\ % s
  \testkern{LLL}{-}{177}{-}{RRR} \\ % sacute
  \testkern{LLL}{-}{178}{-}{RRR} \\ % scaron
  \testkern{LLL}{-}{179}{-}{RRR} \\ % scedilla
  \testkern{LLL}{-}{116}{-}{RRR} \\ % t
  \testkern{LLL}{-}{180}{-}{RRR} \\ % tcaron
  \testkern{LLL}{-}{181}{-}{RRR} \\ % tcedilla
  \testkern{LLL}{-}{117}{-}{RRR} \\ % u
  \testkern{LLL}{-}{182}{-}{RRR} \\ % uhungarumlaut
  \testkern{LLL}{-}{183}{-}{RRR} \\ % uring
  \testkern{LLL}{-}{249}{-}{RRR} \\ % ugrave
  \testkern{LLL}{-}{250}{-}{RRR} \\ % uacute
  \testkern{LLL}{-}{251}{-}{RRR} \\ % ucircumflex
  \testkern{LLL}{-}{252}{-}{RRR} \\ % udieresis
  \testkern{LLL}{-}{118}{-}{RRR} \\ % v
  \testkern{LLL}{-}{119}{-}{RRR} \\ % w
  \testkern{LLL}{-}{120}{-}{RRR} \\ % x
  \testkern{LLL}{-}{121}{-}{RRR} \\ % y
  \testkern{LLL}{-}{184}{-}{RRR} \\ % ydieresis
  \testkern{LLL}{-}{253}{-}{RRR} \\ % yacute
  \testkern{LLL}{-}{122}{-}{RRR} \\ % z
  \testkern{LLL}{-}{185}{-}{RRR} \\ % zacute
  \testkern{LLL}{-}{186}{-}{RRR} \\ % zcaron
  \testkern{LLL}{-}{187}{-}{RRR} \\ % zdotaccent
  \testkern{LLL}{-}{240}{-}{RRR} \\ % eth
  \testkern{LLL}{-}{173}{-}{RRR} \\ % ng
  \testkern{LLL}{-}{254}{-}{RRR} \\ % thorn
  \testkern{LLL}{-}{255}{-}{RRR} \\ % germandbls
\end{kerntable}

\end{document}
%</template&t1>
%    \end{macrocode}
%
% \subsubsection{TS1 encoding}
%
%    \begin{macrocode}
%<*template&ts1>
\listfiles
%% Replace the `XXX' in the next line by the 3- or 4-character long
%% abbreviation for your font.
\documentclass[family=XXX]{kerntest}

%% Replace the settings by these you want to test.
\kernsetup{encoding=TS1,series=m,shape=n,example=hello}
\kernsetup{size=14.40pt,baselineskip=16.5pt,papersize=a4paper}

%% The next line can be used to add a name suffix to the output |mtx| file.
%% \kernsetup{extraname=normal}

%% If you are using a font with different design sizes and if you want
%% to test one design size scaled to another one, you may input a
%% modified fd file for your font. To generate this new fd file, just
%% copy the original one, rename it, and modify the entries for the
%% font shapes to use the design size you want to test.
%% \input{t1XXX-1200.fd}

\begin{document}

%% This table of characters is sorted by similar glyphs, not by the
%% encoding.
%% Replace `{LLL}' and `{RRR}' in columns 1 resp. 5 by these glyphs
%% that shall be tested.
\begin{kerntable}
  \testkern{LLL}{-}{000}{-}{RRR} \\ % capitalgrave
  \testkern{LLL}{-}{001}{-}{RRR} \\ % capitalacute
  \testkern{LLL}{-}{002}{-}{RRR} \\ % capitalcircumflex
  \testkern{LLL}{-}{003}{-}{RRR} \\ % capitaltilde
  \testkern{LLL}{-}{004}{-}{RRR} \\ % capitaldieresis
  \testkern{LLL}{-}{005}{-}{RRR} \\ % capitalhungarumlaut
  \testkern{LLL}{-}{006}{-}{RRR} \\ % capitalring
  \testkern{LLL}{-}{007}{-}{RRR} \\ % capitalcaron
  \testkern{LLL}{-}{008}{-}{RRR} \\ % capitalbreve
  \testkern{LLL}{-}{009}{-}{RRR} \\ % capitalmacron
  \testkern{LLL}{-}{010}{-}{RRR} \\ % capitaldotaccent
  \testkern{LLL}{-}{011}{-}{RRR} \\ % cedilla
  \testkern{LLL}{-}{012}{-}{RRR} \\ % ogonek
  \testkern{LLL}{-}{013}{-}{RRR} \\ % quotesinglbase
  \testkern{LLL}{-}{014}{-}{RRR} \\
  \testkern{LLL}{-}{015}{-}{RRR} \\
  \testkern{LLL}{-}{016}{-}{RRR} \\
  \testkern{LLL}{-}{017}{-}{RRR} \\
  \testkern{LLL}{-}{018}{-}{RRR} \\ % quotedblbase
  \testkern{LLL}{-}{019}{-}{RRR} \\
  \testkern{LLL}{-}{020}{-}{RRR} \\
  \testkern{LLL}{-}{021}{-}{RRR} \\ % twelveudash
  \testkern{LLL}{-}{022}{-}{RRR} \\ % threequartersemdash
  \testkern{LLL}{-}{023}{-}{RRR} \\ % capitalcompwordmark
  \testkern{LLL}{-}{024}{-}{RRR} \\ % arrowleft
  \testkern{LLL}{-}{025}{-}{RRR} \\ % arrowright
  \testkern{LLL}{-}{026}{-}{RRR} \\ % tieaccentlowercase
  \testkern{LLL}{-}{027}{-}{RRR} \\ % tieaccentcapital
  \testkern{LLL}{-}{028}{-}{RRR} \\ % newtieaccentlowercase
  \testkern{LLL}{-}{029}{-}{RRR} \\ % newtieaccentcapital
  \testkern{LLL}{-}{030}{-}{RRR} \\ % ascendercompwordmark
  \testkern{LLL}{-}{031}{-}{RRR} \\ % blank
  \testkern{LLL}{-}{032}{-}{RRR} \\
  \testkern{LLL}{-}{033}{-}{RRR} \\
  \testkern{LLL}{-}{034}{-}{RRR} \\
  \testkern{LLL}{-}{035}{-}{RRR} \\
  \testkern{LLL}{-}{036}{-}{RRR} \\ % dollar
  \testkern{LLL}{-}{037}{-}{RRR} \\
  \testkern{LLL}{-}{038}{-}{RRR} \\
  \testkern{LLL}{-}{039}{-}{RRR} \\ % quotesingle
  \testkern{LLL}{-}{040}{-}{RRR} \\
  \testkern{LLL}{-}{041}{-}{RRR} \\
  \testkern{LLL}{-}{042}{-}{RRR} \\ % asteriskcentered
  \testkern{LLL}{-}{043}{-}{RRR} \\
  \testkern{LLL}{-}{044}{-}{RRR} \\ % comma
  \testkern{LLL}{-}{045}{-}{RRR} \\ % hyphendbl
  \testkern{LLL}{-}{046}{-}{RRR} \\ % period
  \testkern{LLL}{-}{047}{-}{RRR} \\ % fraction
  \testkern{LLL}{-}{048}{-}{RRR} \\ % zerooldstyle
  \testkern{LLL}{-}{049}{-}{RRR} \\ % oneoldstyle
  \testkern{LLL}{-}{050}{-}{RRR} \\ % twooldstyle
  \testkern{LLL}{-}{051}{-}{RRR} \\ % threeoldstyle
  \testkern{LLL}{-}{052}{-}{RRR} \\ % fouroldstyle
  \testkern{LLL}{-}{053}{-}{RRR} \\ % fiveoldstyle
  \testkern{LLL}{-}{054}{-}{RRR} \\ % sixoldstyle
  \testkern{LLL}{-}{055}{-}{RRR} \\ % sevenoldstyle
  \testkern{LLL}{-}{056}{-}{RRR} \\ % eightoldstyle
  \testkern{LLL}{-}{057}{-}{RRR} \\ % nineoldstyle
  \testkern{LLL}{-}{058}{-}{RRR} \\
  \testkern{LLL}{-}{059}{-}{RRR} \\
  \testkern{LLL}{-}{060}{-}{RRR} \\ % angbracketleft
  \testkern{LLL}{-}{061}{-}{RRR} \\ % minus
  \testkern{LLL}{-}{062}{-}{RRR} \\ % angbracketright
  \testkern{LLL}{-}{063}{-}{RRR} \\
  \testkern{LLL}{-}{064}{-}{RRR} \\
  \testkern{LLL}{-}{065}{-}{RRR} \\
  \testkern{LLL}{-}{066}{-}{RRR} \\
  \testkern{LLL}{-}{067}{-}{RRR} \\
  \testkern{LLL}{-}{068}{-}{RRR} \\
  \testkern{LLL}{-}{069}{-}{RRR} \\
  \testkern{LLL}{-}{070}{-}{RRR} \\
  \testkern{LLL}{-}{071}{-}{RRR} \\
  \testkern{LLL}{-}{072}{-}{RRR} \\
  \testkern{LLL}{-}{073}{-}{RRR} \\
  \testkern{LLL}{-}{074}{-}{RRR} \\
  \testkern{LLL}{-}{075}{-}{RRR} \\
  \testkern{LLL}{-}{076}{-}{RRR} \\
  \testkern{LLL}{-}{077}{-}{RRR} \\ % Omegainv
  \testkern{LLL}{-}{078}{-}{RRR} \\
  \testkern{LLL}{-}{079}{-}{RRR} \\ % bigcircle
  \testkern{LLL}{-}{080}{-}{RRR} \\
  \testkern{LLL}{-}{081}{-}{RRR} \\
  \testkern{LLL}{-}{082}{-}{RRR} \\
  \testkern{LLL}{-}{083}{-}{RRR} \\
  \testkern{LLL}{-}{084}{-}{RRR} \\
  \testkern{LLL}{-}{085}{-}{RRR} \\
  \testkern{LLL}{-}{086}{-}{RRR} \\
  \testkern{LLL}{-}{087}{-}{RRR} \\ % Omega
  \testkern{LLL}{-}{088}{-}{RRR} \\
  \testkern{LLL}{-}{089}{-}{RRR} \\
  \testkern{LLL}{-}{090}{-}{RRR} \\
  \testkern{LLL}{-}{091}{-}{RRR} \\ % openbracketleft
  \testkern{LLL}{-}{092}{-}{RRR} \\
  \testkern{LLL}{-}{093}{-}{RRR} \\ % openbracketright
  \testkern{LLL}{-}{094}{-}{RRR} \\ % arrowup
  \testkern{LLL}{-}{095}{-}{RRR} \\ % arrowdown
  \testkern{LLL}{-}{096}{-}{RRR} \\ % asciigrave
  \testkern{LLL}{-}{097}{-}{RRR} \\
  \testkern{LLL}{-}{098}{-}{RRR} \\ % born
  \testkern{LLL}{-}{099}{-}{RRR} \\ % divorced
  \testkern{LLL}{-}{100}{-}{RRR} \\ % died
  \testkern{LLL}{-}{101}{-}{RRR} \\
  \testkern{LLL}{-}{102}{-}{RRR} \\
  \testkern{LLL}{-}{103}{-}{RRR} \\
  \testkern{LLL}{-}{104}{-}{RRR} \\
  \testkern{LLL}{-}{105}{-}{RRR} \\
  \testkern{LLL}{-}{106}{-}{RRR} \\
  \testkern{LLL}{-}{107}{-}{RRR} \\
  \testkern{LLL}{-}{108}{-}{RRR} \\ % leaf
  \testkern{LLL}{-}{109}{-}{RRR} \\ % married
  \testkern{LLL}{-}{110}{-}{RRR} \\ % musicalnote
  \testkern{LLL}{-}{111}{-}{RRR} \\
  \testkern{LLL}{-}{112}{-}{RRR} \\
  \testkern{LLL}{-}{113}{-}{RRR} \\
  \testkern{LLL}{-}{114}{-}{RRR} \\
  \testkern{LLL}{-}{115}{-}{RRR} \\
  \testkern{LLL}{-}{116}{-}{RRR} \\
  \testkern{LLL}{-}{117}{-}{RRR} \\
  \testkern{LLL}{-}{118}{-}{RRR} \\
  \testkern{LLL}{-}{119}{-}{RRR} \\
  \testkern{LLL}{-}{120}{-}{RRR} \\
  \testkern{LLL}{-}{121}{-}{RRR} \\
  \testkern{LLL}{-}{122}{-}{RRR} \\
  \testkern{LLL}{-}{123}{-}{RRR} \\
  \testkern{LLL}{-}{124}{-}{RRR} \\
  \testkern{LLL}{-}{125}{-}{RRR} \\
  \testkern{LLL}{-}{126}{-}{RRR} \\ % tildelow
  \testkern{LLL}{-}{127}{-}{RRR} \\ % hyphendblchar
  \testkern{LLL}{-}{128}{-}{RRR} \\ % asciibreve
  \testkern{LLL}{-}{129}{-}{RRR} \\ % asciicaron
  \testkern{LLL}{-}{130}{-}{RRR} \\ % asciiacutedbl
  \testkern{LLL}{-}{131}{-}{RRR} \\ % asciigravedbl
  \testkern{LLL}{-}{132}{-}{RRR} \\ % dagger
  \testkern{LLL}{-}{133}{-}{RRR} \\ % daggerdbl
  \testkern{LLL}{-}{134}{-}{RRR} \\ % bardbl
  \testkern{LLL}{-}{135}{-}{RRR} \\ % perthousand
  \testkern{LLL}{-}{136}{-}{RRR} \\ % bullet
  \testkern{LLL}{-}{137}{-}{RRR} \\ % centigrade
  \testkern{LLL}{-}{138}{-}{RRR} \\ % dollaroldstyle
  \testkern{LLL}{-}{139}{-}{RRR} \\ % centoldstyle
  \testkern{LLL}{-}{140}{-}{RRR} \\ % florin
  \testkern{LLL}{-}{141}{-}{RRR} \\ % colonmonetary
  \testkern{LLL}{-}{142}{-}{RRR} \\ % won
  \testkern{LLL}{-}{143}{-}{RRR} \\ % naira
  \testkern{LLL}{-}{144}{-}{RRR} \\ % guarani
  \testkern{LLL}{-}{145}{-}{RRR} \\ % peso
  \testkern{LLL}{-}{146}{-}{RRR} \\ % lira
  \testkern{LLL}{-}{147}{-}{RRR} \\ % recipe
  \testkern{LLL}{-}{148}{-}{RRR} \\ % interrobang
  \testkern{LLL}{-}{149}{-}{RRR} \\ % interrobangdown
  \testkern{LLL}{-}{150}{-}{RRR} \\ % dong
  \testkern{LLL}{-}{151}{-}{RRR} \\ % trademark
  \testkern{LLL}{-}{152}{-}{RRR} \\ % pertenthousand
  \testkern{LLL}{-}{153}{-}{RRR} \\ % pilcrow
  \testkern{LLL}{-}{154}{-}{RRR} \\ % baht
  \testkern{LLL}{-}{155}{-}{RRR} \\ % numero
  \testkern{LLL}{-}{156}{-}{RRR} \\ % discount
  \testkern{LLL}{-}{157}{-}{RRR} \\ % estimated
  \testkern{LLL}{-}{158}{-}{RRR} \\ % openbullet
  \testkern{LLL}{-}{159}{-}{RRR} \\ % servicemark
  \testkern{LLL}{-}{160}{-}{RRR} \\ % quillbracketleft
  \testkern{LLL}{-}{161}{-}{RRR} \\ % quillbracketright
  \testkern{LLL}{-}{162}{-}{RRR} \\ % cent
  \testkern{LLL}{-}{163}{-}{RRR} \\ % sterling
  \testkern{LLL}{-}{164}{-}{RRR} \\ % currency
  \testkern{LLL}{-}{165}{-}{RRR} \\ % yen
  \testkern{LLL}{-}{166}{-}{RRR} \\ % brokenbar
  \testkern{LLL}{-}{167}{-}{RRR} \\ % section
  \testkern{LLL}{-}{168}{-}{RRR} \\ % asciidieresis
  \testkern{LLL}{-}{169}{-}{RRR} \\ % copyright
  \testkern{LLL}{-}{170}{-}{RRR} \\ % ordfeminine
  \testkern{LLL}{-}{171}{-}{RRR} \\ % copyleft
  \testkern{LLL}{-}{172}{-}{RRR} \\ % logicalnot
  \testkern{LLL}{-}{173}{-}{RRR} \\ % circledP
  \testkern{LLL}{-}{174}{-}{RRR} \\ % registered
  \testkern{LLL}{-}{175}{-}{RRR} \\ % asciimacron
  \testkern{LLL}{-}{176}{-}{RRR} \\ % degree
  \testkern{LLL}{-}{177}{-}{RRR} \\ % plusminus
  \testkern{LLL}{-}{178}{-}{RRR} \\ % twosuperior
  \testkern{LLL}{-}{179}{-}{RRR} \\ % threesuperior
  \testkern{LLL}{-}{180}{-}{RRR} \\ % asciiacute
  \testkern{LLL}{-}{181}{-}{RRR} \\ % mu
  \testkern{LLL}{-}{182}{-}{RRR} \\ % paragraph
  \testkern{LLL}{-}{183}{-}{RRR} \\ % periodcentered
  \testkern{LLL}{-}{184}{-}{RRR} \\ % referencemark
  \testkern{LLL}{-}{185}{-}{RRR} \\ % onesuperior
  \testkern{LLL}{-}{186}{-}{RRR} \\ % ordmasculine
  \testkern{LLL}{-}{187}{-}{RRR} \\ % radical
  \testkern{LLL}{-}{188}{-}{RRR} \\ % onequarter
  \testkern{LLL}{-}{189}{-}{RRR} \\ % onehalf
  \testkern{LLL}{-}{190}{-}{RRR} \\ % threequarters
  \testkern{LLL}{-}{191}{-}{RRR} \\ % euro
  \testkern{LLL}{-}{192}{-}{RRR} \\
  \testkern{LLL}{-}{193}{-}{RRR} \\
  \testkern{LLL}{-}{194}{-}{RRR} \\
  \testkern{LLL}{-}{195}{-}{RRR} \\
  \testkern{LLL}{-}{196}{-}{RRR} \\
  \testkern{LLL}{-}{197}{-}{RRR} \\
  \testkern{LLL}{-}{198}{-}{RRR} \\
  \testkern{LLL}{-}{199}{-}{RRR} \\
  \testkern{LLL}{-}{200}{-}{RRR} \\
  \testkern{LLL}{-}{201}{-}{RRR} \\
  \testkern{LLL}{-}{202}{-}{RRR} \\
  \testkern{LLL}{-}{203}{-}{RRR} \\
  \testkern{LLL}{-}{204}{-}{RRR} \\
  \testkern{LLL}{-}{205}{-}{RRR} \\
  \testkern{LLL}{-}{206}{-}{RRR} \\
  \testkern{LLL}{-}{207}{-}{RRR} \\
  \testkern{LLL}{-}{208}{-}{RRR} \\
  \testkern{LLL}{-}{209}{-}{RRR} \\
  \testkern{LLL}{-}{210}{-}{RRR} \\
  \testkern{LLL}{-}{211}{-}{RRR} \\
  \testkern{LLL}{-}{212}{-}{RRR} \\
  \testkern{LLL}{-}{213}{-}{RRR} \\
  \testkern{LLL}{-}{214}{-}{RRR} \\ % multiply
  \testkern{LLL}{-}{215}{-}{RRR} \\
  \testkern{LLL}{-}{216}{-}{RRR} \\
  \testkern{LLL}{-}{217}{-}{RRR} \\
  \testkern{LLL}{-}{218}{-}{RRR} \\
  \testkern{LLL}{-}{219}{-}{RRR} \\
  \testkern{LLL}{-}{220}{-}{RRR} \\
  \testkern{LLL}{-}{221}{-}{RRR} \\
  \testkern{LLL}{-}{222}{-}{RRR} \\
  \testkern{LLL}{-}{223}{-}{RRR} \\
  \testkern{LLL}{-}{224}{-}{RRR} \\
  \testkern{LLL}{-}{225}{-}{RRR} \\
  \testkern{LLL}{-}{226}{-}{RRR} \\
  \testkern{LLL}{-}{227}{-}{RRR} \\
  \testkern{LLL}{-}{228}{-}{RRR} \\
  \testkern{LLL}{-}{229}{-}{RRR} \\
  \testkern{LLL}{-}{230}{-}{RRR} \\
  \testkern{LLL}{-}{231}{-}{RRR} \\
  \testkern{LLL}{-}{232}{-}{RRR} \\
  \testkern{LLL}{-}{233}{-}{RRR} \\
  \testkern{LLL}{-}{234}{-}{RRR} \\
  \testkern{LLL}{-}{235}{-}{RRR} \\
  \testkern{LLL}{-}{236}{-}{RRR} \\
  \testkern{LLL}{-}{237}{-}{RRR} \\
  \testkern{LLL}{-}{238}{-}{RRR} \\
  \testkern{LLL}{-}{239}{-}{RRR} \\
  \testkern{LLL}{-}{240}{-}{RRR} \\
  \testkern{LLL}{-}{241}{-}{RRR} \\
  \testkern{LLL}{-}{242}{-}{RRR} \\
  \testkern{LLL}{-}{243}{-}{RRR} \\
  \testkern{LLL}{-}{244}{-}{RRR} \\
  \testkern{LLL}{-}{245}{-}{RRR} \\
  \testkern{LLL}{-}{246}{-}{RRR} \\ % divide
  \testkern{LLL}{-}{247}{-}{RRR} \\
  \testkern{LLL}{-}{248}{-}{RRR} \\
  \testkern{LLL}{-}{249}{-}{RRR} \\
  \testkern{LLL}{-}{250}{-}{RRR} \\
  \testkern{LLL}{-}{251}{-}{RRR} \\
  \testkern{LLL}{-}{252}{-}{RRR} \\
  \testkern{LLL}{-}{253}{-}{RRR} \\
  \testkern{LLL}{-}{254}{-}{RRR} \\
  \testkern{LLL}{-}{255}{-}{RRR} \\
\end{kerntable}

\end{document}
%</template&ts1>
%    \end{macrocode}
%
% \subsubsection{OT1 encoding}
%
%    \begin{macrocode}
%<*template&ot1>
\listfiles
%% Replace the `XXX' in the next line by the 3- or 4-character long
%% abbreviation for your font.
\documentclass[family=XXX]{kerntest}

%% Replace the settings by these you want to test.
\kernsetup{encoding=OT1,series=m,shape=n,example=hello}
\kernsetup{size=14.40pt,baselineskip=16.5pt,papersize=a4paper}

%% The next line can be used to add a name suffix to the output mtx file.
%% \kernsetup{extraname=normal}

%% Set encoding parameters.
%% Set ligaturing: 2=all, 1=some, 0=none
%% \encodingsetup{ligaturing=2}
%% Normal: dollar, Italic: sterling
%% \encodingsetup{italicizing=false}

%% If you are using a font with different design sizes and if you want
%% to test one design size scaled to another one, you may input a
%% modified fd file for your font. To generate this new fd file, just
%% copy the original one, rename it, and modify the entries for the
%% font shapes to use the design size you want to test.
%% \input{ot1XXX-1200.fd}

%% The following lines show some possible glyph classes. You should
%% add all classes you need. 
\newglyphclass{right}{E}{E,AE,OE}

\newglyphclass{left}{H}{B,D,F,H,I,J,K,L,N,P,R}

\newglyphclass{right}{H}{H,I,J,N}

\newglyphclass{right}{S}{S,dollar}
\newglyphclass{left}{S}{S,dollar}

\newglyphclass{left}{a}{a,ae}
\newglyphclass{right}{e}{e,ae,oe}

\newglyphclass{left}{f}{f,ff,fi,fl,ffi,ffl}
\newglyphclass{right}{f}{f,ff}

\newglyphclass{right}{i}{i,fi,ffi,dotlessi}
\newglyphclass{left}{i}{i,dotlessi}

\newglyphclass{right}{l}{fl,ffl,l}

\newglyphclass{right}{m}{m,n}
\newglyphclass{left}{m}{m,n}

\newglyphclass{left}{o}{o,oe}

\begin{document}

%% This table of characters is sorted by similar glyphs, not by the
%% encoding.
%% Replace `{LLL}' and `{RRR}' in columns 1 resp. 5 by these glyphs
%% that shall be tested.
\begin{kerntable}
  \testkern{LLL}{-}{018}{-}{RRR} \\ % grave
  \testkern{LLL}{-}{019}{-}{RRR} \\ % acute
  \testkern{LLL}{-}{094}{-}{RRR} \\ % circumflex
  \testkern{LLL}{-}{126}{-}{RRR} \\ % tilde
  \testkern{LLL}{-}{127}{-}{RRR} \\ % dieresis
  \testkern{LLL}{-}{125}{-}{RRR} \\ % hungarumlaut/braceright
  \testkern{LLL}{-}{023}{-}{RRR} \\ % ringfitted
  \testkern{LLL}{-}{020}{-}{RRR} \\ % caron
  \testkern{LLL}{-}{021}{-}{RRR} \\ % breve
  \testkern{LLL}{-}{022}{-}{RRR} \\ % macron
  \testkern{LLL}{-}{095}{-}{RRR} \\ % dotaccent/underscore
  \testkern{LLL}{-}{024}{-}{RRR} \\ % cedilla
  \testkern{LLL}{-}{042}{-}{RRR} \\ % asterisk
  \testkern{LLL}{-}{032}{-}{RRR} \\ % lslashslash/visiblespace
  \testkern{LLL}{-}{096}{-}{RRR} \\ % quoteleft
  \testkern{LLL}{-}{039}{-}{RRR} \\ % quoteright
  \testkern{LLL}{-}{092}{-}{RRR} \\ % quotedblleft
  \testkern{LLL}{-}{034}{-}{RRR} \\ % quotedblright/quotedbl
  \testkern{LLL}{-}{046}{-}{RRR} \\ % period
  \testkern{LLL}{-}{044}{-}{RRR} \\ % comma
  \testkern{LLL}{-}{058}{-}{RRR} \\ % colon
  \testkern{LLL}{-}{059}{-}{RRR} \\ % semicolon
  \testkern{LLL}{-}{033}{-}{RRR} \\ % exclam
  \testkern{LLL}{-}{063}{-}{RRR} \\ % question
  \testkern{LLL}{-}{060}{-}{RRR} \\ % exclamdown/less
  \testkern{LLL}{-}{062}{-}{RRR} \\ % questiondown/greater
  \testkern{LLL}{-}{045}{-}{RRR} \\ % hyphen
  \testkern{LLL}{-}{123}{-}{RRR} \\ % rangedash/braceleft
  \testkern{LLL}{-}{124}{-}{RRR} \\ % punctdash/bar
  \testkern{LLL}{-}{043}{-}{RRR} \\ % plus
  \testkern{LLL}{-}{061}{-}{RRR} \\ % equal
  \testkern{LLL}{-}{047}{-}{RRR} \\ % slash
  \testkern{LLL}{-}{040}{-}{RRR} \\ % parenleft
  \testkern{LLL}{-}{041}{-}{RRR} \\ % parenright
  \testkern{LLL}{-}{091}{-}{RRR} \\ % bracketleft
  \testkern{LLL}{-}{093}{-}{RRR} \\ % bracketright
  \testkern{LLL}{-}{035}{-}{RRR} \\ % numbersign
  \testkern{LLL}{-}{037}{-}{RRR} \\ % percent
  \testkern{LLL}{-}{038}{-}{RRR} \\ % ampersand
  \testkern{LLL}{-}{064}{-}{RRR} \\ % at
  \testkern{LLL}{-}{048}{-}{RRR} \\ % zero
  \testkern{LLL}{-}{049}{-}{RRR} \\ % one
  \testkern{LLL}{-}{050}{-}{RRR} \\ % two
  \testkern{LLL}{-}{051}{-}{RRR} \\ % three
  \testkern{LLL}{-}{052}{-}{RRR} \\ % four
  \testkern{LLL}{-}{053}{-}{RRR} \\ % five
  \testkern{LLL}{-}{054}{-}{RRR} \\ % six
  \testkern{LLL}{-}{055}{-}{RRR} \\ % seven
  \testkern{LLL}{-}{056}{-}{RRR} \\ % eight
  \testkern{LLL}{-}{057}{-}{RRR} \\ % nine
  \testkern{LLL}{-}{065}{-}{RRR} \\ % A
  \testkern{LLL}{-}{029}{-}{RRR} \\ % AE
  \testkern{LLL}{-}{066}{-}{RRR} \\ % B
  \testkern{LLL}{-}{067}{-}{RRR} \\ % C
  \testkern{LLL}{-}{068}{-}{RRR} \\ % D
  \testkern{LLL}{-}{069}{-}{RRR} \\ % E
  \testkern{LLL}{-}{070}{-}{RRR} \\ % F
  \testkern{LLL}{-}{071}{-}{RRR} \\ % G
  \testkern{LLL}{-}{072}{-}{RRR} \\ % H
  \testkern{LLL}{-}{073}{-}{RRR} \\ % I
  \testkern{LLL}{-}{074}{-}{RRR} \\ % J
  \testkern{LLL}{-}{075}{-}{RRR} \\ % K
  \testkern{LLL}{-}{076}{-}{RRR} \\ % L
  \testkern{LLL}{-}{138}{-}{RRR} \\ % Lslash
  \testkern{LLL}{-}{077}{-}{RRR} \\ % M
  \testkern{LLL}{-}{078}{-}{RRR} \\ % N
  \testkern{LLL}{-}{079}{-}{RRR} \\ % O
  \testkern{LLL}{-}{030}{-}{RRR} \\ % OE
  \testkern{LLL}{-}{031}{-}{RRR} \\ % Oslash
  \testkern{LLL}{-}{080}{-}{RRR} \\ % P
  \testkern{LLL}{-}{081}{-}{RRR} \\ % Q
  \testkern{LLL}{-}{082}{-}{RRR} \\ % R
  \testkern{LLL}{-}{083}{-}{RRR} \\ % S
  \testkern{LLL}{-}{036}{-}{RRR} \\ % dollar/sterling
  \testkern{LLL}{-}{084}{-}{RRR} \\ % T
  \testkern{LLL}{-}{085}{-}{RRR} \\ % U
  \testkern{LLL}{-}{086}{-}{RRR} \\ % V
  \testkern{LLL}{-}{087}{-}{RRR} \\ % W
  \testkern{LLL}{-}{088}{-}{RRR} \\ % X
  \testkern{LLL}{-}{089}{-}{RRR} \\ % Y
  \testkern{LLL}{-}{090}{-}{RRR} \\ % Z
  \testkern{LLL}{-}{097}{-}{RRR} \\ % a
  \testkern{LLL}{-}{026}{-}{RRR} \\ % ae
  \testkern{LLL}{-}{098}{-}{RRR} \\ % b
  \testkern{LLL}{-}{099}{-}{RRR} \\ % c
  \testkern{LLL}{-}{100}{-}{RRR} \\ % d
  \testkern{LLL}{-}{101}{-}{RRR} \\ % e
  \testkern{LLL}{-}{102}{-}{RRR} \\ % f
  \testkern{LLL}{-}{011}{-}{RRR} \\ % ff/arrowup
  \testkern{LLL}{-}{012}{-}{RRR} \\ % fi/arrowdown
  \testkern{LLL}{-}{013}{-}{RRR} \\ % fl/quotesingle
  \testkern{LLL}{-}{014}{-}{RRR} \\ % ffi/exclamdown
  \testkern{LLL}{-}{015}{-}{RRR} \\ % ffl/questiondown
  \testkern{LLL}{-}{103}{-}{RRR} \\ % g
  \testkern{LLL}{-}{104}{-}{RRR} \\ % h
  \testkern{LLL}{-}{105}{-}{RRR} \\ % i
  \testkern{LLL}{-}{016}{-}{RRR} \\ % dotlessi
  \testkern{LLL}{-}{025}{-}{RRR} \\ % germandbls
  \testkern{LLL}{-}{106}{-}{RRR} \\ % j
  \testkern{LLL}{-}{017}{-}{RRR} \\ % dotlessj
  \testkern{LLL}{-}{107}{-}{RRR} \\ % k
  \testkern{LLL}{-}{108}{-}{RRR} \\ % l
  \testkern{LLL}{-}{170}{-}{RRR} \\ % lslash
  \testkern{LLL}{-}{109}{-}{RRR} \\ % m
  \testkern{LLL}{-}{110}{-}{RRR} \\ % n
  \testkern{LLL}{-}{111}{-}{RRR} \\ % o
  \testkern{LLL}{-}{027}{-}{RRR} \\ % oe
  \testkern{LLL}{-}{028}{-}{RRR} \\ % oslash
  \testkern{LLL}{-}{112}{-}{RRR} \\ % p
  \testkern{LLL}{-}{113}{-}{RRR} \\ % q
  \testkern{LLL}{-}{114}{-}{RRR} \\ % r
  \testkern{LLL}{-}{115}{-}{RRR} \\ % s
  \testkern{LLL}{-}{116}{-}{RRR} \\ % t
  \testkern{LLL}{-}{117}{-}{RRR} \\ % u
  \testkern{LLL}{-}{118}{-}{RRR} \\ % v
  \testkern{LLL}{-}{119}{-}{RRR} \\ % w
  \testkern{LLL}{-}{120}{-}{RRR} \\ % x
  \testkern{LLL}{-}{121}{-}{RRR} \\ % y
  \testkern{LLL}{-}{122}{-}{RRR} \\ % z
  \testkern{LLL}{-}{000}{-}{RRR} \\ % Gamma
  \testkern{LLL}{-}{001}{-}{RRR} \\ % Delta
  \testkern{LLL}{-}{002}{-}{RRR} \\ % Theta
  \testkern{LLL}{-}{003}{-}{RRR} \\ % Lambda
  \testkern{LLL}{-}{004}{-}{RRR} \\ % Xi
  \testkern{LLL}{-}{005}{-}{RRR} \\ % Pi
  \testkern{LLL}{-}{006}{-}{RRR} \\ % Sigma
  \testkern{LLL}{-}{007}{-}{RRR} \\ % Upsilon
  \testkern{LLL}{-}{008}{-}{RRR} \\ % Phi
  \testkern{LLL}{-}{009}{-}{RRR} \\ % Psi
  \testkern{LLL}{-}{010}{-}{RRR} \\ % Omega
\iffalse
  \testkern{LLL}{-}{128}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{129}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{130}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{131}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{132}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{133}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{134}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{135}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{136}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{137}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{139}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{140}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{141}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{142}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{143}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{144}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{145}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{146}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{147}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{148}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{149}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{150}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{151}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{152}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{153}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{154}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{155}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{156}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{157}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{158}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{159}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{160}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{161}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{162}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{163}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{164}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{165}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{166}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{167}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{168}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{169}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{171}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{172}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{173}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{174}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{175}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{176}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{177}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{178}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{179}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{180}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{181}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{182}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{183}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{184}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{185}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{186}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{187}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{188}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{189}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{190}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{191}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{192}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{193}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{194}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{195}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{196}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{197}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{198}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{199}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{200}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{201}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{202}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{203}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{204}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{205}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{206}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{207}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{208}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{209}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{210}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{211}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{212}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{213}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{214}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{215}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{216}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{217}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{218}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{219}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{220}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{221}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{222}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{223}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{224}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{225}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{226}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{227}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{228}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{229}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{230}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{231}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{232}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{233}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{234}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{235}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{236}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{237}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{238}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{239}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{240}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{241}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{242}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{243}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{244}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{245}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{246}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{247}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{248}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{249}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{250}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{251}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{252}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{253}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{254}{-}{RRR} \\ % .notdef.
  \testkern{LLL}{-}{255}{-}{RRR} \\ % .notdef.
\fi
\end{kerntable}

\end{document}
%</template&ot1>
%    \end{macrocode}
%
% That's it.
%
% \Finale

