% \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. % % %<*driver> \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} % % % % \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 ()[]\&. % 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} %<*up|sl> % %%% TRJNR10.MF Computer Trajan Roman at 10 point design size. % %%% 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 %font_identifier:="TRJNR"; font_size 10pt#; %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} %slant:=0; % tilt ratio $(\Delta x/\Delta y)$ %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 % % \end{macrocode} % % % \subsection{The driver file} % % To a large extent the driver file is based on Alan Hoenig's % \Lpack{dtitle.mf}. % % % \begin{macrocode} %<*mfd> % 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<>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 > 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$$>=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$$>=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#<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.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 $>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 % \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} %<*maj> % TRJNROMANU.MF Program files for formal Computer Trajan fonts. % def checkthin= if thin-currentbreadth0; 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)&reverse pulled_arc.r(3,2)& pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&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)&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)&reverse pulled_arc.r(3,2)& pulled_arc.r(3,4)&reverse pulled_arc.r(1,4)&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)& 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>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; % % \end{macrocode} % \end{macro} % % \subsection{The punctuation file} % % This is essentially a copy of Knuth's Computer Modern Roman punctuation. % % \begin{macrocode} %<*punct> % 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; % % \end{macrocode} % \end{macro} % % % \subsection{The ligatures and dashes file} % % This is essentially a copy of the Computer Modern file. % \begin{macrocode} %<*lig> % TRJNLIG.MF This file defines characters common to % Trajan roman and slanted text fonts % that appear only when |ligs>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; % % \end{macrocode} % \end{macro} % % \subsection{Extra punctuation} % % This is an abbreviated copy of \Lpack{romanp.mf}. % \begin{macrocode} %<*xp> % TRJNROMANP.MF This file contains `\&' and `?' . % \end{macrocode} % % \begin{macro}{&} % The \&{} character. % \begin{macrocode} cmchar "Ampersand"; beginchar("&",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 % \end{macrocode} % \end{macro} % % \section{The font definition files} \label{sec:fd} % % \begin{macrocode} %<*fdot1> \DeclareFontFamily{OT1}{trjn}{} \DeclareFontShape{OT1}{trjn}{m}{n}{ <-> trjnr10 }{} \DeclareFontShape{OT1}{trjn}{bx}{n}{ <-> sub * trjn/m/n }{} \DeclareFontShape{OT1}{trjn}{b}{n}{ <-> sub * trjn/m/n }{} \DeclareFontShape{OT1}{trjn}{m}{sl}{ <-> trjnsl10 }{} \DeclareFontShape{OT1}{trjn}{m}{it}{ <-> sub * trjn/m/sl }{} % % \end{macrocode} % % % \begin{macrocode} %<*fdt1> \DeclareFontFamily{T1}{trjn}{} \DeclareFontShape{T1}{trjn}{m}{n}{ <-> trjnr10 }{} \DeclareFontShape{T1}{trjn}{bx}{n}{ <-> sub * trjn/m/n }{} \DeclareFontShape{T1}{trjn}{b}{n}{ <-> sub * trjn/m/n }{} \DeclareFontShape{T1}{trjn}{m}{sl}{ <-> trjnsl10 }{} \DeclareFontShape{T1}{trjn}{m}{it}{ <-> sub * trjn/m/sl }{} % % \end{macrocode} % % \section{The \Lpack{trajan} package code} \label{sec:code} % % Announce the name and version of the package, which requires % \LaTeXe{}. % \begin{macrocode} %<*usc> \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} % % \end{macrocode} % % \section{The map file} % % Just a short file. % \changes{v1.1}{2005/06/29}{Added the map file} % \begin{macrocode} %<*map> trjnr10 Trajan-Roman % \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 \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~}