summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/zztex/zzfont.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/plain/zztex/zzfont.tex')
-rw-r--r--Master/texmf-dist/tex/plain/zztex/zzfont.tex453
1 files changed, 453 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/plain/zztex/zzfont.tex b/Master/texmf-dist/tex/plain/zztex/zzfont.tex
new file mode 100644
index 00000000000..f2b15f37752
--- /dev/null
+++ b/Master/texmf-dist/tex/plain/zztex/zzfont.tex
@@ -0,0 +1,453 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Font Facilities
+%
+% Synopsis: This module contains all the macros necessary to define type
+% sizes, styles, and fonts.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 28 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Baselines & Struts
+% --------- - ------
+
+
+\zremovePlaindef \strutbox
+\definebox{\strutbox} % Strut for current type size.
+
+\def \strut {%
+ \relax
+ \if \mathmodep
+ \copy \strutbox
+ \else
+ \unhcopy \strutbox
+ \fi}
+
+\def \normalbaselines {%
+ \baselineskip = \the\baselinemultiplier\normalbaselineskip
+ \lineskiplimit = \normallineskiplimit
+ \lineskip = \normallineskip}
+
+% Type Style & Size Definition
+% ---- ----- - ---- ----------
+
+
+% The following character set encodings are available. Odd numbers
+% indicate italic; numbers > 20 indicate monospaced.
+
+\chardef \encoderoman = 0 % Roman. %^encoding
+\chardef \encodeitalic = 1 % Italic. %^encoding
+\chardef \encodemathitalic = 3 % Math italic. %^encoding
+\chardef \encodemathsymbol = 4 % Math symbols. %^encoding
+\chardef \encodemathextended = 6 % Math extended symbols. %^encoding
+\chardef \encodematharrow = 8 % Math arrows. %^encoding
+\chardef \encodeother = 10 % Generic. %^encoding
+\chardef \encodemono = 22 % Monospaced. %^encoding
+\chardef \encodemonoitalic = 23 % Monospaced italic. %^encoding
+
+\setlist \zfsizelist = {}
+\setlist \zfstylelist = {}
+
+
+\def \definetypestyle #1#2{% {\name}{\encoding}
+ \append{#1}{\zfstylelist}%
+ \zfwithfam{\zdeffam}{#1}%
+ \zfwithmat{\def}{#1}{\zfl}{}%
+ \zfwithmat{\xdef}{#1}{\zen}{#2}}
+
+\def \definetypesize #1#2{% {\name}{size/baseline}
+ \append{#1}{\zfsizelist}%
+ \zdefsize #1#2/%
+ \zdefstrut #1#2/%
+ \zfbldsize{#1}}
+
+\def \zdefsize #1#2/#3/{% \name size/baseline/
+ \zfwithmat{\xdef}{#1}{\zsz}{#2pt}}
+
+\def \zdefstrut #1#2/#3/{% \name size/baseline/
+ {\calculate \tdimena = {#3pt,P,70}%
+ \tdimenb = #3pt\relax
+ \advance \tdimenb by -\tdimena
+ \zfwithmat{\xdef}{#1}{\zst}{height \the\tdimena\space depth \the\tdimenb}}}
+
+
+% A few useful predicates.
+
+\def \typestylep #1{% {\style}
+ \xtokeqlp{\the\typestyle}{#1}}
+
+\def \italicencodingp {%
+ \oddp{\typeencoding}}
+
+\def \monoencodingp {%
+ \gtrp{\typeencoding}{20}}
+
+% Commands to set font parameters.
+
+\def \setstylefontparam #1#2#3{% {\style}{param}{value}
+ \zfwithmat\maplistlf {#1}{\zfl}{%
+ \zfsetfp{##1}{#2}{#3}}}
+
+\def \setstylehyphenchar #1#2{% {\style}{number}
+ \setstylefontparam{#1}{-2}{#2}}
+
+\def \setstyleskewchar #1#2{% {\style}{number}
+ \setstylefontparam{#1}{-1}{#2}}
+
+\def \zfsetfp #1#2#3{% {font}{param}{value}
+ \if \eqlp{#2}{-2}%
+ \hyphenchar #1=#3\relax
+ \else\if \eqlp{#2}{-1}%
+ \skewchar #1=#3\relax
+ \else
+ \fontdimen#2#1=#3\relax
+ \fi\fi}
+
+% Style Relations
+% ----- ---------
+
+
+\def \definestylerelation #1#2#3{% {\style}{\relation}{\style}
+ \zfwithmat{\gdef}{#1}{#2}{#3}%
+ \gdef #2{\bgroup \zfrelstyle{#2}%
+ \if \italicencodingp \aftergroup \/\fi
+ \let \znext}}
+
+\def \zfrelstyle #1{% {\relation}
+ \if \mathmodep
+ \ztoksa = \expandaftertwice{\zfmat\math#1}%
+ \expandafter\ifx \the\ztoksa\relax
+ \zfnorelstyle{math}{#1}%
+ \fi
+ \else
+ \ztoksa = \expandafterthrice{\expandafter\zfmat\the\typestyle#1}%
+ \expandafter\ifx \the\ztoksa\relax
+ \zfnorelstyle{\the\typestyle}{#1}%
+ \fi
+ \fi
+ \the\ztoksa}
+
+\def \zfnorelstyle #1#2{%
+ \error{norelstyle}
+ {The current `#1' style has no related style for `\string#2'}}
+
+% Font Definition
+% ---- ----------
+
+
+\setlist \ztfmlist = {}%
+
+
+\def \definefont #1#2{% {\name}{tfm at size}
+ \global\font #1 = #2\relax
+ \zregistertfm #2\zmark
+ \if \zcommonencoding
+ \if \andp{\dimposp{\fontdimen7#1}}{\dimlssp{\fontdimen7#1}{.1pt}}%
+ \fontdimen7#1 = \fontdimen2#1\relax % Unlock it.
+ \else\if \dimeqlp{\fontdimen7#1}{\fontdimen2#1}
+ \relax % Already unlocked.
+ \else
+ \error{lockedfont}{The TFM for font `#2' is locked}%
+ \fi\fi
+ \fi}
+
+\def \zregistertfm #1 #2\zmark{% tfm at size\zmark
+ \member{\ztfmreg}{#1}{\ztfmlist}%
+ \if \notp{\ztfmreg}\append{#1}{\ztfmlist}\fi}
+
+\def \fontinterwordspacing #1#2{% {font}{factor}
+ \fontdimen2#1= #2\fontdimen2#1%
+ \fontdimen3#1= #2\fontdimen3#1%
+ \fontdimen4#1= #2\fontdimen4#1%
+ \fontdimen7#1= #2\fontdimen7#1}
+
+% Font Selection
+% ---- ---------
+
+
+\definetoks{\typesizename} % Current type size name.
+\definedimen{\typesize}{0pt} % Current type size in points.
+\definetoks{\typestyle} % Current type style.
+\definecount{\typeencoding}{0} % Current type encoding.
+
+
+% Equal signs and by's have been omitted for the sake of efficiency.
+
+\def \setfont #1#2#3{% {\size}{\style}{\font}
+ \setfontmath{#1}{#2}{#3}{\nullfont}{\nullfont}}
+
+\def \setfontmath #1#2#3#4#5{% {\size}{\style}{\text}{\script}{\scriptscript}
+ \edef \zfam {\zffam{#2}}%
+ \zfwithmat{\xdef}{#1}{#2}{%
+ \textfont \zfam #3%
+ \scriptfont \zfam #4%
+ \scriptscriptfont \zfam #5%
+ \def \noexpand#2{%
+ \typestyle {\noexpand#2}%
+ \typeencoding \zfmat{#2}{\zen}%
+ #3%
+ \fam \zfam}}%
+ \zfbldsize{#1}%
+ \zfaddfont{#2}{#3}%
+ \zfaddfont{#2}{#4}%
+ \zfaddfont{#2}{#5}}
+
+\def \zfbldsize #1{% {\size}
+ {\gdef #1{}
+ \maplist{\zfaddstyle{#1}{##1}}{\zfstylelist}%
+ \ztoksa \expandafter{#1}%
+ \xdef #1{%
+ \typesizename {\noexpand#1}%
+ \typesize \zfmat{#1}{\zsz}%
+ \the\ztoksa
+ \setbox\strutbox \hbox{\vrule \zfmat{#1}{\zst} width 0pt}%
+ \normalbaselineskip \ht\strutbox
+ \advance \normalbaselineskip \dp\strutbox
+ \noexpand\normalbaselines
+ \typestyle {none}\nullfont \fam -1\relax}}}
+
+\def \zfaddstyle #1#2{% {\size}{\style}
+ \ztoksa \expandafter{#1}%
+ \ztoksb \expandaftertwice{\zfmat{#1}{#2}}%
+ \expandafter\ifx \the\ztoksb\relax
+ \xdef #1{\the\ztoksa
+ \noexpand\zclearfam{\zffam{#2}}%
+ \def \noexpand#2{\noexpand\zfundef{\noexpand#1}{\noexpand#2}}}%
+ \else
+ \xdef #1{\the\ztoksa \the\ztoksb}%
+ \fi}
+
+\def \zfaddfont #1#2{% {\style}{font}
+ \zfwithmat{\appendlf}{#1}{\zfl}{#2}}
+
+
+% This macro clears out a family so TeX can't set math in it.
+
+\def \zclearfam #1{% {family}
+ \textfont #1 \nullfont
+ \scriptfont #1 \nullfont
+ \scriptscriptfont #1 \nullfont}
+
+% This macro is called if the user selects a type style that has no font
+% in the current size.
+
+\def \zfundef #1#2{% {\size}{\style}
+ \error{nofontset}
+ {No font has been set for size `\string#1' style `\string#2'}}
+
+% Miscellaneous
+% -------------
+
+
+% The following definition allows the user to write:
+% \withfont{\bf Hi there}
+
+\let \withfont = \relax
+
+% This macro helps with defining math fonts.
+
+\def \definemathfonts #1#2#3#4#5#6{% {prefix}{rm-font}{mit}{msy}{mex}{size}
+ \edef \znext {%
+ \noexpand\definefont{\name{#1rm}}{#2 at #6}%
+ \noexpand\definefont{\name{#1mit}}{#3 at #6}%
+ \noexpand\definefont{\name{#1msy}}{#4 at #6}%
+ \noexpand\definefont{\name{#1mex}}{#5 at #6}}%
+ \znext}
+
+% This macro helps with setting math fonts.
+
+\def \setmathfonts #1#2#3#4{% {\size}{\text}{\script}{\scriptscript}
+ \edef \znext {%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\rm}%
+ {\name{#2rm}}{\name{#3rm}}{\name{#4rm}}%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\mit}%
+ {\name{#2mit}}{\name{#3mit}}{\name{#4mit}}%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\msy}%
+ {\name{#2msy}}{\name{#3msy}}{\name{#4msy}}%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\mex}%
+ {\name{#2mex}}{\name{#2mex}}{\name{#2mex}}}%
+ \znext}
+
+% Measuring Things
+% --------- ------
+
+
+\definebox{\zmeasbox}
+
+
+\def \measureascenderheight #1{% {\dimen}
+ \zsetmeasbox{bdfhijklt}%
+ #1 = \ht\zmeasbox}
+
+\def \measurecapheight #1{% {\dimen}
+ \zsetmeasbox{ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
+ #1 = \ht\zmeasbox}
+
+\def \measuredescenderdepth #1{% {\dimen}
+ \zsetmeasbox{gjpqy}%
+ #1 = \dp\zmeasbox}
+
+\def \measuredigitheight #1{% {\dimen}
+ \zsetmeasbox{0123456789}%
+ #1 = \ht\zmeasbox}
+
+\def \measuredigitwidth #1{% {\dimen}
+ \zsetmeasbox{0}%
+ #1 = \wd\zmeasbox}
+
+\def \measureemwidth #1{% {\dimen}
+ #1 = 1em}
+
+\def \measurespacewidth #1{% {\dimen}
+ #1 = \fontdimen2\font}
+
+\def \measurexheight #1{% {\dimen}
+ #1 = 1ex}
+
+\def \measuretextwidth #1#2{% {\dimen}{text}
+ \zsetmeasbox{#2}%
+ #1 = \wd\zmeasbox}
+
+\def \measuretextheight #1#2{% {\dimen}{text}
+ \zsetmeasbox{#2}%
+ #1 = \ht\zmeasbox}
+
+\def \measuretextdepth #1#2{% {\dimen}{text}
+ \zsetmeasbox{#2}%
+ #1 = \dp\zmeasbox}
+
+\def \zsetmeasbox #1{\setbox\zmeasbox = \hbox{#1}}
+
+\def \definewidthdimen #1#2{% {\dimen}{text}
+ \definedimen{#1}{0pt}%
+ \measuretextwidth{#1}{#2}}
+
+% Utilities
+% ---------
+
+
+\def \zfmat #1#2{% {\size}{\style}
+ \csname zf\expandafter\discardtok \string#1%
+ \expandafter\discardtok \string#2\endcsname}
+
+\def \zfwithmat #1#2#3{% {\command}{\size}{\style}
+ \expandafter#1\csname zf\expandafter\discardtok \string#2%
+ \expandafter\discardtok \string#3\endcsname}
+
+
+\def \zffam #1{% {\style}
+ \csname \expandafter\discardtok \string#1fam\endcsname}
+
+\def \zfwithfam #1#2{% {\command}{\style}
+ \expandafter#1\csname \expandafter\discardtok \string#2fam\endcsname}
+
+% Built-in Styles
+% -------- ------
+
+
+\zremovePlaindef \itfam
+\zremovePlaindef \bffam
+\zremovePlaindef \ttfam
+
+ % Family Name
+\definetypestyle{\rm}{\encoderoman} % 0 RoMan
+\definetypestyle{\mit}{\encodemathitalic} % 1 Math ITalic
+\definetypestyle{\msy}{\encodemathsymbol} % 2 Math SYmbol
+\definetypestyle{\mex}{\encodemathextended} % 3 Math EXtended symbol
+\definetypestyle{\cal}{\encoderoman} % 4 CALigraphic letters
+\definetypestyle{\bbb}{\encoderoman} % 5 BlackBoard Bold
+\definetypestyle{\it}{\encodeitalic} % 6 ITalic
+\definetypestyle{\bf}{\encoderoman} % 7 Bold Face
+\definetypestyle{\bi}{\encodeitalic} % 8 Bold Italic
+\definetypestyle{\tt}{\encodemono} % 9 monospaced (TypewriTer)
+
+% Note: style \math is reserved for math mode.
+
+\definestylerelation{\math}{\bbbold}{\bbb}
+\definestylerelation{\math}{\bold}{\bf}
+\definestylerelation{\rm}{\bold}{\bf}
+\definestylerelation{\it}{\bold}{\bi}
+\definestylerelation{\math}{\callig}{\cal}
+\definestylerelation{\rm}{\callig}{\cal}
+\definestylerelation{\rm}{\emph}{\it}
+\definestylerelation{\it}{\emph}{\rm}
+\definestylerelation{\bf}{\emph}{\bi}
+\definestylerelation{\bi}{\emph}{\bf}
+\definestylerelation{\math}{\fraktur}{\frk}
+\definestylerelation{\tt}{\meta}{\it}
+\definestylerelation{\math}{\roman}{\rm}
+\definestylerelation{\rm}{\roman}{\rm}
+\definestylerelation{\it}{\roman}{\rm}
+\definestylerelation{\bf}{\roman}{\rm}
+\definestylerelation{\tt}{\roman}{\rm}
+\definestylerelation{\rm}{\smallcaps}{\sc}
+
+% We do not define any sizes or fonts. They just take up memory.
+
+% Doodad Font
+% ------ ----
+
+
+\def \zrequiredoodad #1#2{% {\name}{size}
+ \if \undefinedp{\zfdoodad#2}%
+ \withname\definefont {\zfdoodad#2}{zztexorn at #2}%
+ \fi
+ \edef \znext {\let \noexpand#1\name{\zfdoodad#2}}%
+ \znext}
+
+% Font Style Summary
+% ---- ----- -------
+
+
+{\catcode`\_ = \catactive
+
+\gdef \zfontsummary #1{% {font-list?}
+ {\def _{\space}%
+ \writelog{}%
+ \writelog{Type Styles:}%
+ \writelog{}%
+ \writelog{Name_____Math Family}%
+ \writelog{----_____-----------}%
+ \maplist{\zfsone{##1}}{\zfstylelist}%
+ \if #1%
+ \writelog{}%
+ \maplist{\writelog{ZzTeX: Font used: ##1}}{\ztfmlist}%
+ \fi
+ \writelog{}}}
+
+\gdef \zfsone #1{%
+ \tcounta = \name{#1fam}%
+ \writelog{\string #1______%
+ \if \lssp{\tcounta}{10}%
+ _\number\tcounta
+ \else\if \lssp{\tcounta}{15}%
+ \number\tcounta
+ \else
+ ---%
+ \fi\fi}}
+
+}% \catcode
+
+% TFM List File
+% --- ---- ----
+
+
+\definewrite{\ztfmlistfile}
+
+
+\def \zopentfmlist {%
+ \if \zcommonencoding
+ \immediate\openout \ztfmlistfile = tfmlist.zzz\relax
+ \immediate\write \ztfmlistfile {\jobname}%
+ \fi}
+
+\def \zwritetfmlist {%
+ \if \zcommonencoding
+ \maplist{\immediate\write \ztfmlistfile {##1}}{\ztfmlist}%
+ \immediate\closeout \ztfmlistfile
+ \fi}