<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
%
% trajan.dtx
%
%  Author: Peter Wilson (Herries Press) herries dot press at earthlink dot net
%  Copyright 1999--2005 Peter R. Wilson
%
%  This work may be distributed and/or modified under the
%  conditions of the Latex Project Public License, either
%  version 1.3 of this license or (at your option) any
%  later version.
%  The latest version of the license is in
%    http://www.latex-project.org/lppl.txt
%  and version 1.3 or later is part of all distributions of
%  LaTeX version 2003/06/01 or later.
%
%  This work has the LPPL maintenance status "author-maintained".
%
%  This work consists of the files listed in the README file.
%
%
%&lt;*driver&gt;
\documentclass[twoside]{ltxdoc}
\usepackage{url}
\usepackage[draft=false,
            plainpages=false,
            pdfpagelabels,
            bookmarksnumbered,
            hyperindex=false
           ]{hyperref}
\providecommand{\phantomsection}{}
\OnlyDescription %% comment this out for the full glory
\EnableCrossrefs
\CodelineIndex
\setcounter{StandardModuleDepth}{1}
\makeatletter
  \@mparswitchfalse
\makeatother
\renewcommand{\MakeUppercase}[1]{#1}
\pagestyle{headings}
\newenvironment{addtomargins}[1]{%
  \begin{list}{}{%
    \topsep 0pt%
    \addtolength{\leftmargin}{#1}%
    \addtolength{\rightmargin}{#1}%
    \listparindent \parindent
    \itemindent \parindent
    \parsep \parskip}%
  \item[]}{\end{list}}
\begin{document}
  \raggedbottom
  \DocInput{trajan.dtx}
\end{document}
%&lt;/driver&gt;
%
%
% \fi
%
% \CheckSum{37}
%
% \DoNotIndex{\',\.,\@M,\@@input,\@addtoreset,\@arabic,\@badmath}
% \DoNotIndex{\@centercr,\@cite}
% \DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue}
% \DoNotIndex{\@input,\@ixpt,\@m}
% \DoNotIndex{\@minus,\@mkboth,\@ne,\@nil,\@nomath,\@plus,\@set@topoint}
% \DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb}
% \DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt}
% \DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt}
% \DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace}
% \DoNotIndex{\advance,\Alph,\alph}
% \DoNotIndex{\arabic,\ast,\begin,\begingroup,\bfseries,\bgroup,\box}
% \DoNotIndex{\bullet}
% \DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption}
% \DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass}
% \DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist}
% \DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup}
% \DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter}
% \DoNotIndex{\fbox}
% \DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef}
% \DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule}
% \DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi}
% \DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi}
% \DoNotIndex{\input}
% \DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark}
% \DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright}
% \DoNotIndex{\month,\newcommand,\newcounter,\newenvironment}
% \DoNotIndex{\NeedsTeXFormat,\newdimen}
% \DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number}
% \DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@}
% \DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip}
% \DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions}
% \DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright}
% \DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font}
% \DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily,\roman}
% \DoNotIndex{\roman,\secdef,\selectfont,\setbox,\setcounter,\setlength}
% \DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space}
% \DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase}
% \DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt}
% \DoNotIndex{\viipt,\vipt,\vskip,\vspace}
% \DoNotIndex{\wd,\xiipt,\year,\z@}
%
% \changes{v1.0}{1999/04/02}{First public release}
% \changes{v1.0a}{2001/01/02}{Fixed missing * in .fd files}
% \changes{v1.1}{2005/06/29}{Added map file}
% \changes{v1.1}{2005/06/29}{Changed contact details}
%
% \def\fileversion{v1.0} \def\filedate{1999/04/02}
% \def\fileversion{v1.0a} \def\filedate{2001/01/02}
% \def\fileversion{v1.1} \def\filedate{2005/06/29}
%
% \newcommand*{\Lpack}[1]{\textsf {#1}}           ^^A typeset a package
% \newcommand*{\Lopt}[1]{\textsf {#1}}            ^^A typeset an option
% \newcommand*{\file}[1]{\texttt {#1}}            ^^A typeset a file
% \newcommand*{\Lcount}[1]{\textsl {\small#1}}    ^^A typeset a counter
% \newcommand*{\pstyle}[1]{\textsl {#1}}          ^^A typeset a pagestyle
% \newcommand*{\Lenv}[1]{\texttt {#1}}            ^^A typeset an environment
%
% \title{The \Lpack{Trajan} fonts\thanks{This
%        file has version number \fileversion, last revised
%        \filedate.}}
%
% \author{%
% Peter Wilson\thanks{\texttt{herries dot press at earthlink dot net}}\\
% Herries Press
% }
% \date{\filedate}
% \maketitle
% \begin{abstract}
%    The \Lpack{trajan} package provides a set of uppercase fonts as 
% carved on the Trajan column in Rome in 114 \textsc{ad}.
% \end{abstract}
% \tableofcontents
%
% 
%
% \section{Introduction}
%
% Around the beginning of the 16th century several authors published designs
% for uppercase characters. The more well known among these were Albrecht
% D\"{u}rer who wrote \textit{On the Just Shaping of Letters} which was
% published in Nuremberg in 1525, and Geofroy
% Tory who wrote \textit{Champ Fleury} which was published in Paris in 1529.
% Fra Luca Bartolomeo de Pacioli preceeded by of these by developing his
% recipe for uppercase characters in 1497 and which was published in
% \textit{De Divina Proportione} at Venice in 1509. Metafont versions
% of the D\"{u}rer and Pacioli fonts are available\footnote{In directories
% \texttt{duerer} and \texttt{pacioli} respectively, in the font area.}
% from CTAN.
%
%    Many typographers rank the capitals carved on the Trajan column in
% Rome, dated at 114~\textsc{ad}, as the high point of the Roman's
% artistic legacy. These letter shapes were the best basic form in the
% subsequent development of uppercase fonts. The top line of the letters
% on the Trajan column are about six feet above eye level, with the letters
% being about four and a half inches tall. There are six lines of text
% and the letter height on the lowest line has been reduced to about 75\%
% of the those at the top of the inscription.
% 
% Fortunately, Jan Tschichold~\cite{TSCHICHOLD92} provides
% a more accessible source for the Trajan characters, and I have used
% his work in developing this rendition of the lettering.
% 
% This manual is typeset according to the conventions of the
% \LaTeX{} \textsc{docstrip} utility which enables the automatic
% extraction of the \LaTeX{} macro source files~\cite{GOOSSENS94}.
%
%    Section~\ref{sec:usc} describes the usage of the package.
% Commented code for the fonts and source code for the package is in 
% later sections.
%
%
% \section{The \Lpack{trajan} package} \label{sec:usc}
%
%    The Romans did not have the J, U or W letters in their abecedary, and
% rarely used H, K or Z. Jan Tschichold designed glyphs for these six
% letters to complement the character set on the Trajan column.
%
%   I have also added modified versions of Knuth's Computer Modern punctuation
% characters so that, perhaps, the Trajan font could be used as a 
% titling font.
%
% Trajan's font as provided here consists of the uppercase letters, 
% the punctuation marks  !.,;:`'?,
% the hyphen together with the en- and em-dash,
% and the analphabetic characters ()[]\&amp;.
% All the chacters are accessed by typing them as you usually do in \LaTeX.
%
% \DescribeEnv{trjnfamily}
% The family name is \texttt{trjn}. Use the \texttt{trjnfamily} environment
% for long stretches of text.
%
% \DescribeMacro{\texttrjn}
% Use \verb?\texttrjn{a word or two}? to typeset a \texttt{word or two} in
% the Trajan font.
%     
% \StopEventually{
% \bibliographystyle{alpha}
% \begin{thebibliography}{GMS94}
%
% \bibitem[GMS94]{GOOSSENS94}
% Michel Goossens, Frank Mittelbach, and Alexander Samarin.
% \newblock \emph{The LaTeX Companion}.
% \newblock Addison-Wesley Publishing Company, 1994.
%
% \bibitem[Tsc92]{TSCHICHOLD92}
% Jan Tschichold.
% \newblock \emph{Treasury of Alphabets and Lettering}.
% \newblock W.~W.~Norton, 1992.
%
% \end{thebibliography}
% \PrintIndex
% }
%
%
% \section{The Metafont code} \label{sec:mf}
%
% \subsection{The parameter file}
%
%    We deal with the two parameter files first, and start by announcing
% what they are for.
%    \begin{macrocode}
%&lt;*up|sl&gt;
%&lt;up&gt; %%% TRJNR10.MF  Computer Trajan Roman at 10 point design size.
%&lt;sl&gt; %%% TRJNSL10.MF  Computer Trajan Slanted at 10 point design size.
%
%    \end{macrocode}
%    Parameters from CMR10.MF are used as much as possible. We also
% make sure that \Lpack{cmbase} is loaded as well as plain Metafont.
%    \begin{macrocode}
if unknown cmbase: input cmbase fi

%&lt;up&gt;font_identifier:="TRJNR"; font_size 10pt#;
%&lt;sl&gt;font_identifier:="TRJNSL"; font_size 10pt#;

%    \end{macrocode}
%
%
% \begin{macro}{u}
% \begin{macro}{hstretch}
% \begin{macro}{vstretch}
% \begin{macro}{width-adj}
% \begin{macro}{serif-fit}
% \begin{macro}{cap-serif-fit}
% \begin{macro}{letter-fit}
%    The majority of the parameters and values are the same for both
% fonts.
%    \begin{macrocode}
u#:=20/36pt#;             % unit width
hstretch:=1;              % horizontal stretching factors; in lieu of u
vstretch:=1;              % vertical stretching factor
width_adj#:=0pt#;         % width adjustment for certain characters
serif_fit#:=0pt#;         % extra sidebar near lowercase serifs
cap_serif_fit#:=5/36pt#;  % extra sidebar near uppercase serifs
letter_fit#:=0pt#;        % extra space added to all sidebars

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{body-height} 
% \begin{macro}{asc-height} 
% \begin{macro}{cap-height} 
% \begin{macro}{fig-height} 
% \begin{macro}{x-height} 
% \begin{macro}{math-axis} 
% \begin{macro}{bar-height} 
% \begin{macro}{comma-depth} 
% \begin{macro}{desc-depth} 
% \begin{macro}{half-height} 
%    \begin{macrocode}
body_height#:=270/36pt#;       % height of tallest characters
asc_height#:=250/36pt#;        % height of lowercase ascenders
cap_height#:=246/36pt#;        % height of caps
fig_height#:=232/36pt#;        % height of numerals
x_height#:=155/36pt#;          % height of lowercase without ascenders
math_axis#:=90/36pt#;          % axis of symmetry for math symbols
bar_height#:=87/36pt#;         % height of crossbar in lowercase e
comma_depth#:=70/36pt#;        % depth of comma below baseline
desc_depth#:=70/36pt#;         % depth of lowercase descenders
half_height#:=1/2cap_height#;  % half the height of caps

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{side}
% \begin{macro}{thickfudge}
% \begin{macro}{mediumfudge}
% \begin{macro}{thinfudge}
% \begin{macro}{thick}
% \begin{macro}{medium}
% \begin{macro}{thin}
%  At the `design size' of the Trajan font, the thickest parts of the letters
% were 1/10 of the height. I have increased the thickness a bit to make
% the font look a bit more substantial at the more common printing sizes.
%    \begin{macrocode} 
side#:=cap_height#;          % Height and width of the square
thickfudge:=1/9; mediumfudge:=1/2; thinfudge:=1/3;
thick#:=thickfudge*side#;    % thickness of all thick limbs in Roman font
medium#:=mediumfudge*thick#; % width of medium limbs
thin#:=thinfudge*thick#;     % thinness of all thin limbs

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{eta}
% \begin{macro}{serif-darkness}
% \begin{macro}{sadj}
% \begin{macro}{crisp}
% \begin{macro}{tiny}
% \begin{macro}{fine}
% \begin{macro}{rule-thickness}
%    \begin{macrocode}
eta:=2-sqrt2;            % darkness for serifs; $\eta \approx 0.58$
serif_darkness:=eta;
sadj:=0.6;               % serif darkness adjustment
crisp#:=0pt#;            % diameter of serif corners
tiny#:=0pt#;             % diameter of rounded corners
fine#:=7/36pt#;          % diameter of sharply rounded corners
rule_thickness#:=.4pt#;  % thickness of lines in math symbols

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{cap-stem} 
% \begin{macro}{stem} 
% \begin{macro}{dish} 
% \begin{macro}{bracket} 
% \begin{macro}{jut} 
% \begin{macro}{cap-jut} 
% \begin{macro}{beak-jut} 
% \begin{macro}{slab} 
% \begin{macro}{dslab} 
%    \begin{macrocode}
cap_stem#:=thick#;     % thickness of majuscule stems
stem#:=thick#;         % thickness of minuscule stems
dish#:=1/36pt#;        % amount erased at top or bottom of serifs
bracket#:=thick#;      % vertical distance from serif base to tangent
jut#:=thick#;          % protrusion of lowercase serifs
cap_jut#:=thick#;      % protrusion of uppercase serifs for I
beak_jut#:=10/36pt#;   % horizontal protrusion of beak serifs
slab#:=eps*1pt#;       % serif and arm thickness
dslab#=0;              %slab value used in Trajan fonts

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{hair} 
% \begin{macro}{vair} 
% |hair| is the lowercase hairline breadth, and |vair| is the vertical 
% diameter of hairlines.
%    \begin{macrocode}
hair#:=vair#:=thin#; 

%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{o}
% \begin{macro}{apex-o}
% \begin{macro}{apex-corr}
%  These deal with fine tuning of some aspects of the glyphs.
%    \begin{macrocode} 
o#:=8/36pt#;       % amount of overshoot for curves
apex_o#:=thin#;    % amount of overshoot for diagonal junctions
apex_corr#=0pt#;   % fine tuning of overshoot

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{slant}
% |slant| is the amount the font slopes to the right. It is different
% for the two fonts.
%    \begin{macrocode}
%&lt;up&gt;slant:=0;      % tilt ratio $(\Delta x/\Delta y)$
%&lt;sl&gt;slant:=1/6;    % tilt ratio $(\Delta x/\Delta y)$

%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{fudge}
% \begin{macro}{superness}
% \begin{macro}{superpull}
% \begin{macro}{beak-darkness}
%    \begin{macrocode}
fudge:=1;               % factor applied to weights of heavy characters
superness:=1/sqrt2;     % parameter for superellipses
superpull:=0;           % extra openness inside bowls
beak_darkness:=11/30;   % fraction of triangle inside beak serifs

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{serifs} 
% \begin{macro}{monospace} 
%    We are generating a seriffed, variable-width font.
%    \begin{macrocode}
serifs:=true;        % should serifs and bulbs be attached?
monospace:=false;    % should all characters have the same width?

%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{dot-size}
% \begin{macro}{square-dots}
% \begin{macro}{hefty}
% \begin{macro}{ligs}
%    These parameters are required for the punctation glyphs.
%    \begin{macrocode}
dot_size#:=38/36pt#; % size of dots
square_dots:=false;  % should dots be square?
hefty:=false;        % should we try hard not to be overweight?
ligs:=2;             % level of ligatures to be included

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{flare}
% \begin{macro}{stem-corr}
% \begin{macro}{curve}
%     These parameters are required for the ampersand and question mark.
%    \begin{macrocode}
flare#:=33/36pt#;     % diameter of bulbs or breadth of terminals
stem_corr#:=1/36pt#;  % small refinement of stem breadth
curve#:=30/36pt#;     % lowercase curve breadth

%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{whole-font}
%    We are not generating a complete font.
%    \begin{macrocode}
boolean whole_font;  % try generating a complete font?
whole_font:=false;

%    \end{macrocode}
% \end{macro}
%
%    Finally, call the driver file for the Trajan font.
%    \begin{macrocode} 
generate trjntitle      %% switch to the driver file---Trajan title

%&lt;/up|sl&gt;
%    \end{macrocode}
%
%
% \subsection{The driver file}
%
%    To a large extent the driver file is based on Alan Hoenig's 
% \Lpack{dtitle.mf}.
%
%
%    \begin{macrocode}
%&lt;*mfd&gt;
% This is TRJNTITLE.MF, adapted from my Pacioli cpctitle.mf 
% This makes a short font.
% This file also contains special macros universally needed in the 
% Trajan font but either not in the cmbase.mf file or
% modifications of this.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  MACRO SECTION %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%    \end{macrocode}
%
% \begin{macro}{makebox}
%    This is a new version of the \Lpack{cmbase.mf} |makebox| macro.
% Essentially, as we are only generating an uppercase font, we don't
% need all the horizontals for the lowercase characters.
%
%    \begin{macrocode}
% A new version of cmbase.mf makebox macro
def makebox(text rule) =
  for y=0,half_height,cap_height,body_height,x_height,-desc_depth,-body_depth:
    rule((l,y)t_,(r,y)t_); endfor  % horizontals
  for x=l,r: rule((x,-body_depth)t_,(x,body_height)t_); endfor % verticals
  for x=u*(1+floor(1/u)) step u until r-1:
    rule((x,-body_depth)t_,(x,body_height)t_); endfor         % more verticals
  if charic&lt;&gt;0:
    rule((r+charic*pt,h.o_),(r+charic*pt,.5h.o_)); fi  % italic correction
enddef;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{proofpcbb}
%    The macro |proofpcbb(S, xoff, yoff)| draws crosses at the corners of 
% Pacioli's
% square, and at the bottom and top midpoints, where the point |zS| is at
% position |(xoff,yoff)| in the square. 
%    \begin{macrocode}

% A macro to delineate Trajan's bounding square in proof mode.
% Point z$ is at (xoff,yoff) in the bounding square.
def proofpcbb(suffix $)(expr xoff, yoff) =
if proofing &gt; 0:
  x$bl = x$ - xoff; y$bl = y$ - yoff;         % Bottom Left Hand Corner
  z$br = (x$bl+cap_height, y$bl);             % BRHC
  z$tr = (x$bl+cap_height, y$bl+cap_height);  % TRHC
  z$tl = (x$bl, y$bl+cap_height);             % TLHC
  z$bc = 1/2[z$bl,z$br]; z$tc = 1/2[z$tl,z$tr];  % horizontal mid points
  pair hc, vc;
  hc = (2u,0); vc = (0,2u);
  pickup pensquare scaled 2;
  for s = z$bl, z$br, z$tr, z$tl, z$bc, z$tc:
    draw s-hc--s+hc;
    draw s-vc--s+vc;
  endfor
fi
enddef;

%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{cm-arm}
% \begin{macro}{arm}
%    Hoenig's modification to Knuth's |arm| macro.
%    \begin{macrocode}
 
let cm_arm=arm;
 
vardef arm(suffix $,$$,@)(expr darkness, armjut) =  % arm from |z$| to |z$$|
numeric vjut_; vjut_= abs(bot y$l-bot y$$);
x@0=good.x(x$$r-armjut); y@0=y$r;
 if serifs: y@1=y$l; z@1=z$$l+whatever*(z$$r-z@0);
   if x$$&gt;=x$: x@2=x@1 - vjut_; else: x@2=x@1+vjut_; fi y@2=y$l;
  filldraw z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l]]{z@2-z$$l}...
  z@2if x$$&gt;=x$: {left} else: {right} fi
   ---z$l--z$r--z@0--z$$r..cycle; % arm and beak
 else: filldraw z$l--z$r--z@0--z$$r--cycle; fi  % sans-serif arm
 penlabels(@0,@1,@2); enddef;

%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{foot}
%    A macro to draw the bottom arm of the E, L and Z characters. 
% |$|, |$l| and |$r| are points at LH end of the foot, with |$r| at 
% the bottom. |$$|, |$$l| and
% |$$r| are points at the tip. |armjut| is the horizontal distance between
% the tip and the flat part of the foot. |@| is a letter (not used elsewhere
% as a point suffix).
%     \begin{macrocode}

vardef foot(suffix $, $$, @)(expr darkness, armjut) = % bottom arm on E and L
numeric vjut_; vjut_= abs(bot y$-bot y$$);
x@0=good.x(x$$r-armjut); y@0=y$r;
 if serifs: 
   y@1=y$l; z@1=z$$l+whatever*(z$$r-z@0);
   x@2=x@1-vjut_; y@2=y$l;
   filldraw z$$l{z@1-z$$l}...darkness[z@1,.5[z@2,z$$l] ]...z@2
      ---z$l--z$r--z@0--z$$r--cycle; % arm and beak
 else: 
   filldraw z$l--z$r--(x$$r,y$r)--(x$$r,y$l)--cycle; 
 fi
 penlabels(@0,@1,@2); enddef;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{pulled-super-arc}
% \begin{macro}{pulled-arc}
%    Hoenig's rewrite of Knuth's macros.
%    \begin{macrocode}
 
vardef pulled_super_arc.l(suffix $, $$)(expr darkness)=
 pair corner;
 if y$=y$r: corner=(x$l, y$$l);
 else: corner=(x$$l,y$l); fi
 z$l{corner-z$l}...(darkness)[corner, .5[z$l, z$$l]]{z$$l-z$l}
 ...{z$$l-corner}z$$l enddef;
 
vardef pulled_super_arc.r(suffix $, $$)(expr darkness)=
 pair corner;
 if y$=y$r: corner=(x$r,y$$r);
 else: corner=(x$$r, y$r); fi
 z$r{corner-z$r}...(darkness)[corner, .5[z$r, z$$r]]{z$$r-z$r}
 ...z$$r{z$$r-corner} enddef;
 
vardef pulled_arc@#(suffix $, $$)=
 pulled_super_arc@#($,$$)(eta) enddef;

%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{cm-font-setup}
% \begin{macro}{slim-font-setup}
%  The basic font set up.
%    \begin{macrocode}

let cm_font_setup=font_setup; % Knuth's original font_setup
 
def slim_font_setup = % trimmed font_setup for use with Trajan caps only
 if monospace: let adjust_fit=mono_adjust_fit;
  def mfudged=fudged enddef;
  mono_charic#:=body_height#*slant;
  if mono_charic#&lt;0: mono_charic#:=0; fi
  mono_charwd#:=9u#; define_whole_pixels(mono_charwd);
 else: let adjust_fit=normal_adjust_fit;
  def mfudged= enddef; fi
 define_pixels(u,width_adj,serif_fit,cap_serif_fit,jut,cap_jut,bar_height,
  dish,bracket,beak_jut,apex_o,apex_corr); 
 define_whole_pixels(letter_fit,fine,crisp,tiny);
 define_whole_vertical_pixels(body_height,asc_height,
  cap_height,x_height,comma_depth,desc_depth);
 define_whole_blacker_pixels(hair,stem,cap_stem);
 define_whole_vertical_blacker_pixels(vair,dslab,slab);
if slab&lt;eps: slab:=eps fi;
 define_corrected_pixels(o);
 forsuffixes $=hair,stem,cap_stem:
  fudged$.#:=fudge*$.#; fudged$:=hround(fudged$.#*hppp+blacker);
  forever: exitif fudged$&gt;.9fudge*$; fudged$:=fudged$+1; endfor endfor
 rule_thickness:=ceiling(rule_thickness#*hppp);
 heavy_rule_thickness:=ceiling(3rule_thickness#*hppp);
 oo:=vround(.5o#*hppp*o_correction)+eps;
 apex_oo:=vround(.5apex_o#*hppp*o_correction)+eps;
 lowres_fix(stem) 1.3;
 ess:=(ess#/stem#)*stem; cap_ess:=(cap_ess#/cap_stem#)*cap_stem;
 dw:=(curve#-stem#)*hppp; bold:=curve#*hppp+blacker;
 dh#:=.6designsize;
 more_super:=max(superness,sqrt .77superness);
 hein_super:=max(superness,sqrt .81225258superness); % that's $2^{-.3}$
 clear_pen_memory;
 if fine=0: fine:=1; fi
 forsuffixes $=fine,crisp,tiny:
%%% fine $ %%%% temporary formatting convention for MFT
  if $&gt;fudged.hair: $:=fudged.hair; fi
  $.breadth:=$;
  pickup if $=0: nullpen else: pencircle scaled $; $:=$-eps fi;
  $.nib:=savepen; breadth_[$.nib]:=$;
  forsuffixes $$=lft,rt,top,bot: shiftdef($.$$,$$ 0); endfor endfor
%%% @ $ %%%% restore ordinary formatting for $
 min_Vround:=max(fine.breadth,crisp.breadth,tiny.breadth);
 if min_Vround&lt;vround min_Vround: min_Vround:=vround min_Vround; fi
 pickup pencircle scaled rule_thickness; rule.nib:=savepen;
 currenttransform:=identity slanted slant
  yscaled aspect_ratio scaled granularity;
 if currenttransform=identity: let t_=relax
 else: def t_ = transformed currenttransform enddef fi;
 numeric paren_depth#; .5[body_height#,-paren_depth#]=math_axis#;
 numeric asc_depth#; .5[asc_height#,-asc_depth#]=math_axis#;
 body_depth:=desc_depth+body_height-asc_height;
 shrink_fit:=1+hround(2letter_fit#*hppp)-2letter_fit;
 if not string mode: if mode&lt;=smoke: shrink_fit:=0; fi fi
 enddef;

%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{trajan-font-setup}
%    This macro contains additional set up for the Trajan fonts.
%    \begin{macrocode}
 
def trajan_font_setup= % contains special stuff for Trajan fonts
  define_pixels(side,thick,thin,medium,half_height);
  define_pixels(dot_size,math_axis,flare,stem_corr,curve);  
  if not known dslab#: dslab=eps; fi
enddef;

%    \end{macrocode}
% \end{macro}
%
%
%    \begin{macrocode}
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  END OF MACROS %%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%    \end{macrocode}
%
%    Set the mode and font setup.
%    \begin{macrocode}
 
font_coding_scheme:="ASCII caps and punctuation";
 
mode_setup; 
 
trajan_font_setup;
if whole_font: font_setup; %slab:=eps;  
 define_whole_vertical_blacker_pixels(dslab,slab);
 else: slim_font_setup; fi

%    \end{macrocode}
%
%
%    We generate Trajan's uppercase letters, together with (matching)
% Computer Modern Roman punctuation and some analphabetics.
%    \begin{macrocode}
 
input trjnromanu;   % Trajan upper case (majuscules)
input trjnpunct;    % punctuation
input trjnlig;      % the several dashes
input trjnromanp    % ampersand and ?mark

%    \end{macrocode}
%
% Finally, do the uppercase ligtable.
%
%    \begin{macrocode}
 
font_slant slant; font_x_height x_height#;
if monospace: font_normal_space 9u#; % no stretching or shrinking
 font_quad 18u#;
 font_extra_space 9u#;
else: font_normal_space 6u#+2letter_fit#;
 font_normal_stretch 3u#; font_normal_shrink 2u#;
 font_quad 18u#+4letter_fit#;
 font_extra_space 2u#;
 k#:=-.5u#; kk#:=-1.5u#; kkk#:=-2u#; % three degrees of kerning
 ligtable "P": "T": "Y": "A" kern kk#;
 ligtable "F": "V": "W": "A" kern if serifs: kkk# else: kk#fi,
  "K": "X": "O" kern k#, "C" kern k#, "G" kern k#, "Q" kern k#;
 ligtable "O": "D": "X" kern k#, "W" kern k#, "A" kern k#,
   "V" kern k#, "Y" kern k#;
 ligtable "A": if serifs: "R": fi
  "C" kern k#, "O" kern k#, "G" kern k#, "U" kern k#, "Q" kern k#,
  "L": "T" kern kk#, "Y" kern kkk#, "V" kern kk#, "W" kern kkk#;
ligtable "I": "I" kern -k#; fi % Richard III

bye.

%&lt;/mfd&gt;
%    \end{macrocode}
%
% \subsection{The majuscule code}
%
%    The following code is based on the code for the Pacioli
% characters. The geometry, of course, is different for Trajan's characters.
%
%    \begin{macrocode}
%&lt;*maj&gt;
% TRJNROMANU.MF Program files for formal Computer Trajan fonts.
%

def checkthin=
if thin-currentbreadth&lt;eps: thin:=currentbreadth+eps; fi; 
if thin-currentbreadth&lt;eps: thin:=currentbreadth+eps; fi enddef;
 
pair xeps, yeps; xeps=(eps,0); yeps=(0,eps);
numeric tail_corr; tail_corr=1/8; 
numeric cap_jut_factor; cap_jut_factor=8/7;

numeric pcshiftx#; % x value of LHS of Trajan box wrt origin of char box
define_pixels(pcshiftx);

%    \end{macrocode}
%
% \begin{macro}{A}
%    The letter A. The right and left legs are |thick| and |medium| 
% respectively, while the cross-bar is |medium|. With serifs, it just fits
% inside the square. The apex is at the top of the square on the centerline
% and the top of the bar is |medium| below the half-height.
%    \begin{macrocode}
 
cmchar "Trajan's letter A";
beginchar("A", 2u#+side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
pcshiftx := u;
y100 = h/2; x100 = pcshiftx+y100;  % center point
top y3= top y2=h;
  % for left leg
numeric alpha[]; alpha1=(h++(0.5h - cap_jut))/(h);
penpos1(alpha1*medium,0); penpos2(alpha1*medium,0); 
  % and for the right leg
alpha2=(h++(0.5h - cap_jut))/(h);
penpos3(alpha2*thick,0); penpos4(alpha2*thick,0);
lft x1l=pcshiftx+cap_jut; rt x4r=x1l+h-2cap_jut;
bot y1=bot y4=0;
x3r=x2l = 0.5h + pcshiftx;
z0=whatever[z1r,z2r]=whatever[z3l,z4l];
  % draw the legs
fill z0--diag_end(0,4l,1,1,4r,3r)--z3r..z2l--diag_end(2l,1l,1,1,1r,0)
  --z0..cycle;  % diagonals
  % now for the bar
top y5r=top y6r=hround(h/2 - medium); 
top y5r-bot y5l=top y6r-bot y6l=medium;
penpos5(whatever, angle(z2-z1)); penpos6(whatever, angle(z3-z4));
z5=whatever[z1,z2]; z6=whatever[z3,z4];
penstroke z5e--z6e; % bar line
if serifs: 
 bracket:=10/7 bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor; 
 jut_factor:=3/4;
 serif(1,2,a,sadj*serif_darkness,-cap_jut);
 serif(4,3,d,sadj*serif_darkness, cap_jut); 
 bracket:=jut_factor*bracket; 
 serif(1,2,b,sadj*serif_darkness,jut_factor*cap_jut); 
 serif(4,3,c,sadj*serif_darkness,-jut_factor*cap_jut);
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,100); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{B}
%    The letter B. At the original size, with serifs it fills 60\% of 
% the square width. I have increased the width for the printing size otherwise
% the bowls appear too dark.
%    \begin{macrocode}
 
cmchar "Trajan's letter B";
beginchar("B",u#+0.625side#+o#, cap_height#, 0);
adjust_fit(cap_serif_fit#,0); pickup tiny.nib;
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;  % square center
numeric alpha; alpha := 0.75;
pos1(thick,0); pos2(thick,0); lft x1l=lft x2l=pcshiftx+cap_jut;
 bot y2=0; top y1=h; 
filldraw stroke z1e--z2e; % vertical stem
% prepare for the bottom bowl
pos3(thin,-90); pos5(thick,0); pos7(thin,90);
z3r=z2; 
y4l=y3l; x4l=x3l+2thick; y4r=y3r; x4r=x4l;
z4=0.5[z4l,z4r];
y7l=y100+thin; x7=x1;
y6l=y7l; x6l=x4l-0.5thick; top y6r- bot y6l= thin; x6r=x6l;
z6=0.5[z6l,z6r];
rt x5r=w-pcshiftx;   % bottom bowl takes max space
y5=0.5[y7l,y2];
% draw the bottom bowl
filldraw stroke z3e--z4e..pulled_arc.e(4,5)&amp;pulled_arc.e(5,6)..z6e--z7e;
% prepare for the top bowl
pos7'(thin,-90); pos8(alpha*thick,0); pos10(thin,90);
z7'=z7; z6'=z6; 
x6'r=x6r; x6'l=x6l; y6'r=y7'r; y6'l=y7'l;
z10r=z1; 
x9r=x6'r; x9l=x6'l; y9r=y10r; top y9r-bot y9l=thin;
z9=0.5[z9r,z9l];
rt x8r=x100+o; y8=0.5[y7l,y1];
% draw the top bowl
filldraw stroke z7'e--z6'e..pulled_arc.e(6',8)&amp;pulled_arc.e(8,9)..z9e--z10e;
 
if serifs: 
  serif(1,2,a, sadj*serif_darkness,-cap_jut); % top LL
  serif(2,1,b, sadj*serif_darkness,-cap_jut); % bottom LL
  numeric tempa_, tempb_; tempa_=slab; tempb_=bracket;
  slab:=thin; bracket:=cap_jut; 
  serif(2,1,c,serif_darkness,cap_jut); % bottom LR
  slab:=tempa_; bracket:=tempb_; 
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,7,8,9,10,11,12,100); 
penlabels(6',7'); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{C}
%    The letter C. The thicness of the bowl varies between |thick| and |thin|.
% It is slightly narrower than a full square, by a distance |thick|.
%    \begin{macrocode}
 
cmchar "Trajan's letter C";
beginchar("C",2u#+side#-thick#, cap_height#, 0);  
adjust_fit(0, 0); pickup tiny.nib;
pcshiftx := u;
y100 = h/2; x100 = pcshiftx + y100;        % center point
numeric alpha; alpha=w-u-thick;    
numeric beta; beta=pcshiftx+(side-thick);  % rightmost Xcoord of letter
pos2(thin, 90); x2=x100; top y2r=h+o;      % topmost point
pos3(thick,180); lft z3r=(pcshiftx,y100);  % leftmost point
pos4(thin, 270); x4=x2+thick; bot y4r=-o;  % bottommost point
pos0(thick,0); lft z0l=(w+thick-2pcshiftx,h/2); 
path p, p', line.u, line.b; line.u=(alpha,1.5h)--(alpha,h/2); 
 line.b=(.5[alpha,x0],0)--(.5[alpha,x0],h/2);
p=pulled_arc.r(0,2)&amp;pulled_arc.r(2,3)&amp;pulled_arc.r(3,4)
  &amp;pulled_arc.r(4,0)&amp;cycle;
p'=pulled_arc.l(0,2)&amp;pulled_arc.l(2,3)&amp;pulled_arc.l(3,4)
  &amp;pulled_arc.l(4,0)&amp;cycle;
z'1l=line.u intersectionpoint p'; z'1r=line.u intersectionpoint p; 
z1r = (beta, h-thin); z1l = (x1r, y1r-1.5thick);
z1 = 0.5[z1r, z1l];
z'5l=line.b intersectionpoint p'; z'5r=line.b intersectionpoint p;
z5l = (x1, 2thick); z5r = (x1-thin, medium); z5 = 0.5[z5l,z5r];
 % adjust to have a better opening 
numeric slope_factor; slope_factor=3/4;
filldraw 
 z1r{-1,slope_factor}...{left}z2r..pulled_arc.r(2,3)&amp;
 pulled_arc.r(3,4)..{right}z4r..tension 0.9..z5r--
 reverse
  (z1l{z2-z4}..{left}z2l..pulled_arc.l(2,3)&amp;pulled_arc.l(3,4)..{right}z4l..z5l)
 ..(z1l+(eps,0))--(z1r+(eps,0))..cycle;
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{D}
%    The letter D. With serifs, it fills the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter D";
beginchar("D", u#+side#, cap_height#, 0);
adjust_fit(cap_serif_fit#,0);
pcshiftx:=0.5u;
y100=h/2; x100=pcshiftx+y100;  % square center
pickup tiny.nib; pos1(thick,0); pos2(thick,0);
lft x1l=.5u+cap_jut; x2=x1; bot y2=0; top y1=h; 
filldraw stroke z1e--z2e; % stem
pos3(thin, 90); pos5(thick, 0); pos7(5/4thin, -90);
x3=x7=x1; top y3r=h; bot y7r=0; 
y5=good.y h/2; 
rt x5r=w-pcshiftx;
x4r=x6r=hround(w/2); top y4r=h; bot y6r=0; 
bot y4l=vround(h-thin); top y6l=vround 5/4thin; 
x4l=x6l;  2(lft x5l-x4l)=y4l-y6l;
z4=.5[z4l, z4r]; z6=.5[z6l, z6r];
filldraw stroke z3e{right}...pulled_super_arc.e(4,5,eta)&amp;
  pulled_super_arc.e(5,6,eta)...{left}z7e; % lobe
if serifs: 
  serif(1, 2, a, serif_darkness, -cap_jut); 
  serif(2, 1, b, serif_darkness, -cap_jut);
  numeric temp_; temp_=slab; slab:=5/4thin; 
  serif(2, 1, c, serif_darkness, cap_jut); 
  slab:=temp_; 
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,7,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{E}
%    The letter E. Including serifs it is half the width of the square, 
% but the bottom arm is slighty longer by the |medium| amount.
%    \begin{macrocode}
 
cmchar "Trajan's letter E";
beginchar("E", u#+0.5side#+medium#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); 
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;  % center point
pickup tiny.nib; 
pos1(thick,0); pos2(thick,0);
lft x1l=lft x2l=pcshiftx+cap_jut; top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; % prepare for arms and serifs
pos3(medium,90); pos4(dslab,0); 
x1=x3; top y3r=h; rt x4l=x100;
 bot y4=vround(h-vstretch*thick);
arm(3,4,d,serif_darkness,0); % top arm and beak
pos5(thin,-90); pos0(thin,90); pos6(dslab,0); pos7(dslab,0);
x5=x0=x1; y5=y0=hround(h/2); rt x6r=rt x7r= rt x4l - medium;
top y6-bot y7= thin+2thick; y5=.5[y6,y7];
arm(5,6,e,sadj*eta,0); arm(0,7,f,sadj*eta,0);  % middle arm and beaks
% now do the bottom arm
pos8(medium,-90); pos9(dslab,0); x8=x2; bot y8r=0; 
rt x9r=hround(x4l+medium);
y9=1.5thick;
foot(8,9,g,serif_darkness,medium); % lower arm 
if serifs: 
  serif(1,2,a,sadj*serif_darkness,-cap_jut); 
  serif(2,1,b,sadj*serif_darkness,-cap_jut);
  temp_:=slab; slab:=medium; tmp_:=bracket; bracket:=cap_jut+medium;
  serif(2,1,c,serif_darkness,cap_jut); 
  slab:=temp_; bracket:=tmp_; 
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,7,8,9,100); endchar; % end of "E"
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{F}
%    The letter F. This is an E without the bottom arm.
%    \begin{macrocode}
 
cmchar "Trajan's letter F";
beginchar("F", u#+0.5side#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); 
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;  % square center
pickup tiny.nib; 
pos1(thick,0); pos2(thick,0);
lft x1l=lft x2l=pcshiftx+cap_jut; top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; % prepare for arms and serifs
pos3(medium,90); pos4(dslab,0); 
x1=x3; top y3r=h; rt x4l= x100;
 bot y4=vround(h-if monospace: 2 fi vstretch*thick);
arm(3,4,d,serif_darkness,0); % top arm and beak
pos5(thin,-90); pos0(thin,90); pos6(dslab,0); pos7(dslab,0);
x5=x0=x1; y5=y0=hround(h/2); rt x6r=rt x7r= rt x4l-medium;
top y6-bot y7= thin+2thick; y5=.5[y6,y7];
arm(5,6,e,eta,0); arm(0,7,f,eta,0);  % middle arm and beaks
if serifs: 
 serif(1,2,a,sadj*serif_darkness,-cap_jut); 
 serif(2,1,b,sadj*serif_darkness,-cap_jut); 
 serif(2,1,c,serif_darkness, cap_jut);
 fi
proofpcbb(100, y100,y100);
penlabels(0,1,2,3,4,5,6,7,100); endchar; % end of "F"
 
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{G}
%    The letter G. This is based on the C and has optical adjustments.
%    \begin{macrocode}
 
cmchar "Trajan's letter G";
beginchar("G",2u#+side#-thick#+cap_jut#, cap_height#, 0);  
adjust_fit(0, cap_serif_fit#); 
pcshiftx := u;
y100=h/2; x100=pcshiftx+y100;   % square center
pickup tiny.nib;
% This code is almost identical to that for the letter C.
numeric alpha; alpha=w-pcshiftx-thick-cap_jut;    
numeric beta; beta= pcshiftx+side-thick; % rightmost Xcoord of letter (w/o serifs)
pos2(thin, 90); x2=x100; top y2r=h+o;     % topmost pen position
pos3(thick,180); lft z3r=(pcshiftx,y100); % leftmost point
pos4(thin, 270); x4=x2+thick; bot y4r=-o; % bottommost point
pos0(thick,0); lft z0l=(x100+0.5side-thick,y100);
path p, p', line.u, line.b; line.u=(alpha,1.5h)--(alpha,h/2); 
 line.b=(.5[alpha,x0],0)--(.5[alpha,x0],h/2);
p=pulled_arc.r(0,2)&amp;pulled_arc.r(2,3)&amp;pulled_arc.r(3,4)
  &amp;pulled_arc.r(4,0)&amp;cycle;
p'=pulled_arc.l(0,2)&amp;pulled_arc.l(2,3)&amp;pulled_arc.l(3,4)
  &amp;pulled_arc.l(4,0)&amp;cycle;
z'1l=line.u intersectionpoint p'; z'1r=line.u intersectionpoint p; 
z1r=(beta, h-thin); z1l=(x1r,y1r-1.5thick);
z1=0.5[z1r,z1l];
z'5l=line.b intersectionpoint p'; z'5r=line.b intersectionpoint p;
z5l = (x1+0.1thin, 2thick); z5r=(x5l,medium);
z5=0.5[z5r,z5l];
 % readjust to have a better opening in CDTT
numeric slope_factor; slope_factor=3/4;
% Addtional G work (preceding program is similar to that for letter C)!
path p,p',line.o, line.i;
p=z1r{-1,slope_factor}..{left}pulled_arc.r(2,3)&amp;
 pulled_arc.r(3,4){right}..tension 0.9..z5r;
p'= reverse
  (z1l{z2-z4}..{left}z2l..pulled_arc.l(2,3)&amp;pulled_arc.l(3,4)..{right}z4l..z5l);
pos7(thick,0); 
x7r=x1; y7r=7/2thick;
numeric counter; counter=0;
forever: 
 counter:=counter+1;
 line.o:=z7r--(x7r,-2o); line.i:=(z7r-(thick,0))--(x7r-thick,-2o);
 numeric t[],tt[];
 (t1,tt1)=p intersectiontimes line.o; (t2,tt2)=p' intersectiontimes line.i;
 exitif t1*t2&gt;0; forsuffixes $$=l, r: x7$$:=x7$$-.1u; endfor 
 x7:=x7-.1u; endfor 
x6r=x7r; x6l=x7l; bot y6r=ypart point t1 of p; bot y6l=ypart point t2 of p';
z6=.5[z6r,z6l];
p:= subpath(0,t1) of p..(z6r-xeps+yeps)--(z6l+xeps+yeps)..
 subpath(t2,infinity) of p'..(z1l+xeps)--cycle; 
filldraw p;
filldraw z6l--z7l--z7r--z6r--cycle;
if serifs: 
  serif(7,6,a,sadj*serif_darkness,-cap_jut); 
  serif(7,6,b,sadj*serif_darkness, cap_jut); 
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,7,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{H}
%    The letter H. With serifs, this fills the square. The two legs are
% |thick|. The cross-bar is |medium|, like the A, and the bottom of the
% bar is at the half-height;
%    \begin{macrocode}
 
cmchar "Trajan's letter H";
beginchar("H", u#+side#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); 
pcshiftx := u/2;
y100 = h/2; x100 = pcshiftx + y100;  % center point
pickup tiny.nib;
forsuffixes t=1,2,3,4: pos.t(thick,0); endfor
lft x1l=lft x2l=pcshiftx+cap_jut; bot y2=0; top y1=h;
filldraw stroke z1e--z2e;            % left vertical stem
rt x3r= rt x4r=x1l+h-2cap_jut; y3=y1; y4=y2; 
filldraw stroke z3e--z4e;            % right vertical stem
pos5(medium, 90); pos6(medium,90);
x5=.5[x1r,x1l]; x6=.5[x3l,x3r]; bot y5r=bot y6r=h/2;
filldraw stroke z5e--z6e;            % horizontal crossbar
if serifs: 
 serif(1,2,a,sadj*serif_darkness,-cap_jut); % top LL
 serif(1,2,b,sadj*serif_darkness,cap_jut);  % top LR
 serif(2,1,c,sadj*serif_darkness,-cap_jut); % bottom LL
 serif(2,1,d,sadj*serif_darkness,cap_jut);  % bottom LR
 serif(3,4,e,sadj*serif_darkness,-cap_jut); % top RL
 serif(3,4,f,sadj*serif_darkness,cap_jut);  % top RR
 serif(4,3,g,sadj*serif_darkness,-cap_jut); % bottom RL
 serif(4,3,h,sadj*serif_darkness,cap_jut);  % bottom RR
fi
proofpcbb(100, y100, y100);
labels(1,2,3,4,5,6,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{I}
%    The letter I.
%    \begin{macrocode}
 
cmchar "Trajan's letter I";
beginchar("I", u#+2cap_jut#+thick#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
pcshiftx := u/2;
y100 = h/2; x100 = pcshiftx + cap_jut + 0.5cap_stem;  % center point
pickup tiny.nib; checkthin; pos1(cap_stem,0); pos2(cap_stem,0);
x1=x2=hround(w/2); top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % vertical stem
if serifs: 
  serif(1, 2, a, sadj*serif_darkness, -cap_jut); 
  serif(1, 2, b, sadj*serif_darkness, cap_jut); % top lft,rt
  serif(2, 1, c, sadj*serif_darkness, -cap_jut); 
  serif(2, 1, d, sadj*serif_darkness, cap_jut); % bot lft,rt
fi
proofpcbb(100, y100, y100);
penlabels(1, 2, 100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{J}
%    The letter J. The Romans didn't use J, but Tschichold designed a matching
% J, which I use here. The J extends 2*thick below the baseline.
%    \begin{macrocode}
 
cmchar "Trajan's letter J";
beginchar("J",u#+2.5thick#+cap_jut#, cap_height#, 2thick#);
adjust_fit(0, cap_serif_fit#); pickup tiny.nib;
pcshiftx := u/2;
y100 = h/2; x100 = pcshiftx + 2.5thick;   % center point
pos1(thick,0); pos2(thick,0); pos3(0.5thin, -90);
top y1=h; rt x1r=w-pcshiftx-cap_jut; x2=x1; bot y2=0; 
lft x3=x1-2thick; bot y3r=-d;
filldraw stroke z1e--z2e{down}..{left}z3e;
if serifs: 
 serif(1,2,a,sadj*serif_darkness,-cap_jut);
 serif(1,2,b,sadj*serif_darkness,cap_jut); 
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{K}
%    The letter K. With serifs its width is 7/8 square.
%    \begin{macrocode}
 
cmchar "Trajan's letter K";
beginchar("K", u#+0.875side#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); pickup tiny.nib;
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;  % square center
% the stem
pos1(thick,0); pos2(thick,0); 
lft x1l=lft x2l=pcshiftx+cap_jut;
 top y1=h; bot y2=0; 
 filldraw stroke z1e--z2e; % left stem
numeric alpha; alpha=(h++(h/2))/(h);
% top arm
pos3(alpha*medium,0); pos4(alpha*medium,0);
x4l=x1r; y4=y100;
x3l=x100+medium; y3=h;
% bottom arm
pos5(alpha*thick,0); pos6(alpha*thick,0);
z5l=z4l;
x6l=x3l+cap_jut; y6=0;
z0=whatever[z6r,z5r]=whatever[z3r,z4r];   % notch point
% draw the arms
filldraw z4l--z3l--z3r--z0--z6r--z6l--cycle;
if serifs:
 serif(1,2,a,sadj*serif_darkness,-cap_jut); 
 serif(1,2,b,sadj*serif_darkness,cap_jut); 
 serif(2,1,c,sadj*serif_darkness,-cap_jut); 
 serif(2,1,d,sadj*serif_darkness,cap_jut);
 numeric old_jut, old_brack; old_jut=cap_jut; old_brack=bracket;
% serifs on top leg
 bracket:=.5old_brack;cap_jut:=.5old_jut;
 serif(3,4,e,serif_darkness,-cap_jut);
 bracket:=2old_brack; cap_jut:=2old_jut; 
 serif(3,4,f,.6serif_darkness, 0.5cap_jut);
% serifs on bottom leg
 bracket:=.5old_brack;cap_jut:=.5old_jut;
 serif(6,5,g,serif_darkness,-cap_jut);
 bracket:=2old_brack; cap_jut:=2old_jut; 
 serif(6,5,h,.6serif_darkness, 0.5cap_jut);
 cap_jut:=old_jut; bracket:=old_brack;
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{L}
%    The letter L. This is identical to the left leg and
% bottom arm of Trajan's E. It extends |medium| beyond half the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter L";
beginchar("L", u#+0.5side#+medium#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); 
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;  % square center
pickup tiny.nib; 
pos1(thick,0); pos2(thick,0);
lft x1l=lft x2l=pcshiftx+cap_jut; top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; % prepare for lower arm
pos8(medium,-90); pos9(dslab,0); x8=x2; bot y8r=0; 
rt x9r=hround(x100+medium);
y9=1.5thick; 
foot(8,9,g,serif_darkness,medium); % lower arm
if serifs: 
  serif(1,2,a,sadj*serif_darkness,-cap_jut); 
  serif(2,1,b,sadj*serif_darkness,-cap_jut); 
  serif(1,2,d,serif_darkness,cap_jut);
  temp_:=slab; slab:=medium; tmp_:=bracket; bracket:=thick+medium;
  serif(2,1,c,serif_darkness,thick); 
  slab:=temp_; bracket:=tmp_; 
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,7,8,9,100); endchar; % end of "L"
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{M}
%    The letter M. This has slightly sloping right and left legs. The outside
% serifs at the base are outside the square.
%    \begin{macrocode}
 
cmchar"Trajan's letter M";
beginchar("M", u#+2cap_jut#+side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
pcshiftx := 0.5u+cap_jut;
y100=h/2; x100=pcshiftx+y100;     % square center
pos1(medium,0); pos2(medium,0); % left leg
  lft x1l=pcshiftx+cap_jut; top y1=h; bot y2=0;
  lft x2l = pcshiftx;  
pos3(thick,0); pos4(thick,0);   % right leg
  x4r=pcshiftx+h; top y3=h; bot y4=0;
  x3r=x4r-cap_jut; 
numeric long, short, hypot, alpha; long=side; short=1/2side;
hypot=long++short; alpha=hypot/long;
pos5(alpha*thick,0); pos6(alpha*thick,0);  % left inner
  z5r=z1l; bot lft z6l=(x100,0);
pos7(alpha*medium,0); pos8(alpha*medium,0); % right inner
  z8l=z3r; bot rt z7r=z6l;
z0=whatever[z5r,z6r]=whatever[z7l,z8l];  % bottom notch
z10=whatever[z5l,z6l]=whatever[z1r,z2r]; % left notch
z11=whatever[z7r,z8r]=whatever[z3l,z4l]; % right notch
% draw the M all in one go
filldraw z5r--z0--z8l--z3r--z4r--z4l--z11--z6l--z10--z2r--z2l--z1l--cycle;
if serifs: 
 serif(2,1,a,sadj*serif_darkness,-cap_jut); % left leg
 serif(2,1,e,sadj*serif_darkness,cap_jut); 
 serif(4,3,d,sadj*serif_darkness, cap_jut); % right leg
 serif(4,3,f,sadj*serif_darkness,-cap_jut);
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,7,8,10,11,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{N}
%    The letter N. With serifs it fills the square. The diagonal is |thick|
% and the width of the uprights is 75\% of the width of the diagonal.
%    \begin{macrocode}
 
cmchar "Trajan's letter N";
beginchar("N", u#+side#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
pcshiftx := u/2;
y100 = h/2; x100 = pcshiftx + y100;   % center point
numeric long, short, hypot, alpha; long=h; short=h;
hypot=long++short; alpha=hypot/long;
numeric legw; legw = 3/4thick;
pos1(legw,0); pos2(legw,0); lft x1l=lft x2l=pcshiftx+cap_jut; top y1=h; bot y2=0;
pos3(legw,0); pos4(legw,0); x3=x4; rt x3r=w-pcshiftx-cap_jut; y3=y1; y4=y2;
pos 5(alpha*thick,0); pos6(alpha*thick,0);
z5r=z1l; z6l=z4r; z0=whatever[z1r,z2r]=whatever[z5l,z6l]; % under notch point
z0'=whatever[z5r,z6r]=whatever[z3l,z4l];
filldraw z1l--z2l--z2r--z0--z6l--z3r--z3l--z0'--cycle;
if serifs: 
 % bottom of left stem
 serif(2,1,b,sadj*serif_darkness,-cap_jut); 
 serif(2,1,c,sadj*serif_darkness,cap_jut);
  % top of right stem
 serif(3,4,d,sadj*serif_darkness,-cap_jut);
 serif(3,4,e,sadj*serif_darkness,cap_jut);
fi
proofpcbb(100, y100, y100);
penlabels(0,0',1,2,3,4,5,6,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{O}
%    The letter O. This includes optical adjustments at the top and bottom.
%    \begin{macrocode}
 
cmchar "Trajan's letter O";
beginchar("O", 2u#+side#, cap_height#, 0);
adjust_fit(0,0); pair trajan[];
pcshiftx := u;
y100=h/2; x100=pcshiftx+y100;    % square center
x2r=pcshiftx; x4r=x2r+h; y1r=h+o; y3r=-o;
z100=.5[z5,z6]; numeric axis_angle;
trajan1=(x2r+0.25h,y1r); trajan2=(x4r, 0.75h);
trajan3=(x2r, 0.25h); trajan4=(x2r+0.75h, y3r);
axis_angle=angle(trajan2-trajan3);
z5-z6=(thick,0)rotated axis_angle;
y2r=y6; y4r=y5; x1r=x5; x3r=x6;
forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor
x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r;
x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r;
path p,p';
p=pulled_arc.r(1,2)&amp;reverse pulled_arc.r(3,2)&amp;
  pulled_arc.r(3,4)&amp;reverse pulled_arc.r(1,4)&amp;cycle; % outer
path anti_diag; anti_diag=z100--trajan1;
z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90);
x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270);
path diag; diag=z100--trajan2;
z41r=diag intersectionpoint p; penpos41(thick, axis_angle);
x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180);
p'= z1l{left}..z21l..z2l{down}..z32l..
    z3l{right}..z43l..
    z4l{up}..z41l..{left}cycle;  % inner
fill p; unfill p';
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,21,32,43,41,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{P}
%    The letter P. With serifs, the inside of the bowl is at half the width.
%    \begin{macrocode}
 
cmchar "Trajan's letter P";
beginchar("P", u#+0.5side#+thick#, cap_height#, 0);
adjust_fit(cap_serif_fit#, 0);
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;    % square center
pickup tiny.nib; 
pos1(thick,0); pos2(thick,0);
  top lft z1l=(pcshiftx+cap_jut,h); bot lft z2l=(pcshiftx+cap_jut,0);
filldraw stroke z1e--z2e; % vertical stem
pos3(thin,90); pos4(thin,90); pos5(thick,0); 
pos6(thin,-90); 
top y3r=top y4r=h; x3=x1; x4=x1r+thick; filldraw stroke z3e--z4e;
x6=x4; y6=hround(h/2); 
lft x5l=x100; y5=.75h;
pos7(0.5thin,-90); 
y7=y6+0.5thin; x7=.25[rt x1r, x6];
filldraw stroke pulled_super_arc.e(4,5,eta)&amp;pulled_super_arc.e(5,6,eta)
 ..z7e; % lobe
if serifs: 
 serif(1,2,a,sadj*serif_darkness,-cap_jut); 
 serif(2,1,b,sadj*serif_darkness,-cap_jut);
 serif(2,1,c,sadj*serif_darkness,cap_jut); 
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,7,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{Q}
%    The letter Q, which is based on the O and has a much longer tail
% than modern fonts.
%    \begin{macrocode}
 
cmchar "Trajan's letter Q";
beginchar("Q", 2u#+side#, cap_height#, 0);
adjust_fit(0,0); pair trajan[];
pcshiftx := u;
y100=h/2; x100=pcshiftx+y100;    % square center
x2r=pcshiftx; x4r=x2r+h; y1r=h+o; y3r=-o;
z100=.5[z5,z6]; numeric axis_angle;
trajan1=(x2r+0.25h,y1r); trajan2=(x4r, 0.75h);
trajan3=(x2r, 0.25h); trajan4=(x2r+0.75h, y3r);
axis_angle=angle(trajan2-trajan3);
z5-z6=(thick,0)rotated axis_angle;
y2r=y6; y4r=y5; x1r=x5; x3r=x6;
forsuffixes $=1,2,3,4: z$=.5[z$l,z$r]; endfor
x1l=x3r; y1l-y6=y6-y3r; x5-x2l=x4r-x5; y2l=y4r;
x3l=x1r; y1r-y5=y5-y3l; x4l-x6=x6-x2r; y4l=y2r;
path p,p';
p=pulled_arc.r(1,2)&amp;reverse pulled_arc.r(3,2)&amp;
  pulled_arc.r(3,4)&amp;reverse pulled_arc.r(1,4)&amp;cycle; % outer
path anti_diag; anti_diag=z100--trajan1;
z21r=p intersectionpoint anti_diag; penpos21(thin, axis_angle+90);
x43r=w-x21r; y43r=h-y21r; penpos43(thin, axis_angle+270);
path diag; diag=z100--trajan2;
z41r=diag intersectionpoint p; penpos41(thick, axis_angle);
x32r=w-x41r; y32r=h-y41r; penpos32(thick, axis_angle+180);
p'= z1l{left}..z21l..z2l{down}..z32l..
    z3l{right}..z43l..
    z4l{up}..z41l..{left}cycle;  % inner
fill p; unfill p';

% now for the tail!
numeric alpha; alpha:=0.4;
z10=z43;
z10l=z10-(alpha*thick,alpha*thick); z10r=z10+(alpha*thick,alpha*thick);
z11l=(x4r,-0.175h); z11r=z11l+(0,thick);
z13l=(x4r+0.375h,-0.25h); z13r=z13l+(0,medium);
z12l=(x4r+0.875h,-0.125h); z12r=z12l+(0,0.5thin);
filldraw z10r..z11r..z13r..z12r--z12l..z13l..z11l..z10l--cycle;
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,10,11,12,13,14,15,21,32,41,43,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{R}
%    The letter R. Another character that, with serifs,  fills the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter R";
beginchar("R", u#+side#, cap_height#,0);
adjust_fit(cap_serif_fit#,0);
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;    % square center
pickup tiny.nib; pos1(thick,0); pos2(thick,0);
top lft z1l=(pcshiftx+cap_jut,h); bot lft z2l=(pcshiftx+cap_jut,0);
filldraw stroke z1e--z2e; % vertical stem
pos3(thin,90); pos4(thin,90); pos5(thick,0); 
pos6(thin, -90); 
top y3r=top y4r=h; x3=x1; x4=x1r+thick; 
x6=x4; y6=hround(h/2 - medium); 
lft x5l=x100; y5=.5[y4,y6];
pos7(thin, -90); 
y7=y6; x7=x3; 
filldraw stroke z3e--pulled_super_arc.e(4,5,eta)&amp;
 pulled_super_arc.e(5,6,eta)..z7e; % lobe
numeric half_letter_width; 2half_letter_width+1/2u=w;
if serifs: half_letter_width:=half_letter_width+1/2u; 
 else: half_letter_width:=half_letter_width-1.6thin; fi
path p; p=pulled_super_arc.r(5,6,eta)..z7r;
z0r=p intersectionpoint ((half_letter_width,0)--(half_letter_width,h));
path circ_; circ_= (((halfcircle scaled 2thick) rotated 180) shifted z0r);
z0l= p intersectionpoint circ_;
z0'=(.45[half_letter_width,w],0); 
numeric tail_angle; tail_angle=angle(z0l-z0'); 
penpos8(thick, tail_angle-90); z8l=whatever[z0', z0l]; 
 x8=1/5[half_letter_width,w]; 
penpos9(2/3thick,tail_angle-90); z9r=whatever[z0r, z8r]; 
 x9r=.5[half_letter_width, w]; 
penpos10(0.5thin,90); 
z10r=(w,-0.5thin);
fill z0l--z8l...{right}z10l--z10r{-w,1/4h}..z9r--z0r--cycle; % tail 
if serifs: 
 serif(1,2,a,sadj*serif_darkness,-cap_jut); 
 serif(2,1,b,sadj*serif_darkness,-cap_jut); 
 serif(2,1,c,sadj*serif_darkness,cap_jut); fi 
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,7,8,9,10,100); labels(0'); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{S}
%    The letter S. The width is half the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter S";
beginchar("S", 2u#+1/2side#, cap_height#, 0);
adjust_fit(0,0); pickup tiny.nib;
pcshiftx := u;
y100 = h/2; x100 = w/2;    % square center
pair trajan[]; % points to contain corner coords of Trajan square
ypart trajan3=ypart trajan4=0; ypart trajan1= ypart trajan2=h;
xpart trajan1=xpart trajan3; xpart trajan4= xpart trajan2= xpart trajan3+side;
xpart trajan3=x100-0.5side;
numeric slope, diag_angle; diag_angle=angle(trajan2-trajan3);
slope=-0.75h/(xpart trajan4-xpart trajan3);
pos0(thick,diag_angle); 
x0=w/2; y0=h/2;
lft x3l=pcshiftx+o;
rt x3r=lft x3l+5/6thick;
pos2(thin,-diag_angle); top y2l=h; 
if x0-x3r&gt;thick: 
  x2l=x0; 
else: 
  x2l=x0r; slope:=-1/2; 
fi
ellipse_set(2l,3l,4l,0l); ellipse_set(2r,3r,4r,0r);
pos7(thin,-diag_angle); x7r=x0; bot y7r=0; 
rt x6r=w-pcshiftx;  lft x6l=rt x6r-5/6thick;
ellipse_set(7l,6l,5l,0l); ellipse_set(7r,6r,5r,0r); 
pos1(max(currentbreadth+eps,5/6 thick),-90); 
top y1l=h-thin; x1=x6r-o;
pos8(1.5thick,-90);
lft x8r=pcshiftx; bot y8r=medium;
filldraw z1l..z2l{left}..{down}z3l..z4l--z5l..{down}z6l..{left}z7l..z8l
 --z8r..{right}z7r..{up}z6r..z5r--z4r..{up}z3r..{right}z2r..z1r--cycle;
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,7,8,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{T}
%    The letter T. It has a jaunty crossbar.
%    \begin{macrocode}
 
cmchar "Trajan's letter T";
beginchar("T",2u#+0.8side#, cap_height#,0);
adjust_fit(cap_serif_fit#,0); pickup tiny.nib;
pcshiftx := u;
y100=h/2; x100=pcshiftx+y100;     % square center
pos1(thick,0); pos2(thick,0); 0.5[x1r,x1l]=0.5[x2r,x2l]=w/2;
top y1=h-thin; bot y2=0; 
filldraw stroke z1e--z2e; % central stem
% prepare for the top horizontal bar
numeric top_bar; top_bar=0.4side;  % half length of top bar
pos3(medium,90); pos4(dslab,0);
x1=x3; y3r=y1; rt x4l=x1+top_bar;
  bot y4=vround(y1- vstretch*(medium+cap_jut));
arm(3,4,c,sadj*serif_darkness,0);
% now the jaunty left arm
x5=x1-top_bar; 
y5=h;
pos8(medium,90);
x8r=0.3[x5,x1]; y8r=0.125[y3r,y5];
x6=x5-thin; y6=h-medium-cap_jut;
x7=x6+0.75cap_jut; y7=y3l;
x9=0.4[x6,x7]; y9=0.7[y6,y7];
filldraw z3r--z1l{left}..z8r..z5--z6{z5-z6}..z9..z7..z8l..z3l--cycle;
if serifs: 
  serif(2,1,a,sadj*serif_darkness,-cap_jut);
  serif(2,1,b,sadj*serif_darkness,cap_jut);
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,7,8,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{U}
%    The letter U. The Romans didn't have a U but Jan Tschichold 
% designed one to match. With serifs, this just fits into the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter U";
beginchar("U", u#+side#, cap_height#,0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
pcshiftx:=0.5u;
y100=h/2; x100=pcshiftx+y100;  % square center
pickup tiny.nib; 
x101=pcshiftx; y101=h; x102=x101+h; y102=0; % square corners
% right leg
pos5(thick,0); pos6(thick,0);
rt x5r= rt x6r= pcshiftx+h-cap_jut;
top y5=h; bot y6=0;
filldraw stroke z5e--z6e;  % leg
% left leg and bowl
pos1(thick,0); pos2(thick,0);
pos3(medium,-90); pos4(thin,0);
lft x1l= hround(pcshiftx+cap_jut); x2=x1;
top y1=h;
y2=0.35h;
x3=x100; bot y3r=0;
z4l=whatever[z101,z102]=whatever[z5l,z6l];
filldraw z1r--z2r{down}..z3l..z4l--z4r..z3r..z2l{up}--z1l--cycle;
if serifs: 
  serif(1,2,a,sadj*serif_darkness,-cap_jut); % top LL
  serif(1,2,b,sadj*serif_darkness,cap_jut);  % top LR
  serif(5,6,c,sadj*serif_darkness,-cap_jut); % top RL
  serif(5,6,d,sadj*serif_darkness,cap_jut);  % top RR
  serif(6,5,f,sadj*serif_darkness,cap_jut);  % bottom RR
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{V}
%    The letter V. With serifs it just fills the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter V";
beginchar("V",u#+side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;    % square center
numeric alpha; alpha=((0.5h-cap_jut)++(h))/(h);
pos1(alpha*thick,0); pos2(alpha*thick,0);
pos3(alpha*medium,0); pos4(alpha*medium,0);
top y1=top y4=h; lft x1l=pcshiftx+cap_jut; x4r=x1l+side-2cap_jut;
lft x2l=hround(pcshiftx+0.5side); x3r=x2l; bot y2=bot y3=0;
z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
filldraw z0--diag_end(0,4l,1,1,4r,3r)--z2l
 --diag_end(2l,1l,1,1,1r,0)--cycle;
if serifs: 
 bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor;
 jut_factor=3/4;
 serif(1,2,a,sadj*serif_darkness,-cap_jut); % top LL
 serif(4,3,d,sadj*serif_darkness,cap_jut);  % top RR
 bracket:=jut_factor*bracket;
 serif(1,2,b,sadj*serif_darkness, jut_factor*cap_jut); % top LR
 serif(4,3,c,sadj*serif_darkness,-jut_factor*cap_jut); % top RL
fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,100); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{W}
%    The letter W. Jan Tschichold provides a design for this. 
% It consists of 2 Vs shifted
% 3/8 of the side of the square.
%    \begin{macrocode}
 
cmchar "Trajan's letter W";
beginchar("W", u#+1.375side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup tiny.nib;
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;    % square center
numeric alpha; alpha=((0.5h-cap_jut)++(h))/(h);
numeric beta; beta := 0.375;
% the lefthand V
pos1(alpha*thick,0); pos2(alpha*thick,0);
pos3(alpha*medium,0); pos4(alpha*medium,0);
top y1=top y4=h; lft x1l=pcshiftx+cap_jut; x4r=x1l+side-2cap_jut;
lft x2l=hround(pcshiftx+0.5side); x3r=x2l; bot y2=bot y3=0;
z0=whatever[z1r,z2r]=whatever[z3l,z4l]; % notch point
filldraw z0--diag_end(0,4l,1,1,4r,3r)--z2l
 --diag_end(2l,1l,1,1,1r,0)--cycle;
% the righthand V
pos5(alpha*thick,0); pos6(alpha*thick,0);
pos7(alpha*medium,0); pos8(alpha*medium,0);
z5=(x1+beta*h,y1); z6=(x2+beta*h,y2);
z7=(x3+beta*h,y3); z8=(x4+beta*h,y4);
z10=(x0+beta*h,y0);
filldraw z10--diag_end(10,8l,1,1,8r,7r)--z6l
 --diag_end(6l,5l,1,1,5r,10)--cycle;

if serifs: 
 bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor;
 jut_factor=3/4;
 serif(1,2,a,sadj*serif_darkness,-cap_jut); % top LL left V
 serif(4,3,d,sadj*serif_darkness,cap_jut);  % top RR left V
 serif(5,6,f,sadj*serif_darkness,-cap_jut); % top LL right V
 serif(8,7,k,sadj*serif_darkness,cap_jut);  % top RR right V

 bracket:=jut_factor*bracket;
 serif(1,2,b,sadj*serif_darkness, jut_factor*cap_jut); % top LR left V
 serif(4,3,c,sadj*serif_darkness,-jut_factor*cap_jut); % top RL left V
 serif(5,6,g,sadj*serif_darkness, jut_factor*cap_jut); % top LR right V
 serif(8,7,j,sadj*serif_darkness,-jut_factor*cap_jut); % top RL right V
fi
proofpcbb(100, y100, y100);
penlabels(0,,1,2,3,4,5,6,7,8,10,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{X}
%    The letter X. The major leg is like the major leg (left) of the V.
%    \begin{macrocode}
 
cmchar "Trajan's letter X";
beginchar("X", u#+0.5side#+thick#+2cap_jut#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#);
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;    % center of square
numeric alpha; alpha=((0.5h-cap_jut)++(h))/(h);
% major leg
pos1(alpha*thick,0); pos2(alpha*thick,0);
top y1=h; lft x1l=hround(pcshiftx+cap_jut); 
bot y2=0; lft x2l=hround(pcshiftx+0.5side+cap_jut); 
% minor leg
penpos3(alpha*medium,0); penpos4(alpha*medium,0);
y3=y1; lft x3l=h/2+cap_jut;
y4=y2; lft x4l=pcshiftx+cap_jut;
filldraw z1l--z1r--z2r--z2l--cycle; % draw the thick limb
filldraw z3l--z3r--z4r--z4l--cycle; % draw the other limb
if serifs: 
 bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 pickup tiny.nib; numeric jut_factor;
 jut_factor=3/4;
 serif(1,2,a,serif_darkness,-cap_jut);    % outer serifs
 serif(2,1,d,serif_darkness,cap_jut);
 serif(3,4,f,serif_darkness,cap_jut);
 serif(4,3,g,serif_darkness,-cap_jut);
 bracket:=jut_factor*bracket;
 serif(1,2,b,sadj*serif_darkness,.75cap_jut);  % inner serifs
 serif(2,1,c,sadj*serif_darkness,-.75cap_jut);
 serif(3,4,e,sadj*serif_darkness,-.75cap_jut);
 serif(4,3,h,sadj*serif_darkness,.75cap_jut);
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,100); endchar;
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{Y}
%    The letter Y. With serifs it takes 7/8 of the square width.
%    \begin{macrocode}
 
cmchar "Trajan's letter Y";
beginchar("Y", u#+0.875side#, cap_height#, 0);
adjust_fit(cap_serif_fit#, cap_serif_fit#); pickup pencircle scaled 0pt;
pcshiftx := 0.5u;
y100=h/2; x100=pcshiftx+y100;       % center of square
numeric alpha, long, short, hypot; long=h/2; 
short=0.5side-thick-cap_jut;
 hypot=long++short; alpha=hypot/long;
% top left of V
penpos1(alpha*thick,0); 
lft x1l=pcshiftx+cap_jut;
top y1=h;
% top right of V
penpos4(alpha*medium,0); y4=y1; x4r=w-pcshiftx-cap_jut;
% the stem
penpos5(thick,0); penpos6(thick,0);
rt x5r= rt x6r=x100;
y6=0; y5=h;
% bottom of left V arm
penpos2(alpha*thick,0);
x2l=x6l; y2=y100;
% bottom of right V arm
penpos3(alpha*medium,0);
x3r=x6r; y3=y100+thin;
z0=whatever[z1r, z2r]=whatever[z3l,z4l]; % notch point
filldraw z1r--z0--z4l--z4r--z3r--z6r--z6l--z2l--z1l--cycle;
if serifs: 
 numeric jut_factor;
 serif(6,5,e,sadj*serif_darkness,-cap_jut); % stem L
 serif(6,5,f,sadj*serif_darkness,cap_jut);  % stem R
 bracket:=cap_jut_factor*bracket; cap_jut:=cap_jut_factor*cap_jut;
 jut_factor=3/4;
 % top outer serifs
 serif(1,2,a,serif_darkness,-cap_jut);serif(4,3,d,serif_darkness,cap_jut);
 bracket:=jut_factor*bracket;
 % top inner serifs
 serif(1,2,b,sadj*serif_darkness,0.6cap_jut);
 serif(4,3,c,sadj*serif_darkness,-0.6cap_jut); 
 fi
proofpcbb(100, y100, y100);
penlabels(0,1,2,3,4,5,6,100); endchar; % End of "Y"
 
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{Z}
%    The letter Z. Jan Tschichold supplies the design for this. It takes 3/4
% of the square in width, with the bottom arm like the E or L.
%    \begin{macrocode}
 
cmchar "Trajan's letter Z";
beginchar("Z", 2u#+0.75side#+medium#, cap_height#,0);
adjust_fit(0, 0); pickup tiny.nib;
pcshiftx := u;
y100=h/2; x100=pcshiftx+y100;    % center of square
numeric alpha, long, short, hypot;
long=h; short=h/2-thick; hypot=long++short;
alpha=hypot/long;
pos1(medium,90); pos2(medium,90); pos3(alpha*thick, 0); 
pos4(alpha*thick, 0); 
rt x3r=w-u; top y3=h; x4l=w-x3r; bot y4=0;
top y1r=h; lft x1=u; y2=y1; rt x2=x3;
filldraw stroke z1e--z2e; % top bar
filldraw stroke z3e--z4e; % diagonal
% and for the bottom bar
pos8(medium,-90); pos9(dslab,0); x8=x4; bot y8r=0; 
rt x9r=hround(x100+0.25h+medium);
y9=1.5thick; 
foot(8,9,g,serif_darkness,medium); % lower arm

if serifs: 
 pickup crisp.nib; % prepare for arms and serifs
 pos5(medium, 90); pos6(dslab,180); z5=z2; lft x6r=u; 
 bot y6=h-vstretch*thick;
 arm(5,6,a,serif_darkness,0); % upper dropped serif
fi
proofpcbb(100, y100, y100);
penlabels(1,2,3,4,5,6,7,8,9,100); endchar;

 
%&lt;/maj&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{The punctuation file}
%
% This is essentially a copy of Knuth's Computer Modern Roman punctuation.
%
%    \begin{macrocode}
%&lt;*punct&gt;
% TRJNPUNCT.MF This file contains punctuation marks common to 
%              Trajan roman and italic styles.

%    \end{macrocode}
%
% \begin{macro}{!}
%    The ! character.
%    \begin{macrocode}

cmchar "Exclamation point";
beginchar("!",5u#+width_adj#,asc_height#,0);
italcorr asc_height#*slant-2u#-.5width_adj#+.5dot_size#;
adjust_fit(0,0);
pickup tiny.nib; pos3(dot_size,0); pos4(dot_size,90);
lft x3l=hround(.5w-.5dot_size); bot y4l=0; z3=z4; dot(3,4);  % dot
numeric bot_width;
bot_width=if hefty:max(hround .8dot_size,fine.breadth) else: hair fi;
pickup fine.nib; pos1(dot_size,0); pos2(bot_width,0);
x1=x2=x3; bot y2=.25[top y4r,x_height]+1;
if square_dots: top y1=h;
 filldraw stroke z1e--z2e;  % stem
else: top z0=(x1,h+o); y1+.5dot_size=h+o;
 filldraw z1r...z0...z1l---z2l--z2r---cycle; fi  % stem and bulb
penlabels(0,1,2,3,4); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{'}
%    The ' character.
%    \begin{macrocode}

cmchar "Apostrophe";
beginchar("'",5u#,asc_height#,0);
italcorr asc_height#*slant+.5dot_size#-2u#;
adjust_fit(0,0);
x1-.5dot_size=hround(.5w-.5dot_size); y1+.5dot_size=h;
if monospace: comma(1,a,dot_size,.28u,vround 1.5comma_depth);  % large comma
else: comma(1,a,dot_size,.25u,comma_depth); fi  % comma with increased jut
penlabels(1); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{(}
%    The ( character.
%    \begin{macrocode}

cmchar "Left parenthesis";
beginchar("(",7u# if monospace: -u# fi,body_height#,paren_depth#);
italcorr body_height#*slant-.5u#;
adjust_fit(0,0); pickup fine.nib;
pos1(vair,0); pos2(.75[hair,stem],0); pos3(vair,0);
rt x1r=rt x3r=hround(w-u); lft x2l=hround(x1-4u if monospace: +4/3u fi);
top y1=h; y2=.5[y1,y3]=math_axis;
filldraw stroke z1e{3(x2e-x1e),y2-y1}...z2e
 ...{3(x3e-x2e),y3-y2}z3e;  % arc
penlabels(1,2,3); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{)}
%    The ) character.
%    \begin{macrocode}

cmchar "Right parenthesis";
beginchar(")",7u# if monospace: -u# fi,body_height#,paren_depth#);
italcorr math_axis#*slant-.5u#;
adjust_fit(0,0); pickup fine.nib;
pos1(vair,0); pos2(.75[hair,stem],0); pos3(vair,0);
lft x1l=lft x3l=hround u; rt x2r=hround(x1+4u if monospace: -4/3u fi);
top y1=h; y2=.5[y1,y3]=math_axis;
filldraw stroke z1e{3(x2e-x1e),y2-y1}...z2e
 ...{3(x3e-x2e),y3-y2}z3e;  % arc
penlabels(1,2,3); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{,}
%    The , character.
%    \begin{macrocode}

cmchar "Comma";
numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
define_whole_blacker_pixels(dot_diam);
beginchar(",",5u#,dot_diam#,comma_depth#);
adjust_fit(0,0);
x1-.5dot_diam=hround(.5w-.5dot_diam); y1-.5dot_diam=0;
comma(1,a,dot_diam,.2u,comma_depth);  % dot and tail
penlabels(1); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{.}
%    The . character.
%    \begin{macrocode}

cmchar "Period";
numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
define_whole_blacker_pixels(dot_diam);
beginchar(".",5u#,dot_diam#,0);
adjust_fit(0,0); pickup fine.nib;
pos1(dot_diam,0); pos2(dot_diam,90);
lft x1l=hround(.5w-.5dot_diam); bot y2l=0; z1=z2; dot(1,2);  % dot
penlabels(1,2); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{/}
%    The / character.
%    \begin{macrocode}

cmchar "Virgule (slash)";
beginchar("/",9u#,body_height#,paren_depth#);
italcorr body_height#*slant-.5u#;
adjust_fit(0,0); pickup rule.nib;
rt x1=hround(w-u)+eps; top y1=h+eps;
lft x2=hround u-eps; bot y2=-d-eps;
draw z1--z2;  % diagonal
penlabels(1,2); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{:}
%    The : character.
%    \begin{macrocode}

cmchar "Colon";
numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
define_whole_blacker_pixels(dot_diam);
beginchar(":",5u#,x_height#,0);
italcorr x_height#*slant+.5dot_diam#-2u#;
adjust_fit(0,0); pickup fine.nib;
pos1(dot_diam,0); pos2(dot_diam,90);
lft x1l=hround(.5w-.5dot_diam); top y2r=h; z1=z2; dot(1,2);  % upper dot
pos3(dot_diam,0); pos4(dot_diam,90);
x3=x1; bot y4l=0; z3=z4; dot(3,4);  % lower dot
penlabels(1,2,3,4); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{;}
%    The ; character.
%    \begin{macrocode}

cmchar "Semicolon";
numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
define_whole_blacker_pixels(dot_diam);
beginchar(";",5u#,x_height#,comma_depth#);
italcorr x_height#*slant+.5dot_diam#-2u#;
adjust_fit(0,0); pickup fine.nib;
pos1(dot_diam,0); pos2(dot_diam,90);
lft x1l=hround(.5w-.5dot_diam); top y2r=h; z1=z2; dot(1,2);  % upper dot
x3-.5dot_diam=hround(.5w-.5dot_diam); y3-.5dot_diam=0;
comma(3,a,dot_diam,.05u,comma_depth);  % lower dot and tail
penlabels(1,2,3); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{[}
%    The [ character.
%    \begin{macrocode}

cmchar "Left bracket";
numeric wd#; wd#=max(5u#,4.5u#+.5if hefty:stem# else:rule_thickness# fi);
beginchar("[",wd#,body_height#,paren_depth#);
italcorr body_height#*slant;
adjust_fit(0,0);
numeric top_thickness,side_thickness;
if hefty: top_thickness=vair;
 side_thickness=max(crisp.breadth,stem-2stem_corr);
else: top_thickness=side_thickness=rule_thickness; fi;
pickup crisp.nib; pos1(side_thickness,0); pos2(side_thickness,0);
top y1=h; bot y2=-d; lft x1l=lft x2l=hround(2.5u-.5side_thickness)-1-eps;
filldraw stroke z1e--z2e;  % stem
pos3(top_thickness,90); pos4(top_thickness,90);
pos5(top_thickness,90); pos6(top_thickness,90);
x3=x5=x1l; rt x4=rt x6=ceiling(w-.4u)+eps; y3r=y4r=y1; y5l=y6l=y2;
filldraw stroke z3e--z4e;  % upper bar
filldraw stroke z5e--z6e;  % lower bar
penlabels(1,2,3,4,5,6); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{]}
%    The ] character.
%    \begin{macrocode}

cmchar "Right bracket";
numeric wd#; wd#=max(5u#,4.5u#+.5if hefty:stem# else:rule_thickness# fi);
beginchar("]",wd#,body_height#,paren_depth#);
italcorr body_height#*slant-2u#+.5if hefty:stem# else:rule_thickness# fi;
adjust_fit(0,0);
numeric top_thickness,side_thickness;
if hefty: top_thickness=vair;
 side_thickness=max(crisp.breadth,stem-2stem_corr);
else: top_thickness=side_thickness=rule_thickness; fi;
pickup crisp.nib; pos1(side_thickness,0); pos2(side_thickness,0);
top y1=h; bot y2=-d; rt x1r=rt x2r=hround(w-2.5u+.5side_thickness)+1+eps;
filldraw stroke z1e--z2e;  % stem
pos3(top_thickness,90); pos4(top_thickness,90);
pos5(top_thickness,90); pos6(top_thickness,90);
x3=x5=x1r; lft x4=lft x6=floor .4u-eps; y3r=y4r=y1; y5l=y6l=y2;
filldraw stroke z3e--z4e;  % upper bar
filldraw stroke z5e--z6e;  % lower bar
penlabels(1,2,3,4,5,6); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{`}
%    The ` character.
%    \begin{macrocode}

cmchar "Reverse apostrophe";
beginchar("`",5u#,asc_height#,0);
italcorr asc_height#*slant+.5dot_size#-2u#;
adjust_fit(0,0);
x1-.5dot_size=hround(.5w-.5dot_size); y1+.5dot_size=h-comma_depth;
if monospace: ammoc(1,a,dot_size,.28u,vround 1.5comma_depth);  % large ammoc
else: ammoc(1,a,dot_size,.25u,comma_depth); fi  % normal ammoc
penlabels(1); endchar;


%&lt;/punct&gt;
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{The ligatures and dashes file}
%
%    This is essentially a copy of the Computer Modern   file.
%    \begin{macrocode}
%&lt;*lig&gt;
% TRJNLIG.MF This file defines characters common to 
%            Trajan roman and slanted text fonts
%            that appear only when |ligs&gt;0|.

%    \end{macrocode}
%  First the ligtables.
%    \begin{macrocode}

ligtable "`": "`"=:oct"134";
ligtable "'": "'"=:oct"042", "?" kern 2u#, "!" kern 2u#;

ligtable "-": "-"=:oct"173";
ligtable oct"173": "-"=:oct"174";

%    \end{macrocode}
%
% \begin{macro}{''}
%   The '' ligature.
%    \begin{macrocode}

cmchar "Closing quotes";
beginchar(oct"042",7u#+max(2u#,dot_size#),asc_height#,0);
italcorr asc_height#*slant+dot_size#-4.1u#;
adjust_fit(0,0);
x1-.5dot_size=hround .6u; y2+.5dot_size=h;
x2-x1=hround(1.5u+max(2u,dot_size)); y2=y1;
comma(1,a,dot_size,.25u,comma_depth); % left dot and tail
comma(2,b,dot_size,.25u,comma_depth); % right dot and tail
penlabels(1,2); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{-}
%   The - character.
%    \begin{macrocode}

cmchar "Hyphen";
beginchar("-",6u#,x_height#,0);
italcorr .5x_height#*slant-.5u#;
adjust_fit(0,0);
numeric thickness; thickness=if hefty:bar else:.75[hair,stem] fi;
pickup crisp.nib; pos1(thickness,90); pos2(thickness,90);
top y1r=top y2r=vround(.5h+.5thickness); rt x2=hround(w-u)+eps;
if monospace: x2=w-x1 else: lft x1=hround .2u-eps fi;
filldraw stroke z1e--z2e;  % bar
penlabels(1,2); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{``}
%   The `` ligature.
%    \begin{macrocode}

cmchar "Opening quotes";
beginchar(oct"134",7u#+max(2u#,dot_size#),asc_height#,0);
italcorr asc_height#*slant-.1u#;
adjust_fit(0,0);
x2+.5dot_size=hround(w-.6u); y1+.5dot_size=h-comma_depth;
x2-x1=hround(1.5u+max(2u,dot_size)); y2=y1;
ammoc(1,a,dot_size,.25u,comma_depth); % left dot and tail
ammoc(2,b,dot_size,.25u,comma_depth); % right dot and tail
penlabels(1,2); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{--}
%   The -- ligature. I think that the CM en-dash is too thin for the 
% Trajan font, so I have thickened it a little.
%    \begin{macrocode}

cmchar "En dash";
beginchar(oct"173",9u#,x_height#,0);
italcorr .61803x_height#*slant+.5u#;
adjust_fit(0,0);
%%pickup crisp.nib; pos1(vair,90); pos2(vair,90);
pickup crisp.nib; pos1(medium,90); pos2(medium,90);
top y1r=top y2r=vround(.61803h+.5vair); lft x1=-eps; rt x2=w+eps;
filldraw stroke z1e--z2e;  % bar
penlabels(1,2); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{---}
%   The --- ligature. I think that the CM em-dash is too thin for the 
% Trajan font, so I have thickened it a little.
%    \begin{macrocode}

cmchar "Em dash";
beginchar(oct"174",18u#,x_height#,0);
italcorr .61803x_height#*slant+.5u#;
adjust_fit(letter_fit#,letter_fit#);
%%pickup crisp.nib; pos1(vair,90); pos2(vair,90);
pickup crisp.nib; pos1(medium,90); pos2(medium,90);
top y1r=top y2r=vround(.61803h+.5vair); lft x1=-eps; rt x2=w+eps;
filldraw stroke z1e--z2e;  % bar
penlabels(1,2); endchar;


%&lt;/lig&gt;
%    \end{macrocode}
% \end{macro}
%
% \subsection{Extra punctuation}
%
% This is an abbreviated copy of \Lpack{romanp.mf}.
%    \begin{macrocode}
%&lt;*xp&gt;
% TRJNROMANP.MF This file contains `\&amp;' and `?' .

%    \end{macrocode}
%
% \begin{macro}{&amp;}
%    The \&amp;{} character.
%    \begin{macrocode}

cmchar "Ampersand";
beginchar("&amp;",14u#,asc_height#,0);
italcorr x_height#*slant-serif_fit# - if serifs: .4u# else: 1.5u# fi;
adjust_fit(0,serif_fit#);
pickup tiny.nib; pos2(slab,-90); x2=4u; bot y2r=-o;
if not hefty:(x,y2l)=whatever[z2r,(w-5u,x_height)]; x2l:=x; fi
if serifs: pos0(fudged.hair,0);
 rt x0r+jut=hround(w-.9u); top y0=x_height;
 pos1(fudged.hair,0); z1=whatever[z0,(.6[x0,x2],0)];
 y1=max(y0-1.5bracket-.2x_height,2/3x_height);
 filldraw stroke z0e---z1e...{left}z2e;  % short diagonal
else: pickup fine.nib; pos1(.25[slab,flare],-15); rt x1r=hround(w-2u);
 y1r=good.y .75[bar_height,x_height]; x1l:=good.x x1l; y1l:=good.y y1l;
 top z2'l=(x2l,tiny.top y2l); bot z2'r=(x2r,tiny.bot y2r);
 filldraw stroke term.e(2',1,right,1,4); fi  % short diagonal and terminal
pickup tiny.nib; numeric slope,theta,reduced_hair;
slope=(h-2vair-slab)/10.5u; theta=angle(-slope,1);
reduced_hair=max(tiny.breadth,hround(fudged.hair if hefty:-2stem_corr fi));
lft x3r=hround .75u; x5=.5[x3r,x6l]; lft x6r=hround .5(w-u);
x3l-x3r=curve-tiny; pos6(reduced_hair,180);
pos5(vair,theta); y5=.5h;
ellipse_set(2l,3l,4l,5l); ellipse_set(2r,3r,4r,5r);
pos7(vair,270); top y7l=h+o; x7=.45[x6r,x8r];
pos8(fudged.stem,30); x8l=good.x(x8l+3.5u-x8); y8r=y6;
ellipse_set(7l,6l,5',5l);
filldraw stroke z2e{left}...z3e{up}...z4e---z5e...{up}z6e
 ...z7e{left}...z8e{down};  % bowls
pos10(slab,90); x10=w-3.5u; bot y10l=-o;
pos9(fudged.stem,angle(z8-z10)-90);
z9=.5[z8,z10]+(1.75u,0) rotated(angle(z8-z10)+90);
filldraw stroke z8e{down}...z9e{z10-z8}...{right}z10e;  % long diagonal
if serifs: pickup crisp.nib; pos10'(slab,90); z10'=z10;
 pos11(fudged.hair,180); rt x11l=hround(w-u); y11=.5bar_height;
 filldraw stroke z10'e{right}...{up}z11e;  % terminal
 numeric inner_jut; if rt x6l+.5u&lt;lft x0l-1.5jut: inner_jut=1.5jut;
 else: rt x6l+.5u=lft x0l-inner_jut; fi
 dish_serif(0,1,a,.6,inner_jut,b,.5,jut)(dark);  % serif
else: pickup fine.nib; pos10'(slab,90); z10'=z10;
 pos11(Vround .5[slab,flare],90);
 rt x11=hround(r-letter_fit-u); bot y11l=vround .07bar_height-o;
 filldraw stroke term.e(10',11,right,1,4); fi  % terminal
penlabels(0,1,2,3,4,5,6,7,8,9,10,11); endchar;

%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{?}
%    The ? character. I have changed this slightly because of the 
% of the redefinition of the |pulled_super_arc| macro.
%    \begin{macrocode}

cmchar "Question mark";
beginchar("?",8.5u#,asc_height#,0);
italcorr .8asc_height#*slant;
adjust_fit(0,0);
pickup tiny.nib; pos7(dot_size,0); pos8(dot_size,90);
lft x7l=hround(.5w-.25u-.5dot_size); bot y8l=0; z7=z8; dot(7,8);  % dot
numeric bot_width;
bot_width=if hefty:max(hround .8dot_size,fine.breadth) else: hair fi;
pickup fine.nib; pos2(vair,90); pos3(curve,0);
pos4(vair,-90); pos5(bot_width,0); pos6(bot_width,0);
x2=x4=x5=x6=x7; rt x3r=hround(w-u); bot y6=1+.25[top y8r,x_height];
top y2r=h+oo; y3=.75[y6,y2]; y4=.5[y6,y2]; y5=.1[y6,y2];
{{interim superness:=more_super;
%%filldraw stroke pulled_super_arc.e(2,3)(superpull) % macro changed in cpctitle.mf
filldraw stroke pulled_super_arc.e(2,3,eta)
 &amp; subpath (0,1) of super_arc.e(3,4) .. z5e---z6e\\}};  % arc and stem
if serifs: pos1(hair,180); pos0(flare,180);
 lft x1r=hround u; y1=y3; bulb(2,1,0);  % bulb
else: 
 pos1(Vround 5/7[vair,flare],110);
 lft x1r=hround u; top y1r=vround .9[y6,top y2r];
 filldraw stroke term.e(2,1,left,1,4);
fi  % terminal
penlabels(0,1,2,3,4,5,6,7,8); endchar;


%&lt;/xp&gt;
%    \end{macrocode}
% \end{macro}
%
% \section{The font definition files} \label{sec:fd}
%
%    \begin{macrocode}
%&lt;*fdot1&gt;
\DeclareFontFamily{OT1}{trjn}{}
  \DeclareFontShape{OT1}{trjn}{m}{n}{ &lt;-&gt; trjnr10 }{}
  \DeclareFontShape{OT1}{trjn}{bx}{n}{ &lt;-&gt; sub * trjn/m/n }{}
  \DeclareFontShape{OT1}{trjn}{b}{n}{ &lt;-&gt; sub * trjn/m/n }{}
  \DeclareFontShape{OT1}{trjn}{m}{sl}{ &lt;-&gt; trjnsl10 }{}
  \DeclareFontShape{OT1}{trjn}{m}{it}{ &lt;-&gt; sub * trjn/m/sl }{}
%&lt;/fdot1&gt;
%    \end{macrocode}
%
%
%    \begin{macrocode}
%&lt;*fdt1&gt;
\DeclareFontFamily{T1}{trjn}{}
  \DeclareFontShape{T1}{trjn}{m}{n}{ &lt;-&gt; trjnr10 }{}
  \DeclareFontShape{T1}{trjn}{bx}{n}{ &lt;-&gt; sub * trjn/m/n }{}
  \DeclareFontShape{T1}{trjn}{b}{n}{ &lt;-&gt; sub * trjn/m/n }{}
  \DeclareFontShape{T1}{trjn}{m}{sl}{ &lt;-&gt; trjnsl10 }{}
  \DeclareFontShape{T1}{trjn}{m}{it}{ &lt;-&gt; sub * trjn/m/sl }{}
%&lt;/fdt1&gt;
%    \end{macrocode}
%
% \section{The \Lpack{trajan} package code} \label{sec:code}
%
%    Announce the name and version of the package, which requires
% \LaTeXe{}.
%    \begin{macrocode}
%&lt;*usc&gt;
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{trajan}[2005/06/29 v1.1 package for Trajan fonts]
%    \end{macrocode}
%
%
% \begin{macro}{\trjnfamily}
%    Selects the Trajan font family in the T1 encoding.
% \changes{v1.1}{2005/06/29}{Use T1 encoding instead of OT1}
%    \begin{macrocode}
\newcommand{\trjnfamily}{\usefont{T1}{trjn}{m}{n}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\texttrjn}
%    Text command for the Trajan font family.
%    \begin{macrocode}
\DeclareTextFontCommand{\texttrjn}{\trjnfamily}
%    \end{macrocode}
% \end{macro}
%
%    The end of this package.
%    \begin{macrocode}
%&lt;/usc&gt;
%    \end{macrocode}
%
% \section{The map file}
%
%  Just a short file.
% \changes{v1.1}{2005/06/29}{Added the map file}
%    \begin{macrocode}
%&lt;*map&gt;
trjnr10      Trajan-Roman      &lt;trjnr10.pfb
trjnsl10     Trajan-Slanted    &lt;trjnsl10.pfb
%&lt;/map&gt;
%    \end{macrocode}
%
%
%
%
% \Finale
%
\endinput

%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&amp;
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \&lt;
%%   Equals        \=     Greater than  \&gt;     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}


</pre></body></html>