
## Introduction

_However, we will not include a verbatim description, because some parts of that file are too boring, and because the actual macros have been "optimized" with respect to memory space and running time. D.E. Knuth about plain.tex format._

What follows is devoted to the details of the plain TeX format. This file serves two purposes:

1. As a documentation of the plain.tex format. Weaving and texing this document should produce a handy reference.
2. The division of this web source into 'chunks' should ease creation of other formats tailored to particular applications. Chunks could be easily modified, removed, added, or replaced.

The change file mechanism is not needed in case of TeX language. Change files are used to incorporate system dependent code into source file, but TeX code is already system independent. TeX code could be only 'format dependent' and here change files could be used. Another feature of format file is that it evolves with time, yet some intermediate versions are used for preparation of books, articles etc. All these versions and configurations must be kept well organized, otherwise you are lost. The Revision Control System is the tool that assists with these tasks. With the RCS it is possible, with small overhead, to preserve _all revisions_ which evolved from given text document, merge changes made by others, compare different versions, keep log of changes.

This document consists mainly of excerpts from the TeXBook, but it is organised around the macros as they appear in the plain.tex rather than around the topics as in a user manual. Therefore this document is not a _user manual_, although many definitions are contained here.


Thus '\' is already an escape character, '\char"20' is a space, and '%' is available for comments on the first line of the file; ASCII \(\null\) is ignored, ASCII \(\return\) is an end-of-line character, and ASCII \(\delete\) is invalid.

Furthermore \(\tab\) is given category space, \(\formfeed\) becomes an active character that will detect runaways on files that have been divided into "file pages" by \formfeed\ characters. Finally the control sequence \active is defined to yield the constant 13.

To re-catcode these special characters--not counting ASCII

--use the control sequence \dospecials that lists all the characters whose catcodes should probably be changed to 12 (other) when copying things verbatim. Each symbol in the list is preceded by \do, which can be defined if you want to do something to every item in the list.

