From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/kerntest/ChangeLog | 38 + macros/latex/contrib/kerntest/Makefile | 227 + macros/latex/contrib/kerntest/README | 44 + macros/latex/contrib/kerntest/ToDo | 13 + macros/latex/contrib/kerntest/kerntest.dtx | 5373 ++++++++++++++++++++ macros/latex/contrib/kerntest/kerntest.ins | 37 + macros/latex/contrib/kerntest/kerntest.pdf | Bin 0 -> 690054 bytes macros/latex/contrib/kerntest/schoolb.map | 1 + macros/latex/contrib/kerntest/schoolb1.tex | 18 + macros/latex/contrib/kerntest/schoolb2.tex | 18 + macros/latex/contrib/kerntest/t1-9nc-m-n-1.tex | 21 + macros/latex/contrib/kerntest/t1-9nc-m-n-2.tex | 25 + macros/latex/contrib/kerntest/t1-cmr-m-n-1200.tex | 2066 ++++++++ .../latex/contrib/kerntest/t1-ptm-bx-n-example.tex | 31 + .../contrib/kerntest/t1-ptm-m-n-shortexample.tex | 7 + macros/latex/contrib/kerntest/t1-ptm-m-n.tex | 2064 ++++++++ macros/latex/contrib/kerntest/t1cmr-1200.fd | 22 + macros/latex/contrib/kerntest/testschoolb.tex | 21 + 18 files changed, 10026 insertions(+) create mode 100644 macros/latex/contrib/kerntest/ChangeLog create mode 100644 macros/latex/contrib/kerntest/Makefile create mode 100644 macros/latex/contrib/kerntest/README create mode 100644 macros/latex/contrib/kerntest/ToDo create mode 100644 macros/latex/contrib/kerntest/kerntest.dtx create mode 100644 macros/latex/contrib/kerntest/kerntest.ins create mode 100644 macros/latex/contrib/kerntest/kerntest.pdf create mode 100644 macros/latex/contrib/kerntest/schoolb.map create mode 100644 macros/latex/contrib/kerntest/schoolb1.tex create mode 100644 macros/latex/contrib/kerntest/schoolb2.tex create mode 100644 macros/latex/contrib/kerntest/t1-9nc-m-n-1.tex create mode 100644 macros/latex/contrib/kerntest/t1-9nc-m-n-2.tex create mode 100644 macros/latex/contrib/kerntest/t1-cmr-m-n-1200.tex create mode 100644 macros/latex/contrib/kerntest/t1-ptm-bx-n-example.tex create mode 100644 macros/latex/contrib/kerntest/t1-ptm-m-n-shortexample.tex create mode 100644 macros/latex/contrib/kerntest/t1-ptm-m-n.tex create mode 100644 macros/latex/contrib/kerntest/t1cmr-1200.fd create mode 100644 macros/latex/contrib/kerntest/testschoolb.tex (limited to 'macros/latex/contrib/kerntest') diff --git a/macros/latex/contrib/kerntest/ChangeLog b/macros/latex/contrib/kerntest/ChangeLog new file mode 100644 index 0000000000..23698cf27b --- /dev/null +++ b/macros/latex/contrib/kerntest/ChangeLog @@ -0,0 +1,38 @@ +v1.32 2004/04/13 Harald Harders (h.harders@tu-bs.de) + - Direct access on glyph names instead of parsing \getpsname. + - Speed up \writemtxkern, \defglyphclass, \ifglyphinclass, and + - \@ifglyphinclass (in total, app. factor 20). + - Allow to set relative kerning widths in glyph classes. + - Do not scale Helvetica by default because this breaks + testing Helvetica. + +v1.31 2004/04/13 Harald Harders (h.harders@tu-bs.de) + - Use \setleftkerning and \setrightkerning instead of writing + every kerning pair. + +v1.30 2004/04/12 Harald Harders (h.harders@tu-bs.de) + - Add encodings OT1, T2A, T2B, and LY1. + - Template for OT1 encoding. + - Parameter-dependent encodings (for example with or without + ligatures). + - New option designsize for giving the design size of the font + explicitely. + +v1.11 2004/04/06 Harald Harders (h.harders@tu-bs.de) + - Allow to give glyphs by number (decimal, hex, octal) or by + PostScript name. + - Write glyph name to table. + - Find and complain inconsistent kerning data. + - Introduce glyph classes to set the kerning for similar glyph + shapes by once. + - Reduce left margin. + +v1.11 2004/04/06 Harald Harders (h.harders@tu-bs.de) + - Add literature to bibliography. + +v1.10 2004/04/06 Harald Harders (h.harders@tu-bs.de) + - Add option `writeall'. + - Load configuration file `kerntest.cfg'. + +v1.00 2004/04/01 Harald Harders (h.harders@tu-bs.de) + - Total new implementation. diff --git a/macros/latex/contrib/kerntest/Makefile b/macros/latex/contrib/kerntest/Makefile new file mode 100644 index 0000000000..e5c279f4d8 --- /dev/null +++ b/macros/latex/contrib/kerntest/Makefile @@ -0,0 +1,227 @@ +# --------------------------------------------------------------- + +SRCDIR=kerntest +INSTALLDIR=`kpsewhich --expand-path='$$TEXMFLOCAL'`/tex/latex/kerntest +DOCDIR=`kpsewhich --expand-path='$$TEXMFLOCAL'`/doc/latex/kerntest +SOURCEDIR=`kpsewhich --expand-path='$$TEXMFLOCAL'`/source/latex/kerntest +VERSION=`grep -e '\\[.*\\]' krntst-v.tex | sed 's/ \\[[0-9/]* *\\([v0-9]*\\)\\.\\([0-9]*\\).*\\]/\\1_\\2/'` + +TEX= \ + kerntest.cls \ + ly1mtx.clo \ + ot1mtx.clo \ + t1mtx.clo \ + t2amtx.clo \ + t2bmtx.clo \ + ts1mtx.clo \ + +DOC= \ + kerntest.pdf \ + t1-XXX-m-n.tex \ + ts1-XXX-m-n.tex \ + ot1-XXX-m-n.tex \ + schoolb.map \ + schoolb1.tex \ + schoolb2.tex \ + t1-9nc-m-n-1.tex \ + t1-9nc-m-n-2.tex \ + t1-cmr-m-n-1200.tex \ + t1-ptm-m-n.tex \ + t1-ptm-bx-n-example.tex \ + t1cmr-1200.fd \ + t1-ptm-m-n-shortexample.tex \ + testschoolb.tex \ + README \ + ChangeLog \ + ToDo \ + kerntest.xml \ + +SOURCE= \ + Makefile \ + kerntest.dtx \ + kerntest.ins \ + +# --------------------------------------------------------------- + +.SUFFIXES: .cls .ins .dtx .dvi .ps .pdf + +# --------------------------------------------------------------- +.ins.cls: + latex $< + +.dtx.pdf: + pdflatex $< + pdflatex $< + makeindex -s gind.ist $(*D)/$(*F) + makeindex -s gglo.ist -o $(*D)/$(*F).gls $(*D)/$(*F).glo + pdflatex $< + +.dvi.ps: + dvips -o $(*D)/$(*F).ps $(*D)/$(*F) + +# --------------------------------------------------------------- + +all: kerntest.cls + +dist: all t1-ptm-bx-n-example.pdf t1-ptm-m-n-shortexample.pdf \ + testschoolb-2.pdf kerntest.pdf + +# --------------------------------------------------------------- + +t1-ptm-bx-n-example.pdf: t1-ptm-bx-n-example.tex kerntest.cls + latex t1-ptm-bx-n-example + latex t1-ptm-bx-n-example + latex t1-ptm-bx-n-example + dvips -E -o t1-ptm-bx-n-example.ps t1-ptm-bx-n-example + epstopdf t1-ptm-bx-n-example.ps + +t1-ptm-m-n-shortexample.pdf: t1-ptm-m-n-shortexample.tex kerntest.cls + latex t1-ptm-m-n-shortexample + latex t1-ptm-m-n-shortexample + latex t1-ptm-m-n-shortexample + dvips -E -o t1-ptm-m-n-shortexample.ps t1-ptm-m-n-shortexample + epstopdf t1-ptm-m-n-shortexample.ps + +# --------------------------------------------------------------- + +clean: + @-rm -f kerntest.glo kerntest.gls kerntest.idx kerntest.ilg + @-rm -f kerntest.ind kerntest.aux kerntest.log kerntest.toc + @-rm -f *~ + @-rm -f t1-ptm-bx-n-example.aux t1-ptm-bx-n-example.dvi + @-rm -f t1-ptm-bx-n-example.log t1-ptm-bx-n-example.ps + @-rm -f t1-ptm-m-n-shortexample.aux t1-ptm-m-n-shortexample.dvi + @-rm -f t1-ptm-m-n-shortexample.log t1-ptm-m-n-shortexample.ps + @-rm -f t1-ptm-m-n-shortexample.mtx + @-rm -f testschoolb.dvi testschoolb-2.ps + @-rm -f testschoolb.aux testschoolb.log + @-rm -f c059013l.mtx c059013l.pl 9ncr8?.mtx 9ncr8?.pl 9ncr8?.vpl + @-rm -f t1-9nc-m-n-1.dvi t1-9nc-m-n-1.ps + @-rm -f t1-9nc-m-n-1.aux t1-9nc-m-n-1.log + @-rm -f t1-9nc-m-n-2.dvi t1-9nc-m-n-2.ps + @-rm -f t1-9nc-m-n-2.aux t1-9nc-m-n-2.log + @-rm -f t1-9nc-m-n-2.mtx + @-rm -f schoolb1.log schoolb2.log + @-rm -f t1-cmr-m-n-1200.aux t1-cmr-m-n-1200.log t1-cmr-m-n-1200.mtx + +distclean: clean + @-rm -f kerntest.cls *mtx.clo + @-rm -f krntst-v.tex + @-rm -f t1-ptm-bx-n-example.mtx t1-ptm-bx-n-example.pdf + @-rm -f t1-ptm-m-n-shortexample.pdf + @-rm -f t*19nc.fd 9ncr8?.tfm 9ncr8?.vf + @-rm -f t1-XXX-m-n.tex ts1-XXX-m-n.tex ot1-XXX-m-n.tex + @-rm -f t1-9nc-m-n-1.pdf t1-9nc-m-n-1.mtx + @-rm -f t1-9nc-m-n-2.pdf + @-rm -f t1-cmr-m-n-1200.dvi t1-cmr-m-n-1200.pdf + @-rm -f testschoolb-1.pdf testschoolb-2.pdf + +# --------------------------------------------------------------- + +tar: dist clean + echo Lege kerntest-$(VERSION).tar.gz an + -rm -f kerntest-$(VERSION).tar.gz + tar czCf .. kerntest-$(VERSION).tar.gz \ + $(SRCDIR)/README \ + $(SRCDIR)/ChangeLog \ + $(SRCDIR)/ToDo \ + $(SRCDIR)/Makefile \ + $(SRCDIR)/kerntest.dtx \ + $(SRCDIR)/kerntest.ins \ + $(SRCDIR)/kerntest.pdf \ + $(SRCDIR)/kerntest.xml \ + $(SRCDIR)/schoolb.map \ + $(SRCDIR)/schoolb1.tex \ + $(SRCDIR)/schoolb2.tex \ + $(SRCDIR)/t1-9nc-m-n-1.tex \ + $(SRCDIR)/t1-9nc-m-n-2.tex \ + $(SRCDIR)/t1-ptm-bx-n-example.tex \ + $(SRCDIR)/t1-ptm-m-n-shortexample.tex \ + $(SRCDIR)/t1-ptm-m-n.tex \ + $(SRCDIR)/t1-cmr-m-n-1200.tex \ + $(SRCDIR)/t1cmr-1200.fd \ + $(SRCDIR)/testschoolb.tex \ + +# --------------------------------------------------------------- + +texlive: all clean + @-rm -rf texmf + mkdir -p texmf/tex/latex/kerntest + mkdir -p texmf/doc/latex/kerntest + mkdir -p texmf/source/latex/kerntest + cp $(TEX) texmf/tex/latex/kerntest + cp $(DOC) texmf/doc/latex/kerntest + cp $(SOURCE) texmf/source/latex/kerntest + +# --------------------------------------------------------------- + +zip: texlive + -@rm -f kerntest-$(VERSION).zip + zip -r kerntest-$(VERSION).zip texmf + @-rm -r texmf/ + +# --------------------------------------------------------------- + +install: all + if [ ! -d $(INSTALLDIR) ]; then mkdir -p $(INSTALLDIR); fi + if [ ! -d $(DOCDIR) ]; then mkdir -p $(DOCDIR); fi + if [ ! -d $(SOURCEDIR) ]; then mkdir -p $(SOURCEDIR); fi + install -m644 $(TEX) $(INSTALLDIR) + install -m644 $(DOC) $(DOCDIR) + install -m644 $(SOURCE) $(SOURCEDIR) + texhash + +# --------------------------------------------------------------- + +testschoolb-2.pdf: c059013l.pfb c059013l.afm schoolb1.tex schoolb2.tex \ + t1-9nc-m-n-1.tex t1-9nc-m-n-2.tex Makefile testschoolb.tex \ + kerntest.cls + tex schoolb1 + pltotf 9ncr8r.pl + vptovf 9ncr8c.vpl + vptovf 9ncr8t.vpl + @-rm -f c059013l.mtx c059013l.pl 9ncr8?.mtx 9ncr8?.pl 9ncr8?.vpl +# + latex testschoolb + dvips -E -u +./schoolb.map -o testschoolb-1.ps testschoolb + epstopdf testschoolb-1.ps + @-rm -f testschoolb.dvi testschoolb-1.ps + @-rm -f testschoolb.aux testschoolb.log +# + latex t1-9nc-m-n-1 + latex t1-9nc-m-n-1 + latex t1-9nc-m-n-1 + dvips -E -u +./schoolb.map -o t1-9nc-m-n-1.ps t1-9nc-m-n-1 + epstopdf t1-9nc-m-n-1.ps + @-rm -f t1-9nc-m-n-1.dvi t1-9nc-m-n-1.ps + @-rm -f t1-9nc-m-n-1.aux t1-9nc-m-n-1.log +# + tex schoolb2 + pltotf 9ncr8r.pl + vptovf 9ncr8c.vpl + vptovf 9ncr8t.vpl + @-rm -f c059013l.mtx c059013l.pl 9ncr8?.mtx 9ncr8?.pl 9ncr8?.vpl +# + latex testschoolb + dvips -E -u +./schoolb.map -o testschoolb-2.ps testschoolb + epstopdf testschoolb-2.ps + @-rm -f testschoolb.dvi testschoolb-2.ps + @-rm -f testschoolb.aux testschoolb.log +# + latex t1-9nc-m-n-2 + latex t1-9nc-m-n-2 + latex t1-9nc-m-n-2 + dvips -E -u +./schoolb.map -o t1-9nc-m-n-2.ps t1-9nc-m-n-2 + epstopdf t1-9nc-m-n-2.ps + @-rm -f t1-9nc-m-n-2.dvi t1-9nc-m-n-2.ps + @-rm -f t1-9nc-m-n-2.aux t1-9nc-m-n-2.log + @-rm -f t1-9nc-m-n-2.mtx + +# --------------------------------------------------------------- + +kerntest.cls: kerntest.ins kerntest.dtx +kerntest.pdf: kerntest.ins kerntest.dtx t1-ptm-bx-n-example.pdf \ + t1-ptm-m-n-shortexample.pdf schoolb1.tex testschoolb-2.pdf + +# --------------------------------------------------------------- + diff --git a/macros/latex/contrib/kerntest/README b/macros/latex/contrib/kerntest/README new file mode 100644 index 0000000000..c38a39c425 --- /dev/null +++ b/macros/latex/contrib/kerntest/README @@ -0,0 +1,44 @@ +kerntest.cls +============ + +Print tables and generate mtx files that help to adjust kernings + + +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. + +The current version is really slow! Please be patient. + + +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. + + + +Installation: + +automatic: - run make install + +by hand: - execute latex on kerntest.ins + - copy kerntest.cls and *.clo to a place LaTeX can find it + - copy kerntest.pdf to the documentation tree of your + TeX implementation + - run texhash or the corresponding command of your distribution + + + +2004/04/14 +Harald Harders +h.harders@tu-bs.de diff --git a/macros/latex/contrib/kerntest/ToDo b/macros/latex/contrib/kerntest/ToDo new file mode 100644 index 0000000000..3bb551a193 --- /dev/null +++ b/macros/latex/contrib/kerntest/ToDo @@ -0,0 +1,13 @@ +Bugs, new features, ... +======================= + +- Avoid overfull \hboxes +- Allow more powerful operations on single glyphs? +- Increase speed of compilation (yet, no optimization has been done). +- On demand, copy predefined kerning data from one glyph of a glyph + class to all members and complain about inconsistent kernings in the + original font. + +2004/04/14 +Harald Harders +h.harders@tu-bs.de \ No newline at end of file diff --git a/macros/latex/contrib/kerntest/kerntest.dtx b/macros/latex/contrib/kerntest/kerntest.dtx new file mode 100644 index 0000000000..b233abca35 --- /dev/null +++ b/macros/latex/contrib/kerntest/kerntest.dtx @@ -0,0 +1,5373 @@ +% \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} +% +% \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 >>: <>. +% In German, the three possibilities ,,Hallo`` (``99--66''), +% >>Hallo<<, and >>Hallo<< are used. +% In Italian, <> 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} +%\ProvidesClass{kerntest} +%\ProvidesFile{t1mtx.clo} +%\ProvidesFile{ts1mtx.clo} +%\ProvidesFile{ot1mtx.clo} +%\ProvidesFile{t2amtx.clo} +%\ProvidesFile{t2bmtx.clo} +%\ProvidesFile{ly1mtx.clo} +%\ProvidesFile{krntst-v.tex} +% [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=}% + \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=' 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}% +} +% +% \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 +} +% +% \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 +} +% +% \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 +} +% +% \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 +} +% +% \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 +} +% +% \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 +} +% +% \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} +% +% \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} +% +% \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} +% +% \end{macrocode} +% +% That's it. +% +% \Finale + diff --git a/macros/latex/contrib/kerntest/kerntest.ins b/macros/latex/contrib/kerntest/kerntest.ins new file mode 100644 index 0000000000..4c0e67de89 --- /dev/null +++ b/macros/latex/contrib/kerntest/kerntest.ins @@ -0,0 +1,37 @@ +\input docstrip.tex +\preamble + + kerntest class + + 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. + + h.harders@tu-bs.de + +\endpreamble + +\askforoverwritefalse + +% Files +%%%%%%%%%%%%%%%%%%%%%% +\generate{% + \file{kerntest.cls}{\from{kerntest.dtx}{class}}% + \file{t1mtx.clo}{\from{kerntest.dtx}{mtx,t1}}% + \file{ts1mtx.clo}{\from{kerntest.dtx}{mtx,ts1}}% + \file{ot1mtx.clo}{\from{kerntest.dtx}{mtx,ot1}}% + \file{t2amtx.clo}{\from{kerntest.dtx}{mtx,t2a}}% + \file{t2bmtx.clo}{\from{kerntest.dtx}{mtx,t2b}}% + \file{ly1mtx.clo}{\from{kerntest.dtx}{mtx,ly1}}% + \file{krntst-v.tex}{\from{kerntest.dtx}{version}}% + \usepostamble\empty + \file{t1-XXX-m-n.tex}{\from{kerntest.dtx}{template,t1}}% + \file{ts1-XXX-m-n.tex}{\from{kerntest.dtx}{template,ts1}}% + \file{ot1-XXX-m-n.tex}{\from{kerntest.dtx}{template,ot1}}% +}% + +\Msg{* Ready} +\endbatchfile diff --git a/macros/latex/contrib/kerntest/kerntest.pdf b/macros/latex/contrib/kerntest/kerntest.pdf new file mode 100644 index 0000000000..72b7735574 Binary files /dev/null and b/macros/latex/contrib/kerntest/kerntest.pdf differ diff --git a/macros/latex/contrib/kerntest/schoolb.map b/macros/latex/contrib/kerntest/schoolb.map new file mode 100644 index 0000000000..cac8c182cc --- /dev/null +++ b/macros/latex/contrib/kerntest/schoolb.map @@ -0,0 +1 @@ +9ncr8r CenturySchL-Roma "TeXBase1Encoding ReEncodeFont" <8r.enc #51200}{}} +\DeclareFontFamily{T1}{cmr}{} +\krntstexmplfamily{T1}{cmr}{m}{n}{ecrm} +\krntstexmplfamily{T1}{cmr}{m}{sl}{ecsl} +\krntstexmplfamily{T1}{cmr}{m}{it}{ecti} +\krntstexmplfamily{T1}{cmr}{m}{sc}{eccc} +\krntstexmplfamily{T1}{cmr}{bx}{n}{ecbx} +\krntstexmplfamily{T1}{cmr}{b}{n}{ecrb} +\krntstexmplfamily{T1}{cmr}{bx}{it}{ecbi} +\krntstexmplfamily{T1}{cmr}{bx}{sl}{ecbl} +\krntstexmplfamily{T1}{cmr}{bx}{sc}{ecxc} +\krntstexmplfamily{T1}{cmr}{m}{ui}{ecui} +\endinput +%% +%% End of file `t1cmr-1200.fd'. diff --git a/macros/latex/contrib/kerntest/testschoolb.tex b/macros/latex/contrib/kerntest/testschoolb.tex new file mode 100644 index 0000000000..5e892ef375 --- /dev/null +++ b/macros/latex/contrib/kerntest/testschoolb.tex @@ -0,0 +1,21 @@ +\documentclass[ngerman,12pt]{article} +\usepackage[T1]{fontenc} +\usepackage{babel} +\renewcommand*\rmdefault{9nc} +\pagestyle{empty} +\setlength{\parindent}{0mm} +\begin{document} +\Large +Some problematic kernings + +\guillemotright V\guillemotleft, +\textquotedblleft A\textquotedblright, +\quotedblbase VA\textquotedblleft, +\quotedblbase V\u A\textquotedblleft + +\guilsinglright V\guilsinglleft, +\textquoteleft A\textquoteright, +\quotesinglbase VA\textquoteleft, +\quotesinglbase V\u A\textquoteleft + +\end{document} \ No newline at end of file -- cgit v1.2.3