\(\(\)_Establish standard category code values\\()\equiv_

\catcode^\{=1

\catcode^\=2

\catcode^\$=3

\catcode^\&=4

\catcode^\#=6

\catcode^\^=7 \catcode^\~~K=7 % uparrow is for superscripts

\catcode^\_=8 \catcode^\~~A=8 % downarrow are for subscripts

\catcode^\~~I=10

\chardef\active=13 \catcode^\^=\active % tilde is active

\catcode^\~~L=\active \outer\def~~L{\par} % ascii form-feed is "\outer\par"

\def\dospecials{\do\ \do\}\do\do\}do\&\do\&\do\&\%

\do\#\do\^\do\~~K\do\_\do\~~Ado\%\do\^\}

To make the plain macros more efficient in time and space, several constant values are declared as control sequences. _If they were changed, anything could happen._ So be careful!

\(\(\)_Define commonly used constants\()\equiv_

\chardef\@ne=1

\chardef\tw@=2

\chardef\thr@@=3

\chardef\sixt@@n=16

\chardef\cclv=255

\mathchardef\@cclvi=256

\mathchardef\@m=1000

\mathchardef\@M=10000

\mathchardef\@M=20000plain.tw

### Text fonts

\(\langle\)**Set up text fonts**\(\rangle\)\(\equiv\)

\(\langle\)**Provide support for font scaling**\(\rangle\)

\(\langle\)**Define text fonts**\(\rangle\)

\(\langle\)**Encode special characters, and characters not available on the keyboard**\(\rangle\)

\(\langle\)**Provide support for accented characters**\(\rangle\)

\(\langle\)**Assign uppercase and lowercase code values**\(\rangle\)

\(\langle\)**Assign space factor codes**\(\rangle\)

Fonts assigned to \preloaded are not part of the format, but they are preloaded so that other format packages can use them. For example, if another set of macros says \font\ninerm=cmr9, \TEXT will not have to reload the font metric information for cmr9.

\(\langle\)**Define text fonts**\(\rangle\)\(\equiv\)

\(\langle\)font\ntern=cmr10 % roman text

\(\langle\)font\preloaded=cmr9

\(\langle\)font\preloaded=cmr8

\(\langle\)font\sevenrm=cmr7

\(\langle\)font\preloaded=cmr6

\(\langle\)font\niverm=cmr5

\(\langle\)font\npleaded=cmss10 % sans serif

\(\langle\)font\preloaded=cmssq8

\(\langle\)font\preloaded=cmssi10 % sans serif italic

\(\langle\)font\preloaded=cmssqi8

\(\langle\)font\nleft=cmbx10 % boldface extended

\(\langle\)font\preloaded=cmbx9

\(\langle\)font\preloaded=cmbx8

\(\langle\)font\nsevenbf=cmbx7

\(\langle\)font\npleaded=cmbx6

\(\langle\)font\n\left=cmbt10 % typewriter

\(\langle\)font\npleaded=cmtt9

\(\langle\)font\npleaded=cmtt8

\(\langle\)font\npleaded=cmlt10 % slanted typewriter

\(\langle\)font\npleaded=cmsl9

\(\langle\)font\npleaded=cmts18

\(\langle\)font\npleaded=cmti10 % text italic

\(\langle\)font\npleaded=cmti9

\(\langle\)font\npleaded=cmti8

\(\langle\)font\npleaded=cmti7

\(\langle\)font\npleaded=cmu10 % unslanted text italicplain.tw
63{font}preloaded=cmcsc10%capsandsmallcaps
64{font}preloaded=cmssbx10%sansserifboldextended
65{font}preloaded=cmdunh10%Dunhillstyle
66{font}preloaded=cmr7scaled\magstep4%fortitles
67{font}preloaded=cmtt10scaled\magstep2
68{font}preloaded=cmssbx10scaled\magstep2
69{font}preloaded=manfnt%METAFONTlogoanddragoncurveandspecialsymbols
60Additional\preloadedfontscanbecspecifiedhere. (Andthosethatwere\preloadedabovecanbeeliminated.)
61{_Definetextfonts_}+=
62{let\preloaded=\undefined%preloadedfontsmustbecdeclaredanewlater.
63{_Providesupportforfontscaling_}\(\equiv\)
64{def\magstephalf{1095}
65{def\magsteph#1{ifcase#1\@m\or1200\or1440\or1728\or2074\or2488\f\rela\}
66{\dif\magification{afterassignment\m@g\count@}
67{def\m@g{\mag\count@}
68{hsize6.5truein\visize8.5truein\dimen\footins@truein}
69

#### Font encoding

We usually think of text files as containing characters. It doesn't cause any problems most of the time when we use plain ASCII characters--lettersA-Z, a-z, the numerals 0-9 and some of punctuation characters. This illusion is broken down when we start using characters that do not belong to this limited set, for example, accented characters / mathematical symbols. Then what we see on screen may not match what we key in. What gets printed may not match what we see on screen. Moreover, what gets shown on screen and what gets printed depends on what machine we are on and how the fonts that we are using are set up. In reality text files contain just numeric codes (in range 0-255) stored in 8-bit bytes, and the mapping between 'character' and numeric code is quite arbitrary. This is because there are very many more characters than the 256 numeric codes possible with 8-bits. Consequently, there will be a need for more than one possible mapping or 'font encoding', or in other words, there would not be a'standard' encoding that suits all purposes.

When a symbol is built up by forming a box, the \leavevmodemacroiscalledfirst; thisstarts a new paragraph, if TeXisinverticalmode,butdoesnothingifTeXisinhorizontalmodeormathmode.\chardefpositionsaretakenfromthefontscmr10andcmsy10.

61{_Encodespecialcharacters,andcharactersnotavailableonthekeyboard_}\(\equiv\)
60{\chardef\%='\%
61{\chardef\%='\%
62{\chardef\#='\#
63{\chardef\$='\$
64{\chardef\$ss="19}
65{\chardef\ae="1A}
66{\chardef\oe="1B}
67{\chardef\o="1C}


plain.tw

INITEX sets \uccode'\(x=`X\) and \uccode'\(X=`X\) for all letters \(x\), and \lccode'\(x=`x\), \lccode'\(X=`x\); all other values are zero.

\(\langle\)_Assign uppercase and lowercase code values_\(\rangle\)\(\equiv\)

%%%ThatsallforEnglishlanguage.

Space factor code affects setting of interword glue. The space factor is normally 1000, which means that the interword glue should not be modified. If the space factor \(f\) is different from 1000, the interword glue is computed as follows: Take the normal space glue for the current font, and add the extra space if \(f\geq 2000\). Then the stretch component is multiplied by \(f/1000\), while the shrink component is multiplied by \(1000/f\). (Look up the Appendix for the values of normal space, normal stretch, normal shrink, and extra space for some of CM fonts.)

INITEX sets space factor codes: \sfcode\(x=1000\) for all \(x\), except that \sfcode'\(X=999\) for uppercase letters.

The characters ')', '', and ']' does not change space factor.

\(\langle\)_Assign space factor codes_\(\rangle\)\(\equiv\)

134\(\backslash\)sfcode'\(\rangle\)=0 \(\backslash\)sfcode'\(\rangle\)=0 \(\backslash\)sfcode'\(\rangle\)=0

### Math fonts

\(\langle\)_Set up math fonts_\(\rangle\)\(\equiv\)

\(\langle\)_Define math fonts_\(\rangle\)

\(\langle\)_Encode math accents_\(\rangle\)

\(\langle\)_Establish spacing around mathematical objects_\(\rangle\)

\(\langle\)_Assign math codes_\(\rangle\)

\(\langle\)_Assign delimiter codes_\(\rangle\)

\(\langle\)_Define font families_\(\rangle\)

As was said earlier, the font metric information about preloaded font will be build into the format. But, if another set of macros says \(\backslash\)font\(\backslash\)fiftyfiverm = cmr9 at 55pt, TeX will _have to reload again_ the font metric information for cmr9.

\(\langle\)_Define math fonts_\(\rangle\)\(\equiv\)

135\(\backslash\)font\(\backslash\)teni=cmmi10 % math italic

136\(\backslash\)font\(\backslash\)preloaded=cmmi9

137\(\backslash\)font\(\backslash\)preloaded=cmmi8

138\(\backslash\)font\(\backslash\)seveni=cmmi7

139\(\backslash\)font\(\backslash\)preloaded=cmmi6

140\(\backslash\)font\(\backslash\)fivei=cmmi5

141
142\(\backslash\)font\(\backslash\)tenys=cmsy10 % math symbols

143\(\backslash\)font\(\backslash\)preloaded=cmsy9

144\(\backslash\)font\(\backslash\)preloaded=cmsy8

145\(\backslash\)font\(\backslash\)sevenys=cmsy7

146\(\backslash\)font\(\backslash\)preloaded=cmsy6

147\(\backslash\)font\(\backslash\)fivesy=cmsy5

148
149\(\backslash\)font\(\backslash\)tenex=cmex10 % math extension plain.tw
* %font\preloaded=cmmib10 % bold math italic
* %font\preloaded=cmbsy10 % bold math symbols

#### Mathematical spacing

Spacing around mathematical object is measured in mu--'math units.' 1mu is equal to 1/18 th part of %fontimen 6 of the font in family 2.

\quad spacing does not change with the style of formula, nor does it depend on the math font families that are being used. But thin spaces, medium spaces, and thick spaces do get bigger and smaller as the size of type gets bigger and smaller; this is because they are defined in terms of \(\langle\)muglue\(\rangle\).

According to these specifications, thin spaces in plain TeX do not stretch or shrink; medium spaces can stretch a little, and they can shrink to zero; thick spaces can stretch a lot, but they never shrink.

The following table gives the complete definition of muglue between mathematical objects. A formula is converted to a math list, and the math list consists chiefly of "atoms" of eight basic types: Ord (ordinary), Op (large operator), Bin (binary operation), Rel (relation), Open (opening), Close (closing), Punct (punctuation), and Inner (a delimited subformula). Other kinds of atoms, which arise from commands like \overline or \vmathaccent or \vcenter, etc., are all treated as type Ord; fractions are treated as type Inner. The following (non-symmetric) table is used to determine the spacing between pairs of adjacent atoms:

\begin{tabular}{l l|c c c c c c c}  & & & & & & _Right atom_ & & & \\  & Ord & Op & Bin & Rel & Open & Close & Punct & Inner \\ \cline{2-10} Ord & 0 & 1 & (2) & (3) & 0 & 0 & 0 & (1) \\ Op & 1 & 1 & * & (3) & 0 & 0 & 0 & (1) \\ Bin & (2) & (2) & * & * & (2) & * & * & (2) \\ _Left_ & Rel & (3) & (3) & * & 0 & (3) & 0 & 0 & (3) \\ _atom_ & Open & 0 & 0 & * & 0 & 0 & 0 & 0 & 0 \\ Close & 0 & 1 & (2) & (3) & 0 & 0 & 0 & (1) \\ Punct & (1) & (1) & * & (1) & (1) & (1) & (1) & (1) \\ Inner & (1) & 1 & (2) & (3) & (1) & 0 & (1) & (1) \\ \end{tabular}

Here 0, 1, 2, and 3 stand for no space, thin space, medium space, and thick space, respectively. Thin space, medium space, and thin space are equal to values of \thinmuskim, \medmuskip, \thickmuskip parameters, respectively. The table entry is parenthesized if the space is to be inserted only in display and text styles, not in script and scriptscript styles. For example, many of the entries in the Rel row and the Rel column are '(3)'; this means that thick spaces are normally inserted before and after relational symbols like '=', but not in subscripts. Some of the entries in the table are '*'; such cases never arise, because Bin atoms must be preceded and followed by atoms compatible with the nature of binary operations. The conversion of math lists to horizontal lists is done whenever TeX is about to leave math mode, and the inter-atomic spacing is inserted at that time.

\(\langle\)_Establish spacing around mathematical objects_\(\rangle\)\(\equiv\)
* \(\langle\)thinmuskip=3mu \(\langle\)medmuskip=4mu plus 2mu minus 4mu \(\langle\)thickmuskip=5mu plus 5mu



plain.tw
232 \newfam\tfam\def\it{\fam\iftam\tenit}%\itisfamily4
233 \textfont\tifam=\tenit
234 \newfam\sfam\def\sl{\fam\sfam\sfam\sfam\sfemsl}%\slisfamily5
235 \textfont\tsfam=\tensl
236 \newfam\bffam\def\bf{\fam\bffam\tenbf}%\bfisfamily6
237 \textfont\bffam=\tenbf\scriptfont\bffam=\sevenbf
238 \scriptscriptfont\bffam=\fivebf
239 \newfam\ttfam\def\tt{\fam\ttfam\tent}%\ttisfamily7
240 \textfont\ttftam=\tentt

### Registers allocation

Here are macros for the automatic allocation of \count, \box, \dimen, \skip, \muskip, and \toks registers, as well as \read and \write stream numbers, \fam codes, \language codes, and \insert numbers.

The main use of these macros is for registers that are defined by one macro and used by others, possibly at different nesting levels.

The following counters are reserved:

\begin{tabular}{l l}
0-9 & page numbering \\
10 & count allocation \\
11 & dimen allocation \\
12 & skip allocation \\
13 & muskip allocation \\
14 & box allocation \\
15 & toks allocation \\
16 & read file allocation \\
17 & write file allocation \\
18 & math family allocation \\
19 & language allocation \\
20 & insert allocation \\
21 & the most recently allocated number \\
22 & constant -1 \\ \end{tabular}

New counters are allocated starting with 23, 24, etc. Other registers are allocated starting with 10. This leaves 0 through 9 for the user to play with safely, except that counts 0 to 9 are considered to be the page and subpage numbers (since they are displayed during output). In this scheme, \count 10 always contains the number of the highest-numbered counter that has been allocated, \count 14 the highest-numbered box, etc. Inserts are given numbers 254, 253, etc., since they require a \count, \dimen, \skip, and \box all with the same number; \count 20 contains the lowest-numbered insert that has been allocated. \box255 is reserved for \output; \count255, \dimen255, and \skip25 can be used freely.

It is recommended that macro designers always use global assignments with respect to registers numbered 1, 3, 5, 7, 9, and always non-global assignments with respect to registers 0, 2, 4, 6, 8, 255. This will prevent "save stack buildup" that might otherwise occur.

\(\langle\)_Allocate registers_\(\rangle\)\(\equiv\)
241 \count10=22 % allocates \count registers 23, 24,...
242 \count11=9 % allocates \dimension registers 10, 11,...
243 \count12=9 % allocates \skip registers 10, 11,...
244 \count13=9 % allocates \maskip registers 10, 11,...
245 \count14=9 % allocates \box registers 10, 11,...

plain.tw
*count15=9%allocates\toksregisters10,11,...
*count16=-1%allocatesinputstreams0,1,...
*count17=-1%allocatesoutputstreams0,1,...
*count18=3%allocatesmathfamilies4,5,...
*count19=0%allocates\languagecodes1,2,...
*count20=255%allocatesinsertions254,253,...
*countdef\insc@unt=20%theinsertioncounter
*countdef\allocationnumber=21%themostrecentallocation
*countdef\m@ne=22m@ne=-1%ahandyconstant
*def\wlog{\immediate\write\m@ne}%writeonlogfile(only)
*(_Allocatescratchregisters_)
*(_Provideuser-levelregisterallocationmacros_)
*(_Defineimplementation-levelregisterallocationmacros_)
*(_Initializeregisterconstants_)

Here are abbreviations for the names of scratch registers that don't need to be allocated.

*(_Allocatescratchregisters_)\(\equiv\)
*countdef\count@=255
*dimended\dimen@=0
*dimended\dimen@i=1%globalonly
*dimended\dimen@ii=2
*skipdef\skip@=0
*toksdef\toks@=0

Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo and \foo will be defined (with \countdef) to be the next counter. To find out which counter \foo is, you can look at \allocationnumber. Since there's no \boxdef command, \chardef is used to define a \newbox, \newinsert, \newfam, and so on.

*(_Provideuser-levelregisterallocationmacros_)\(\equiv\)
*outer\def\newcount{\alloc@0\count\countdef\insc@unt}
*outer\def\newdiment{\alloc@1\dimen@dimended\insc@unt}
*outer\def\newskip{\alloc@2\skipskipdef\insc@unt}
*outer\def\newmusskip{\alloc@3\muskipmuskipdef\@cclvi}
*outer\def\newbox{\alloc@4\(\backslash\)box\(\backslash\)chardef\(\backslash\)inc@unt}
*let\newtoks=\relax%weodthistoallowplain.textobereadinttwice
*outer\def\newblockpH1#2{\newtoks#1\(\backslash\)expandafter{\(\backslash\)csname#2\(\backslash\)endcsname}}
*outer\def\newtoks{\(\backslash\)alloc@5\(\backslash\)toksdef\(\backslash\)@cclvi}
*outer\def\newread{\(\backslash\)alloc@6\(\backslash\)read\(\backslash\)chardef\(\backslash\)sixt@n}
*outer\def\newwrite{\(\backslash\)alloc@7\(\backslash\)write\(\backslash\)chardef\(\backslash\)sixt@@n}
*outer\def\newfam{\(\backslash\)alloc@8\(\backslash\)fam\(\backslash\)chardef\(\backslash\)sixt@n}
*outer\(\backslash\)def\(\backslash\)newlanguage{\(\backslash\)alloc@9\(\backslash\)language\(\backslash\)chardef\(\backslash\)@cclvi}

*(_Defineimplementation-levelregisterallocationmacros_)\(\equiv\)
*def\(\backslash\)alloc@#1#2#3#4#5{global\(\backslash\)advance\(\backslash\)counti#1by\(\backslash\)me
*ch@ck#1#4#2%makesurethere'sstillroom
*allocationnumber=\(\backslash\)count1#1%
*global#3#5=\(\backslash\)allocationnumber
*wlog{\(\backslash\)string#5=\(\backslash\)string#2\(\backslash\)allocationnumber}
*outer\(\backslash\)def\(\backslash\)newinsert#1{global\(\backslash\)advance\(\backslash\)inc@untby\(\backslash\)me
*ch@ck0\(\backslash\)inc@unt\(\backslash\)countplain.tw

\ch@ck1\insc@unt\dimen

\ch@ck2\insc@unt\skip

\ch@ck4\insc@unt\box

\allocationnumber=\insc@unt

\global\chardef#1=\allocationnumber

\wlog{\string#1=\string\insert\the\allocationnumber}

\def\ch@ck#1#2#3{\ifnum\count1#1<#2%

\else\errmessage[No room for a new #3}\fi]

We finish with the initialization of some constants.

\(\\_\)_Initialize register constants_\(\equiv\)

\newdimen\maxdimen\maxdimen=16383.99999pt % the largest legal <dimen>

\newskip\hideskip\hideskip-1000pt plus 1fill % negative but can grow

\newskip\centering\centering\centering=Opt plus 1000pt minus 1000pt minus 1000pt

\newdimen\p@ Up@=1pt % this saves macro space and time

\newdimen\z@ U\z@=Opt % can be used both for Opt and 0

\newskip\z@skip\z@skip\z@skip=Opt plusOpt minusOpt

\newbox\voidbx% permanently void box register

### Parameters

Let's turn now to TeX's parameters, which the previous chapters have introduced one at a time; it will be convenient to assemble them all together.

An \integer parameter) is one of the following tokens:

\pretolerance badness tolerance before hyphenation

\tolerance badness tolerance after hyphenation

\hbadness badness above which bad hboxes will be shown

\vbadness badness above which bad vboxes will be shown

\linepenalty amount added to badness of every line in a paragraph

\hyphenpenalty penalty for line break after discretionary hyphen

\explnphenalty penalty for line break after explicit hyphen

\binoppenalty penalty for line break after binary operation

\relpenalty penalty for line break after math relation

\clubbpenalty penalty for creating a club line at bottom of page

\widowpenalty penalty for creating a widow line at top of page

\displaywidowpenalty ditto, before a display

\brokenpenalty penalty for page break after a hyphenated line

\predisplaypenalty penalty for page break just before a display

\postdisplypenalty penalty for page break just after a display

\interlinepenalty additional penalty for page break between lines

\floatingpenalty penalty for insertions that are split

\outputpenalty penalty at the current page break

\doublehyphendemerits demerits for consecutive broken lines

\finalhyphendemerits demerits for a penultimate broken line

\adjdemerits demerits for adjacent incompatible lines

\looseness change to the number of lines in a paragraph

\pausing positive if pausing after each line is read from a file

\holdinginserts positive if insertions remain dormant in output box

\tracingonline positive if showing diagnostic info on the terminal

\tracingmacros positive if showing macros as they are expanded plain.tw  \tracingstats  positive if showing statistics about memory usage  \tracingparagraphs  positive if showing line-break calculations  \tracingpages  positive if showing page-break calculations  \tracingoutput  positive if showing boxes that are shipped out  \tracinglostchars  positive if showing characters not in the font  \tracingcommands  positive if showing commands before they are executed  \tracingrestores  positive if showing deassignments when groups end  \language  the current set of hyphenation rules  \uchyph  positive if hyphenating words beginning with capital letters  \lefthyphenmin  smallest fragment at beginning of hyphenated word  \righthyphenmin  smallest fragment at end of hyphenated word  \globaldefs  nonzero if overriding \global specifications  \defaulthyphenchar \hyphenchar value when a font is loaded  \defaultskewchar \skewchar value when a font is loaded  \escapechar  escape character in the output of control sequence tokens  \endlinechar  character placed at the right end of an input line  \newlinechar  character that starts a new output line  \maxdeadcycles  upper bound on \deadcycles  \hangafter  hanging indentation changes after this many lines  \fam  the current family number  \mag  magnification ratio, times 1000  \delimiterfactor  ratio for variable delimiters, times 1000  \time  current time of day in minutes since midnight  \day  current day of the month  \month  current month of the year  \year  current year of our Lord  \showboxbreadth  maximum items per level when boxes are shown  \showboxdepth  maximum level when boxes are shown  \errorcontextlines  maximum extra context shown when errors occur

The first few of these parameters have values in units of "badness" and "penalties" that affect line breaking and page breaking. Then come demerit-oriented parameters; demerits are essentially given in units of "badness squared," so those parameters tend to have larger values. By contrast, the next few parameters (\looseness, \pausing, etc.) generally have quite small values (either \(-1\) or \(0\) or \(2\)). Miscellaneous parameters complete the set.

A (dimen parameter) is one of the following:

\hfuzz  maximum overrun before overfull hbox messages occur  \vfuzz  maximum overrun before overfull vbox messages occur  \overfullrule  width of rules appended to overfull boxes  \emergencystretch  reduces badnesses on final pass of line-breaking  \hsize  line width in horizontal mode  \vsize  page height in vertical mode  \maxdepth  maximum depth of boxes on main pages  \splitmaxdepth  maximum depth of boxes on split pages  \boxmaxdepth  maximum depth of boxes on explicit pages  \lineskiplimit  threshold where \baselineskip changes to \lineskip  \delimitershortafall  maximum space not covered by a delimiter  \nulldelimiterspace  width of a null delimiter  \scriptspace  extra space after subscript or superscript  \mathsurround  kerning before and after math in text  \predisplaysize  length of text preceding a display  \displaywidth```
plain.tw \displayindentindentationoflinefordisplayedequation \parindentwidthof\indent \hangindentamountofhangindentation \hoffsethorizontaloffsetin\shipout \voffsetverticaloffsetin\shipout
```

Before typesetting a delimiterTeX determines the size \(f\) of the formula to be covered as twice the maximum of the height and the depth of the formula. The size \(d\) of the delimiter should be

\[\min\big{\{}f-\verb|%delimitershortfall,|\delimiterfactor|.\frac{f}{1000}\big{\}}\leq d\]

And the possibilities for \(\beta\) parameter) are:

\baselineskipdesiredgluebetweenbaselines \lineskipinterlineglueif\baselineskipisnt'feasible \parskipextragluejustaboveparagraphs \abovedisplayskipextragluejustabovedisplays \abovedisplayshortskipditto,followingshortlines \belowdisplayskipextragluejustbelowdisplays \bellowdisplayshortskipditto,followingshortlines \leftskipglueatleftofjustifiedlines \rightrightskipatrightofjustifiedlines \topskipglueattopofmainpages \splittopskipglueattopofsplitpages \tabskipgluebetweenalignedentries \spaceskipgluebetweenwords,ifnonzero \xspaceskipgluebetweensentences,ifnonzero \parfillskipadditional\rightskipatendofparagraphs ```
To above parameters (except \parfillskip) are assigned values appropriate for CM family typeset at 12 pt baseline.

Finally, there are three permissible \(\langle\)muglueparameter\(\rangle\) tokens:

\thinmuskipthinspaceinmathformulas \medmuskipmediumspaceinmathformulas \thickmuskipthickspaceinmathformulas
```

TeX also has parameters that are token lists. Such parameters do not enter into the definitions of \(\langle\)number\(\rangle\) and such things. A \(\langle\)token parameter\(\rangle\) is any of:

\outputtheuser'soutputroutine \everypartokenstoinsertwhenaparagraphbegins \everymathtokenstoinsertwhenmathintextbegins \everyldisplaytokenstoinsertwhendisplaymathbegins \everyboxtokenstoinsertwhenanhboxbegins \everyboxtokenstoinsertwhenavoboxbegins \everyjobtokenstoinsertwhenjobbegins \everycrtokenstoinsertafterevery\crornonredundant\crcrcrcrrelptokensthatsupplementan \errmessage

All of numeric parameters are listed below, but the code is commented out if no special value needs to be set. INITEX makes all parameters zero except where noted.

plain.tw

\(\langle\)_Assign initial values to parameters \(\rangle\)\(\equiv\)_

\(\langle\)_Assign values to integer parameters \(\rangle\)_

\(\langle\)_Assign values to dimen parameters \(\rangle\)_

\(\langle\)_Assign values to glue parameters \(\rangle\)_

\(\langle\)_Assign values to special registers \(\rangle\)_

\(\langle\)_Assign values to integer parameters \(\rangle\)\(\equiv\)_

\(\langle\)pretolerance=100

\(\backslash\)tolerance=200 % INITEX sets this to 10000

\(\backslash\)hbadness=1000

\(\backslash\)vbadness=1000

\(\backslash\)linepenalty=10

\(\backslash\)hyphenpenalty=50

\(\backslash\)exhyphenpenalty=50

\(\backslash\)binophenyl=700

\(\backslash\)relpenalty=500

\(\backslash\)clubpenalty=150

\(\backslash\)widowpenalty=150

\(\backslash\)displaywidowpenalty=50

\(\backslash\)brokenpenalty=100

\(\backslash\)predisplaypenalty=10000

\(\backslash\)postdisplaypenalty=0

\(\backslash\)interlinepenalty=0

\(\backslash\)floatingpenalty=0, set during \(\backslash\)insert

\(\backslash\)outputpenalty=0, set before TeX enters \(\backslash\)output

\(\backslash\)doublehyphendemerits=10000

\(\backslash\)finalhyphendemerits=5000

\(\backslash\)adjemerits=10000

\(\backslash\)looseness=0, cleared by TeX after each paragraph

\(\backslash\)guasing=0

\(\backslash\)holdinginserts=0

\(\backslash\)tracingonline=0

\(\backslash\)tracingmacros=0

\(\backslash\)tracingstats=0

\(\backslash\)tracingparagraphs=0

\(\backslash\)tracingpages=0

\(\backslash\)tracingoutput=0

\(\backslash\)tracinglostchars=1

\(\backslash\)tracingcommands=0

\(\backslash\)tracingrestores=0

\(\backslash\)language=0

\(\backslash\)uchyph=1

\(\backslash\)lefthyphenmin=2 \(\backslash\)righthyphenmin=3 set below

\(\backslash\)globaldefs=0

\(\backslash\)maxdeadcycles=25 % INITEX does this

\(\backslash\)hangafter=1 % INITEX does this, also TeX after each paragraph

\(\backslash\)fam=0

\(\backslash\)mag=1000 % INITEX does this

\(\backslash\)escapechar='\(\backslash\)% INITEX does this

\(\backslash\)defaulthyphenchar='\(\backslash\)-

\(\backslash\)defaultskewchar=-1

\(\backslash\)endlinechar='\(\backslash\)^M % INITEX does this plain.tw
341\newlinechar=-1
342\delimiterfactor=901
343%\time=now%TeXdoesthisatbeginningofjob
344%\day=now%TeXdoesthisatbeginningofjob
345%\month=now%TeXdoesthisatbeginningofjob
346%\year=now%TeXdoesthisatbeginningofjob
347\showboxbreadth=5
348\showboxdepth=3
349\errorcontextlines=5

\(\langle\)_Assignvaluestodimenparameters\(\rangle\)_\(\equiv\)
350\hfuzzy=0.1pt
351\vfuzz=0.1pt
352\overfullrule=5pt
353\hsize=6.5in
354\vsize=8.9in
355\maxdepth=4pt
356\splitmaxdepth=\maxdimen
357\boxmaxdepth=\maxdimen
358\%\lineskiplimit=Opt,changedby\normalbaselines
359\delimitershorftall=5pt
360\nulldelimiterspace=1.2pt
361\scriptspace=0.5pt
362\%\mathsurround=Opt
363\%\predisplaysize=Opt,setbeforeTeXenters$$
364\%\displaywidth=Opt,setbeforeTeXenters$$
365\%\displayindent=Opt,setbeforeTeXenters$$
366\parindent=2Opt
367\%\hangindent=Opt,zeroedbyTeXaftereachparagraph
368\%\hoffset=Opt
369\%\offset=Opt

\(\langle\)_Assignvaluestoglueparameters\(\rangle\)_\(\equiv\)
370\%\baselineskip=Opt,changedby\normalbaselines
371\%\lineskip=Opt,changedby\normalbaselines
372\parskip=Optplus1pt
373\abovedisplayskip=12ptplus3ptminus9pt
374\abovedisplayshortskip=Optplus3pt
375\belowdisplayskip=12ptplus3ptminus9pt
376\belowdisplayshortskip=7ptplus3ptminus4pt
377\%\leftskip=Opt
378\%\rightskip=Opt
379\ttopskip=1Opt
380\splittopskip=1Opt
381\%\tablespin=0pt
382\%\spaceskip=Opt
383\parfillskip=Opt plus1filplain.tw

We also define special registers that function like parameters:

\(\langle\)_Assign values to special registers_\(\rangle\)\(\equiv\)
385\(\langle\)newskip\(\rangle\)smallskipamount \(\backslash\)smallskipamount=3pt plus 1pt minus 1pt
386\(\langle\)newskip\(\rangle\)medskipamount \(\backslash\)medskipamount=6pt plus 2pt minus 2pt
387\(\langle\)newskip\(\rangle\)bigskipamount \(\backslash\)bigskipamount=12pt plus 4pt minus 4pt
388\(\langle\)newskip\(\rangle\)normalbaselineskip \(\backslash\)normalbaselineskip=12pt
389\(\langle\)newskip\(\rangle\)normallineskip \(\backslash\)normallineskip=1pt
390\(\langle\)newdimen\(\backslash\)normallineskiplimit \(\backslash\)normallineskiplimit=Opt
391\(\langle\)newdimen\(\backslash\)jot \(\backslash\)jot=3pt
392\(\langle\)newcount\(\backslash\)interdisplaylinepenalty \(\backslash\)interdisplaylinepenalty=100
393\(\langle\)newcount\(\backslash\)interfootnotelinepenalty \(\backslash\)interfootnotelinepenalty=100
394\(\backslash\)def\(\backslash\)normalbaselines{\(\backslash\)lineskip\(\backslash\)normallineskip
395\(\backslash\)baselineskip\(\backslash\)normalbaselineskip \(\backslash\)lineskiplimit\(\backslash\)normallineskiplimit\(\}\)

### Macros for text

Here we introduce macros that are used for basic formatting unrelated to mathematics.

\(\langle\)_Provide macros for text formatting_\(\rangle\)\(\equiv\)

\(\langle\)_Supply basic macros for text formatting_\(\rangle\)

\(\langle\)_Define space macros_\(\rangle\)

\(\langle\)_Supply various paragraph shapes_\(\rangle\)

\(\langle\)_Define sectioning macros_\(\rangle\)

\(\langle\)_Supply ragged setting_\(\rangle\)

\(\langle\)_Supply 'boxing' macros_\(\rangle\)

\(\langle\)_Supply strut_\(\rangle\)

\(\langle\)_Provide alignment macros_\(\rangle\)

\(\langle\)_Establish spacing after punctuation characters_\(\rangle\)

\(\langle\)_Supply various ways to fill space_\(\rangle\)

\(\langle\)_Define_\(\rangle\)showhyphens _macro_\(\rangle\)

\(\langle\)_Completing the job_\(\rangle\)

\(\backslash\)(tab) and \(\backslash\)(return) are defined so that they expand to \(\backslash\)(space); this helps to prevent confusion, since all three cases look identical when displayed on most computer terminals.

\(\langle\)_Supply basic macros for text formatting_\(\rangle\)\(\equiv\)

396\(\backslash\)def\(\backslash\)~M\(\backslash\) % control <return> = control <space>

397\(\backslash\)def\(\backslash\)~I\(\backslash\) % same for <tab>

The control sequences \endgraf and \endline are made equivalent to TeX's primitive \par and \cr operations, since it is often useful to redefine the meanings of \par and \cr themselves. Then come the definitions of \space (a blank space), \empty (a list of no tokens), and \null (an empty hbox).

\bgroup and \egroup are made to provide "implicit" grouping characters that turn out to be especially useful in macro definitions.

\(\langle\)_Supply basic macros for text formatting_\(\rangle\)\(\equiv\)

398\(\backslash\)let\(\backslash\)endgraf=\(\backslash\)par \(\backslash\)let\(\backslash\)endline=\(\backslash\)cr

399\(\backslash\)def\(\backslash\)space{ }






\(\langle\)**_Completing the job_\(\rangle\)\(\equiv\)
546\(\langle\)**_Oefine math space macros_\(\rangle\)

\(\langle\)**_Define Greek letters_\(\rangle\)

\(\langle\)**_Define math symbols_\(\rangle\)

\(\langle\)**_Encode large operators_\(\rangle\)

\(\langle\)**_Encode binary operations_\(\rangle\)

\(\langle\)**_Encode relations_\(\rangle\)

\(\langle\)**_Supply vertical and diagonal dots_\(\rangle\)

\(\langle\)**_Supply variable-width math accents_\(\rangle\)

\(\langle\)**_Supply extensible delimiters_\(\rangle\)

\(\langle\)**_Provide access to delimiters of various sizes_\(\rangle\)

\(\langle\)**_Supply common math functions_\(\rangle\)

\(\langle\)**_Provide_\(\rangle\)cases_and_\(\langle\)matrix_macros_\(\rangle\)

\(\langle\)**_Provide support to typeset displayed equations_\(\rangle\)

TeX does automatic spacing of math formulas so that they look right, and this is almost true. But occasionally you must give TeX some help. The number of possible math formulas is vast, and TeX's spacing rules are rather simple, so it is natural that exceptions should arise. The basic elements of space that TeX puts into formulas are called: thin spaces, medium spaces, thick spaces. The normal space between words of a paragraph is approximately equal to two thin spaces.

You can add your own spacing whenever you want to, by using the control sequences

\(\backslash\), thin space (normally 1/6 of a quad);

\(\backslash\), medium space (normally 2/9 of a quad);

\(\backslash\), thick space (normally 5/18 of a quad);

\(\backslash\), negative thin space (normally \(-1/6\) of a quad).


plain.tw

\(\(\)_Define math symbols\()\()\)\(\equiv\)

\(\backslash\)mathchardef\(\backslash\)aleph="0240

\(\backslash\)def\(\backslash\)hbar{{\(\backslash\)mathchar'26\(\backslash\)mkern-9muh}}

\(\backslash\)mathchardef\(\backslash\)imath="017B

\(\backslash\)mathchardef\(\backslash\)jmath="017C

\(\backslash\)mathchardef\(\backslash\)ell="0160

\(\backslash\)mathchardef\(\backslash\)wp="017D

\(\backslash\)mathchardef\(\backslash\)Re="023C

\(\backslash\)mathchardef\(\backslash\)Im="023D

\(\backslash\)mathchardef\(\backslash\)partial="0140

\(\backslash\)mathchardef\(\backslash\)info\(\backslash\)"0231

\(\backslash\)mathchardef\(\backslash\)prime="0230

\(\backslash\)mathchardef\(\backslash\)emptyset="023B

\(\backslash\)mathchardef\(\backslash\)nabla="0272

\(\backslash\)def\(\backslash\)surd{{\(\backslash\)mathchar'1270}}

\(\backslash\)mathchardef\(\backslash\)top="023E

\(\backslash\)mathchardef\(\backslash\)bot="023F

\(\backslash\)def\(\backslash\)spale{{\(\backslash\)vbox{\(\backslash\)align{$\(\backslash\)m@th\(\backslash\)scriptstyle##$\}crcr}}

\(\backslash\)not\(\backslash\)matrel{\(\backslash\)mkern14mu}\(\backslash\)crcr}

\(\backslash\)noalign{{\(\backslash\)nointerlineskip}

\(\backslash\)mkern2.5mu\(\backslash\)leaders\(\backslash\)hrule height.34pt\(\backslash\)fifill\(\backslash\)mkern2.5mu\(\backslash\)cr}}

\(\backslash\)mathchardef\(\backslash\)triangle="0234

\(\backslash\)mathchardef\(\backslash\)forall="0238

\(\backslash\)mathchardef\(\backslash\)exists="0239

\(\backslash\)mathchardef\(\backslash\)neg="023A\(\backslash\)let\(\backslash\)not=\(\backslash\)neg

\(\backslash\)mathchardef{flat="015B

\(\backslash\)mathchardef\(\backslash\)natural="015C

\(\backslash\)mathchardef\(\backslash\)sharp="015D

\(\backslash\)mathchardef\(\backslash\)clubsuit="027C

\(\backslash\)mathchardef\(\backslash\)diamondsuit="027D

\(\backslash\)mathchardef\(\backslash\)heartsuit="027E

\(\backslash\)mathchardef\(\backslash\)spadesuit="027F

Integral signs get special treatment so that their limits won't be set above and below.

\(\langle\)_Encode large operators\(\rangle\)\(\equiv\)_

\(\backslash\)mathchardef\(\backslash\)coprod="1360

\(\backslash\)mathchardef\(\backslash\)bigvee="1357

\(\backslash\)mathchardef\(\backslash\)bigwedge="1356

\(\backslash\)mathchardef\(\backslash\)bigplus="1355

\(\backslash\)mathchardef\(\backslash\)bigcup="1353

\(\backslash\)mathchardef\(\backslash\)intop="1352\(\backslash\)def\(\backslash\)int{\(\backslash\)intop\(\backslash\)nolimits}

\(\backslash\)mathchardef\(\backslash\)prod="1351

\(\backslash\)mathchardef\(\backslash\)sum="1350

\(\backslash\)mathchardef\(\backslash\)bigotimes="134E

\(\backslash\)mathchardef\(\backslash\)bigplus="134C

\(\backslash\)mathchardef\(\backslash\)bigodot="134A

\(\backslash\)mathchardef\(\backslash\)ointop="1348\(\backslash\)def\(\backslash\)oint{\(\backslash\)ointop\(\backslash\)nolimits}

\(\backslash\)mathchardef\(\backslash\)bigsqcup="1346

\(\backslash\)mathchardef\(\backslash\)smallint="1273plain.tw

\(\langle\)_Encode binary operations_\(\rangle\)\(\equiv\)

[MISSING_PAGE_POST]

\(\langle\)mathchardef\(\backslash\)oslash="220B

\(\langle\)mathchardef\(\backslash\)otimes="220A

\(\langle\)mathchardef\(\backslash\)ominus="2209

\(\langle\)mathchardef\(\backslash\)oplus="2208

\(\langle\)mathchardef\(\backslash\)mp="2207

\(\langle\)mathchardef\(\backslash\)pm="2206

\(\langle\)mathchardef\(\backslash\)circ="220E

\(\langle\)mathchardef\(\backslash\)bigcirc="220D

\(\langle\)mathchardef\(\backslash\)setminus="226E % for set difference A\(\backslash\)setminus B

\(\langle\)mathchardef\(\backslash\)dot="2201

\(\langle\)mathchardef\(\backslash\)ast="2203

\(\langle\)mathchardef\(\backslash\)times="2202

\(\langle\)mathchardef\(\backslash\)star="213F

Relations are also fairly straightforward, except for the ones that are constructed from other characters. The \(\backslash\)magnetochar is a character '\(\cdot\)' of width zero that is quite useless by itself, but it combines with right arrows to make \(\langle\)mapsto '\(\mapsto\)' and \(\langle\)longmapsto '\(\longmapsto\)'. Similarly, \(\backslash\)not is a relation character of width zero that puts a slash over the character that follows. When two relations are adjacent in a math formula, \(\langle\)TEX puts no space between them.

\(\langle\)_Encode relations_\(\rangle\)\(\equiv\)

\(\langle\)mathchardef\(\backslash\)proto="322F

\(\langle\)mathchardef\(\backslash\)sqsubseteq="3276

\(\langle\)mathchardef\(\backslash\)sqsubseteq="3277

\(\langle\)mathchardef\(\backslash\)parallel="326B

\(\langle\)mathchardef\(\backslash\)mid="326A

\(\langle\)mathchardef\(\backslash\)dashv="3261

\(\langle\)mathchardef\(\backslash\)vdash="3260

\(\langle\)mathchardef\(\backslash\)nearrow="3225

\(\langle\)mathchardef\(\backslash\)searrow="3226

\(\langle\)mathchardef\(\backslash\)warrow="322D

\(\langle\)mathchardef\(\backslash\)surrow="322E

\(\langle\)mathchardef\(\backslash\)Leffrightarrow="322C








plain.tw
* \def\makefootline{\baselineskip24\p@\line{\the\footline}}
* %
* \def\folio{\ifnum\pageno<\z@\romannumeral-\pageno\else\number\pageno\fi}
* \def\nopagenumbers{\footline{\hfil}} % blank out the footline
* \def\davancepageno{\ifnum\pageno<\z@\global\advance\pageno\m@ne
* \else\global\advance\pageno\@ne\fi% increase\pageno|

Ragged-bottom setting is achieved by inserting infinite glue, which overpowers the stretchability of \topskip. This macros assume that \topskip = 10pt

\(\(\mathit{Supplyraggedbottomsetting}\)\)\(\equiv\)
* \newif\ifr@ggedbottom
* \def\raggedbottom{\topskip10\p@plus60\p@\r@gggedbottomtrue}
* \def\normalbottom{\topskip10\p@\r@ggedbottomfalse} % undoes\raggedbottom

There are 255 classes of insertions, \insert0 to \insert254, and they are tied to other registers of the same number. For example, \insert100 is connected with \count100, \dimen100, \skip100, and \box100.

For our purposes let's consider a particular class of insertions called class \(n\); we will then be dealing with TeX's primitive command

\insert\(n\{\text{vertical mode material}\}\)

which puts an insertion item into a horizontal or vertical list. For this class of insertions

\box\(n\) is where the material appears when a page is output;

\count\(n\) is the magnification factor for page breaking;

\dimen\(n\) is the maximum insertion size per page;

\skip\(n\) is the extra space to allocate on a page.

For example, material inserted with \insert100 will eventually appear in \box100.

\footnote macro depends on the value of \biggskipamount, and \parindent. Because the value of \resize (8.9 in) is greater than \dimen\footins (8 in), footnotes never fill up the whole page.

\(\langle\mathit{Supplyfootnotes}\rangle\)\(\equiv\)
* \newinsert\footins
* \def\footnote@1{\let\@sf\empty % parameter #2 (the text) is read later
* \ifhmode\edf\@sf{\spacefactor\the\spacefactor}\/\\fi
* \#1\@sf\forall\footnotethe{\#1}
* \def\forall\footnotethe{\insert\footins}
* \def\forallfootnotethe{\insert\footins}
* \interlinepenalty\interfootnotethe{\#1}
* \leftloop\right\n
The value of \boxmaxdepth is set to \maxdepth so that the vbox will be constructed under the assumptions that TeX's page builder has used to set up \box255.

The \pagecontents macro produces a vertical list for everything that belongs on the main body of the page, namely the contents of \box255 together with illustrations (inserted at the top) and footnotes (inserted at the bottom). \topins and \footins are the insertion class numbers for the two kinds of insertions used in plain TeX; if more classes of insertions are added, \pagecontents should be changed accordingly. Notice that the boxes are unboxed so that the glue coming from insertions can help out the glue on the main page. The \footnotetrule macro places a dividing line between the page and its footnotes; it makes a net contribution of \(0\,\mathrm{pt}\) to the height of the vertical list.

The \dosupereject macro is designed to clear out any insertions that have been held over, whether they are illustrations or footnotes or both. The negative \kern here cancels out the natural space of the \topskip glue that goes above the empty \line; that empty line box prevents the \vfill from disappearing into a page break. The vertical list that results from \dosupereject is placed on TeX's list of things to put out next, just after the straggling insertions have been reconsidered. Hence another super-eject will occur, and the process will continue until no insertions remain.

\[\langle\textit{Set up the output routine}\rangle\equiv\]

```
1002\output{\plainoutput}
1003\def\plainoutput{\subout\vbox{\makeheadline\pagebody\makefootline}%
1004\advancepageono
1005\ifnum\outputpenalty>-\@MM\else\dosupereject\fi}
1006




### Extensible delimiters

TeX builds large delimiters by using "extensible" characters, which are specified by giving top, middle, bottom, and repeatable characters in an **extensible** command. For example, the extensible left parentheses in cmex10 are defined by (see Figure 4)

\[\texttt{extensible oct"060": oct"060", 0, oct"100", oct"102";}\]

this says that character code oct"060" specifies an extensible delimiter constructed from itself as the top piece, from character number oct"100" as the bottom piece, and from character number oct"102" as the piece which should be repeated as often as necessary to reach a desired size. In this particular example there is no middle piece, but characters like curly braces have a middle piece as well. A zero value in the top, middle, or bottom position means that no character should be used in that part of the construction; but a zero value in the final position means that character number zero is the repeater. The width of an extensible character is taken to be the width of the repeater.

Also several characters of various sizes can be linked together in a series by means of a **charlist** command. For example (see Figure 4),

\[\texttt{charlist oct"000": oct"020": oct"022": oct"040";}\]

is used in the font cmex10 to specify the left parentheses that TeX uses in displayed math formulas. TeX follows charlist to make variable-size delimiters and variable-size accents, as well to link \textstyle and the \displaystyle operators.

### Font dimensions

The main information about font consists of the dimensions of the characters. These numbers TeX finds in the font metric files. Except character dimensions, font metric files contain: values for \fontdimen parameters, italic correction of characters, ligature and kerning programs for characters. We change the fontdimen parameters with the (global) assignment:

\[\texttt{\backslashfontdimen}\langle\texttt{number}\rangle\langle\texttt{font} \rangle\langle\texttt{equals}\rangle\langle\texttt{dimen}\rangle,\]

for example, the assignment \(\texttt{\backslashfontdimen8}\texttt{\backslashtenex}=0.6\texttt{pt}\) changes width of the fraction bar from default \(0.4\,\texttt{pt}\) to \(0.6\,\texttt{pt}\).

The first seven fontdimen parameters have the following meaning:

1. the slant per point
2. the interword space; that is used unless \(\backslash\texttt{spaceskip}\) is specified
3. interword stretch
4. interword shrink
5. the x-height
6. the quad width (for the font in family 2, \(1/18\,\texttt{th}\) quad width is equal to \(1\,\texttt{mu}\))
7. the extra space; that value is added to the interword space used whenever \(\texttt{\backslash spacefactor}\geq 2000\), unless \(\backslash\texttt{xspaceskip}\) is specified.

For the font in family 2 attributes 8-19 specify positioning of fractions, subscripts, superscripts.

_fraction numerator attributes: minimum shift up, from the main baseline, of the baseline of the numerator of a generalized fraction_

1. num1: for display style
2. num2: for text style or smaller if a fraction bar is present
3. num3: for text style or smaller if no a fraction bar is present

_fraction denominator attributes: minimum shift down, from the main baseline, of the baseline of the denominator of a generalized fraction_11. denom1: for display style
12. denom2: for text style or smaller

_superscript attributes: minimum shift up, from the main baseline, of the baseline of the superscript_
13. sup1: for display style
14. sup2: for text style or smaller, non-cramped
15. sup3: for text style or smaller, cramped

_subscript attributes: minimum shift down, from the main baseline, of the baseline of a subscript_
16. sub1: when no superscript is present
17. sub2: when superscript is present

_script adjustment attributes: for use only with non-glyph, that is, composite objects_
18. sup_drop: maximum distance of superscript baseline below top of nucleus
19. sub_drop: minimum distance of subscript baseline below bottom of nucleus

Delimiter span attributes: height plus depth of delimiter enclosing a generalized fraction.

20. delim1: in display style
21. delim2: in text style or smaller

The last parameter, the height of the math axis, specifies the height above the baseline of the fraction bar, and the centre of large delimiters and most operators and relations. This position is used in vertical centering.

22. axis_height.

For the font in family 3 attributes 9-12 determine extra space added when limits are attached to operators. The attribute 8 specifies thickness of the rule used for overlines, underlines, radical extenders, and fraction bars. From that dimension are derived 'clearances' around fraction bar. The attribute 13 specifies extra space added above and below attached limits.

8. default_rule_thickness

9. big_op_spacing1

10. big_op_spacing2

11. big_op_spacing3

12. big_op_spacing4

13. big_op_spacing5

We have: big_op_spacing1(2) \(\leq\) space between upper (lower) limit and top (bottom) of large operator \(\leq\) big_op_spacing3(4)

fontdimen cmsy10 cmex10 cmtt10 cmr10 cmti10 cmbx10

[MISSING_PAGE_POST]

13. 4.12892pt 1.0pt
14. 3.62892pt
15. 2.88889pt
16. 1.49998pt
17. 2.47217pt
18. 3.86108pt
19. 0.5pt
20. 23.9pt
21. 10.09999pt
22. 2.5pt

#### Font tables

**Figure 1.** cmr10--family 0

\begin{tabular}{c|c|c|c|c|c|c|c|c|c|}  & _’0_ & _’1_ & _’2_ & _’3_ & _’4_ & _’5_ & _’6_ & _’7_ & \\ \hline _’00x_ & \(\Gamma\) & \(\Delta\) & \(\Theta\) & \(\Lambda\) & \(\Xi\) & \(\Pi\) & \(\Sigma\) & \(\Upsilon\) & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’01x_ & \(\Phi\) & \(\Psi\) & \(\Omega\) & ff & fi & fli & ffi & ffi & \multicolumn{1}{c}{} \\ \hline _’02x_ & 1 & J & \(\cdot\) & \(\cdot\) & \(\cdot\) & \(\cdot\) & \(\cdot\) & \(\cdot\) & \(\cdot\) & \multicolumn{1}{c}{} \\ \hline _’03x_ & \(\delta\) & \(\alpha\) & \(\alpha\) & \(\phi\) & \(\AE\) & \(\Theta\) & \(\O\) & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’04x_ & - &! & " & \# & \(\$\) & \(\%\) & \(\&\) & \(\cdot\) & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’05x_ & ( & ) & * & + &, & - & \(\cdot\) & \(\cdot\) & \(\cdot\) & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’06x_ & 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’07x_ & 8 & 9 & : & ; & i & = & \(\dot{\iota}\) &? & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’10x_ & \(\alpha\) & A & B & C & D & E & F & G & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’11x_ & H & I & J & K & L & M & N & O & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’12x_ & P & Q & R & S & T & U & V & W & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’13x_ & X & Y & Z & [ & " & ] & \(\cdot\) & \(\cdot\) & \(\cdot\) & \multicolumn{1}{c}{} \\ \hline _’14x_ & \(\cdot\) & a & b & c & d & e & f & g & \multicolumn{1}{c}{} \\ \hline _’15x_ & h & i & j & k & l & m & n & o & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’16x_ & p & q & r & s & t & u & v & w & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline _’17x_ & x & y & z & – & — & _"_ & - & _"_ & \multicolumn{1}{c}{} & \multicolumn{1}{c}{} \\ \hline  & & "\(\delta\) & "\(\theta\) & "\(\Lambda\) & "\(\theta\) & "\(\mathcal{C}\) & "\(\mathcal{D}\) & "\(\mathcal{E}\) & "\(\mathcal{F}\) & \multicolumn{1}{c}{} \\ \end{tabular}

Figure 2. cmmi10—family 1

Figure 3. cmsy10—family 2

Figure 4. cmex10—family 3


plain.tw \flbreak \finph@nt 33828 \item 24510 \flinstm@sh 34837 \flinstm 28615 \flintame 40.039 \flartem 40.024 \fmstruismen 40.039 \fmstruismen 40.039 \fmstruismen 40.039 \f91 \f906 \f9769 \flintm 28594 \fldio 37952 \joinrel 30.716 \fooline 36945 \fooline 36945 \fooline 37960 \fapp 20.991 \footnote 37960 \footnote 3898 \footnote 37974 \fforall 28612 \frenchspacing 25524 \Lambda 27.583 \frown 30.710 \Lambda 27.561 \Gamma 27.580 \famma 27.553 \famond 27.553 \fgcd 34883 \fseq 30.685 \feg 30.697 \ggoodbreak 22443 \fgrave 31.741 \f







* []

## Chunks

( * ) 3 ( _Allocate registers_ ) 3, 13 ( _Allocate scratch registers_ ) 14 ( _Assign delimiter codes_ ) 8, 12 ( _Assign initial values to parameters_ ) 3, 18 ( _Assign math codes_ ) 8, 10 ( _Assign space factor codes_ ) 5, 8 ( _Assign uppercase and lowercase code values_ ) 5, 8 ( _Assign values to dimen parameters_ ) 18, 19 ( _Assign values to glue parameters_ ) 18 ( _Assign values to integer parameters_ ) 18 ( _Assign values to special registers_ ) 18, 20 ( _Completing the job_ ) 20, 26 ( _Define Greek letters_ ) 26, 27 ( _Define_ \showhyphens _macro_ ) 20, 26 ( _Define_ \tracingall _macro_ ) 40 ( _Define commonly used constants_ ) 3, 4 ( _Define font families_ ) 8, 12 ( _Define implementation-level register allocation macros_ ) 14 ( _Define math fonts_ ) 8 ( _Define math space macros_ ) 26, 27 ( _Define math symbols_ ) 26, 28 ( _Define sectioning macros_ ) 20, 24 ( _Define space macros_ ) 20-22 ( _Define text fonts_ ) 5, 6 ( _Encode binary operations_ ) 26, 29 ( _Encode large operators_ ) 26, 28 ( _Encode math accents_ ) 8, 10 ( _Encode relations_ ) 26, 29 ( _Encode special characters, and characters not available on the keyboard_ ) 5, 6 ( _Establish spacing after punctuation characters_ ) 20, 25 ( _Establish spacing around mathematical objects_ ) 8, 9 ( _Establish standard category code values_ ) 3, 4 ( _Identify the format_ ) 3, 40 ( _Initialize register constants_ ) 14, 15 ( _Initialize the layout_ ) 3, 39 ( _Prepare page for output_ ) 3, 36 ( _Provide_ \cases _and_ \matrix _macros_ ) 26, 35 ( _Provide access to delimiters of various sizes_ ) 26, 33 ( _Provide alignment macros_ ) 20, 23 ( _Provide macros for math formatting_ ) 3, 26, 33 ( _Provide macros for text formatting_ ) 3, 20 ( _Provide programming constructs_ ) 3, 40 ( _Provide support for accented characters_ ) 5, 7 ( _Provide support for font scaling_ ) 5, 6 ( _Provide support to typeset displayed equations_ ) 26, 35 ( _Provide user-level register allocation macros_ ) 14 ( _Read hyphenation patterns_ ) 3, 39* [10]